First Revision of sample code for interfacing ROHM Multi-Sensor Shield board with Nordic Semiconductor's nRF51-DK Development Kit Host BTLE Board

Dependencies:   BLE_API mbed nRF51822 Nordic_UART_TEMPLATE_ROHM

Dependents:   Nordic_UART_TEMPLATE_ROHM

Fork of UART_TEMPLATE by daniel veilleux

Code Example for ROHM Multi-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 SENSORSHLD1-EVK-101, please see the following link: https://developer.mbed.org/teams/ROHMUSDC/code/Nordic_UART_TEMPLATE_ROHM_SHLD1Update/

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
  • KXG03 Gyro/Accel Sensor

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 shield implementation by contacting the following e-mail:

Committer:
kbahar3
Date:
Thu Sep 24 22:23:31 2015 +0000
Revision:
5:d39ffc5638a3
Parent:
4:eabae2996ecc
Child:
6:6860e53dc7ae
Example code for interfacing ROHM's Multi-Sensor Shield onto the Nordic Semiconductor nRF51-DK BTLE Host Board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Daniel Veilleux 0:442c7a6f1978 1 /* mbed Microcontroller Library
Daniel Veilleux 0:442c7a6f1978 2 * Copyright (c) 2006-2013 ARM Limited
Daniel Veilleux 0:442c7a6f1978 3 *
Daniel Veilleux 0:442c7a6f1978 4 * Licensed under the Apache License, Version 2.0 (the "License");
Daniel Veilleux 0:442c7a6f1978 5 * you may not use this file except in compliance with the License.
Daniel Veilleux 0:442c7a6f1978 6 * You may obtain a copy of the License at
Daniel Veilleux 0:442c7a6f1978 7 *
Daniel Veilleux 0:442c7a6f1978 8 * http://www.apache.org/licenses/LICENSE-2.0
Daniel Veilleux 0:442c7a6f1978 9 *
Daniel Veilleux 0:442c7a6f1978 10 * Unless required by applicable law or agreed to in writing, software
Daniel Veilleux 0:442c7a6f1978 11 * distributed under the License is distributed on an "AS IS" BASIS,
Daniel Veilleux 0:442c7a6f1978 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Daniel Veilleux 0:442c7a6f1978 13 * See the License for the specific language governing permissions and
Daniel Veilleux 0:442c7a6f1978 14 * limitations under the License.
Daniel Veilleux 0:442c7a6f1978 15 */
kbahar3 2:c7b9d588c80f 16
kbahar3 2:c7b9d588c80f 17 /*
kbahar3 5:d39ffc5638a3 18 * Added Functions for interfacing with ROHM's Multi-Sensor Shield Board
kbahar3 2:c7b9d588c80f 19 * Supports the following Sensor Devices
kbahar3 2:c7b9d588c80f 20 * > BDE0600G Temperature Sensor
kbahar3 2:c7b9d588c80f 21 * > BM1383GLV Pressure Sensor
kbahar3 2:c7b9d588c80f 22 * > BU52014 Hall Sensor
kbahar3 2:c7b9d588c80f 23 * > ML8511 UV Sensor
kbahar3 2:c7b9d588c80f 24 * > RPR-0521 ALS/PROX Sensor
kbahar3 2:c7b9d588c80f 25 * > BH1745NUC Color Sensor
kbahar3 2:c7b9d588c80f 26 * > KMX62 Accel/Mag Sensor
kbahar3 2:c7b9d588c80f 27 * > KX122 Accel Sensor
kbahar3 2:c7b9d588c80f 28 * > KXG03 Gyro (Currently Unavailable as IC hasn't docked yet)
kbahar3 2:c7b9d588c80f 29 *
kbahar3 5:d39ffc5638a3 30 *
kbahar3 5:d39ffc5638a3 31 * Last Upadtaed: 9/11/15
kbahar3 5:d39ffc5638a3 32 *
kbahar3 2:c7b9d588c80f 33 * New Code:
kbahar3 2:c7b9d588c80f 34 * Added a Section in "Main" to act as initialization
kbahar3 2:c7b9d588c80f 35 * Added to the "Periodic Callback" to read sensor data and return to Phone/Host
kbahar3 5:d39ffc5638a3 36 *
kbahar3 5:d39ffc5638a3 37 * Additional information about the ROHM MultiSensor Shield Board can be found at the following link:
kbahar3 5:d39ffc5638a3 38 * https://github.com/ROHMUSDC/ROHM_SensorPlatform_Multi-Sensor-Shield
kbahar3 2:c7b9d588c80f 39 */
kbahar3 2:c7b9d588c80f 40
Daniel Veilleux 0:442c7a6f1978 41
kbahar3 2:c7b9d588c80f 42 //#define AnalogALS //BH1620 //Change 0: Remove this completely
kbahar3 1:2c0ab5cd1a7f 43 #define AnalogTemp //BDE0600
kbahar3 1:2c0ab5cd1a7f 44 #define AnalogUV //ML8511
kbahar3 3:c3ee9d663fb8 45 #define HallSensor //BU52011 //Change 1: Change to use GPIO for BU52014
kbahar3 2:c7b9d588c80f 46 #define RPR0521 //RPR0521 //Change 2: Remove This and add in the RPR-0521
kbahar3 5:d39ffc5638a3 47 #define KMX62 //Change 3: Add Code For -BH1745-, -KX022, BM1383GLV, -KMX62-
kbahar3 5:d39ffc5638a3 48 #define color
kbahar3 5:d39ffc5638a3 49 #define KX022
kbahar3 5:d39ffc5638a3 50 #define Pressure
kbahar3 3:c3ee9d663fb8 51
kbahar3 5:d39ffc5638a3 52
kbahar3 3:c3ee9d663fb8 53
kbahar3 1:2c0ab5cd1a7f 54
Daniel Veilleux 0:442c7a6f1978 55 #include "mbed.h"
Daniel Veilleux 0:442c7a6f1978 56 #include "BLEDevice.h"
Daniel Veilleux 0:442c7a6f1978 57 #include "UARTService.h"
Daniel Veilleux 0:442c7a6f1978 58 #include "nrf_temp.h"
kbahar3 2:c7b9d588c80f 59 #include "I2C.h"
Daniel Veilleux 0:442c7a6f1978 60
kbahar3 5:d39ffc5638a3 61
kbahar3 1:2c0ab5cd1a7f 62 #define MAX_REPLY_LEN (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN) //Actually equal to 20
kbahar3 5:d39ffc5638a3 63 #define SENSOR_READ_INTERVAL_S (5.0F)
Daniel Veilleux 0:442c7a6f1978 64 #define ADV_INTERVAL_MS (1000UL)
Daniel Veilleux 0:442c7a6f1978 65 #define UART_BAUD_RATE (19200UL)
Daniel Veilleux 0:442c7a6f1978 66 #define DEVICE_NAME ("DEMO SENSOR") // This can be read AFTER connecting to the device.
kbahar3 1:2c0ab5cd1a7f 67 #define SHORT_NAME ("ROHMKRIS") // Keep this short: max 8 chars if a 128bit UUID is also advertised.
Daniel Veilleux 0:442c7a6f1978 68
Daniel Veilleux 0:442c7a6f1978 69 #define DEBUG(...) { m_serial_port.printf(__VA_ARGS__); }
Daniel Veilleux 0:442c7a6f1978 70
kbahar3 1:2c0ab5cd1a7f 71 // Function Prototypes
kbahar3 1:2c0ab5cd1a7f 72 void PBTrigger(); //Interrupt function for PB4
Daniel Veilleux 0:442c7a6f1978 73
kbahar3 1:2c0ab5cd1a7f 74 // Global Variables
Daniel Veilleux 0:442c7a6f1978 75 BLEDevice m_ble;
Daniel Veilleux 0:442c7a6f1978 76 Serial m_serial_port(p9, p11); // TX pin, RX pin
Daniel Veilleux 0:442c7a6f1978 77 DigitalOut m_cmd_led(LED1);
Daniel Veilleux 0:442c7a6f1978 78 DigitalOut m_error_led(LED2);
Daniel Veilleux 0:442c7a6f1978 79 UARTService *m_uart_service_ptr;
kbahar3 1:2c0ab5cd1a7f 80 DigitalIn testButton(p20);
kbahar3 1:2c0ab5cd1a7f 81 InterruptIn sw4Press(p20);
kbahar3 1:2c0ab5cd1a7f 82 I2C i2c(p30,p7);
Daniel Veilleux 0:442c7a6f1978 83
kbahar3 1:2c0ab5cd1a7f 84 //Sensor Variables
kbahar3 2:c7b9d588c80f 85 /*
kbahar3 2:c7b9d588c80f 86 AnalogIn BH1620_ALS(p1); //No Analog ALS on the shield
kbahar3 1:2c0ab5cd1a7f 87 uint16_t BH1620_ALS_value;
kbahar3 1:2c0ab5cd1a7f 88 float BH1620_output;
kbahar3 2:c7b9d588c80f 89 */
kbahar3 1:2c0ab5cd1a7f 90
kbahar3 2:c7b9d588c80f 91 AnalogIn BDE0600_Temp(p3); //p2 on the prior evk, p3 on the shield
kbahar3 1:2c0ab5cd1a7f 92 uint16_t BDE0600_Temp_value;
kbahar3 1:2c0ab5cd1a7f 93 float BDE0600_output;
kbahar3 1:2c0ab5cd1a7f 94
kbahar3 2:c7b9d588c80f 95 AnalogIn ML8511_UV(p5); //p3 on prior EVK, p5 on the shield
kbahar3 1:2c0ab5cd1a7f 96 uint16_t ML8511_UV_value;
kbahar3 1:2c0ab5cd1a7f 97 float ML8511_output;
kbahar3 1:2c0ab5cd1a7f 98
kbahar3 2:c7b9d588c80f 99 DigitalIn Hall_GPIO0(p14); //
kbahar3 2:c7b9d588c80f 100 DigitalIn Hall_GPIO1(p15); //
kbahar3 1:2c0ab5cd1a7f 101 int Hall_Return1;
kbahar3 1:2c0ab5cd1a7f 102 int Hall_Return0;
kbahar3 1:2c0ab5cd1a7f 103
kbahar3 2:c7b9d588c80f 104 bool RepStart = true;
kbahar3 2:c7b9d588c80f 105 bool NoRepStart = false;
kbahar3 2:c7b9d588c80f 106
kbahar3 5:d39ffc5638a3 107 int i=1;
kbahar3 5:d39ffc5638a3 108
kbahar3 5:d39ffc5638a3 109
kbahar3 5:d39ffc5638a3 110 #ifdef RPR0521 //als digital
kbahar3 2:c7b9d588c80f 111 int RPR0521_addr_w = 0x70; //7bit addr = 0x38, with write bit 0
kbahar3 2:c7b9d588c80f 112 int RPR0521_addr_r = 0x71; //7bit addr = 0x38, with read bit 1
kbahar3 2:c7b9d588c80f 113
kbahar3 2:c7b9d588c80f 114 char RPR0521_ModeControl[2] = {0x41, 0xE6};
kbahar3 2:c7b9d588c80f 115 char RPR0521_ALSPSControl[2] = {0x42, 0x03};
kbahar3 2:c7b9d588c80f 116 char RPR0521_Persist[2] = {0x43, 0x20};
kbahar3 2:c7b9d588c80f 117 char RPR0521_Addr_ReadData = 0x44;
kbahar3 2:c7b9d588c80f 118 char RPR0521_Content_ReadData[6];
kbahar3 2:c7b9d588c80f 119
kbahar3 2:c7b9d588c80f 120 int RPR0521_PS_RAWOUT = 0;
kbahar3 2:c7b9d588c80f 121 float RPR0521_PS_OUT = 0;
kbahar3 2:c7b9d588c80f 122 int RPR0521_ALS_D0_RAWOUT = 0;
kbahar3 2:c7b9d588c80f 123 int RPR0521_ALS_D1_RAWOUT = 0;
kbahar3 2:c7b9d588c80f 124 float RPR0521_ALS_DataRatio = 0;
kbahar3 2:c7b9d588c80f 125 float RPR0521_ALS_OUT = 0;
kbahar3 2:c7b9d588c80f 126 #endif
Daniel Veilleux 0:442c7a6f1978 127
kbahar3 3:c3ee9d663fb8 128 #ifdef KMX62
kbahar3 3:c3ee9d663fb8 129 int KMX62_addr_w = 0x1C; //7bit addr = 0x38, with write bit 0
kbahar3 3:c3ee9d663fb8 130 int KMX62_addr_r = 0x1D; //7bit addr = 0x38, with read bit 1
kbahar3 3:c3ee9d663fb8 131
kbahar3 3:c3ee9d663fb8 132 char KMX62_CNTL2[2] = {0x3A, 0x5F};
kbahar3 3:c3ee9d663fb8 133 char KMX62_Addr_Accel_ReadData = 0x0A;
kbahar3 3:c3ee9d663fb8 134 char KMX62_Content_Accel_ReadData[6];
kbahar3 3:c3ee9d663fb8 135 char KMX62_Addr_Mag_ReadData = 0x10;
kbahar3 3:c3ee9d663fb8 136 char KMX62_Content_Mag_ReadData[6];
kbahar3 3:c3ee9d663fb8 137
kbahar3 5:d39ffc5638a3 138 short int MEMS_Accel_Xout = 0;
kbahar3 5:d39ffc5638a3 139 short int MEMS_Accel_Yout = 0;
kbahar3 5:d39ffc5638a3 140 short int MEMS_Accel_Zout = 0;
kbahar3 5:d39ffc5638a3 141 double MEMS_Accel_Conv_Xout = 0;
kbahar3 5:d39ffc5638a3 142 double MEMS_Accel_Conv_Yout = 0;
kbahar3 5:d39ffc5638a3 143 double MEMS_Accel_Conv_Zout = 0;
kbahar3 5:d39ffc5638a3 144 short int MEMS_Mag_Xout = 0;
kbahar3 5:d39ffc5638a3 145 short int MEMS_Mag_Yout = 0;
kbahar3 5:d39ffc5638a3 146 short int MEMS_Mag_Zout = 0;
kbahar3 3:c3ee9d663fb8 147 float MEMS_Mag_Conv_Xout = 0;
kbahar3 3:c3ee9d663fb8 148 float MEMS_Mag_Conv_Yout = 0;
kbahar3 3:c3ee9d663fb8 149 float MEMS_Mag_Conv_Zout = 0;
kbahar3 3:c3ee9d663fb8 150 #endif
kbahar3 3:c3ee9d663fb8 151
kbahar3 5:d39ffc5638a3 152 #ifdef color
kbahar3 5:d39ffc5638a3 153 int BH1745_addr_w = 0x72; //write
kbahar3 5:d39ffc5638a3 154 int BH1745_addr_r = 0x73; //read
kbahar3 5:d39ffc5638a3 155
kbahar3 5:d39ffc5638a3 156 char BH1745_persistence[2] = {0x61, 0x03};
kbahar3 5:d39ffc5638a3 157 char BH1745_mode1[2] = {0x41, 0x00};
kbahar3 5:d39ffc5638a3 158 char BH1745_mode2[2] = {0x42, 0x92};
kbahar3 5:d39ffc5638a3 159 char BH1745_mode3[2] = {0x43, 0x02};
kbahar3 5:d39ffc5638a3 160
kbahar3 5:d39ffc5638a3 161 char BH1745_Content_ReadData[6];
kbahar3 5:d39ffc5638a3 162 char BH1745_Addr_color_ReadData = 0x50;
kbahar3 5:d39ffc5638a3 163
kbahar3 5:d39ffc5638a3 164 int BH1745_Red;
kbahar3 5:d39ffc5638a3 165 int BH1745_Blue;
kbahar3 5:d39ffc5638a3 166 int BH1745_Green;
kbahar3 5:d39ffc5638a3 167
kbahar3 5:d39ffc5638a3 168 #endif
kbahar3 5:d39ffc5638a3 169
kbahar3 5:d39ffc5638a3 170 #ifdef KX022
kbahar3 5:d39ffc5638a3 171 int KX022_addr_w = 0x3C; //write
kbahar3 5:d39ffc5638a3 172 int KX022_addr_r = 0x3D; //read
kbahar3 5:d39ffc5638a3 173
kbahar3 5:d39ffc5638a3 174 char KX022_Accel_CNTL1[2] = {0x18, 0x41};
kbahar3 5:d39ffc5638a3 175 char KX022_Accel_ODCNTL[2] = {0x1B, 0x02};
kbahar3 5:d39ffc5638a3 176 char KX022_Accel_CNTL3[2] = {0x1A, 0xD8};
kbahar3 5:d39ffc5638a3 177 char KX022_Accel_TILT_TIMER[2] = {0x22, 0x01};
kbahar3 5:d39ffc5638a3 178 char KX022_Accel_CNTL2[2] = {0x18, 0xC1};
kbahar3 5:d39ffc5638a3 179
kbahar3 5:d39ffc5638a3 180 char KX022_Content_ReadData[6];
kbahar3 5:d39ffc5638a3 181 char KX022_Addr_Accel_ReadData = 0x06;
kbahar3 5:d39ffc5638a3 182
kbahar3 5:d39ffc5638a3 183 float KX022_Accel_X;
kbahar3 5:d39ffc5638a3 184 float KX022_Accel_Y;
kbahar3 5:d39ffc5638a3 185 float KX022_Accel_Z;
kbahar3 5:d39ffc5638a3 186
kbahar3 5:d39ffc5638a3 187 short int KX022_Accel_X_RawOUT = 0;
kbahar3 5:d39ffc5638a3 188 short int KX022_Accel_Y_RawOUT = 0;
kbahar3 5:d39ffc5638a3 189 short int KX022_Accel_Z_RawOUT = 0;
kbahar3 5:d39ffc5638a3 190
kbahar3 5:d39ffc5638a3 191 int KX022_Accel_X_LB = 0;
kbahar3 5:d39ffc5638a3 192 int KX022_Accel_X_HB = 0;
kbahar3 5:d39ffc5638a3 193 int KX022_Accel_Y_LB = 0;
kbahar3 5:d39ffc5638a3 194 int KX022_Accel_Y_HB = 0;
kbahar3 5:d39ffc5638a3 195 int KX022_Accel_Z_LB = 0;
kbahar3 5:d39ffc5638a3 196 int KX022_Accel_Z_HB = 0;
kbahar3 5:d39ffc5638a3 197
kbahar3 5:d39ffc5638a3 198 #endif
kbahar3 5:d39ffc5638a3 199
kbahar3 5:d39ffc5638a3 200 #ifdef Pressure
kbahar3 5:d39ffc5638a3 201 int Press_addr_w = 0xBA; //write
kbahar3 5:d39ffc5638a3 202 int Press_addr_r = 0xBB; //read
kbahar3 5:d39ffc5638a3 203
kbahar3 5:d39ffc5638a3 204 char PWR_DOWN[2] = {0x12, 0x01};
kbahar3 5:d39ffc5638a3 205 char SLEEP[2] = {0x13, 0x01};
kbahar3 5:d39ffc5638a3 206 char Mode_Control[2] = {0x14, 0xC4};
kbahar3 5:d39ffc5638a3 207
kbahar3 5:d39ffc5638a3 208 char Press_Content_ReadData[6];
kbahar3 5:d39ffc5638a3 209 char Press_Addr_ReadData =0x1A;
kbahar3 5:d39ffc5638a3 210
kbahar3 5:d39ffc5638a3 211 int BM1383_Temp_highByte;
kbahar3 5:d39ffc5638a3 212 int BM1383_Temp_lowByte;
kbahar3 5:d39ffc5638a3 213 int BM1383_Pres_highByte;
kbahar3 5:d39ffc5638a3 214 int BM1383_Pres_lowByte;
kbahar3 5:d39ffc5638a3 215 int BM1383_Pres_leastByte;
kbahar3 5:d39ffc5638a3 216
kbahar3 5:d39ffc5638a3 217 float BM1383_Temp_Out;
kbahar3 5:d39ffc5638a3 218 float BM1383_Temp_Conv_Out;
kbahar3 5:d39ffc5638a3 219 float BM1383_Pres_Conv_Out;
kbahar3 5:d39ffc5638a3 220
kbahar3 5:d39ffc5638a3 221 float BM1383_Var;
kbahar3 5:d39ffc5638a3 222 float BM1383_Deci;
kbahar3 5:d39ffc5638a3 223 #endif
kbahar3 5:d39ffc5638a3 224
Daniel Veilleux 0:442c7a6f1978 225 /**
Daniel Veilleux 0:442c7a6f1978 226 * This callback is used whenever a disconnection occurs.
Daniel Veilleux 0:442c7a6f1978 227 */
Daniel Veilleux 0:442c7a6f1978 228 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
Daniel Veilleux 0:442c7a6f1978 229 {
Daniel Veilleux 0:442c7a6f1978 230 switch (reason) {
Daniel Veilleux 0:442c7a6f1978 231 case Gap::REMOTE_USER_TERMINATED_CONNECTION:
Daniel Veilleux 0:442c7a6f1978 232 DEBUG("Disconnected (REMOTE_USER_TERMINATED_CONNECTION)\n\r");
Daniel Veilleux 0:442c7a6f1978 233 break;
Daniel Veilleux 0:442c7a6f1978 234 case Gap::LOCAL_HOST_TERMINATED_CONNECTION:
Daniel Veilleux 0:442c7a6f1978 235 DEBUG("Disconnected (LOCAL_HOST_TERMINATED_CONNECTION)\n\r");
Daniel Veilleux 0:442c7a6f1978 236 break;
Daniel Veilleux 0:442c7a6f1978 237 case Gap::CONN_INTERVAL_UNACCEPTABLE:
Daniel Veilleux 0:442c7a6f1978 238 DEBUG("Disconnected (CONN_INTERVAL_UNACCEPTABLE)\n\r");
Daniel Veilleux 0:442c7a6f1978 239 break;
Daniel Veilleux 0:442c7a6f1978 240 }
Daniel Veilleux 0:442c7a6f1978 241
Daniel Veilleux 0:442c7a6f1978 242 DEBUG("Restarting the advertising process\n\r");
Daniel Veilleux 0:442c7a6f1978 243 m_ble.startAdvertising();
Daniel Veilleux 0:442c7a6f1978 244 }
Daniel Veilleux 0:442c7a6f1978 245
Daniel Veilleux 0:442c7a6f1978 246
Daniel Veilleux 0:442c7a6f1978 247 /**
Daniel Veilleux 0:442c7a6f1978 248 * This callback is used whenever the host writes data to one of our GATT characteristics.
Daniel Veilleux 0:442c7a6f1978 249 */
Daniel Veilleux 0:442c7a6f1978 250 void dataWrittenCallback(const GattCharacteristicWriteCBParams *params)
Daniel Veilleux 0:442c7a6f1978 251 {
Daniel Veilleux 0:442c7a6f1978 252 // Ensure that initialization is finished and the host has written to the TX characteristic.
Daniel Veilleux 0:442c7a6f1978 253 if ((m_uart_service_ptr != NULL) && (params->charHandle == m_uart_service_ptr->getTXCharacteristicHandle())) {
Daniel Veilleux 0:442c7a6f1978 254 uint8_t buf[MAX_REPLY_LEN];
Daniel Veilleux 0:442c7a6f1978 255 uint32_t len = 0;
Daniel Veilleux 0:442c7a6f1978 256
Daniel Veilleux 0:442c7a6f1978 257 if (1 == params->len) {
Daniel Veilleux 0:442c7a6f1978 258 switch (params->data[0]) {
Daniel Veilleux 0:442c7a6f1978 259 case '0':
kbahar3 1:2c0ab5cd1a7f 260 m_cmd_led = m_cmd_led ^ 1;
kbahar3 1:2c0ab5cd1a7f 261 len = snprintf((char*) buf, MAX_REPLY_LEN, "OK... LED ON");
Daniel Veilleux 0:442c7a6f1978 262 break;
Daniel Veilleux 0:442c7a6f1978 263 case '1':
kbahar3 1:2c0ab5cd1a7f 264 m_cmd_led = m_cmd_led ^ 1;
kbahar3 1:2c0ab5cd1a7f 265 len = snprintf((char*) buf, MAX_REPLY_LEN, "OK... LED OFF");
Daniel Veilleux 0:442c7a6f1978 266 break;
Daniel Veilleux 0:442c7a6f1978 267 case 'a':
kbahar3 2:c7b9d588c80f 268 //len = snprintf((char*) buf, MAX_REPLY_LEN, "ALSRaw = %d", BH1620_ALS_value);
kbahar3 1:2c0ab5cd1a7f 269 break;
kbahar3 1:2c0ab5cd1a7f 270 case 'b':
kbahar3 2:c7b9d588c80f 271 //len = snprintf((char*) buf, MAX_REPLY_LEN, "ALS = %.2f lx", BH1620_output);
Daniel Veilleux 0:442c7a6f1978 272 break;
Daniel Veilleux 0:442c7a6f1978 273 default:
kbahar3 1:2c0ab5cd1a7f 274 len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR");
Daniel Veilleux 0:442c7a6f1978 275 break;
Daniel Veilleux 0:442c7a6f1978 276 }
Daniel Veilleux 0:442c7a6f1978 277 }
Daniel Veilleux 0:442c7a6f1978 278 else
Daniel Veilleux 0:442c7a6f1978 279 {
kbahar3 1:2c0ab5cd1a7f 280 len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR");
kbahar3 4:eabae2996ecc 281 }
Daniel Veilleux 0:442c7a6f1978 282
Daniel Veilleux 0:442c7a6f1978 283 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
Daniel Veilleux 0:442c7a6f1978 284
Daniel Veilleux 0:442c7a6f1978 285 DEBUG("%d bytes received from host\n\r", params->len);
Daniel Veilleux 0:442c7a6f1978 286 }
Daniel Veilleux 0:442c7a6f1978 287 }
Daniel Veilleux 0:442c7a6f1978 288
Daniel Veilleux 0:442c7a6f1978 289
Daniel Veilleux 0:442c7a6f1978 290 /**
Daniel Veilleux 0:442c7a6f1978 291 * This callback is used whenever a write to a GATT characteristic causes data to be sent to the host.
Daniel Veilleux 0:442c7a6f1978 292 */
Daniel Veilleux 0:442c7a6f1978 293 void dataSentCallback(unsigned count)
Daniel Veilleux 0:442c7a6f1978 294 {
Daniel Veilleux 0:442c7a6f1978 295 // NOTE: The count always seems to be 1 regardless of data.
Daniel Veilleux 0:442c7a6f1978 296 DEBUG("%d bytes sent to host\n\r", count);
Daniel Veilleux 0:442c7a6f1978 297 }
Daniel Veilleux 0:442c7a6f1978 298
Daniel Veilleux 0:442c7a6f1978 299
Daniel Veilleux 0:442c7a6f1978 300 /**
Daniel Veilleux 0:442c7a6f1978 301 * This callback is scheduled to be called periodically via a low-priority interrupt.
Daniel Veilleux 0:442c7a6f1978 302 */
Daniel Veilleux 0:442c7a6f1978 303 void periodicCallback(void)
Daniel Veilleux 0:442c7a6f1978 304 {
kbahar3 1:2c0ab5cd1a7f 305 uint8_t buf[MAX_REPLY_LEN];
kbahar3 1:2c0ab5cd1a7f 306 uint32_t len = 0;
kbahar3 1:2c0ab5cd1a7f 307
kbahar3 2:c7b9d588c80f 308
kbahar3 5:d39ffc5638a3 309 if(i==1)
kbahar3 5:d39ffc5638a3 310 {
kbahar3 5:d39ffc5638a3 311 /*
kbahar3 2:c7b9d588c80f 312 #ifdef AnalogALS
kbahar3 1:2c0ab5cd1a7f 313 if (m_ble.getGapState().connected) {
kbahar3 1:2c0ab5cd1a7f 314 BH1620_ALS_value = BH1620_ALS.read_u16();
kbahar3 1:2c0ab5cd1a7f 315 BH1620_output = (float)BH1620_ALS_value * 1.543;
kbahar3 1:2c0ab5cd1a7f 316
kbahar3 5:d39ffc5638a3 317 len = snprintf((char*) buf, MAX_REPLY_LEN, "Analog ALS = %.2f lx", BH1620_output);
kbahar3 1:2c0ab5cd1a7f 318 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 1:2c0ab5cd1a7f 319 }
kbahar3 1:2c0ab5cd1a7f 320 #endif
kbahar3 2:c7b9d588c80f 321 */
kbahar3 1:2c0ab5cd1a7f 322
kbahar3 5:d39ffc5638a3 323 #ifdef color
kbahar3 5:d39ffc5638a3 324 if (m_ble.getGapState().connected) {
kbahar3 5:d39ffc5638a3 325 //Read color Portion from the IC
kbahar3 5:d39ffc5638a3 326 i2c.write(BH1745_addr_w, &BH1745_Addr_color_ReadData, 1, RepStart);
kbahar3 5:d39ffc5638a3 327 i2c.read(BH1745_addr_r, &BH1745_Content_ReadData[0], 6, NoRepStart);
kbahar3 5:d39ffc5638a3 328
kbahar3 5:d39ffc5638a3 329 //separate all data read into colors
kbahar3 5:d39ffc5638a3 330
kbahar3 5:d39ffc5638a3 331 BH1745_Red = (BH1745_Content_ReadData[1]<<8) | (BH1745_Content_ReadData[0]);
kbahar3 5:d39ffc5638a3 332 BH1745_Green = (BH1745_Content_ReadData[3]<<8) | (BH1745_Content_ReadData[2]);
kbahar3 5:d39ffc5638a3 333 BH1745_Blue = (BH1745_Content_ReadData[5]<<8) | (BH1745_Content_ReadData[4]);
kbahar3 5:d39ffc5638a3 334
kbahar3 5:d39ffc5638a3 335
kbahar3 5:d39ffc5638a3 336 //transmit data
kbahar3 5:d39ffc5638a3 337 len = snprintf((char*) buf, MAX_REPLY_LEN, "Red= %d", BH1745_Red);
kbahar3 5:d39ffc5638a3 338 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 339 wait_ms(25);
kbahar3 5:d39ffc5638a3 340
kbahar3 5:d39ffc5638a3 341
kbahar3 5:d39ffc5638a3 342 len = snprintf((char*) buf, MAX_REPLY_LEN, "Green= %d", BH1745_Green);
kbahar3 5:d39ffc5638a3 343 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 344 wait_ms(25);
kbahar3 5:d39ffc5638a3 345
kbahar3 5:d39ffc5638a3 346 len = snprintf((char*) buf, MAX_REPLY_LEN, "Blue= %d", BH1745_Blue);
kbahar3 5:d39ffc5638a3 347 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 348 wait_ms(25);
kbahar3 5:d39ffc5638a3 349
kbahar3 5:d39ffc5638a3 350 }
kbahar3 5:d39ffc5638a3 351 #endif
kbahar3 5:d39ffc5638a3 352
kbahar3 1:2c0ab5cd1a7f 353 #ifdef AnalogTemp
kbahar3 1:2c0ab5cd1a7f 354 if (m_ble.getGapState().connected) {
kbahar3 1:2c0ab5cd1a7f 355 BDE0600_Temp_value = BDE0600_Temp.read_u16();
kbahar3 1:2c0ab5cd1a7f 356 BDE0600_output = (float)BDE0600_Temp_value * 0.00283; //(value * (2.9V/1024))
kbahar3 1:2c0ab5cd1a7f 357 BDE0600_output = (BDE0600_output-1.753)/(-0.01068) + 30;
kbahar3 1:2c0ab5cd1a7f 358
kbahar3 1:2c0ab5cd1a7f 359 len = snprintf((char*) buf, MAX_REPLY_LEN, "Temp = %.2f C", BDE0600_output);
kbahar3 1:2c0ab5cd1a7f 360 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 1:2c0ab5cd1a7f 361 }
kbahar3 1:2c0ab5cd1a7f 362 #endif
kbahar3 1:2c0ab5cd1a7f 363
kbahar3 1:2c0ab5cd1a7f 364 #ifdef AnalogUV
kbahar3 1:2c0ab5cd1a7f 365 if (m_ble.getGapState().connected) {
kbahar3 1:2c0ab5cd1a7f 366 ML8511_UV_value = ML8511_UV.read_u16();
kbahar3 5:d39ffc5638a3 367 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 5:d39ffc5638a3 368 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 1:2c0ab5cd1a7f 369
kbahar3 1:2c0ab5cd1a7f 370 len = snprintf((char*) buf, MAX_REPLY_LEN, "UV = %.1f mW/cm2", ML8511_output);
kbahar3 1:2c0ab5cd1a7f 371 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 1:2c0ab5cd1a7f 372 }
kbahar3 1:2c0ab5cd1a7f 373 #endif
kbahar3 1:2c0ab5cd1a7f 374
kbahar3 1:2c0ab5cd1a7f 375 #ifdef HallSensor
kbahar3 1:2c0ab5cd1a7f 376 if (m_ble.getGapState().connected) {
kbahar3 1:2c0ab5cd1a7f 377 Hall_Return0 = Hall_GPIO0;
kbahar3 1:2c0ab5cd1a7f 378 Hall_Return1 = Hall_GPIO1;
kbahar3 1:2c0ab5cd1a7f 379
kbahar3 1:2c0ab5cd1a7f 380 len = snprintf((char*) buf, MAX_REPLY_LEN, "H0 = %d, H1 = %d", Hall_Return0, Hall_Return1);
kbahar3 1:2c0ab5cd1a7f 381 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 1:2c0ab5cd1a7f 382 }
kbahar3 1:2c0ab5cd1a7f 383 #endif
kbahar3 1:2c0ab5cd1a7f 384
kbahar3 1:2c0ab5cd1a7f 385 #ifdef DigitalALS
kbahar3 1:2c0ab5cd1a7f 386 if (m_ble.getGapState().connected) {
kbahar3 1:2c0ab5cd1a7f 387 i2c.read(ALS_addr_r, ALS_ReturnData_raw, 2);
kbahar3 1:2c0ab5cd1a7f 388 ALS_Return = (ALS_ReturnData_raw[0]<<8) | ALS_ReturnData_raw[1];
kbahar3 1:2c0ab5cd1a7f 389 ALS_Return = ALS_Return/1.2;
kbahar3 1:2c0ab5cd1a7f 390
kbahar3 5:d39ffc5638a3 391 len = snprintf((char*) buf, MAX_REPLY_LEN, "DAL1= %0.2f lx", ALS_Return);
kbahar3 1:2c0ab5cd1a7f 392 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 1:2c0ab5cd1a7f 393 }
kbahar3 1:2c0ab5cd1a7f 394 #endif
kbahar3 1:2c0ab5cd1a7f 395
kbahar3 5:d39ffc5638a3 396 #ifdef RPR0521 //als digital
kbahar3 2:c7b9d588c80f 397 if (m_ble.getGapState().connected) {
kbahar3 2:c7b9d588c80f 398
kbahar3 2:c7b9d588c80f 399 i2c.write(RPR0521_addr_w, &RPR0521_Addr_ReadData, 1, RepStart);
kbahar3 2:c7b9d588c80f 400 i2c.read(RPR0521_addr_r, &RPR0521_Content_ReadData[0], 6, NoRepStart);
kbahar3 2:c7b9d588c80f 401
kbahar3 2:c7b9d588c80f 402 RPR0521_PS_RAWOUT = (RPR0521_Content_ReadData[1]<<8) | (RPR0521_Content_ReadData[0]);
kbahar3 2:c7b9d588c80f 403 RPR0521_ALS_D0_RAWOUT = (RPR0521_Content_ReadData[3]<<8) | (RPR0521_Content_ReadData[2]);
kbahar3 2:c7b9d588c80f 404 RPR0521_ALS_D1_RAWOUT = (RPR0521_Content_ReadData[5]<<8) | (RPR0521_Content_ReadData[4]);
kbahar3 2:c7b9d588c80f 405 RPR0521_ALS_DataRatio = (float)RPR0521_ALS_D1_RAWOUT / (float)RPR0521_ALS_D0_RAWOUT;
kbahar3 2:c7b9d588c80f 406
kbahar3 2:c7b9d588c80f 407 if(RPR0521_ALS_DataRatio < 0.595){
kbahar3 2:c7b9d588c80f 408 RPR0521_ALS_OUT = (1.682*(float)RPR0521_ALS_D0_RAWOUT - 1.877*(float)RPR0521_ALS_D1_RAWOUT);
kbahar3 2:c7b9d588c80f 409 }
kbahar3 2:c7b9d588c80f 410 else if(RPR0521_ALS_DataRatio < 1.015){
kbahar3 2:c7b9d588c80f 411 RPR0521_ALS_OUT = (0.644*(float)RPR0521_ALS_D0_RAWOUT - 0.132*(float)RPR0521_ALS_D1_RAWOUT);
kbahar3 2:c7b9d588c80f 412 }
kbahar3 2:c7b9d588c80f 413 else if(RPR0521_ALS_DataRatio < 1.352){
kbahar3 2:c7b9d588c80f 414 RPR0521_ALS_OUT = (0.756*(float)RPR0521_ALS_D0_RAWOUT - 0.243*(float)RPR0521_ALS_D1_RAWOUT);
kbahar3 2:c7b9d588c80f 415 }
kbahar3 2:c7b9d588c80f 416 else if(RPR0521_ALS_DataRatio < 3.053){
kbahar3 2:c7b9d588c80f 417 RPR0521_ALS_OUT = (0.766*(float)RPR0521_ALS_D0_RAWOUT - 0.25*(float)RPR0521_ALS_D1_RAWOUT);
kbahar3 2:c7b9d588c80f 418 }
kbahar3 2:c7b9d588c80f 419 else{
kbahar3 2:c7b9d588c80f 420 RPR0521_ALS_OUT = 0;
kbahar3 2:c7b9d588c80f 421 }
kbahar3 2:c7b9d588c80f 422
kbahar3 2:c7b9d588c80f 423 len = snprintf((char*) buf, MAX_REPLY_LEN, "DALS= %0.2f lx", RPR0521_ALS_OUT);
kbahar3 2:c7b9d588c80f 424 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 425
kbahar3 2:c7b9d588c80f 426 }
kbahar3 2:c7b9d588c80f 427 #endif
kbahar3 1:2c0ab5cd1a7f 428
kbahar3 5:d39ffc5638a3 429 i++;
kbahar3 5:d39ffc5638a3 430
kbahar3 5:d39ffc5638a3 431 }
kbahar3 5:d39ffc5638a3 432
kbahar3 5:d39ffc5638a3 433 else if(i==2)
kbahar3 5:d39ffc5638a3 434 {
kbahar3 5:d39ffc5638a3 435
kbahar3 3:c3ee9d663fb8 436 #ifdef KMX62
kbahar3 1:2c0ab5cd1a7f 437 if (m_ble.getGapState().connected) {
kbahar3 3:c3ee9d663fb8 438 //Read Accel Portion from the IC
kbahar3 3:c3ee9d663fb8 439 i2c.write(KMX62_addr_w, &KMX62_Addr_Accel_ReadData, 1, RepStart);
kbahar3 3:c3ee9d663fb8 440 i2c.read(KMX62_addr_r, &KMX62_Content_Accel_ReadData[0], 6, NoRepStart);
kbahar3 3:c3ee9d663fb8 441
kbahar3 3:c3ee9d663fb8 442 //Note: The highbyte and low byte return a 14bit value, dropping the two LSB in the Low byte.
kbahar3 3:c3ee9d663fb8 443 // However, because we need the signed value, we will adjust the value when converting to "g"
kbahar3 3:c3ee9d663fb8 444 MEMS_Accel_Xout = (KMX62_Content_Accel_ReadData[1]<<8) | (KMX62_Content_Accel_ReadData[0]);
kbahar3 3:c3ee9d663fb8 445 MEMS_Accel_Yout = (KMX62_Content_Accel_ReadData[3]<<8) | (KMX62_Content_Accel_ReadData[2]);
kbahar3 3:c3ee9d663fb8 446 MEMS_Accel_Zout = (KMX62_Content_Accel_ReadData[5]<<8) | (KMX62_Content_Accel_ReadData[4]);
kbahar3 3:c3ee9d663fb8 447
kbahar3 3:c3ee9d663fb8 448 //Note: Conversion to G is as follows:
kbahar3 3:c3ee9d663fb8 449 // Axis_ValueInG = MEMS_Accel_axis / 1024
kbahar3 3:c3ee9d663fb8 450 // However, since we did not remove the LSB previously, we need to divide by 4 again
kbahar3 5:d39ffc5638a3 451 // Thus, we will divide the output by 4096 (1024*4) to convert and cancel out the LSB
kbahar3 5:d39ffc5638a3 452 MEMS_Accel_Conv_Xout = ((float)MEMS_Accel_Xout/4096/2);
kbahar3 5:d39ffc5638a3 453 MEMS_Accel_Conv_Yout = ((float)MEMS_Accel_Yout/4096/2);
kbahar3 5:d39ffc5638a3 454 MEMS_Accel_Conv_Zout = ((float)MEMS_Accel_Zout/4096/2);
kbahar3 3:c3ee9d663fb8 455
kbahar3 3:c3ee9d663fb8 456 //Read MAg portion from the IC
kbahar3 3:c3ee9d663fb8 457 i2c.write(KMX62_addr_w, &KMX62_Addr_Mag_ReadData, 1, RepStart);
kbahar3 3:c3ee9d663fb8 458 i2c.read(KMX62_addr_r, &KMX62_Content_Mag_ReadData[0], 6, NoRepStart);
kbahar3 3:c3ee9d663fb8 459
kbahar3 3:c3ee9d663fb8 460 //Note: The highbyte and low byte return a 14bit value, dropping the two LSB in the Low byte.
kbahar3 3:c3ee9d663fb8 461 // However, because we need the signed value, we will adjust the value when converting to "g"
kbahar3 3:c3ee9d663fb8 462 MEMS_Mag_Xout = (KMX62_Content_Mag_ReadData[1]<<8) | (KMX62_Content_Mag_ReadData[0]);
kbahar3 3:c3ee9d663fb8 463 MEMS_Mag_Yout = (KMX62_Content_Mag_ReadData[3]<<8) | (KMX62_Content_Mag_ReadData[2]);
kbahar3 3:c3ee9d663fb8 464 MEMS_Mag_Zout = (KMX62_Content_Mag_ReadData[5]<<8) | (KMX62_Content_Mag_ReadData[4]);
kbahar3 3:c3ee9d663fb8 465
kbahar3 3:c3ee9d663fb8 466 //Note: Conversion to G is as follows:
kbahar3 3:c3ee9d663fb8 467 // Axis_ValueInG = MEMS_Accel_axis / 1024
kbahar3 3:c3ee9d663fb8 468 // However, since we did not remove the LSB previously, we need to divide by 4 again
kbahar3 3:c3ee9d663fb8 469 // Thus, we will divide the output by 4095 (1024*4) to convert and cancel out the LSB
kbahar3 5:d39ffc5638a3 470 MEMS_Mag_Conv_Xout = (float)MEMS_Mag_Xout/4096*0.146;
kbahar3 5:d39ffc5638a3 471 MEMS_Mag_Conv_Yout = (float)MEMS_Mag_Yout/4096*0.146;
kbahar3 5:d39ffc5638a3 472 MEMS_Mag_Conv_Zout = (float)MEMS_Mag_Zout/4096*0.146;
kbahar3 5:d39ffc5638a3 473
kbahar3 5:d39ffc5638a3 474 // transmit data
kbahar3 5:d39ffc5638a3 475
kbahar3 3:c3ee9d663fb8 476
kbahar3 3:c3ee9d663fb8 477 len = snprintf((char*) buf, MAX_REPLY_LEN, "KMX61SensorData:");
kbahar3 3:c3ee9d663fb8 478 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 479 wait_ms(20);
kbahar3 3:c3ee9d663fb8 480
kbahar3 3:c3ee9d663fb8 481 len = snprintf((char*) buf, MAX_REPLY_LEN, " AccX= %0.2f g", MEMS_Accel_Conv_Xout);
kbahar3 3:c3ee9d663fb8 482 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 483 wait_ms(20);
kbahar3 3:c3ee9d663fb8 484
kbahar3 3:c3ee9d663fb8 485 len = snprintf((char*) buf, MAX_REPLY_LEN, " AccY= %0.2f g", MEMS_Accel_Conv_Yout);
kbahar3 3:c3ee9d663fb8 486 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 487 wait_ms(20);
kbahar3 3:c3ee9d663fb8 488
kbahar3 3:c3ee9d663fb8 489 len = snprintf((char*) buf, MAX_REPLY_LEN, " AccZ= %0.2f g", MEMS_Accel_Conv_Zout);
kbahar3 3:c3ee9d663fb8 490 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 491 wait_ms(20);
kbahar3 3:c3ee9d663fb8 492
kbahar3 3:c3ee9d663fb8 493 len = snprintf((char*) buf, MAX_REPLY_LEN, " MagX= %0.2f g", MEMS_Mag_Conv_Xout);
kbahar3 3:c3ee9d663fb8 494 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 495 wait_ms(20);
kbahar3 3:c3ee9d663fb8 496
kbahar3 3:c3ee9d663fb8 497 len = snprintf((char*) buf, MAX_REPLY_LEN, " MagY= %0.2f g", MEMS_Mag_Conv_Yout);
kbahar3 3:c3ee9d663fb8 498 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 499 wait_ms(20);
kbahar3 3:c3ee9d663fb8 500
kbahar3 3:c3ee9d663fb8 501 len = snprintf((char*) buf, MAX_REPLY_LEN, " MagZ= %0.2f g", MEMS_Mag_Conv_Zout);
kbahar3 3:c3ee9d663fb8 502 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 503 wait_ms(20);
kbahar3 5:d39ffc5638a3 504
kbahar3 3:c3ee9d663fb8 505 }
kbahar3 3:c3ee9d663fb8 506 #endif
kbahar3 3:c3ee9d663fb8 507
kbahar3 5:d39ffc5638a3 508 i++;
kbahar3 5:d39ffc5638a3 509
Daniel Veilleux 0:442c7a6f1978 510 }
Daniel Veilleux 0:442c7a6f1978 511
Daniel Veilleux 0:442c7a6f1978 512
kbahar3 5:d39ffc5638a3 513 else if(i==3)
kbahar3 5:d39ffc5638a3 514 {
kbahar3 5:d39ffc5638a3 515
kbahar3 5:d39ffc5638a3 516
kbahar3 5:d39ffc5638a3 517
kbahar3 5:d39ffc5638a3 518 #ifdef KX022
kbahar3 5:d39ffc5638a3 519 if (m_ble.getGapState().connected) {
kbahar3 5:d39ffc5638a3 520 //Read KX022 Portion from the IC
kbahar3 5:d39ffc5638a3 521 i2c.write(KX022_addr_w, &KX022_Addr_Accel_ReadData, 1, RepStart);
kbahar3 5:d39ffc5638a3 522 i2c.read(KX022_addr_r, &KX022_Content_ReadData[0], 6, NoRepStart);
kbahar3 5:d39ffc5638a3 523
kbahar3 5:d39ffc5638a3 524
kbahar3 5:d39ffc5638a3 525 //reconfigure the data (taken from arduino code)
kbahar3 5:d39ffc5638a3 526 KX022_Accel_X_RawOUT = (KX022_Content_ReadData[1]<<8) | (KX022_Content_ReadData[0]);
kbahar3 5:d39ffc5638a3 527 KX022_Accel_Y_RawOUT = (KX022_Content_ReadData[3]<<8) | (KX022_Content_ReadData[2]);
kbahar3 5:d39ffc5638a3 528 KX022_Accel_Z_RawOUT = (KX022_Content_ReadData[5]<<8) | (KX022_Content_ReadData[4]);
kbahar3 5:d39ffc5638a3 529
kbahar3 5:d39ffc5638a3 530 //apply needed changes (taken from arduino code)
kbahar3 5:d39ffc5638a3 531 KX022_Accel_X = (float)KX022_Accel_X_RawOUT / 16384;
kbahar3 5:d39ffc5638a3 532 KX022_Accel_Y = (float)KX022_Accel_Y_RawOUT / 16384;
kbahar3 5:d39ffc5638a3 533 KX022_Accel_Z = (float)KX022_Accel_Z_RawOUT / 16384;
kbahar3 5:d39ffc5638a3 534
kbahar3 5:d39ffc5638a3 535
kbahar3 5:d39ffc5638a3 536
kbahar3 5:d39ffc5638a3 537 //transmit the data
kbahar3 5:d39ffc5638a3 538 len = snprintf((char*) buf, MAX_REPLY_LEN, "KX022-X= %0.2f", KX022_Accel_X);
kbahar3 5:d39ffc5638a3 539 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 540 wait_ms(25);
kbahar3 5:d39ffc5638a3 541
kbahar3 5:d39ffc5638a3 542 len = snprintf((char*) buf, MAX_REPLY_LEN, "KX022-Y= %0.2f", KX022_Accel_Y);
kbahar3 5:d39ffc5638a3 543 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 544 wait_ms(25);
kbahar3 5:d39ffc5638a3 545
kbahar3 5:d39ffc5638a3 546 len = snprintf((char*) buf, MAX_REPLY_LEN, "KX022-Z= %0.2f", KX022_Accel_Z);
kbahar3 5:d39ffc5638a3 547 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 548 wait_ms(25);
kbahar3 5:d39ffc5638a3 549
kbahar3 5:d39ffc5638a3 550 }
kbahar3 5:d39ffc5638a3 551 #endif
kbahar3 5:d39ffc5638a3 552
kbahar3 5:d39ffc5638a3 553 #ifdef Pressure
kbahar3 5:d39ffc5638a3 554 if (m_ble.getGapState().connected) {
kbahar3 5:d39ffc5638a3 555 //Read color Portion from the IC
kbahar3 5:d39ffc5638a3 556 i2c.write(Press_addr_w, &Press_Addr_ReadData, 1, RepStart);
kbahar3 5:d39ffc5638a3 557 i2c.read(Press_addr_r, &Press_Content_ReadData[0], 6, NoRepStart);
kbahar3 5:d39ffc5638a3 558
kbahar3 5:d39ffc5638a3 559
kbahar3 5:d39ffc5638a3 560
kbahar3 5:d39ffc5638a3 561 BM1383_Temp_Out = (Press_Content_ReadData[1]<<8) | (Press_Content_ReadData[0]);
kbahar3 5:d39ffc5638a3 562 BM1383_Temp_Conv_Out = (float)BM1383_Temp_Out/32;
kbahar3 5:d39ffc5638a3 563
kbahar3 5:d39ffc5638a3 564 BM1383_Var = (Press_Content_ReadData[2]<<3) | (Press_Content_ReadData[3] >> 5);
kbahar3 5:d39ffc5638a3 565 BM1383_Deci = ((Press_Content_ReadData[3] & 0x1f) << 6 | ((Press_Content_ReadData[4] >> 2)));
kbahar3 5:d39ffc5638a3 566 BM1383_Deci = (float)BM1383_Deci* 0.00048828125; //0.00048828125 = 2^-11
kbahar3 5:d39ffc5638a3 567 BM1383_Pres_Conv_Out = (BM1383_Var + BM1383_Deci); //question pending here...
kbahar3 5:d39ffc5638a3 568
kbahar3 5:d39ffc5638a3 569 len = snprintf((char*) buf, MAX_REPLY_LEN, "Temp_out= %0.2f", BM1383_Temp_Out);
kbahar3 5:d39ffc5638a3 570 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 571 wait_ms(25);
kbahar3 5:d39ffc5638a3 572
kbahar3 5:d39ffc5638a3 573 len = snprintf((char*) buf, MAX_REPLY_LEN, "Temp_conv= %0.2f", BM1383_Temp_Conv_Out);
kbahar3 5:d39ffc5638a3 574 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 575 wait_ms(25);
kbahar3 5:d39ffc5638a3 576
kbahar3 5:d39ffc5638a3 577 len = snprintf((char*) buf, MAX_REPLY_LEN, "Press_conv= %0.2f", BM1383_Pres_Conv_Out);
kbahar3 5:d39ffc5638a3 578 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 5:d39ffc5638a3 579 wait_ms(25);
kbahar3 5:d39ffc5638a3 580 }
kbahar3 5:d39ffc5638a3 581 #endif
kbahar3 5:d39ffc5638a3 582
kbahar3 5:d39ffc5638a3 583 i=1;
kbahar3 5:d39ffc5638a3 584
kbahar3 5:d39ffc5638a3 585 }
kbahar3 5:d39ffc5638a3 586
kbahar3 5:d39ffc5638a3 587
kbahar3 5:d39ffc5638a3 588
kbahar3 5:d39ffc5638a3 589 }
Daniel Veilleux 0:442c7a6f1978 590 void error(ble_error_t err, uint32_t line)
Daniel Veilleux 0:442c7a6f1978 591 {
Daniel Veilleux 0:442c7a6f1978 592 m_error_led = 1;
Daniel Veilleux 0:442c7a6f1978 593 DEBUG("Error %d on line number %d\n\r", err, line);
Daniel Veilleux 0:442c7a6f1978 594 }
Daniel Veilleux 0:442c7a6f1978 595
kbahar3 1:2c0ab5cd1a7f 596 void PBTrigger()
kbahar3 1:2c0ab5cd1a7f 597 {
kbahar3 1:2c0ab5cd1a7f 598 uint8_t buf[MAX_REPLY_LEN];
kbahar3 1:2c0ab5cd1a7f 599 uint32_t len = 0;
kbahar3 1:2c0ab5cd1a7f 600
kbahar3 1:2c0ab5cd1a7f 601 m_cmd_led = !m_cmd_led;
kbahar3 1:2c0ab5cd1a7f 602
kbahar3 2:c7b9d588c80f 603
kbahar3 1:2c0ab5cd1a7f 604 if (m_ble.getGapState().connected) {
kbahar3 2:c7b9d588c80f 605 /*
kbahar3 1:2c0ab5cd1a7f 606 BH1620_ALS_value = BH1620_ALS.read_u16();
kbahar3 1:2c0ab5cd1a7f 607 BH1620_output = (float)BH1620_ALS_value * 1.543;
kbahar3 1:2c0ab5cd1a7f 608
kbahar3 1:2c0ab5cd1a7f 609 len = snprintf((char*) buf, MAX_REPLY_LEN, "ALS = %.2f lx", BH1620_output);
kbahar3 1:2c0ab5cd1a7f 610 m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
kbahar3 2:c7b9d588c80f 611 */
kbahar3 1:2c0ab5cd1a7f 612 }
kbahar3 1:2c0ab5cd1a7f 613 }
Daniel Veilleux 0:442c7a6f1978 614
Daniel Veilleux 0:442c7a6f1978 615 int main(void)
Daniel Veilleux 0:442c7a6f1978 616 {
Daniel Veilleux 0:442c7a6f1978 617 ble_error_t err;
Daniel Veilleux 0:442c7a6f1978 618 Ticker ticker;
Daniel Veilleux 0:442c7a6f1978 619
Daniel Veilleux 0:442c7a6f1978 620 m_serial_port.baud(UART_BAUD_RATE);
Daniel Veilleux 0:442c7a6f1978 621
kbahar3 2:c7b9d588c80f 622 DEBUG("Initialising...\n\r");
Daniel Veilleux 0:442c7a6f1978 623
Daniel Veilleux 0:442c7a6f1978 624 m_cmd_led = 0;
Daniel Veilleux 0:442c7a6f1978 625 m_error_led = 0;
kbahar3 2:c7b9d588c80f 626 //BH1620_ALS_value = 0;
Daniel Veilleux 0:442c7a6f1978 627
Daniel Veilleux 0:442c7a6f1978 628 ticker.attach(periodicCallback, SENSOR_READ_INTERVAL_S);
Daniel Veilleux 0:442c7a6f1978 629
kbahar3 1:2c0ab5cd1a7f 630 sw4Press.fall(&PBTrigger);
kbahar3 1:2c0ab5cd1a7f 631
kbahar3 5:d39ffc5638a3 632 #ifdef RPR0521 //als digital
kbahar3 2:c7b9d588c80f 633 // 1. Mode Control (0x41), write (0xC6): ALS EN, PS EN, 100ms measurement for ALS and PS, PS_PULSE=1
kbahar3 2:c7b9d588c80f 634 // 2. ALS_PS_CONTROL (0x42), write (0x03): LED Current = 200mA
kbahar3 2:c7b9d588c80f 635 // 3. PERSIST (0x43), write (0x20): PS Gain x4
kbahar3 2:c7b9d588c80f 636 i2c.write(RPR0521_addr_w, &RPR0521_ModeControl[0], 2, false);
kbahar3 2:c7b9d588c80f 637 i2c.write(RPR0521_addr_w, &RPR0521_ALSPSControl[0], 2, false);
kbahar3 2:c7b9d588c80f 638 i2c.write(RPR0521_addr_w, &RPR0521_Persist[0], 2, false);
kbahar3 1:2c0ab5cd1a7f 639 #endif
kbahar3 1:2c0ab5cd1a7f 640
kbahar3 3:c3ee9d663fb8 641 #ifdef KMX62
kbahar3 3:c3ee9d663fb8 642 // 1. CNTL2 (0x3A), write (0x5F): 4g, Max RES, EN temp mag and accel
kbahar3 3:c3ee9d663fb8 643 i2c.write(KMX62_addr_w, &KMX62_CNTL2[0], 2, false);
kbahar3 3:c3ee9d663fb8 644 #endif
kbahar3 3:c3ee9d663fb8 645
kbahar3 5:d39ffc5638a3 646 #ifdef color
kbahar3 5:d39ffc5638a3 647 // 1. CNTL2 (0x3A), write (0x5F): 4g, Max RES, EN temp mag and accel
kbahar3 5:d39ffc5638a3 648 i2c.write(BH1745_addr_w, &BH1745_persistence[0], 2, false);
kbahar3 5:d39ffc5638a3 649 i2c.write(BH1745_addr_w, &BH1745_mode1[0], 2, false);
kbahar3 5:d39ffc5638a3 650 i2c.write(BH1745_addr_w, &BH1745_mode2[0], 2, false);
kbahar3 5:d39ffc5638a3 651 i2c.write(BH1745_addr_w, &BH1745_mode3[0], 2, false);
kbahar3 5:d39ffc5638a3 652 #endif
kbahar3 5:d39ffc5638a3 653
kbahar3 5:d39ffc5638a3 654 #ifdef KX022
kbahar3 5:d39ffc5638a3 655
kbahar3 5:d39ffc5638a3 656 i2c.write(KX022_addr_w, &KX022_Accel_CNTL1[0], 2, false);
kbahar3 5:d39ffc5638a3 657 i2c.write(KX022_addr_w, &KX022_Accel_ODCNTL[0], 2, false);
kbahar3 5:d39ffc5638a3 658 i2c.write(KX022_addr_w, &KX022_Accel_CNTL3[0], 2, false);
kbahar3 5:d39ffc5638a3 659 i2c.write(KX022_addr_w, &KX022_Accel_TILT_TIMER[0], 2, false);
kbahar3 5:d39ffc5638a3 660 i2c.write(KX022_addr_w, &KX022_Accel_CNTL2[0], 2, false);
kbahar3 5:d39ffc5638a3 661
kbahar3 5:d39ffc5638a3 662 #endif
kbahar3 5:d39ffc5638a3 663
kbahar3 5:d39ffc5638a3 664 #ifdef Pressure
kbahar3 5:d39ffc5638a3 665
kbahar3 5:d39ffc5638a3 666 i2c.write(Press_addr_w, &PWR_DOWN[0], 2, false);
kbahar3 5:d39ffc5638a3 667 i2c.write(Press_addr_w, &SLEEP[0], 2, false);
kbahar3 5:d39ffc5638a3 668 i2c.write(Press_addr_w, &Mode_Control[0], 2, false);
kbahar3 5:d39ffc5638a3 669
kbahar3 5:d39ffc5638a3 670 #endif
kbahar3 5:d39ffc5638a3 671
kbahar3 2:c7b9d588c80f 672 //Start BTLE Initialization Section
Daniel Veilleux 0:442c7a6f1978 673 m_ble.init();
Daniel Veilleux 0:442c7a6f1978 674 m_ble.onDisconnection(disconnectionCallback);
Daniel Veilleux 0:442c7a6f1978 675 m_ble.onDataWritten(dataWrittenCallback);
Daniel Veilleux 0:442c7a6f1978 676 m_ble.onDataSent(dataSentCallback);
Daniel Veilleux 0:442c7a6f1978 677
Daniel Veilleux 0:442c7a6f1978 678 // Set the TX power in dBm units.
Daniel Veilleux 0:442c7a6f1978 679 // Possible values (in decreasing order): 4, 0, -4, -8, -12, -16, -20.
Daniel Veilleux 0:442c7a6f1978 680 err = m_ble.setTxPower(4);
Daniel Veilleux 0:442c7a6f1978 681 if (BLE_ERROR_NONE != err) {
Daniel Veilleux 0:442c7a6f1978 682 error(err, __LINE__);
Daniel Veilleux 0:442c7a6f1978 683 }
Daniel Veilleux 0:442c7a6f1978 684
Daniel Veilleux 0:442c7a6f1978 685 // Setup advertising (GAP stuff).
Daniel Veilleux 0:442c7a6f1978 686 err = m_ble.setDeviceName(DEVICE_NAME);
Daniel Veilleux 0:442c7a6f1978 687 if (BLE_ERROR_NONE != err) {
Daniel Veilleux 0:442c7a6f1978 688 error(err, __LINE__);
Daniel Veilleux 0:442c7a6f1978 689 }
Daniel Veilleux 0:442c7a6f1978 690
Daniel Veilleux 0:442c7a6f1978 691 err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
Daniel Veilleux 0:442c7a6f1978 692 if (BLE_ERROR_NONE != err) {
Daniel Veilleux 0:442c7a6f1978 693 error(err, __LINE__);
Daniel Veilleux 0:442c7a6f1978 694 }
Daniel Veilleux 0:442c7a6f1978 695
Daniel Veilleux 0:442c7a6f1978 696 m_ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Daniel Veilleux 0:442c7a6f1978 697
Daniel Veilleux 0:442c7a6f1978 698 err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
Daniel Veilleux 0:442c7a6f1978 699 (const uint8_t *)SHORT_NAME,
Daniel Veilleux 0:442c7a6f1978 700 (sizeof(SHORT_NAME) - 1));
Daniel Veilleux 0:442c7a6f1978 701 if (BLE_ERROR_NONE != err) {
Daniel Veilleux 0:442c7a6f1978 702 error(err, __LINE__);
Daniel Veilleux 0:442c7a6f1978 703 }
Daniel Veilleux 0:442c7a6f1978 704
Daniel Veilleux 0:442c7a6f1978 705 err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
Daniel Veilleux 0:442c7a6f1978 706 (const uint8_t *)UARTServiceUUID_reversed,
Daniel Veilleux 0:442c7a6f1978 707 sizeof(UARTServiceUUID_reversed));
Daniel Veilleux 0:442c7a6f1978 708 if (BLE_ERROR_NONE != err) {
Daniel Veilleux 0:442c7a6f1978 709 error(err, __LINE__);
Daniel Veilleux 0:442c7a6f1978 710 }
Daniel Veilleux 0:442c7a6f1978 711
Daniel Veilleux 0:442c7a6f1978 712 m_ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(ADV_INTERVAL_MS));
Daniel Veilleux 0:442c7a6f1978 713 m_ble.startAdvertising();
Daniel Veilleux 0:442c7a6f1978 714
Daniel Veilleux 0:442c7a6f1978 715 // Create a UARTService object (GATT stuff).
Daniel Veilleux 0:442c7a6f1978 716 UARTService uartService(m_ble);
Daniel Veilleux 0:442c7a6f1978 717 m_uart_service_ptr = &uartService;
Daniel Veilleux 0:442c7a6f1978 718
Daniel Veilleux 0:442c7a6f1978 719 while (true) {
Daniel Veilleux 0:442c7a6f1978 720 m_ble.waitForEvent();
Daniel Veilleux 0:442c7a6f1978 721 }
kbahar3 5:d39ffc5638a3 722 }