Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Revision:
30:d775c1409849
Parent:
29:8e7c5c1e9aab
Child:
31:ab9bfdbc6b44
diff -r 8e7c5c1e9aab -r d775c1409849 src/d7a_modem.cpp
--- a/src/d7a_modem.cpp	Tue May 03 16:53:52 2016 +0000
+++ b/src/d7a_modem.cpp	Wed May 25 08:23:15 2016 +0000
@@ -15,7 +15,7 @@
     Queue<d7a_com_rx_msg_t, 16> pkt_queue;
     int8_t status;
     DigitalInOut* reset;
-    uint8_t waiting_count;
+    int16_t waiting_count;
     uint8_t ready_count;
 } d7a_modem_ctx_t;
 
@@ -28,41 +28,56 @@
     FPRINT("\r\n");
     
     g_modem_ctx.ressource = new Semaphore(1);
-    g_modem_ctx.thread = new Thread(d7a_modem_thread, NULL, osPriorityBelowNormal, DEFAULT_STACK_SIZE*2);
-    g_modem_ctx.reset = new DigitalInOut(reset_pin, PIN_OUTPUT, OpenDrain, 0);
+    g_modem_ctx.thread = new Thread(d7a_modem_thread, NULL, osPriorityBelowNormal, DEFAULT_STACK_SIZE);
     g_modem_ctx.waiting_count = 0;
     g_modem_ctx.ready_count = 0;
     
+    if (reset_pin == NC)
+    {
+        g_modem_ctx.reset = NULL;
+    }
+    else
+    {
+        g_modem_ctx.reset = new DigitalInOut(reset_pin, PIN_OUTPUT, OpenDrain, 0);
+    }
+    
     Thread::wait(10);
     
-    // Release reset pin
-    *(g_modem_ctx.reset) = 1;
+    d7a_modem_reset();
     
     // Wait for modem ready
-    
-    //Thread::wait(100);
-    //ASSERT(d7a_sys_ping_modem(), "MODEM BOOT Timeout\r\n");
-    
-    osEvent evt = g_modem_ctx.boot.get(1000);
+    osEvent evt = g_modem_ctx.boot.get(5000);
     ASSERT(evt.status == osEventMessage, "MODEM BOOT Timeout\r\n");
+    IPRINT("MODEM Boot OK.\r\n");
+    ASSERT(d7a_modem_wait_ready(2000), "MODEM READY Timeout\r\n");
+    IPRINT("MODEM Ready.\r\n");
 }
 
-
-int32_t d7a_modem_wait_ready( uint32_t millisec )
+void d7a_modem_reset( void )
 {
-    FPRINT("(%d)\r\n", ++g_modem_ctx.waiting_count);
-    int32_t ret;
-    osEvent evt = g_modem_ctx.ready.get(millisec);
-    if (evt.status == osEventMessage)
+    if (g_modem_ctx.reset == NULL)
     {
-        ret = (int32_t)evt.value.p;
+        // Try software reset
+        d7a_sys_software_reset();
     }
     else
     {
-        ret = (int32_t)0xFFFFFFFF;
-        EPRINT("MODEM Wait Timeout!\r\n");
+        // Use hardware reset
+        // Assert reset pin
+        *(g_modem_ctx.reset) = 0;
+        Thread::wait(10);
+        // Release reset pin
+        *(g_modem_ctx.reset) = 1;
+        Thread::wait(10);
     }
-    return ret;
+}
+
+bool d7a_modem_wait_ready( uint32_t millisec )
+{
+    g_modem_ctx.waiting_count++;
+    FPRINT("(%d)\r\n", g_modem_ctx.waiting_count);
+    osEvent evt = g_modem_ctx.ready.get(millisec);
+    return (evt.status == osEventMessage)? true: false;
 }
 
 void d7a_modem_new_pkt(d7a_com_rx_msg_t* pkt)
@@ -73,12 +88,12 @@
 
 d7a_com_rx_msg_t* d7a_modem_wait_pkt( uint32_t millisec )
 {
-    FPRINT("\r\n");
+    FPRINT("(millisec:%d)\r\n", millisec);
     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)
+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;
@@ -91,22 +106,23 @@
     d7a_com_send_msg(&msg);
 }
 
-void d7a_modem_register_file(uint8_t fid, uint8_t fifo_size, uint8_t flush_policy)
+bool d7a_modem_register_file(uint8_t fid, uint8_t retry_policy)
 {
     g_modem_ctx.ressource->wait();
     
-    FPRINT("(fid:%d, fifo_size:%d, flush_policy:0x%02X)\r\n", fid, fifo_size, flush_policy);
+    bool ret = true;
+    
+    FPRINT("(fid:%d, retry_policy:0x%02X)\r\n", fid, retry_policy);
     register_file_param_t rparams = {
         .bf.fid = fid ,
-        .bf.fifo_size = fifo_size,
-        .bf.flush_policy = flush_policy
+        .bf.retry_policy = retry_policy
     };
 
     // Check If modem already has it
-    DPRINT("Register: %d\n", rparams.bf.fid);
+    DPRINT("Register: %d\r\n", rparams.bf.fid);
     d7a_fs_distant_stat(rparams.bf.fid, NULL);
     g_modem_ctx.status = (int32_t)d7a_fs_wait_done(TO_FS);
-    if(g_modem_ctx.status < 0)
+    if (g_modem_ctx.status < 0)
     {
         d7a_fs_properties_t props;
         // retrieve local properties
@@ -117,14 +133,21 @@
         g_modem_ctx.status = (int32_t)d7a_fs_wait_done(TO_FS);
     }
     
-    if(g_modem_ctx.status == 0)
+    if (g_modem_ctx.status == 0)
     {
         // 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();
+        ret = d7a_modem_wait_ready(TO_FS);
+    }
+    else
+    {
+        ret = false;
     }
     
+    DPRINT("Register done.\r\n");
     g_modem_ctx.ressource->release();
+    
+    return ret;
 }
 
 void d7a_modem_notify_file(uint8_t fid, uint32_t offset, uint32_t length)
@@ -132,6 +155,8 @@
     g_modem_ctx.ressource->wait();
     
     FPRINT("(fid:%d, offset:%d, length:%d)\r\n", fid, offset, length);
+    DPRINT("Notify %d.\r\n", fid);
+    
     notify_file_param_t nfp = {
         .bf.fid = fid,
         .bf.offset = offset,
@@ -139,23 +164,26 @@
     };
 
     d7a_modem_msg(WM_CMD_NOTIFY_FILE,(uint8_t*)&nfp,sizeof(notify_file_param_t));
-    WARNING(d7a_modem_wait_ready(1000) != 0xFFFFFFFF, "Notification Timeout\r\n");
+    WARNING(d7a_modem_wait_ready(TO_FS), "Notification Timeout on FID:%d\r\n", fid);
     
-    //Thread::wait(100); // XXX: To avoid concurrent file access
+    Thread::wait(100); // XXX: To avoid lost packets
     
+    DPRINT("Notify %d done.\r\n", fid);
     g_modem_ctx.ressource->release();
 }
 
-void d7a_modem_infos( void )
+void d7a_modem_print_infos( void )
 {
     uint8_t uid[8];
     revision_t rev;
     
+    g_modem_ctx.ressource->wait();
+    
     d7a_fs_read(0, uid, 0, 8);
-    d7a_fs_wait_done();
+    d7a_fs_wait_done(TO_FS);
     
     d7a_fs_read(2, &rev, 0, sizeof(revision_t));
-    d7a_fs_wait_done();
+    d7a_fs_wait_done(TO_FS);
     
     IPRINT("--- D7A Modem infos ---\r\n");
     IPRINT("UID: %02X%02X%02X%02X%02X%02X%02X%02X\r\n", uid[0], uid[1], uid[2], uid[3], uid[4], uid[5], uid[6], uid[7]);
@@ -164,7 +192,9 @@
     IPRINT("Hardware version: %08X\r\n", rev.hw_version);
     IPRINT("Firmware version: %d-%d.%d.%d-%08x\r\n", rev.fw_version.id, rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch, rev.fw_version.hash);
     IPRINT("File system CRC:  0x%08x\r\n", rev.fs_crc);
-    IPRINT("-----------------------\r\n");   
+    IPRINT("-----------------------\r\n");  
+    
+    g_modem_ctx.ressource->release();
 }
 
 
@@ -184,7 +214,8 @@
                 uint8_t cmd = pkt->buffer[0];
                 if (cmd == WM_CMD_READY)
                 {
-                    FPRINT("(Modem ready (%d))\r\n", --g_modem_ctx.waiting_count);
+                    g_modem_ctx.waiting_count--;
+                    DPRINT("Modem ready (%d)\r\n", g_modem_ctx.waiting_count);
                     g_modem_ctx.ready.put(NULL);
                 }
                 else if (cmd == WM_CMD_BOOT)