From 5f0b6f53660d704df88b99b1b9172824dbf25fc1 Mon Sep 17 00:00:00 2001
From: Xoaquin Castrelo <xoaquin.cb@gmail.com>
Date: Sat, 13 Nov 2021 21:34:09 +0000
Subject: [PATCH] Added state controller.

---
 emb/state-controller.cpp | 54 ++++++++++++++++++++++++++++++++++++++++
 emb/state-controller.hpp | 12 +++++++++
 2 files changed, 66 insertions(+)
 create mode 100644 emb/state-controller.cpp
 create mode 100644 emb/state-controller.hpp

diff --git a/emb/state-controller.cpp b/emb/state-controller.cpp
new file mode 100644
index 0000000..08c3d7d
--- /dev/null
+++ b/emb/state-controller.cpp
@@ -0,0 +1,54 @@
+#include "servos.hpp"
+#include "command.h"
+#include "time.hpp"
+
+#include <avr/interrupt.h>
+
+enum State
+{
+    STATE_DELAY, STATE_READY
+};
+
+static State state = STATE_READY;
+static uint32_t delayEnd = 0;
+
+void parseCommand(command *comm)
+{
+    switch (comm->comm_ch)
+    {
+        case 's':
+            setServoAngle(comm->arg[0] - 1, comm->arg[1] * 60);
+            updateServos();
+            break;
+        case 'd':
+            delayEnd = getCurrentMillis() + comm->arg[0];
+            state = STATE_DELAY;
+            break;
+    }
+}
+
+void updateState()
+{
+    switch (state)
+    {
+        case STATE_READY:
+        {
+            cli();
+            command *tmp = get_command();
+            command comm = *tmp;
+            sei();
+            
+            if (tmp != nullptr)
+                parseCommand(&comm);
+            
+            break;
+        }
+        case STATE_DELAY:
+            if (getCurrentMillis() > delayEnd)
+                state = STATE_READY;
+            
+            break;
+    }
+}
+
+
diff --git a/emb/state-controller.hpp b/emb/state-controller.hpp
new file mode 100644
index 0000000..409b6af
--- /dev/null
+++ b/emb/state-controller.hpp
@@ -0,0 +1,12 @@
+#ifndef STATE_CONTROLLER_H
+#define STATE_CONTROLLER_H
+
+#include "command.h"
+
+/**
+ * Updates command the state.
+ * Should be called periodically.
+ */
+void updateState();
+
+#endif /* STATE_CONTROLLER_H */
-- 
GitLab