2727#define SERIAL_1ST_HEADER 0x54
2828#define SERIAL_2ND_HEADER 0xFE
2929
30- #define ARDUINO_REPORT_PACKET_TYPE 31
31-
3230uint8_t GoGoBoard::gblExtSerialState = SER_WAITING_FOR_1ST_HEADER ;
31+ uint8_t GoGoBoard::gblExtSerialPacketType = 0 ;
3332uint8_t GoGoBoard::gblExtSerialCmdChecksum = 0 ;
3433uint8_t GoGoBoard::inExtLength = 0 ;
3534uint8_t GoGoBoard::gblExtSerialCmdCounter = 0 ;
3635bool GoGoBoard::gblUseFirstExtCmdBuffer = false ;
3736bool GoGoBoard::gblNewExtCmdReady = false ;
37+ bool GoGoBoard::gblRequestResponseAvailable = false ;
3838uint8_t GoGoBoard::gbl1stExtCMDBuffer[64 ] = {0 };
3939uint8_t GoGoBoard::gbl2ndExtCMDBuffer[64 ] = {0 };
40+ uint8_t *GoGoBoard::gblActiveBuffer = NULL ;
4041
4142String GoGoBoard::_key = String();
4243gmessage GoGoBoard::gmessage_list;
43- volatile bool GoGoBoard::isSerialAvailable = false ;
4444
4545GoGoBoard::GoGoBoard (void ) {}
4646
@@ -62,10 +62,19 @@ void GoGoBoard::gogoSerialEvent()
6262 }
6363 else
6464 {
65- if (inByte == ARDUINO_REPORT_PACKET_TYPE && gblExtSerialState == SER_CHECKING_PACKET_TYPE )
65+ if (gblExtSerialState == SER_CHECKING_PACKET_TYPE )
6666 {
6767 gblExtSerialCmdChecksum = 0 ;
6868 gblExtSerialState = SER_WAITING_FOR_LENGTH ;
69+
70+ if (inByte == ARDUINO_GMESSAGE_PACKET_TYPE )
71+ {
72+ gblExtSerialPacketType = ARDUINO_GMESSAGE_PACKET_TYPE ;
73+ }
74+ else if (inByte == ARDUINO_REQUEST_PACKET_TYPE )
75+ {
76+ gblExtSerialPacketType = ARDUINO_REQUEST_PACKET_TYPE ;
77+ }
6978 }
7079 else if (gblExtSerialState == SER_WAITING_FOR_LENGTH )
7180 {
@@ -102,19 +111,29 @@ void GoGoBoard::gogoSerialEvent()
102111 }
103112}
104113
105- void GoGoBoard::processGmessage ()
114+ void GoGoBoard::processPacket ()
106115{
107116 if (gblNewExtCmdReady)
108117 {
109118 // ? using first buffer, its inverted value
110- uint8_t *buf = (!gblUseFirstExtCmdBuffer) ? gbl1stExtCMDBuffer : gbl2ndExtCMDBuffer;
111- buf[buf[1 ] + 2 ] = ' \0 ' ; // ? add null terminator
119+ gblActiveBuffer = (!gblUseFirstExtCmdBuffer) ? gbl1stExtCMDBuffer : gbl2ndExtCMDBuffer;
120+
121+ switch (gblExtSerialPacketType)
122+ {
123+ case ARDUINO_REQUEST_PACKET_TYPE :
124+ gblRequestResponseAvailable = true ;
125+ break ;
126+
127+ case ARDUINO_GMESSAGE_PACKET_TYPE :
128+ gblActiveBuffer[gblActiveBuffer[1 ] + 2 ] = ' \0 ' ; // ? add null terminator
112129
113- char *p = (char *)buf + 2 ;
114- _key = String (strtok_r (p, " ," , &p));
130+ char *p = (char *)gblActiveBuffer + 2 ;
131+ _key = String (strtok_r (p, " ," , &p));
115132
116- gmessage_list[_key].stringValue = String (strtok_r (p, " ," , &p));
117- gmessage_list[_key].isNewValue = true ;
133+ gmessage_list[_key].stringValue = String (strtok_r (p, " ," , &p));
134+ gmessage_list[_key].isNewValue = true ;
135+ break ;
136+ }
118137
119138 gblNewExtCmdReady = false ;
120139 }
@@ -152,12 +171,8 @@ void GoGoBoard::irqCallback(void)
152171 HBCounter = 0 ;
153172 }
154173
155- // ? emulate delay 1ms but non-blocking process
156- if (!isSerialAvailable)
157- isSerialAvailable = true ;
158-
159174 gogoSerialEvent ();
160- processGmessage ();
175+ processPacket ();
161176}
162177
163178void GoGoBoard::begin (void )
@@ -181,14 +196,27 @@ void GoGoBoard::begin(void)
181196 gogoTimer->resume ();
182197#endif
183198
184- // pinMode(GOGO_RESET_BUTTON, INPUT);
185- // attachInterrupt(GOGO_RESET_BUTTON, resetCallback, HIGH);
199+ delay (100 );
186200}
187201
188202int GoGoBoard::readInput (uint8_t port)
189203{
190204 if (port < 1 || port > 4 )
191205 return 0 ;
206+
207+ sendCmdPacket (CMD_PACKET , REQ_READ_INPUT , (port - 1 ), 0 , false );
208+
209+ delay (10 ); // ? waiting for response
210+ if (gblRequestResponseAvailable)
211+ {
212+ gblRequestResponseAvailable = false ;
213+
214+ return (int )gblActiveBuffer[0 ] << 8 | gblActiveBuffer[1 ];
215+ }
216+ else
217+ {
218+ return 0 ;
219+ }
192220}
193221
194222void GoGoBoard::talkToServo (String servo_port)
@@ -259,7 +287,7 @@ void GoGoBoard::setServoPower(int power)
259287{
260288 if (power < 0 || power > 100 )
261289 return ;
262-
290+
263291 sendCmdPacket (CMD_PACKET , CMD_SERVO_POWER , 0 , power);
264292}
265293
@@ -379,20 +407,22 @@ void GoGoBoard::sendGmessage(const String &key, const String &value)
379407 sendReportPacket (dataPkt, _dataStr.length () + 2 );
380408}
381409
382- void GoGoBoard::sendCmdPacket (uint8_t categoryID, uint8_t cmdID, uint8_t targetVal, int value)
410+ void GoGoBoard::sendCmdPacket (uint8_t categoryID, uint8_t cmdID, uint8_t targetVal, int value, bool isCmd )
383411{
412+ if (isCmd)
413+ cmdPkt[BYTE_PACKET_TYPE ] = ARDUINO_CMD_PACKET_TYPE ;
414+ else
415+ cmdPkt[BYTE_PACKET_TYPE ] = ARDUINO_REQUEST_PACKET_TYPE ;
416+
384417 cmdPkt[BYTE_CATEGORY_ID ] = categoryID;
385418 cmdPkt[BYTE_CMD_ID ] = cmdID;
386419 cmdPkt[BYTE_TARGET ] = targetVal;
387420 cmdPkt[BYTE_DATA ] = value >> 8 ;
388421 cmdPkt[BYTE_DATA + 1 ] = value & 0xFF ;
389422 cmdPkt[BYTE_CHECKSUM ] = categoryID + cmdID + targetVal + value;
390423
391- if (isSerialAvailable)
392- {
393- gogoSerial.write (cmdPkt, 11 );
394- isSerialAvailable = false ;
395- }
424+ delay (5 );
425+ gogoSerial.write (cmdPkt, 11 );
396426}
397427
398428void GoGoBoard::sendCmdPacket (uint8_t *data, uint8_t length)
@@ -401,11 +431,8 @@ void GoGoBoard::sendCmdPacket(uint8_t *data, uint8_t length)
401431 memcpy (cmdDynamicPkt + BYTE_HEADER_OFFSET , data, length);
402432 cmdDynamicPkt[length + BYTE_HEADER_OFFSET ] = std::accumulate (cmdDynamicPkt + BYTE_HEADER_OFFSET , cmdDynamicPkt + BYTE_HEADER_OFFSET + length, 0 );
403433
404- if (isSerialAvailable)
405- {
406- gogoSerial.write (cmdDynamicPkt, length + BYTE_HEADER_OFFSET + 1 ); // ? plus checksum byte
407- isSerialAvailable = false ;
408- }
434+ delay (5 );
435+ gogoSerial.write (cmdDynamicPkt, length + BYTE_HEADER_OFFSET + 1 ); // ? plus checksum byte
409436}
410437
411438void GoGoBoard::sendReportPacket (uint8_t *data, uint8_t length)
@@ -415,9 +442,6 @@ void GoGoBoard::sendReportPacket(uint8_t *data, uint8_t length)
415442 memcpy (reportPkt + BYTE_HEADER_OFFSET , data, length);
416443 reportPkt[length + BYTE_HEADER_OFFSET ] = std::accumulate (reportPkt + BYTE_HEADER_OFFSET , reportPkt + BYTE_HEADER_OFFSET + length, 0 );
417444
418- if (isSerialAvailable)
419- {
420- gogoSerial.write (reportPkt, length + BYTE_HEADER_OFFSET + 1 ); // ? plus checksum byte
421- isSerialAvailable = false ;
422- }
445+ delay (5 );
446+ gogoSerial.write (reportPkt, length + BYTE_HEADER_OFFSET + 1 ); // ? plus checksum byte
423447}
0 commit comments