Dependencies: BLE_API mbed nRF51822 paw8001motion32_5_m0_keil_split
Fork of Pixart by
main.cpp@2:7dc466962683, 2015-12-11 (annotated)
- 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?
User | Revision | Line number | New 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 | *///-------------------------------------------------------------- |