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

Dependencies:   RadioHeadLite

Committer:
rlanders73
Date:
Sat Nov 24 05:53:37 2018 +0000
Revision:
0:f4015c8e84c3
Child:
1:75d533f15c95
added modem stuff to form "blinky"

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 0:f4015c8e84c3 5 #define PASSTHROUGH 1
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 0:f4015c8e84c3 9 Serial modemSerial(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 0:f4015c8e84c3 30 Thread passThread;
rlanders73 0:f4015c8e84c3 31
rlanders73 0:f4015c8e84c3 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 0:f4015c8e84c3 47 uint8_t buffer[64];
rlanders73 0:f4015c8e84c3 48
rlanders73 0:f4015c8e84c3 49 #if PASSTHROUGH
rlanders73 0:f4015c8e84c3 50 static void passthroughThread(void)
rlanders73 0:f4015c8e84c3 51 {
rlanders73 0:f4015c8e84c3 52
rlanders73 0:f4015c8e84c3 53 while (1)
rlanders73 0:f4015c8e84c3 54 {
rlanders73 0:f4015c8e84c3 55 // Housekeeping - check button
rlanders73 0:f4015c8e84c3 56 if (pc.readable())
rlanders73 0:f4015c8e84c3 57 {
rlanders73 0:f4015c8e84c3 58 char c = pc.getc(); // grab the available character
rlanders73 0:f4015c8e84c3 59 pc.putc(c); // provide local echo
rlanders73 0:f4015c8e84c3 60 modemSerial.putc(c);// push the charcter to the modem
rlanders73 0:f4015c8e84c3 61 }
rlanders73 0:f4015c8e84c3 62
rlanders73 0:f4015c8e84c3 63 if (modemSerial.readable())
rlanders73 0:f4015c8e84c3 64 {
rlanders73 0:f4015c8e84c3 65 pc.putc(modemSerial.getc());
rlanders73 0:f4015c8e84c3 66 }
rlanders73 0:f4015c8e84c3 67 }
rlanders73 0:f4015c8e84c3 68 }
rlanders73 0:f4015c8e84c3 69 #endif
rlanders73 0:f4015c8e84c3 70
rlanders73 0:f4015c8e84c3 71 static void buttonPushed(void)
rlanders73 0:f4015c8e84c3 72 {
rlanders73 0:f4015c8e84c3 73 buttonWasPushed = true;
rlanders73 0:f4015c8e84c3 74 }
rlanders73 0:f4015c8e84c3 75
rlanders73 0:f4015c8e84c3 76
rlanders73 0:f4015c8e84c3 77
rlanders73 0:f4015c8e84c3 78
rlanders73 0:f4015c8e84c3 79 int main(void)
rlanders73 0:f4015c8e84c3 80 {
rlanders73 0:f4015c8e84c3 81 // Enable flow control on MDM uart
rlanders73 0:f4015c8e84c3 82 //modemUartSerial.set_flow_control(SerialBase::RTSCTS, MDMRTS, MDMCTS);
rlanders73 0:f4015c8e84c3 83
rlanders73 0:f4015c8e84c3 84 buttonInt.mode(PullUp);
rlanders73 0:f4015c8e84c3 85 buttonInt.fall(buttonPushed);
rlanders73 0:f4015c8e84c3 86
rlanders73 0:f4015c8e84c3 87 cellRst.mode(OpenDrainNoPull);
rlanders73 0:f4015c8e84c3 88 cellRst.output();
rlanders73 0:f4015c8e84c3 89 cellRst = 1;
rlanders73 0:f4015c8e84c3 90
rlanders73 0:f4015c8e84c3 91 cellPwrKey.mode(OpenDrainNoPull);
rlanders73 0:f4015c8e84c3 92 cellPwrKey.output();
rlanders73 0:f4015c8e84c3 93 cellPwrKey = 1;
rlanders73 0:f4015c8e84c3 94
rlanders73 0:f4015c8e84c3 95 wait(1); // wait just a bit for the USB to enumerate
rlanders73 0:f4015c8e84c3 96
rlanders73 0:f4015c8e84c3 97 pc.printf("Modem Test\r\n", 12);
rlanders73 0:f4015c8e84c3 98
rlanders73 0:f4015c8e84c3 99 pc.set_blocking(false);
rlanders73 0:f4015c8e84c3 100 modemSerial.set_blocking(false);
rlanders73 0:f4015c8e84c3 101
rlanders73 0:f4015c8e84c3 102 // Power up the modem!
rlanders73 0:f4015c8e84c3 103 cellVcc = 1;
rlanders73 0:f4015c8e84c3 104 pc.printf("Modem VCC UP\r\n", 14);
rlanders73 0:f4015c8e84c3 105 wait(3);
rlanders73 0:f4015c8e84c3 106
rlanders73 0:f4015c8e84c3 107 cellPwrKey = 0;
rlanders73 0:f4015c8e84c3 108 wait(0.9);
rlanders73 0:f4015c8e84c3 109 cellPwrKey = 1;
rlanders73 0:f4015c8e84c3 110 pc.printf("Modem Power\r\n", 13);
rlanders73 0:f4015c8e84c3 111
rlanders73 0:f4015c8e84c3 112 redLed = 0;
rlanders73 0:f4015c8e84c3 113
rlanders73 0:f4015c8e84c3 114 wait(5);
rlanders73 0:f4015c8e84c3 115
rlanders73 0:f4015c8e84c3 116 #if PASSTHROUGH
rlanders73 0:f4015c8e84c3 117 pc.printf("Passthrough mode\r\n", 18);
rlanders73 0:f4015c8e84c3 118 blueLed = 0;
rlanders73 0:f4015c8e84c3 119 passThread.start(passthroughThread);
rlanders73 0:f4015c8e84c3 120
rlanders73 0:f4015c8e84c3 121 #else
rlanders73 0:f4015c8e84c3 122 pc.printf("Auto mode\r\n", 11);
rlanders73 0:f4015c8e84c3 123
rlanders73 0:f4015c8e84c3 124 cell.fileHandle = &modemUartSerial;
rlanders73 0:f4015c8e84c3 125 cell.rawParser = new ATCmdParser(cell.fileHandle);
rlanders73 0:f4015c8e84c3 126 cell.rawParser->flush();
rlanders73 0:f4015c8e84c3 127 cell.rawParser->debug_on(1);
rlanders73 0:f4015c8e84c3 128 cell.rawParser->set_timeout(2000);
rlanders73 0:f4015c8e84c3 129
rlanders73 0:f4015c8e84c3 130 while (1)
rlanders73 0:f4015c8e84c3 131 {
rlanders73 0:f4015c8e84c3 132 cell.rawParser->send("AT");
rlanders73 0:f4015c8e84c3 133 if (cell.rawParser->recv("OK"))
rlanders73 0:f4015c8e84c3 134 break;
rlanders73 0:f4015c8e84c3 135 wait(1.5);
rlanders73 0:f4015c8e84c3 136 }
rlanders73 0:f4015c8e84c3 137
rlanders73 0:f4015c8e84c3 138 redLed = 1;
rlanders73 0:f4015c8e84c3 139 blueLed = 0;
rlanders73 0:f4015c8e84c3 140 pc.printf("Modem OK\r\n");
rlanders73 0:f4015c8e84c3 141 wait(5);
rlanders73 0:f4015c8e84c3 142
rlanders73 0:f4015c8e84c3 143 cell.rawParser->set_timeout(15000);
rlanders73 0:f4015c8e84c3 144
rlanders73 0:f4015c8e84c3 145 while (1)
rlanders73 0:f4015c8e84c3 146 {
rlanders73 0:f4015c8e84c3 147 cell.rawParser->send("AT+CCID");
rlanders73 0:f4015c8e84c3 148 if (cell.rawParser->recv("OK"))
rlanders73 0:f4015c8e84c3 149 {
rlanders73 0:f4015c8e84c3 150 break;
rlanders73 0:f4015c8e84c3 151 }
rlanders73 0:f4015c8e84c3 152 wait(4.5);
rlanders73 0:f4015c8e84c3 153 }
rlanders73 0:f4015c8e84c3 154
rlanders73 0:f4015c8e84c3 155 blueLed = 1;
rlanders73 0:f4015c8e84c3 156 greenLed = 0;
rlanders73 0:f4015c8e84c3 157 pc.printf("SIM OK\r\n");
rlanders73 0:f4015c8e84c3 158 wait(2);
rlanders73 0:f4015c8e84c3 159
rlanders73 0:f4015c8e84c3 160 int act;
rlanders73 0:f4015c8e84c3 161 char plmn[8];
rlanders73 0:f4015c8e84c3 162 bool result;
rlanders73 0:f4015c8e84c3 163
rlanders73 0:f4015c8e84c3 164 cell.rawParser->set_timeout(20000);
rlanders73 0:f4015c8e84c3 165 cell.rawParser->send("AT+CMEE=2") && cell.rawParser->recv("OK");
rlanders73 0:f4015c8e84c3 166
rlanders73 0:f4015c8e84c3 167 while (1)
rlanders73 0:f4015c8e84c3 168 {
rlanders73 0:f4015c8e84c3 169 cell.rawParser->send("AT+COPS?");
rlanders73 0:f4015c8e84c3 170 result = cell.rawParser->recv("+COPS: %[^\n]\nOK\n", scanBuffer);
rlanders73 0:f4015c8e84c3 171 if (true == result)
rlanders73 0:f4015c8e84c3 172 {
rlanders73 0:f4015c8e84c3 173 // Parse the registration status
rlanders73 0:f4015c8e84c3 174 if (sscanf(scanBuffer, "%*d, %*d, \"%[^\"]\", %d", plmn, &act) == 2)
rlanders73 0:f4015c8e84c3 175 {
rlanders73 0:f4015c8e84c3 176 if (act == 8)
rlanders73 0:f4015c8e84c3 177 break;
rlanders73 0:f4015c8e84c3 178 }
rlanders73 0:f4015c8e84c3 179 }
rlanders73 0:f4015c8e84c3 180 wait(3);
rlanders73 0:f4015c8e84c3 181 }
rlanders73 0:f4015c8e84c3 182
rlanders73 0:f4015c8e84c3 183 pc.printf("Network OK\r\n");
rlanders73 0:f4015c8e84c3 184
rlanders73 0:f4015c8e84c3 185 while (1)
rlanders73 0:f4015c8e84c3 186 {
rlanders73 0:f4015c8e84c3 187 greenLed = 1;
rlanders73 0:f4015c8e84c3 188 wait(0.75);
rlanders73 0:f4015c8e84c3 189 greenLed = 0;
rlanders73 0:f4015c8e84c3 190 wait(0.75);
rlanders73 0:f4015c8e84c3 191 if (buttonWasPushed)
rlanders73 0:f4015c8e84c3 192 break;
rlanders73 0:f4015c8e84c3 193 }
rlanders73 0:f4015c8e84c3 194
rlanders73 0:f4015c8e84c3 195 cell.rawParser->send("AT+COPS=2") && cell.rawParser->recv("OK");
rlanders73 0:f4015c8e84c3 196
rlanders73 0:f4015c8e84c3 197 #endif
rlanders73 0:f4015c8e84c3 198
rlanders73 0:f4015c8e84c3 199 Thread::wait(osWaitForever);
rlanders73 0:f4015c8e84c3 200
rlanders73 0:f4015c8e84c3 201 return 1;
rlanders73 0:f4015c8e84c3 202 }
rlanders73 0:f4015c8e84c3 203
rlanders73 0:f4015c8e84c3 204