Dependencies:   BLE_API mbed nRF51822 paw8001motion32_5_m0_keil_split

Fork of Pixart by Lonnie Zhang

Committer:
ryanpeng84
Date:
Fri Dec 11 18:28:02 2015 +0000
Revision:
2:7dc466962683
Parent:
0:56543e77233d
trial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lonnie80236 0:56543e77233d 1 /* mbed Microcontroller Library
lonnie80236 0:56543e77233d 2 * Copyright (c) 2006-2013 ARM Limited
lonnie80236 0:56543e77233d 3 *
lonnie80236 0:56543e77233d 4 * Licensed under the Apache License, Version 2.0 (the "License");
lonnie80236 0:56543e77233d 5 * you may not use this file except in compliance with the License.
lonnie80236 0:56543e77233d 6 * You may obtain a copy of the License at
lonnie80236 0:56543e77233d 7 *
lonnie80236 0:56543e77233d 8 * http://www.apache.org/licenses/LICENSE-2.0
lonnie80236 0:56543e77233d 9 *
lonnie80236 0:56543e77233d 10 * Unless required by applicable law or agreed to in writing, software
lonnie80236 0:56543e77233d 11 * distributed under the License is distributed on an "AS IS" BASIS,
lonnie80236 0:56543e77233d 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
lonnie80236 0:56543e77233d 13 * See the License for the specific language governing permissions and
lonnie80236 0:56543e77233d 14 * limitations under the License.
lonnie80236 0:56543e77233d 15 */
lonnie80236 0:56543e77233d 16
lonnie80236 0:56543e77233d 17 #include "mbed.h"
lonnie80236 0:56543e77233d 18 #include "BLE.h"
lonnie80236 0:56543e77233d 19 #include "HeartRateService.h"
lonnie80236 0:56543e77233d 20 #include "BatteryService.h"
lonnie80236 0:56543e77233d 21 #include "DeviceInformationService.h"
lonnie80236 0:56543e77233d 22
lonnie80236 0:56543e77233d 23 BLEDevice ble;
lonnie80236 0:56543e77233d 24 DigitalOut led1(LED1);
lonnie80236 0:56543e77233d 25 /* ---------------------------------------------------------------
lonnie80236 0:56543e77233d 26 * Below for PAH8001 code
lonnie80236 0:56543e77233d 27 *///--------------------------------------------------------------
lonnie80236 0:56543e77233d 28 #include "app_util_platform.h"
lonnie80236 0:56543e77233d 29 #include "nrf_soc.h"
lonnie80236 0:56543e77233d 30 #include "app_util.h"
lonnie80236 0:56543e77233d 31 #include "PAH8001Set.h"
lonnie80236 0:56543e77233d 32 extern "C"
lonnie80236 0:56543e77233d 33 {
lonnie80236 0:56543e77233d 34 #include "pxialg.h"
lonnie80236 0:56543e77233d 35 }
lonnie80236 0:56543e77233d 36 Serial pc(USBTX, USBRX);
lonnie80236 0:56543e77233d 37 I2C i2c(I2C_SDA0, I2C_SCL0);
lonnie80236 0:56543e77233d 38 Ticker ticker;
lonnie80236 0:56543e77233d 39 /* Power optimized, 1.0mA @disconnection, 4.5mA @connection */
lonnie80236 0:56543e77233d 40 #define MIN_CONN_INTERVAL MSEC_TO_UNITS(379, UNIT_1_25_MS) /**< Minimum connection interval (379 ms) */
lonnie80236 0:56543e77233d 41 #define MAX_CONN_INTERVAL MSEC_TO_UNITS(399, UNIT_1_25_MS) /**< Maximum connection interval (399 ms). */
lonnie80236 0:56543e77233d 42 #define SLAVE_LATENCY 4 /**< Slave latency. */
lonnie80236 0:56543e77233d 43 #define CONN_SUP_TIMEOUT MSEC_TO_UNITS(6000, UNIT_10_MS) /**< Connection supervisory timeout (6 seconds). */
lonnie80236 0:56543e77233d 44 void rs232talk(void);
lonnie80236 0:56543e77233d 45 /* ---------------------------------------------------------------
lonnie80236 0:56543e77233d 46 * End of PAH8001 code
lonnie80236 0:56543e77233d 47 *///--------------------------------------------------------------
lonnie80236 0:56543e77233d 48
lonnie80236 0:56543e77233d 49 const static char DEVICE_NAME[] = "PixArt_HRmbed";
lonnie80236 0:56543e77233d 50 static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE,
lonnie80236 0:56543e77233d 51 GattService::UUID_BATTERY_SERVICE,
lonnie80236 0:56543e77233d 52 GattService::UUID_DEVICE_INFORMATION_SERVICE};
lonnie80236 0:56543e77233d 53 /* ---------------------------------------------------------------
lonnie80236 0:56543e77233d 54 * Below for PAH8001 code
lonnie80236 0:56543e77233d 55 *///--------------------------------------------------------------
lonnie80236 0:56543e77233d 56 static volatile bool triggerSensorPolling = false;
lonnie80236 0:56543e77233d 57 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
lonnie80236 0:56543e77233d 58 {
lonnie80236 0:56543e77233d 59 ble.gap().startAdvertising();
lonnie80236 0:56543e77233d 60 triggerSensorPolling = false;
lonnie80236 0:56543e77233d 61 PxiAlg_Close();//close and reset algorithm
lonnie80236 0:56543e77233d 62 }
lonnie80236 0:56543e77233d 63
lonnie80236 0:56543e77233d 64 void onconnectionCallback(const Gap::ConnectionCallbackParams_t *p_conn_param)
lonnie80236 0:56543e77233d 65 //void onconnectionCallback(Gap::Handle_t handle, Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr, const Gap::ConnectionParams_t *p_conn_param)
lonnie80236 0:56543e77233d 66 {
lonnie80236 0:56543e77233d 67 triggerSensorPolling = true;
lonnie80236 0:56543e77233d 68 Gap::ConnectionParams_t gap_conn_params;
lonnie80236 0:56543e77233d 69 gap_conn_params.minConnectionInterval = MIN_CONN_INTERVAL;
lonnie80236 0:56543e77233d 70 gap_conn_params.maxConnectionInterval = MAX_CONN_INTERVAL;
lonnie80236 0:56543e77233d 71 gap_conn_params.slaveLatency = SLAVE_LATENCY;
lonnie80236 0:56543e77233d 72 gap_conn_params.connectionSupervisionTimeout = CONN_SUP_TIMEOUT;
lonnie80236 0:56543e77233d 73 ble.gap().updateConnectionParams(p_conn_param->handle, &gap_conn_params);
lonnie80236 0:56543e77233d 74 }
lonnie80236 0:56543e77233d 75
lonnie80236 0:56543e77233d 76 void periodicCallback(void)
lonnie80236 0:56543e77233d 77 {uint8_t tmp;
lonnie80236 0:56543e77233d 78 if(triggerSensorPolling == true){
lonnie80236 0:56543e77233d 79 HR_Cnt++;
ryanpeng84 2:7dc466962683 80 //CRITICAL_REGION_ENTER();
lonnie80236 0:56543e77233d 81 Pixart_HRD();
ryanpeng84 2:7dc466962683 82 //CRITICAL_REGION_EXIT();
lonnie80236 0:56543e77233d 83
lonnie80236 0:56543e77233d 84 led1 = 1;
lonnie80236 0:56543e77233d 85 if(Pop(&ppg_mems_data)) //Get data from FIFO
lonnie80236 0:56543e77233d 86 {
lonnie80236 0:56543e77233d 87 MEMS_Data[0] = ppg_mems_data.MEMS_Data[0];
lonnie80236 0:56543e77233d 88 MEMS_Data[1] = ppg_mems_data.MEMS_Data[1];
lonnie80236 0:56543e77233d 89 MEMS_Data[2] = ppg_mems_data.MEMS_Data[2];
lonnie80236 0:56543e77233d 90
lonnie80236 0:56543e77233d 91 tmp = PxiAlg_Process(ppg_mems_data.HRD_Data, MEMS_Data);
lonnie80236 0:56543e77233d 92 if( tmp != FLAG_DATA_READY)
lonnie80236 0:56543e77233d 93 {
lonnie80236 0:56543e77233d 94 pc.printf("AlgoProcssRtn: %d\n\r", tmp);
lonnie80236 0:56543e77233d 95 pc.printf("PPG[8]: %d\n\r", ppg_mems_data.HRD_Data[8]);
lonnie80236 0:56543e77233d 96 }
lonnie80236 0:56543e77233d 97 else{
lonnie80236 0:56543e77233d 98 PxiAlg_HrGet(&myHR);
lonnie80236 0:56543e77233d 99 PxiAlg_GetSigGrade(&grade);
lonnie80236 0:56543e77233d 100 }
lonnie80236 0:56543e77233d 101 }
lonnie80236 0:56543e77233d 102 led1 = 0;
lonnie80236 0:56543e77233d 103
lonnie80236 0:56543e77233d 104
lonnie80236 0:56543e77233d 105 }
lonnie80236 0:56543e77233d 106 else
lonnie80236 0:56543e77233d 107 HR_Cnt = 0;
lonnie80236 0:56543e77233d 108 }
lonnie80236 0:56543e77233d 109
lonnie80236 0:56543e77233d 110 int main(void)
lonnie80236 0:56543e77233d 111 {
lonnie80236 0:56543e77233d 112 pc.baud (115200);
lonnie80236 0:56543e77233d 113 pc.printf("\n\rStart initialization\n\r");
lonnie80236 0:56543e77233d 114 i2c.frequency(400000);
lonnie80236 0:56543e77233d 115
lonnie80236 0:56543e77233d 116 led1 = 1;
lonnie80236 0:56543e77233d 117 PAH8001_init(); //PAH8001 initialization
lonnie80236 0:56543e77233d 118
lonnie80236 0:56543e77233d 119 ble.init();
lonnie80236 0:56543e77233d 120 ble.gap().onDisconnection(disconnectionCallback);
lonnie80236 0:56543e77233d 121 ble.gap().onConnection(onconnectionCallback);
lonnie80236 0:56543e77233d 122 /* Setup primary service. */
lonnie80236 0:56543e77233d 123 uint8_t hrmCounter = 100;
lonnie80236 0:56543e77233d 124 HeartRateService hrService(ble, hrmCounter, HeartRateService::LOCATION_FINGER);
lonnie80236 0:56543e77233d 125
lonnie80236 0:56543e77233d 126 /* Setup auxiliary services. */
lonnie80236 0:56543e77233d 127 BatteryService battery(ble);
lonnie80236 0:56543e77233d 128 DeviceInformationService deviceInfo(ble, "ARM", "Model1", "SN1", "hw-rev1", "fw-rev1", "soft-rev1");
lonnie80236 0:56543e77233d 129
lonnie80236 0:56543e77233d 130 /* Setup advertising. */
lonnie80236 0:56543e77233d 131 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
lonnie80236 0:56543e77233d 132 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
lonnie80236 0:56543e77233d 133 ble.accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR);
lonnie80236 0:56543e77233d 134 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
lonnie80236 0:56543e77233d 135 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
lonnie80236 0:56543e77233d 136 ble.setAdvertisingInterval(1600); /* 1000ms; in multiples of 0.625ms. */
lonnie80236 0:56543e77233d 137 ble.startAdvertising();
lonnie80236 0:56543e77233d 138
lonnie80236 0:56543e77233d 139 pc.printf("Before while 1\n\r");
lonnie80236 0:56543e77233d 140 while (true) {
lonnie80236 0:56543e77233d 141 rs232talk();
lonnie80236 0:56543e77233d 142
lonnie80236 0:56543e77233d 143 if(triggerSensorPolling == true)
lonnie80236 0:56543e77233d 144 {
lonnie80236 0:56543e77233d 145 if( (HR_Cnt>HR_Rpt) && (ppg_mems_data.HRD_Data[11]==0x80) )
lonnie80236 0:56543e77233d 146 {
lonnie80236 0:56543e77233d 147 HR_Cnt = 0;
lonnie80236 0:56543e77233d 148
lonnie80236 0:56543e77233d 149 pc.printf("SG: %d ", (uint8_t)grade);
lonnie80236 0:56543e77233d 150 pc.printf("HR: %d\n\r", (uint8_t)myHR);
lonnie80236 0:56543e77233d 151
lonnie80236 0:56543e77233d 152 hrmCounter = (uint8_t)myHR;
lonnie80236 0:56543e77233d 153 hrService.updateHeartRate(hrmCounter);
lonnie80236 0:56543e77233d 154 }
lonnie80236 0:56543e77233d 155 }
lonnie80236 0:56543e77233d 156 else
lonnie80236 0:56543e77233d 157 ble.waitForEvent();
lonnie80236 0:56543e77233d 158 }
lonnie80236 0:56543e77233d 159 }
lonnie80236 0:56543e77233d 160
lonnie80236 0:56543e77233d 161
lonnie80236 0:56543e77233d 162
lonnie80236 0:56543e77233d 163 void PAH8001_init()
lonnie80236 0:56543e77233d 164 { uint16_t q;
lonnie80236 0:56543e77233d 165 uint8_t bank=0, temp; float grade=0;
lonnie80236 0:56543e77233d 166
lonnie80236 0:56543e77233d 167 if(readRegister(0x00) == 0x30)
lonnie80236 0:56543e77233d 168 pc.printf("PAH8001 I2C Link Successful!\n\r");
lonnie80236 0:56543e77233d 169 else
lonnie80236 0:56543e77233d 170 pc.printf("PAH8001 I2C Link Fail!\n\r");
lonnie80236 0:56543e77233d 171
lonnie80236 0:56543e77233d 172 alg_version = PxiAlg_Version();
lonnie80236 0:56543e77233d 173 pc.printf("Algo Ver: %d\n\r", alg_version);
lonnie80236 0:56543e77233d 174
lonnie80236 0:56543e77233d 175
lonnie80236 0:56543e77233d 176 #ifdef DEBUG_8001
lonnie80236 0:56543e77233d 177 writeRegister(0x09, 0x5A); writeRegister(0x54, 0xEE);
lonnie80236 0:56543e77233d 178 pc.printf("\n\r~~~Start Test Pattern~~~ \n\r");
lonnie80236 0:56543e77233d 179 pc.printf("Reg0x09: %d\n\r", readRegister(0x09));
lonnie80236 0:56543e77233d 180 pc.printf("Reg0x54: %d\n\r", readRegister(0x54));
lonnie80236 0:56543e77233d 181 pc.printf("Reg0x1E: %d\n\r", readRegister(0x1E));
lonnie80236 0:56543e77233d 182
lonnie80236 0:56543e77233d 183 float MEMS_Data[3] = {0 ,0, 0}; //apply test pattern
lonnie80236 0:56543e77233d 184 float myHR = 0 ;
lonnie80236 0:56543e77233d 185 /*for(q=0;q<PPG_PATTERN_SIZE;q++)
lonnie80236 0:56543e77233d 186 PxiAlg_Process((unsigned char*)PPG_Data[q], MEMS_Data);
lonnie80236 0:56543e77233d 187 PxiAlg_HrGet(&myHR);
lonnie80236 0:56543e77233d 188 pc.printf("HR: %f\n\r", myHR);*/
lonnie80236 0:56543e77233d 189
lonnie80236 0:56543e77233d 190 PxiAlg_SetMemsScale(1);
lonnie80236 0:56543e77233d 191 for(q=0;q<PPG_PATTERN_SIZE;q++)
lonnie80236 0:56543e77233d 192 {
lonnie80236 0:56543e77233d 193 PxiAlg_Process((unsigned char*)PPG_Data[q], (float*)iMEMS_Data[q]);
lonnie80236 0:56543e77233d 194 PxiAlg_HrGet(&myHR); PxiAlg_GetSigGrade(&grade);
lonnie80236 0:56543e77233d 195 pc.printf("SG: %f ", grade);
lonnie80236 0:56543e77233d 196 pc.printf("HR: %f\n\r", myHR);
lonnie80236 0:56543e77233d 197 }
lonnie80236 0:56543e77233d 198 pc.printf("~~~End of Test Pattern~~~ \n\r");
lonnie80236 0:56543e77233d 199 while(1);
lonnie80236 0:56543e77233d 200 #endif
lonnie80236 0:56543e77233d 201
lonnie80236 0:56543e77233d 202 #ifndef DEBUG_8001
lonnie80236 0:56543e77233d 203 PxiAlg_SetMemsScale(1);
lonnie80236 0:56543e77233d 204 //PxiAlg_EnableFastOutput(true);
lonnie80236 0:56543e77233d 205 PxiAlg_EnableFastOutput(false);
lonnie80236 0:56543e77233d 206 PxiAlg_EnableAutoMode(true);
lonnie80236 0:56543e77233d 207 PxiAlg_EnableMotionMode(false);
lonnie80236 0:56543e77233d 208 ticker.attach_us(&periodicCallback, PAH8001_Poll*1000);
lonnie80236 0:56543e77233d 209
lonnie80236 0:56543e77233d 210 pc.printf("\n\r~~~Start Real-time HRM~~~ \n\r");
lonnie80236 0:56543e77233d 211 //Initialization settings
lonnie80236 0:56543e77233d 212 writeRegister(0x06, 0x82); //Reset sensor
lonnie80236 0:56543e77233d 213 wait_ms(10); //make a delay
lonnie80236 0:56543e77233d 214
lonnie80236 0:56543e77233d 215 for(q=0;q<INIT_PPG_REG_ARRAY_SIZE;q++){
lonnie80236 0:56543e77233d 216 if(init_ppg_register_array[q][0] == 0x7F)
lonnie80236 0:56543e77233d 217 bank = init_ppg_register_array[q][1];
lonnie80236 0:56543e77233d 218
lonnie80236 0:56543e77233d 219 if((bank == 0) && (init_ppg_register_array[q][0] == 0x17) )
lonnie80236 0:56543e77233d 220 {
lonnie80236 0:56543e77233d 221 //read and write bit7=1
lonnie80236 0:56543e77233d 222 temp = readRegister(0x17);
lonnie80236 0:56543e77233d 223 temp |= 0x80 ;
lonnie80236 0:56543e77233d 224 writeRegister(0x17, temp) ;
lonnie80236 0:56543e77233d 225 }
lonnie80236 0:56543e77233d 226 else
lonnie80236 0:56543e77233d 227 writeRegister(init_ppg_register_array[q][0], init_ppg_register_array[q][1]);
lonnie80236 0:56543e77233d 228 }
lonnie80236 0:56543e77233d 229 #endif
lonnie80236 0:56543e77233d 230 }
lonnie80236 0:56543e77233d 231
lonnie80236 0:56543e77233d 232 void writeRegister(uint8_t addr, uint8_t data)
lonnie80236 0:56543e77233d 233 {
lonnie80236 0:56543e77233d 234 char data_write[2];
lonnie80236 0:56543e77233d 235
lonnie80236 0:56543e77233d 236 data_write[0] = addr;
lonnie80236 0:56543e77233d 237 data_write[1] = data;
lonnie80236 0:56543e77233d 238 i2c.write(I2C_ADDR, data_write, 2, 0);
lonnie80236 0:56543e77233d 239 }
lonnie80236 0:56543e77233d 240 uint8_t readRegister(uint8_t addr)
lonnie80236 0:56543e77233d 241 {
lonnie80236 0:56543e77233d 242 char data_write[2];
lonnie80236 0:56543e77233d 243 char data_read[2];
lonnie80236 0:56543e77233d 244
lonnie80236 0:56543e77233d 245 data_write[0] = addr;
lonnie80236 0:56543e77233d 246 i2c.write(I2C_ADDR, data_write, 1, 0);
lonnie80236 0:56543e77233d 247 i2c.read(I2C_ADDR, data_read, 1, 0);
lonnie80236 0:56543e77233d 248 return data_read[0];
lonnie80236 0:56543e77233d 249 }
lonnie80236 0:56543e77233d 250
lonnie80236 0:56543e77233d 251 bool Pixart_HRD(void)
lonnie80236 0:56543e77233d 252 {
lonnie80236 0:56543e77233d 253 uint8_t tmp=0;
lonnie80236 0:56543e77233d 254 char data_write[2];
lonnie80236 0:56543e77233d 255 char data_read[4];
lonnie80236 0:56543e77233d 256 ppg_mems_data_t ppg_mems_data;
lonnie80236 0:56543e77233d 257 //Check Touch Status for power saving
lonnie80236 0:56543e77233d 258 writeRegister(0x7F,0x00); //bank0
lonnie80236 0:56543e77233d 259 tmp = readRegister(0x59)&0x80;
lonnie80236 0:56543e77233d 260 led_ctrl(tmp);
lonnie80236 0:56543e77233d 261
lonnie80236 0:56543e77233d 262 //writeRegister(0x7F,0x01); //bank1
lonnie80236 0:56543e77233d 263 ppg_mems_data.HRD_Data[0]=readRegister(0x68)&0x0f; //check status: 0 is not ready, 1 is ready, 2 is loss one data?
lonnie80236 0:56543e77233d 264
lonnie80236 0:56543e77233d 265 if(ppg_mems_data.HRD_Data[0] ==0)
lonnie80236 0:56543e77233d 266 {
lonnie80236 0:56543e77233d 267 writeRegister(0x7F,0x00); //bank0
lonnie80236 0:56543e77233d 268 return false;
lonnie80236 0:56543e77233d 269 }
lonnie80236 0:56543e77233d 270 else
lonnie80236 0:56543e77233d 271 {
lonnie80236 0:56543e77233d 272 //Only support burst read (0x64~0x67), when using I2C interface
lonnie80236 0:56543e77233d 273 data_write[0] = 0x64;
lonnie80236 0:56543e77233d 274 i2c.write(PAH8001_ADDR, data_write, 1, 1);
lonnie80236 0:56543e77233d 275 i2c.read(PAH8001_ADDR, data_read, 4, 0);
lonnie80236 0:56543e77233d 276 ppg_mems_data.HRD_Data[1]=data_read[0]&0xff;
lonnie80236 0:56543e77233d 277 ppg_mems_data.HRD_Data[2]=data_read[1]&0xff;
lonnie80236 0:56543e77233d 278 ppg_mems_data.HRD_Data[3]=data_read[2]&0xff;
lonnie80236 0:56543e77233d 279 ppg_mems_data.HRD_Data[4]=data_read[3]&0xff;
lonnie80236 0:56543e77233d 280
lonnie80236 0:56543e77233d 281 //Only support burst read (0x1A~0x1C), when using I2C interface
lonnie80236 0:56543e77233d 282 data_write[0] = 0x1A;
lonnie80236 0:56543e77233d 283 i2c.write(PAH8001_ADDR, data_write, 1, 1);
lonnie80236 0:56543e77233d 284 i2c.read(PAH8001_ADDR, data_read, 3, 0);
lonnie80236 0:56543e77233d 285 ppg_mems_data.HRD_Data[5]=data_read[0]&0xff;
lonnie80236 0:56543e77233d 286 ppg_mems_data.HRD_Data[6]=data_read[1]&0xff;
lonnie80236 0:56543e77233d 287 ppg_mems_data.HRD_Data[7]=data_read[2]&0xff;
lonnie80236 0:56543e77233d 288
lonnie80236 0:56543e77233d 289 ppg_mems_data.HRD_Data[8]=Frame_Count++;
lonnie80236 0:56543e77233d 290 ppg_mems_data.HRD_Data[9]=0;
lonnie80236 0:56543e77233d 291 ppg_mems_data.HRD_Data[10]=_led_current_change_flag;
lonnie80236 0:56543e77233d 292 writeRegister(0x7F,0x00); //bank0
lonnie80236 0:56543e77233d 293 //bit7 is Touch Flag (bit7=1 is meant Touch, and bit7=0 is meant No Touch)
lonnie80236 0:56543e77233d 294 ppg_mems_data.HRD_Data[11]=(readRegister(0x59)&0x80); //Check Touch Flag
lonnie80236 0:56543e77233d 295 ppg_mems_data.HRD_Data[12]= ppg_mems_data.HRD_Data[6];
lonnie80236 0:56543e77233d 296
lonnie80236 0:56543e77233d 297 //If no G sensor, please set G_Sensor_Data[3] = {0};
lonnie80236 0:56543e77233d 298 ppg_mems_data.MEMS_Data[0] = 0;//ReadGSensorX();
lonnie80236 0:56543e77233d 299 ppg_mems_data.MEMS_Data[1] = 0;//ReadGSensorY();
lonnie80236 0:56543e77233d 300 ppg_mems_data.MEMS_Data[2] = 0;//ReadGSensorZ();
lonnie80236 0:56543e77233d 301 Push(&ppg_mems_data); //Save data into FIFO
lonnie80236 0:56543e77233d 302
lonnie80236 0:56543e77233d 303 return true;
lonnie80236 0:56543e77233d 304 }
lonnie80236 0:56543e77233d 305 }
lonnie80236 0:56543e77233d 306
lonnie80236 0:56543e77233d 307 bool isFIFOEmpty(void)
lonnie80236 0:56543e77233d 308 {
lonnie80236 0:56543e77233d 309 return (_write_index == _read_index);
lonnie80236 0:56543e77233d 310 }
lonnie80236 0:56543e77233d 311
lonnie80236 0:56543e77233d 312 bool Push(ppg_mems_data_t *data)
lonnie80236 0:56543e77233d 313 {
lonnie80236 0:56543e77233d 314 int tmp = _write_index;
lonnie80236 0:56543e77233d 315 tmp++;
lonnie80236 0:56543e77233d 316 if(tmp >= FIFO_SIZE)
lonnie80236 0:56543e77233d 317 tmp = 0;
lonnie80236 0:56543e77233d 318 if(tmp == _read_index)
lonnie80236 0:56543e77233d 319 return false;
lonnie80236 0:56543e77233d 320 _ppg_mems_data[tmp] = *data;
lonnie80236 0:56543e77233d 321 _write_index = tmp;
lonnie80236 0:56543e77233d 322
lonnie80236 0:56543e77233d 323 return true;
lonnie80236 0:56543e77233d 324 }
lonnie80236 0:56543e77233d 325
lonnie80236 0:56543e77233d 326 bool Pop(ppg_mems_data_t *data)
lonnie80236 0:56543e77233d 327 {
lonnie80236 0:56543e77233d 328 int tmp;
lonnie80236 0:56543e77233d 329 if(isFIFOEmpty())
lonnie80236 0:56543e77233d 330 return false;
lonnie80236 0:56543e77233d 331 *data = _ppg_mems_data[_read_index];
lonnie80236 0:56543e77233d 332 tmp = _read_index + 1;
lonnie80236 0:56543e77233d 333 if(tmp >= FIFO_SIZE)
lonnie80236 0:56543e77233d 334 tmp = 0;
lonnie80236 0:56543e77233d 335 _read_index = tmp;
lonnie80236 0:56543e77233d 336
lonnie80236 0:56543e77233d 337 return true;
lonnie80236 0:56543e77233d 338 }
lonnie80236 0:56543e77233d 339
lonnie80236 0:56543e77233d 340 /***********************LED Control Start***********************************/
lonnie80236 0:56543e77233d 341 void led_ctrl(uint8_t touch) {
lonnie80236 0:56543e77233d 342 if(touch == 0x80) {
lonnie80236 0:56543e77233d 343 uint8_t data;
lonnie80236 0:56543e77233d 344 //uint16_t Frame_Average, EP_L, EP_H, Exposure_Line;
lonnie80236 0:56543e77233d 345 uint16_t EP_L, EP_H, Exposure_Line;
lonnie80236 0:56543e77233d 346 writeRegister(0x7f,0x00);
lonnie80236 0:56543e77233d 347 writeRegister(0x05,0x98);
lonnie80236 0:56543e77233d 348 writeRegister(0x7f,0x01);
lonnie80236 0:56543e77233d 349 //writeRegister(0x42,0xA4);
lonnie80236 0:56543e77233d 350 writeRegister(0x7f,0x00);
lonnie80236 0:56543e77233d 351 data = readRegister(0x33);
lonnie80236 0:56543e77233d 352 EP_H=data&0x03;
lonnie80236 0:56543e77233d 353 data = readRegister(0x32);
lonnie80236 0:56543e77233d 354 EP_L=data;
lonnie80236 0:56543e77233d 355 Exposure_Line=(EP_H<<8)+EP_L;
lonnie80236 0:56543e77233d 356 writeRegister(0x7f,0x01);
lonnie80236 0:56543e77233d 357 if(_sleepflag==1) {
lonnie80236 0:56543e77233d 358 writeRegister(0x38, (0xE0|DEFAULT_LED_STEP));
lonnie80236 0:56543e77233d 359 _sleepflag = 0 ;
lonnie80236 0:56543e77233d 360 }
lonnie80236 0:56543e77233d 361
lonnie80236 0:56543e77233d 362 if (_state_count <= STATE_COUNT_TH) {
lonnie80236 0:56543e77233d 363 _state_count++;
lonnie80236 0:56543e77233d 364 _led_current_change_flag = 0;
lonnie80236 0:56543e77233d 365 }
lonnie80236 0:56543e77233d 366 else {
lonnie80236 0:56543e77233d 367 _state_count = 0;
lonnie80236 0:56543e77233d 368 if(_state == 0) {
lonnie80236 0:56543e77233d 369 if( (Exposure_Line>=LED_CTRL_EXPO_TIME_HI_BOUND) || (Exposure_Line<=LED_CTRL_EXPO_TIME_LOW_BOUND) ) {
lonnie80236 0:56543e77233d 370 //writeRegister(0x7f,0x01);
lonnie80236 0:56543e77233d 371 data = readRegister(0x38);
lonnie80236 0:56543e77233d 372 _led_step=data&0x1f;
lonnie80236 0:56543e77233d 373 if( (Exposure_Line>=LED_CTRL_EXPO_TIME_HI_BOUND) && (_led_step < LED_CURRENT_HI) ) {
lonnie80236 0:56543e77233d 374 _state = 1 ;
lonnie80236 0:56543e77233d 375 _led_step=_led_step+LED_INC_DEC_STEP;
lonnie80236 0:56543e77233d 376
lonnie80236 0:56543e77233d 377 if(_led_step>LED_CURRENT_HI)
lonnie80236 0:56543e77233d 378 _led_step=LED_CURRENT_HI;
lonnie80236 0:56543e77233d 379 writeRegister(0x38, (_led_step|0xE0));
lonnie80236 0:56543e77233d 380 _led_current_change_flag = 1;
lonnie80236 0:56543e77233d 381 }
lonnie80236 0:56543e77233d 382 else if((Exposure_Line<=LED_CTRL_EXPO_TIME_LOW_BOUND) && (_led_step > LED_CURRENT_LOW) ) {
lonnie80236 0:56543e77233d 383 _state = 2 ;
lonnie80236 0:56543e77233d 384 if(_led_step<=(LED_CURRENT_LOW+LED_INC_DEC_STEP))
lonnie80236 0:56543e77233d 385 _led_step=LED_CURRENT_LOW;
lonnie80236 0:56543e77233d 386 else
lonnie80236 0:56543e77233d 387 _led_step=_led_step-LED_INC_DEC_STEP;
lonnie80236 0:56543e77233d 388 writeRegister(0x38, (_led_step|0xE0));
lonnie80236 0:56543e77233d 389 _led_current_change_flag = 1;
lonnie80236 0:56543e77233d 390 }
lonnie80236 0:56543e77233d 391 else {
lonnie80236 0:56543e77233d 392 _state = 0 ;
lonnie80236 0:56543e77233d 393 _led_current_change_flag = 0;
lonnie80236 0:56543e77233d 394 }
lonnie80236 0:56543e77233d 395 }
lonnie80236 0:56543e77233d 396 else {
lonnie80236 0:56543e77233d 397 _led_current_change_flag = 0;
lonnie80236 0:56543e77233d 398 }
lonnie80236 0:56543e77233d 399 }
lonnie80236 0:56543e77233d 400 else if(_state == 1) {
lonnie80236 0:56543e77233d 401 if(Exposure_Line > LED_CTRL_EXPO_TIME_HI) {
lonnie80236 0:56543e77233d 402 _state = 1 ;
lonnie80236 0:56543e77233d 403 _led_step=_led_step+LED_INC_DEC_STEP;
lonnie80236 0:56543e77233d 404 if(_led_step>=LED_CURRENT_HI) {
lonnie80236 0:56543e77233d 405 _state = 0 ;
lonnie80236 0:56543e77233d 406 _led_step=LED_CURRENT_HI;
lonnie80236 0:56543e77233d 407 }
lonnie80236 0:56543e77233d 408 writeRegister(0x38, (_led_step|0xE0));
lonnie80236 0:56543e77233d 409 _led_current_change_flag = 1;
lonnie80236 0:56543e77233d 410 }
lonnie80236 0:56543e77233d 411 else {
lonnie80236 0:56543e77233d 412 _state = 0 ;
lonnie80236 0:56543e77233d 413 _led_current_change_flag = 0;
lonnie80236 0:56543e77233d 414 }
lonnie80236 0:56543e77233d 415 }
lonnie80236 0:56543e77233d 416 else {
lonnie80236 0:56543e77233d 417 if(Exposure_Line < LED_CTRL_EXPO_TIME_LOW) {
lonnie80236 0:56543e77233d 418 _state = 2 ;
lonnie80236 0:56543e77233d 419 if(_led_step<=(LED_CURRENT_LOW+LED_INC_DEC_STEP)) {
lonnie80236 0:56543e77233d 420 _state = 0 ;
lonnie80236 0:56543e77233d 421 _led_step=LED_CURRENT_LOW;
lonnie80236 0:56543e77233d 422 }
lonnie80236 0:56543e77233d 423 else
lonnie80236 0:56543e77233d 424 _led_step=_led_step-LED_INC_DEC_STEP;
lonnie80236 0:56543e77233d 425 writeRegister(0x38, (_led_step|0xE0));
lonnie80236 0:56543e77233d 426 _led_current_change_flag = 1;
lonnie80236 0:56543e77233d 427 }
lonnie80236 0:56543e77233d 428 else {
lonnie80236 0:56543e77233d 429 _state = 0;
lonnie80236 0:56543e77233d 430 _led_current_change_flag = 0;
lonnie80236 0:56543e77233d 431 }
lonnie80236 0:56543e77233d 432 }
lonnie80236 0:56543e77233d 433 }
lonnie80236 0:56543e77233d 434 }
lonnie80236 0:56543e77233d 435 else {
lonnie80236 0:56543e77233d 436 writeRegister(0x7f,0x00);
lonnie80236 0:56543e77233d 437 writeRegister(0x05,0xB8);
lonnie80236 0:56543e77233d 438 writeRegister(0x7F,0x01);
lonnie80236 0:56543e77233d 439 //writeRegister(0x42,0xA0);
lonnie80236 0:56543e77233d 440 _led_step = DEFAULT_LED_STEP;
lonnie80236 0:56543e77233d 441 writeRegister(0x38, 0xFF);
lonnie80236 0:56543e77233d 442 _sleepflag = 1;
lonnie80236 0:56543e77233d 443 _led_current_change_flag = 0;
lonnie80236 0:56543e77233d 444 }
lonnie80236 0:56543e77233d 445 }
lonnie80236 0:56543e77233d 446 /***********************LED Control End ***********************************/
lonnie80236 0:56543e77233d 447
lonnie80236 0:56543e77233d 448
lonnie80236 0:56543e77233d 449 void rs232talk(void)
lonnie80236 0:56543e77233d 450 {uint8_t tmp, reg_tmp[5], reg[2];
lonnie80236 0:56543e77233d 451 if(pc.readable()) {
lonnie80236 0:56543e77233d 452 //pc.putc(pc.getc());
lonnie80236 0:56543e77233d 453 tmp = pc.getc();
lonnie80236 0:56543e77233d 454 if(tmp == 's')//for start polling
lonnie80236 0:56543e77233d 455 {
lonnie80236 0:56543e77233d 456 pc.printf("\n\rForce Start Polling\n\r");
lonnie80236 0:56543e77233d 457 triggerSensorPolling = true;
lonnie80236 0:56543e77233d 458 }
lonnie80236 0:56543e77233d 459 if(tmp == 'p')//for stop polling
lonnie80236 0:56543e77233d 460 {
lonnie80236 0:56543e77233d 461 pc.printf("\n\rForce Stop Polling\n\r");
lonnie80236 0:56543e77233d 462 triggerSensorPolling = false;
lonnie80236 0:56543e77233d 463 PxiAlg_Close();//close and reset algorithm
lonnie80236 0:56543e77233d 464 }
lonnie80236 0:56543e77233d 465
lonnie80236 0:56543e77233d 466 if(tmp == 'w')//write register
lonnie80236 0:56543e77233d 467 {
lonnie80236 0:56543e77233d 468 //writeRegister(0x06, 0x08);
lonnie80236 0:56543e77233d 469 }
lonnie80236 0:56543e77233d 470 if(tmp == 'r')//read register
lonnie80236 0:56543e77233d 471 {
lonnie80236 0:56543e77233d 472 //writeRegister(0x06, 0x00);
lonnie80236 0:56543e77233d 473 }
lonnie80236 0:56543e77233d 474 }
lonnie80236 0:56543e77233d 475 }
lonnie80236 0:56543e77233d 476 /* ---------------------------------------------------------------
lonnie80236 0:56543e77233d 477 * End of PAH8001 code
lonnie80236 0:56543e77233d 478 *///--------------------------------------------------------------