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@0:bb5fabac67ab, 2017-06-05 (annotated)
- Committer:
- RobMeades
- Date:
- Mon Jun 05 13:00:31 2017 +0000
- Revision:
- 0:bb5fabac67ab
- Child:
- 1:458e1b3d460c
Initial revision.
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" |
RobMeades | 0:bb5fabac67ab | 7 | #include "FEATURE_COMMON_PAL/nanostack-libservice/mbed-client-libservice/common_functions.h" |
RobMeades | 0:bb5fabac67ab | 8 | #include "mbed_trace.h" |
RobMeades | 0:bb5fabac67ab | 9 | #define TRACE_GROUP "TEST" |
RobMeades | 0:bb5fabac67ab | 10 | |
RobMeades | 0:bb5fabac67ab | 11 | using namespace utest::v1; |
RobMeades | 0:bb5fabac67ab | 12 | |
RobMeades | 0:bb5fabac67ab | 13 | // IMPORTANT: these tests require |
RobMeades | 0:bb5fabac67ab | 14 | |
RobMeades | 0:bb5fabac67ab | 15 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 16 | // COMPILE-TIME MACROS |
RobMeades | 0:bb5fabac67ab | 17 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 18 | |
RobMeades | 0:bb5fabac67ab | 19 | // These macros can be overridden with an mbed_app.json file and |
RobMeades | 0:bb5fabac67ab | 20 | // contents of the following form: |
RobMeades | 0:bb5fabac67ab | 21 | // |
RobMeades | 0:bb5fabac67ab | 22 | //{ |
RobMeades | 0:bb5fabac67ab | 23 | // "config": { |
RobMeades | 0:bb5fabac67ab | 24 | // "default-pin": { |
RobMeades | 0:bb5fabac67ab | 25 | // "value": "\"my_pin\"" |
RobMeades | 0:bb5fabac67ab | 26 | // } |
RobMeades | 0:bb5fabac67ab | 27 | //} |
RobMeades | 0:bb5fabac67ab | 28 | |
RobMeades | 0:bb5fabac67ab | 29 | // The credentials of the SIM in the board. |
RobMeades | 0:bb5fabac67ab | 30 | #ifndef MBED_CONF_APP_DEFAULT_PIN |
RobMeades | 0:bb5fabac67ab | 31 | // Note: this is the PIN for the SIM with ICCID |
RobMeades | 0:bb5fabac67ab | 32 | // 8944501104169548380. |
RobMeades | 0:bb5fabac67ab | 33 | # define MBED_CONF_APP_DEFAULT_PIN "5134" |
RobMeades | 0:bb5fabac67ab | 34 | #endif |
RobMeades | 0:bb5fabac67ab | 35 | |
RobMeades | 0:bb5fabac67ab | 36 | // A number to send SMS messages to which will respond |
RobMeades | 0:bb5fabac67ab | 37 | // to the instruction given in the messages. |
RobMeades | 0:bb5fabac67ab | 38 | // IMPORTANT: spaces in the string are NOT allowed |
RobMeades | 0:bb5fabac67ab | 39 | #ifndef MBED_CONF_APP_SMS_DESTINATION |
RobMeades | 0:bb5fabac67ab | 40 | # 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 | 41 | #endif |
RobMeades | 0:bb5fabac67ab | 42 | |
RobMeades | 0:bb5fabac67ab | 43 | // The message to send. |
RobMeades | 0:bb5fabac67ab | 44 | #ifndef MBED_CONF_APP_SMS_SEND_CONTENTS |
RobMeades | 0:bb5fabac67ab | 45 | # 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 | 46 | #endif |
RobMeades | 0:bb5fabac67ab | 47 | |
RobMeades | 0:bb5fabac67ab | 48 | // The number of milliseconds to wait for a reply to the sent SMS. |
RobMeades | 0:bb5fabac67ab | 49 | #ifndef MBED_CONF_APP_SMS_RECEIVE_TIMEOUT |
RobMeades | 0:bb5fabac67ab | 50 | # define MBED_CONF_APP_SMS_RECEIVE_TIMEOUT 60000 |
RobMeades | 0:bb5fabac67ab | 51 | #endif |
RobMeades | 0:bb5fabac67ab | 52 | |
RobMeades | 0:bb5fabac67ab | 53 | // The string that the reply must contain. |
RobMeades | 0:bb5fabac67ab | 54 | #ifndef MBED_CONF_APP_SMS_RECEIVE_CONTENTS |
RobMeades | 0:bb5fabac67ab | 55 | # define MBED_CONF_APP_SMS_RECEIVE_CONTENTS "ACK" |
RobMeades | 0:bb5fabac67ab | 56 | #endif |
RobMeades | 0:bb5fabac67ab | 57 | |
RobMeades | 0:bb5fabac67ab | 58 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 59 | // PRIVATE VARIABLES |
RobMeades | 0:bb5fabac67ab | 60 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 61 | |
RobMeades | 0:bb5fabac67ab | 62 | // Lock for debug prints |
RobMeades | 0:bb5fabac67ab | 63 | static Mutex mtx; |
RobMeades | 0:bb5fabac67ab | 64 | |
RobMeades | 0:bb5fabac67ab | 65 | // An instance of the generic cellular class |
RobMeades | 0:bb5fabac67ab | 66 | static UbloxCellularDriverGen *pDriver = |
RobMeades | 0:bb5fabac67ab | 67 | new UbloxCellularDriverGen(MDMTXD, MDMRXD, |
RobMeades | 0:bb5fabac67ab | 68 | MBED_CONF_UBLOX_CELL_BAUD_RATE, |
RobMeades | 0:bb5fabac67ab | 69 | true); |
RobMeades | 0:bb5fabac67ab | 70 | |
RobMeades | 0:bb5fabac67ab | 71 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 72 | // PRIVATE FUNCTIONS |
RobMeades | 0:bb5fabac67ab | 73 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 74 | |
RobMeades | 0:bb5fabac67ab | 75 | // Locks for debug prints |
RobMeades | 0:bb5fabac67ab | 76 | static void lock() |
RobMeades | 0:bb5fabac67ab | 77 | { |
RobMeades | 0:bb5fabac67ab | 78 | mtx.lock(); |
RobMeades | 0:bb5fabac67ab | 79 | } |
RobMeades | 0:bb5fabac67ab | 80 | |
RobMeades | 0:bb5fabac67ab | 81 | static void unlock() |
RobMeades | 0:bb5fabac67ab | 82 | { |
RobMeades | 0:bb5fabac67ab | 83 | mtx.unlock(); |
RobMeades | 0:bb5fabac67ab | 84 | } |
RobMeades | 0:bb5fabac67ab | 85 | |
RobMeades | 0:bb5fabac67ab | 86 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 87 | // TESTS |
RobMeades | 0:bb5fabac67ab | 88 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 89 | |
RobMeades | 0:bb5fabac67ab | 90 | // Register with the network |
RobMeades | 0:bb5fabac67ab | 91 | void test_start() { |
RobMeades | 0:bb5fabac67ab | 92 | TEST_ASSERT(pDriver->init(MBED_CONF_APP_DEFAULT_PIN)); |
RobMeades | 0:bb5fabac67ab | 93 | TEST_ASSERT(pDriver->nwk_registration()); |
RobMeades | 0:bb5fabac67ab | 94 | } |
RobMeades | 0:bb5fabac67ab | 95 | |
RobMeades | 0:bb5fabac67ab | 96 | // Send an SMS message |
RobMeades | 0:bb5fabac67ab | 97 | void test_send() { |
RobMeades | 0:bb5fabac67ab | 98 | TEST_ASSERT(pDriver->smsSend(MBED_CONF_APP_SMS_DESTINATION, |
RobMeades | 0:bb5fabac67ab | 99 | MBED_CONF_APP_SMS_SEND_CONTENTS)); |
RobMeades | 0:bb5fabac67ab | 100 | } |
RobMeades | 0:bb5fabac67ab | 101 | |
RobMeades | 0:bb5fabac67ab | 102 | // Receive an SMS message, check it and delete it |
RobMeades | 0:bb5fabac67ab | 103 | void test_receive() { |
RobMeades | 0:bb5fabac67ab | 104 | int numSms = 0; |
RobMeades | 0:bb5fabac67ab | 105 | int index; |
RobMeades | 0:bb5fabac67ab | 106 | char num[17]; |
RobMeades | 0:bb5fabac67ab | 107 | char buf[SMS_BUFFER_SIZE]; |
RobMeades | 0:bb5fabac67ab | 108 | Timer timer; |
RobMeades | 0:bb5fabac67ab | 109 | |
RobMeades | 0:bb5fabac67ab | 110 | tr_error("!!! YOU HAVE %d SECONDS to reply to the text message !!!", |
RobMeades | 0:bb5fabac67ab | 111 | MBED_CONF_APP_SMS_RECEIVE_TIMEOUT / 1000); |
RobMeades | 0:bb5fabac67ab | 112 | timer.start(); |
RobMeades | 0:bb5fabac67ab | 113 | while ((numSms == 0) && |
RobMeades | 0:bb5fabac67ab | 114 | (timer.read_ms() < MBED_CONF_APP_SMS_RECEIVE_TIMEOUT)) { |
RobMeades | 0:bb5fabac67ab | 115 | numSms = pDriver->smsList("REC UNREAD", &index, 1); |
RobMeades | 0:bb5fabac67ab | 116 | if (numSms == 0) { |
RobMeades | 0:bb5fabac67ab | 117 | wait_ms(1000); |
RobMeades | 0:bb5fabac67ab | 118 | } |
RobMeades | 0:bb5fabac67ab | 119 | } |
RobMeades | 0:bb5fabac67ab | 120 | timer.stop(); |
RobMeades | 0:bb5fabac67ab | 121 | |
RobMeades | 0:bb5fabac67ab | 122 | TEST_ASSERT (numSms > 0); |
RobMeades | 0:bb5fabac67ab | 123 | |
RobMeades | 0:bb5fabac67ab | 124 | TEST_ASSERT(pDriver->smsRead(index, num, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 125 | tr_debug("Received: \"%.*s\"", sizeof (buf), buf); |
RobMeades | 0:bb5fabac67ab | 126 | TEST_ASSERT (strstr(buf, MBED_CONF_APP_SMS_RECEIVE_CONTENTS) != NULL); |
RobMeades | 0:bb5fabac67ab | 127 | |
RobMeades | 0:bb5fabac67ab | 128 | // Delete the message and check that it's gone |
RobMeades | 0:bb5fabac67ab | 129 | numSms = pDriver->smsList(); |
RobMeades | 0:bb5fabac67ab | 130 | TEST_ASSERT(numSms > 0); |
RobMeades | 0:bb5fabac67ab | 131 | TEST_ASSERT(pDriver->smsDelete(index)); |
RobMeades | 0:bb5fabac67ab | 132 | TEST_ASSERT(pDriver->smsList() == numSms - 1); |
RobMeades | 0:bb5fabac67ab | 133 | } |
RobMeades | 0:bb5fabac67ab | 134 | |
RobMeades | 0:bb5fabac67ab | 135 | // De-register from the network |
RobMeades | 0:bb5fabac67ab | 136 | void test_end() { |
RobMeades | 0:bb5fabac67ab | 137 | TEST_ASSERT(pDriver->nwk_deregistration()); |
RobMeades | 0:bb5fabac67ab | 138 | } |
RobMeades | 0:bb5fabac67ab | 139 | |
RobMeades | 0:bb5fabac67ab | 140 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 141 | // TEST ENVIRONMENT |
RobMeades | 0:bb5fabac67ab | 142 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 143 | |
RobMeades | 0:bb5fabac67ab | 144 | // Setup the test environment |
RobMeades | 0:bb5fabac67ab | 145 | utest::v1::status_t test_setup(const size_t number_of_cases) { |
RobMeades | 0:bb5fabac67ab | 146 | // Setup Greentea with a timeout |
RobMeades | 0:bb5fabac67ab | 147 | GREENTEA_SETUP(180, "default_auto"); |
RobMeades | 0:bb5fabac67ab | 148 | return verbose_test_setup_handler(number_of_cases); |
RobMeades | 0:bb5fabac67ab | 149 | } |
RobMeades | 0:bb5fabac67ab | 150 | |
RobMeades | 0:bb5fabac67ab | 151 | // Test cases |
RobMeades | 0:bb5fabac67ab | 152 | Case cases[] = { |
RobMeades | 0:bb5fabac67ab | 153 | Case("Register", test_start), |
RobMeades | 0:bb5fabac67ab | 154 | Case("SMS send", test_send), |
RobMeades | 0:bb5fabac67ab | 155 | Case("SMS receive and delete", test_receive), |
RobMeades | 0:bb5fabac67ab | 156 | Case("Deregister", test_end) |
RobMeades | 0:bb5fabac67ab | 157 | }; |
RobMeades | 0:bb5fabac67ab | 158 | |
RobMeades | 0:bb5fabac67ab | 159 | Specification specification(test_setup, cases); |
RobMeades | 0:bb5fabac67ab | 160 | |
RobMeades | 0:bb5fabac67ab | 161 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 162 | // MAIN |
RobMeades | 0:bb5fabac67ab | 163 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 164 | |
RobMeades | 0:bb5fabac67ab | 165 | int main() { |
RobMeades | 0:bb5fabac67ab | 166 | mbed_trace_init(); |
RobMeades | 0:bb5fabac67ab | 167 | |
RobMeades | 0:bb5fabac67ab | 168 | mbed_trace_mutex_wait_function_set(lock); |
RobMeades | 0:bb5fabac67ab | 169 | mbed_trace_mutex_release_function_set(unlock); |
RobMeades | 0:bb5fabac67ab | 170 | |
RobMeades | 0:bb5fabac67ab | 171 | // Run tests |
RobMeades | 0:bb5fabac67ab | 172 | return !Harness::run(specification); |
RobMeades | 0:bb5fabac67ab | 173 | } |
RobMeades | 0:bb5fabac67ab | 174 | |
RobMeades | 0:bb5fabac67ab | 175 | // End Of File |
RobMeades | 0:bb5fabac67ab | 176 |