ublox-cellular-driver-gen Fork
Fork of ublox-cellular-driver-gen by
UbloxCellularDriverGen.h@5:b935404dcf7c, 2017-06-15 (annotated)
- Committer:
- rob.meades@u-blox.com
- Date:
- Thu Jun 15 01:14:18 2017 +0100
- Revision:
- 5:b935404dcf7c
- Parent:
- 3:027c9eaec52c
Tests now pass on C027: cope with filenames being returned without quotation marks, reduce file size to write since some modules can't keep up when there's no HW flow control, increase USSD timeout, simplify JSON template and run test without debug.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RobMeades | 0:bb5fabac67ab | 1 | /* Copyright (c) 2017 ARM Limited |
RobMeades | 0:bb5fabac67ab | 2 | * |
RobMeades | 0:bb5fabac67ab | 3 | * Licensed under the Apache License, Version 2.0 (the "License"); |
RobMeades | 0:bb5fabac67ab | 4 | * you may not use this file except in compliance with the License. |
RobMeades | 0:bb5fabac67ab | 5 | * You may obtain a copy of the License at |
RobMeades | 0:bb5fabac67ab | 6 | * |
RobMeades | 0:bb5fabac67ab | 7 | * http://www.apache.org/licenses/LICENSE-2.0 |
RobMeades | 0:bb5fabac67ab | 8 | * |
RobMeades | 0:bb5fabac67ab | 9 | * Unless required by applicable law or agreed to in writing, software |
RobMeades | 0:bb5fabac67ab | 10 | * distributed under the License is distributed on an "AS IS" BASIS, |
RobMeades | 0:bb5fabac67ab | 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
RobMeades | 0:bb5fabac67ab | 12 | * See the License for the specific language governing permissions and |
RobMeades | 0:bb5fabac67ab | 13 | * limitations under the License. |
RobMeades | 0:bb5fabac67ab | 14 | */ |
RobMeades | 0:bb5fabac67ab | 15 | |
RobMeades | 0:bb5fabac67ab | 16 | #ifndef _UBLOX_CELLULAR_DRIVER_GEN_ |
RobMeades | 0:bb5fabac67ab | 17 | #define _UBLOX_CELLULAR_DRIVER_GEN_ |
RobMeades | 0:bb5fabac67ab | 18 | |
rob.meades@u-blox.com | 3:027c9eaec52c | 19 | #include "UbloxCellularBase.h" |
RobMeades | 0:bb5fabac67ab | 20 | |
RobMeades | 0:bb5fabac67ab | 21 | /** UbloxCellularDriverGen class |
RobMeades | 0:bb5fabac67ab | 22 | * This interface provide SMS, USSD and |
RobMeades | 0:bb5fabac67ab | 23 | * module File System functionality. |
RobMeades | 0:bb5fabac67ab | 24 | */ |
RobMeades | 0:bb5fabac67ab | 25 | class UbloxCellularDriverGen: virtual public UbloxCellularBase { |
RobMeades | 0:bb5fabac67ab | 26 | |
RobMeades | 0:bb5fabac67ab | 27 | public: |
RobMeades | 0:bb5fabac67ab | 28 | /** Constructor. |
RobMeades | 0:bb5fabac67ab | 29 | * |
RobMeades | 0:bb5fabac67ab | 30 | * @param tx the UART TX data pin to which the modem is attached. |
RobMeades | 0:bb5fabac67ab | 31 | * @param rx the UART RX data pin to which the modem is attached. |
RobMeades | 0:bb5fabac67ab | 32 | * @param baud the UART baud rate. |
RobMeades | 0:bb5fabac67ab | 33 | * @param debugOn true to switch AT interface debug on, otherwise false. |
RobMeades | 0:bb5fabac67ab | 34 | */ |
RobMeades | 0:bb5fabac67ab | 35 | UbloxCellularDriverGen(PinName tx = MDMTXD, PinName rx = MDMRXD, |
RobMeades | 0:bb5fabac67ab | 36 | int baud = MBED_CONF_UBLOX_CELL_BAUD_RATE, |
RobMeades | 0:bb5fabac67ab | 37 | bool debugOn = false); |
RobMeades | 0:bb5fabac67ab | 38 | |
RobMeades | 0:bb5fabac67ab | 39 | /* Destructor. |
RobMeades | 0:bb5fabac67ab | 40 | */ |
RobMeades | 0:bb5fabac67ab | 41 | ~UbloxCellularDriverGen(); |
RobMeades | 0:bb5fabac67ab | 42 | |
RobMeades | 0:bb5fabac67ab | 43 | /********************************************************************** |
RobMeades | 0:bb5fabac67ab | 44 | * PUBLIC: Short Message Service |
RobMeades | 0:bb5fabac67ab | 45 | **********************************************************************/ |
RobMeades | 0:bb5fabac67ab | 46 | |
RobMeades | 0:bb5fabac67ab | 47 | /** The size of an SMS storage buffer, including null terminator. |
RobMeades | 0:bb5fabac67ab | 48 | */ |
RobMeades | 0:bb5fabac67ab | 49 | #define SMS_BUFFER_SIZE 145 |
RobMeades | 0:bb5fabac67ab | 50 | |
RobMeades | 0:bb5fabac67ab | 51 | /** Count the number of messages in the device and optionally return a |
RobMeades | 0:bb5fabac67ab | 52 | * list with indexes from the storage locations in the device. |
RobMeades | 0:bb5fabac67ab | 53 | * |
RobMeades | 0:bb5fabac67ab | 54 | * Note: init() should be called before this method can be used. |
RobMeades | 0:bb5fabac67ab | 55 | * |
RobMeades | 0:bb5fabac67ab | 56 | * @param stat what type of messages you can use: |
RobMeades | 0:bb5fabac67ab | 57 | * "REC UNREAD", "REC READ", "STO UNSENT", "STO SENT", "ALL". |
RobMeades | 0:bb5fabac67ab | 58 | * @param index list where to save the storage positions (pointer |
RobMeades | 0:bb5fabac67ab | 59 | * to an array of ints). |
RobMeades | 0:bb5fabac67ab | 60 | * @param num number of elements that can be stored in the list. |
RobMeades | 0:bb5fabac67ab | 61 | * @return the number of messages, this can be bigger than num, |
RobMeades | 0:bb5fabac67ab | 62 | * -1 on failure. |
RobMeades | 0:bb5fabac67ab | 63 | */ |
RobMeades | 0:bb5fabac67ab | 64 | int smsList(const char* stat = "ALL", int* index = NULL, int num = 0); |
RobMeades | 0:bb5fabac67ab | 65 | |
RobMeades | 0:bb5fabac67ab | 66 | /** Read a message from a storage position. |
RobMeades | 0:bb5fabac67ab | 67 | * |
RobMeades | 0:bb5fabac67ab | 68 | * Note: init() should be called before this method can be used. |
RobMeades | 0:bb5fabac67ab | 69 | * |
RobMeades | 0:bb5fabac67ab | 70 | * @param index the storage position to read. |
RobMeades | 0:bb5fabac67ab | 71 | * @param num the originator address (16 chars including terminator). |
RobMeades | 0:bb5fabac67ab | 72 | * @param buf a buffer where to save the short message. |
RobMeades | 0:bb5fabac67ab | 73 | * @param len the length of buf. |
RobMeades | 0:bb5fabac67ab | 74 | * @return true if successful, false otherwise. |
RobMeades | 0:bb5fabac67ab | 75 | */ |
RobMeades | 0:bb5fabac67ab | 76 | bool smsRead(int index, char* num, char* buf, int len); |
RobMeades | 0:bb5fabac67ab | 77 | |
RobMeades | 0:bb5fabac67ab | 78 | /** Delete a message. |
RobMeades | 0:bb5fabac67ab | 79 | * |
RobMeades | 0:bb5fabac67ab | 80 | * Note: init() should be called before this method can be used. |
RobMeades | 0:bb5fabac67ab | 81 | * |
RobMeades | 0:bb5fabac67ab | 82 | * @param index the storage position to delete. |
RobMeades | 0:bb5fabac67ab | 83 | * @return true if successful, false otherwise. |
RobMeades | 0:bb5fabac67ab | 84 | */ |
RobMeades | 0:bb5fabac67ab | 85 | bool smsDelete(int index); |
RobMeades | 0:bb5fabac67ab | 86 | |
RobMeades | 0:bb5fabac67ab | 87 | /** Send a message to a recipient. |
RobMeades | 0:bb5fabac67ab | 88 | * |
RobMeades | 0:bb5fabac67ab | 89 | * Note: init() and nwk_registration() should be called before |
RobMeades | 0:bb5fabac67ab | 90 | * this method can be used. |
RobMeades | 0:bb5fabac67ab | 91 | * |
RobMeades | 0:bb5fabac67ab | 92 | * @param num the phone number of the recipient as a null terminated |
RobMeades | 0:bb5fabac67ab | 93 | * string. Note: no spaces are allowed in this string. |
RobMeades | 0:bb5fabac67ab | 94 | * @param buf the content of the message to sent, null terminated. |
RobMeades | 0:bb5fabac67ab | 95 | * @return true if successful, false otherwise. |
RobMeades | 0:bb5fabac67ab | 96 | */ |
RobMeades | 0:bb5fabac67ab | 97 | bool smsSend(const char* num, const char* buf); |
RobMeades | 0:bb5fabac67ab | 98 | |
RobMeades | 0:bb5fabac67ab | 99 | /********************************************************************** |
RobMeades | 0:bb5fabac67ab | 100 | * PUBLIC: Unstructured Supplementary Service Data |
RobMeades | 0:bb5fabac67ab | 101 | **********************************************************************/ |
RobMeades | 0:bb5fabac67ab | 102 | |
RobMeades | 0:bb5fabac67ab | 103 | /** The maximum size of a USSD string (not including terminator). |
RobMeades | 0:bb5fabac67ab | 104 | */ |
RobMeades | 0:bb5fabac67ab | 105 | #define USSD_STRING_LENGTH 128 |
RobMeades | 0:bb5fabac67ab | 106 | |
RobMeades | 0:bb5fabac67ab | 107 | /** Make a USSD query. |
RobMeades | 0:bb5fabac67ab | 108 | * |
RobMeades | 0:bb5fabac67ab | 109 | * Note: init() should be called before using this method can be |
RobMeades | 0:bb5fabac67ab | 110 | * used and, in many cases, nwk_registration() is also required as |
RobMeades | 0:bb5fabac67ab | 111 | * the USSD may need network access. |
RobMeades | 0:bb5fabac67ab | 112 | * |
RobMeades | 0:bb5fabac67ab | 113 | * Note: some USSD commands relate to call waiting, call forwarding, |
RobMeades | 0:bb5fabac67ab | 114 | * etc., which can result in multiple responses. This function returns |
RobMeades | 0:bb5fabac67ab | 115 | * only the first response. Instantiate this class with debugOn set to |
RobMeades | 0:bb5fabac67ab | 116 | * true to get a better view of what is really going on. If such |
RobMeades | 0:bb5fabac67ab | 117 | * responses are important to you, you should subclass this class and |
RobMeades | 0:bb5fabac67ab | 118 | * parse for them specifically and, probably, use specific AT commands |
RobMeades | 0:bb5fabac67ab | 119 | * rather than USSD. |
RobMeades | 0:bb5fabac67ab | 120 | * |
RobMeades | 0:bb5fabac67ab | 121 | * @param cmd the USSD string to send e.g "*#100#". |
RobMeades | 0:bb5fabac67ab | 122 | * @param buf a buffer where to save the reply, which |
RobMeades | 0:bb5fabac67ab | 123 | * will always be returned zero terminated. |
RobMeades | 0:bb5fabac67ab | 124 | * @param len the length of buf, set to USSD_STRING_LENGTH + 1 to |
RobMeades | 0:bb5fabac67ab | 125 | * obtain the maximum length response plus terminator. |
RobMeades | 0:bb5fabac67ab | 126 | * @return true if successful, false otherwise. |
RobMeades | 0:bb5fabac67ab | 127 | */ |
RobMeades | 0:bb5fabac67ab | 128 | bool ussdCommand(const char* cmd, char* buf, int len); |
RobMeades | 0:bb5fabac67ab | 129 | |
RobMeades | 0:bb5fabac67ab | 130 | /********************************************************************** |
RobMeades | 0:bb5fabac67ab | 131 | * PUBLIC: Module File System |
RobMeades | 0:bb5fabac67ab | 132 | **********************************************************************/ |
RobMeades | 0:bb5fabac67ab | 133 | |
RobMeades | 0:bb5fabac67ab | 134 | /** Delete a file from the module's local file system. An attempt |
RobMeades | 0:bb5fabac67ab | 135 | * to delete a non-existent file will fail. |
RobMeades | 0:bb5fabac67ab | 136 | * |
RobMeades | 0:bb5fabac67ab | 137 | * Note: init() should be called before this method can be used. |
RobMeades | 0:bb5fabac67ab | 138 | * |
RobMeades | 0:bb5fabac67ab | 139 | * @param filename the name of the file. |
RobMeades | 0:bb5fabac67ab | 140 | * @return true if successful, false otherwise. |
RobMeades | 0:bb5fabac67ab | 141 | */ |
RobMeades | 0:bb5fabac67ab | 142 | bool delFile(const char* filename); |
RobMeades | 0:bb5fabac67ab | 143 | |
RobMeades | 0:bb5fabac67ab | 144 | /** Write some data to a file in the module's local file system. |
RobMeades | 0:bb5fabac67ab | 145 | * |
RobMeades | 0:bb5fabac67ab | 146 | * Note: init() should be called before this method can be used. |
RobMeades | 0:bb5fabac67ab | 147 | * |
RobMeades | 0:bb5fabac67ab | 148 | * @param filename the name of the file. |
RobMeades | 0:bb5fabac67ab | 149 | * @param buf the data to write. |
RobMeades | 0:bb5fabac67ab | 150 | * @param len the size of the data to write. |
RobMeades | 0:bb5fabac67ab | 151 | * @return the number of bytes written. |
RobMeades | 0:bb5fabac67ab | 152 | */ |
RobMeades | 0:bb5fabac67ab | 153 | int writeFile(const char* filename, const char* buf, int len); |
RobMeades | 0:bb5fabac67ab | 154 | |
RobMeades | 0:bb5fabac67ab | 155 | /** Read a file from the module's local file system. |
RobMeades | 0:bb5fabac67ab | 156 | * |
RobMeades | 0:bb5fabac67ab | 157 | * Note: init() should be called before this method can be used. |
RobMeades | 0:bb5fabac67ab | 158 | * |
RobMeades | 0:bb5fabac67ab | 159 | * @param filename the name of the file |
RobMeades | 0:bb5fabac67ab | 160 | * @param buf a buffer to hold the data |
RobMeades | 0:bb5fabac67ab | 161 | * @param len the size to read |
RobMeades | 0:bb5fabac67ab | 162 | * @return the number of bytes read |
RobMeades | 0:bb5fabac67ab | 163 | */ |
RobMeades | 0:bb5fabac67ab | 164 | int readFile(const char* filename, char* buf, int len); |
RobMeades | 0:bb5fabac67ab | 165 | |
RobMeades | 0:bb5fabac67ab | 166 | /** Retrieve the file size from the module's local file system. |
RobMeades | 0:bb5fabac67ab | 167 | * |
RobMeades | 0:bb5fabac67ab | 168 | * Note: init() should be called before this method can be used. |
RobMeades | 0:bb5fabac67ab | 169 | * |
RobMeades | 0:bb5fabac67ab | 170 | * @param filename the name of the file. |
RobMeades | 0:bb5fabac67ab | 171 | * @return the file size in bytes. |
RobMeades | 0:bb5fabac67ab | 172 | */ |
RobMeades | 0:bb5fabac67ab | 173 | int fileSize(const char* filename); |
RobMeades | 0:bb5fabac67ab | 174 | |
RobMeades | 0:bb5fabac67ab | 175 | protected: |
RobMeades | 0:bb5fabac67ab | 176 | |
RobMeades | 0:bb5fabac67ab | 177 | /********************************************************************** |
RobMeades | 0:bb5fabac67ab | 178 | * PROTECTED: Short Message Service |
RobMeades | 0:bb5fabac67ab | 179 | **********************************************************************/ |
RobMeades | 0:bb5fabac67ab | 180 | |
RobMeades | 0:bb5fabac67ab | 181 | /** The number type for telephone numbers without a + on the front |
RobMeades | 0:bb5fabac67ab | 182 | */ |
RobMeades | 0:bb5fabac67ab | 183 | #define TYPE_OF_ADDRESS_NATIONAL 129 |
RobMeades | 0:bb5fabac67ab | 184 | |
RobMeades | 0:bb5fabac67ab | 185 | /** The number type for telephone numbers with a + on the front |
RobMeades | 0:bb5fabac67ab | 186 | */ |
RobMeades | 0:bb5fabac67ab | 187 | #define TYPE_OF_ADDRESS_INTERNATIONAL 145 |
RobMeades | 0:bb5fabac67ab | 188 | |
RobMeades | 0:bb5fabac67ab | 189 | /** Convert a #define to a string |
RobMeades | 0:bb5fabac67ab | 190 | */ |
RobMeades | 0:bb5fabac67ab | 191 | #define stringify(a) str(a) |
RobMeades | 0:bb5fabac67ab | 192 | #define str(a) #a |
RobMeades | 0:bb5fabac67ab | 193 | |
RobMeades | 0:bb5fabac67ab | 194 | /** Place to store the index of an SMS message. |
RobMeades | 0:bb5fabac67ab | 195 | */ |
RobMeades | 0:bb5fabac67ab | 196 | int *_userSmsIndex; |
RobMeades | 0:bb5fabac67ab | 197 | |
RobMeades | 0:bb5fabac67ab | 198 | /** The number of SMS message being returned to the user. |
RobMeades | 0:bb5fabac67ab | 199 | */ |
RobMeades | 0:bb5fabac67ab | 200 | int _userSmsNum; |
RobMeades | 0:bb5fabac67ab | 201 | |
RobMeades | 0:bb5fabac67ab | 202 | /** The number of SMS messages stored in the module. |
RobMeades | 0:bb5fabac67ab | 203 | */ |
RobMeades | 0:bb5fabac67ab | 204 | int _smsCount; |
RobMeades | 0:bb5fabac67ab | 205 | |
RobMeades | 0:bb5fabac67ab | 206 | /** Temporary storage for an SMS message. |
RobMeades | 0:bb5fabac67ab | 207 | */ |
RobMeades | 0:bb5fabac67ab | 208 | char _smsBuf[SMS_BUFFER_SIZE]; |
RobMeades | 0:bb5fabac67ab | 209 | |
RobMeades | 0:bb5fabac67ab | 210 | /** URC for Short Message listing. |
RobMeades | 0:bb5fabac67ab | 211 | */ |
RobMeades | 0:bb5fabac67ab | 212 | void CMGL_URC(); |
RobMeades | 0:bb5fabac67ab | 213 | |
RobMeades | 0:bb5fabac67ab | 214 | /** URC for new SMS messages. |
RobMeades | 0:bb5fabac67ab | 215 | */ |
RobMeades | 0:bb5fabac67ab | 216 | void CMTI_URC(); |
RobMeades | 0:bb5fabac67ab | 217 | |
RobMeades | 0:bb5fabac67ab | 218 | /********************************************************************** |
RobMeades | 0:bb5fabac67ab | 219 | * PROTECTED: Unstructured Supplementary Service Data |
RobMeades | 0:bb5fabac67ab | 220 | **********************************************************************/ |
RobMeades | 0:bb5fabac67ab | 221 | |
RobMeades | 0:bb5fabac67ab | 222 | /** A buffer for the string assembled from the URC. |
RobMeades | 0:bb5fabac67ab | 223 | */ |
RobMeades | 0:bb5fabac67ab | 224 | char * _ssUrcBuf; |
RobMeades | 0:bb5fabac67ab | 225 | |
rob.meades@u-blox.com | 5:b935404dcf7c | 226 | /** URC for USSD. |
rob.meades@u-blox.com | 5:b935404dcf7c | 227 | */ |
rob.meades@u-blox.com | 5:b935404dcf7c | 228 | void CUSD_URC(); |
rob.meades@u-blox.com | 5:b935404dcf7c | 229 | |
RobMeades | 0:bb5fabac67ab | 230 | /** URC for call waiting. |
RobMeades | 0:bb5fabac67ab | 231 | */ |
RobMeades | 0:bb5fabac67ab | 232 | void CCWA_URC(); |
RobMeades | 0:bb5fabac67ab | 233 | |
RobMeades | 0:bb5fabac67ab | 234 | /** URC for call forwarding. |
RobMeades | 0:bb5fabac67ab | 235 | */ |
RobMeades | 0:bb5fabac67ab | 236 | void CCFC_URC(); |
RobMeades | 0:bb5fabac67ab | 237 | |
RobMeades | 0:bb5fabac67ab | 238 | /** URC for calling lined ID restriction. |
RobMeades | 0:bb5fabac67ab | 239 | */ |
RobMeades | 0:bb5fabac67ab | 240 | void CLIR_URC(); |
RobMeades | 0:bb5fabac67ab | 241 | |
RobMeades | 0:bb5fabac67ab | 242 | /** URC for calling lined ID presentation. |
RobMeades | 0:bb5fabac67ab | 243 | */ |
RobMeades | 0:bb5fabac67ab | 244 | void CLIP_URC(); |
RobMeades | 0:bb5fabac67ab | 245 | |
RobMeades | 0:bb5fabac67ab | 246 | /** URC for connected lined ID restriction. |
RobMeades | 0:bb5fabac67ab | 247 | */ |
RobMeades | 0:bb5fabac67ab | 248 | void COLR_URC(); |
RobMeades | 0:bb5fabac67ab | 249 | |
RobMeades | 0:bb5fabac67ab | 250 | /** URC for connected lined ID presentation. |
RobMeades | 0:bb5fabac67ab | 251 | */ |
RobMeades | 0:bb5fabac67ab | 252 | void COLP_URC(); |
RobMeades | 0:bb5fabac67ab | 253 | |
RobMeades | 0:bb5fabac67ab | 254 | /********************************************************************** |
RobMeades | 0:bb5fabac67ab | 255 | * PROTECTED: File System |
RobMeades | 0:bb5fabac67ab | 256 | **********************************************************************/ |
RobMeades | 0:bb5fabac67ab | 257 | |
RobMeades | 0:bb5fabac67ab | 258 | /** The maximum size of a single read of file data. |
RobMeades | 0:bb5fabac67ab | 259 | * Note: this should be no larger than BUFFERED_SERIAL_RXBUF_SIZE |
RobMeades | 0:bb5fabac67ab | 260 | * (which defaults to 256) minus some margin for the AT command |
RobMeades | 0:bb5fabac67ab | 261 | * stuff that precedes it (which includes the filename). A good |
RobMeades | 0:bb5fabac67ab | 262 | * number is 192. If you want to use something bigger then add an |
RobMeades | 0:bb5fabac67ab | 263 | * entry to the target_overrides section of your mbed_app.json of the |
RobMeades | 0:bb5fabac67ab | 264 | * following form: |
RobMeades | 0:bb5fabac67ab | 265 | * |
RobMeades | 0:bb5fabac67ab | 266 | * "platform.buffered-serial-rxbuf-size": 1024 |
RobMeades | 0:bb5fabac67ab | 267 | */ |
RobMeades | 0:bb5fabac67ab | 268 | |
RobMeades | 0:bb5fabac67ab | 269 | #define FILE_BUFFER_SIZE 192 |
RobMeades | 0:bb5fabac67ab | 270 | }; |
RobMeades | 0:bb5fabac67ab | 271 | |
RobMeades | 0:bb5fabac67ab | 272 | #endif // _UBLOX_CELLULAR_DRIVER_GEN_ |
RobMeades | 0:bb5fabac67ab | 273 |