WizziCom Modem command handling library.
WizziComModem.cpp@0:e3f3d9ec19fb, 2017-05-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |