demo1
Dependencies: SHT30-DIS-B WakeUp mbed
Fork of M1DK_Skywire_Demo by
Diff: main.cpp
- Revision:
- 3:4b2176f6474c
- Parent:
- 2:b57e24a42b6f
- Child:
- 4:e7a79d3542e1
--- a/main.cpp Mon Jan 12 17:43:04 2015 +0000 +++ b/main.cpp Mon Jan 12 23:27:12 2015 +0000 @@ -23,75 +23,125 @@ LIS3DH accel(i2c, LIS3DH_V_CHIP_ADDR, LIS3DH_DR_NR_LP_100HZ, LIS3DH_FS_2G); -char str[512]; -char str2[512]; +char str[255]; + float latitude; float longitude; int number; +volatile int rx_in=0; +volatile int rx_out=0; +const int buffer_size = 255; +char rx_buffer[buffer_size+1]; + +char rx_line[buffer_size]; + +void Skywire_Rx_interrupt() { +// Loop just in case more than one character is in UART's receive FIFO buffer +// Stop if buffer full + while ((skywire.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) { + rx_buffer[rx_in] = skywire.getc(); + rx_in = (rx_in + 1) % buffer_size; + } + return; +} + +void read_line() { + int i; + i = 0; +// Start Critical Section - don't interrupt while changing global buffer variables + __disable_irq(); +// Loop reading rx buffer characters until end of line character + while ((i==0) || (rx_line[i-1] != '\n')) { +// Wait if buffer empty + if (rx_in == rx_out) { +// End Critical Section - need to allow rx interrupt to get new characters for buffer + __enable_irq(); + while (rx_in == rx_out) { + } +// Start Critical Section - don't interrupt while changing global buffer variables + __disable_irq(); + } + rx_line[i] = rx_buffer[rx_out]; + i++; + rx_out = (rx_out + 1) % buffer_size; + } +// End Critical Section + __enable_irq(); + rx_line[i-1] = 0; + return; +} +int WaitForResponse(char* response, int num) { + do { + read_line(); + debug_pc.printf("Waiting for: %s, Recieved: %s\r\n", response, rx_line); + } while (strncmp(rx_line, response, num)); + return 0; +} int main() { float axis[3]; float press; float temp; - + debug_pc.baud(115200); skywire.baud(115200); + skywire.attach(&Skywire_Rx_interrupt, Serial::RxIrq); skywire_rts=0; myled=0; - debug_pc.printf("Starting Demo...\n"); - debug_pc.printf("Waiting for Skywire to Boot...\n"); + debug_pc.printf("Starting Demo...\r\n"); + debug_pc.printf("Waiting for Skywire to Boot...\r\n"); //Enable Skywire skywire_en=0; wait(2); skywire_en=1; wait(2); skywire_en=0; - - myled=1; + + myled=1; wait(5); - - LM75_temp.open(); + + LM75_temp.open(); - debug_pc.printf("Connecting to Network...\n"); + //Turn off echo + skywire.printf("ATE0\r\n"); + WaitForResponse("OK", 2); + + debug_pc.printf("Connecting to Network...\r\n"); // get IP address - skywire.printf("AT#SGACT=1,1\r\n"); - wait_ms(500); - skywire.gets(str, 255); - skywire.gets(str, 255); - debug_pc.printf("Skywire says: %s\n", str); + skywire.printf("AT#SGACT=1,1\r\n"); + WaitForResponse("#SGACT", 6); + WaitForResponse("OK", 2); // connect to dweet.io - skywire.printf("AT#HTTPCFG=1,\"dweet.io\",80,0\r\n"); - skywire.gets(str, 255); - skywire.gets(str, 255); - debug_pc.printf("Skywire says: %s\n", str); + skywire.printf("AT#HTTPCFG=1,\"dweet.io\",80,0\r\n"); + WaitForResponse("OK", 2); //get location approximation from cell tower information skywire.printf("AT#AGPSSND\r\n"); - skywire.gets(str, 255); - skywire.gets(str, 255); - //skywire.gets(str, 255); - //skywire.gets(str, 255); - debug_pc.printf("Skywire says: %s\n", str); - sscanf(str, "%s %d,%f,%f,", str2, &number, &latitude, &longitude); - debug_pc.printf("Location: Latt:%f, Long:%f\n", latitude, longitude); - + WaitForResponse("#AGPSRING:", 10); + + //debug_pc.printf("Skywire says: %s\r\n", rx_line); + sscanf(rx_line, "%s %d,%f,%f,", str, &number, &latitude, &longitude); + debug_pc.printf("Location: Latt:%f, Long:%f\r\n", latitude, longitude); + wait(3); + while(1) { temp = (float)LM75_temp; - debug_pc.printf("Temp = %.3f\n", temp); + debug_pc.printf("Temp = %.3f\r\n", temp); press=(float)pressure.value() / 4096; - debug_pc.printf("Pressure = %.3f\n", press); + debug_pc.printf("Pressure = %.3f\r\n", press); accel.read_data(axis); - debug_pc.printf("Accel = %.3f, %.3f, %.3f\n", axis[0], axis[1], axis[2]); - + debug_pc.printf("Accel = %.3f, %.3f, %.3f\r\n", axis[0], axis[1], axis[2]); + // wait(10); + //Report Sensor Data to dweet.io skywire.printf("AT#HTTPQRY=1,0,\"/dweet/for/%s?temperature=%.3f&pressure=%.3f&X=%.3f&Y=%.3f&Z=%.3f&Latitude=%f&Longitude=%f\"\r\n", DeviceID, temp, press, axis[0], axis[1], axis[2], latitude, longitude); - skywire.gets(str, 255); + WaitForResponse("#HTTPRING", 9); skywire.printf("AT#HTTPRCV=1\r\n"); - skywire.gets(str, 255); + WaitForResponse("OK", 2); wait(5); - } + } }