Give FocusSerial the ability to build a command string across multiple

cycles by maintaining buffer state
pull/1105/head
Jesse Vincent 3 years ago
parent 46d9f06d77
commit 54fbb04eb6
No known key found for this signature in database
GPG Key ID: 122F5DF7108E4046

@ -25,36 +25,45 @@ namespace kaleidoscope {
namespace plugin { namespace plugin {
char FocusSerial::command_[32]; char FocusSerial::command_[32];
uint8_t FocusSerial::buf_cursor_ = 0;
EventHandlerResult FocusSerial::afterEachCycle() { EventHandlerResult FocusSerial::afterEachCycle() {
// If the serial buffer is empty, we don't have any work to do // If the serial buffer is empty, we don't have any work to do
if (Runtime.serialPort().available() == 0) if (Runtime.serialPort().available() == 0) {
return EventHandlerResult::OK; return EventHandlerResult::OK;
}
uint8_t i = 0;
memset(command_, 0, sizeof(command_));
do { do {
command_[i++] = Runtime.serialPort().read(); command_[buf_cursor_++] = Runtime.serialPort().read();
} while (command_[i - 1] != SEPARATOR } while ( command_[buf_cursor_ - 1] != SEPARATOR
&& i < sizeof(command_) && buf_cursor_ < sizeof(command_)
&& Runtime.serialPort().available() && Runtime.serialPort().available()
&& (Runtime.serialPort().peek() != NEWLINE)); && (Runtime.serialPort().peek() != NEWLINE));
// If this was a command with a space-delimited payload, strip the space delimiter off
if (command_[i - 1] == SEPARATOR)
command_[i - 1] = '\0';
// If there was no command, there's nothing to do // If there was no command, there's nothing to do
if (command_[0] == '\0') { if (command_[0] == '\0') {
buf_cursor_ = 0;
memset(command_, 0, sizeof(command_));
return EventHandlerResult::OK; return EventHandlerResult::OK;
} }
Runtime.onFocusEvent(command_); if ( (command_[buf_cursor_ - 1] != SEPARATOR) && (Runtime.serialPort().peek() != NEWLINE)
&& buf_cursor_ < sizeof(command_)
) {
// We don't have enough command to work with yet.
// Let's leave the buffer around for another cycle
return EventHandlerResult::OK;
}
// If this was a command with a space-delimited payload,
// strip the space delimiter off
if ( (command_[buf_cursor_ - 1] == SEPARATOR) ) {
command_[buf_cursor_ - 1] = '\0';
}
// Then process the command
Runtime.onFocusEvent(command_);
while (Runtime.serialPort().available()) { while (Runtime.serialPort().available()) {
char c = Runtime.serialPort().read(); char c = Runtime.serialPort().read();
if (c == NEWLINE) { if (c == NEWLINE) {
@ -65,9 +74,10 @@ EventHandlerResult FocusSerial::afterEachCycle() {
} }
// End of command processing is signalled with a CRLF followed by a single period // End of command processing is signalled with a CRLF followed by a single period
Runtime.serialPort().println(F("\r\n.")); Runtime.serialPort().println(F("\r\n."));
buf_cursor_ = 0;
memset(command_, 0, sizeof(command_));
return EventHandlerResult::OK; return EventHandlerResult::OK;
} }
bool FocusSerial::handleHelp(const char *command, bool FocusSerial::handleHelp(const char *command,

@ -97,7 +97,7 @@ class FocusSerial : public kaleidoscope::Plugin {
private: private:
static char command_[32]; static char command_[32];
static uint8_t buf_cursor_;
static void printBool(bool b); static void printBool(bool b);
}; };
} }

Loading…
Cancel
Save