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/ussd/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 | // http://www.geckobeach.com/cellular/secrets/gsmcodes.php |
RobMeades | 0:bb5fabac67ab | 46 | // https://en.wikipedia.org/wiki/Unstructured_Supplementary_Service_Data |
RobMeades | 0:bb5fabac67ab | 47 | |
RobMeades | 0:bb5fabac67ab | 48 | // A few USSD commands to try, set to "" to skip |
RobMeades | 0:bb5fabac67ab | 49 | #ifndef MBED_CONF_APP_USSD_COMMAND_1 |
RobMeades | 0:bb5fabac67ab | 50 | # define MBED_CONF_APP_USSD_COMMAND_1 "*100#" |
RobMeades | 0:bb5fabac67ab | 51 | #endif |
RobMeades | 0:bb5fabac67ab | 52 | |
RobMeades | 0:bb5fabac67ab | 53 | #ifndef MBED_CONF_APP_USSD_COMMAND_2 |
RobMeades | 0:bb5fabac67ab | 54 | # define MBED_CONF_APP_USSD_COMMAND_2 "*#21#" |
RobMeades | 0:bb5fabac67ab | 55 | #endif |
RobMeades | 0:bb5fabac67ab | 56 | |
RobMeades | 0:bb5fabac67ab | 57 | #ifndef MBED_CONF_APP_USSD_COMMAND_3 |
RobMeades | 0:bb5fabac67ab | 58 | # define MBED_CONF_APP_USSD_COMMAND_3 "*#30#" |
RobMeades | 0:bb5fabac67ab | 59 | #endif |
RobMeades | 0:bb5fabac67ab | 60 | |
RobMeades | 0:bb5fabac67ab | 61 | #ifndef MBED_CONF_APP_USSD_COMMAND_4 |
RobMeades | 0:bb5fabac67ab | 62 | # define MBED_CONF_APP_USSD_COMMAND_4 "*#31#" |
RobMeades | 0:bb5fabac67ab | 63 | #endif |
RobMeades | 0:bb5fabac67ab | 64 | |
RobMeades | 0:bb5fabac67ab | 65 | #ifndef MBED_CONF_APP_USSD_COMMAND_5 |
RobMeades | 0:bb5fabac67ab | 66 | # define MBED_CONF_APP_USSD_COMMAND_5 "*#43#" |
RobMeades | 0:bb5fabac67ab | 67 | #endif |
RobMeades | 0:bb5fabac67ab | 68 | |
RobMeades | 0:bb5fabac67ab | 69 | #ifndef MBED_CONF_APP_USSD_COMMAND_6 |
RobMeades | 0:bb5fabac67ab | 70 | # define MBED_CONF_APP_USSD_COMMAND_6 "*#61#" |
RobMeades | 0:bb5fabac67ab | 71 | #endif |
RobMeades | 0:bb5fabac67ab | 72 | |
RobMeades | 0:bb5fabac67ab | 73 | #ifndef MBED_CONF_APP_USSD_COMMAND_7 |
RobMeades | 0:bb5fabac67ab | 74 | # define MBED_CONF_APP_USSD_COMMAND_7 "" |
RobMeades | 0:bb5fabac67ab | 75 | #endif |
RobMeades | 0:bb5fabac67ab | 76 | |
RobMeades | 0:bb5fabac67ab | 77 | #ifndef MBED_CONF_APP_USSD_COMMAND_8 |
RobMeades | 0:bb5fabac67ab | 78 | # define MBED_CONF_APP_USSD_COMMAND_8 "" |
RobMeades | 0:bb5fabac67ab | 79 | #endif |
RobMeades | 0:bb5fabac67ab | 80 | |
RobMeades | 0:bb5fabac67ab | 81 | #ifndef MBED_CONF_APP_USSD_COMMAND_9 |
RobMeades | 0:bb5fabac67ab | 82 | # define MBED_CONF_APP_USSD_COMMAND_9 "" |
RobMeades | 0:bb5fabac67ab | 83 | #endif |
RobMeades | 0:bb5fabac67ab | 84 | |
RobMeades | 0:bb5fabac67ab | 85 | #ifndef MBED_CONF_APP_USSD_COMMAND_10 |
RobMeades | 0:bb5fabac67ab | 86 | # define MBED_CONF_APP_USSD_COMMAND_10 "" |
RobMeades | 0:bb5fabac67ab | 87 | #endif |
RobMeades | 0:bb5fabac67ab | 88 | |
RobMeades | 0:bb5fabac67ab | 89 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 90 | // PRIVATE VARIABLES |
RobMeades | 0:bb5fabac67ab | 91 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 92 | |
rob.meades@u-blox.com | 3:027c9eaec52c | 93 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 0:bb5fabac67ab | 94 | // Lock for debug prints |
RobMeades | 0:bb5fabac67ab | 95 | static Mutex mtx; |
rob.meades@u-blox.com | 3:027c9eaec52c | 96 | #endif |
RobMeades | 0:bb5fabac67ab | 97 | |
RobMeades | 0:bb5fabac67ab | 98 | // An instance of the generic cellular class |
RobMeades | 0:bb5fabac67ab | 99 | static UbloxCellularDriverGen *pDriver = |
RobMeades | 0:bb5fabac67ab | 100 | new UbloxCellularDriverGen(MDMTXD, MDMRXD, |
RobMeades | 0:bb5fabac67ab | 101 | MBED_CONF_UBLOX_CELL_BAUD_RATE, |
rob.meades@u-blox.com | 5:b935404dcf7c | 102 | MBED_CONF_APP_DEBUG_ON); |
RobMeades | 0:bb5fabac67ab | 103 | // A general purpose buffer |
RobMeades | 0:bb5fabac67ab | 104 | static char buf[USSD_STRING_LENGTH + 1]; |
RobMeades | 0:bb5fabac67ab | 105 | |
RobMeades | 0:bb5fabac67ab | 106 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 107 | // PRIVATE FUNCTIONS |
RobMeades | 0:bb5fabac67ab | 108 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 109 | |
rob.meades@u-blox.com | 3:027c9eaec52c | 110 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 0:bb5fabac67ab | 111 | // Locks for debug prints |
RobMeades | 0:bb5fabac67ab | 112 | static void lock() |
RobMeades | 0:bb5fabac67ab | 113 | { |
RobMeades | 0:bb5fabac67ab | 114 | mtx.lock(); |
RobMeades | 0:bb5fabac67ab | 115 | } |
RobMeades | 0:bb5fabac67ab | 116 | |
RobMeades | 0:bb5fabac67ab | 117 | static void unlock() |
RobMeades | 0:bb5fabac67ab | 118 | { |
RobMeades | 0:bb5fabac67ab | 119 | mtx.unlock(); |
RobMeades | 0:bb5fabac67ab | 120 | } |
rob.meades@u-blox.com | 3:027c9eaec52c | 121 | #endif |
RobMeades | 0:bb5fabac67ab | 122 | |
RobMeades | 0:bb5fabac67ab | 123 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 124 | // TESTS |
RobMeades | 0:bb5fabac67ab | 125 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 126 | |
RobMeades | 0:bb5fabac67ab | 127 | // Test USSD |
RobMeades | 0:bb5fabac67ab | 128 | void test_ussd() { |
RobMeades | 0:bb5fabac67ab | 129 | TEST_ASSERT(pDriver->init(MBED_CONF_APP_DEFAULT_PIN)); |
RobMeades | 0:bb5fabac67ab | 130 | TEST_ASSERT(pDriver->nwk_registration()); |
RobMeades | 0:bb5fabac67ab | 131 | |
RobMeades | 0:bb5fabac67ab | 132 | if (strlen(MBED_CONF_APP_USSD_COMMAND_1) > 0) { |
RobMeades | 0:bb5fabac67ab | 133 | tr_debug("Sending : \"%s\".", MBED_CONF_APP_USSD_COMMAND_1); |
RobMeades | 0:bb5fabac67ab | 134 | TEST_ASSERT(pDriver->ussdCommand(MBED_CONF_APP_USSD_COMMAND_1, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 135 | tr_debug("USSD answer: \"%s\".", buf); |
RobMeades | 0:bb5fabac67ab | 136 | } |
RobMeades | 0:bb5fabac67ab | 137 | |
RobMeades | 0:bb5fabac67ab | 138 | if (strlen(MBED_CONF_APP_USSD_COMMAND_2) > 0) { |
RobMeades | 0:bb5fabac67ab | 139 | tr_debug("Sending : \"%s\".", MBED_CONF_APP_USSD_COMMAND_2); |
RobMeades | 0:bb5fabac67ab | 140 | TEST_ASSERT(pDriver->ussdCommand(MBED_CONF_APP_USSD_COMMAND_2, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 141 | tr_debug("USSD answer: \"%s\".", buf); |
RobMeades | 0:bb5fabac67ab | 142 | } |
RobMeades | 0:bb5fabac67ab | 143 | |
RobMeades | 0:bb5fabac67ab | 144 | if (strlen(MBED_CONF_APP_USSD_COMMAND_3) > 0) { |
RobMeades | 0:bb5fabac67ab | 145 | tr_debug("Sending : \"%s\".", MBED_CONF_APP_USSD_COMMAND_3); |
RobMeades | 0:bb5fabac67ab | 146 | TEST_ASSERT(pDriver->ussdCommand(MBED_CONF_APP_USSD_COMMAND_3, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 147 | tr_debug("USSD answer: \"%s\".", buf); |
RobMeades | 0:bb5fabac67ab | 148 | } |
RobMeades | 0:bb5fabac67ab | 149 | |
RobMeades | 0:bb5fabac67ab | 150 | if (strlen(MBED_CONF_APP_USSD_COMMAND_4) > 0) { |
RobMeades | 0:bb5fabac67ab | 151 | tr_debug("Sending : \"%s\".", MBED_CONF_APP_USSD_COMMAND_4); |
RobMeades | 0:bb5fabac67ab | 152 | TEST_ASSERT(pDriver->ussdCommand(MBED_CONF_APP_USSD_COMMAND_4, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 153 | tr_debug("USSD answer: \"%s\".", buf); |
RobMeades | 0:bb5fabac67ab | 154 | } |
RobMeades | 0:bb5fabac67ab | 155 | |
RobMeades | 0:bb5fabac67ab | 156 | if (strlen(MBED_CONF_APP_USSD_COMMAND_5) > 0) { |
RobMeades | 0:bb5fabac67ab | 157 | tr_debug("Sending : \"%s\".", MBED_CONF_APP_USSD_COMMAND_5); |
RobMeades | 0:bb5fabac67ab | 158 | TEST_ASSERT(pDriver->ussdCommand(MBED_CONF_APP_USSD_COMMAND_5, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 159 | tr_debug("USSD answer: \"%s\".", buf); |
RobMeades | 0:bb5fabac67ab | 160 | } |
RobMeades | 0:bb5fabac67ab | 161 | |
RobMeades | 0:bb5fabac67ab | 162 | if (strlen(MBED_CONF_APP_USSD_COMMAND_6) > 0) { |
RobMeades | 0:bb5fabac67ab | 163 | tr_debug("Sending : \"%s\".", MBED_CONF_APP_USSD_COMMAND_6); |
RobMeades | 0:bb5fabac67ab | 164 | TEST_ASSERT(pDriver->ussdCommand(MBED_CONF_APP_USSD_COMMAND_6, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 165 | tr_debug("USSD answer: \"%s\".", buf); |
RobMeades | 0:bb5fabac67ab | 166 | } |
RobMeades | 0:bb5fabac67ab | 167 | |
RobMeades | 0:bb5fabac67ab | 168 | if (strlen(MBED_CONF_APP_USSD_COMMAND_7) > 0) { |
RobMeades | 0:bb5fabac67ab | 169 | tr_debug("Sending : \"%s\".", MBED_CONF_APP_USSD_COMMAND_7); |
RobMeades | 0:bb5fabac67ab | 170 | TEST_ASSERT(pDriver->ussdCommand(MBED_CONF_APP_USSD_COMMAND_7, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 171 | tr_debug("USSD answer: \"%s\".", buf); |
RobMeades | 0:bb5fabac67ab | 172 | } |
RobMeades | 0:bb5fabac67ab | 173 | |
RobMeades | 0:bb5fabac67ab | 174 | if (strlen(MBED_CONF_APP_USSD_COMMAND_8) > 0) { |
RobMeades | 0:bb5fabac67ab | 175 | tr_debug("Sending : \"%s\".", MBED_CONF_APP_USSD_COMMAND_8); |
RobMeades | 0:bb5fabac67ab | 176 | TEST_ASSERT(pDriver->ussdCommand(MBED_CONF_APP_USSD_COMMAND_8, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 177 | tr_debug("USSD answer: \"%s\".", buf); |
RobMeades | 0:bb5fabac67ab | 178 | } |
RobMeades | 0:bb5fabac67ab | 179 | |
RobMeades | 0:bb5fabac67ab | 180 | if (strlen(MBED_CONF_APP_USSD_COMMAND_9) > 0) { |
RobMeades | 0:bb5fabac67ab | 181 | tr_debug("Sending : \"%s\".", MBED_CONF_APP_USSD_COMMAND_9); |
RobMeades | 0:bb5fabac67ab | 182 | TEST_ASSERT(pDriver->ussdCommand(MBED_CONF_APP_USSD_COMMAND_9, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 183 | tr_debug("USSD answer: \"%s\".", buf); |
RobMeades | 0:bb5fabac67ab | 184 | } |
RobMeades | 0:bb5fabac67ab | 185 | |
RobMeades | 0:bb5fabac67ab | 186 | if (strlen(MBED_CONF_APP_USSD_COMMAND_10) > 0) { |
RobMeades | 0:bb5fabac67ab | 187 | tr_debug("Sending : \"%s\".", MBED_CONF_APP_USSD_COMMAND_10); |
RobMeades | 0:bb5fabac67ab | 188 | TEST_ASSERT(pDriver->ussdCommand(MBED_CONF_APP_USSD_COMMAND_10, buf, sizeof (buf))); |
RobMeades | 0:bb5fabac67ab | 189 | tr_debug("USSD answer: \"%s\".", buf); |
RobMeades | 0:bb5fabac67ab | 190 | } |
RobMeades | 0:bb5fabac67ab | 191 | |
RobMeades | 0:bb5fabac67ab | 192 | TEST_ASSERT(pDriver->nwk_deregistration()); |
RobMeades | 0:bb5fabac67ab | 193 | } |
RobMeades | 0:bb5fabac67ab | 194 | |
RobMeades | 0:bb5fabac67ab | 195 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 196 | // TEST ENVIRONMENT |
RobMeades | 0:bb5fabac67ab | 197 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 198 | |
RobMeades | 0:bb5fabac67ab | 199 | // Setup the test environment |
RobMeades | 0:bb5fabac67ab | 200 | utest::v1::status_t test_setup(const size_t number_of_cases) { |
RobMeades | 0:bb5fabac67ab | 201 | // Setup Greentea with a timeout |
RobMeades | 0:bb5fabac67ab | 202 | GREENTEA_SETUP(180, "default_auto"); |
RobMeades | 0:bb5fabac67ab | 203 | return verbose_test_setup_handler(number_of_cases); |
RobMeades | 0:bb5fabac67ab | 204 | } |
RobMeades | 0:bb5fabac67ab | 205 | |
RobMeades | 0:bb5fabac67ab | 206 | // Test cases |
RobMeades | 0:bb5fabac67ab | 207 | Case cases[] = { |
RobMeades | 0:bb5fabac67ab | 208 | Case("USSD test", test_ussd) |
RobMeades | 0:bb5fabac67ab | 209 | |
RobMeades | 0:bb5fabac67ab | 210 | }; |
RobMeades | 0:bb5fabac67ab | 211 | |
RobMeades | 0:bb5fabac67ab | 212 | Specification specification(test_setup, cases); |
RobMeades | 0:bb5fabac67ab | 213 | |
RobMeades | 0:bb5fabac67ab | 214 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 215 | // MAIN |
RobMeades | 0:bb5fabac67ab | 216 | // ---------------------------------------------------------------- |
RobMeades | 0:bb5fabac67ab | 217 | |
RobMeades | 0:bb5fabac67ab | 218 | int main() { |
RobMeades | 0:bb5fabac67ab | 219 | |
rob.meades@u-blox.com | 3:027c9eaec52c | 220 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 0:bb5fabac67ab | 221 | mbed_trace_init(); |
RobMeades | 0:bb5fabac67ab | 222 | |
RobMeades | 0:bb5fabac67ab | 223 | mbed_trace_mutex_wait_function_set(lock); |
RobMeades | 0:bb5fabac67ab | 224 | mbed_trace_mutex_release_function_set(unlock); |
rob.meades@u-blox.com | 3:027c9eaec52c | 225 | #endif |
RobMeades | 0:bb5fabac67ab | 226 | |
RobMeades | 0:bb5fabac67ab | 227 | // Run tests |
RobMeades | 0:bb5fabac67ab | 228 | return !Harness::run(specification); |
RobMeades | 0:bb5fabac67ab | 229 | } |
RobMeades | 0:bb5fabac67ab | 230 | |
RobMeades | 0:bb5fabac67ab | 231 | // End Of File |
RobMeades | 0:bb5fabac67ab | 232 |