Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Revision:
25:aac250164497
Child:
28:0376b97b4b55
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/d7a_sys.cpp	Fri Mar 25 16:48:02 2016 +0000
@@ -0,0 +1,93 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "dbg.h"
+#include "d7a_com.h"
+#include "d7a_common.h"
+#include "d7a_fs.h"
+#include "d7a_sys.h"
+
+
+typedef struct {
+    Thread* thread;
+    Queue<d7a_com_rx_msg_t, 16> pkt_queue;
+} d7a_sys_ctx_t;
+
+d7a_sys_ctx_t g_sys_ctx;
+
+void d7a_sys_thread(const void *p);
+
+void d7a_sys_open( void )
+{
+    FPRINT("\r\n");
+    g_sys_ctx.thread = new Thread(d7a_sys_thread, NULL, osPriorityBelowNormal, DEFAULT_STACK_SIZE*2);
+}
+
+void d7a_sys_new_pkt(d7a_com_rx_msg_t* pkt)
+{
+    FPRINT("\r\n");
+    ASSERT(g_sys_ctx.pkt_queue.put(pkt) == osOK, "SYS queue full!\r\n");
+}
+
+d7a_com_rx_msg_t* d7a_sys_wait_pkt( uint32_t millisec )
+{
+    FPRINT("\r\n");
+    osEvent evt = g_sys_ctx.pkt_queue.get(millisec);
+    return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
+}
+
+void d7a_sys_thread(const void *p)
+{
+    FPRINT("\r\n");
+    d7a_com_rx_msg_t* pkt;
+    
+    while (true)
+    {
+        pkt = d7a_sys_wait_pkt();
+        ASSERT(pkt != NULL, "SYS NULL pkt\r\n");
+
+        switch(pkt->id)
+        {
+            case KAL_COM_FLOW_SYS_RST:
+                DPRINT("KAL_COM_FLOW_SYS_RST\r\n");
+                FLUSH();
+                NVIC_SystemReset();
+                break;
+            case KAL_COM_FLOW_SYS_BUTTON:
+                DPRINT("KAL_COM_FLOW_SYS_BUTTON\r\n");
+                break;
+            case KAL_COM_FLOW_SYS_INFO:
+                DPRINT("KAL_COM_FLOW_SYS_INFO\r\n");
+                break;
+            case KAL_COM_FLOW_SYS_CUP:
+                DPRINT("KAL_COM_FLOW_SYS_CUP\r\n");
+                break;
+            case KAL_COM_FLOW_SYS_PING:
+                DPRINT("KAL_COM_FLOW_SYS_PING\r\n");
+                d7a_com_tx_msg_t msg;
+                uint8_t buf[5] = "PONG";
+                msg.id = KAL_COM_FLOW_SYS_PONG;
+                msg.pbuf = buf;
+                msg.plen = 4;
+                msg.alen = 0;
+                d7a_com_send_msg(&msg);
+                break;
+            case KAL_COM_FLOW_SYS_PONG:
+                DPRINT("KAL_COM_FLOW_SYS_PONG\r\n");
+                break;
+            case KAL_COM_FLOW_SYS_CFG:
+                DPRINT("KAL_COM_FLOW_SYS_CFG\r\n");
+                break;
+            case KAL_COM_FLOW_SYS_TLEV:
+                DPRINT("KAL_COM_FLOW_SYS_TLEV\r\n");
+                break;
+            case KAL_COM_FLOW_SYS_REDIR:
+                DPRINT("KAL_COM_FLOW_SYS_REDIR\r\n");
+                break;
+            default:
+                EPRINT("SYS Unknown Flow ID 0x%02X\r\n", pkt->id);
+                break;
+        }
+        
+        FREE(pkt);
+    }
+}