/*----------------------------------------------------------------------------- * 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; }
/*----------------------------------------------------------------------------- * 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; }
/*----------------------------------------------------------------------------- * bus communication exit */ static void ExitComm(void) { BusExit(sSioHandle); SioClose(sSioHandle); SioExit(); }