Code used for Sensor Expo 2016 - Balloon Game. More details can be found here: https://github.com/ROHMUSDC/ROHM-SensorExpo2016-Pressure-Sensor-Demo/

Dependencies:   BLE_API mbed nRF51822

Fork of Nordic_UART_TEMPLATE_ROHM_SHLD1Update by ROHMUSDC

ROHM Balloon Game Demo Code featured at Sensors Expo 2016

This code was written to be used with the Nordic Semiconductor nRF51-DK.

This Code allows the user to configure two known pressure distances and save pressure readings onto the application. Then it will automatically extrapolate these values and allow the user to see the height of the board. When connected to a balloon, greater heights can be achieved and the board will return the current height of the board.

Additional information about the ROHM MultiSensor Shield Board can be found at the following link: https://github.com/ROHMUSDC/ROHM-SensorExpo2016-Pressure-Sensor-Demo/

For code example for the ROHM SENSORSHLD0-EVK-101, please see the following link: https://developer.mbed.org/teams/ROHMUSDC/code/ROHMSensorShield_BALOONGAME/

Operation

See Github Repositoy for additional information on how to operate this demo application.

Supported ROHM Sensor Devices

  • BM1383GLV Pressure Sensor

Questions/Feedback

Please feel free to let us know any questions/feedback/comments/concerns on the ROHM shield implementation by contacting the following e-mail:

Committer:
kbahar3
Date:
Wed Jun 08 18:20:30 2016 +0000
Revision:
8:2a19622864c2
Parent:
7:71046927a0e9
Child:
9:3a6fb5dd522c
First Commit, updated SHLD0 code to work with SHLD1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kbahar3 6:6860e53dc7ae 1 /*
kbahar3 6:6860e53dc7ae 2 * mbed Microcontroller Library
Daniel Veilleux 0:442c7a6f1978 3 * Copyright (c) 2006-2013 ARM Limited
Daniel Veilleux 0:442c7a6f1978 4 *
Daniel Veilleux 0:442c7a6f1978 5 * Licensed under the Apache License, Version 2.0 (the "License");
Daniel Veilleux 0:442c7a6f1978 6 * you may not use this file except in compliance with the License.
Daniel Veilleux 0:442c7a6f1978 7 * You may obtain a copy of the License at
Daniel Veilleux 0:442c7a6f1978 8 *
Daniel Veilleux 0:442c7a6f1978 9 * http://www.apache.org/licenses/LICENSE-2.0
Daniel Veilleux 0:442c7a6f1978 10 *
Daniel Veilleux 0:442c7a6f1978 11 * Unless required by applicable law or agreed to in writing, software
Daniel Veilleux 0:442c7a6f1978 12 * distributed under the License is distributed on an "AS IS" BASIS,
Daniel Veilleux 0:442c7a6f1978 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Daniel Veilleux 0:442c7a6f1978 14 * See the License for the specific language governing permissions and
Daniel Veilleux 0:442c7a6f1978 15 * limitations under the License.
Daniel Veilleux 0:442c7a6f1978 16 */
kbahar3 2:c7b9d588c80f 17
kbahar3 2:c7b9d588c80f 18 /*
kbahar3 6:6860e53dc7ae 19 * Code Example for ROHM Mutli-Sensor Shield on the Nordic Semiconductor nRF51-DK
kbahar3 6:6860e53dc7ae 20 *
kbahar3 6:6860e53dc7ae 21 * Description: This Applications interfaces ROHM's Multi-Sensor Shield Board with the Nordic nRF51-DK
kbahar3 6:6860e53dc7ae 22 * This Code supports the following sensor devices on the shield:
kbahar3 2:c7b9d588c80f 23 * > BDE0600G Temperature Sensor
kbahar3 8:2a19622864c2 24 * > BM1383AGLV Pressure Sensor
kbahar3 2:c7b9d588c80f 25 * > BU52014 Hall Sensor
kbahar3 2:c7b9d588c80f 26 * > ML8511 UV Sensor
kbahar3 2:c7b9d588c80f 27 * > RPR-0521 ALS/PROX Sensor
kbahar3 2:c7b9d588c80f 28 * > BH1745NUC Color Sensor
kbahar3 2:c7b9d588c80f 29 * > KMX62 Accel/Mag Sensor
kbahar3 2:c7b9d588c80f 30 * > KX122 Accel Sensor
kbahar3 8:2a19622864c2 31 * > BM1422GMV MI Magnetometer
kbahar3 2:c7b9d588c80f 32 * > KXG03 Gyro (Currently Unavailable as IC hasn't docked yet)
kbahar3 2:c7b9d588c80f 33 *
kbahar3 2:c7b9d588c80f 34 * New Code:
kbahar3 6:6860e53dc7ae 35 * Added Variable Initialization for utilizing ROHM Sensors
kbahar3 2:c7b9d588c80f 36 * Added a Section in "Main" to act as initialization
kbahar3 2:c7b9d588c80f 37 * Added to the "Periodic Callback" to read sensor data and return to Phone/Host
kbahar3 8:2a19622864c2 38 *
kbahar3 8:2a19622864c2 39 * Updates from SHLD0 to SHLD1:
kbahar3 8:2a19622864c2 40 * > Pressure Sensor Changes: Fixed Register Map Changes for BM1383AGLV
kbahar3 8:2a19622864c2 41 * (See Pressure Sensor Datasheet for more details - TEMP and PRES output switched)
kbahar3 8:2a19622864c2 42 * > Added new #ifdef section for Magnetometer
kbahar3 8:2a19622864c2 43 * > Changed Gyro Device Address (7bit addr now 0x4F, not 0x4E)
kbahar3 5:d39ffc5638a3 44 *
kbahar3 5:d39ffc5638a3 45 * Additional information about the ROHM MultiSensor Shield Board can be found at the following link:
kbahar3 5:d39ffc5638a3 46 * https://github.com/ROHMUSDC/ROHM_SensorPlatform_Multi-Sensor-Shield
kbahar3 6:6860e53dc7ae 47 *
kbahar3 6:6860e53dc7ae 48 * Last Upadtaed: 9/28/15
kbahar3 6:6860e53dc7ae 49 * Author: ROHM USDC
kbahar3 6:6860e53dc7ae 50 * Contact Information: engineering@rohmsemiconductor.com
kbahar3 6:6860e53dc7ae 51 */
Daniel Veilleux 0:442c7a6f1978 52
kbahar3 7:71046927a0e9 53 #define nRF52DevKit
kbahar3 7:71046927a0e9 54
kbahar3 6:6860e53dc7ae 55 #define AnalogTemp //BDE0600, Analog Temperature Sensor
kbahar3 6:6860e53dc7ae 56 #define AnalogUV //ML8511, Analog UV Sensor
kbahar3 6:6860e53dc7ae 57 #define HallSensor //BU52011, Hall Switch Sensor
kbahar3 6:6860e53dc7ae 58 #define RPR0521 //RPR0521, ALS/PROX Sensor
kbahar3 6:6860e53dc7ae 59 #define KMX62 //KMX61, Accel/Mag Sensor
kbahar3 7:71046927a0e9 60 #define Color //BH1745, Color Sensor
kbahar3 7:71046927a0e9 61 #define KX122 //KX122, Accelerometer Sensor
kbahar3 6:6860e53dc7ae 62 #define Pressure //BM1383, Barometric Pressure Sensor
kbahar3 8:2a19622864c2 63 #define Magnetometer //BM1422GMV, MI Magnetometer Sensor
kbahar3 7:71046927a0e9 64 #define KXG03 //KXG03, Gyroscopic Sensor
kbahar3 1:2c0ab5cd1a7f 65
Daniel Veilleux 0:442c7a6f1978 66 #include "mbed.h"
Daniel Veilleux 0:442c7a6f1978 67 #include "BLEDevice.h"
Daniel Veilleux 0:442c7a6f1978 68 #include "UARTService.h"
Daniel Veilleux 0:442c7a6f1978 69 #include "nrf_temp.h"
kbahar3 2:c7b9d588c80f 70 #include "I2C.h"
Daniel Veilleux 0:442c7a6f1978 71
kbahar3 1:2c0ab5cd1a7f 72 #define MAX_REPLY_LEN (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN) //Actually equal to 20
kbahar3 6:6860e53dc7ae 73 #define SENSOR_READ_INTERVAL_S (1.0F)
Daniel Veilleux 0:442c7a6f1978 74 #define ADV_INTERVAL_MS (1000UL)
Daniel Veilleux 0:442c7a6f1978 75 #define UART_BAUD_RATE (19200UL)
Daniel Veilleux 0:442c7a6f1978 76 #define DEVICE_NAME ("DEMO SENSOR") // This can be read AFTER connecting to the device.
kbahar3 6:6860e53dc7ae 77 #define SHORT_NAME ("ROHMSHLD") // Keep this short: max 8 chars if a 128bit UUID is also advertised.
Daniel Veilleux 0:442c7a6f1978 78 #define DEBUG(...) { m_serial_port.printf(__VA_ARGS__); }
Daniel Veilleux 0:442c7a6f1978 79
kbahar3 1:2c0ab5cd1a7f 80 // Function Prototypes
kbahar3 6:6860e53dc7ae 81 void PBTrigger(); //Interrupt function for PB4
Daniel Veilleux 0:442c7a6f1978 82
kbahar3 1:2c0ab5cd1a7f 83 // Global Variables
Daniel Veilleux 0:442c7a6f1978 84 BLEDevice m_ble;
kbahar3 7:71046927a0e9 85 Serial m_serial_port(p9, p11); // TX pin, RX pin Original
kbahar3 7:71046927a0e9 86 //Serial m_serial_port(p8, p10); // TX pin, RX pin
Daniel Veilleux 0:442c7a6f1978 87 DigitalOut m_cmd_led(LED1);
Daniel Veilleux 0:442c7a6f1978 88 DigitalOut m_error_led(LED2);
Daniel Veilleux 0:442c7a6f1978 89 UARTService *m_uart_service_ptr;
kbahar3 7:71046927a0e9 90 DigitalIn testButton(p20); //Original
kbahar3 7:71046927a0e9 91 //DigitalIn testButton(p19);
kbahar3 7:71046927a0e9 92 InterruptIn sw4Press(p20); //Original
kbahar3 8:2a19622864c2 93 //InterruptIn sw4Press(p19);
kbahar3 7:71046927a0e9 94 I2C i2c(p30,p7); //Original DK Kit
kbahar3 6:6860e53dc7ae 95 bool RepStart = true;
kbahar3 6:6860e53dc7ae 96 bool NoRepStart = false;
kbahar3 6:6860e53dc7ae 97 int i = 1;
Daniel Veilleux 0:442c7a6f1978 98
kbahar3 1:2c0ab5cd1a7f 99 //Sensor Variables
kbahar3 6:6860e53dc7ae 100 #ifdef AnalogTemp
kbahar3 7:71046927a0e9 101 AnalogIn BDE0600_Temp(p3); //Original Dev Kit
kbahar3 7:71046927a0e9 102 //AnalogIn BDE0600_Temp(p28);
kbahar3 1:2c0ab5cd1a7f 103 uint16_t BDE0600_Temp_value;
kbahar3 1:2c0ab5cd1a7f 104 float BDE0600_output;
kbahar3 6:6860e53dc7ae 105 #endif
kbahar3 1:2c0ab5cd1a7f 106
kbahar3 6:6860e53dc7ae 107 #ifdef AnalogUV
kbahar3 7:71046927a0e9 108 AnalogIn ML8511_UV(p5); //Original Dev Kit
kbahar3 7:71046927a0e9 109 //AnalogIn ML8511_UV(p30);
kbahar3 1:2c0ab5cd1a7f 110 uint16_t ML8511_UV_value;
kbahar3 1:2c0ab5cd1a7f 111 float ML8511_output;
kbahar3 6:6860e53dc7ae 112 #endif
kbahar3 1:2c0ab5cd1a7f 113
kbahar3 6:6860e53dc7ae 114 #ifdef HallSensor
kbahar3 7:71046927a0e9 115 DigitalIn Hall_GPIO0(p14); //Original Dev Kit
kbahar3 7:71046927a0e9 116 DigitalIn Hall_GPIO1(p15); //Original Dev Kit
kbahar3 7:71046927a0e9 117 //DigitalIn Hall_GPIO0(p13);
kbahar3 7:71046927a0e9 118 //DigitalIn Hall_GPIO1(p14);
kbahar3 7:71046927a0e9 119
kbahar3 1:2c0ab5cd1a7f 120 int Hall_Return1;
kbahar3 1:2c0ab5cd1a7f 121 int Hall_Return0;
kbahar3 6:6860e53dc7ae 122 #endif
kbahar3 2:c7b9d588c80f 123
kbahar3 6:6860e53dc7ae 124 #ifdef RPR0521
kbahar3 6:6860e53dc7ae 125 int RPR0521_addr_w = 0x70;
kbahar3 6:6860e53dc7ae 126 int RPR0521_addr_r = 0x71;
kbahar3 2:c7b9d588c80f 127
kbahar3 2:c7b9d588c80f 128 char RPR0521_ModeControl[2] = {0x41, 0xE6};
kbahar3 2:c7b9d588c80f 129 char RPR0521_ALSPSControl[2] = {0x42, 0x03};
kbahar3 2:c7b9d588c80f 130 char RPR0521_Persist[2] = {0x43, 0x20};
kbahar3 2:c7b9d588c80f 131 char RPR0521_Addr_ReadData = 0x44;
kbahar3 2:c7b9d588c80f 132 char RPR0521_Content_ReadData[6];
kbahar3 2:c7b9d588c80f 133
kbahar3 2:c7b9d588c80f 134 int RPR0521_PS_RAWOUT = 0;
kbahar3 2:c7b9d588c80f 135 float RPR0521_PS_OUT = 0;
kbahar3 2:c7b9d588c80f 136 int RPR0521_ALS_D0_RAWOUT = 0;
kbahar3 2:c7b9d588c80f 137 int RPR0521_ALS_D1_RAWOUT = 0;
kbahar3 2:c7b9d588c80f 138 float RPR0521_ALS_DataRatio = 0;
kbahar3 2:c7b9d588c80f 139 float RPR0521_ALS_OUT = 0;
kbahar3 2:c7b9d588c80f 140 #endif
Daniel Veilleux 0:442c7a6f1978 141
kbahar3 3:c3ee9d663fb8 142 #ifdef KMX62
kbahar3 6:6860e53dc7ae 143 int KMX62_addr_w = 0x1C;
kbahar3 6:6860e53dc7ae 144 int KMX62_addr_r = 0x1D;
kbahar3 3:c3ee9d663fb8 145
kbahar3 3:c3ee9d663fb8 146 char KMX62_CNTL2[2] = {0x3A, 0x5F};
kbahar3 3:c3ee9d663fb8 147 char KMX62_Addr_Accel_ReadData = 0x0A;
kbahar3 3:c3ee9d663fb8 148 char KMX62_Content_Accel_ReadData[6];
kbahar3 3:c3ee9d663fb8 149 char KMX62_Addr_Mag_ReadData = 0x10;
kbahar3 3:c3ee9d663fb8 150 char KMX62_Content_Mag_ReadData[6];
kbahar3 3:c3ee9d663fb8 151
kbahar3 6:6860e53dc7ae 152 short int MEMS_Accel_Xout = 0;
kbahar3 6:6860e53dc7ae 153 short int MEMS_Accel_Yout = 0;
kbahar3 6:6860e53dc7ae 154 short int MEMS_Accel_Zout = 0;
kbahar3 6:6860e53dc7ae 155 double MEMS_Accel_Conv_Xout = 0;
kbahar3 6:6860e53dc7ae 156 double MEMS_Accel_Conv_Yout = 0;
kbahar3 6:6860e53dc7ae 157 double MEMS_Accel_Conv_Zout = 0;
kbahar3 6:6860e53dc7ae 158 short int MEMS_Mag_Xout = 0;
kbahar3 6:6860e53dc7ae 159 short int MEMS_Mag_Yout = 0;
kbahar3 6:6860e53dc7ae 160 short int MEMS_Mag_Zout = 0;
kbahar3 3:c3ee9d663fb8 161 float MEMS_Mag_Conv_Xout = 0;
kbahar3 3:c3ee9d663fb8 162 float MEMS_Mag_Conv_Yout = 0;
kbahar3 3:c3ee9d663fb8 163 float MEMS_Mag_Conv_Zout = 0;
kbahar3 3:c3ee9d663fb8 164 #endif
kbahar3 3:c3ee9d663fb8 165
kbahar3 7:71046927a0e9 166 #ifdef Color
kbahar3 6:6860e53dc7ae 167 int BH1745_addr_w = 0x72;
kbahar3 6:6860e53dc7ae 168 int BH1745_addr_r = 0x73;
kbahar3 5:d39ffc5638a3 169
kbahar3 5:d39ffc5638a3 170 char BH1745_persistence[2] = {0x61, 0x03};
kbahar3 5:d39ffc5638a3 171 char BH1745_mode1[2] = {0x41, 0x00};
kbahar3 5:d39ffc5638a3 172 char BH1745_mode2[2] = {0x42, 0x92};
kbahar3 5:d39ffc5638a3 173 char BH1745_mode3[2] = {0x43, 0x02};
kbahar3 5:d39ffc5638a3 174
kbahar3 5:d39ffc5638a3 175 char BH1745_Content_ReadData[6];
kbahar3 5:d39ffc5638a3 176 char BH1745_Addr_color_ReadData = 0x50;
kbahar3 5:d39ffc5638a3 177
kbahar3 6:6860e53dc7ae 178 int BH1745_Red;
kbahar3 6:6860e53dc7ae 179 int BH1745_Blue;
kbahar3 6:6860e53dc7ae 180 int BH1745_Green;
kbahar3 5:d39ffc5638a3 181
kbahar3 5:d39ffc5638a3 182 #endif
kbahar3 5:d39ffc5638a3 183
kbahar3 7:71046927a0e9 184 #ifdef KX122
kbahar3 7:71046927a0e9 185 int KX122_addr_w = 0x3C;
kbahar3 7:71046927a0e9 186 int KX122_addr_r = 0x3D;
kbahar3 5:d39ffc5638a3 187
kbahar3 7:71046927a0e9 188 char KX122_Accel_CNTL1[2] = {0x18, 0x41};
kbahar3 7:71046927a0e9 189 char KX122_Accel_ODCNTL[2] = {0x1B, 0x02};
kbahar3 7:71046927a0e9 190 char KX122_Accel_CNTL3[2] = {0x1A, 0xD8};
kbahar3 7:71046927a0e9 191 char KX122_Accel_TILT_TIMER[2] = {0x22, 0x01};
kbahar3 7:71046927a0e9 192 char KX122_Accel_CNTL2[2] = {0x18, 0xC1};
kbahar3 5:d39ffc5638a3 193
kbahar3 7:71046927a0e9 194 char KX122_Content_ReadData[6];
kbahar3 7:71046927a0e9 195 char KX122_Addr_Accel_ReadData = 0x06;
kbahar3 5:d39ffc5638a3 196
kbahar3 7:71046927a0e9 197 float KX122_Accel_X;
kbahar3 7:71046927a0e9 198 float KX122_Accel_Y;
kbahar3 7:71046927a0e9 199 float KX122_Accel_Z;
kbahar3 5:d39ffc5638a3 200
kbahar3 7:71046927a0e9 201 short int KX122_Accel_X_RawOUT = 0;
kbahar3 7:71046927a0e9 202 short int KX122_Accel_Y_RawOUT = 0;
kbahar3 7:71046927a0e9 203 short int KX122_Accel_Z_RawOUT = 0;
kbahar3 5:d39ffc5638a3 204
kbahar3 7:71046927a0e9 205 int KX122_Accel_X_LB = 0;
kbahar3 7:71046927a0e9 206 int KX122_Accel_X_HB = 0;
kbahar3 7:71046927a0e9 207 int KX122_Accel_Y_LB = 0;
kbahar3 7:71046927a0e9 208 int KX122_Accel_Y_HB = 0;
kbahar3 7:71046927a0e9 209 int KX122_Accel_Z_LB = 0;
kbahar3 7:71046927a0e9 210 int KX122_Accel_Z_HB = 0;
kbahar3 5:d39ffc5638a3 211 #endif
kbahar3 5:d39ffc5638a3 212
kbahar3 5:d39ffc5638a3 213 #ifdef Pressure
kbahar3 6:6860e53dc7ae 214 int Press_addr_w = 0xBA;
kbahar3 6:6860e53dc7ae 215 int Press_addr_r = 0xBB;
kbahar3 5:d39ffc5638a3 216
kbahar3 5:d39ffc5638a3 217 char PWR_DOWN[2] = {0x12, 0x01};
kbahar3 5:d39ffc5638a3 218 char SLEEP[2] = {0x13, 0x01};
kbahar3 5:d39ffc5638a3 219 char Mode_Control[2] = {0x14, 0xC4};
kbahar3 5:d39ffc5638a3 220
kbahar3 5:d39ffc5638a3 221 char Press_Content_ReadData[6];
kbahar3 5:d39ffc5638a3 222 char Press_Addr_ReadData =0x1A;
kbahar3 5:d39ffc5638a3 223
kbahar3 5:d39ffc5638a3 224 int BM1383_Temp_highByte;
kbahar3 5:d39ffc5638a3 225 int BM1383_Temp_lowByte;
kbahar3 5:d39ffc5638a3 226 int BM1383_Pres_highByte;
kbahar3 5:d39ffc5638a3 227 int BM1383_Pres_lowByte;
kbahar3 5:d39ffc5638a3 228 int BM1383_Pres_leastByte;
kbahar3 5:d39ffc5638a3 229
kbahar3 6:6860e53dc7ae 230 short int BM1383_Temp_Out;
kbahar3 5:d39ffc5638a3 231 float BM1383_Temp_Conv_Out;
kbahar3 5:d39ffc5638a3 232 float BM1383_Pres_Conv_Out;
kbahar3 5:d39ffc5638a3 233
kbahar3 5:d39ffc5638a3 234 float BM1383_Var;
kbahar3 5:d39ffc5638a3 235 float BM1383_Deci;
kbahar3 5:d39ffc5638a3 236 #endif
kbahar3 5:d39ffc5638a3 237
kbahar3 8:2a19622864c2 238 #ifdef Magnetometer
kbahar3 8:2a19622864c2 239 int BM1422_addr_w = 0x1E;
kbahar3 8:2a19622864c2 240 int BM1422_addr_r = 0x1F;
kbahar3 8:2a19622864c2 241 char BM1422_Content_ReadData[6];
kbahar3 8:2a19622864c2 242
kbahar3 8:2a19622864c2 243 char BM1422_CNTL1_Init[2] = {0x1B, 0xC0};
kbahar3 8:2a19622864c2 244 char BM1422_CNTL4_HB_Init[2] = {0x5C, 0x00};
kbahar3 8:2a19622864c2 245 char BM1422_CNTL4_LB_Init[2] = {0x5D, 0x00};
kbahar3 8:2a19622864c2 246 char BM1422_CNTL3_Init[2] = {0x1D, 0x40};
kbahar3 8:2a19622864c2 247
kbahar3 8:2a19622864c2 248 char BM1422_Addr_ReadData = 0x10;
kbahar3 8:2a19622864c2 249 short int BM1422_MAG_X_RawOUT = 0;
kbahar3 8:2a19622864c2 250 short int BM1422_MAG_Y_RawOUT = 0;
kbahar3 8:2a19622864c2 251 short int BM1422_MAG_Z_RawOUT = 0;
kbahar3 8:2a19622864c2 252 #endif
kbahar3 8:2a19622864c2 253
kbahar3 7:71046927a0e9 254 #ifdef KXG03
kbahar3 7:71046927a0e9 255 int j = 11;
kbahar3 7:71046927a0e9 256 int t = 1;
kbahar3 7:71046927a0e9 257 short int aveX = 0;
kbahar3 7:71046927a0e9 258 short int aveX2 = 0;
kbahar3 7:71046927a0e9 259 short int aveX3 = 0;
kbahar3 7:71046927a0e9 260 short int aveY = 0;
kbahar3 7:71046927a0e9 261 short int aveY2 = 0;
kbahar3 7:71046927a0e9 262 short int aveY3 = 0;
kbahar3 7:71046927a0e9 263 short int aveZ = 0;
kbahar3 7:71046927a0e9 264 short int aveZ2 = 0;
kbahar3 7:71046927a0e9 265 short int aveZ3 = 0;
kbahar3 7:71046927a0e9 266 float ave22;
kbahar3 7:71046927a0e9 267 float ave33;
kbahar3 8:2a19622864c2 268 int KXG03_addr_w = 0x9E; //write
kbahar3 8:2a19622864c2 269 int KXG03_addr_r = 0x9F; //read
kbahar3 7:71046927a0e9 270 char KXG03_STBY_REG[2] = {0x43, 0x00};
kbahar3 7:71046927a0e9 271 char KXG03_Content_ReadData[6];
kbahar3 7:71046927a0e9 272 //char KXG03_Content_Accel_ReadData[6];
kbahar3 7:71046927a0e9 273 char KXG03_Addr_ReadData = 0x02;
kbahar3 7:71046927a0e9 274 //char KXG03_Addr_Accel_ReadData = 0x08;
kbahar3 7:71046927a0e9 275 float KXG03_Gyro_XX;
kbahar3 7:71046927a0e9 276 float KXG03_Gyro_X;
kbahar3 7:71046927a0e9 277 float KXG03_Gyro_Y;
kbahar3 7:71046927a0e9 278 float KXG03_Gyro_Z;
kbahar3 7:71046927a0e9 279 short int KXG03_Gyro_X_RawOUT = 0;
kbahar3 7:71046927a0e9 280 short int KXG03_Gyro_Y_RawOUT = 0;
kbahar3 7:71046927a0e9 281 short int KXG03_Gyro_Z_RawOUT = 0;
kbahar3 7:71046927a0e9 282 short int KXG03_Gyro_X_RawOUT2 = 0;
kbahar3 7:71046927a0e9 283 short int KXG03_Gyro_Y_RawOUT2 = 0;
kbahar3 7:71046927a0e9 284 short int KXG03_Gyro_Z_RawOUT2 = 0;
kbahar3 7:71046927a0e9 285 float KXG03_Accel_X;
kbahar3 7:71046927a0e9 286 float KXG03_Accel_Y;
kbahar3 7:71046927a0e9 287 float KXG03_Accel_Z;
kbahar3 7:71046927a0e9 288 short int KXG03_Accel_X_RawOUT = 0;
kbahar3 7:71046927a0e9 289 short int KXG03_Accel_Y_RawOUT = 0;
kbahar3 7:71046927a0e9 290 short int KXG03_Accel_Z_RawOUT = 0;
kbahar3 7:71046927a0e9 291 #endif
kbahar3 7:71046927a0e9 292
Daniel Veilleux 0:442c7a6f1978 293 /**
Daniel Veilleux 0:442c7a6f1978 294 * This callback is used whenever a disconnection occurs.
Daniel Veilleux 0:442c7a6f1978 295 */
Daniel Veilleux 0:442c7a6f1978 296 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
Daniel Veilleux 0:442c7a6f1978 297 {
Daniel Veilleux 0:442c7a6f1978 298 switch (reason) {
Daniel Veilleux 0:442c7a6f1978 299 case Gap::REMOTE_USER_TERMINATED_CONNECTION:
Daniel Veilleux 0:442c7a6f1978 300 DEBUG("Disconnected (REMOTE_USER_TERMINATED_CONNECTION)\n\r");
Daniel Veilleux 0:442c7a6f1978 301 break;
Daniel Veilleux 0:442c7a6f1978 302 case Gap::LOCAL_HOST_TERMINATED_CONNECTION:
Daniel Veilleux 0:442c7a6f1978 303 DEBUG("Disconnected (LOCAL_HOST_TERMINATED_CONNECTION)\n\r");
Daniel Veilleux 0:442c7a6f1978 304 break;
Daniel Veilleux 0:442c7a6f1978 305 case Gap::CONN_INTERVAL_UNACCEPTABLE:
Daniel Veilleux 0:442c7a6f1978 306 DEBUG("Disconnected (CONN_INTERVAL_UNACCEPTABLE)\n\r");
Daniel Veilleux 0:442c7a6f1978 307 break;
Daniel Veilleux 0:442c7a6f1978 308 }
Daniel Veilleux 0:442c7a6f1978 309
Daniel Veilleux 0:442c7a6f1978 310 DEBUG("Restarting the advertising process\n\r");
Daniel Veilleux 0:442c7a6f1978 311 m_ble.startAdvertising();
Daniel Veilleux 0:442c7a6f1978 312 }
Daniel Veilleux 0:442c7a6f1978 313
Daniel Veilleux 0:442c7a6f1978 314 /**
Daniel Veilleux 0:442c7a6f1978 315 * This callback is used whenever the host writes data to one of our GATT characteristics.
Daniel Veilleux 0:442c7a6f1978 316 */
Daniel Veilleux 0:442c7a6f1978 317 void dataWrittenCallback(const GattCharacteristicWriteCBParams *params)
Daniel Veilleux 0:442c7a6f1978 318 {
Daniel Veilleux 0:442c7a6f1978 319 // Ensure that initialization is finished and the host has written to the TX characteristic.
Daniel Veilleux 0:442c7a6f1978 320 if ((m_uart_service_ptr != NULL) && (params->charHandle == m_uart_service_ptr->getTXCharacteristicHandle())) {
Daniel Veilleux 0:442c7a6f1978 321 uint8_t buf[MAX_REPLY_LEN];
Daniel Veilleux 0:442c7a6f1978 322 uint32_t len = 0;
Daniel Veilleux 0:442c7a6f1978 323 if (1 == params->len) {
Daniel Veilleux 0:442c7a6f1978 324 switch (params->data[0]) {
Daniel Veilleux 0:442c7a6f1978 325 case '0':
kbahar3 1:2c0ab5cd1a7f 326 m_cmd_led = m_cmd_led ^ 1;
kbahar3 1:2c0ab5cd1a7f 327 len = snprintf((char*) buf, MAX_REPLY_LEN, "OK... LED ON");
Daniel Veilleux 0:442c7a6f1978 328 break;
Daniel Veilleux 0:442c7a6f1978 329 case '1':
kbahar3 1:2c0ab5cd1a7f 330 m_cmd_led = m_cmd_led ^ 1;
kbahar3 1:2c0ab5cd1a7f 331 len = snprintf((char*) buf, MAX_REPLY_LEN, "OK... LED OFF");
Daniel Veilleux 0:442c7a6f1978 332 break;
Daniel Veilleux 0:442c7a6f1978 333 default:
kbahar3 1:2c0ab5cd1a7f 334 len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR");
Daniel Veilleux 0:442c7a6f1978 335 break;
Daniel Veilleux 0:442c7a6f1978 336 }
Daniel Veilleux 0:442c7a6f1978 337 }
Daniel Veilleux 0:442c7a6f1978 338 else
Daniel Veilleux 0:442c7a6f1978 339 {
kbahar3 1:2c0ab5cd1a7f 340 len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR");
kbahar3 4:eabae2996ecc 341 }
Daniel Veilleux 0:442c7a6f1978 342 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
Daniel Veilleux 0:442c7a6f1978 343 DEBUG("%d bytes received from host\n\r", params->len);
Daniel Veilleux 0:442c7a6f1978 344 }
Daniel Veilleux 0:442c7a6f1978 345 }
Daniel Veilleux 0:442c7a6f1978 346
Daniel Veilleux 0:442c7a6f1978 347 /**
Daniel Veilleux 0:442c7a6f1978 348 * This callback is used whenever a write to a GATT characteristic causes data to be sent to the host.
Daniel Veilleux 0:442c7a6f1978 349 */
Daniel Veilleux 0:442c7a6f1978 350 void dataSentCallback(unsigned count)
Daniel Veilleux 0:442c7a6f1978 351 {
Daniel Veilleux 0:442c7a6f1978 352 // NOTE: The count always seems to be 1 regardless of data.
Daniel Veilleux 0:442c7a6f1978 353 DEBUG("%d bytes sent to host\n\r", count);
Daniel Veilleux 0:442c7a6f1978 354 }
Daniel Veilleux 0:442c7a6f1978 355
Daniel Veilleux 0:442c7a6f1978 356
Daniel Veilleux 0:442c7a6f1978 357 /**
Daniel Veilleux 0:442c7a6f1978 358 * This callback is scheduled to be called periodically via a low-priority interrupt.
Daniel Veilleux 0:442c7a6f1978 359 */
Daniel Veilleux 0:442c7a6f1978 360 void periodicCallback(void)
Daniel Veilleux 0:442c7a6f1978 361 {
kbahar3 1:2c0ab5cd1a7f 362 uint8_t buf[MAX_REPLY_LEN];
kbahar3 1:2c0ab5cd1a7f 363 uint32_t len = 0;
kbahar3 1:2c0ab5cd1a7f 364
kbahar3 6:6860e53dc7ae 365 if(i == 1) {
kbahar3 7:71046927a0e9 366 #ifdef Color
kbahar3 6:6860e53dc7ae 367 if (m_ble.getGapState().connected) {
kbahar3 6:6860e53dc7ae 368 //Read color Portion from the IC
kbahar3 6:6860e53dc7ae 369 i2c.write(BH1745_addr_w, &BH1745_Addr_color_ReadData, 1, RepStart);
kbahar3 6:6860e53dc7ae 370 i2c.read(BH1745_addr_r, &BH1745_Content_ReadData[0], 6, NoRepStart);
kbahar3 6:6860e53dc7ae 371
kbahar3 6:6860e53dc7ae 372 //separate all data read into colors
kbahar3 6:6860e53dc7ae 373 BH1745_Red = (BH1745_Content_ReadData[1]<<8) | (BH1745_Content_ReadData[0]);
kbahar3 6:6860e53dc7ae 374 BH1745_Green = (BH1745_Content_ReadData[3]<<8) | (BH1745_Content_ReadData[2]);
kbahar3 6:6860e53dc7ae 375 BH1745_Blue = (BH1745_Content_ReadData[5]<<8) | (BH1745_Content_ReadData[4]);
kbahar3 1:2c0ab5cd1a7f 376
kbahar3 6:6860e53dc7ae 377
kbahar3 6:6860e53dc7ae 378 //transmit data
kbahar3 6:6860e53dc7ae 379 len = snprintf((char*) buf, MAX_REPLY_LEN, "Color Sensor:");
kbahar3 6:6860e53dc7ae 380 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 381 wait_ms(20);
kbahar3 6:6860e53dc7ae 382
kbahar3 6:6860e53dc7ae 383 len = snprintf((char*) buf, MAX_REPLY_LEN, " Red= %d ADC", BH1745_Red);
kbahar3 6:6860e53dc7ae 384 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 385 wait_ms(20);
kbahar3 6:6860e53dc7ae 386
kbahar3 6:6860e53dc7ae 387 len = snprintf((char*) buf, MAX_REPLY_LEN, " Green= %d ADC", BH1745_Green);
kbahar3 6:6860e53dc7ae 388 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 389 wait_ms(20);
kbahar3 6:6860e53dc7ae 390
kbahar3 6:6860e53dc7ae 391 len = snprintf((char*) buf, MAX_REPLY_LEN, " Blue= %d ADC", BH1745_Blue);
kbahar3 6:6860e53dc7ae 392 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 393 wait_ms(20);
kbahar3 6:6860e53dc7ae 394
kbahar3 6:6860e53dc7ae 395 }
kbahar3 6:6860e53dc7ae 396 #endif
kbahar3 6:6860e53dc7ae 397 i++;
kbahar3 1:2c0ab5cd1a7f 398 }
kbahar3 6:6860e53dc7ae 399 else if(i == 2){
kbahar3 6:6860e53dc7ae 400 #ifdef AnalogTemp
kbahar3 6:6860e53dc7ae 401 if (m_ble.getGapState().connected) {
kbahar3 6:6860e53dc7ae 402 BDE0600_Temp_value = BDE0600_Temp.read_u16();
kbahar3 6:6860e53dc7ae 403 BDE0600_output = (float)BDE0600_Temp_value * 0.00283; //(value * (2.9V/1024))
kbahar3 6:6860e53dc7ae 404 BDE0600_output = (BDE0600_output-1.753)/(-0.01068) + 30;
kbahar3 6:6860e53dc7ae 405
kbahar3 6:6860e53dc7ae 406 len = snprintf((char*) buf, MAX_REPLY_LEN, "Temp Sensor:");
kbahar3 6:6860e53dc7ae 407 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 408 wait_ms(20);
kbahar3 6:6860e53dc7ae 409
kbahar3 6:6860e53dc7ae 410 len = snprintf((char*) buf, MAX_REPLY_LEN, " Temp= %.2f C", BDE0600_output);
kbahar3 6:6860e53dc7ae 411 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 412 wait_ms(20);
kbahar3 6:6860e53dc7ae 413 }
kbahar3 6:6860e53dc7ae 414 #endif
kbahar3 6:6860e53dc7ae 415 i++;
kbahar3 6:6860e53dc7ae 416 }
kbahar3 6:6860e53dc7ae 417 else if(i == 3){
kbahar3 6:6860e53dc7ae 418 #ifdef AnalogUV
kbahar3 6:6860e53dc7ae 419 if (m_ble.getGapState().connected) {
kbahar3 6:6860e53dc7ae 420 ML8511_UV_value = ML8511_UV.read_u16();
kbahar3 6:6860e53dc7ae 421 ML8511_output = (float)ML8511_UV_value * 0.0029; //(value * (2.9V/1024)) //Note to self: when playing with this, a negative value is seen... Honestly, I think this has to do with my ADC converstion...
kbahar3 6:6860e53dc7ae 422 ML8511_output = (ML8511_output-2.2)/(0.129) + 10; // Added +5 to the offset so when inside (aka, no UV, readings show 0)... this is the wrong approach... and the readings don't make sense... Fix this.
kbahar3 6:6860e53dc7ae 423
kbahar3 6:6860e53dc7ae 424 len = snprintf((char*) buf, MAX_REPLY_LEN, "UV Sensor:");
kbahar3 6:6860e53dc7ae 425 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 426 wait_ms(20);
kbahar3 6:6860e53dc7ae 427
kbahar3 6:6860e53dc7ae 428 len = snprintf((char*) buf, MAX_REPLY_LEN, " UV= %.1f mW/cm2", ML8511_output);
kbahar3 6:6860e53dc7ae 429 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 430 wait_ms(20);
kbahar3 6:6860e53dc7ae 431 }
kbahar3 6:6860e53dc7ae 432 #endif
kbahar3 6:6860e53dc7ae 433 i++;
kbahar3 1:2c0ab5cd1a7f 434 }
kbahar3 6:6860e53dc7ae 435 else if(i == 4){
kbahar3 6:6860e53dc7ae 436 #ifdef HallSensor
kbahar3 6:6860e53dc7ae 437 if (m_ble.getGapState().connected) {
kbahar3 6:6860e53dc7ae 438 Hall_Return0 = Hall_GPIO0;
kbahar3 6:6860e53dc7ae 439 Hall_Return1 = Hall_GPIO1;
kbahar3 6:6860e53dc7ae 440
kbahar3 6:6860e53dc7ae 441 len = snprintf((char*) buf, MAX_REPLY_LEN, "Hall Sensor:");
kbahar3 6:6860e53dc7ae 442 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 443 wait_ms(20);
kbahar3 6:6860e53dc7ae 444
kbahar3 6:6860e53dc7ae 445 len = snprintf((char*) buf, MAX_REPLY_LEN, " H0 = %d, H1 = %d", Hall_Return0, Hall_Return1);
kbahar3 6:6860e53dc7ae 446 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 447 wait_ms(20);
kbahar3 6:6860e53dc7ae 448 }
kbahar3 6:6860e53dc7ae 449 #endif
kbahar3 6:6860e53dc7ae 450 i++;
kbahar3 1:2c0ab5cd1a7f 451 }
kbahar3 6:6860e53dc7ae 452 else if(i == 5){
kbahar3 6:6860e53dc7ae 453 #ifdef RPR0521 //als digital
kbahar3 6:6860e53dc7ae 454 if (m_ble.getGapState().connected) {
kbahar3 6:6860e53dc7ae 455
kbahar3 6:6860e53dc7ae 456 i2c.write(RPR0521_addr_w, &RPR0521_Addr_ReadData, 1, RepStart);
kbahar3 6:6860e53dc7ae 457 i2c.read(RPR0521_addr_r, &RPR0521_Content_ReadData[0], 6, NoRepStart);
kbahar3 6:6860e53dc7ae 458
kbahar3 6:6860e53dc7ae 459 RPR0521_PS_RAWOUT = (RPR0521_Content_ReadData[1]<<8) | (RPR0521_Content_ReadData[0]);
kbahar3 6:6860e53dc7ae 460 RPR0521_ALS_D0_RAWOUT = (RPR0521_Content_ReadData[3]<<8) | (RPR0521_Content_ReadData[2]);
kbahar3 6:6860e53dc7ae 461 RPR0521_ALS_D1_RAWOUT = (RPR0521_Content_ReadData[5]<<8) | (RPR0521_Content_ReadData[4]);
kbahar3 6:6860e53dc7ae 462 RPR0521_ALS_DataRatio = (float)RPR0521_ALS_D1_RAWOUT / (float)RPR0521_ALS_D0_RAWOUT;
kbahar3 6:6860e53dc7ae 463
kbahar3 6:6860e53dc7ae 464 if(RPR0521_ALS_DataRatio < 0.595){
kbahar3 6:6860e53dc7ae 465 RPR0521_ALS_OUT = (1.682*(float)RPR0521_ALS_D0_RAWOUT - 1.877*(float)RPR0521_ALS_D1_RAWOUT);
kbahar3 6:6860e53dc7ae 466 }
kbahar3 6:6860e53dc7ae 467 else if(RPR0521_ALS_DataRatio < 1.015){
kbahar3 6:6860e53dc7ae 468 RPR0521_ALS_OUT = (0.644*(float)RPR0521_ALS_D0_RAWOUT - 0.132*(float)RPR0521_ALS_D1_RAWOUT);
kbahar3 6:6860e53dc7ae 469 }
kbahar3 6:6860e53dc7ae 470 else if(RPR0521_ALS_DataRatio < 1.352){
kbahar3 6:6860e53dc7ae 471 RPR0521_ALS_OUT = (0.756*(float)RPR0521_ALS_D0_RAWOUT - 0.243*(float)RPR0521_ALS_D1_RAWOUT);
kbahar3 6:6860e53dc7ae 472 }
kbahar3 6:6860e53dc7ae 473 else if(RPR0521_ALS_DataRatio < 3.053){
kbahar3 6:6860e53dc7ae 474 RPR0521_ALS_OUT = (0.766*(float)RPR0521_ALS_D0_RAWOUT - 0.25*(float)RPR0521_ALS_D1_RAWOUT);
kbahar3 6:6860e53dc7ae 475 }
kbahar3 6:6860e53dc7ae 476 else{
kbahar3 6:6860e53dc7ae 477 RPR0521_ALS_OUT = 0;
kbahar3 6:6860e53dc7ae 478 }
kbahar3 6:6860e53dc7ae 479
kbahar3 6:6860e53dc7ae 480 len = snprintf((char*) buf, MAX_REPLY_LEN, "ALS/PROX:");
kbahar3 6:6860e53dc7ae 481 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 482 wait_ms(20);
kbahar3 6:6860e53dc7ae 483
kbahar3 6:6860e53dc7ae 484 len = snprintf((char*) buf, MAX_REPLY_LEN, " ALS= %0.2f lx", RPR0521_ALS_OUT);
kbahar3 6:6860e53dc7ae 485 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 486 wait_ms(20);
kbahar3 6:6860e53dc7ae 487
kbahar3 6:6860e53dc7ae 488 len = snprintf((char*) buf, MAX_REPLY_LEN, " PS= %u ADC", RPR0521_PS_RAWOUT);
kbahar3 6:6860e53dc7ae 489 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 490 wait_ms(20);
kbahar3 6:6860e53dc7ae 491 }
kbahar3 6:6860e53dc7ae 492 #endif
kbahar3 6:6860e53dc7ae 493 i++;
kbahar3 6:6860e53dc7ae 494 }
kbahar3 6:6860e53dc7ae 495 else if(i == 6){
kbahar3 6:6860e53dc7ae 496 #ifdef KMX62
kbahar3 6:6860e53dc7ae 497 if (m_ble.getGapState().connected) {
kbahar3 6:6860e53dc7ae 498 //Read Accel Portion from the IC
kbahar3 6:6860e53dc7ae 499 i2c.write(KMX62_addr_w, &KMX62_Addr_Accel_ReadData, 1, RepStart);
kbahar3 6:6860e53dc7ae 500 i2c.read(KMX62_addr_r, &KMX62_Content_Accel_ReadData[0], 6, NoRepStart);
kbahar3 1:2c0ab5cd1a7f 501
kbahar3 6:6860e53dc7ae 502 //Note: The highbyte and low byte return a 14bit value, dropping the two LSB in the Low byte.
kbahar3 6:6860e53dc7ae 503 // However, because we need the signed value, we will adjust the value when converting to "g"
kbahar3 6:6860e53dc7ae 504 MEMS_Accel_Xout = (KMX62_Content_Accel_ReadData[1]<<8) | (KMX62_Content_Accel_ReadData[0]);
kbahar3 6:6860e53dc7ae 505 MEMS_Accel_Yout = (KMX62_Content_Accel_ReadData[3]<<8) | (KMX62_Content_Accel_ReadData[2]);
kbahar3 6:6860e53dc7ae 506 MEMS_Accel_Zout = (KMX62_Content_Accel_ReadData[5]<<8) | (KMX62_Content_Accel_ReadData[4]);
kbahar3 6:6860e53dc7ae 507
kbahar3 6:6860e53dc7ae 508 //Note: Conversion to G is as follows:
kbahar3 6:6860e53dc7ae 509 // Axis_ValueInG = MEMS_Accel_axis / 1024
kbahar3 6:6860e53dc7ae 510 // However, since we did not remove the LSB previously, we need to divide by 4 again
kbahar3 6:6860e53dc7ae 511 // Thus, we will divide the output by 4096 (1024*4) to convert and cancel out the LSB
kbahar3 6:6860e53dc7ae 512 MEMS_Accel_Conv_Xout = ((float)MEMS_Accel_Xout/4096/2);
kbahar3 6:6860e53dc7ae 513 MEMS_Accel_Conv_Yout = ((float)MEMS_Accel_Yout/4096/2);
kbahar3 6:6860e53dc7ae 514 MEMS_Accel_Conv_Zout = ((float)MEMS_Accel_Zout/4096/2);
kbahar3 6:6860e53dc7ae 515
kbahar3 6:6860e53dc7ae 516 //Read MAg portion from the IC
kbahar3 6:6860e53dc7ae 517 i2c.write(KMX62_addr_w, &KMX62_Addr_Mag_ReadData, 1, RepStart);
kbahar3 6:6860e53dc7ae 518 i2c.read(KMX62_addr_r, &KMX62_Content_Mag_ReadData[0], 6, NoRepStart);
kbahar3 6:6860e53dc7ae 519
kbahar3 6:6860e53dc7ae 520 //Note: The highbyte and low byte return a 14bit value, dropping the two LSB in the Low byte.
kbahar3 6:6860e53dc7ae 521 // However, because we need the signed value, we will adjust the value when converting to "g"
kbahar3 6:6860e53dc7ae 522 MEMS_Mag_Xout = (KMX62_Content_Mag_ReadData[1]<<8) | (KMX62_Content_Mag_ReadData[0]);
kbahar3 6:6860e53dc7ae 523 MEMS_Mag_Yout = (KMX62_Content_Mag_ReadData[3]<<8) | (KMX62_Content_Mag_ReadData[2]);
kbahar3 6:6860e53dc7ae 524 MEMS_Mag_Zout = (KMX62_Content_Mag_ReadData[5]<<8) | (KMX62_Content_Mag_ReadData[4]);
kbahar3 6:6860e53dc7ae 525
kbahar3 6:6860e53dc7ae 526 //Note: Conversion to G is as follows:
kbahar3 6:6860e53dc7ae 527 // Axis_ValueInG = MEMS_Accel_axis / 1024
kbahar3 6:6860e53dc7ae 528 // However, since we did not remove the LSB previously, we need to divide by 4 again
kbahar3 6:6860e53dc7ae 529 // Thus, we will divide the output by 4095 (1024*4) to convert and cancel out the LSB
kbahar3 6:6860e53dc7ae 530 MEMS_Mag_Conv_Xout = (float)MEMS_Mag_Xout/4096*0.146;
kbahar3 6:6860e53dc7ae 531 MEMS_Mag_Conv_Yout = (float)MEMS_Mag_Yout/4096*0.146;
kbahar3 6:6860e53dc7ae 532 MEMS_Mag_Conv_Zout = (float)MEMS_Mag_Zout/4096*0.146;
kbahar3 6:6860e53dc7ae 533
kbahar3 6:6860e53dc7ae 534 // transmit data
kbahar3 6:6860e53dc7ae 535
kbahar3 6:6860e53dc7ae 536
kbahar3 6:6860e53dc7ae 537 len = snprintf((char*) buf, MAX_REPLY_LEN, "KMX61SensorData:");
kbahar3 6:6860e53dc7ae 538 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 539 wait_ms(20);
kbahar3 6:6860e53dc7ae 540
kbahar3 6:6860e53dc7ae 541 len = snprintf((char*) buf, MAX_REPLY_LEN, " AccX= %0.2f g", MEMS_Accel_Conv_Xout);
kbahar3 6:6860e53dc7ae 542 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 543 wait_ms(20);
kbahar3 6:6860e53dc7ae 544
kbahar3 6:6860e53dc7ae 545 len = snprintf((char*) buf, MAX_REPLY_LEN, " AccY= %0.2f g", MEMS_Accel_Conv_Yout);
kbahar3 6:6860e53dc7ae 546 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 547 wait_ms(20);
kbahar3 6:6860e53dc7ae 548
kbahar3 6:6860e53dc7ae 549 len = snprintf((char*) buf, MAX_REPLY_LEN, " AccZ= %0.2f g", MEMS_Accel_Conv_Zout);
kbahar3 6:6860e53dc7ae 550 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 551 wait_ms(20);
kbahar3 6:6860e53dc7ae 552
kbahar3 6:6860e53dc7ae 553 len = snprintf((char*) buf, MAX_REPLY_LEN, " MagX= %0.2f uT", MEMS_Mag_Conv_Xout);
kbahar3 6:6860e53dc7ae 554 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 555 wait_ms(20);
kbahar3 6:6860e53dc7ae 556
kbahar3 6:6860e53dc7ae 557 len = snprintf((char*) buf, MAX_REPLY_LEN, " MagY= %0.2f uT", MEMS_Mag_Conv_Yout);
kbahar3 6:6860e53dc7ae 558 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 559 wait_ms(20);
kbahar3 6:6860e53dc7ae 560
kbahar3 6:6860e53dc7ae 561 len = snprintf((char*) buf, MAX_REPLY_LEN, " MagZ= %0.2f uT", MEMS_Mag_Conv_Zout);
kbahar3 6:6860e53dc7ae 562 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 563 wait_ms(20);
kbahar3 2:c7b9d588c80f 564 }
kbahar3 6:6860e53dc7ae 565 #endif
kbahar3 6:6860e53dc7ae 566 i++;
kbahar3 2:c7b9d588c80f 567 }
kbahar3 6:6860e53dc7ae 568 else if(i==7){
kbahar3 7:71046927a0e9 569 #ifdef KX122
kbahar3 6:6860e53dc7ae 570 if (m_ble.getGapState().connected) {
kbahar3 7:71046927a0e9 571 //Read KX122 Portion from the IC
kbahar3 7:71046927a0e9 572 i2c.write(KX122_addr_w, &KX122_Addr_Accel_ReadData, 1, RepStart);
kbahar3 7:71046927a0e9 573 i2c.read(KX122_addr_r, &KX122_Content_ReadData[0], 6, NoRepStart);
kbahar3 6:6860e53dc7ae 574
kbahar3 6:6860e53dc7ae 575
kbahar3 6:6860e53dc7ae 576 //reconfigure the data (taken from arduino code)
kbahar3 7:71046927a0e9 577 KX122_Accel_X_RawOUT = (KX122_Content_ReadData[1]<<8) | (KX122_Content_ReadData[0]);
kbahar3 7:71046927a0e9 578 KX122_Accel_Y_RawOUT = (KX122_Content_ReadData[3]<<8) | (KX122_Content_ReadData[2]);
kbahar3 7:71046927a0e9 579 KX122_Accel_Z_RawOUT = (KX122_Content_ReadData[5]<<8) | (KX122_Content_ReadData[4]);
kbahar3 1:2c0ab5cd1a7f 580
kbahar3 6:6860e53dc7ae 581 //apply needed changes (taken from arduino code)
kbahar3 7:71046927a0e9 582 KX122_Accel_X = (float)KX122_Accel_X_RawOUT / 16384;
kbahar3 7:71046927a0e9 583 KX122_Accel_Y = (float)KX122_Accel_Y_RawOUT / 16384;
kbahar3 7:71046927a0e9 584 KX122_Accel_Z = (float)KX122_Accel_Z_RawOUT / 16384;
kbahar3 6:6860e53dc7ae 585
kbahar3 6:6860e53dc7ae 586
kbahar3 6:6860e53dc7ae 587
kbahar3 6:6860e53dc7ae 588 //transmit the data
kbahar3 7:71046927a0e9 589 len = snprintf((char*) buf, MAX_REPLY_LEN, "KX122 Sensor:");
kbahar3 6:6860e53dc7ae 590 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 591 wait_ms(20);
kbahar3 6:6860e53dc7ae 592
kbahar3 7:71046927a0e9 593 len = snprintf((char*) buf, MAX_REPLY_LEN, " ACCX= %0.2f g", KX122_Accel_X);
kbahar3 6:6860e53dc7ae 594 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 595 wait_ms(20);
kbahar3 6:6860e53dc7ae 596
kbahar3 7:71046927a0e9 597 len = snprintf((char*) buf, MAX_REPLY_LEN, " ACCY= %0.2f g", KX122_Accel_Y);
kbahar3 6:6860e53dc7ae 598 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 599 wait_ms(20);
kbahar3 6:6860e53dc7ae 600
kbahar3 7:71046927a0e9 601 len = snprintf((char*) buf, MAX_REPLY_LEN, " ACCZ= %0.2f g", KX122_Accel_Z);
kbahar3 6:6860e53dc7ae 602 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 603 wait_ms(20);
kbahar3 6:6860e53dc7ae 604
kbahar3 6:6860e53dc7ae 605 }
kbahar3 6:6860e53dc7ae 606 #endif
kbahar3 6:6860e53dc7ae 607 i++;
kbahar3 6:6860e53dc7ae 608 }
kbahar3 6:6860e53dc7ae 609 else if (i == 8){
kbahar3 6:6860e53dc7ae 610 #ifdef Pressure
kbahar3 6:6860e53dc7ae 611 if (m_ble.getGapState().connected) {
kbahar3 6:6860e53dc7ae 612 //Read color Portion from the IC
kbahar3 6:6860e53dc7ae 613 i2c.write(Press_addr_w, &Press_Addr_ReadData, 1, RepStart);
kbahar3 6:6860e53dc7ae 614 i2c.read(Press_addr_r, &Press_Content_ReadData[0], 6, NoRepStart);
kbahar3 6:6860e53dc7ae 615
kbahar3 8:2a19622864c2 616 BM1383_Temp_Out = (Press_Content_ReadData[3]<<8) | (Press_Content_ReadData[4]);
kbahar3 6:6860e53dc7ae 617 BM1383_Temp_Conv_Out = (float)BM1383_Temp_Out/32;
kbahar3 6:6860e53dc7ae 618
kbahar3 8:2a19622864c2 619 BM1383_Var = (Press_Content_ReadData[0]<<3) | (Press_Content_ReadData[1] >> 5);
kbahar3 8:2a19622864c2 620 BM1383_Deci = ((Press_Content_ReadData[1] & 0x1f) << 6 | ((Press_Content_ReadData[2] >> 2)));
kbahar3 6:6860e53dc7ae 621 BM1383_Deci = (float)BM1383_Deci* 0.00048828125; //0.00048828125 = 2^-11
kbahar3 6:6860e53dc7ae 622 BM1383_Pres_Conv_Out = (BM1383_Var + BM1383_Deci); //question pending here...
kbahar3 6:6860e53dc7ae 623
kbahar3 6:6860e53dc7ae 624 len = snprintf((char*) buf, MAX_REPLY_LEN, "Pressure Sensor:");
kbahar3 6:6860e53dc7ae 625 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 626 wait_ms(20);
kbahar3 6:6860e53dc7ae 627
kbahar3 6:6860e53dc7ae 628 len = snprintf((char*) buf, MAX_REPLY_LEN, " Temp= %0.2f C", BM1383_Temp_Conv_Out);
kbahar3 6:6860e53dc7ae 629 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 630 wait_ms(20);
kbahar3 6:6860e53dc7ae 631
kbahar3 6:6860e53dc7ae 632 len = snprintf((char*) buf, MAX_REPLY_LEN, " Pres= %0.2f hPa", BM1383_Pres_Conv_Out);
kbahar3 6:6860e53dc7ae 633 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 634 wait_ms(20);
kbahar3 7:71046927a0e9 635 }
kbahar3 7:71046927a0e9 636 #endif
kbahar3 7:71046927a0e9 637 i++;
kbahar3 7:71046927a0e9 638 }
kbahar3 8:2a19622864c2 639
kbahar3 8:2a19622864c2 640 else if (i == 9){
kbahar3 8:2a19622864c2 641 #ifdef Magnetometer
kbahar3 8:2a19622864c2 642 if (m_ble.getGapState().connected) {
kbahar3 8:2a19622864c2 643 //Read color Portion from the IC
kbahar3 8:2a19622864c2 644 i2c.write(BM1422_addr_w, &BM1422_Addr_ReadData, 1, RepStart);
kbahar3 8:2a19622864c2 645 i2c.read(BM1422_addr_r, &BM1422_Content_ReadData[0], 6, NoRepStart);
kbahar3 8:2a19622864c2 646
kbahar3 8:2a19622864c2 647 BM1422_MAG_X_RawOUT = (BM1422_Content_ReadData[1]<<8) | (BM1422_Content_ReadData[0]);
kbahar3 8:2a19622864c2 648 BM1422_MAG_Y_RawOUT = (BM1422_Content_ReadData[3]<<8) | (BM1422_Content_ReadData[2]);
kbahar3 8:2a19622864c2 649 BM1422_MAG_Z_RawOUT = (BM1422_Content_ReadData[5]<<8) | (BM1422_Content_ReadData[4]);
kbahar3 8:2a19622864c2 650
kbahar3 8:2a19622864c2 651
kbahar3 8:2a19622864c2 652 len = snprintf((char*) buf, MAX_REPLY_LEN, "Mag Sensor:");
kbahar3 8:2a19622864c2 653 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 8:2a19622864c2 654 wait_ms(20);
kbahar3 8:2a19622864c2 655
kbahar3 8:2a19622864c2 656 len = snprintf((char*) buf, MAX_REPLY_LEN, " X_raw= %i", BM1422_MAG_X_RawOUT);
kbahar3 8:2a19622864c2 657 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 8:2a19622864c2 658 wait_ms(20);
kbahar3 8:2a19622864c2 659
kbahar3 8:2a19622864c2 660 len = snprintf((char*) buf, MAX_REPLY_LEN, " Y_raw= %i", BM1422_MAG_Y_RawOUT);
kbahar3 8:2a19622864c2 661 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 8:2a19622864c2 662 wait_ms(20);
kbahar3 8:2a19622864c2 663
kbahar3 8:2a19622864c2 664 len = snprintf((char*) buf, MAX_REPLY_LEN, " Z_raw= %i", BM1422_MAG_Z_RawOUT);
kbahar3 8:2a19622864c2 665 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 8:2a19622864c2 666 wait_ms(20);
kbahar3 8:2a19622864c2 667 }
kbahar3 8:2a19622864c2 668 #endif
kbahar3 8:2a19622864c2 669 i++;
kbahar3 8:2a19622864c2 670 }
kbahar3 8:2a19622864c2 671
kbahar3 8:2a19622864c2 672 else if(i == 10){
kbahar3 7:71046927a0e9 673 #ifdef KXG03
kbahar3 7:71046927a0e9 674 if (m_ble.getGapState().connected) {
kbahar3 7:71046927a0e9 675 i2c.write(KXG03_addr_w, &KXG03_Addr_ReadData, 1, RepStart);
kbahar3 7:71046927a0e9 676 i2c.read(KXG03_addr_r, &KXG03_Content_ReadData[0], 6, NoRepStart);
kbahar3 7:71046927a0e9 677
kbahar3 7:71046927a0e9 678 if (t == 1){
kbahar3 7:71046927a0e9 679 int j = 11;
kbahar3 7:71046927a0e9 680 while(--j)
kbahar3 7:71046927a0e9 681 {
kbahar3 7:71046927a0e9 682 //Read KXG03 Gyro Portion from the IC
kbahar3 7:71046927a0e9 683 i2c.write(KXG03_addr_w, &KXG03_Addr_ReadData, 1, RepStart);
kbahar3 7:71046927a0e9 684 i2c.read(KXG03_addr_r, &KXG03_Content_ReadData[0], 6, NoRepStart);
kbahar3 7:71046927a0e9 685
kbahar3 7:71046927a0e9 686 //Format Data
kbahar3 7:71046927a0e9 687 KXG03_Gyro_X_RawOUT = (KXG03_Content_ReadData[1]<<8) | (KXG03_Content_ReadData[0]);
kbahar3 7:71046927a0e9 688 KXG03_Gyro_Y_RawOUT = (KXG03_Content_ReadData[3]<<8) | (KXG03_Content_ReadData[2]);
kbahar3 7:71046927a0e9 689 KXG03_Gyro_Z_RawOUT = (KXG03_Content_ReadData[5]<<8) | (KXG03_Content_ReadData[4]);
kbahar3 7:71046927a0e9 690 aveX = KXG03_Gyro_X_RawOUT;
kbahar3 7:71046927a0e9 691 aveY = KXG03_Gyro_Y_RawOUT;
kbahar3 7:71046927a0e9 692 aveZ = KXG03_Gyro_Z_RawOUT;
kbahar3 7:71046927a0e9 693 aveX2 = aveX2 + aveX;
kbahar3 7:71046927a0e9 694 aveY2 = aveY2 + aveY;
kbahar3 7:71046927a0e9 695 aveZ2 = aveZ2 + aveZ;
kbahar3 7:71046927a0e9 696 }
kbahar3 7:71046927a0e9 697 aveX3 = aveX2 / 10;
kbahar3 7:71046927a0e9 698 aveY3 = aveY2 / 10;
kbahar3 7:71046927a0e9 699 aveZ3 = aveZ2 / 10;
kbahar3 7:71046927a0e9 700
kbahar3 7:71046927a0e9 701 len = snprintf((char*) buf, MAX_REPLY_LEN, "Gyro Sensor:");
kbahar3 7:71046927a0e9 702 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 703 wait_ms(20);
kbahar3 7:71046927a0e9 704
kbahar3 7:71046927a0e9 705 len = snprintf((char*) buf, MAX_REPLY_LEN, "Calibration OK");
kbahar3 7:71046927a0e9 706 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 707 wait_ms(20);
kbahar3 7:71046927a0e9 708
kbahar3 7:71046927a0e9 709 //len = snprintf((char*) buf, MAX_REPLY_LEN, " aveX2= %d", aveX2);
kbahar3 7:71046927a0e9 710 //m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 711 //wait_ms(20);
kbahar3 7:71046927a0e9 712
kbahar3 7:71046927a0e9 713 //len = snprintf((char*) buf, MAX_REPLY_LEN, " aveX3= %d", aveX3);
kbahar3 7:71046927a0e9 714 //m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 715 wait_ms(20);
kbahar3 7:71046927a0e9 716
kbahar3 7:71046927a0e9 717
kbahar3 7:71046927a0e9 718 //Read KXG03 Gyro Portion from the IC
kbahar3 7:71046927a0e9 719 i2c.write(KXG03_addr_w, &KXG03_Addr_ReadData, 1, RepStart);
kbahar3 7:71046927a0e9 720 i2c.read(KXG03_addr_r, &KXG03_Content_ReadData[0], 6, NoRepStart);
kbahar3 7:71046927a0e9 721
kbahar3 7:71046927a0e9 722 //reconfigure the data (taken from arduino code)
kbahar3 7:71046927a0e9 723 KXG03_Gyro_X_RawOUT = (KXG03_Content_ReadData[1]<<8) | (KXG03_Content_ReadData[0]);
kbahar3 7:71046927a0e9 724 KXG03_Gyro_Y_RawOUT = (KXG03_Content_ReadData[3]<<8) | (KXG03_Content_ReadData[2]);
kbahar3 7:71046927a0e9 725 KXG03_Gyro_Z_RawOUT = (KXG03_Content_ReadData[5]<<8) | (KXG03_Content_ReadData[4]);
kbahar3 7:71046927a0e9 726
kbahar3 7:71046927a0e9 727 KXG03_Gyro_X_RawOUT2 = KXG03_Gyro_X_RawOUT - aveX3;
kbahar3 7:71046927a0e9 728 KXG03_Gyro_Y_RawOUT2 = KXG03_Gyro_Y_RawOUT - aveY3;
kbahar3 7:71046927a0e9 729 KXG03_Gyro_Z_RawOUT2 = KXG03_Gyro_Z_RawOUT - aveZ3;
kbahar3 7:71046927a0e9 730
kbahar3 7:71046927a0e9 731 /*
kbahar3 7:71046927a0e9 732 len = snprintf((char*) buf, MAX_REPLY_LEN, " Y= %d", KXG03_Gyro_Y_RawOUT);
kbahar3 7:71046927a0e9 733 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 734 wait_ms(20);
kbahar3 7:71046927a0e9 735
kbahar3 7:71046927a0e9 736 len = snprintf((char*) buf, MAX_REPLY_LEN, " aveY3= %d", aveY3);
kbahar3 7:71046927a0e9 737 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 738 wait_ms(20);
kbahar3 7:71046927a0e9 739
kbahar3 7:71046927a0e9 740 len = snprintf((char*) buf, MAX_REPLY_LEN, " Y= %d", KXG03_Gyro_Y_RawOUT2);
kbahar3 7:71046927a0e9 741 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 742 wait_ms(20);
kbahar3 7:71046927a0e9 743 */
kbahar3 7:71046927a0e9 744
kbahar3 7:71046927a0e9 745 //Scale Data
kbahar3 7:71046927a0e9 746 KXG03_Gyro_X = (float)KXG03_Gyro_X_RawOUT2 * 0.007813 + 0.000004;
kbahar3 7:71046927a0e9 747 KXG03_Gyro_Y = (float)KXG03_Gyro_Y_RawOUT2 * 0.007813 + 0.000004;
kbahar3 7:71046927a0e9 748 KXG03_Gyro_Z = (float)KXG03_Gyro_Z_RawOUT2 * 0.007813 + 0.000004;
kbahar3 7:71046927a0e9 749
kbahar3 7:71046927a0e9 750 len = snprintf((char*) buf, MAX_REPLY_LEN, " X= %0.2fdeg/s", KXG03_Gyro_X);
kbahar3 7:71046927a0e9 751 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 752 wait_ms(20);
kbahar3 7:71046927a0e9 753
kbahar3 7:71046927a0e9 754 len = snprintf((char*) buf, MAX_REPLY_LEN, " Y= %0.2fdeg/s", KXG03_Gyro_Y);
kbahar3 7:71046927a0e9 755 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 756 wait_ms(20);
kbahar3 7:71046927a0e9 757
kbahar3 7:71046927a0e9 758 len = snprintf((char*) buf, MAX_REPLY_LEN, " Z= %0.2fdeg/s", KXG03_Gyro_Z);
kbahar3 7:71046927a0e9 759 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 760 wait_ms(20);
kbahar3 7:71046927a0e9 761
kbahar3 7:71046927a0e9 762 len = snprintf((char*) buf, MAX_REPLY_LEN, " ");
kbahar3 7:71046927a0e9 763 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 764 wait_ms(20);
kbahar3 7:71046927a0e9 765
kbahar3 7:71046927a0e9 766 t = 0;
kbahar3 7:71046927a0e9 767 }
kbahar3 7:71046927a0e9 768
kbahar3 7:71046927a0e9 769 else {
kbahar3 7:71046927a0e9 770 //Read KXG03 Gyro Portion from the IC
kbahar3 7:71046927a0e9 771 i2c.write(KXG03_addr_w, &KXG03_Addr_ReadData, 1, RepStart);
kbahar3 7:71046927a0e9 772 i2c.read(KXG03_addr_r, &KXG03_Content_ReadData[0], 6, NoRepStart);
kbahar3 7:71046927a0e9 773
kbahar3 7:71046927a0e9 774 //reconfigure the data (taken from arduino code)
kbahar3 7:71046927a0e9 775 KXG03_Gyro_X_RawOUT = (KXG03_Content_ReadData[1]<<8) | (KXG03_Content_ReadData[0]);
kbahar3 7:71046927a0e9 776 KXG03_Gyro_Y_RawOUT = (KXG03_Content_ReadData[3]<<8) | (KXG03_Content_ReadData[2]);
kbahar3 7:71046927a0e9 777 KXG03_Gyro_Z_RawOUT = (KXG03_Content_ReadData[5]<<8) | (KXG03_Content_ReadData[4]);
kbahar3 7:71046927a0e9 778
kbahar3 7:71046927a0e9 779 KXG03_Gyro_X_RawOUT2 = KXG03_Gyro_X_RawOUT - aveX3;
kbahar3 7:71046927a0e9 780 KXG03_Gyro_Y_RawOUT2 = KXG03_Gyro_Y_RawOUT - aveY3;
kbahar3 7:71046927a0e9 781 KXG03_Gyro_Z_RawOUT2 = KXG03_Gyro_Z_RawOUT - aveZ3;
kbahar3 7:71046927a0e9 782
kbahar3 7:71046927a0e9 783 //Scale Data
kbahar3 7:71046927a0e9 784 KXG03_Gyro_X = (float)KXG03_Gyro_X_RawOUT2 * 0.007813 + 0.000004;
kbahar3 7:71046927a0e9 785 KXG03_Gyro_Y = (float)KXG03_Gyro_Y_RawOUT2 * 0.007813 + 0.000004;
kbahar3 7:71046927a0e9 786 KXG03_Gyro_Z = (float)KXG03_Gyro_Z_RawOUT2 * 0.007813 + 0.000004;
kbahar3 7:71046927a0e9 787
kbahar3 7:71046927a0e9 788 len = snprintf((char*) buf, MAX_REPLY_LEN, "Gyro Sensor:");
kbahar3 7:71046927a0e9 789 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 790 wait_ms(20);
kbahar3 7:71046927a0e9 791
kbahar3 7:71046927a0e9 792 len = snprintf((char*) buf, MAX_REPLY_LEN, " X= %0.2fdeg/s", KXG03_Gyro_X);
kbahar3 7:71046927a0e9 793 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 794 wait_ms(20);
kbahar3 7:71046927a0e9 795
kbahar3 7:71046927a0e9 796 len = snprintf((char*) buf, MAX_REPLY_LEN, " Y= %0.2fdeg/s", KXG03_Gyro_Y);
kbahar3 7:71046927a0e9 797 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 798 wait_ms(20);
kbahar3 7:71046927a0e9 799
kbahar3 7:71046927a0e9 800 len = snprintf((char*) buf, MAX_REPLY_LEN, " Z= %0.2fdeg/s", KXG03_Gyro_Z);
kbahar3 7:71046927a0e9 801 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 7:71046927a0e9 802 wait_ms(20);
kbahar3 6:6860e53dc7ae 803
kbahar3 6:6860e53dc7ae 804 len = snprintf((char*) buf, MAX_REPLY_LEN, " ");
kbahar3 6:6860e53dc7ae 805 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 6:6860e53dc7ae 806 wait_ms(20);
kbahar3 7:71046927a0e9 807 }
kbahar3 7:71046927a0e9 808 }
kbahar3 7:71046927a0e9 809 #endif
kbahar3 6:6860e53dc7ae 810 i=1;
kbahar3 6:6860e53dc7ae 811 }
kbahar3 5:d39ffc5638a3 812 }
kbahar3 5:d39ffc5638a3 813
Daniel Veilleux 0:442c7a6f1978 814 void error(ble_error_t err, uint32_t line)
Daniel Veilleux 0:442c7a6f1978 815 {
Daniel Veilleux 0:442c7a6f1978 816 m_error_led = 1;
Daniel Veilleux 0:442c7a6f1978 817 DEBUG("Error %d on line number %d\n\r", err, line);
Daniel Veilleux 0:442c7a6f1978 818 }
Daniel Veilleux 0:442c7a6f1978 819
kbahar3 1:2c0ab5cd1a7f 820 void PBTrigger()
kbahar3 1:2c0ab5cd1a7f 821 {
kbahar3 1:2c0ab5cd1a7f 822 uint8_t buf[MAX_REPLY_LEN];
kbahar3 1:2c0ab5cd1a7f 823 uint32_t len = 0;
kbahar3 1:2c0ab5cd1a7f 824
kbahar3 1:2c0ab5cd1a7f 825 m_cmd_led = !m_cmd_led;
kbahar3 1:2c0ab5cd1a7f 826
kbahar3 1:2c0ab5cd1a7f 827 if (m_ble.getGapState().connected) {
kbahar3 6:6860e53dc7ae 828 len = snprintf((char*) buf, MAX_REPLY_LEN, "Button Pressed!");
kbahar3 1:2c0ab5cd1a7f 829 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 1:2c0ab5cd1a7f 830 }
kbahar3 1:2c0ab5cd1a7f 831 }
Daniel Veilleux 0:442c7a6f1978 832
Daniel Veilleux 0:442c7a6f1978 833 int main(void)
Daniel Veilleux 0:442c7a6f1978 834 {
Daniel Veilleux 0:442c7a6f1978 835 ble_error_t err;
Daniel Veilleux 0:442c7a6f1978 836 Ticker ticker;
Daniel Veilleux 0:442c7a6f1978 837
Daniel Veilleux 0:442c7a6f1978 838 m_serial_port.baud(UART_BAUD_RATE);
Daniel Veilleux 0:442c7a6f1978 839
kbahar3 2:c7b9d588c80f 840 DEBUG("Initialising...\n\r");
Daniel Veilleux 0:442c7a6f1978 841
Daniel Veilleux 0:442c7a6f1978 842 m_cmd_led = 0;
Daniel Veilleux 0:442c7a6f1978 843 m_error_led = 0;
Daniel Veilleux 0:442c7a6f1978 844
Daniel Veilleux 0:442c7a6f1978 845 ticker.attach(periodicCallback, SENSOR_READ_INTERVAL_S);
Daniel Veilleux 0:442c7a6f1978 846
kbahar3 1:2c0ab5cd1a7f 847 sw4Press.fall(&PBTrigger);
kbahar3 1:2c0ab5cd1a7f 848
kbahar3 6:6860e53dc7ae 849 #ifdef RPR0521
kbahar3 6:6860e53dc7ae 850 // 1. Mode Control (0x41), write (0xC6): ALS EN, PS EN, 100ms measurement for ALS and PS, PS_PULSE=1
kbahar3 6:6860e53dc7ae 851 // 2. ALS_PS_CONTROL (0x42), write (0x03): LED Current = 200mA
kbahar3 6:6860e53dc7ae 852 // 3. PERSIST (0x43), write (0x20): PS Gain x4
kbahar3 2:c7b9d588c80f 853 i2c.write(RPR0521_addr_w, &RPR0521_ModeControl[0], 2, false);
kbahar3 2:c7b9d588c80f 854 i2c.write(RPR0521_addr_w, &RPR0521_ALSPSControl[0], 2, false);
kbahar3 2:c7b9d588c80f 855 i2c.write(RPR0521_addr_w, &RPR0521_Persist[0], 2, false);
kbahar3 6:6860e53dc7ae 856 #endif
kbahar3 1:2c0ab5cd1a7f 857
kbahar3 6:6860e53dc7ae 858 #ifdef KMX62
kbahar3 6:6860e53dc7ae 859 // 1. CNTL2 (0x3A), write (0x5F): 4g, Max RES, EN temp mag and accel
kbahar3 3:c3ee9d663fb8 860 i2c.write(KMX62_addr_w, &KMX62_CNTL2[0], 2, false);
kbahar3 6:6860e53dc7ae 861 #endif
kbahar3 3:c3ee9d663fb8 862
kbahar3 7:71046927a0e9 863 #ifdef Color
kbahar3 6:6860e53dc7ae 864 // 1. CNTL2 (0x3A), write (0x5F): 4g, Max RES, EN temp mag and accel
kbahar3 5:d39ffc5638a3 865 i2c.write(BH1745_addr_w, &BH1745_persistence[0], 2, false);
kbahar3 5:d39ffc5638a3 866 i2c.write(BH1745_addr_w, &BH1745_mode1[0], 2, false);
kbahar3 5:d39ffc5638a3 867 i2c.write(BH1745_addr_w, &BH1745_mode2[0], 2, false);
kbahar3 5:d39ffc5638a3 868 i2c.write(BH1745_addr_w, &BH1745_mode3[0], 2, false);
kbahar3 6:6860e53dc7ae 869 #endif
kbahar3 5:d39ffc5638a3 870
kbahar3 7:71046927a0e9 871 #ifdef KX122
kbahar3 7:71046927a0e9 872 i2c.write(KX122_addr_w, &KX122_Accel_CNTL1[0], 2, false);
kbahar3 7:71046927a0e9 873 i2c.write(KX122_addr_w, &KX122_Accel_ODCNTL[0], 2, false);
kbahar3 7:71046927a0e9 874 i2c.write(KX122_addr_w, &KX122_Accel_CNTL3[0], 2, false);
kbahar3 7:71046927a0e9 875 i2c.write(KX122_addr_w, &KX122_Accel_TILT_TIMER[0], 2, false);
kbahar3 7:71046927a0e9 876 i2c.write(KX122_addr_w, &KX122_Accel_CNTL2[0], 2, false);
kbahar3 6:6860e53dc7ae 877 #endif
kbahar3 6:6860e53dc7ae 878
kbahar3 6:6860e53dc7ae 879 #ifdef Pressure
kbahar3 6:6860e53dc7ae 880 i2c.write(Press_addr_w, &PWR_DOWN[0], 2, false);
kbahar3 6:6860e53dc7ae 881 i2c.write(Press_addr_w, &SLEEP[0], 2, false);
kbahar3 6:6860e53dc7ae 882 i2c.write(Press_addr_w, &Mode_Control[0], 2, false);
kbahar3 6:6860e53dc7ae 883 #endif
kbahar3 7:71046927a0e9 884
kbahar3 8:2a19622864c2 885 #ifdef Magnetometer
kbahar3 8:2a19622864c2 886 i2c.write(BM1422_addr_w, &BM1422_CNTL1_Init[0], 2, false);
kbahar3 8:2a19622864c2 887 i2c.write(BM1422_addr_w, &BM1422_CNTL4_HB_Init[0], 2, false);
kbahar3 8:2a19622864c2 888 i2c.write(BM1422_addr_w, &BM1422_CNTL4_LB_Init[0], 2, false);
kbahar3 8:2a19622864c2 889 i2c.write(BM1422_addr_w, &BM1422_CNTL3_Init[0], 2, false);
kbahar3 8:2a19622864c2 890 #endif
kbahar3 8:2a19622864c2 891
kbahar3 7:71046927a0e9 892 #ifdef KXG03
kbahar3 7:71046927a0e9 893 i2c.write(KXG03_addr_w, &KXG03_STBY_REG[0], 2, false);
kbahar3 7:71046927a0e9 894 #endif
kbahar3 5:d39ffc5638a3 895
kbahar3 6:6860e53dc7ae 896 //Start BTLE Initialization Section
Daniel Veilleux 0:442c7a6f1978 897 m_ble.init();
Daniel Veilleux 0:442c7a6f1978 898 m_ble.onDisconnection(disconnectionCallback);
Daniel Veilleux 0:442c7a6f1978 899 m_ble.onDataWritten(dataWrittenCallback);
Daniel Veilleux 0:442c7a6f1978 900 m_ble.onDataSent(dataSentCallback);
Daniel Veilleux 0:442c7a6f1978 901
Daniel Veilleux 0:442c7a6f1978 902 // Set the TX power in dBm units.
Daniel Veilleux 0:442c7a6f1978 903 // Possible values (in decreasing order): 4, 0, -4, -8, -12, -16, -20.
Daniel Veilleux 0:442c7a6f1978 904 err = m_ble.setTxPower(4);
Daniel Veilleux 0:442c7a6f1978 905 if (BLE_ERROR_NONE != err) {
Daniel Veilleux 0:442c7a6f1978 906 error(err, __LINE__);
Daniel Veilleux 0:442c7a6f1978 907 }
Daniel Veilleux 0:442c7a6f1978 908
Daniel Veilleux 0:442c7a6f1978 909 // Setup advertising (GAP stuff).
Daniel Veilleux 0:442c7a6f1978 910 err = m_ble.setDeviceName(DEVICE_NAME);
Daniel Veilleux 0:442c7a6f1978 911 if (BLE_ERROR_NONE != err) {
Daniel Veilleux 0:442c7a6f1978 912 error(err, __LINE__);
Daniel Veilleux 0:442c7a6f1978 913 }
Daniel Veilleux 0:442c7a6f1978 914
Daniel Veilleux 0:442c7a6f1978 915 err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
Daniel Veilleux 0:442c7a6f1978 916 if (BLE_ERROR_NONE != err) {
Daniel Veilleux 0:442c7a6f1978 917 error(err, __LINE__);
Daniel Veilleux 0:442c7a6f1978 918 }
Daniel Veilleux 0:442c7a6f1978 919
Daniel Veilleux 0:442c7a6f1978 920 m_ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Daniel Veilleux 0:442c7a6f1978 921
Daniel Veilleux 0:442c7a6f1978 922 err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
Daniel Veilleux 0:442c7a6f1978 923 (const uint8_t *)SHORT_NAME,
Daniel Veilleux 0:442c7a6f1978 924 (sizeof(SHORT_NAME) - 1));
Daniel Veilleux 0:442c7a6f1978 925 if (BLE_ERROR_NONE != err) {
Daniel Veilleux 0:442c7a6f1978 926 error(err, __LINE__);
Daniel Veilleux 0:442c7a6f1978 927 }
Daniel Veilleux 0:442c7a6f1978 928
Daniel Veilleux 0:442c7a6f1978 929 err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
Daniel Veilleux 0:442c7a6f1978 930 (const uint8_t *)UARTServiceUUID_reversed,
Daniel Veilleux 0:442c7a6f1978 931 sizeof(UARTServiceUUID_reversed));
Daniel Veilleux 0:442c7a6f1978 932 if (BLE_ERROR_NONE != err) {
Daniel Veilleux 0:442c7a6f1978 933 error(err, __LINE__);
Daniel Veilleux 0:442c7a6f1978 934 }
Daniel Veilleux 0:442c7a6f1978 935
Daniel Veilleux 0:442c7a6f1978 936 m_ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(ADV_INTERVAL_MS));
Daniel Veilleux 0:442c7a6f1978 937 m_ble.startAdvertising();
Daniel Veilleux 0:442c7a6f1978 938
Daniel Veilleux 0:442c7a6f1978 939 // Create a UARTService object (GATT stuff).
Daniel Veilleux 0:442c7a6f1978 940 UARTService uartService(m_ble);
Daniel Veilleux 0:442c7a6f1978 941 m_uart_service_ptr = &uartService;
Daniel Veilleux 0:442c7a6f1978 942
Daniel Veilleux 0:442c7a6f1978 943 while (true) {
Daniel Veilleux 0:442c7a6f1978 944 m_ble.waitForEvent();
Daniel Veilleux 0:442c7a6f1978 945 }
kbahar3 5:d39ffc5638a3 946 }