FIX: #69 timeout and potential bad channel settings

Esse commit está contido em:
AJ Keller
2017-08-22 08:56:31 -05:00
commit 9d232886cf
13 arquivos alterados com 88 adições e 16 exclusões
+43 -15
Ver Arquivo
@@ -139,6 +139,20 @@ boolean OpenBCI_32bit_Library::isProcessingMultibyteMsg(void) {
return isProcessingIncomingSettingsChannel || isProcessingIncomingSettingsLeadOff || settingBoardMode || settingSampleRate; return isProcessingIncomingSettingsChannel || isProcessingIncomingSettingsLeadOff || settingBoardMode || settingSampleRate;
} }
/**
* Used to abort a multipack message
*/
void OpenBCI_32bit_Library::tryMultiAbort(void) {
if (millis() > timeOfMultiByteMsgStart + 1000) {
isProcessingIncomingSettingsChannel = false;
isProcessingIncomingSettingsLeadOff = false;
settingBoardMode = false;
settingSampleRate = false;
printAll("Timeout processing multi byte message - please send all commands at once as of v2");
sendEOT();
}
}
/** /**
* @description Process one char at a time from serial port. This is the main * @description Process one char at a time from serial port. This is the main
* command processor for the OpenBCI system. Considered mission critical for * command processor for the OpenBCI system. Considered mission critical for
@@ -286,12 +300,14 @@ boolean OpenBCI_32bit_Library::processChar(char character) {
// CHANNEL SETTING COMMANDS // CHANNEL SETTING COMMANDS
case OPENBCI_CHANNEL_CMD_SET: // This is the first byte that tells us to expect more commands case OPENBCI_CHANNEL_CMD_SET: // This is the first byte that tells us to expect more commands
isProcessingIncomingSettingsChannel = true; isProcessingIncomingSettingsChannel = true;
timeOfMultiByteMsgStart = millis();
numberOfIncomingSettingsProcessedChannel = 1; numberOfIncomingSettingsProcessedChannel = 1;
break; break;
// LEAD OFF IMPEDANCE DETECTION COMMANDS // LEAD OFF IMPEDANCE DETECTION COMMANDS
case OPENBCI_CHANNEL_IMPEDANCE_SET: case OPENBCI_CHANNEL_IMPEDANCE_SET:
isProcessingIncomingSettingsLeadOff = true; isProcessingIncomingSettingsLeadOff = true;
timeOfMultiByteMsgStart = millis();
numberOfIncomingSettingsProcessedLeadOff = 1; numberOfIncomingSettingsProcessedLeadOff = 1;
break; break;
@@ -380,13 +396,14 @@ boolean OpenBCI_32bit_Library::processChar(char character) {
// BOARD TYPE SET TYPE // BOARD TYPE SET TYPE
case OPENBCI_BOARD_MODE_SET: case OPENBCI_BOARD_MODE_SET:
settingBoardMode = true; settingBoardMode = true;
numberOfIncomingSettingsProcessedBoardType = 0; timeOfMultiByteMsgStart = millis();
optionalArgCounter = 0; optionalArgCounter = 0;
break; break;
// Sample rate set // Sample rate set
case OPENBCI_SAMPLE_RATE_SET: case OPENBCI_SAMPLE_RATE_SET:
settingSampleRate = true; settingSampleRate = true;
timeOfMultiByteMsgStart = millis();
break; break;
case OPENBCI_WIFI_ATTACH: case OPENBCI_WIFI_ATTACH:
@@ -546,7 +563,7 @@ boolean OpenBCI_32bit_Library::boardBeginDebug(int baudRate) {
iSerial1.rx = true; iSerial1.rx = true;
iSerial1.baudRate = baudRate; iSerial1.baudRate = baudRate;
// setSerialInfo(iSerial1, true, true, OPENBCI_BAUD_RATE); // setSerialInfo(iSerial1, true, true, OPENBCI_BAUD_RATE);
Serial0.print("begin S1 tx "); Serial0.println(iSerial1.tx ? "on" : "off"); // Serial0.print("begin S1 tx "); Serial0.println(iSerial1.tx ? "on" : "off");
Serial1.print("begin S1 tx "); Serial1.println(iSerial1.tx ? "on" : "off"); Serial1.print("begin S1 tx "); Serial1.println(iSerial1.tx ? "on" : "off");
curBoardMode = BOARD_MODE_DEBUG; curBoardMode = BOARD_MODE_DEBUG;
@@ -778,22 +795,23 @@ void OpenBCI_32bit_Library::processIncomingChannelSettings(char character) {
currentChannelSetting = getChannelCommandForAsciiChar(character); currentChannelSetting = getChannelCommandForAsciiChar(character);
break; break;
case 2: // POWER_DOWN case 2: // POWER_DOWN
channelSettings[currentChannelSetting][POWER_DOWN] = getNumberForAsciiChar(character); optionalArgBuffer7[0] = getNumberForAsciiChar(character);
break; break;
case 3: // GAIN_SET case 3: // GAIN_SET
channelSettings[currentChannelSetting][GAIN_SET] = getGainForAsciiChar(character); optionalArgBuffer7[1] = getGainForAsciiChar(character);
break; break;
case 4: // INPUT_TYPE_SET case 4: // INPUT_TYPE_SET
channelSettings[currentChannelSetting][INPUT_TYPE_SET] = getNumberForAsciiChar(character); optionalArgBuffer7[2] = getNumberForAsciiChar(character);
break; break;
case 5: // BIAS_SET case 5: // BIAS_SET
channelSettings[currentChannelSetting][BIAS_SET] = getNumberForAsciiChar(character); optionalArgBuffer7[3] = getNumberForAsciiChar(character);
break; break;
case 6: // SRB2_SET case 6: // SRB2_SET
channelSettings[currentChannelSetting][SRB2_SET] = getNumberForAsciiChar(character); optionalArgBuffer7[4] = getNumberForAsciiChar(character);
break; break;
case 7: // SRB1_SET case 7: // SRB1_SET
channelSettings[currentChannelSetting][SRB1_SET] = getNumberForAsciiChar(character); optionalArgBuffer7[5] = getNumberForAsciiChar(character);
break; break;
case 8: // 'X' latch case 8: // 'X' latch
if (character != OPENBCI_CHANNEL_CMD_LATCH) { if (character != OPENBCI_CHANNEL_CMD_LATCH) {
@@ -805,8 +823,8 @@ void OpenBCI_32bit_Library::processIncomingChannelSettings(char character) {
// We failed somehow and should just abort // We failed somehow and should just abort
numberOfIncomingSettingsProcessedChannel = 0; numberOfIncomingSettingsProcessedChannel = 0;
// put flag back down // put flag back down
isProcessingIncomingSettingsChannel = false; isProcessingIncomingSettingsChannel = false;
} }
break; break;
@@ -837,6 +855,13 @@ void OpenBCI_32bit_Library::processIncomingChannelSettings(char character) {
sendEOT(); sendEOT();
} }
channelSettings[currentChannelSetting][POWER_DOWN] = optionalArgBuffer7[0];
channelSettings[currentChannelSetting][GAIN_SET] = optionalArgBuffer7[1];
channelSettings[currentChannelSetting][INPUT_TYPE_SET] = optionalArgBuffer7[2];
channelSettings[currentChannelSetting][BIAS_SET] = optionalArgBuffer7[3];
channelSettings[currentChannelSetting][SRB2_SET] = optionalArgBuffer7[4];
channelSettings[currentChannelSetting][SRB1_SET] = optionalArgBuffer7[5];
// Set channel settings // Set channel settings
streamSafeChannelSettingsForChannel(currentChannelSetting + 1, channelSettings[currentChannelSetting][POWER_DOWN], channelSettings[currentChannelSetting][GAIN_SET], channelSettings[currentChannelSetting][INPUT_TYPE_SET], channelSettings[currentChannelSetting][BIAS_SET], channelSettings[currentChannelSetting][SRB2_SET], channelSettings[currentChannelSetting][SRB1_SET]); streamSafeChannelSettingsForChannel(currentChannelSetting + 1, channelSettings[currentChannelSetting][POWER_DOWN], channelSettings[currentChannelSetting][GAIN_SET], channelSettings[currentChannelSetting][INPUT_TYPE_SET], channelSettings[currentChannelSetting][BIAS_SET], channelSettings[currentChannelSetting][SRB2_SET], channelSettings[currentChannelSetting][SRB1_SET]);
@@ -877,10 +902,10 @@ void OpenBCI_32bit_Library::processIncomingLeadOffSettings(char character) {
currentChannelSetting = getChannelCommandForAsciiChar(character); currentChannelSetting = getChannelCommandForAsciiChar(character);
break; break;
case 2: // pchannel setting case 2: // pchannel setting
leadOffSettings[currentChannelSetting][PCHAN] = getNumberForAsciiChar(character); optionalArgBuffer7[0] = getNumberForAsciiChar(character);
break; break;
case 3: // nchannel setting case 3: // nchannel setting
leadOffSettings[currentChannelSetting][NCHAN] = getNumberForAsciiChar(character); optionalArgBuffer7[1] = getNumberForAsciiChar(character);
break; break;
case 4: // 'Z' latch case 4: // 'Z' latch
if (character != OPENBCI_CHANNEL_IMPEDANCE_LATCH) { if (character != OPENBCI_CHANNEL_IMPEDANCE_LATCH) {
@@ -893,8 +918,8 @@ void OpenBCI_32bit_Library::processIncomingLeadOffSettings(char character) {
// reset numberOfIncomingSettingsProcessedLeadOff // reset numberOfIncomingSettingsProcessedLeadOff
numberOfIncomingSettingsProcessedLeadOff = 0; numberOfIncomingSettingsProcessedLeadOff = 0;
// put flag back down // put flag back down
isProcessingIncomingSettingsLeadOff = false; isProcessingIncomingSettingsLeadOff = false;
} }
break; break;
@@ -927,6 +952,9 @@ void OpenBCI_32bit_Library::processIncomingLeadOffSettings(char character) {
sendEOT(); sendEOT();
} }
leadOffSettings[currentChannelSetting][PCHAN] = optionalArgBuffer7[0];
leadOffSettings[currentChannelSetting][NCHAN] = optionalArgBuffer7[1];
// Set lead off settings // Set lead off settings
streamSafeLeadOffSetForChannel(currentChannelSetting + 1,leadOffSettings[currentChannelSetting][PCHAN],leadOffSettings[currentChannelSetting][NCHAN]); streamSafeLeadOffSetForChannel(currentChannelSetting + 1,leadOffSettings[currentChannelSetting][PCHAN],leadOffSettings[currentChannelSetting][NCHAN]);
@@ -978,9 +1006,9 @@ void OpenBCI_32bit_Library::initializeVariables(void) {
lastSampleTime = 0; lastSampleTime = 0;
numberOfIncomingSettingsProcessedChannel = 0; numberOfIncomingSettingsProcessedChannel = 0;
numberOfIncomingSettingsProcessedLeadOff = 0; numberOfIncomingSettingsProcessedLeadOff = 0;
numberOfIncomingSettingsProcessedBoardType = 0;
sampleCounter = 0; sampleCounter = 0;
timeOfLastRead = 0; timeOfLastRead = 0;
timeOfMultiByteMsgStart = 0;
// Enums // Enums
curAccelMode = ACCEL_MODE_ON; curAccelMode = ACCEL_MODE_ON;
+2
Ver Arquivo
@@ -161,6 +161,7 @@ public:
void streamSafeTimeSendSyncSetPacket(void); void streamSafeTimeSendSyncSetPacket(void);
void streamStart(void); void streamStart(void);
void streamStop(void); void streamStop(void);
void tryMultiAbort(void);
void updateBoardData(void); void updateBoardData(void);
void updateBoardData(boolean); void updateBoardData(boolean);
void updateChannelData(void); // retrieve data from ADS void updateChannelData(void); // retrieve data from ADS
@@ -310,6 +311,7 @@ private:
int numberOfIncomingSettingsProcessedBoardType; int numberOfIncomingSettingsProcessedBoardType;
uint8_t optionalArgCounter; uint8_t optionalArgCounter;
unsigned long timeOfLastRead; unsigned long timeOfLastRead;
unsigned long timeOfMultiByteMsgStart;
#ifdef __OpenBCI_Wifi_Master__ #ifdef __OpenBCI_Wifi_Master__
// functions // functions
+1
Ver Arquivo
@@ -52,6 +52,7 @@
### Bug Fixes ### Bug Fixes
* Calling `boardBeginDebug(void)` would result in debug not working. * Calling `boardBeginDebug(void)` would result in debug not working.
* Closes #69 with once second timeout on multi byte messages.
## Release Candidate 4 ## Release Candidate 4
@@ -23,4 +23,8 @@ void loop() {
// Read one char and process it // Read one char and process it
board.processChar(board.getCharSerial0()); board.processChar(board.getCharSerial0());
} }
// Used to abort multi part messages
if (board.isProcessingMultibyteMsg()) {
board.tryMultiAbort();
}
} }
@@ -28,4 +28,8 @@ void loop() {
// Read one char and process it // Read one char and process it
board.processChar(board.getCharSerial1()); board.processChar(board.getCharSerial1());
} }
if (board.isProcessingMultibyteMsg()) {
board.tryMultiAbort();
}
} }
@@ -103,4 +103,8 @@ void loop() {
break; break;
} }
} }
// Used to abort multi part messages
if (board.isProcessingMultibyteMsg()) {
board.tryMultiAbort();
}
} }
+5
Ver Arquivo
@@ -34,4 +34,9 @@ void loop() {
// Read one char and process it // Read one char and process it
board.processChar(board.getCharSerial0()); board.processChar(board.getCharSerial0());
} }
// Used to abort multi part messages
if (board.isProcessingMultibyteMsg()) {
board.tryMultiAbort();
}
} }
@@ -35,4 +35,9 @@ void loop() {
// Read one char and process it // Read one char and process it
board.processChar(board.getCharSerial0()); board.processChar(board.getCharSerial0());
} }
// Used to abort multi part messages
if (board.isProcessingMultibyteMsg()) {
board.tryMultiAbort();
}
} }
@@ -27,10 +27,13 @@ void loop() {
board.sendChannelData(); board.sendChannelData();
} }
} }
// Check the serial port for new data // Check the serial port for new data
if (board.hasDataSerial0()) { if (board.hasDataSerial0()) {
// Read one char and process it // Read one char and process it
board.processChar(board.getCharSerial0()); board.processChar(board.getCharSerial0());
} }
// Used to abort multi part messages
if (board.isProcessingMultibyteMsg()) {
board.tryMultiAbort();
}
} }
@@ -67,4 +67,8 @@ void loop() {
// Read one char and process it // Read one char and process it
board.processChar(board.getCharSerial0()); board.processChar(board.getCharSerial0());
} }
// Used to abort multi part messages
if (board.isProcessingMultibyteMsg()) {
board.tryMultiAbort();
}
} }
+5
Ver Arquivo
@@ -22,6 +22,11 @@ void loop() {
} }
} }
// Used to abort multi part messages
if (board.isProcessingMultibyteMsg()) {
board.tryMultiAbort();
}
// Call to wifi loop // Call to wifi loop
wifi.loop(); wifi.loop();
+5
Ver Arquivo
@@ -70,6 +70,11 @@ void loop() {
board.processChar(newChar); board.processChar(newChar);
} }
// Used to abort multi part messages
if (board.isProcessingMultibyteMsg()) {
board.tryMultiAbort();
}
// Call to wifi loop // Call to wifi loop
wifi.loop(); wifi.loop();
+2
Ver Arquivo
@@ -20,8 +20,10 @@ getCharSerial1 KEYWORD2
hasDataSerial0 KEYWORD2 hasDataSerial0 KEYWORD2
hasDataSerial1 KEYWORD2 hasDataSerial1 KEYWORD2
isADSDataAvailable KEYWORD2 isADSDataAvailable KEYWORD2
isProcessingMultibyteMsg KEYWORD2
loop KEYWORD2 loop KEYWORD2
processChar KEYWORD2 processChar KEYWORD2
tryMultiAbort KEYWORD2
updateChannelData KEYWORD2 updateChannelData KEYWORD2
useAccel KEYWORD2 useAccel KEYWORD2
useTimeStamp KEYWORD2 useTimeStamp KEYWORD2