#ifdef HAVE_CONFIG_H # include #endif #include "aqhome/serial.h" #include "aqhome/msg_value.h" #include "aqhome/msg_sendstats.h" #include "aqhome/msg_ping.h" #include "aqhome/msg_pong.h" #include "aqhome/msg_needaddr.h" #include "aqhome/msg_claimaddr.h" #include "aqhome/msg_haveaddr.h" #include "aqhome/msg_denyaddr.h" #include #include #include #include #include #include int testRecv() { AQH_SERIAL *sr; int rv; int i; GWEN_BUFFER *dbuf; fprintf(stdout, "Opening device...\n"); sr=AQH_Serial_new("/dev/ttyUSB0", 240); rv=AQH_Serial_Open(sr, AQH_SerialReadWriteMode_ReadOnly); if (rv<0) { DBG_ERROR(NULL, "ERROR opening device (%d)", rv); AQH_Serial_free(sr); return 2; } fprintf(stdout, "Device open, waiting for packets\n"); dbuf=GWEN_Buffer_new(0, 256, 0, 1); for (i=0; ; i++) { uint8_t buffer[1024]; GWEN_TIME *ti; fprintf(stdout, "Waiting for packet...\n"); rv=AQH_Serial_Recv(sr, buffer, sizeof(buffer)-1); if (rv<0) break; ti=GWEN_CurrentTime(); GWEN_Time_toString(ti, "YYYY-MM-DD hh:mm:ss", dbuf); fprintf(stdout, "%s: Received:\n", GWEN_Buffer_GetStart(dbuf)); GWEN_Text_DumpString(buffer, rv, 2); GWEN_Time_free(ti); GWEN_Buffer_Reset(dbuf); fprintf(stdout, "\n"); } GWEN_Buffer_free(dbuf); AQH_Serial_Close(sr); AQH_Serial_free(sr); return 0; } int testSend() { AQH_SERIAL *sr; int rv; int i; GWEN_BUFFER *dbuf; uint8_t sendBuf[5]={0x01, 0x02, 0xdb, 0x00, 0xd8 }; uint8_t sendBuf2[2]={0x02, 0xdb }; fprintf(stdout, "Opening device...\n"); sr=AQH_Serial_new("/dev/ttyUSB0", 240); rv=AQH_Serial_Open(sr, AQH_SerialReadWriteMode_ReadWrite); if (rv<0) { DBG_ERROR(NULL, "ERROR opening device (%d)", rv); AQH_Serial_free(sr); return 2; } fprintf(stdout, "Device open, waiting for packets\n"); dbuf=GWEN_Buffer_new(0, 256, 0, 1); for (i=0; ; i++) { GWEN_TIME *ti; //rv=AQH_Serial_Send(sr, sendBuf, sizeof(sendBuf)); rv=AQH_Serial_SendPacket(sr, 1, sendBuf2, sizeof(sendBuf2)); if (rv<0) break; ti=GWEN_CurrentTime(); GWEN_Time_toString(ti, "YYYY-MM-DD hh:mm:ss", dbuf); fprintf(stdout, "%s: Packet %d sent.\n", GWEN_Buffer_GetStart(dbuf), i); GWEN_Time_free(ti); GWEN_Buffer_Reset(dbuf); sleep(3); } GWEN_Buffer_free(dbuf); AQH_Serial_Close(sr); AQH_Serial_free(sr); return 0; } void _packetReceived(AQH_SERIAL *sr, AQH_MSG *msg) { const uint8_t *ptr; uint8_t len; uint8_t msgType; int msgIsValid; GWEN_BUFFER *dbuf; GWEN_TIME *ti; dbuf=GWEN_Buffer_new(0, 256, 0, 1); ti=GWEN_CurrentTime(); GWEN_Time_toString(ti, "YYYY-MM-DD hh:mm:ss ", dbuf); GWEN_Time_free(ti); ti=NULL; msgIsValid=(AQH_Msg_IsChecksumValid(msg) && AQH_Msg_IsMsgComplete(msg)); ptr=AQH_Msg_GetBuffer(msg); len=AQH_Msg_GetBytesInBuffer(msg); msgType=AQH_Msg_GetMsgType(msg); if (msgType==AQH_MSG_TYPE_PING) { AQH_MsgPing_DumpToBuffer(msg, dbuf, "received"); fprintf(stdout, "%s", GWEN_Buffer_GetStart(dbuf)); } else if (msgType==AQH_MSG_TYPE_PONG) { AQH_MsgPong_DumpToBuffer(msg, dbuf, "received"); fprintf(stdout, "%s", GWEN_Buffer_GetStart(dbuf)); } else if (msgType==AQH_MSG_TYPE_COMSENDSTATS) { /* CPRO_CMD_COMSENDSTATS */ AQH_MsgSendStats_DumpToBuffer(msg, dbuf, "received"); fprintf(stdout, "%s", GWEN_Buffer_GetStart(dbuf)); } else if (msgType==AQH_MSG_TYPE_TWIBUSMEMBER) { /* CPRO_CMD_TWIBUSMEMBER */ int i2cAddr; int availability; i2cAddr=ptr[4]; availability=ptr[5]; fprintf(stdout, "-> TWI DEVICE %02x: %s\n", i2cAddr, (availability==0)?"not available":"FOUND"); } else if (msgType==40) { /* CPRO_CMD_DEBUG */ uint8_t param1; uint8_t param2; param1=ptr[4]; param2=ptr[5]; fprintf(stdout, "-> Debug param1=%02x, param2=%02x\n", param1, param2); } else if (msgType==AQH_MSG_TYPE_VALUE) { /* CPRO_CMD_VALUE */ AQH_MsgValue_DumpToBuffer(msg, dbuf, "received"); fprintf(stdout, "%s", GWEN_Buffer_GetStart(dbuf)); //GWEN_Text_DumpString(ptr, len, 6); } else if (msgType==AQH_MSG_TYPE_NEED_ADDRESS) { AQH_MsgNeedAddr_DumpToBuffer(msg, dbuf, "received"); fprintf(stdout, "%s", GWEN_Buffer_GetStart(dbuf)); } else if (msgType==AQH_MSG_TYPE_CLAIM_ADDRESS) { AQH_MsgClaimAddr_DumpToBuffer(msg, dbuf, "received"); fprintf(stdout, "%s", GWEN_Buffer_GetStart(dbuf)); } else if (msgType==AQH_MSG_TYPE_HAVE_ADDRESS) { AQH_MsgHaveAddr_DumpToBuffer(msg, dbuf, "received"); fprintf(stdout, "%s", GWEN_Buffer_GetStart(dbuf)); } else if (msgType==AQH_MSG_TYPE_DENY_ADDRESS) { AQH_MsgDenyAddr_DumpToBuffer(msg, dbuf, "received"); fprintf(stdout, "%s", GWEN_Buffer_GetStart(dbuf)); } else { fprintf(stdout, " %s: Received (%d):\n", GWEN_Buffer_GetStart(dbuf), msgType); GWEN_Text_DumpString(ptr, len, 6); } GWEN_Buffer_free(dbuf); AQH_Msg_free(msg); } AQH_MSG *createPingMsg(AQH_SERIAL *sr, uint8_t destAddr) { AQH_MSG *msg; int rv; msg=AQH_Msg_new(); rv=AQH_Msg_AddByte(msg, destAddr); if (rv<0) { fprintf(stderr, "ERROR1: %d\n", rv); AQH_Msg_free(msg); return NULL; } rv=AQH_Msg_AddByte(msg, 6); /* msglen */ if (rv<0) { fprintf(stderr, "ERROR2: %d\n", rv); AQH_Msg_free(msg); return NULL; } rv=AQH_Msg_AddByte(msg, AQH_MSG_TYPE_PING); /* ping */ if (rv<0) { fprintf(stderr, "ERROR3: %d\n", rv); AQH_Msg_free(msg); return NULL; } rv=AQH_Msg_AddByte(msg, AQH_Serial_GetAddress(sr)); /* src addr */ if (rv<0) { fprintf(stderr, "ERROR4: %d\n", rv); AQH_Msg_free(msg); return NULL; } rv=AQH_Msg_AddByte(msg, 0); /* timestamp */ if (rv<0) { fprintf(stderr, "ERROR5: %d\n", rv); AQH_Msg_free(msg); return NULL; } rv=AQH_Msg_AddByte(msg, 0); /* timestamp */ if (rv<0) { fprintf(stderr, "ERROR6: %d\n", rv); AQH_Msg_free(msg); return NULL; } rv=AQH_Msg_AddByte(msg, 0); /* timestamp */ if (rv<0) { fprintf(stderr, "ERROR7: %d\n", rv); AQH_Msg_free(msg); return NULL; } rv=AQH_Msg_AddByte(msg, 0); /* timestamp */ if (rv<0) { fprintf(stderr, "ERROR8: %d\n", rv); AQH_Msg_free(msg); return NULL; } rv=AQH_Msg_AddChecksum(msg); if (rv<0) { fprintf(stderr, "ERROR9: %d\n", rv); AQH_Msg_free(msg); return NULL; } return msg; } int testLoop() { AQH_SERIAL *sr; int rv; int i; GWEN_BUFFER *dbuf; time_t tLast; fprintf(stdout, "Opening device...\n"); sr=AQH_Serial_new("/dev/ttyUSB0", 240); rv=AQH_Serial_Open(sr, AQH_SerialReadWriteMode_ReadWrite); if (rv<0) { DBG_ERROR(NULL, "ERROR opening device (%d)", rv); AQH_Serial_free(sr); return 2; } fprintf(stdout, "Device open, waiting for packets\n"); AQH_Serial_SetPacketReceivedFn(sr, _packetReceived); tLast=time(NULL); for (;;) { time_t t; rv=AQH_Serial_Loop(sr); if (rv<0) { AQH_Serial_Close(sr); AQH_Serial_free(sr); break; } t=time(NULL); if (difftime(t, tLast)>61) { AQH_MSG *msg; msg=createPingMsg(sr, 1); if (msg) { rv=AQH_Serial_AddMessageToSend(sr, msg); if (rv<0) { fprintf(stderr, "ERROR: %d\n", rv); AQH_Msg_free(msg); return rv; } if (rv==0) { GWEN_BUFFER *dbuf; GWEN_TIME *ti; dbuf=GWEN_Buffer_new(0, 256, 0, 1); ti=GWEN_CurrentTime(); GWEN_Time_toString(ti, "YYYY-MM-DD hh:mm:ss ", dbuf); GWEN_Time_free(ti); ti=NULL; AQH_MsgPing_DumpToBuffer(msg, dbuf, "enqueued"); fprintf(stdout, "%s", GWEN_Buffer_GetStart(dbuf)); GWEN_Buffer_free(dbuf); } else { DBG_ERROR(NULL, "here (%d)", rv); AQH_Serial_Close(sr); AQH_Serial_free(sr); return rv; } } else { DBG_ERROR(NULL, "here (%d)", rv); AQH_Serial_Close(sr); AQH_Serial_free(sr); return GWEN_ERROR_INTERNAL; } tLast=t; } } return 0; } int testReadLoop() { AQH_SERIAL *sr; int rv; int i; GWEN_BUFFER *dbuf; time_t tLast; fprintf(stdout, "Opening device...\n"); sr=AQH_Serial_new("/dev/ttyUSB0", 240); rv=AQH_Serial_Open(sr, AQH_SerialReadWriteMode_ReadOnly); if (rv<0) { DBG_ERROR(NULL, "ERROR opening device (%d)", rv); AQH_Serial_free(sr); return 2; } fprintf(stdout, "Device open, waiting for packets\n"); AQH_Serial_SetPacketReceivedFn(sr, _packetReceived); tLast=time(NULL); for (;;) { time_t t; rv=AQH_Serial_ReadOnlyLoop(sr); if (rv<0) { AQH_Serial_Close(sr); AQH_Serial_free(sr); break; } t=time(NULL); } return 0; } int main(int argc, char **argv) { const char *cmd; if (argc<2) return testLoop(); cmd=argv[1]; if (strcasecmp(cmd, "monitor")==0 || strcasecmp(cmd, "mon")==0) return testReadLoop(); else if (strcasecmp(cmd, "pingtest")==0) { } else if (strcasecmp(cmd, "rwtest")==0) { return testLoop(); } //return testRecv(); //return testSend(); return testLoop(); }