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

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?

UserRevisionLine numberNew 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