Initial command class impl
This commit is contained in:
91
src/modules/cmd/cmd.h
Normal file
91
src/modules/cmd/cmd.h
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "custom_types.h"
|
||||||
|
#include "modules/logger/system_logger.h"
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
class cmd {
|
||||||
|
private:
|
||||||
|
HardwareSerial *_data_stream;
|
||||||
|
unsigned long _baud_rate = 115200;
|
||||||
|
system_logger *_logger;
|
||||||
|
char _buffer[256];
|
||||||
|
unsigned int _idx = 0;
|
||||||
|
bool _buf_open = false;
|
||||||
|
int try_parse();
|
||||||
|
|
||||||
|
public:
|
||||||
|
cmd(HardwareSerial *data_stream);
|
||||||
|
cmd(HardwareSerial *data_stream, system_logger *logger);
|
||||||
|
~cmd();
|
||||||
|
int init();
|
||||||
|
int parse_task(unsigned long timeout_ms = 500);
|
||||||
|
};
|
||||||
|
|
||||||
|
int cmd::try_parse() {
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (_logger != nullptr) {
|
||||||
|
_logger->debug("Attempting to parse command");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (strcmp(_buffer, "REBOOT") == 0) {
|
||||||
|
#ifdef INFO
|
||||||
|
if (_logger != nullptr) {
|
||||||
|
_logger->info("Rebooting");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
delay(200);
|
||||||
|
wdt_enable(WDTO_15MS);
|
||||||
|
while (true) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd::cmd(HardwareSerial *data_stream)
|
||||||
|
: _data_stream(data_stream), _logger(nullptr) {}
|
||||||
|
|
||||||
|
cmd::cmd(HardwareSerial *data_stream, system_logger *logger)
|
||||||
|
: _data_stream(data_stream), _logger(logger) {}
|
||||||
|
|
||||||
|
cmd::~cmd() {}
|
||||||
|
|
||||||
|
int cmd::init() {
|
||||||
|
_data_stream->begin(_baud_rate);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cmd::parse_task(unsigned long timeout_ms) {
|
||||||
|
unsigned long timeout = millis() + timeout_ms;
|
||||||
|
while (_data_stream->available()) {
|
||||||
|
char c = _data_stream->read();
|
||||||
|
if (c == '<') {
|
||||||
|
_buf_open = true;
|
||||||
|
_idx = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (_idx >= sizeof(_buffer) - 1) {
|
||||||
|
_buf_open = false;
|
||||||
|
_idx = 0;
|
||||||
|
#ifdef ERROR
|
||||||
|
if (_logger != nullptr) {
|
||||||
|
_logger->error("Command parser buffer overflow");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (c == '>') {
|
||||||
|
_buffer[_idx] = '\0';
|
||||||
|
_buf_open = false;
|
||||||
|
return this->try_parse();
|
||||||
|
}
|
||||||
|
if (_buf_open) {
|
||||||
|
|
||||||
|
_buffer[_idx] = c;
|
||||||
|
_idx++;
|
||||||
|
}
|
||||||
|
if (millis() > timeout) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user