Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SHT30-DIS-B mbed
Fork of 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);
- }
+ }
}
