Includes support for IKS01A1 per HelloWorld_IKS01A1

Dependencies:   NetworkSocketAPI X_NUCLEO_IDW01M1v2 X_NUCLEO_IKS01A1 mbed

Fork of Nucleo_read_a0_thingspace by Tom Amershek

Revision:
1:c0a277c96fd6
Parent:
0:45e9e04829d0
Child:
2:553393c6c088
--- a/main.cpp	Wed Nov 02 13:25:17 2016 +0000
+++ b/main.cpp	Thu Nov 03 20:37:46 2016 +0000
@@ -6,6 +6,7 @@
 #include "SpwfInterface.h"
 #include "TCPSocket.h"
 #include <string>
+#include "x_nucleo_iks01a1.h"
 
 /*************************************
 //FRDM-K64: D9->UART1_TX, D7->UART1_RX
@@ -41,11 +42,62 @@
 DigitalOut myLed(LED1);
 SpwfSAInterface spwf(D8, D2, false);
 
+/* Instantiate the expansion board */
+static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
+
+/* Retrieve the composing elements of the expansion board */
+static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
+static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
+static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
+static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
+static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
+static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
+static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
+
 int errConnect;
 int errSend;
 
+/* Helper function for printing floats & doubles */
+static char *printDouble(char* str, double v, int decimalDigits=2)
+{
+  int i = 1;
+  int intPart, fractPart;
+  int len;
+  char *ptr;
+
+  /* prepare decimal digits multiplicator */
+  for (;decimalDigits!=0; i*=10, decimalDigits--);
+
+  /* calculate integer & fractinal parts */
+  intPart = (int)v;
+  fractPart = (int)((v-(double)(int)v)*i);
+
+  /* fill in integer part */
+  sprintf(str, "%i.", intPart);
+
+  /* prepare fill in of fractional part */
+  len = strlen(str);
+  ptr = &str[len];
+
+  /* fill in leading fractional zeros */
+  for (i/=10;i>1; i/=10, ptr++) {
+    if(fractPart >= i) break;
+    *ptr = '0';
+  }
+
+  /* fill in (rest of) fractional part */
+  sprintf(ptr, "%i", fractPart);
+
+  return str;
+}
+
 int main()
 {
+    uint8_t id;
+    float value1, value2;
+    char buffer1[32], buffer2[32];
+    int32_t axes[3];
+    
     float panel_voltage;
     DigitalOut led(LED1);
     serial_port.baud(9600);
@@ -99,10 +151,51 @@
     macString.erase(2,1);
     macString.erase(4,1);
     const char *macBytes = macString.c_str();
+    
+    humidity_sensor->ReadID(&id);
+    pressure_sensor->ReadID(&id);
+    magnetometer->ReadID(&id);
+    gyroscope->ReadID(&id);
+    wait(3);
 
     while(1) {
+       
+        std::string readings = "";
+        temp_sensor1->GetTemperature(&value1);
+        humidity_sensor->GetHumidity(&value2);
+        
+        readings = readings + "&temperature1=";
+        readings = readings + printDouble(buffer1,value1);
+        readings = readings + "&humidity=";
+        readings = readings + printDouble(buffer2,value2);
+                
+        temp_sensor2->GetFahrenheit(&value1);
+        pressure_sensor->GetPressure(&value2);
+        
+        readings = readings + "&temperature2=";
+        readings = readings + printDouble(buffer1,value1);
+        readings = readings + "&pressure=";
+        readings = readings + printDouble(buffer2,value2);
+        
+        char magBuff[64] = "";
+        magnetometer->Get_M_Axes(axes);
+        sprintf(magBuff, "&magnometer0=%ld&magnometer1=%ld&magnometer2=%ld", axes[0], axes[1], axes[2]);
+        readings = readings + magBuff;      
+        
+        char accBuff[64] = "";
+        accelerometer->Get_X_Axes(axes);
+        sprintf(accBuff, "&accelerometer0=%ld&accelerometer1=%ld&accelerometer2=%ld", axes[0], axes[1], axes[2]);
+        readings = readings + accBuff;          
+        
+        char gyroBuff[64] = "";
+        gyroscope->Get_G_Axes(axes);
+        sprintf(gyroBuff, "&gyroscope0=%ld&gyroscope1=%ld&gyroscope2=%ld", axes[0], axes[1], axes[2]);
+        readings = readings + gyroBuff;
+        
+        printf(readings.c_str());
+          
         panel_voltage = analog_input_A0.read();
-        printf("voltage:  %f\r\n", panel_voltage);
+        // printf("voltage:  %f\r\n", panel_voltage);
         // A0 is voltage tolerant to 3.3V, and analog read returns a percentage of the maximum
         // need to convert the percentage back to a representative number
         panel_voltage = panel_voltage * 3300; // change the value to be in the 0 to 3300 range
@@ -121,14 +214,17 @@
             // get length of jsonContent as string without streams 
             // adapted from http://codereview.stackexchange.com/questions/51270/socket-http-post-request
             
-            char dweetBuffer[72] = "";
+            char dweetBuffer[512] = "";
             
             // create GET HTTP header for dweeting
             strcpy(dweetBuffer, "GET /dweet/for/nucleo-");     
-            strcat(dweetBuffer, macBytes);    
-            char valueRead[20];
-            sprintf(valueRead, "?voltage=%f", panel_voltage);
+            // uncomment to use the last 6 digits of WiFi MAC
+            // strcat(dweetBuffer, macBytes);
+            strcat(dweetBuffer, "toma");    
+            char valueRead[32];
+            sprintf(valueRead, "?voltage=%f&units=millivolts", panel_voltage);
             strcat(dweetBuffer, valueRead);
+            strcat(dweetBuffer, readings.c_str());
             strcat(dweetBuffer, " HTTP/1.1\r\n\r\n"); 
                        
             serial_port.printf("\r\n%s", dweetBuffer);
@@ -138,9 +234,9 @@
             serial_port.printf("sending and receiving data ...\r\n");
             errSend = socket.send(dweetBuffer, strlen(dweetBuffer));
             countRx = socket.recv(bufferRx, sizeof bufferRx);
-            printf("sent %d bytes\r\nand received %d bytes\r\n\r\n", errSend, countRx);
+            printf("sent %d bytes and received %d bytes\r\n\r\n", errSend, countRx);
             printf(bufferRx);
-            printf("\r\n\r\n*** 5-second pause ...\r\n");
+            printf("\r\n\r\n*** 5-second pause ...\r\n\r\n");
         }
         wait(5.0); // 5000 ms delay before looping to next read
     }