From 7b703bbd125e920f65197b9439234ead6903167c Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Mon, 9 Dec 2013 22:34:07 +0100 Subject: Restructure code a bit --- command.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 2 deletions(-) (limited to 'command.c') diff --git a/command.c b/command.c index 41472c7..7d8c515 100644 --- a/command.c +++ b/command.c @@ -1,10 +1,88 @@ #include #include +#include +#include +#include +#include "controller.h" #include "serial.h" -uint16_t serial_rx_cb(char *buffer, uint16_t len) +static void handle_set(char *buffer, uint16_t len) { - return 1; + const char *error_msg = "ERR Invalid number for temperature\r\n"; + const char *error_msg2 = "ERR Temperature out of range.\r\n"; + const char *success_msg = "OK Temperature set.\r\n"; + const char *input; + char *endptr; + long temperature; + + if (len < 2) { + serial_send(error_msg, strlen(error_msg), 0); + return; + } + + input = buffer + 1; + temperature = strtol(input, &endptr, 10); + if (input[0] == '\r' || input[0] == '\n' || + (endptr[0] != '\r' && endptr[0] != '\n')) { + serial_send(error_msg, strlen(error_msg), 0); + return; + } + + if (controller_set(temperature)) { + serial_send(error_msg2, strlen(error_msg2), 0); + return; + } + + serial_send(success_msg, strlen(success_msg), 0); } +static void handle_off(char *buffer, uint16_t len) +{ + const char *success_msg = "OK Powered down.\r\n"; + + controller_off(); + serial_send(success_msg, strlen(success_msg), 0); +} + +static void handle_get(char *buffer, uint16_t len) +{ + char response[128]; + + snprintf(response, sizeof(response), "OK t=%ld\r\n", controller_get()); + serial_send(response, strlen(response), 0); +} + +uint16_t serial_rx_cb(char *buffer, uint16_t len) +{ + const char *error_msg = "ERR Unknown command\r\n"; + switch(buffer[len-1]) { + case '\r': + case '\n': + serial_send("\r\n", 2, 0); + break; + default: + /* If we didn't get a line break, just echo and return */ + serial_send(&buffer[len-1], 1, 0); + return 0; + } + + switch(buffer[0]) { + case 's': + case 'S': + handle_set(buffer, len); + break; + case 'g': + case 'G': + handle_get(buffer, len); + break; + case 'o': + case 'O': + handle_off(buffer, len); + break; + default: + serial_send(error_msg, strlen(error_msg), 0); + } + + return len; +} -- cgit v1.2.1