Organize projects in chronological order
This commit is contained in:
113
03-serialuart/serialuart.ino
Normal file
113
03-serialuart/serialuart.ino
Normal file
@@ -0,0 +1,113 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user