Simple "hello world" style program for X-NUCLEO-IKS01A1 MEMS Inertial

Dependencies:   BLE_API X_NUCLEO_IDB0XA1 X_NUCLEO_IKS01A1 mbed

Fork of HelloWorld_IKS01A1 by ST

Revision:
7:4985455162fc
Parent:
4:b1526d074d83
Child:
8:1c6281289d67
--- a/main.cpp	Fri Sep 04 08:29:53 2015 +0000
+++ b/main.cpp	Sun Nov 15 07:30:17 2015 +0000
@@ -1,134 +1,104 @@
-/**
- ******************************************************************************
- * @file    main.cpp
- * @author  AST / EST
- * @version V0.0.1
- * @date    14-August-2015
- * @brief   Simple Example application for using the X_NUCLEO_IKS01A1 
- *          MEMS Inertial & Environmental Sensor Nucleo expansion board.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *   1. Redistributions of source code must retain the above copyright notice,
- *      this list of conditions and the following disclaimer.
- *   2. Redistributions in binary form must reproduce the above copyright notice,
- *      this list of conditions and the following disclaimer in the documentation
- *      and/or other materials provided with the distribution.
- *   3. Neither the name of STMicroelectronics nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- *  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- ******************************************************************************
-*/ 
-
-/* Includes */
 #include "mbed.h"
 #include "x_nucleo_iks01a1.h"
-
-/* Instantiate the expansion board */
-static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
+#include "mbed.h"
+#include "ble/BLE.h"
+#include "ble/services/HeartRateService.h"
+#include "ble/services/BatteryService.h"
+#include "ble/services/DeviceInformationService.h"
 
-/* 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;
-
-/* 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;
+BLE ble;
+DigitalOut led1(LED1);
 
-  /* 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);
+const static char DEVICE_NAME[] = "HRM1";
+static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE,
+GattService::UUID_DEVICE_INFORMATION_SERVICE};
+static volatile bool triggerSensorPolling = false;
 
-  /* prepare fill in of fractional part */
-  len = strlen(str);
-  ptr = &str[len];
+void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
+{
+    ble.gap().startAdvertising(); // restart advertising
+}
 
-  /* 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;
+void periodicCallback(void)
+{
+    led1 = !led1;
+    triggerSensorPolling = true;
 }
 
 
+static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
+static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
+
+
+
+Serial pc(USBTX, USBRX);
 /* Simple main function */
 int main() {
   uint8_t id;
-  float value1, value2;
-  char buffer1[32], buffer2[32];
   int32_t axes[3];
-  
+  pc.baud(115200);
   printf("\r\n--- Starting new run ---\r\n");
-
-  humidity_sensor->ReadID(&id);
-  printf("HTS221  humidity & temperature    = 0x%X\r\n", id);
-  pressure_sensor->ReadID(&id);
-  printf("LPS25H  pressure & temperature    = 0x%X\r\n", id);
+  
   magnetometer->ReadID(&id);
   printf("LIS3MDL magnetometer              = 0x%X\r\n", id);
-  gyroscope->ReadID(&id);
-  printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id);
   
-  wait(3);
- 
-  while(1) {
-    printf("\r\n");
-
-    temp_sensor1->GetTemperature(&value1);
-    humidity_sensor->GetHumidity(&value2);
-    printf("HTS221: [temp] %7s°C,   [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
+      led1 = 1;
+    Ticker ticker;
+    ticker.attach(periodicCallback, 1); // blink LED every second
+    
+    ble.init();
+    ble.gap().onDisconnection(disconnectionCallback);
+    
+    /* Setup primary service. */
+    uint8_t hrmCounter = 0; // init HRM to 100bps
+    HeartRateService hrService(ble, hrmCounter, HeartRateService::LOCATION_FINGER);
+    
+    /* Setup auxiliary service. */
+    DeviceInformationService deviceInfo(ble, "ARM", "Model1", "SN1", "hw-rev1", "fw-rev1", "soft-rev1");
     
-    temp_sensor2->GetFahrenheit(&value1);
-    pressure_sensor->GetPressure(&value2);
-    printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
+    /* Setup advertising. */
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR);
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
+    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
+    ble.gap().setAdvertisingInterval(1000); /* 1000ms */
+  
+    ble.gap().startAdvertising();
+  
 
-    printf("---\r\n");
+  uint8_t  note = 0;
+  while(1) {
+    if (triggerSensorPolling && ble.getGapState().connected) {
+        triggerSensorPolling = false;
 
-    magnetometer->Get_M_Axes(axes);
-    printf("LIS3MDL [mag/mgauss]:  %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
-
-    accelerometer->Get_X_Axes(axes);
-    printf("LSM6DS0 [acc/mg]:      %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
-
-    gyroscope->Get_G_Axes(axes);
-    printf("LSM6DS0 [gyro/mdps]:   %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
-
-    wait(1.5);
+        magnetometer->Get_M_Axes(axes);
+        //printf("%6ld,\t %6ld,\t %6ld\r\n", axes[0], axes[1], axes[2]);
+        
+        note = 0;
+        if (axes[0]>-81-40 && axes[0]<23+40 && axes[1]>-259-40 && axes[1]<-167+40 && axes[2]>827-40 && axes[2]<981+40)
+            note = 1;
+        else if (axes[0]>163-40 && axes[0]<289+40 && axes[1]>-397-40 && axes[1]<-316+40 && axes[2]>311-40 && axes[2]<357+40)
+            note = 2;
+        else if (axes[0]>-73-40 && axes[0]<43+40 && axes[1]>-441-40 && axes[1]<-313+40 && axes[2]>335-40 && axes[2]<420+40)
+            note = 3;
+        else if (axes[0]>-45-40 && axes[0]<25+40 && axes[1]>-612-40 && axes[1]<-561+40 && axes[2]>632-40 && axes[2]<761+40)
+            note = 4;
+        else if (axes[0]>-64-40 && axes[0]<-6+40 && axes[1]>-7-40 && axes[1]<35+40 && axes[2]>524-40 && axes[2]<677+40)
+            note = 5;
+        else if (axes[0]>-210-40 && axes[0]<-137+40 && axes[1]>-431-40 && axes[1]<-294+40 && axes[2]>455-40 && axes[2]<615+40)
+            note = 6;
+        else if (axes[0]>429-40 && axes[0]<471+40 && axes[1]>-145-40 && axes[1]<-91+40 && axes[2]>480-40 && axes[2]<580+40)
+            note = 7;
+        else if (axes[0]>164-40 && axes[0]<264+40 && axes[1]>-650-40 && axes[1]<-604+40 && axes[2]>560-40 && axes[2]<700+40)
+            note = 8;
+            
+        printf("%d\n", note);
+    
+        hrService.updateHeartRate(note);
+        wait(0.3);
+    } else {
+        ble.waitForEvent(); // low power wait for event
+    }
   }
 }