This is a SLIP interface for the STM32F446RE Nucleo Board. It is designed to work specifically with the esp-link software for the ESP8266. The program is an example of a rest command.
main.cpp@4:31bed73a0d08, 2016-08-09 (annotated)
- Committer:
- ShaneKirkbride
- Date:
- Tue Aug 09 22:42:31 2016 +0000
- Revision:
- 4:31bed73a0d08
- Parent:
- 3:8ed85d940c4c
- Child:
- 5:9f3015b18b24
added interrupt driven interface;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ShaneKirkbride | 0:70a6082c1bf7 | 1 | /** |
ShaneKirkbride | 0:70a6082c1bf7 | 2 | * Simple example to demo the STM-Client REST calls |
ShaneKirkbride | 0:70a6082c1bf7 | 3 | */ |
ShaneKirkbride | 0:70a6082c1bf7 | 4 | #include "mbed.h" |
ShaneKirkbride | 4:31bed73a0d08 | 5 | |
ShaneKirkbride | 0:70a6082c1bf7 | 6 | #include <STMClient.h> |
ShaneKirkbride | 0:70a6082c1bf7 | 7 | #include <STMClientRest.h> |
ShaneKirkbride | 0:70a6082c1bf7 | 8 | |
ShaneKirkbride | 0:70a6082c1bf7 | 9 | /*-------- Check if platform compatible ----------*/ |
ShaneKirkbride | 0:70a6082c1bf7 | 10 | #if DEVICE_SERIAL_ASYNCH |
ShaneKirkbride | 4:31bed73a0d08 | 11 | Serial debugSerial(SERIAL_TX, SERIAL_RX); |
ShaneKirkbride | 4:31bed73a0d08 | 12 | Serial espSerial(PA_0, PA_1); |
ShaneKirkbride | 0:70a6082c1bf7 | 13 | #else |
ShaneKirkbride | 0:70a6082c1bf7 | 14 | #warning "Platform not compatible with Low Power APIs for Serial" |
ShaneKirkbride | 0:70a6082c1bf7 | 15 | Serial debugSerial(SERIAL_TX, SERIAL_RX); |
ShaneKirkbride | 0:70a6082c1bf7 | 16 | Serial espSerial(PA_0, PA_1); |
ShaneKirkbride | 0:70a6082c1bf7 | 17 | #endif |
ShaneKirkbride | 0:70a6082c1bf7 | 18 | |
ShaneKirkbride | 4:31bed73a0d08 | 19 | DigitalOut led1(LED1); |
ShaneKirkbride | 4:31bed73a0d08 | 20 | DigitalOut led2(LED2); |
ShaneKirkbride | 0:70a6082c1bf7 | 21 | |
ShaneKirkbride | 0:70a6082c1bf7 | 22 | // Initialize a connection to esp-link using the normal hardware serial port both for |
ShaneKirkbride | 0:70a6082c1bf7 | 23 | // SLIP and for debug messages. |
ShaneKirkbride | 0:70a6082c1bf7 | 24 | STMClient esp(&espSerial, &debugSerial); |
ShaneKirkbride | 0:70a6082c1bf7 | 25 | |
ShaneKirkbride | 0:70a6082c1bf7 | 26 | // Initialize a REST client on the connection to esp-link |
ShaneKirkbride | 0:70a6082c1bf7 | 27 | STMClientRest rest(&esp); |
ShaneKirkbride | 0:70a6082c1bf7 | 28 | bool wifiConnected = false; |
ShaneKirkbride | 4:31bed73a0d08 | 29 | Ticker flipper; |
ShaneKirkbride | 4:31bed73a0d08 | 30 | Ticker post_data; |
ShaneKirkbride | 4:31bed73a0d08 | 31 | bool posted = false; |
ShaneKirkbride | 0:70a6082c1bf7 | 32 | |
ShaneKirkbride | 0:70a6082c1bf7 | 33 | // Callback made from esp-link to notify of wifi status changes |
ShaneKirkbride | 0:70a6082c1bf7 | 34 | // Here we print something out and set a global flag |
ShaneKirkbride | 0:70a6082c1bf7 | 35 | void wifiCb(void *response) { |
ShaneKirkbride | 0:70a6082c1bf7 | 36 | debugSerial.printf("waiting for wifi status...\n\r"); //debug |
ShaneKirkbride | 0:70a6082c1bf7 | 37 | STMClientResponse *res = (STMClientResponse*)response; |
ShaneKirkbride | 0:70a6082c1bf7 | 38 | if (res->argc() == 1) { |
ShaneKirkbride | 0:70a6082c1bf7 | 39 | uint8_t status; |
ShaneKirkbride | 0:70a6082c1bf7 | 40 | res->popArg(&status, 1); |
ShaneKirkbride | 0:70a6082c1bf7 | 41 | debugSerial.printf("waiting for wifi status...\n\r"); |
ShaneKirkbride | 0:70a6082c1bf7 | 42 | if(status == STATION_GOT_IP) { |
ShaneKirkbride | 0:70a6082c1bf7 | 43 | debugSerial.printf("WIFI CONNECTED"); |
ShaneKirkbride | 0:70a6082c1bf7 | 44 | wifiConnected = true; |
ShaneKirkbride | 0:70a6082c1bf7 | 45 | } else { |
ShaneKirkbride | 0:70a6082c1bf7 | 46 | debugSerial.printf("WIFI NOT READY: %i",status); |
ShaneKirkbride | 0:70a6082c1bf7 | 47 | //Serial.printf(status); |
ShaneKirkbride | 0:70a6082c1bf7 | 48 | wifiConnected = false; |
ShaneKirkbride | 0:70a6082c1bf7 | 49 | } |
ShaneKirkbride | 0:70a6082c1bf7 | 50 | } |
ShaneKirkbride | 0:70a6082c1bf7 | 51 | } |
ShaneKirkbride | 0:70a6082c1bf7 | 52 | |
ShaneKirkbride | 4:31bed73a0d08 | 53 | #define BUFLEN 100 |
ShaneKirkbride | 4:31bed73a0d08 | 54 | char response[BUFLEN]; |
ShaneKirkbride | 0:70a6082c1bf7 | 55 | |
ShaneKirkbride | 1:99c58a942425 | 56 | char *loop_get() { |
ShaneKirkbride | 0:70a6082c1bf7 | 57 | //debugSerial.printf("begin main loop \n\r"); |
ShaneKirkbride | 0:70a6082c1bf7 | 58 | // process any callbacks coming from esp_link |
ShaneKirkbride | 0:70a6082c1bf7 | 59 | esp.Process(); |
ShaneKirkbride | 0:70a6082c1bf7 | 60 | debugSerial.printf("Wifi Connected: %i \n\r",wifiConnected); |
ShaneKirkbride | 0:70a6082c1bf7 | 61 | // if we're connected make an HTTP request |
ShaneKirkbride | 0:70a6082c1bf7 | 62 | while(wifiConnected) { |
ShaneKirkbride | 0:70a6082c1bf7 | 63 | // Request /utc/now from the previously set-up server |
ShaneKirkbride | 0:70a6082c1bf7 | 64 | rest.get("/utc/now"); |
ShaneKirkbride | 0:70a6082c1bf7 | 65 | |
ShaneKirkbride | 1:99c58a942425 | 66 | //char response[BUFLEN]; |
ShaneKirkbride | 0:70a6082c1bf7 | 67 | memset(response, 0, BUFLEN); |
ShaneKirkbride | 0:70a6082c1bf7 | 68 | uint16_t code = rest.waitResponse(response, BUFLEN); |
ShaneKirkbride | 0:70a6082c1bf7 | 69 | if(code == HTTP_STATUS_OK){ |
ShaneKirkbride | 0:70a6082c1bf7 | 70 | debugSerial.printf("STM: GET successful: %s\n\r", response); |
ShaneKirkbride | 1:99c58a942425 | 71 | wait(60); |
ShaneKirkbride | 1:99c58a942425 | 72 | return response; |
ShaneKirkbride | 0:70a6082c1bf7 | 73 | } else { |
ShaneKirkbride | 0:70a6082c1bf7 | 74 | debugSerial.printf("STM: GET failed: %i\n\r",code); |
ShaneKirkbride | 1:99c58a942425 | 75 | wait(60); |
ShaneKirkbride | 1:99c58a942425 | 76 | return (char *)code; |
ShaneKirkbride | 1:99c58a942425 | 77 | } |
ShaneKirkbride | 1:99c58a942425 | 78 | } |
ShaneKirkbride | 1:99c58a942425 | 79 | return "0"; |
ShaneKirkbride | 1:99c58a942425 | 80 | } |
ShaneKirkbride | 1:99c58a942425 | 81 | |
ShaneKirkbride | 1:99c58a942425 | 82 | int loop_post() { |
ShaneKirkbride | 4:31bed73a0d08 | 83 | posted = false; |
ShaneKirkbride | 4:31bed73a0d08 | 84 | |
ShaneKirkbride | 1:99c58a942425 | 85 | // process any callbacks coming from esp_link |
ShaneKirkbride | 1:99c58a942425 | 86 | esp.Process(); |
ShaneKirkbride | 4:31bed73a0d08 | 87 | |
ShaneKirkbride | 1:99c58a942425 | 88 | debugSerial.printf("Wifi Connected: %i \n\r",wifiConnected); |
ShaneKirkbride | 1:99c58a942425 | 89 | // if we're connected make an HTTP request |
ShaneKirkbride | 4:31bed73a0d08 | 90 | if(wifiConnected) { |
ShaneKirkbride | 4:31bed73a0d08 | 91 | |
ShaneKirkbride | 3:8ed85d940c4c | 92 | const char* T = "25"; |
ShaneKirkbride | 3:8ed85d940c4c | 93 | const char* L = "95"; |
ShaneKirkbride | 3:8ed85d940c4c | 94 | const char* H = "25"; |
ShaneKirkbride | 2:20ea1be14e4b | 95 | |
ShaneKirkbride | 4:31bed73a0d08 | 96 | /**make sure that the size of this array is consistent with the input string**/ |
ShaneKirkbride | 3:8ed85d940c4c | 97 | const char* body = ""; |
ShaneKirkbride | 4:31bed73a0d08 | 98 | char output [62]; |
ShaneKirkbride | 3:8ed85d940c4c | 99 | sprintf(output, "/update?api_key=3FF5CTKAJIU2IH0M&field1=%s&field2=%s&field3=%s", T,L,H); |
ShaneKirkbride | 3:8ed85d940c4c | 100 | //debugSerial.printf("output: %s \n\r", output); |
ShaneKirkbride | 4:31bed73a0d08 | 101 | //debugSerial.printf("size: %i \n\r", strlen(output)); |
ShaneKirkbride | 2:20ea1be14e4b | 102 | |
ShaneKirkbride | 3:8ed85d940c4c | 103 | rest.post(output, body); //basic post test |
ShaneKirkbride | 3:8ed85d940c4c | 104 | |
ShaneKirkbride | 1:99c58a942425 | 105 | char response[BUFLEN]; |
ShaneKirkbride | 1:99c58a942425 | 106 | memset(response, 0, BUFLEN); |
ShaneKirkbride | 1:99c58a942425 | 107 | uint16_t code = rest.waitResponse(response, BUFLEN); |
ShaneKirkbride | 1:99c58a942425 | 108 | if(code == HTTP_STATUS_OK){ |
ShaneKirkbride | 1:99c58a942425 | 109 | debugSerial.printf("STM: POST successful: %s\n\r", response); |
ShaneKirkbride | 2:20ea1be14e4b | 110 | }else { |
ShaneKirkbride | 1:99c58a942425 | 111 | debugSerial.printf("STM: POST failed: %i\n\r",code); |
ShaneKirkbride | 4:31bed73a0d08 | 112 | return 1; |
ShaneKirkbride | 0:70a6082c1bf7 | 113 | } |
ShaneKirkbride | 4:31bed73a0d08 | 114 | }else{ |
ShaneKirkbride | 4:31bed73a0d08 | 115 | debugSerial.printf("STM: wifi NOT connected: %i\n\r",wifiConnected); |
ShaneKirkbride | 4:31bed73a0d08 | 116 | return 1; |
ShaneKirkbride | 4:31bed73a0d08 | 117 | } |
ShaneKirkbride | 4:31bed73a0d08 | 118 | //debugSerial.printf("Exiting...\n\r"); |
ShaneKirkbride | 4:31bed73a0d08 | 119 | return 0; |
ShaneKirkbride | 0:70a6082c1bf7 | 120 | } |
ShaneKirkbride | 0:70a6082c1bf7 | 121 | |
ShaneKirkbride | 4:31bed73a0d08 | 122 | void flip() { |
ShaneKirkbride | 4:31bed73a0d08 | 123 | |
ShaneKirkbride | 4:31bed73a0d08 | 124 | int postVal = loop_post(); |
ShaneKirkbride | 4:31bed73a0d08 | 125 | if(!postVal) |
ShaneKirkbride | 4:31bed73a0d08 | 126 | { |
ShaneKirkbride | 4:31bed73a0d08 | 127 | posted = true; |
ShaneKirkbride | 4:31bed73a0d08 | 128 | }else{ |
ShaneKirkbride | 4:31bed73a0d08 | 129 | debugSerial.printf("error...%i\n\r",postVal); |
ShaneKirkbride | 4:31bed73a0d08 | 130 | posted = false; |
ShaneKirkbride | 4:31bed73a0d08 | 131 | } |
ShaneKirkbride | 4:31bed73a0d08 | 132 | } |
ShaneKirkbride | 1:99c58a942425 | 133 | |
ShaneKirkbride | 0:70a6082c1bf7 | 134 | int main() { |
ShaneKirkbride | 4:31bed73a0d08 | 135 | //setup |
ShaneKirkbride | 0:70a6082c1bf7 | 136 | led1=0; |
ShaneKirkbride | 0:70a6082c1bf7 | 137 | debugSerial.baud(115200); // the baud rate here needs to match the esp-link config |
ShaneKirkbride | 0:70a6082c1bf7 | 138 | espSerial.baud(115200); |
ShaneKirkbride | 0:70a6082c1bf7 | 139 | |
ShaneKirkbride | 0:70a6082c1bf7 | 140 | debugSerial.printf("STM-Client starting!\n\r"); |
ShaneKirkbride | 0:70a6082c1bf7 | 141 | wait(0.5); |
ShaneKirkbride | 0:70a6082c1bf7 | 142 | |
ShaneKirkbride | 0:70a6082c1bf7 | 143 | espSerial.printf("STM-Client starting!\n\r"); |
ShaneKirkbride | 0:70a6082c1bf7 | 144 | wait(0.5); |
ShaneKirkbride | 0:70a6082c1bf7 | 145 | |
ShaneKirkbride | 0:70a6082c1bf7 | 146 | // Sync-up with esp-link, this is required at the start of any sketch and initializes the |
ShaneKirkbride | 0:70a6082c1bf7 | 147 | // callbacks to the wifi status change callback. The callback gets called with the initial |
ShaneKirkbride | 0:70a6082c1bf7 | 148 | // status right after Sync() below completes. |
ShaneKirkbride | 0:70a6082c1bf7 | 149 | esp.wifiCb.attach(wifiCb); // wifi status change callback, optional (delete if not desired) |
ShaneKirkbride | 0:70a6082c1bf7 | 150 | bool ok; |
ShaneKirkbride | 0:70a6082c1bf7 | 151 | do { |
ShaneKirkbride | 0:70a6082c1bf7 | 152 | //debugSerial.printf("main syncing..\n\r"); |
ShaneKirkbride | 0:70a6082c1bf7 | 153 | wait(0.5); |
ShaneKirkbride | 0:70a6082c1bf7 | 154 | ok = esp.Sync(); // sync up with esp-link, blocks for up to 2 seconds |
ShaneKirkbride | 0:70a6082c1bf7 | 155 | if (!ok){ |
ShaneKirkbride | 0:70a6082c1bf7 | 156 | debugSerial.printf("STM-Client sync failed!\n\r"); |
ShaneKirkbride | 0:70a6082c1bf7 | 157 | wait(0.5); |
ShaneKirkbride | 0:70a6082c1bf7 | 158 | } |
ShaneKirkbride | 0:70a6082c1bf7 | 159 | } while(!ok); |
ShaneKirkbride | 0:70a6082c1bf7 | 160 | |
ShaneKirkbride | 0:70a6082c1bf7 | 161 | debugSerial.printf("STM-Client synced!\n\r"); |
ShaneKirkbride | 0:70a6082c1bf7 | 162 | |
ShaneKirkbride | 0:70a6082c1bf7 | 163 | // Get immediate wifi status info for demo purposes. This is not normally used because the |
ShaneKirkbride | 0:70a6082c1bf7 | 164 | // wifi status callback registered above gets called immediately. |
ShaneKirkbride | 0:70a6082c1bf7 | 165 | esp.GetWifiStatus(); |
ShaneKirkbride | 0:70a6082c1bf7 | 166 | STMClientPacket *packet; |
ShaneKirkbride | 0:70a6082c1bf7 | 167 | if ((packet=esp.WaitReturn()) != NULL) |
ShaneKirkbride | 0:70a6082c1bf7 | 168 | { |
ShaneKirkbride | 0:70a6082c1bf7 | 169 | //debugSerial.printf("Wifi status: %i\n\r", packet->value); |
ShaneKirkbride | 0:70a6082c1bf7 | 170 | //debugSerial.printf("waiting for wifi status...\n\r"); |
ShaneKirkbride | 1:99c58a942425 | 171 | if(packet->value >= 1) { ///ideally this would coincide with STATION_GOT_IP... |
ShaneKirkbride | 0:70a6082c1bf7 | 172 | debugSerial.printf("WIFI CONNECTED\n\r"); |
ShaneKirkbride | 0:70a6082c1bf7 | 173 | wifiConnected = true; |
ShaneKirkbride | 0:70a6082c1bf7 | 174 | } else { |
ShaneKirkbride | 0:70a6082c1bf7 | 175 | debugSerial.printf("WIFI NOT READY: %i\n\r",packet->value); |
ShaneKirkbride | 0:70a6082c1bf7 | 176 | //Serial.printf(status); |
ShaneKirkbride | 0:70a6082c1bf7 | 177 | wifiConnected = false; |
ShaneKirkbride | 0:70a6082c1bf7 | 178 | } |
ShaneKirkbride | 4:31bed73a0d08 | 179 | } |
ShaneKirkbride | 0:70a6082c1bf7 | 180 | |
ShaneKirkbride | 0:70a6082c1bf7 | 181 | // Set up the REST client to talk to www.timeapi.org, this doesn't connect to that server, |
ShaneKirkbride | 0:70a6082c1bf7 | 182 | // it just sets-up stuff on the esp-link side |
ShaneKirkbride | 2:20ea1be14e4b | 183 | //int err = rest.begin("www.timeapi.org"); //for basic example of get |
ShaneKirkbride | 3:8ed85d940c4c | 184 | const char* host = "api.thingspeak.com"; |
ShaneKirkbride | 3:8ed85d940c4c | 185 | //const char* host = "posttestserver.com"; |
ShaneKirkbride | 2:20ea1be14e4b | 186 | //const char* host = "vivaplanetbusservicedev.servicebus.windows.net"; |
ShaneKirkbride | 3:8ed85d940c4c | 187 | uint16_t port = 80; |
ShaneKirkbride | 3:8ed85d940c4c | 188 | bool security = true; |
ShaneKirkbride | 3:8ed85d940c4c | 189 | int err = rest.begin(host,port,security); |
ShaneKirkbride | 2:20ea1be14e4b | 190 | |
ShaneKirkbride | 0:70a6082c1bf7 | 191 | if (err != 0) { |
ShaneKirkbride | 0:70a6082c1bf7 | 192 | debugSerial.printf("REST begin failed: %i\n\r",err); |
ShaneKirkbride | 0:70a6082c1bf7 | 193 | while(1) ; |
ShaneKirkbride | 0:70a6082c1bf7 | 194 | } |
ShaneKirkbride | 0:70a6082c1bf7 | 195 | debugSerial.printf("STM-REST ready\n\r"); |
ShaneKirkbride | 4:31bed73a0d08 | 196 | |
ShaneKirkbride | 4:31bed73a0d08 | 197 | //post_data.attach(&loop_post,15.0); //fire a post every minute |
ShaneKirkbride | 4:31bed73a0d08 | 198 | flipper.attach(&flip, 60.0); // the address of the function to be attached (flip) and the interval (2 seconds) |
ShaneKirkbride | 4:31bed73a0d08 | 199 | |
ShaneKirkbride | 4:31bed73a0d08 | 200 | while(true){ |
ShaneKirkbride | 4:31bed73a0d08 | 201 | |
ShaneKirkbride | 4:31bed73a0d08 | 202 | if(posted) |
ShaneKirkbride | 4:31bed73a0d08 | 203 | { |
ShaneKirkbride | 4:31bed73a0d08 | 204 | debugSerial.printf("sleeping..."); |
ShaneKirkbride | 4:31bed73a0d08 | 205 | posted = false; |
ShaneKirkbride | 4:31bed73a0d08 | 206 | sleep(); //then sleep |
ShaneKirkbride | 4:31bed73a0d08 | 207 | }else{ |
ShaneKirkbride | 4:31bed73a0d08 | 208 | led2 = !led2; |
ShaneKirkbride | 4:31bed73a0d08 | 209 | wait(0.5); // give everything a second to wake up |
ShaneKirkbride | 4:31bed73a0d08 | 210 | } |
ShaneKirkbride | 4:31bed73a0d08 | 211 | } |
ShaneKirkbride | 4:31bed73a0d08 | 212 | |
ShaneKirkbride | 4:31bed73a0d08 | 213 | } |
ShaneKirkbride | 4:31bed73a0d08 | 214 |