Ejemplo n.º 1
0
/*-----------------------------------------------------------------------------
*  main
*/
int main(int argc, char *argv[]) {

    int  handle;
    int  i;
    char comPort[SIZE_COMPORT] = "";
    uint8_t len;
    uint8_t val8;

    /* get tty device */
    for (i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-c") == 0) {
            if (argc > i) {
                strncpy(comPort, argv[i + 1], sizeof(comPort) - 1);
                comPort[sizeof(comPort) - 1] = 0;
            }
            break;
        }
    }
    if (strlen(comPort) == 0) {
        PrintUsage();
        return 0;
    }

    SioInit();
    handle = SioOpen(comPort, eSioBaud9600, eSioDataBits8, eSioParityNo, eSioStopBits1, eSioModeHalfDuplex);

    if (handle == -1) {
        printf("can't open %s\r\n", comPort);
        return 0;
    }

    // wait for sio input to settle and the flush
    usleep(100000);
    while ((len = SioGetNumRxChar(handle)) != 0) {
        SioRead(handle, &val8, sizeof(val8));
    }

    BusInit(handle);
#if 1
    BusVarInit(67, BusVarNv);

    {
    	uint8_t var1 = 1;
    	uint16_t var2 = 0x1234;

    	bool rc;
    	uint8_t len;

    	TBusVarHdl hdl1;
    	TBusVarHdl hdl2;
    	TBusTelegram *msg;

    	TBusVarResult result;
    	TBusVarState  state;


    	BusVarAdd(0, sizeof(var1), true);
    	BusVarAdd(1, sizeof(var2), false);

    	rc = BusVarWrite(1, &var2, sizeof(var2), &result);
    	rc = BusVarWrite(0, &var1, sizeof(var1), &result);

    	var1 = 0;
    	var2 = 0;

    	len = BusVarRead(1, &var2, sizeof(var2), &result);
    	printf("len %d var2 %x\n", len, var2);
    	len = BusVarRead(0, &var1, sizeof(var1), &result);
    	printf("len %d var1 %x\n", len, var1);

    	hdl2 = BusVarTransactionOpen(242, 1, &var2, sizeof(var2), eBusVarRead);
    	hdl1 = BusVarTransactionOpen(242, 0, &var1, sizeof(var1), eBusVarRead);

    	for (i = 0; i < 1000; i++) {
    		BusVarProcess();
    		usleep(10000);
   			if (BusCheck() == BUS_MSG_OK) {
  				msg = BusMsgBufGet();
   				if ((msg->type == eBusDevRespGetVar) &&
   					(msg->msg.devBus.receiverAddr == 67)) {
         	        BusVarRespGet(msg->senderAddr, &msg->msg.devBus.x.devResp.getVar);
   				}
  			}

   			if (hdl1 != BUSVAR_HDL_INVALID) {
   		        state = BusVarTransactionState(hdl1);
   		        if (state & BUSVAR_STATE_FINAL) {
   		            if (state == eBusVarState_Ready) {
   		            	printf("var1 %02x\n", var1);
   		            }
   		            BusVarTransactionClose(hdl1);
   		            hdl1 = BUSVAR_HDL_INVALID;
   		        }
   		    }
   			if (hdl2 != BUSVAR_HDL_INVALID) {
   		        state = BusVarTransactionState(hdl2);
   		        if (state & BUSVAR_STATE_FINAL) {
   		            if (state == eBusVarState_Ready) {
   		            	printf("var2 %04x\n", var2);
   		            }
   		            BusVarTransactionClose(hdl2);
   		            hdl2 = BUSVAR_HDL_INVALID;
   		        }
   		    }
    	}

    }
    return 0;
#endif

    if (Test() == 0) {
    	printf("OK\n");
    } else {
    	printf("ERROR\n");
    }

    if (handle != -1) {
        SioClose(handle);
    }

    return 0;
}
Ejemplo n.º 2
0
/*-----------------------------------------------------------------------------
*  program start
*/
int main(int argc, char *argv[]) {

    int           i;
    int           j;
    char          comPort[SIZE_COMPORT] = "";
    uint8_t       myAddr;
    bool          myAddrValid = false;
    TBusTelegram  txBusMsg;
    uint8_t       busRet;
    TBusTelegram  *pRxBusMsg;
    uint8_t       mask;
    int           flags;
    int           sioHandle;
    int           sioFd;
    fd_set        rfds;
    int           ret;
    uint8_t       val8;
    char          buffer[SIZE_CMD_BUF];
    char          *p;

    signal(SIGPIPE, sighandler);

    flags = fcntl(fileno(stdout), F_GETFL);
    fcntl(fileno(stdout), F_SETFL, flags | O_NONBLOCK);

    /* get com interface */
    for (i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-c") == 0) {
            if (argc > i) {
                strncpy(comPort, argv[i + 1], sizeof(comPort) - 1);
                comPort[sizeof(comPort) - 1] = '\0';
            }
            break;
        }
    }

    /* our bus address */
    for (i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-a") == 0) {
            if (argc > i) {
                myAddr = atoi(argv[i + 1]);
                myAddrValid = true;
            }
            break;
        }
    }

    if ((strlen(comPort) == 0) ||
        !myAddrValid) {
        PrintUsage();
        return 0;
    }

    sioHandle = InitBus(comPort);
    if (sioHandle == -1) {
        printf("cannot open %s\r\n", comPort);
        return -1;
    }
    sioFd = SioGetFd(sioHandle);


    for (;;) {
        FD_ZERO(&rfds);
        FD_SET(sioFd, &rfds);
        FD_SET(STDIN_FILENO, &rfds);
        ret = select(sioFd + 1, &rfds, 0, 0, 0);
        if ((ret > 0) && FD_ISSET(sioFd, &rfds)) {
            busRet = BusCheck();
            if (busRet == BUS_MSG_OK) {
                pRxBusMsg = BusMsgBufGet();
                if ((pRxBusMsg->type == eBusDevReqActualValueEvent) &&
                    ((pRxBusMsg->msg.devBus.receiverAddr == myAddr))) {
                    Print("event address %d device type ", pRxBusMsg->senderAddr);
                    switch (pRxBusMsg->msg.devBus.x.devReq.actualValueEvent.devType) {
                    case eBusDevTypeDo31:
                        Print("DO31\n");
                        for (i = 0; i < BUS_DO31_DIGOUT_SIZE_ACTUAL_VALUE; i++) {
                            for (j = 0, mask = 1; j < 8; j++, mask <<= 1) {
                                if ((i == 3) && (j == 7)) {
                                    // DO31 has 31 outputs, dont display the last bit
                                    break;
                                }
                                if (pRxBusMsg->msg.devBus.x.devReq.actualValueEvent.actualValue.do31.digOut[i] & mask) {
                                    Print("1");
                                } else {
                                    Print("0");
                                }
                            }
                        }
                        Print("\n");
                        for (i = 0; i < BUS_DO31_SHADER_SIZE_ACTUAL_VALUE; i++) {
                            Print("%02x",
                                pRxBusMsg->msg.devBus.x.devReq.actualValueEvent.actualValue.do31.shader[i]);
                            if (i < (BUS_DO31_SHADER_SIZE_ACTUAL_VALUE - 1)) {
                                Print(" ");
                            }
                        }
                        memcpy(txBusMsg.msg.devBus.x.devResp.actualValueEvent.actualValue.do31.digOut,
                               pRxBusMsg->msg.devBus.x.devReq.actualValueEvent.actualValue.do31.digOut,
                               BUS_DO31_DIGOUT_SIZE_ACTUAL_VALUE);
                        memcpy(txBusMsg.msg.devBus.x.devResp.actualValueEvent.actualValue.do31.shader,
                               pRxBusMsg->msg.devBus.x.devReq.actualValueEvent.actualValue.do31.shader,
                               BUS_DO31_SHADER_SIZE_ACTUAL_VALUE);
                        txBusMsg.msg.devBus.x.devResp.actualValueEvent.devType = eBusDevTypeDo31;
                        break;
                    case eBusDevTypeSw8:
                        Print("SW8\n");
                        val8 = pRxBusMsg->msg.devBus.x.devReq.actualValueEvent.actualValue.sw8.state;
                        for (i = 0, mask = 1; i < 8; i++, mask <<= 1) {
                            if (val8 & mask) {
                                Print("1");
                            } else {
                                Print("0");
                            }
                        }
                        txBusMsg.msg.devBus.x.devResp.actualValueEvent.actualValue.sw8.state = val8;
                        txBusMsg.msg.devBus.x.devResp.actualValueEvent.devType = eBusDevTypeSw8;
                        break;
                    default:
                        break;
                    }
                    Print("\n");
                    fflush(stdout);
                    txBusMsg.type = eBusDevRespActualValueEvent;
                    txBusMsg.senderAddr = pRxBusMsg->msg.devBus.receiverAddr;
                    txBusMsg.msg.devBus.receiverAddr = pRxBusMsg->senderAddr;
                    BusSend(&txBusMsg);
                }
            } else if (busRet == BUS_IF_ERROR) {
                Print("bus interface access error - exiting\n");
                break;
            }
        }
        if ((ret > 0) && FD_ISSET(STDIN_FILENO, &rfds)) {
            p = fgets(buffer, sizeof(buffer), stdin);
            if (p == 0) {
                printf("error/EOF on reading from stdin. exiting\n");
                ret = -1;
                break;
            }
            if (strcmp("-exit\n", p) == 0) {
                Print("OK\n");
                break;
            }
        }
    }

    SioClose(sioHandle);
    return ret;
}
Ejemplo n.º 3
0
/*-----------------------------------------------------------------------------
*  bus communication exit
*/
static void ExitComm(void) {
    
    BusExit(sSioHandle);
    SioClose(sSioHandle);
    SioExit();
}