FIX: #69 timeout and potential bad channel settings
Esse commit está contido em:
+43
-15
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Referência em uma Nova Issue
Bloquear um usuário