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

main.cpp

Committer:
n0tform3
Date:
2015-11-15
Revision:
7:4985455162fc
Parent:
4:b1526d074d83
Child:
8:1c6281289d67

File content as of revision 7:4985455162fc:

#include "mbed.h"
#include "x_nucleo_iks01a1.h"
#include "mbed.h"
#include "ble/BLE.h"
#include "ble/services/HeartRateService.h"
#include "ble/services/BatteryService.h"
#include "ble/services/DeviceInformationService.h"

BLE ble;
DigitalOut led1(LED1);

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;

void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
{
    ble.gap().startAdvertising(); // restart advertising
}

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;
  int32_t axes[3];
  pc.baud(115200);
  printf("\r\n--- Starting new run ---\r\n");
  
  magnetometer->ReadID(&id);
  printf("LIS3MDL magnetometer              = 0x%X\r\n", id);
  
      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");
    
    /* 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();
  

  uint8_t  note = 0;
  while(1) {
    if (triggerSensorPolling && ble.getGapState().connected) {
        triggerSensorPolling = false;

        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
    }
  }
}