![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
test
Dependencies: BLE_API mbed nRF51822
Diff: main.cpp
- Revision:
- 0:a394a04bd0b7
- Child:
- 1:88e3620627f9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Feb 26 22:53:44 2016 +0000 @@ -0,0 +1,765 @@ +/* + SAD: 0x72 + TASK: WRITE 0x12 to register 0x42 then start reading. + + +mbed Microcontroller Library +* Copyright (c) 2006-2013 ARM Limited +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +//#define AnalogTemp //BDE0600 +//#define AnalogUV //ML8511 +//#define HallSensor //BU52011 //Change 1: Change to use GPIO for BU52014 +//#define RPR0521 //RPR0521 //Change 2: Remove This and add in the RPR-0521 +//#define KMX62 //Change 3: Add Code For BH1745, KX022, BM1383GLV, KMX62 + +#include "mbed.h" +#include "BLEDevice.h" +#include "UARTService.h" +#include "nrf_temp.h" +#include "I2C.h" +#include <string> +#include "stdlib.h" +//#include "C12832.h" + +#define MAX_REPLY_LEN (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN) //Actually equal to 20 +#define SENSOR_READ_INTERVAL_S (0.2F) +#define ADV_INTERVAL_MS (1000UL) +#define UART_BAUD_RATE (19200UL) +#define DEVICE_NAME ("Rohm") // This can be read AFTER connecting to the device. +#define SHORT_NAME ("BH1745") // Keep this short: max 8 chars if a 128bit UUID is also advertised. +#define DEBUG(...) { m_serial_port.printf(__VA_ARGS__); } + +#define BH1745 //KX022, Accelerometer Sensor +//#define BatteryI2C + +// Function Prototypes +void PBTrigger(); //Interrupt function for PB4 + +// Global Variables +BLEDevice m_ble; +Serial m_serial_port(p9, p11); // TX pin, RX pin +DigitalOut m_cmd_led(LED1); //Original Declaration +//PwmOut m_cmd_led(LED1); //Original Declaration +PwmOut PWM(p4); +PwmOut hornFreq(p13); +DigitalOut m_error_led(LED2); +UARTService *m_uart_service_ptr; +//InterruptIn sw4Press(p18); +InterruptIn resetCruise(p21); +DigitalIn hornEnable(p18); +InterruptIn setCruise(p20); +I2C i2c(p7,p30); + +//C12832 lcd(p25, p29, p28, p1, p0); +//DigitalOut LCD_RESET(p24); +DigitalOut LED_Enable(p1); +//DigitalOut LED_EnableR(p1); + +AnalogIn brake(p3); //Haven't done anything with this yet! +char BrakeIn, isClimbStop; + +//General Debug +//DigitalOut Test1(p12); +//DigitalOut Test1(p13); +//DigitalOut Test2(p14); +//DigitalOut Test3(p15); + + +AnalogIn Hall(p5); //p3 on prior EVK, p5 on the shield +AnalogIn Speed(p2); //p3 on prior EVK, p5 on the shield +uint16_t Speed_value; +uint16_t Speed_Thres = 1000; +uint16_t VsetThresh = 1; +uint16_t ADC_value,isIncreasing; +uint16_t deltaStep = 5; +uint16_t OutputLimit = 20;//10000; //Maximum increase ADC Value per loop +uint16_t LoopDelay = 50; //Loop Time in ms +uint16_t HALL_value; +uint16_t ADC_value_old = 0; +uint16_t deltaT = 100; +uint16_t ampModeDecrease = 50; +uint16_t tick; +uint16_t pOffset = 54000; +uint16_t pGain = 150; +uint16_t ExtModeGain = 150; +uint16_t AmpModeGain = 250; +uint16_t isDecreasing, currSpeed,prevSpeed; +uint16_t climbCnt; +uint16_t climbPer = 100; +uint16_t autoClimbThresh = 110; +uint16_t isLocked = 0; +uint16_t timerX, timerY, timerZ, isLightOn; +float ADC_output; +uint16_t SpeedSampNum = 3; +uint16_t speedDelta = 24; +uint16_t Mode = 0; +//string OutSetting; +uint16_t isConnected = 0; +int32_t p, LoopID; +int16_t cruiseSet = 0; +int16_t cruiseFlag = 0; +int16_t SpeedSet=0; +int16_t speedStep = 10; +int16_t i,j; +int16_t tempSpeed; +int16_t isAmpMode = 0; +bool RepStart = true; +bool NoRepStart = false; +bool LED_Command = false; +double chromaX, chromaY, tempCIE; +double CIEx[60]; +double CIEy[60]; + +double xPPU2_14 = 0.03221; +double yPPU2_14 = 0.02597; + +double xPPU18_5 = 0.07085; +double yPPU18_5 = 0.06684; + +double xPPU18_4 = 0.04707; +double yPPU18_4 = 0.04474; + +double xPPU18_3 = 0.03384; +double yPPU18_3 = 0.03223; + +double xPPU17_18 = 0.03440; +double yPPU17_18 = 0.03201; + +double xPPU5_6 = 0.04115; +double yPPU5_6 = 0.03835; + +double xPPU4_15 = 0.08183; +double yPPU4_15 = 0.07357; + +double xPPU4_14 = 0.07272; +double yPPU4_14 = 0.06621; + +double xPPU4_13 = 0.07797; +double yPPU4_13 = 0.07208; + +double xPPU4_10 = 0.09362; +double yPPU4_10 = 0.08590; + +double xPPU4_8 = 0.07635; +double yPPU4_8 = 0.07052; + + +double xThresh = 0.0004; +double yThresh = 0.0004; + +string dataReceived = "aa"; + uint8_t buf[19]; + uint32_t len = 0; + string OutSetting = ""; + + +#ifdef BH1745 +int BH1745_addr_w = 0x72; +int BH1745_addr_r = 0x73; + +char BH1745_CTRL2[2] = {0x42, 0x11}; + +char BH1745_Content_ReadData[8]; + +float BH1745_Red; +float BH1745_Green; +float BH1745_Blue; +float BH1745_Clear; + +float SUM_BH1745_Red[10]; +float SUM_BH1745_Green[10]; +float SUM_BH1745_Blue[10]; +float SUM_BH1745_Clear[10]; + +double colorSum; +int colorNum; + +short int BH1745_Raw_R = 0; +short int BH1745_Raw_G = 0; +short int BH1745_Raw_B = 0; +short int BH1745_Raw_C = 0; + +char BH1745_Red_Data_LSB = 0x50; + + + int sampleNum=0; + char message[20]; + float rValue, gValue, bValue, cValue; + + float colorError; + +#endif + +#ifdef BatteryI2C +int BMS_addr_w = 0x16; //0x2C; +int BMS_addr_r = 0x17; //0x2D; + +char BMS_Content_ReadData[9]; +char BMS_DeviceName = 0x21; +char BMS_Cycles = 0x17; +char BMS_SOC = 0x0D; + +uint16_t BMS_Password0; +uint16_t BMS_Password1; +uint16_t BMS_Password2; +uint16_t BMS_Password3; +uint16_t BMS_Password4; +uint16_t BMS_Password5; +uint16_t BMS_Password6; +uint16_t BMS_Password7; +uint16_t BMS_Password8; +uint16_t BMS_CycleOut; +uint16_t BMS_SOCOut; + +#endif + +/** +* This callback is used whenever a disconnection occurs. +*/ +void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) +{ + switch (reason) { + case Gap::REMOTE_USER_TERMINATED_CONNECTION: + DEBUG("Disconnected (REMOTE_USER_TERMINATED_CONNECTION)\n\r"); + break; + case Gap::LOCAL_HOST_TERMINATED_CONNECTION: + DEBUG("Disconnected (LOCAL_HOST_TERMINATED_CONNECTION)\n\r"); + break; + case Gap::CONN_INTERVAL_UNACCEPTABLE: + DEBUG("Disconnected (CONN_INTERVAL_UNACCEPTABLE)\n\r"); + break; + } + isConnected = 0; + + LED_Enable = 1; + wait_ms(100); + LED_Enable = 0; + + DEBUG("Restarting the advertising process\n\r"); + m_ble.startAdvertising(); +} + +/** +* This callback is used whenever the host writes data to one of our GATT characteristics. +*/ +void dataWrittenCallback(const GattCharacteristicWriteCBParams *params) +{ + // Ensure that initialization is finished and the host has written to the TX characteristic. + if ((m_uart_service_ptr != NULL) && (params->charHandle == m_uart_service_ptr->getTXCharacteristicHandle())) { + len = 0; +// uint16_t TempInt = 1; + + /* + j = 0; + for( int i = (params->len) - 1; i > 0; i-- ) + { + dataReceived[j] = params->data[j]; + j++; + } + dataReceived[j] = params->data[j]; + dataReceived[++j] = 0; + */ + + if (params->len == 1) { + switch (params->data[0]) { + #ifdef BH1745 // + case 'r': + len = snprintf((char*) buf, MAX_REPLY_LEN, "Red= %f", BH1745_Red); + break; + case 'g': + len = snprintf((char*) buf, MAX_REPLY_LEN, "Green= %f", BH1745_Green); + break; + case 'b': + len = snprintf((char*) buf, MAX_REPLY_LEN, "Blue= %f", BH1745_Blue); + break; + case 'c': + len = snprintf((char*) buf, MAX_REPLY_LEN, "Clear= %f", BH1745_Clear); + break; + case 'x': + len = snprintf((char*) buf, MAX_REPLY_LEN, "CIE#%6.5f,%6.5f", chromaX, chromaY); + break; + /* + case '?': + if( (0.03212-0.0005<chromaX) && (chromaX<0.03212+0.0005) && (0.02598-0.0005<chromaY) && (chromaY<0.02598+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "2-14"); + } + else if( (0.07793-0.0005<chromaX) && (chromaX<0.07793+0.0005) && (0.07237-0.0005<chromaY) && (chromaY<0.07237+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-13"); + } + else if( (0.07256-0.0005<chromaX) && (chromaX<0.07256+0.0005) && (0.06636-0.0005<chromaY) && (chromaY<0.06636+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-14"); + } + else if( (0.07079-0.0005<chromaX) && (chromaX<0.07079+0.0005) && (0.06706-0.0005<chromaY) && (chromaY<0.06706+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "18-5"); + } + else if( (0.04708-0.0005<chromaX) && (chromaX<0.04708+0.0005) && (0.04485-0.0005<chromaY) && (chromaY<0.04485+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "18-4"); + } + else if( (0.03373-0.0005<chromaX) && (chromaX<0.03373+0.0005) && (0.03221-0.0005<chromaY) && (chromaY<0.03221+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "18-3"); + } + else if( (0.07630-0.0005<chromaX) && (chromaX<0.07630+0.0005) && (0.07077-0.0005<chromaY) && (chromaY<0.07077+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-8"); + } + else if( (0.09365-0.0005<chromaX) && (chromaX<0.09365+0.0005) && (0.08628-0.0005<chromaY) && (chromaY<0.08628+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-10"); + } + else if( (0.09483-0.0005<chromaX) && (chromaX<0.09483+0.0005) && (0.08657-0.0005<chromaY) && (chromaY<0.08657+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-11"); + } + else if( (0.08935-0.0005<chromaX) && (chromaX<0.08935+0.0005) && (0.08311-0.0005<chromaY) && (chromaY<0.08311+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-12"); + } + else if( (0.08176-0.0005<chromaX) && (chromaX<0.08176+0.0005) && (0.07384-0.0005<chromaY) && (chromaY<0.07384+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-15"); + } + else if( (0.04112-0.0005<chromaX) && (chromaX<0.04112+0.0005) && (0.03841-0.0005<chromaY) && (chromaY<0.03841+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "5-6"); + } + else if( (0.03577-0.0005<chromaX) && (chromaX<0.03577+0.0005) && (0.03325-0.0005<chromaY) && (chromaY<0.03325+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "5-5"); + } + else if( (0.03432-0.0005<chromaX) && (chromaX<0.03432+0.0005) && (0.03203-0.0005<chromaY) && (chromaY<0.03203+0.0005) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "PPU"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "17-18"); + } + else{ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "Unregistered"); + } + break; + */ + + case 'l': + if(LED_Enable==0){ + LED_Enable = 1; + wait_ms(100); + len = snprintf((char*) buf, MAX_REPLY_LEN, "LED ON"); + } + else{ + LED_Enable = 0; + wait_ms(100); + len = snprintf((char*) buf, MAX_REPLY_LEN, "LED OFF"); + } + + break; + #endif + + default: + len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR"); + break; + } + }/* + else if (params->len > 1) { + switch (params->data[0]) { + case 's': + + rValue = BH1745_Red; + gValue = BH1745_Green; + bValue = BH1745_Blue; + cValue = BH1745_Clear; + + break; + } + } */ + else + { + len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR"); + } + + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + DEBUG("%d bytes received from host\n\r", params->len); + } +} + + +/** +* This callback is used whenever a write to a GATT characteristic causes data to be sent to the host. +*/ +void dataSentCallback(unsigned count) +{ + // NOTE: The count always seems to be 1 regardless of data. + DEBUG("%d bytes sent to host\n\r", count); +} + + +/** +* This callback is scheduled to be called periodically via a low-priority interrupt. +*/ +void periodicCallback(void) +{ + + // uint8_t buf[MAX_REPLY_LEN]; +// uint32_t len = 0; + + + + if (m_ble.getGapState().connected) { + if(isConnected==0){ + } + isConnected = 1; + } + else{ + isConnected = 0; + } + +} + + +void error(ble_error_t err, uint32_t line) +{ + m_error_led = 1; + DEBUG("Error %d on line number %d\n\r", err, line); +} + +//Code for writing back to Console if a PB is pressed +void PBTrigger() +{ + //uint8_t buf[MAX_REPLY_LEN]; + //uint32_t len = 0; + + m_cmd_led = !m_cmd_led; + + if(!setCruise){ + cruiseFlag = 1; + cruiseSet = Speed_value*2.75; + } + if(!resetCruise){ + cruiseFlag = 0; + } + m_cmd_led = cruiseFlag; + + + /* + if (m_ble.getGapState().connected) { + } + */ +} + +int main(void) +{ + ble_error_t err; + Ticker ticker; + + m_serial_port.baud(UART_BAUD_RATE); + + DEBUG("Initialising...\n\r"); + + m_cmd_led = 0; + m_error_led = 0; + + //ticker.attach(periodicCallback, SENSOR_READ_INTERVAL_S); + + //sw4Press.fall(&PBTrigger); + + setCruise.fall(&PBTrigger); + resetCruise.fall(&PBTrigger); + + //Start BTLE Initialization Section + m_ble.init(); + m_ble.onDisconnection(disconnectionCallback); + m_ble.onDataWritten(dataWrittenCallback); + m_ble.onDataSent(dataSentCallback); + + // Set the TX power in dBm units. + // Possible values (in decreasing order): 4, 0, -4, -8, -12, -16, -20. + err = m_ble.setTxPower(4); + if (BLE_ERROR_NONE != err) { + error(err, __LINE__); + } + + // Setup advertising (GAP stuff). + err = m_ble.setDeviceName(DEVICE_NAME); + if (BLE_ERROR_NONE != err) { + error(err, __LINE__); + } + + err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); + if (BLE_ERROR_NONE != err) { + error(err, __LINE__); + } + + m_ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + + err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, + (const uint8_t *)SHORT_NAME, + (sizeof(SHORT_NAME) - 1)); + if (BLE_ERROR_NONE != err) { + error(err, __LINE__); + } + + err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, + (const uint8_t *)UARTServiceUUID_reversed, + sizeof(UARTServiceUUID_reversed)); + if (BLE_ERROR_NONE != err) { + error(err, __LINE__); + } + + m_ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(ADV_INTERVAL_MS)); + m_ble.startAdvertising(); + + // Create a UARTService object (GATT stuff). + UARTService uartService(m_ble); + m_uart_service_ptr = &uartService; + + #ifdef BH1745 + i2c.write(BH1745_addr_w, &BH1745_CTRL2[0], 2, false); + #endif + + #ifdef BatteryI2C + i2c.write(BMS_addr_w, &BMS_DeviceName, 1, RepStart); + i2c.read(BMS_addr_r, &BMS_Content_ReadData[0], 8, NoRepStart); + + //BMS_Password = (BMS_Content_ReadData[1]<<8) | (BMS_Content_ReadData[0]); + BMS_Password0 = (BMS_Content_ReadData[0]); + BMS_Password1 = (BMS_Content_ReadData[1]); + BMS_Password2 = (BMS_Content_ReadData[2]); + BMS_Password3 = (BMS_Content_ReadData[3]); + BMS_Password4 = (BMS_Content_ReadData[4]); + BMS_Password5 = (BMS_Content_ReadData[5]); + BMS_Password6 = (BMS_Content_ReadData[6]); + BMS_Password7 = (BMS_Content_ReadData[7]); + BMS_Password8 = (BMS_Content_ReadData[8]); + i2c.write(BMS_addr_w, &BMS_Cycles, 1, RepStart); + i2c.read(BMS_addr_r, &BMS_Content_ReadData[0], 2, NoRepStart); + BMS_CycleOut = (BMS_Content_ReadData[1]<<8) | (BMS_Content_ReadData[0]); + + i2c.write(BMS_addr_w, &BMS_SOC, 1, RepStart); + i2c.read(BMS_addr_r, &BMS_Content_ReadData[0], 2, NoRepStart); + BMS_SOCOut = (BMS_Content_ReadData[1]<<8) | (BMS_Content_ReadData[0]); + #endif + + //Initialize PWM Output + PWM.period_us(1000); + hornFreq.period_us(1250); + //m_cmd_led.period_ms(10); + ADC_value_old = 0; + + p = 0; + SpeedSet = 1; + tick = deltaT; + SpeedSampNum = 5; + + LED_Enable = 1; + wait_ms(100); + wait_ms(100); + LED_Enable = 0; + wait_ms(100); + wait_ms(100); + LED_Enable = 1; + wait_ms(100); + wait_ms(100); + LED_Enable = 0; + wait_ms(100); + wait_ms(100); + LED_Enable = 1; + wait_ms(100); + wait_ms(100); + LED_Enable = 0; + wait_ms(100); + wait_ms(100); + + while (true) { + //m_ble.waitForEvent(); + if(m_ble.getGapState().connected){ + if(!isConnected){ + LED_Enable = 1; + wait_ms(100); + wait_ms(100); + LED_Enable = 0; + wait_ms(100); + wait_ms(100); + LED_Enable = 1; + wait_ms(100); + wait_ms(100); + LED_Enable = 0; + wait_ms(100); + wait_ms(100); + LED_Enable = 1; + wait_ms(100); + wait_ms(100); + LED_Enable = 0; + wait_ms(100); + wait_ms(100); + } + isConnected = 1; + + //Read KX022 Portion from the IC + i2c.write(BH1745_addr_w, &BH1745_Red_Data_LSB, 1, RepStart); + i2c.read(BH1745_addr_r, &BH1745_Content_ReadData[0], 8, NoRepStart); + + //reconfigure the data (taken from arduino code) + BH1745_Raw_R = (BH1745_Content_ReadData[1]<<8) | (BH1745_Content_ReadData[0]); + BH1745_Raw_G = (BH1745_Content_ReadData[3]<<8) | (BH1745_Content_ReadData[2]); + BH1745_Raw_B = (BH1745_Content_ReadData[5]<<8) | (BH1745_Content_ReadData[4]); + BH1745_Raw_C = (BH1745_Content_ReadData[7]<<8) | (BH1745_Content_ReadData[6]); + + BH1745_Red = (float)BH1745_Raw_R / 16384; + BH1745_Green = (float)BH1745_Raw_G / 16384; + BH1745_Blue = (float)BH1745_Raw_B / 16384; + BH1745_Clear = (float)BH1745_Raw_C / 16384; + + if(BH1745_Clear < 0.00001){ + + wait_ms(100); + wait_ms(100); + wait_ms(100); + wait_ms(100); + wait_ms(100); + wait_ms(100); + wait_ms(100); + wait_ms(100); + LED_Enable = 1; + wait_ms(100); + wait_ms(100); + + for(i=0; i<60; i++){ + + //---------------------------- KX022 ---------------------------- + //Read KX022 Portion from the IC + i2c.write(BH1745_addr_w, &BH1745_Red_Data_LSB, 1, RepStart); + i2c.read(BH1745_addr_r, &BH1745_Content_ReadData[0], 8, NoRepStart); + + //reconfigure the data (taken from arduino code) + BH1745_Raw_R = (BH1745_Content_ReadData[1]<<8) | (BH1745_Content_ReadData[0]); + BH1745_Raw_G = (BH1745_Content_ReadData[3]<<8) | (BH1745_Content_ReadData[2]); + BH1745_Raw_B = (BH1745_Content_ReadData[5]<<8) | (BH1745_Content_ReadData[4]); + BH1745_Raw_C = (BH1745_Content_ReadData[7]<<8) | (BH1745_Content_ReadData[6]); + + LED_Enable = 0; + + BH1745_Red = (float)BH1745_Raw_R / 16384; + BH1745_Green = (float)BH1745_Raw_G / 16384; + BH1745_Blue = (float)BH1745_Raw_B / 16384; + BH1745_Clear = (float)BH1745_Raw_C / 16384; + + CIEx[i] = 0.232*BH1745_Red + 0.610*BH1745_Green + 0.055*BH1745_Blue; + if( BH1745_Clear < (0.2*BH1745_Green) ){ + if( BH1745_Blue < (0.45*BH1745_Green) ){ + CIEy[i] = 0.083*BH1745_Red + 0.860*BH1745_Green; + } + else{ + CIEy[i] = 0.070*BH1745_Red + 0.709*BH1745_Green; + } + } + else if( BH1745_Clear < (0.50*BH1745_Green) ){ + CIEy[i] = 0.110*BH1745_Red + 0.712*BH1745_Green; + } + else{ + CIEy[i] = 0.073*BH1745_Red + 0.864*BH1745_Green; + } + for(j=i; j>0; j--){ + tempCIE = CIEx[j]; + if(tempCIE<CIEx[j-1]){ + CIEx[j] = CIEx[j-1]; + CIEx[j-1] = tempCIE; + } + } + for(j=i; j>0; j--){ + tempCIE = CIEy[j]; + if(tempCIE<CIEy[j-1]){ + CIEy[j] = CIEy[j-1]; + CIEy[j-1] = tempCIE; + } + } + } + + + chromaX = (CIEx[28]+CIEx[29]+CIEx[30]+CIEx[31]+CIEx[32])/5.0; + chromaY = (CIEy[28]+CIEy[29]+CIEy[30]+CIEy[31]+CIEy[32])/5.0; + + if( (xPPU2_14-xThresh<chromaX) && (chromaX<xPPU2_14+xThresh) && (yPPU2_14-yThresh<chromaY) && (chromaY<yPPU2_14+yThresh) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "2-14"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + else if( (xPPU18_5-xThresh<chromaX) && (chromaX<xPPU18_5+xThresh) && (yPPU18_5-yThresh<chromaY) && (chromaY<yPPU18_5+yThresh) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "18-5"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + else if( (xPPU18_4-xThresh<chromaX) && (chromaX<xPPU18_4+xThresh) && (yPPU18_4-yThresh<chromaY) && (chromaY<yPPU18_4+yThresh) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "18-4"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + else if( (xPPU18_3-xThresh<chromaX) && (chromaX<xPPU18_3+xThresh) && (yPPU18_3-yThresh<chromaY) && (chromaY<yPPU18_3+yThresh) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "18-3"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + else if( (xPPU17_18-xThresh<chromaX) && (chromaX<xPPU17_18+xThresh) && (yPPU17_18-yThresh<chromaY) && (chromaY<yPPU17_18+yThresh) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "17-18"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + else if( (xPPU5_6-xThresh<chromaX) && (chromaX<xPPU5_6+xThresh) && (yPPU5_6-yThresh<chromaY) && (chromaY<yPPU5_6+yThresh) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "5-6"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + else if( (xPPU4_15-xThresh<chromaX) && (chromaX<xPPU4_15+xThresh) && (yPPU4_15-yThresh<chromaY) && (chromaY<yPPU4_15+yThresh) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-15"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + else if( (xPPU4_14-xThresh<chromaX) && (chromaX<xPPU4_14+xThresh) && (yPPU4_14-yThresh<chromaY) && (chromaY<yPPU4_14+yThresh) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-14"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + else if( (xPPU4_13-xThresh<chromaX) && (chromaX<xPPU4_13+xThresh) && (yPPU4_13-yThresh<chromaY) && (chromaY<yPPU4_13+yThresh) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-13"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + else if( (xPPU4_10-xThresh<chromaX) && (chromaX<xPPU4_10+xThresh) && (yPPU4_10-yThresh<chromaY) && (chromaY<yPPU4_10+yThresh) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-10"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + else if( (xPPU4_8-xThresh<chromaX) && (chromaX<xPPU4_8+xThresh) && (yPPU4_8-yThresh<chromaY) && (chromaY<yPPU4_8+yThresh) ){ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "4-8"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + else{ + len = snprintf((char*) buf, MAX_REPLY_LEN, "%s", "Unregistered"); + m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); + } + } + + } + else{ + isConnected = 0; + } + } +}