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:
AJ Keller
2017-08-29 11:19:15 -04:00
commit de GitHub
5 arquivos alterados com 156 adições e 69 exclusões
+115 -60
Ver Arquivo
@@ -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;
+29 -6
Ver Arquivo
@@ -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;
+6
Ver Arquivo
@@ -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
+4
Ver Arquivo
@@ -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());
+2 -3
Ver Arquivo
@@ -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