WizziCom Modem command handling library.

Revision:
0:e3f3d9ec19fb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizziComModem.cpp	Tue May 09 13:47:00 2017 +0000
@@ -0,0 +1,142 @@
+#include "WizziComModem.h"
+
+//======================================================================
+// MODEM commands over COM port
+//======================================================================
+typedef enum
+{    //============================================
+    // COMMANDS
+    //============================================
+    // Soft-reset Modem Device
+    // ARGS: none
+    WM_CMD_RST                      = 0x01,
+
+    // Start D7A communication stack
+    // ARGS: none TODO: pass number of fifos ?
+    WM_CMD_D7A_STACK_START          = 0x02,
+
+    // Stop D7A communication stack
+    // ARGS: none
+    WM_CMD_D7A_STACK_STOP           = 0x03,
+
+    // Register a File for notification
+    // ARGS: register_file_param_t
+    WM_CMD_REGISTER_FILE            = 0x04,
+
+    // Notify a (previously registered) file
+    // ARGS: notify_file_param_t
+    WM_CMD_NOTIFY_FILE              = 0x05,
+
+    // Command that will be instantly answered with WM_OK
+    // ARGS: none
+    WM_CMD_READY                    = 0x06,
+
+    //============================================
+    // RESPONSES
+    //============================================
+    // Send by the Modem Device after a command has been executed/taken
+    // into account, and the Modem is ready to handle a new command.
+    // ARGS: none
+    WM_OK                           = 0x80,
+
+    // Send by the Modem Device after a (re)boot.
+    // ARGS: boot_status_t
+    WM_BOOT                         = 0x81,
+
+    // Send by the Modem Device in case of failing command
+    // ARGS: wm_error_code_t (u8)
+    WM_ERROR                        = 0x82,
+
+    // Send by the Modem Device upon the end of a File notification.
+    // This response is generated depending on ALP's Retry-Policy ('respond' field set)
+    // ARGS: wm_notif_result_t
+    WM_NOTIF_DONE                   = 0x83,
+} wm_cmd_t;
+
+
+WizziComModem::WizziComModem(WizziCom* com, PinName reset_pin) :
+_com(com),
+_reset_pin(reset_pin),
+_modem_ready(0)
+{
+    _com->attach(this, &WizziComModem::_modem_command, WizziComPacketCmd);
+}
+
+WizziComModem::~WizziComModem()
+{}
+
+void WizziComModem::_modem_command(WizziCom* com, WizziComPacket_t* pkt)
+{
+    uint8_t cmd = pkt->data[0];
+    
+    if (cmd == WM_OK)
+    {
+        PRINT("Modem ready\r\n");
+        _modem_ready.release();
+    }
+    else if (cmd == WM_BOOT)
+    {
+        boot_status_t* bs = (boot_status_t*)&(pkt->data[1]);
+        if (_boot_callback)
+        {
+            _boot_callback.call(*bs);
+        }
+        //WARNING(false, "Modem booted CAUSE:%d NB_BOOT:%d\r\n", bs->bf.cause, bs->bf.nb_boot);
+    }
+    else if (cmd == WM_ERROR)
+    {
+        if (_error_callback)
+        {
+            _error_callback.call((int8_t)pkt->data[1]);
+        }
+    }
+    else if (cmd == WM_NOTIF_DONE)
+    {
+        PRINT("Notif done fid %d err %d\r\n", pkt->data[1], pkt->data[2]);
+    }
+    else
+    {
+        EPRINT("MODEM Unknown cmd %d\r\n", cmd);
+    }
+    
+    FREE(pkt);
+}
+
+void WizziComModem::start_dash7(void)
+{
+    uint8_t cmd[] = { WM_CMD_D7A_STACK_START };
+    _com->send(WizziComPacketCmd, sizeof(cmd), cmd);
+    _modem_ready.wait();
+}
+
+void WizziComModem::stop_dash7(void)
+{
+    uint8_t cmd[] = { WM_CMD_D7A_STACK_STOP };
+    _com->send(WizziComPacketCmd, sizeof(cmd), cmd);
+    _modem_ready.wait();
+}
+
+void WizziComModem::software_reset(void)
+{
+    uint8_t cmd[] = { WM_CMD_RST };
+    _com->send(WizziComPacketCmd, sizeof(cmd), cmd);
+    _modem_ready.wait();
+}
+
+void WizziComModem::hardware_reset(void)
+{
+    DigitalOut reset_low(_reset_pin, 0);
+    Thread::wait(100);
+    DigitalIn reset_release(_reset_pin);
+    _modem_ready.wait();
+}
+
+void WizziComModem::attach_boot(WizziComModemBootCallback function)
+{
+    _boot_callback = callback(function);
+}
+
+void WizziComModem::attach_error(WizziComModemErrorCallback function)
+{
+    _error_callback = callback(function);
+}
\ No newline at end of file