114 lines
3.0 KiB
Arduino
114 lines
3.0 KiB
Arduino
|
|
#define BUFLEN 512
|
||
|
|
#define SERIALSPEED 115200
|
||
|
|
#define ERROR_SYNTAX 1
|
||
|
|
#define ERROR_COMMAND 2
|
||
|
|
|
||
|
|
typedef struct CmdParser {
|
||
|
|
char buffer[BUFLEN] = {0};
|
||
|
|
char atoibuf[32] = {0};
|
||
|
|
char *tok = NULL;
|
||
|
|
char *atoiptr = NULL;
|
||
|
|
int pin = 0;
|
||
|
|
} CmdParser;
|
||
|
|
|
||
|
|
void setup() {
|
||
|
|
Serial0.begin(SERIALSPEED, SERIAL_8N1, 21, 14);
|
||
|
|
}
|
||
|
|
|
||
|
|
int parse_digit_from_buffer(CmdParser *parser)
|
||
|
|
{
|
||
|
|
parser->atoiptr = parser->tok;
|
||
|
|
while ( *parser->atoiptr != ' ' && *parser->atoiptr != 0x00 ) {
|
||
|
|
if ( !isDigit((char)*parser->atoiptr) ) {
|
||
|
|
Serial0.printf("Expected digit, found %s\n", parser->tok);
|
||
|
|
return ERROR_SYNTAX;
|
||
|
|
} else if ( parser->atoiptr == ((char *)&parser->buffer + 512 ) ) {
|
||
|
|
Serial0.printf("Reached end of string looking for next token : %s\n", parser->tok);
|
||
|
|
return ERROR_SYNTAX;
|
||
|
|
}
|
||
|
|
parser->atoiptr++;
|
||
|
|
}
|
||
|
|
strncpy((char *)&parser->atoibuf, parser->tok, (int)(parser->atoiptr - parser->tok));
|
||
|
|
parser->tok = parser->atoiptr;
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int command_writepin(CmdParser *parser)
|
||
|
|
{
|
||
|
|
int rc = 0;
|
||
|
|
parser->tok = strtok(NULL, " ");
|
||
|
|
rc = parse_digit_from_buffer(parser);
|
||
|
|
if ( rc != 0 ) {
|
||
|
|
return rc;
|
||
|
|
}
|
||
|
|
parser->pin = atoi((char *)&parser->atoibuf);
|
||
|
|
parser->tok = strtok(NULL, " ");
|
||
|
|
if ( strncmp(parser->tok, "high", 4) == 0 ) {
|
||
|
|
digitalWrite(parser->pin, HIGH);
|
||
|
|
Serial0.printf("digitalWrite(%d, HIGH)", parser->pin);
|
||
|
|
} else if ( strncmp(parser->tok, "low", 3) == 0 ) {
|
||
|
|
digitalWrite(parser->pin, LOW);
|
||
|
|
Serial0.printf("digitalWrite(%d, LOW)", parser->pin);
|
||
|
|
} else {
|
||
|
|
Serial0.printf("Expected HIGH or LOW, found %s", parser->tok);
|
||
|
|
return ERROR_SYNTAX;
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int command_setpin(CmdParser *parser)
|
||
|
|
{
|
||
|
|
int rc = 0;
|
||
|
|
parser->tok = strtok(NULL, " ");
|
||
|
|
rc = parse_digit_from_buffer(parser);
|
||
|
|
if ( rc != 0 ) {
|
||
|
|
return rc;
|
||
|
|
}
|
||
|
|
parser->pin = atoi((char *)&parser->atoibuf);
|
||
|
|
parser->tok = strtok(NULL, " ");
|
||
|
|
if ( strncmp(parser->tok, "input", 5) == 0 ) {
|
||
|
|
pinMode(parser->pin, INPUT);
|
||
|
|
Serial0.printf("pinMode(%d, INPUT)", parser->pin);
|
||
|
|
} else if ( strncmp(parser->tok, "output", 6) == 0 ) {
|
||
|
|
pinMode(parser->pin, OUTPUT);
|
||
|
|
Serial0.printf("pinMode(%d, OUTPUT)", parser->pin);
|
||
|
|
} else {
|
||
|
|
Serial0.printf("Expected input or output, found %s", parser->tok);
|
||
|
|
return ERROR_SYNTAX;
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int parse_command(CmdParser *parser)
|
||
|
|
{
|
||
|
|
parser->tok = strtok((char *)&parser->buffer, " ");
|
||
|
|
if ( strcmp(parser->tok, "setpin") == 0 ) {
|
||
|
|
return command_setpin(parser);
|
||
|
|
} else if ( strcmp(parser->tok, "writepin") == 0 ) {
|
||
|
|
return command_writepin(parser);
|
||
|
|
}
|
||
|
|
return ERROR_COMMAND;
|
||
|
|
}
|
||
|
|
|
||
|
|
void loop() {
|
||
|
|
CmdParser parser;
|
||
|
|
memset((void *)&parser, 0x00, sizeof(CmdParser));
|
||
|
|
Serial0.println("");
|
||
|
|
Serial0.println("READY");
|
||
|
|
while ( Serial0.available() == 0 ) {
|
||
|
|
delay(10);
|
||
|
|
}
|
||
|
|
if ( Serial0.readBytesUntil('\0', (char *)&parser.buffer, BUFLEN) != 0 ) {
|
||
|
|
switch ( parse_command(&parser) ) {
|
||
|
|
case ERROR_SYNTAX:
|
||
|
|
Serial0.println("Syntax error");
|
||
|
|
break;
|
||
|
|
case ERROR_COMMAND:
|
||
|
|
Serial0.println("Unknown command");
|
||
|
|
break;
|
||
|
|
case 0:
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|