This is an example program that shows how to use the RadioHeadLite library, and does it using threads.

Dependencies:   RadioHeadLite

Committer:
rlanders73
Date:
Mon Nov 26 21:01:04 2018 +0000
Revision:
1:75d533f15c95
Parent:
0:f4015c8e84c3
Child:
2:57fefd8ae87c
merged in _write and _read functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rlanders73 0:f4015c8e84c3 1 #include "mbed.h"
rlanders73 0:f4015c8e84c3 2 #include "USBSerial.h"
rlanders73 0:f4015c8e84c3 3 #include "Geneva.h"
rlanders73 0:f4015c8e84c3 4
rlanders73 1:75d533f15c95 5 #define PASSTHROUGH 0
rlanders73 0:f4015c8e84c3 6
rlanders73 0:f4015c8e84c3 7 /******************** Comms *********************/
rlanders73 0:f4015c8e84c3 8 USBSerial pc; // moved the pc interface to the USB serial device
rlanders73 1:75d533f15c95 9 UARTSerial modemUartSerial(MDMTXD, MDMRXD, 115200);
rlanders73 0:f4015c8e84c3 10
rlanders73 0:f4015c8e84c3 11
rlanders73 0:f4015c8e84c3 12 DigitalInOut cellRst(MDMRST);
rlanders73 0:f4015c8e84c3 13 DigitalInOut cellPwrKey(MDMPWRON);
rlanders73 0:f4015c8e84c3 14 DigitalOut cellVcc(MDMVCC, 0);
rlanders73 0:f4015c8e84c3 15 DigitalOut cellRts(MDMRTS, 0); // Flow control not supported by 410, but RTS must be low
rlanders73 0:f4015c8e84c3 16 DigitalOut cellCts(MDMCTS, 0);
rlanders73 0:f4015c8e84c3 17
rlanders73 0:f4015c8e84c3 18 DigitalOut gpsEn(PC_3, 0);
rlanders73 0:f4015c8e84c3 19 DigitalOut bleRst(PB_5, 0);
rlanders73 0:f4015c8e84c3 20
rlanders73 0:f4015c8e84c3 21 DigitalOut greenLed(LED_GREEN, 1);
rlanders73 0:f4015c8e84c3 22 DigitalOut blueLed(LED_BLUE, 1);
rlanders73 0:f4015c8e84c3 23 DigitalOut redLed(LED_RED, 1);
rlanders73 0:f4015c8e84c3 24
rlanders73 0:f4015c8e84c3 25 InterruptIn buttonInt(USER_BUTTON);
rlanders73 0:f4015c8e84c3 26
rlanders73 0:f4015c8e84c3 27 InterruptIn *rxPin;
rlanders73 0:f4015c8e84c3 28 DigitalOut samplePin(PA_0);
rlanders73 0:f4015c8e84c3 29
rlanders73 1:75d533f15c95 30 Thread myThread;
rlanders73 0:f4015c8e84c3 31
rlanders73 1:75d533f15c95 32 static char scanBuffer[512];
rlanders73 0:f4015c8e84c3 33 static bool buttonWasPushed = false;
rlanders73 0:f4015c8e84c3 34
rlanders73 0:f4015c8e84c3 35 typedef struct
rlanders73 0:f4015c8e84c3 36 {
rlanders73 0:f4015c8e84c3 37 DigitalOut *resetPin;
rlanders73 0:f4015c8e84c3 38 DigitalOut *enablePin;
rlanders73 0:f4015c8e84c3 39 DigitalOut *dtrPin;
rlanders73 0:f4015c8e84c3 40 FileHandle *fileHandle;
rlanders73 0:f4015c8e84c3 41 ATCmdParser *rawParser;
rlanders73 0:f4015c8e84c3 42 UARTSerial *serial;
rlanders73 0:f4015c8e84c3 43 } cellContext_t;
rlanders73 0:f4015c8e84c3 44
rlanders73 0:f4015c8e84c3 45 cellContext_t cell;
rlanders73 0:f4015c8e84c3 46
rlanders73 1:75d533f15c95 47 char buffer[64];
rlanders73 0:f4015c8e84c3 48
rlanders73 0:f4015c8e84c3 49 static void buttonPushed(void)
rlanders73 0:f4015c8e84c3 50 {
rlanders73 0:f4015c8e84c3 51 buttonWasPushed = true;
rlanders73 0:f4015c8e84c3 52 }
rlanders73 0:f4015c8e84c3 53
rlanders73 1:75d533f15c95 54 #if PASSTHROUGH
rlanders73 1:75d533f15c95 55 static void passthroughThread(void)
rlanders73 0:f4015c8e84c3 56 {
rlanders73 1:75d533f15c95 57 char c;
rlanders73 1:75d533f15c95 58 pc.printf("Passthrough mode\r\n");
rlanders73 1:75d533f15c95 59 blueLed = 0;
rlanders73 0:f4015c8e84c3 60
rlanders73 1:75d533f15c95 61 while (1)
rlanders73 1:75d533f15c95 62 {
rlanders73 1:75d533f15c95 63 // Housekeeping - check button
rlanders73 1:75d533f15c95 64 if (pc.readable())
rlanders73 1:75d533f15c95 65 {
rlanders73 1:75d533f15c95 66 c = pc.getc();
rlanders73 1:75d533f15c95 67 modemUartSerial.write(&c, 1);// push the charcter to the modem
rlanders73 1:75d533f15c95 68 }
rlanders73 0:f4015c8e84c3 69
rlanders73 1:75d533f15c95 70 if (modemUartSerial.readable())
rlanders73 1:75d533f15c95 71 {
rlanders73 1:75d533f15c95 72 modemUartSerial.read(&c, 1);
rlanders73 1:75d533f15c95 73 pc.putc(c);
rlanders73 1:75d533f15c95 74 }
rlanders73 1:75d533f15c95 75 }
rlanders73 1:75d533f15c95 76 }
rlanders73 0:f4015c8e84c3 77
rlanders73 0:f4015c8e84c3 78 #else
rlanders73 1:75d533f15c95 79
rlanders73 1:75d533f15c95 80 static void autoModeThread(void)
rlanders73 1:75d533f15c95 81 {
rlanders73 0:f4015c8e84c3 82 pc.printf("Auto mode\r\n", 11);
rlanders73 0:f4015c8e84c3 83
rlanders73 0:f4015c8e84c3 84 cell.fileHandle = &modemUartSerial;
rlanders73 0:f4015c8e84c3 85 cell.rawParser = new ATCmdParser(cell.fileHandle);
rlanders73 0:f4015c8e84c3 86 cell.rawParser->flush();
rlanders73 0:f4015c8e84c3 87 cell.rawParser->debug_on(1);
rlanders73 0:f4015c8e84c3 88 cell.rawParser->set_timeout(2000);
rlanders73 0:f4015c8e84c3 89
rlanders73 0:f4015c8e84c3 90 while (1)
rlanders73 0:f4015c8e84c3 91 {
rlanders73 0:f4015c8e84c3 92 cell.rawParser->send("AT");
rlanders73 0:f4015c8e84c3 93 if (cell.rawParser->recv("OK"))
rlanders73 0:f4015c8e84c3 94 break;
rlanders73 0:f4015c8e84c3 95 wait(1.5);
rlanders73 0:f4015c8e84c3 96 }
rlanders73 0:f4015c8e84c3 97
rlanders73 0:f4015c8e84c3 98 redLed = 1;
rlanders73 0:f4015c8e84c3 99 blueLed = 0;
rlanders73 0:f4015c8e84c3 100 pc.printf("Modem OK\r\n");
rlanders73 0:f4015c8e84c3 101 wait(5);
rlanders73 0:f4015c8e84c3 102
rlanders73 0:f4015c8e84c3 103 cell.rawParser->set_timeout(15000);
rlanders73 0:f4015c8e84c3 104
rlanders73 0:f4015c8e84c3 105 while (1)
rlanders73 0:f4015c8e84c3 106 {
rlanders73 0:f4015c8e84c3 107 cell.rawParser->send("AT+CCID");
rlanders73 0:f4015c8e84c3 108 if (cell.rawParser->recv("OK"))
rlanders73 0:f4015c8e84c3 109 {
rlanders73 0:f4015c8e84c3 110 break;
rlanders73 0:f4015c8e84c3 111 }
rlanders73 0:f4015c8e84c3 112 wait(4.5);
rlanders73 0:f4015c8e84c3 113 }
rlanders73 0:f4015c8e84c3 114
rlanders73 0:f4015c8e84c3 115 blueLed = 1;
rlanders73 0:f4015c8e84c3 116 greenLed = 0;
rlanders73 0:f4015c8e84c3 117 pc.printf("SIM OK\r\n");
rlanders73 0:f4015c8e84c3 118 wait(2);
rlanders73 0:f4015c8e84c3 119
rlanders73 0:f4015c8e84c3 120 int act;
rlanders73 0:f4015c8e84c3 121 char plmn[8];
rlanders73 0:f4015c8e84c3 122 bool result;
rlanders73 0:f4015c8e84c3 123
rlanders73 0:f4015c8e84c3 124 cell.rawParser->set_timeout(20000);
rlanders73 0:f4015c8e84c3 125 cell.rawParser->send("AT+CMEE=2") && cell.rawParser->recv("OK");
rlanders73 0:f4015c8e84c3 126
rlanders73 0:f4015c8e84c3 127 while (1)
rlanders73 0:f4015c8e84c3 128 {
rlanders73 0:f4015c8e84c3 129 cell.rawParser->send("AT+COPS?");
rlanders73 0:f4015c8e84c3 130 result = cell.rawParser->recv("+COPS: %[^\n]\nOK\n", scanBuffer);
rlanders73 0:f4015c8e84c3 131 if (true == result)
rlanders73 0:f4015c8e84c3 132 {
rlanders73 0:f4015c8e84c3 133 // Parse the registration status
rlanders73 0:f4015c8e84c3 134 if (sscanf(scanBuffer, "%*d, %*d, \"%[^\"]\", %d", plmn, &act) == 2)
rlanders73 0:f4015c8e84c3 135 {
rlanders73 0:f4015c8e84c3 136 if (act == 8)
rlanders73 0:f4015c8e84c3 137 break;
rlanders73 0:f4015c8e84c3 138 }
rlanders73 0:f4015c8e84c3 139 }
rlanders73 0:f4015c8e84c3 140 wait(3);
rlanders73 0:f4015c8e84c3 141 }
rlanders73 0:f4015c8e84c3 142
rlanders73 0:f4015c8e84c3 143 pc.printf("Network OK\r\n");
rlanders73 0:f4015c8e84c3 144
rlanders73 0:f4015c8e84c3 145 while (1)
rlanders73 0:f4015c8e84c3 146 {
rlanders73 0:f4015c8e84c3 147 greenLed = 1;
rlanders73 0:f4015c8e84c3 148 wait(0.75);
rlanders73 0:f4015c8e84c3 149 greenLed = 0;
rlanders73 0:f4015c8e84c3 150 wait(0.75);
rlanders73 0:f4015c8e84c3 151 if (buttonWasPushed)
rlanders73 0:f4015c8e84c3 152 break;
rlanders73 0:f4015c8e84c3 153 }
rlanders73 0:f4015c8e84c3 154
rlanders73 0:f4015c8e84c3 155 cell.rawParser->send("AT+COPS=2") && cell.rawParser->recv("OK");
rlanders73 1:75d533f15c95 156 }
rlanders73 1:75d533f15c95 157 #endif
rlanders73 1:75d533f15c95 158 void setup(void)
rlanders73 1:75d533f15c95 159 {
rlanders73 1:75d533f15c95 160 // Enable flow control on MDM uart
rlanders73 1:75d533f15c95 161 //modemUartSerial.set_flow_control(SerialBase::RTSCTS, MDMRTS, MDMCTS);
rlanders73 0:f4015c8e84c3 162
rlanders73 1:75d533f15c95 163 buttonInt.mode(PullUp);
rlanders73 1:75d533f15c95 164 buttonInt.fall(buttonPushed);
rlanders73 1:75d533f15c95 165
rlanders73 1:75d533f15c95 166 cellRst.mode(OpenDrainNoPull);
rlanders73 1:75d533f15c95 167 cellRst.output();
rlanders73 1:75d533f15c95 168 cellRst = 1;
rlanders73 1:75d533f15c95 169
rlanders73 1:75d533f15c95 170 cellPwrKey.mode(OpenDrainNoPull);
rlanders73 1:75d533f15c95 171 cellPwrKey.output();
rlanders73 1:75d533f15c95 172 cellPwrKey = 1;
rlanders73 1:75d533f15c95 173
rlanders73 1:75d533f15c95 174 wait(1); // wait just a bit for the USB to enumerate
rlanders73 1:75d533f15c95 175
rlanders73 1:75d533f15c95 176 pc.printf("Modem Test\r\n", 12);
rlanders73 1:75d533f15c95 177
rlanders73 1:75d533f15c95 178 pc.set_blocking(false);
rlanders73 1:75d533f15c95 179 modemUartSerial.set_blocking(false);
rlanders73 1:75d533f15c95 180
rlanders73 1:75d533f15c95 181 // Power up the modem!
rlanders73 1:75d533f15c95 182 cellVcc = 1;
rlanders73 1:75d533f15c95 183 pc.printf("Modem VCC UP\r\n", 14);
rlanders73 1:75d533f15c95 184 wait(3);
rlanders73 1:75d533f15c95 185
rlanders73 1:75d533f15c95 186 cellPwrKey = 0;
rlanders73 1:75d533f15c95 187 wait(0.9);
rlanders73 1:75d533f15c95 188 cellPwrKey = 1;
rlanders73 1:75d533f15c95 189 pc.printf("Modem Power\r\n", 13);
rlanders73 1:75d533f15c95 190
rlanders73 1:75d533f15c95 191 redLed = 0;
rlanders73 1:75d533f15c95 192
rlanders73 1:75d533f15c95 193 wait(5);
rlanders73 1:75d533f15c95 194 }
rlanders73 1:75d533f15c95 195
rlanders73 1:75d533f15c95 196 int main(void)
rlanders73 1:75d533f15c95 197 {
rlanders73 1:75d533f15c95 198 setup();
rlanders73 1:75d533f15c95 199
rlanders73 1:75d533f15c95 200 #if PASSTHROUGH
rlanders73 1:75d533f15c95 201 myThread.start(passthroughThread);
rlanders73 1:75d533f15c95 202 #else
rlanders73 1:75d533f15c95 203 myThread.start(autoModeThread);
rlanders73 0:f4015c8e84c3 204 #endif
rlanders73 0:f4015c8e84c3 205
rlanders73 0:f4015c8e84c3 206 Thread::wait(osWaitForever);
rlanders73 0:f4015c8e84c3 207
rlanders73 0:f4015c8e84c3 208 return 1;
rlanders73 0:f4015c8e84c3 209 }
rlanders73 0:f4015c8e84c3 210
rlanders73 0:f4015c8e84c3 211