This class provides SMS, USSD and modem file system support for u-blox modules on the C027 and C030 boards (excepting the C030 N2xx flavour) from mbed 5.5 onwards.
Dependents: example-ublox-at-cellular-interface-ext example-ublox-cellular-driver-gen HelloMQTT ublox_new_driver_test ... more
TESTS/unit_tests/sms/main.cpp@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 | #include "mbed.h" |
RobMeades | 0:bb5fabac67ab | 2 | #include "greentea-client/test_env.h" |
RobMeades | 0:bb5fabac67ab | 3 | #include "unity.h" |
RobMeades | 0:bb5fabac67ab | 4 | #include "utest.h" |
RobMeades | 0:bb5fabac67ab | 5 | #include "UbloxCellularDriverGen.h" |
RobMeades | 0:bb5fabac67ab | 6 | #include "UDPSocket.h" |
rob.meades@u-blox.com | 3:027c9eaec52c | 7 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 0:bb5fabac67ab | 8 | #include "mbed_trace.h" |
RobMeades | 0:bb5fabac67ab | 9 | #define TRACE_GROUP "TEST" |
rob.meades@u-blox.com | 3:027c9eaec52c | 10 | #else |
rob.meades@u-blox.com | 3:027c9eaec52c | 11 | #define tr_debug(format, ...) debug(format "\n", ## __VA_ARGS__) |
rob.meades@u-blox.com | 3:027c9eaec52c | 12 | #define tr_info(format, ...) debug(format "\n", ## __VA_ARGS__) |
rob.meades@u-blox.com | 3:027c9eaec52c | 13 | #define tr_warn(format, ...) debug(format "\n", ## __VA_ARGS__) |
rob.meades@u-blox.com | 3:027c9eaec52c | 14 | #define tr_error(format, ...) debug(format "\n", ## __VA_ARGS__) |
rob.meades@u-blox.com | 3:027c9eaec52c | 15 | #endif |
RobMeades | 0:bb5fabac67ab | 16 | |
RobMeades | 0:bb5fabac67ab | 17 | using namespace utest::v1; |
RobMeades | 0:bb5fabac67ab | 18 | |
RobMeades | 0:bb5fabac67ab | 19 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 20 | // COMPILE-TIME MACROS |
RobMeades | 0:bb5fabac67ab | 21 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 22 | |
RobMeades | 0:bb5fabac67ab | 23 | // These macros can be overridden with an mbed_app.json file and |
RobMeades | 0:bb5fabac67ab | 24 | // contents of the following form: |
RobMeades | 0:bb5fabac67ab | 25 | // |
RobMeades | 0:bb5fabac67ab | 26 | //{ |
RobMeades | 0:bb5fabac67ab | 27 | // "config": { |
RobMeades | 0:bb5fabac67ab | 28 | // "default-pin": { |
RobMeades | 0:bb5fabac67ab | 29 | // "value": "\"my_pin\"" |
RobMeades | 0:bb5fabac67ab | 30 | // } |
RobMeades | 0:bb5fabac67ab | 31 | //} |
RobMeades | 0:bb5fabac67ab | 32 | |
rob.meades@u-blox.com | 5:b935404dcf7c | 33 | // Whether debug trace is on |
rob.meades@u-blox.com | 5:b935404dcf7c | 34 | #ifndef MBED_CONF_APP_DEBUG_ON |
rob.meades@u-blox.com | 5:b935404dcf7c | 35 | # define MBED_CONF_APP_DEBUG_ON false |
rob.meades@u-blox.com | 5:b935404dcf7c | 36 | #endif |
rob.meades@u-blox.com | 5:b935404dcf7c | 37 | |
RobMeades | 0:bb5fabac67ab | 38 | // The credentials of the SIM in the board. |
RobMeades | 0:bb5fabac67ab | 39 | #ifndef MBED_CONF_APP_DEFAULT_PIN |
RobMeades | 0:bb5fabac67ab | 40 | // Note: this is the PIN for the SIM with ICCID |
RobMeades | 0:bb5fabac67ab | 41 | // 8944501104169548380. |
RobMeades | 0:bb5fabac67ab | 42 | # define MBED_CONF_APP_DEFAULT_PIN "5134" |
RobMeades | 0:bb5fabac67ab | 43 | #endif |
RobMeades | 0:bb5fabac67ab | 44 | |
RobMeades | 0:bb5fabac67ab | 45 | // A number to send SMS messages to which will respond |
RobMeades | 0:bb5fabac67ab | 46 | // to the instruction given in the messages. |
RobMeades | 0:bb5fabac67ab | 47 | // IMPORTANT: spaces in the string are NOT allowed |
RobMeades | 0:bb5fabac67ab | 48 | #ifndef MBED_CONF_APP_SMS_DESTINATION |
RobMeades | 0:bb5fabac67ab | 49 | # error "Must define a destination number to use for SMS testing (and someone must be there to reply); the number must contain no spaces and should be in international format" |
RobMeades | 0:bb5fabac67ab | 50 | #endif |
RobMeades | 0:bb5fabac67ab | 51 | |
RobMeades | 0:bb5fabac67ab | 52 | // The message to send. |
RobMeades | 0:bb5fabac67ab | 53 | #ifndef MBED_CONF_APP_SMS_SEND_CONTENTS |
RobMeades | 0:bb5fabac67ab | 54 | # define MBED_CONF_APP_SMS_SEND_CONTENTS "Please reply to this message within 60 seconds with the single word ACK (in upper case)." |
RobMeades | 0:bb5fabac67ab | 55 | #endif |
RobMeades | 0:bb5fabac67ab | 56 | |
RobMeades | 0:bb5fabac67ab | 57 | // The number of milliseconds to wait for a reply to the sent SMS. |
RobMeades | 0:bb5fabac67ab | 58 | #ifndef MBED_CONF_APP_SMS_RECEIVE_TIMEOUT |
RobMeades | 0:bb5fabac67ab | 59 | # define MBED_CONF_APP_SMS_RECEIVE_TIMEOUT 60000 |
RobMeades | 0:bb5fabac67ab | 60 | #endif |
RobMeades | 0:bb5fabac67ab | 61 | |
RobMeades | 0:bb5fabac67ab | 62 | // The string that the reply must contain. |
RobMeades | 0:bb5fabac67ab | 63 | #ifndef MBED_CONF_APP_SMS_RECEIVE_CONTENTS |
RobMeades | 0:bb5fabac67ab | 64 | # define MBED_CONF_APP_SMS_RECEIVE_CONTENTS "ACK" |
RobMeades | 0:bb5fabac67ab | 65 | #endif |
RobMeades | 0:bb5fabac67ab | 66 | |
RobMeades | 0:bb5fabac67ab | 67 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 68 | // PRIVATE VARIABLES |
RobMeades | 0:bb5fabac67ab | 69 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 70 | |
rob.meades@u-blox.com | 3:027c9eaec52c | 71 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 0:bb5fabac67ab | 72 | // Lock for debug prints |
RobMeades | 0:bb5fabac67ab | 73 | static Mutex mtx; |
rob.meades@u-blox.com | 3:027c9eaec52c | 74 | #endif |
RobMeades | 0:bb5fabac67ab | 75 | |
RobMeades | 0:bb5fabac67ab | 76 | // An instance of the generic cellular class |
RobMeades | 0:bb5fabac67ab | 77 | static UbloxCellularDriverGen *pDriver = |
RobMeades | 0:bb5fabac67ab | 78 | new UbloxCellularDriverGen(MDMTXD, MDMRXD, |
RobMeades | 0:bb5fabac67ab | 79 | MBED_CONF_UBLOX_CELL_BAUD_RATE, |
rob.meades@u-blox.com | 5:b935404dcf7c | 80 | MBED_CONF_APP_DEBUG_ON); |
RobMeades | 0:bb5fabac67ab | 81 | |
RobMeades | 0:bb5fabac67ab | 82 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 83 | // PRIVATE FUNCTIONS |
RobMeades | 0:bb5fabac67ab | 84 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 85 | |
rob.meades@u-blox.com | 3:027c9eaec52c | 86 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 0:bb5fabac67ab | 87 | // Locks for debug prints |
RobMeades | 0:bb5fabac67ab | 88 | static void lock() |
RobMeades | 0:bb5fabac67ab | 89 | { |
RobMeades | 0:bb5fabac67ab | 90 | mtx.lock(); |
RobMeades | 0:bb5fabac67ab | 91 | } |
RobMeades | 0:bb5fabac67ab | 92 | |
RobMeades | 0:bb5fabac67ab | 93 | static void unlock() |
RobMeades | 0:bb5fabac67ab | 94 | { |
RobMeades | 0:bb5fabac67ab | 95 | mtx.unlock(); |
RobMeades | 0:bb5fabac67ab | 96 | } |
rob.meades@u-blox.com | 3:027c9eaec52c | 97 | #endif |
RobMeades | 0:bb5fabac67ab | 98 | |
RobMeades | 0:bb5fabac67ab | 99 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 100 | // TESTS |
RobMeades | 0:bb5fabac67ab | 101 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 102 | |
RobMeades | 0:bb5fabac67ab | 103 | // Register with the network |
RobMeades | 0:bb5fabac67ab | 104 | void test_start() { |
RobMeades | 0:bb5fabac67ab | 105 | TEST_ASSERT(pDriver->init(MBED_CONF_APP_DEFAULT_PIN)); |
RobMeades | 0:bb5fabac67ab | 106 | TEST_ASSERT(pDriver->nwk_registration()); |
RobMeades | 0:bb5fabac67ab | 107 | } |
RobMeades | 0:bb5fabac67ab | 108 | |
RobMeades | 0:bb5fabac67ab | 109 | // Send an SMS message |
RobMeades | 0:bb5fabac67ab | 110 | void test_send() { |
RobMeades | 0:bb5fabac67ab | 111 | TEST_ASSERT(pDriver->smsSend(MBED_CONF_APP_SMS_DESTINATION, |
RobMeades | 0:bb5fabac67ab | 112 | MBED_CONF_APP_SMS_SEND_CONTENTS)); |
RobMeades | 0:bb5fabac67ab | 113 | } |
RobMeades | 0:bb5fabac67ab | 114 | |
RobMeades | 0:bb5fabac67ab | 115 | // Receive an SMS message, check it and delete it |
RobMeades | 0:bb5fabac67ab | 116 | void test_receive() { |
RobMeades | 0:bb5fabac67ab | 117 | int numSms = 0; |
RobMeades | 0:bb5fabac67ab | 118 | int index; |
RobMeades | 0:bb5fabac67ab | 119 | char num[17]; |
RobMeades | 0:bb5fabac67ab | 120 | char buf[SMS_BUFFER_SIZE]; |
RobMeades | 0:bb5fabac67ab | 121 | Timer timer; |
RobMeades | 0:bb5fabac67ab | 122 | |
rob.meades@u-blox.com | 5:b935404dcf7c | 123 | tr_warn("!!! YOU HAVE %d SECONDS to reply to the text message !!!", |
rob.meades@u-blox.com | 5:b935404dcf7c | 124 | MBED_CONF_APP_SMS_RECEIVE_TIMEOUT / 1000); |
RobMeades | 0:bb5fabac67ab | 125 | timer.start(); |
RobMeades | 0:bb5fabac67ab | 126 | while ((numSms == 0) && |
RobMeades | 0:bb5fabac67ab | 127 | (timer.read_ms() < MBED_CONF_APP_SMS_RECEIVE_TIMEOUT)) { |
RobMeades | 0:bb5fabac67ab | 128 | numSms = pDriver->smsList("REC UNREAD", &index, 1); |
RobMeades | 0:bb5fabac67ab | 129 | if (numSms == 0) { |
RobMeades | 0:bb5fabac67ab | 130 | wait_ms(1000); |
RobMeades | 0:bb5fabac67ab | 131 | } |
RobMeades | 0:bb5fabac67ab | 132 | } |
RobMeades | 0:bb5fabac67ab | 133 | timer.stop(); |
RobMeades | 0:bb5fabac67ab | 134 | |
RobMeades | 0:bb5fabac67ab | 135 | TEST_ASSERT (numSms > 0); |
RobMeades | 0:bb5fabac67ab | 136 | |
RobMeades | 0:bb5fabac67ab | 137 | TEST_ASSERT(pDriver->smsRead(index, num, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 138 | tr_debug("Received: \"%.*s\"", sizeof (buf), buf); |
RobMeades | 0:bb5fabac67ab | 139 | TEST_ASSERT (strstr(buf, MBED_CONF_APP_SMS_RECEIVE_CONTENTS) != NULL); |
RobMeades | 0:bb5fabac67ab | 140 | |
RobMeades | 0:bb5fabac67ab | 141 | // Delete the message and check that it's gone |
RobMeades | 0:bb5fabac67ab | 142 | numSms = pDriver->smsList(); |
RobMeades | 0:bb5fabac67ab | 143 | TEST_ASSERT(numSms > 0); |
RobMeades | 0:bb5fabac67ab | 144 | TEST_ASSERT(pDriver->smsDelete(index)); |
RobMeades | 0:bb5fabac67ab | 145 | TEST_ASSERT(pDriver->smsList() == numSms - 1); |
RobMeades | 0:bb5fabac67ab | 146 | } |
RobMeades | 0:bb5fabac67ab | 147 | |
RobMeades | 0:bb5fabac67ab | 148 | // De-register from the network |
RobMeades | 0:bb5fabac67ab | 149 | void test_end() { |
RobMeades | 0:bb5fabac67ab | 150 | TEST_ASSERT(pDriver->nwk_deregistration()); |
RobMeades | 0:bb5fabac67ab | 151 | } |
RobMeades | 0:bb5fabac67ab | 152 | |
RobMeades | 0:bb5fabac67ab | 153 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 154 | // TEST ENVIRONMENT |
RobMeades | 0:bb5fabac67ab | 155 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 156 | |
RobMeades | 0:bb5fabac67ab | 157 | // Setup the test environment |
RobMeades | 0:bb5fabac67ab | 158 | utest::v1::status_t test_setup(const size_t number_of_cases) { |
RobMeades | 0:bb5fabac67ab | 159 | // Setup Greentea with a timeout |
RobMeades | 0:bb5fabac67ab | 160 | GREENTEA_SETUP(180, "default_auto"); |
RobMeades | 0:bb5fabac67ab | 161 | return verbose_test_setup_handler(number_of_cases); |
RobMeades | 0:bb5fabac67ab | 162 | } |
RobMeades | 0:bb5fabac67ab | 163 | |
RobMeades | 0:bb5fabac67ab | 164 | // Test cases |
RobMeades | 0:bb5fabac67ab | 165 | Case cases[] = { |
RobMeades | 0:bb5fabac67ab | 166 | Case("Register", test_start), |
RobMeades | 0:bb5fabac67ab | 167 | Case("SMS send", test_send), |
RobMeades | 0:bb5fabac67ab | 168 | Case("SMS receive and delete", test_receive), |
RobMeades | 0:bb5fabac67ab | 169 | Case("Deregister", test_end) |
RobMeades | 0:bb5fabac67ab | 170 | }; |
RobMeades | 0:bb5fabac67ab | 171 | |
RobMeades | 0:bb5fabac67ab | 172 | Specification specification(test_setup, cases); |
RobMeades | 0:bb5fabac67ab | 173 | |
RobMeades | 0:bb5fabac67ab | 174 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 175 | // MAIN |
RobMeades | 0:bb5fabac67ab | 176 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 177 | |
RobMeades | 0:bb5fabac67ab | 178 | int main() { |
rob.meades@u-blox.com | 3:027c9eaec52c | 179 | |
rob.meades@u-blox.com | 3:027c9eaec52c | 180 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 0:bb5fabac67ab | 181 | mbed_trace_init(); |
RobMeades | 0:bb5fabac67ab | 182 | |
RobMeades | 0:bb5fabac67ab | 183 | mbed_trace_mutex_wait_function_set(lock); |
RobMeades | 0:bb5fabac67ab | 184 | mbed_trace_mutex_release_function_set(unlock); |
rob.meades@u-blox.com | 3:027c9eaec52c | 185 | #endif |
RobMeades | 0:bb5fabac67ab | 186 | |
RobMeades | 0:bb5fabac67ab | 187 | // Run tests |
RobMeades | 0:bb5fabac67ab | 188 | return !Harness::run(specification); |
RobMeades | 0:bb5fabac67ab | 189 | } |
RobMeades | 0:bb5fabac67ab | 190 | |
RobMeades | 0:bb5fabac67ab | 191 | // End Of File |
RobMeades | 0:bb5fabac67ab | 192 |