WizziCom Modem command handling library.

Committer:
Jeej
Date:
Tue May 09 13:47:00 2017 +0000
Revision:
0:e3f3d9ec19fb
WizziCom Modem command handling library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:e3f3d9ec19fb 1 #include "WizziComModem.h"
Jeej 0:e3f3d9ec19fb 2
Jeej 0:e3f3d9ec19fb 3 //======================================================================
Jeej 0:e3f3d9ec19fb 4 // MODEM commands over COM port
Jeej 0:e3f3d9ec19fb 5 //======================================================================
Jeej 0:e3f3d9ec19fb 6 typedef enum
Jeej 0:e3f3d9ec19fb 7 { //============================================
Jeej 0:e3f3d9ec19fb 8 // COMMANDS
Jeej 0:e3f3d9ec19fb 9 //============================================
Jeej 0:e3f3d9ec19fb 10 // Soft-reset Modem Device
Jeej 0:e3f3d9ec19fb 11 // ARGS: none
Jeej 0:e3f3d9ec19fb 12 WM_CMD_RST = 0x01,
Jeej 0:e3f3d9ec19fb 13
Jeej 0:e3f3d9ec19fb 14 // Start D7A communication stack
Jeej 0:e3f3d9ec19fb 15 // ARGS: none TODO: pass number of fifos ?
Jeej 0:e3f3d9ec19fb 16 WM_CMD_D7A_STACK_START = 0x02,
Jeej 0:e3f3d9ec19fb 17
Jeej 0:e3f3d9ec19fb 18 // Stop D7A communication stack
Jeej 0:e3f3d9ec19fb 19 // ARGS: none
Jeej 0:e3f3d9ec19fb 20 WM_CMD_D7A_STACK_STOP = 0x03,
Jeej 0:e3f3d9ec19fb 21
Jeej 0:e3f3d9ec19fb 22 // Register a File for notification
Jeej 0:e3f3d9ec19fb 23 // ARGS: register_file_param_t
Jeej 0:e3f3d9ec19fb 24 WM_CMD_REGISTER_FILE = 0x04,
Jeej 0:e3f3d9ec19fb 25
Jeej 0:e3f3d9ec19fb 26 // Notify a (previously registered) file
Jeej 0:e3f3d9ec19fb 27 // ARGS: notify_file_param_t
Jeej 0:e3f3d9ec19fb 28 WM_CMD_NOTIFY_FILE = 0x05,
Jeej 0:e3f3d9ec19fb 29
Jeej 0:e3f3d9ec19fb 30 // Command that will be instantly answered with WM_OK
Jeej 0:e3f3d9ec19fb 31 // ARGS: none
Jeej 0:e3f3d9ec19fb 32 WM_CMD_READY = 0x06,
Jeej 0:e3f3d9ec19fb 33
Jeej 0:e3f3d9ec19fb 34 //============================================
Jeej 0:e3f3d9ec19fb 35 // RESPONSES
Jeej 0:e3f3d9ec19fb 36 //============================================
Jeej 0:e3f3d9ec19fb 37 // Send by the Modem Device after a command has been executed/taken
Jeej 0:e3f3d9ec19fb 38 // into account, and the Modem is ready to handle a new command.
Jeej 0:e3f3d9ec19fb 39 // ARGS: none
Jeej 0:e3f3d9ec19fb 40 WM_OK = 0x80,
Jeej 0:e3f3d9ec19fb 41
Jeej 0:e3f3d9ec19fb 42 // Send by the Modem Device after a (re)boot.
Jeej 0:e3f3d9ec19fb 43 // ARGS: boot_status_t
Jeej 0:e3f3d9ec19fb 44 WM_BOOT = 0x81,
Jeej 0:e3f3d9ec19fb 45
Jeej 0:e3f3d9ec19fb 46 // Send by the Modem Device in case of failing command
Jeej 0:e3f3d9ec19fb 47 // ARGS: wm_error_code_t (u8)
Jeej 0:e3f3d9ec19fb 48 WM_ERROR = 0x82,
Jeej 0:e3f3d9ec19fb 49
Jeej 0:e3f3d9ec19fb 50 // Send by the Modem Device upon the end of a File notification.
Jeej 0:e3f3d9ec19fb 51 // This response is generated depending on ALP's Retry-Policy ('respond' field set)
Jeej 0:e3f3d9ec19fb 52 // ARGS: wm_notif_result_t
Jeej 0:e3f3d9ec19fb 53 WM_NOTIF_DONE = 0x83,
Jeej 0:e3f3d9ec19fb 54 } wm_cmd_t;
Jeej 0:e3f3d9ec19fb 55
Jeej 0:e3f3d9ec19fb 56
Jeej 0:e3f3d9ec19fb 57 WizziComModem::WizziComModem(WizziCom* com, PinName reset_pin) :
Jeej 0:e3f3d9ec19fb 58 _com(com),
Jeej 0:e3f3d9ec19fb 59 _reset_pin(reset_pin),
Jeej 0:e3f3d9ec19fb 60 _modem_ready(0)
Jeej 0:e3f3d9ec19fb 61 {
Jeej 0:e3f3d9ec19fb 62 _com->attach(this, &WizziComModem::_modem_command, WizziComPacketCmd);
Jeej 0:e3f3d9ec19fb 63 }
Jeej 0:e3f3d9ec19fb 64
Jeej 0:e3f3d9ec19fb 65 WizziComModem::~WizziComModem()
Jeej 0:e3f3d9ec19fb 66 {}
Jeej 0:e3f3d9ec19fb 67
Jeej 0:e3f3d9ec19fb 68 void WizziComModem::_modem_command(WizziCom* com, WizziComPacket_t* pkt)
Jeej 0:e3f3d9ec19fb 69 {
Jeej 0:e3f3d9ec19fb 70 uint8_t cmd = pkt->data[0];
Jeej 0:e3f3d9ec19fb 71
Jeej 0:e3f3d9ec19fb 72 if (cmd == WM_OK)
Jeej 0:e3f3d9ec19fb 73 {
Jeej 0:e3f3d9ec19fb 74 PRINT("Modem ready\r\n");
Jeej 0:e3f3d9ec19fb 75 _modem_ready.release();
Jeej 0:e3f3d9ec19fb 76 }
Jeej 0:e3f3d9ec19fb 77 else if (cmd == WM_BOOT)
Jeej 0:e3f3d9ec19fb 78 {
Jeej 0:e3f3d9ec19fb 79 boot_status_t* bs = (boot_status_t*)&(pkt->data[1]);
Jeej 0:e3f3d9ec19fb 80 if (_boot_callback)
Jeej 0:e3f3d9ec19fb 81 {
Jeej 0:e3f3d9ec19fb 82 _boot_callback.call(*bs);
Jeej 0:e3f3d9ec19fb 83 }
Jeej 0:e3f3d9ec19fb 84 //WARNING(false, "Modem booted CAUSE:%d NB_BOOT:%d\r\n", bs->bf.cause, bs->bf.nb_boot);
Jeej 0:e3f3d9ec19fb 85 }
Jeej 0:e3f3d9ec19fb 86 else if (cmd == WM_ERROR)
Jeej 0:e3f3d9ec19fb 87 {
Jeej 0:e3f3d9ec19fb 88 if (_error_callback)
Jeej 0:e3f3d9ec19fb 89 {
Jeej 0:e3f3d9ec19fb 90 _error_callback.call((int8_t)pkt->data[1]);
Jeej 0:e3f3d9ec19fb 91 }
Jeej 0:e3f3d9ec19fb 92 }
Jeej 0:e3f3d9ec19fb 93 else if (cmd == WM_NOTIF_DONE)
Jeej 0:e3f3d9ec19fb 94 {
Jeej 0:e3f3d9ec19fb 95 PRINT("Notif done fid %d err %d\r\n", pkt->data[1], pkt->data[2]);
Jeej 0:e3f3d9ec19fb 96 }
Jeej 0:e3f3d9ec19fb 97 else
Jeej 0:e3f3d9ec19fb 98 {
Jeej 0:e3f3d9ec19fb 99 EPRINT("MODEM Unknown cmd %d\r\n", cmd);
Jeej 0:e3f3d9ec19fb 100 }
Jeej 0:e3f3d9ec19fb 101
Jeej 0:e3f3d9ec19fb 102 FREE(pkt);
Jeej 0:e3f3d9ec19fb 103 }
Jeej 0:e3f3d9ec19fb 104
Jeej 0:e3f3d9ec19fb 105 void WizziComModem::start_dash7(void)
Jeej 0:e3f3d9ec19fb 106 {
Jeej 0:e3f3d9ec19fb 107 uint8_t cmd[] = { WM_CMD_D7A_STACK_START };
Jeej 0:e3f3d9ec19fb 108 _com->send(WizziComPacketCmd, sizeof(cmd), cmd);
Jeej 0:e3f3d9ec19fb 109 _modem_ready.wait();
Jeej 0:e3f3d9ec19fb 110 }
Jeej 0:e3f3d9ec19fb 111
Jeej 0:e3f3d9ec19fb 112 void WizziComModem::stop_dash7(void)
Jeej 0:e3f3d9ec19fb 113 {
Jeej 0:e3f3d9ec19fb 114 uint8_t cmd[] = { WM_CMD_D7A_STACK_STOP };
Jeej 0:e3f3d9ec19fb 115 _com->send(WizziComPacketCmd, sizeof(cmd), cmd);
Jeej 0:e3f3d9ec19fb 116 _modem_ready.wait();
Jeej 0:e3f3d9ec19fb 117 }
Jeej 0:e3f3d9ec19fb 118
Jeej 0:e3f3d9ec19fb 119 void WizziComModem::software_reset(void)
Jeej 0:e3f3d9ec19fb 120 {
Jeej 0:e3f3d9ec19fb 121 uint8_t cmd[] = { WM_CMD_RST };
Jeej 0:e3f3d9ec19fb 122 _com->send(WizziComPacketCmd, sizeof(cmd), cmd);
Jeej 0:e3f3d9ec19fb 123 _modem_ready.wait();
Jeej 0:e3f3d9ec19fb 124 }
Jeej 0:e3f3d9ec19fb 125
Jeej 0:e3f3d9ec19fb 126 void WizziComModem::hardware_reset(void)
Jeej 0:e3f3d9ec19fb 127 {
Jeej 0:e3f3d9ec19fb 128 DigitalOut reset_low(_reset_pin, 0);
Jeej 0:e3f3d9ec19fb 129 Thread::wait(100);
Jeej 0:e3f3d9ec19fb 130 DigitalIn reset_release(_reset_pin);
Jeej 0:e3f3d9ec19fb 131 _modem_ready.wait();
Jeej 0:e3f3d9ec19fb 132 }
Jeej 0:e3f3d9ec19fb 133
Jeej 0:e3f3d9ec19fb 134 void WizziComModem::attach_boot(WizziComModemBootCallback function)
Jeej 0:e3f3d9ec19fb 135 {
Jeej 0:e3f3d9ec19fb 136 _boot_callback = callback(function);
Jeej 0:e3f3d9ec19fb 137 }
Jeej 0:e3f3d9ec19fb 138
Jeej 0:e3f3d9ec19fb 139 void WizziComModem::attach_error(WizziComModemErrorCallback function)
Jeej 0:e3f3d9ec19fb 140 {
Jeej 0:e3f3d9ec19fb 141 _error_callback = callback(function);
Jeej 0:e3f3d9ec19fb 142 }