Skip to content

Commit e630c33

Browse files
committed
fix readInput command & fix internal serial timing
1 parent 187d84c commit e630c33

2 files changed

Lines changed: 75 additions & 41 deletions

File tree

src/GoGoBoardArduino.cpp

Lines changed: 59 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,20 @@
2727
#define SERIAL_1ST_HEADER 0x54
2828
#define SERIAL_2ND_HEADER 0xFE
2929

30-
#define ARDUINO_REPORT_PACKET_TYPE 31
31-
3230
uint8_t GoGoBoard::gblExtSerialState = SER_WAITING_FOR_1ST_HEADER;
31+
uint8_t GoGoBoard::gblExtSerialPacketType = 0;
3332
uint8_t GoGoBoard::gblExtSerialCmdChecksum = 0;
3433
uint8_t GoGoBoard::inExtLength = 0;
3534
uint8_t GoGoBoard::gblExtSerialCmdCounter = 0;
3635
bool GoGoBoard::gblUseFirstExtCmdBuffer = false;
3736
bool GoGoBoard::gblNewExtCmdReady = false;
37+
bool GoGoBoard::gblRequestResponseAvailable = false;
3838
uint8_t GoGoBoard::gbl1stExtCMDBuffer[64] = {0};
3939
uint8_t GoGoBoard::gbl2ndExtCMDBuffer[64] = {0};
40+
uint8_t *GoGoBoard::gblActiveBuffer = NULL;
4041

4142
String GoGoBoard::_key = String();
4243
gmessage GoGoBoard::gmessage_list;
43-
volatile bool GoGoBoard::isSerialAvailable = false;
4444

4545
GoGoBoard::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

163178
void 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

188202
int 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

194222
void 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

398428
void 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

411438
void 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
}

src/GoGoBoardArduino.h

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
#define GOGO_GPIO_SCK PA5
2525
#define GOGO_GPIO_NSS PA4
2626

27+
#define ARDUINO_CMD_PACKET_TYPE 30
28+
#define ARDUINO_GMESSAGE_PACKET_TYPE 31
29+
#define ARDUINO_REQUEST_PACKET_TYPE 32
30+
2731
// * //////////////////////////////////////////////////////////////
2832
// * Category Definitions
2933
#define CMD_PACKET 0
@@ -91,6 +95,10 @@
9195

9296
#define RCMD_GOGOID 1
9397

98+
#define REQ_READ_INPUT 1
99+
#define REQ_READ_FILTERED_INPUT 2
100+
101+
#define BYTE_PACKET_TYPE 2
94102
#define BYTE_PACKET_LENGTH 3
95103
#define BYTE_CATEGORY_ID 5
96104
#define BYTE_CMD_ID 6
@@ -167,32 +175,34 @@ class GoGoBoard
167175
// static void resetCallback(void);
168176
static void irqCallback(void);
169177
static void gogoSerialEvent(void);
170-
static void processGmessage(void);
178+
static void processPacket(void);
171179

172180
static uint8_t gblExtSerialState;
181+
static uint8_t gblExtSerialPacketType;
173182
static uint8_t gblExtSerialCmdChecksum;
174183
static uint8_t inExtLength;
175184
static uint8_t gblExtSerialCmdCounter;
176185
static bool gblUseFirstExtCmdBuffer;
177186
static bool gblNewExtCmdReady;
187+
static bool gblRequestResponseAvailable;
178188
static uint8_t gbl1stExtCMDBuffer[];
179189
static uint8_t gbl2ndExtCMDBuffer[];
190+
static uint8_t *gblActiveBuffer;
180191

181192
static String _key;
182193
static gmessage gmessage_list;
183-
static volatile bool isSerialAvailable;
184194

185-
void sendCmdPacket(uint8_t categoryID, uint8_t cmdID, uint8_t targetVal = 0, int value = 0);
195+
void sendCmdPacket(uint8_t categoryID, uint8_t cmdID, uint8_t targetVal = 0, int value = 0, bool isCmd = true);
186196
void sendCmdPacket(uint8_t *data, uint8_t length);
187197

188198
void sendReportPacket(uint8_t *data, uint8_t length);
189199

190200
String _dataStr;
191201

192202
uint8_t dataPkt[GOGO_DEFAULT_BUFFER_SIZE] = {0};
193-
uint8_t cmdPkt[GOGO_DEFAULT_BUFFER_SIZE] = {0x54, 0xfe, 0x1e, 0x07, 0x00};
194-
uint8_t cmdDynamicPkt[GOGO_DEFAULT_BUFFER_SIZE] = {0x54, 0xfe, 0x1e};
195-
uint8_t reportPkt[GOGO_DEFAULT_BUFFER_SIZE] = {0x54, 0xfe, 0x1f};
203+
uint8_t cmdPkt[GOGO_DEFAULT_BUFFER_SIZE] = {0x54, 0xfe, ARDUINO_CMD_PACKET_TYPE, 0x07, 0x00};
204+
uint8_t cmdDynamicPkt[GOGO_DEFAULT_BUFFER_SIZE] = {0x54, 0xfe, ARDUINO_CMD_PACKET_TYPE};
205+
uint8_t reportPkt[GOGO_DEFAULT_BUFFER_SIZE] = {0x54, 0xfe, ARDUINO_GMESSAGE_PACKET_TYPE};
196206
};
197207

198208
class GoGoBoardArduino : public GoGoBoard {};

0 commit comments

Comments
 (0)