debugging all of those functions tinkering with global variables makes for real spaghetti code, yeah?
don't use String class
don't use the SerialEvent
do have functions take an argument or arguments
do have functions return something
limit your global variables
something more like this, using your data template:
const size_t MAX_MESSAGE_BUFFER_LENGTH = 32;
struct Command {
char command;
int value;
};
//tested using this data: #1234-x\n
template<class T> inline Print &operator << (Print &object, T argument)
{
object.print(argument);
return object;
}
void setup()
{
Serial.begin(9600);
if (Serial)
{
Serial << (F("let's go!\n"));
}
}
void loop()
{
if (const char* packet = checkForNewPacket(Serial, '#', '\n')) // checks for message on Serial with start and end marker
{
Serial << (F("\nthis just in...\n")) << (packet) << (F("\n\n"));
Command newCommand;
if (parsePacket(newCommand, packet)) {
processCommand(newCommand);
} else {
Serial << (F("Bad Packet"));
}
}
}
void processCommand(Command cmd) {
switch (cmd.command) {
case 'x':
Serial << (F("x value: ")) << cmd.value;
break;
default:
Serial << (F("UnknownCommand: ")) << cmd.command << (F(" value:")) << cmd.value;
break;
}
}
bool parsePacket(Command& cmd, const char* packet) {
if (char* ptr = strchr(packet, '-')) {
ptr++;
cmd.command = *ptr;
cmd.value = atoi(packet);
return true;
}
return false;
}
const char* checkForNewPacket(Stream& stream, const char startMarker, const char endMarker)
{
static char incomingMessage[MAX_MESSAGE_BUFFER_LENGTH] = "";
static unsigned char idx = 0;
static bool gotStartMarker = false;
if (stream.available()) {
if (!gotStartMarker) {
if (stream.read() == startMarker) {
gotStartMarker = true;
}
} else {
incomingMessage[idx] = stream.read();
if (incomingMessage[idx] == endMarker) {
incomingMessage[idx] = '\0';
idx = 0;
gotStartMarker = false;
if (!strlen(incomingMessage)) { //startMarker followed immediatly by endMarker (i.e.no data)
//stream << (F("{\"error\":\"no data\"}\n")); // you can return an error to sender here
return nullptr;
}
//stream << (F("{\"success\":\"")) << (incomingMessage) << (F("\"}\n")); // or return a success messaage
return incomingMessage;
} else {
idx++;
if (idx > MAX_MESSAGE_BUFFER_LENGTH - 1) {
stream << (F("{\"error\":\"message exceeded ")) << (sizeof(incomingMessage) - 1) << (F(" chars\"}\n")); // another error to sender here
idx = 0;
gotStartMarker = false;
incomingMessage[idx] = '\0';
}
}
}
}
return nullptr;
}