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
Diff: main.cpp
- 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>© 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 + } } }