Merge pull request #1 from gerrievanzyl/insert-markers-via-serial
Insert markers via serial and new multi char serial timing
Esse commit está contido em:
+115
-60
@@ -130,30 +130,6 @@ char OpenBCI_32bit_Library::getCharSerial1(void) {
|
||||
return Serial1.read();
|
||||
}
|
||||
|
||||
/**
|
||||
* @description While processing incoming multi byte messages these will turn
|
||||
* true.
|
||||
* @return {boolean} - True if processing a message and false otherwise
|
||||
*/
|
||||
boolean OpenBCI_32bit_Library::isProcessingMultibyteMsg(void) {
|
||||
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");
|
||||
printAll(" message - please send all");
|
||||
printAll(" commands at once as of v2");
|
||||
sendEOT();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Process one char at a time from serial port. This is the main
|
||||
@@ -167,16 +143,27 @@ boolean OpenBCI_32bit_Library::processChar(char character) {
|
||||
Serial1.print("pC: "); Serial1.println(character);
|
||||
}
|
||||
|
||||
if (isProcessingMultibyteMsg()) {
|
||||
if (isProcessingIncomingSettingsChannel) {
|
||||
processIncomingChannelSettings(character);
|
||||
} else if (isProcessingIncomingSettingsLeadOff) {
|
||||
processIncomingLeadOffSettings(character);
|
||||
} else if (settingBoardMode) {
|
||||
processIncomingBoardMode(character);
|
||||
} else if (settingSampleRate) {
|
||||
processIncomingSampleRate(character);
|
||||
}
|
||||
if (checkMultiCharCmdTimer()) { // we are in a multi char command
|
||||
switch (getMultiCharCommand()){
|
||||
case MULTI_CHAR_CMD_PROCESSING_INCOMING_SETTINGS_CHANNEL:
|
||||
processIncomingChannelSettings(character);
|
||||
break;
|
||||
case MULTI_CHAR_CMD_PROCESSING_INCOMING_SETTINGS_LEADOFF:
|
||||
processIncomingLeadOffSettings(character);
|
||||
break;
|
||||
case MULTI_CHAR_CMD_SETTINGS_BOARD_MODE:
|
||||
processIncomingBoardMode(character);
|
||||
break;
|
||||
case MULTI_CHAR_CMD_SETTINGS_SAMPLE_RATE:
|
||||
processIncomingSampleRate(character);
|
||||
break;
|
||||
case MULTI_CHAR_CMD_INSERT_MARKER:
|
||||
processInsertMarker(character);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
} else { // Normal...
|
||||
switch (character){
|
||||
//TURN CHANNELS ON/OFF COMMANDS
|
||||
@@ -300,16 +287,14 @@ boolean OpenBCI_32bit_Library::processChar(char character) {
|
||||
|
||||
|
||||
// CHANNEL SETTING COMMANDS
|
||||
case OPENBCI_CHANNEL_CMD_SET: // This is the first byte that tells us to expect more commands
|
||||
isProcessingIncomingSettingsChannel = true;
|
||||
timeOfMultiByteMsgStart = millis();
|
||||
case OPENBCI_CHANNEL_CMD_SET: // This is a multi char command with a timeout
|
||||
startMultiCharCmdTimer(MULTI_CHAR_CMD_PROCESSING_INCOMING_SETTINGS_CHANNEL);
|
||||
numberOfIncomingSettingsProcessedChannel = 1;
|
||||
break;
|
||||
|
||||
// LEAD OFF IMPEDANCE DETECTION COMMANDS
|
||||
case OPENBCI_CHANNEL_IMPEDANCE_SET:
|
||||
isProcessingIncomingSettingsLeadOff = true;
|
||||
timeOfMultiByteMsgStart = millis();
|
||||
startMultiCharCmdTimer(MULTI_CHAR_CMD_PROCESSING_INCOMING_SETTINGS_LEADOFF);
|
||||
numberOfIncomingSettingsProcessedLeadOff = 1;
|
||||
break;
|
||||
|
||||
@@ -399,15 +384,13 @@ boolean OpenBCI_32bit_Library::processChar(char character) {
|
||||
|
||||
// BOARD TYPE SET TYPE
|
||||
case OPENBCI_BOARD_MODE_SET:
|
||||
settingBoardMode = true;
|
||||
timeOfMultiByteMsgStart = millis();
|
||||
startMultiCharCmdTimer(MULTI_CHAR_CMD_SETTINGS_BOARD_MODE);
|
||||
optionalArgCounter = 0;
|
||||
break;
|
||||
|
||||
// Sample rate set
|
||||
case OPENBCI_SAMPLE_RATE_SET:
|
||||
settingSampleRate = true;
|
||||
timeOfMultiByteMsgStart = millis();
|
||||
startMultiCharCmdTimer(MULTI_CHAR_CMD_SETTINGS_SAMPLE_RATE);
|
||||
break;
|
||||
|
||||
case OPENBCI_WIFI_ATTACH:
|
||||
@@ -452,6 +435,57 @@ boolean OpenBCI_32bit_Library::processChar(char character) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start the timer on multi char commands
|
||||
* @param cmd {char} the command received on the serial stream. See enum MULTI_CHAR_COMMAND
|
||||
* @returns void
|
||||
*/
|
||||
void OpenBCI_32bit_Library::startMultiCharCmdTimer(char cmd) {
|
||||
isMultiCharCmd = true;
|
||||
multiCharCommand = cmd;
|
||||
multiCharCmdTimeout = millis() + MULTI_CHAR_COMMAND_TIMEOUT_MS;
|
||||
}
|
||||
|
||||
/**
|
||||
* End the timer on multi char commands
|
||||
* @param None
|
||||
* @returns void
|
||||
*/
|
||||
void OpenBCI_32bit_Library::endMultiCharCmdTimer(void) {
|
||||
isMultiCharCmd = false;
|
||||
multiCharCommand = NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for valid on multi char commands
|
||||
* @param None
|
||||
* @returns {boolean} true if a multi char commands is active and the timer is running, otherwise False
|
||||
*/
|
||||
boolean OpenBCI_32bit_Library::checkMultiCharCmdTimer(void) {
|
||||
if (isMultiCharCmd){
|
||||
if (millis() < multiCharCmdTimeout)
|
||||
return true;
|
||||
else { // the timer has timed out - reset the multi char timeout
|
||||
endMultiCharCmdTimer();
|
||||
printAll("Timeout processing multi byte");
|
||||
printAll(" message - please send all");
|
||||
printAll(" commands at once as of v2");
|
||||
sendEOT();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* gets the active multi char command
|
||||
* @param None
|
||||
* @returns {unsigned int} multiCharCommand
|
||||
*/
|
||||
unsigned int OpenBCI_32bit_Library::getMultiCharCommand( void ){
|
||||
return multiCharCommand;
|
||||
}
|
||||
|
||||
|
||||
boolean OpenBCI_32bit_Library::processCharWifi(char character) {
|
||||
commandFromSPI = true;
|
||||
boolean retVal = processChar(character);
|
||||
@@ -652,7 +686,7 @@ void OpenBCI_32bit_Library::processIncomingBoardMode(char c) {
|
||||
sendEOT();
|
||||
} else if (isDigit(c)) {
|
||||
uint8_t digit = c - '0';
|
||||
if (digit <= BOARD_MODE_DIGITAL) {
|
||||
if (digit < BOARD_MODE_END_OF_MODES) {
|
||||
setBoardMode(digit);
|
||||
delay(100);
|
||||
printSuccess();
|
||||
@@ -669,7 +703,7 @@ void OpenBCI_32bit_Library::processIncomingBoardMode(char c) {
|
||||
printAll("invalid board mode value.");
|
||||
sendEOT();
|
||||
}
|
||||
settingBoardMode = false;
|
||||
endMultiCharCmdTimer();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -778,9 +812,27 @@ void OpenBCI_32bit_Library::processIncomingSampleRate(char c) {
|
||||
sendEOT();
|
||||
}
|
||||
}
|
||||
settingSampleRate = false;
|
||||
endMultiCharCmdTimer();
|
||||
}
|
||||
|
||||
/**
|
||||
* @description When a '`x' is found on the serial port it is a signal to insert a marker
|
||||
* of value x into the AUX1 stream (auxData[0]). This function sets the flag to indicate that a new marker
|
||||
* is available. The marker will be inserted during the serial and sd write functions
|
||||
* @param character {char} - The character that will be inserted into the data stream
|
||||
*/
|
||||
void OpenBCI_32bit_Library::processInsertMarker(char c) {
|
||||
if (c < 128) {
|
||||
markerValue = c;
|
||||
newMarkerReceived = true;
|
||||
} else {
|
||||
markerValue = 0;
|
||||
newMarkerReceived = false;
|
||||
}
|
||||
endMultiCharCmdTimer();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @description When a 'x' is found on the serial port, we jump to this function
|
||||
* where we continue to read from the serial port and read the
|
||||
@@ -793,7 +845,7 @@ void OpenBCI_32bit_Library::processIncomingChannelSettings(char character) {
|
||||
numberOfIncomingSettingsProcessedChannel = 0;
|
||||
|
||||
// put flag back down
|
||||
isProcessingIncomingSettingsChannel = false;
|
||||
endMultiCharCmdTimer();
|
||||
|
||||
if (!streaming) {
|
||||
printFailure();
|
||||
@@ -837,7 +889,7 @@ void OpenBCI_32bit_Library::processIncomingChannelSettings(char character) {
|
||||
numberOfIncomingSettingsProcessedChannel = 0;
|
||||
|
||||
// put flag back down
|
||||
isProcessingIncomingSettingsChannel = false;
|
||||
endMultiCharCmdTimer();
|
||||
|
||||
}
|
||||
break;
|
||||
@@ -851,7 +903,7 @@ void OpenBCI_32bit_Library::processIncomingChannelSettings(char character) {
|
||||
numberOfIncomingSettingsProcessedChannel = 0;
|
||||
|
||||
// put flag back down
|
||||
isProcessingIncomingSettingsChannel = false;
|
||||
endMultiCharCmdTimer();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -882,7 +934,7 @@ void OpenBCI_32bit_Library::processIncomingChannelSettings(char character) {
|
||||
numberOfIncomingSettingsProcessedChannel = 0;
|
||||
|
||||
// put flag back down
|
||||
isProcessingIncomingSettingsChannel = false;
|
||||
endMultiCharCmdTimer();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -900,8 +952,8 @@ void OpenBCI_32bit_Library::processIncomingLeadOffSettings(char character) {
|
||||
numberOfIncomingSettingsProcessedLeadOff = 0;
|
||||
|
||||
// put flag back down
|
||||
isProcessingIncomingSettingsLeadOff = false;
|
||||
|
||||
endMultiCharCmdTimer();
|
||||
|
||||
if (!streaming) {
|
||||
printFailure();
|
||||
printAll("too few chars");
|
||||
@@ -932,8 +984,7 @@ void OpenBCI_32bit_Library::processIncomingLeadOffSettings(char character) {
|
||||
numberOfIncomingSettingsProcessedLeadOff = 0;
|
||||
|
||||
// put flag back down
|
||||
isProcessingIncomingSettingsLeadOff = false;
|
||||
|
||||
endMultiCharCmdTimer();
|
||||
}
|
||||
break;
|
||||
default: // should have exited
|
||||
@@ -947,7 +998,7 @@ void OpenBCI_32bit_Library::processIncomingLeadOffSettings(char character) {
|
||||
numberOfIncomingSettingsProcessedLeadOff = 0;
|
||||
|
||||
// put flag back down
|
||||
isProcessingIncomingSettingsLeadOff = false;
|
||||
endMultiCharCmdTimer();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -975,7 +1026,7 @@ void OpenBCI_32bit_Library::processIncomingLeadOffSettings(char character) {
|
||||
numberOfIncomingSettingsProcessedLeadOff = 0;
|
||||
|
||||
// put flag back down
|
||||
isProcessingIncomingSettingsLeadOff = false;
|
||||
endMultiCharCmdTimer();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1008,10 +1059,7 @@ void OpenBCI_32bit_Library::initializeVariables(void) {
|
||||
channelDataAvailable = false;
|
||||
commandFromSPI = false;
|
||||
daisyPresent = false;
|
||||
isProcessingIncomingSettingsChannel = false;
|
||||
isProcessingIncomingSettingsLeadOff = false;
|
||||
settingBoardMode = false;
|
||||
settingSampleRate = false;
|
||||
endMultiCharCmdTimer(); // this initializes and resets the variables
|
||||
streaming = false;
|
||||
verbosity = false; // when verbosity is true, there will be Serial feedback
|
||||
|
||||
@@ -2483,6 +2531,13 @@ void OpenBCI_32bit_Library::updateChannelData(){
|
||||
auxData[1] = (wifi.present ? 0 : digitalRead(13) << 8) | digitalRead(17);
|
||||
auxData[2] = wifi.present ? 0 : digitalRead(18);
|
||||
break;
|
||||
case BOARD_MODE_MARKER:
|
||||
if (newMarkerReceived){
|
||||
auxData[0] = (int)markerValue;
|
||||
markerValue = 0;
|
||||
newMarkerReceived = false;
|
||||
}
|
||||
break;
|
||||
case BOARD_MODE_DEBUG:
|
||||
case BOARD_MODE_DEFAULT:
|
||||
break;
|
||||
|
||||
@@ -26,14 +26,31 @@ public:
|
||||
TIME_SYNC_MODE_ON,
|
||||
TIME_SYNC_MODE_OFF
|
||||
};
|
||||
typedef enum MARKER_MODE {
|
||||
MARKER_MODE_ON,
|
||||
MARKER_MODE_OFF
|
||||
};
|
||||
|
||||
|
||||
typedef enum BOARD_MODE {
|
||||
BOARD_MODE_DEFAULT,
|
||||
BOARD_MODE_DEBUG,
|
||||
BOARD_MODE_ANALOG,
|
||||
BOARD_MODE_DIGITAL
|
||||
BOARD_MODE_DIGITAL,
|
||||
BOARD_MODE_MARKER,
|
||||
BOARD_MODE_END_OF_MODES // This must be the last entry-insert any new board modes above this line
|
||||
};
|
||||
|
||||
typedef enum MULTI_CHAR_COMMAND {
|
||||
NONE,
|
||||
MULTI_CHAR_CMD_PROCESSING_INCOMING_SETTINGS_CHANNEL,
|
||||
MULTI_CHAR_CMD_PROCESSING_INCOMING_SETTINGS_LEADOFF,
|
||||
MULTI_CHAR_CMD_SERIAL_PASSTHROUGH,
|
||||
MULTI_CHAR_CMD_SETTINGS_BOARD_MODE,
|
||||
MULTI_CHAR_CMD_SETTINGS_SAMPLE_RATE,
|
||||
MULTI_CHAR_CMD_INSERT_MARKER
|
||||
};
|
||||
|
||||
typedef enum PACKET_TYPE {
|
||||
PACKET_TYPE_ACCEL,
|
||||
PACKET_TYPE_RAW_AUX,
|
||||
@@ -88,6 +105,7 @@ public:
|
||||
void channelSettingsArraySetForAll(void);
|
||||
void channelSettingsArraySetForChannel(byte N);
|
||||
void channelSettingsSetForChannel(byte, byte, byte, byte, byte, byte, byte);
|
||||
boolean checkMultiCharCmdTimer(void) ;
|
||||
void csLow(int);
|
||||
void csHigh(int);
|
||||
void configureInternalTestSignal(byte,byte);
|
||||
@@ -95,6 +113,7 @@ public:
|
||||
void deactivateChannel(byte); // disable given channel 1-8(16)
|
||||
void disable_accel(void); // stop data acquisition and go into low power mode
|
||||
void enable_accel(byte); // start acceleromoeter with default settings
|
||||
void endMultiCharCmdTimer(void);
|
||||
const char* getBoardMode(void);
|
||||
char getChannelCommandForAsciiChar(char);
|
||||
char getCharSerial0(void);
|
||||
@@ -104,6 +123,7 @@ public:
|
||||
char getDefaultChannelSettingForSettingAscii(byte);
|
||||
char getGainForAsciiChar(char);
|
||||
uint8_t * getGains(void);
|
||||
unsigned int getMultiCharCommand( void );
|
||||
char getNumberForAsciiChar(char);
|
||||
const char* getSampleRate(void);
|
||||
char getTargetSSForConstrainedChannelNumber(byte);
|
||||
@@ -135,6 +155,7 @@ public:
|
||||
boolean processCharWifi(char);
|
||||
void processIncomingBoardMode(char);
|
||||
void processIncomingSampleRate(char);
|
||||
void processInsertMarker(char);
|
||||
void processIncomingChannelSettings(char);
|
||||
void processIncomingLeadOffSettings(char);
|
||||
void reportDefaultChannelSettings(void);
|
||||
@@ -153,6 +174,7 @@ public:
|
||||
void sendEOT(void);
|
||||
void setSerialInfo(SerialInfo, boolean, boolean, uint32_t);
|
||||
boolean smellDaisy(void);
|
||||
void startMultiCharCmdTimer(char);
|
||||
void streamSafeChannelDeactivate(byte);
|
||||
void streamSafeChannelActivate(byte);
|
||||
void streamSafeChannelSettingsForChannel(byte, byte, byte, byte, byte, byte, byte);
|
||||
@@ -181,6 +203,7 @@ public:
|
||||
void writeZeroAux(void);
|
||||
void zeroAuxData(void);
|
||||
|
||||
|
||||
// Variables
|
||||
boolean boardUseSRB1; // used to keep track of if we are using SRB1
|
||||
boolean daisyPresent;
|
||||
@@ -292,14 +315,13 @@ private:
|
||||
// Variables
|
||||
boolean commandFromSPI;
|
||||
boolean firstDataPacket;
|
||||
boolean isProcessingIncomingSettingsChannel;
|
||||
boolean isProcessingIncomingSettingsLeadOff;
|
||||
boolean isProcessingIncomingSerialPassThru;
|
||||
boolean isMultiCharCmd; // A multi char command is in progress
|
||||
boolean isRunning;
|
||||
boolean settingBoardMode;
|
||||
boolean settingSampleRate;
|
||||
boolean newMarkerReceived; // flag to indicate a new marker has been received
|
||||
byte regData[24]; // array is used to mirror register data
|
||||
char buffer[1];
|
||||
char markerValue;
|
||||
char multiCharCommand; // The type of command
|
||||
char currentChannelSetting;
|
||||
char optionalArgBuffer5[5];
|
||||
char optionalArgBuffer6[6];
|
||||
@@ -312,6 +334,7 @@ private:
|
||||
int numberOfIncomingSettingsProcessedLeadOff;
|
||||
int numberOfIncomingSettingsProcessedBoardType;
|
||||
uint8_t optionalArgCounter;
|
||||
unsigned long multiCharCmdTimeout; // the timeout in millis of the current multi char command
|
||||
unsigned long timeOfLastRead;
|
||||
unsigned long timeOfMultiByteMsgStart;
|
||||
|
||||
|
||||
@@ -330,6 +330,9 @@
|
||||
/** Set sample rate */
|
||||
#define OPENBCI_SAMPLE_RATE_SET '~'
|
||||
|
||||
/** Insert marker into the stream */
|
||||
#define OPENBCI_INSERT_MARKER '`'
|
||||
|
||||
/** Sync Clocks */
|
||||
#define OPENBCI_TIME_SET '<'
|
||||
#define OPENBCI_TIME_STOP '>'
|
||||
@@ -353,6 +356,9 @@
|
||||
#define OPENBCI_SAMPLE_RATE_125 125
|
||||
#define OPENBCI_SAMPLE_RATE_250 250
|
||||
|
||||
/** Time out for multi char commands **/
|
||||
#define MULTI_CHAR_COMMAND_TIMEOUT_MS 1000
|
||||
|
||||
/** Packet Size */
|
||||
#define OPENBCI_PACKET_SIZE 33
|
||||
|
||||
|
||||
@@ -53,6 +53,10 @@ void loop() {
|
||||
board.processCharWifi(newChar);
|
||||
}
|
||||
|
||||
if (board.isMultiCharCmd) {
|
||||
board.checkMultiCharCmdTimer();
|
||||
}
|
||||
|
||||
if (!wifi.sentGains) {
|
||||
if(wifi.present && wifi.tx) {
|
||||
wifi.sendGains(board.numChannels, board.getGains());
|
||||
|
||||
@@ -70,9 +70,8 @@ void loop() {
|
||||
board.processChar(newChar);
|
||||
}
|
||||
|
||||
// Used to abort multi part messages
|
||||
if (board.isProcessingMultibyteMsg()) {
|
||||
board.tryMultiAbort();
|
||||
if (board.isMultiCharCmd) {
|
||||
board.checkMultiCharCmdTimer();
|
||||
}
|
||||
|
||||
// Call to wifi loop
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário