Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Revision:
25:aac250164497
Child:
26:9f0b9833cac6
diff -r a8433b091764 -r aac250164497 src/d7a_modem.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/d7a_modem.cpp	Fri Mar 25 16:48:02 2016 +0000
@@ -0,0 +1,135 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "dbg.h"
+#include "d7a_com.h"
+#include "d7a_fs.h"
+#include "d7a_modem.h"
+#include "d7a_common.h"
+
+typedef struct {
+    Thread* thread;
+    Semaphore* ready;
+    Queue<d7a_com_rx_msg_t, 16> pkt_queue;
+} d7a_modem_ctx_t;
+
+d7a_modem_ctx_t g_modem_ctx;
+
+void d7a_modem_thread(const void *p);
+
+void d7a_modem_open( void )
+{
+    FPRINT("\r\n");
+    g_modem_ctx.ready = new Semaphore(1);
+    g_modem_ctx.thread = new Thread(d7a_modem_thread, NULL, osPriorityBelowNormal, DEFAULT_STACK_SIZE*2);
+    
+    // Wait to consume the semaphore
+    g_modem_ctx.ready->wait();
+}
+
+void d7a_modem_wait_ready( uint32_t millisec )
+{
+    FPRINT("\r\n");
+    g_modem_ctx.ready->wait(millisec);
+}
+
+void d7a_modem_new_pkt(d7a_com_rx_msg_t* pkt)
+{
+    FPRINT("\r\n");
+    ASSERT(g_modem_ctx.pkt_queue.put(pkt) == osOK, "MODEM queue full!\r\n");
+}
+
+d7a_com_rx_msg_t* d7a_modem_wait_pkt( uint32_t millisec )
+{
+    FPRINT("\r\n");
+    osEvent evt = g_modem_ctx.pkt_queue.get(millisec);
+    return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
+}
+
+static void d7a_modem_msg(uint8_t value, uint8_t* buf, uint8_t len)
+{
+    FPRINT("(value:0x%02X, buf:0x%08x, len:%d)\r\n", value, buf, len);
+    d7a_com_tx_msg_t msg;
+    uint8_t val=value;
+    msg.id = KAL_COM_FLOW_CMD;
+    msg.pbuf = &val;
+    msg.abuf = buf;
+    msg.plen = 1;
+    msg.alen = len;
+    d7a_com_send_msg(&msg);
+}
+
+void d7a_modem_register_file(uint8_t fid, uint8_t fifo_size, uint8_t flush_policy)
+{
+    FPRINT("(fid:%d, fifo_size:%d, flush_policy:0x%02X)\r\n", fid, fifo_size, flush_policy);
+    register_file_param_t rparams = {
+        .bf.fid = fid ,
+        .bf.fifo_size = fifo_size,
+        .bf.flush_policy = flush_policy
+    };
+
+    d7a_fs_properties_t props;
+    // retrieve local properties
+    d7a_fs_get_properties(rparams.bf.fid,KAL_FS_PROP_ALL,&props);
+    if (props.type != HOST)
+    {
+        // create a remote Host file matching our local one
+        props.type = HOST;
+    }
+    else
+    {
+        // create a remote Real file matching our local Host-one
+        props.type = EEPROM;
+    }
+    d7a_fs_distant_create(rparams.bf.fid, &props);
+    d7a_modem_wait_ready();
+
+    // Distant file is ready, lets register a D7A Interface for it
+    d7a_modem_msg(WM_CMD_REGISTER_FILE,(uint8_t*)&rparams,sizeof(register_file_param_t));
+    d7a_modem_wait_ready();
+}
+
+void d7a_modem_notify_file(uint8_t fid, uint32_t offset, uint32_t length)
+{
+    FPRINT("(fid:%d, offset:%d, length:%d)\r\n", fid, offset, length);
+    notify_file_param_t nfp = {
+        .bf.fid = fid,
+        .bf.offset = offset,
+        .bf.size = length
+    };
+
+    d7a_modem_msg(WM_CMD_NOTIFY_FILE,(uint8_t*)&nfp,sizeof(notify_file_param_t));
+    d7a_modem_wait_ready();
+}
+
+void d7a_modem_thread(const void *p)
+{
+    FPRINT("\r\n");
+    d7a_com_rx_msg_t* pkt;
+    
+    while (true)
+    {
+        pkt = d7a_modem_wait_pkt();
+        ASSERT(pkt != NULL, "MODEM NULL pkt\r\n");
+
+        switch(pkt->id)
+        {
+            case KAL_COM_FLOW_CMD:
+                uint8_t cmd = pkt->buffer[0];
+                if (cmd == WM_CMD_READY)
+                {
+                    IPRINT("Modem ready\r\n");
+                    g_modem_ctx.ready->release();
+                }
+                else
+                {
+                    EPRINT("MODEM Unknown cmd %d\r\n", cmd);
+                }
+                break;
+            default:
+                EPRINT("MODEM Unknown Flow ID 0x%02X\r\n", pkt->id);
+                break;
+        }
+        
+        FREE(pkt);
+    }
+}