summaryrefslogtreecommitdiff
path: root/command.c
diff options
context:
space:
mode:
Diffstat (limited to 'command.c')
-rw-r--r--command.c82
1 files changed, 80 insertions, 2 deletions
diff --git a/command.c b/command.c
index 41472c7..7d8c515 100644
--- a/command.c
+++ b/command.c
@@ -1,10 +1,88 @@
#include <avr/io.h>
#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#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;
+}