#include #include #include #include #include #include "controller.h" #include "serial.h" static void handle_set(char *buffer, uint16_t len) { 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; double temperature; if (len < 2) { serial_send(error_msg, strlen(error_msg), 0); return; } input = buffer + 1; temperature = strtod(input, &endptr); 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]; long temp = 10 * controller_get(); /* printf won't print doubles on avr */ snprintf(response, sizeof(response), "OK t=%ld.%ld\r\n", temp/10, temp%10); 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; }