This is sample code for interfacing ROHM's SENSORSHLD1-EVK-101 with Nordic Semiconductor's nRF51-DK Development Kit Host BTLE Board

Dependencies:   BLE_API mbed nRF51822

Fork of Nordic_UART_TEMPLATE_ROHM by ROHMUSDC

Code Example for ROHM Mutli-Sensor Shield on the Nordic Semiconductor nRF51-DK

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

This is the basic example code for interfacing ROHM's Multi-sensor Shield Board onto this board.

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

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

Operation

Ultimately, this code will initialize all the sensors on the Multi-sensor shield board and then poll the sensors. The sensor data will then be returned to the BTLE COM port link and will be view-able on any BTLE enabled phone that can connect to the Nordic UART Application.

Supported ROHM Sensor Devices

  • BDE0600G Temperature Sensor
  • BM1383GLV Pressure Sensor
  • BU52014 Hall Sensor
  • ML8511 UV Sensor
  • RPR-0521 ALS/PROX Sensor
  • BH1745NUC Color Sensor
  • KMX62 Accel/Mag Sensor
  • KX122 Accel Sensor
  • BM1422 MI Magnetometer Sensor
  • KXG03 Gyro/Accel Sensor

Updates from SHLD0 to SHLD1

  • Pressure Sensor Changes: Fixed Register Map Changes for BM1383AGLV, See Pressure Sensor Datasheet for more details - TEMP and PRES output switched
  • Added new #ifdef section for Magnetometer
  • Changed Gyro Device Address (7bit addr now 0x4F, not 0x4E)

Sensor Applicable Code Sections

  • Added a Section in "Main" to act as initialization
  • Added to the "Periodic Callback" to read sensor data and return to Phone/Host

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:878e7fad5347
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 }