INSAT Mini Project
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Fork of X_NUCLEO_6180XA1 by
Diff: Components/VL6180X/vl6180x_class.cpp
- Revision:
- 14:0effa0bbf192
- Parent:
- 12:71d589e6fd2c
- Child:
- 15:454710d17358
--- a/Components/VL6180X/vl6180x_class.cpp Tue Oct 13 14:32:54 2015 +0200 +++ b/Components/VL6180X/vl6180x_class.cpp Mon Oct 19 13:54:17 2015 +0200 @@ -507,7 +507,7 @@ if( status<0) break; /* set range InterruptMode to new sample */ - status=VL6180x_RangeConfigInterrupt(dev, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY ); + status=VL6180x_RangeConfigInterrupt(dev, CONFIG_GPIO_INTERRUPT_DISABLED ); if( status) break; @@ -527,7 +527,7 @@ status = VL6180x_AlsSetThresholds(dev, 0, 0xFF); if( status ) break; /* set Als InterruptMode to new sample */ - status=VL6180x_AlsConfigInterrupt(dev, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY); + status=VL6180x_AlsConfigInterrupt(dev, CONFIG_GPIO_INTERRUPT_DISABLED); if( status ) { VL6180x_ErrLog("VL6180x_AlsConfigInterrupt fail"); break; @@ -727,7 +727,7 @@ LOG_FUNCTION_START("%d %d", (int )low, (int)high); - status = VL6180x_WrByte(dev, SYSALS_THRESH_LOW, low); + status = VL6180x_WrByte(dev, SYSALS_THRESH_LOW, low); //FIXME i valori passati devono essere uint16_t (vedi registri), inoltre i valori delle soglie NON sono in lux! bisogna invertire il calcolo fatto nella VL6180x_AlsGetLux() if(!status ){ status = VL6180x_WrByte(dev, SYSALS_THRESH_HIGH, high); } @@ -1323,7 +1323,7 @@ if( !status){ /* must write the scaler at least once to the device to ensure the scaler is in a known state. */ status=VL6180x_UpscaleSetScaling(dev, _GetUpscale(dev)); - VL6180x_WrByte( dev, 0x016, 0x00); /* change fresh out of set status to 0 */ + VL6180x_WrByte( dev, SYSTEM_FRESH_OUT_OF_RESET, 0x00); /* change fresh out of set status to 0 */ } LOG_FUNCTION_END(status); return status; @@ -2669,8 +2669,10 @@ int VL6180X::InitSensor(uint8_t NewAddr) //FIXME printf da sostituire con VL6180x_ErrLog e poi specificare il contenuto di questa funzione { - int status=0; - + int status; + uint16_t buf; + uint8_t buffer; + VL6180x_Off(); VL6180x_On(); status=IsPresent(); @@ -2679,53 +2681,265 @@ Device->Present=1; status=Init(); if(status) + { printf("Failed to init VL6180X sensor!\n"); + return status; + } status=Prepare(); if(status) + { printf("Failed to prepare VL6180X!\n"); - //status=SetI2CAddress(NewAddr); - if(status) - printf("Failed to change I2C address!\n"); - /* disable early convergence estimate - status=VL6180x_RangeSetEceState(Device, 0); - if(status) - printf("Failed to disable ECE!");*/ + return status; + } + if(NewAddr!=DEFAULT_DEVICE_ADDRESS) + { + //status=SetI2CAddress(NewAddr); //if new_addr!=addr_default else errore + if(status) + { + printf("Failed to change I2C address!\n"); + return status; + } + } + else + { + printf("Invalid new address!"); + return INVALID_PARAMS; + } Device->Ready=1; } return status; } -int VL6180X::StartMeasurement(OperatingMode operating_mode, void (*fptr)(void), MeasureData_t *Data) +int VL6180X::StartMeasurement(OperatingMode operating_mode, void (*fptr)(void), MeasureData_t *Data, uint16_t low, uint16_t high) { - int status; + int status, r_status, l_status; switch(operating_mode) { - case(1): - return RangeMeasPollSingleShot(Data); + case(range_single_shot_polling): + r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY); + l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + return RangeMeasPollSingleShot(Data); + else + return (r_status|l_status); - case(2): - return AlsMeasPollSingleShot(Data); + case(als_single_shot_polling): + r_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY); + l_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + return AlsMeasPollSingleShot(Data); + else + return (r_status|l_status); - case(3): - return RangeMeasPollContinuousMode(Data); + case(range_continuous_polling): + r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY); + l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + return RangeMeasPollContinuousMode(); + else + return (r_status|l_status); - case(4): - return AlsMeasPollContinuousMode(Data); + case(als_continuous_polling): + r_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY); + l_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + return AlsMeasPollContinuousMode(); + else + return (r_status|l_status); - case(5): - return RangeMeasIntContinuousMode(fptr); + case(range_continuous_interrupt): + r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY); + l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + return RangeMeasIntContinuousMode(fptr); + else + return (r_status|l_status); - case(6): - return AlsMeasIntContinuousMode(fptr); + case(als_continuous_interrupt): + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY); + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + return AlsMeasIntContinuousMode(fptr); + else + return (r_status|l_status); + + case(interleaved_mode_interrupt): + l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY); + r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + return InterleavedMode(fptr); + else + return (r_status|l_status); + + case(range_continuous_polling_low_threshold): + r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_LOW); + l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=RangeSetLowThreshold(low); + if(!status) + return RangeMeasPollContinuousMode(); + else + return status; + } + else + return (r_status|l_status); + + case(range_continuous_polling_high_threshold): + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_HIGH); + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=RangeSetHighThreshold(high); + if(!status) + return RangeMeasPollContinuousMode(); + else + return status; + } + else + return (r_status|l_status); + + case(range_continuous_polling_out_of_window): + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW); + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=VL6180x_RangeSetThresholds(Device,low,high,1); + if(!status) + return RangeMeasPollContinuousMode(); + else + return status; + } + else + return (r_status|l_status); + + case(als_continuous_polling_low_threshold): + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_LOW); + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=AlsSetLowThreshold(low); + if(!status) + return AlsMeasPollContinuousMode(); + else + return status; + } + else + return (r_status|l_status); + + case(als_continuous_polling_high_threshold): + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_HIGH); + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=AlsSetHighThreshold(high); + if(!status) + return AlsMeasPollContinuousMode(); + else + return status; + } + else + return (r_status|l_status); - case(7): break; + case(als_continuous_polling_out_of_window): + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW); + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=VL6180x_AlsSetThresholds(Device,low,high); + if(!status) + return AlsMeasPollContinuousMode(); + else + return status; + } + else + return (r_status|l_status); + + case(range_continuous_interrupt_low_threshold): + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_LOW); + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=RangeSetLowThreshold(low); + if(!status) + return RangeMeasIntContinuousMode(fptr); + else + return status; + } + else + return (r_status|l_status); + + case(range_continuous_interrrupt_high_threshold): + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_HIGH); + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=RangeSetHighThreshold(high); + if(!status) + return RangeMeasIntContinuousMode(fptr); + else + return status; + } + else + return (r_status|l_status); - case(8): break; + case(range_continuous_interrupt_out_of_window): + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW); + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=VL6180x_RangeSetThresholds(Device,low,high,1); + if(!status) + return RangeMeasIntContinuousMode(fptr); + else + return status; + } + else + return (r_status|l_status); + + case(als_continuous_interrupt_low_threshold): + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_LOW); + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=AlsSetLowThreshold(low); + if(!status) + return AlsMeasIntContinuousMode(fptr); + else + return status; + } + else + return (r_status|l_status); - case(9): - return InterleavedMode(fptr); + case(als_continuous_interrupt_high_threshold): + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_HIGH); + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=AlsSetHighThreshold(high); + if(!status) + return AlsMeasIntContinuousMode(fptr); + else + return status; + } + else + return (r_status|l_status); + + case(als_continuous_interrupt_out_of_window): + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW); + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if((!r_status)&&(!l_status)) + { + status=VL6180x_AlsSetThresholds(Device,low,high); + if(!status) + return AlsMeasIntContinuousMode(fptr); + else + return status; + } + else + return (r_status|l_status); default: return INVALID_PARAMS; @@ -2735,20 +2949,13 @@ int VL6180X::GetRangeError(MeasureData_t *Data, VL6180x_RangeData_t RangeData) { - IntrStatus_t IntStatus; - int status; - - status=VL6180x_RangeGetInterruptStatus(Device, &IntStatus.val); - if(status) - return status; Data->range_error=RangeData.errorStatus; - Data->int_error=IntStatus.status.Error; - if((Data->int_error!=0)||(Data->range_error!=0)) + if(Data->range_error!=0) { - VL6180x_ErrLog("GPIO int Error report %d",(int)IntStatus.val); - status=RANGE_ERROR; + VL6180x_ErrLog("Range error %d",Data->range_error); + return RANGE_ERROR; } - return status; + return NoError_; } @@ -2756,8 +2963,11 @@ { Data->als_error=AlsData.errorStatus; if(Data->als_error!=0) - return API_ERROR; - return API_NO_ERROR; + { + VL6180x_ErrLog("Light error %d",Data->light_error); + return API_ERROR; + } + return NoError_; } @@ -2772,6 +2982,8 @@ status=GetRangeError(Data, RangeData); if(!status) Data->range_mm=RangeData.range_mm; + else + Data->range_mm=0xFFFFFFFF; } return status; } @@ -2788,12 +3000,14 @@ status=GetAlsError(Data, AlsData); if(!status) Data->lux=AlsData.lux; + else + Data->lux=0xFFFFFFFF; } return status; } -int VL6180X::RangeMeasPollContinuousMode(MeasureData_t *Data) +int VL6180X::RangeMeasPollContinuousMode() { int status; @@ -2813,7 +3027,7 @@ } -int VL6180X::AlsMeasPollContinuousMode(MeasureData_t *Data) +int VL6180X::AlsMeasPollContinuousMode() { int status; @@ -2831,67 +3045,64 @@ } return AlsStartContinuousMode(); } - - -int VL6180X::GetRangeMeasContinuousMode(MeasureData_t *Data) + + +int VL6180X::AlsGetMeasurementIfReady(VL6180xDev_t dev, VL6180x_AlsData_t *pAlsData) { - VL6180x_RangeData_t RangeData; - int status; - - status=VL6180x_RangeGetMeasurement(Device, &RangeData); + int status; + uint8_t IntStatus; + + status=VL6180x_AlsGetInterruptStatus(dev, &IntStatus); if(!status) { - status=GetRangeError(Data, RangeData); - if(!status) - Data->range_mm=RangeData.range_mm; + if(IntStatus==RES_INT_STAT_GPIO_NEW_SAMPLE_READY) + { + status = VL6180x_AlsGetMeasurement(dev, pAlsData); + if(!status) + { + status=VL6180x_AlsClearInterrupt(Device); + if(status) + VL6180x_ErrLog("VL6180x_AlsClearInterrupt fail"); + } + } + else + status=NOT_READY; } - return status; -} - - -int VL6180X::GetAlsMeasContinuousMode(MeasureData_t *Data) -{ - VL6180x_AlsData_t AlsData; - int status; - - status=VL6180x_AlsGetMeasurement(Device, &AlsData); - if(!status) - { - status=GetAlsError(Data, AlsData); - if(!status) - Data->lux=AlsData.lux; - } + else + VL6180x_ErrLog("Fail to get interrupt status"); return status; } int VL6180X::RangeMeasIntContinuousMode(void (*fptr)(void)) { - int status; + int status, ClrStatus; EnableInterruptMeasureDetectionIRQ(); AttachInterruptMeasureDetectionIRQ(fptr); status=SetupGPIO1(GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT, 1); - /*ClrStatus=VL6180x_ClearAllInterrupt(Device); - if(ClrStatus) - VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail");*/ + ClrStatus=VL6180x_ClearAllInterrupt(Device); + if(ClrStatus) + VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail"); if(!status) - return RangeStartContinuousMode(); + status=RangeStartContinuousMode(); + return status; } int VL6180X::AlsMeasIntContinuousMode(void (*fptr)(void)) { - int status; + int status, ClrStatus; EnableInterruptMeasureDetectionIRQ(); AttachInterruptMeasureDetectionIRQ(fptr); status=SetupGPIO1(GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT, 1); - /*ClrStatus=VL6180x_ClearAllInterrupt(Device); - if(ClrStatus) - VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail");*/ + ClrStatus=VL6180x_ClearAllInterrupt(Device); + if(ClrStatus) + VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail"); if(!status) - return AlsStartContinuousMode(); + status=AlsStartContinuousMode(); + return status; } @@ -2900,11 +3111,12 @@ int status; uint16_t integration_period, intermeasurement_period_ms; uint8_t max_convergence_time; + uint8_t buf; status=VL6180x_WrByte(Device, 0x2A3, 1); if(status) { - VL6180x_ErrLog("Failed to read INTERLEAVED_MODE_ENABLE!\n\r"); + VL6180x_ErrLog("Failed to write INTERLEAVED_MODE_ENABLE!\n\r"); return status; } status=VL6180x_RdByte(Device, SYSRANGE_MAX_CONVERGENCE_TIME, &max_convergence_time); @@ -2923,7 +3135,9 @@ integration_period&=0x01FF; intermeasurement_period_ms=((max_convergence_time+5)+(integration_period*1.1)); intermeasurement_period_ms=(intermeasurement_period_ms/0.9)+10; + intermeasurement_period_ms=200; status=VL6180x_AlsSetInterMeasurementPeriod(Device, intermeasurement_period_ms); + VL6180x_RdByte(Device, 0x03E, &buf); if(status) { VL6180x_ErrLog("Failed to write SYSALS_INTERMEASUREMENT_PERIOD!\n\r"); @@ -2935,85 +3149,427 @@ int VL6180X::InterleavedMode(void (*fptr)(void)) { - int status; + int status, ClrStatus; EnableInterruptMeasureDetectionIRQ(); AttachInterruptMeasureDetectionIRQ(fptr); status=SetupGPIO1(GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT, 1); - /*ClrStatus=VL6180x_ClearAllInterrupt(Device); + ClrStatus=VL6180x_ClearAllInterrupt(Device); if(ClrStatus) - VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail");*/ + VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail"); if(!status) - return StartInterleavedMode(); + status=StartInterleavedMode(); + return status; +} + + +int VL6180X::HandleIRQ(OperatingMode operating_mode, MeasureData_t *Data) +{ + int status; + + status=GetMeasurement(operating_mode, Data); + EnableInterruptMeasureDetectionIRQ(); + return status; } - - -void VL6180X::HandleIRQ(MeasureType measure_type, MeasureData_t *Data) + + +int VL6180X::RangeSetLowThreshold(uint16_t threshold) +{ + int status; + uint16_t low, high; + + status=VL6180x_RangeGetThresholds(Device, &low, &high); + if(!status) + status=VL6180x_RangeSetThresholds(Device, threshold, high, 1); + return status; +} + + +int VL6180X::RangeSetHighThreshold(uint16_t threshold) { - int status, ClrStatus; - /* range measure */ - if(measure_type==1) - { - VL6180x_RangeData_t RangeData; - status=RangeGetMeasurement(&RangeData); - if(status) - VL6180x_ErrLog("Failed to get range measurement"); - ClrStatus=VL6180x_RangeClearInterrupt(Device); - if(ClrStatus) - VL6180x_ErrLog("VL6180x_RangeClearInterrupt fail"); - ClrStatus=VL6180x_ClearErrorInterrupt(Device); - if(ClrStatus) - VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail"); - EnableInterruptMeasureDetectionIRQ(); - status=GetRangeError(Data, RangeData); - if(!status) - Data->range_mm=RangeData.range_mm; - } - /* light measure */ - else if(measure_type==2) - { - VL6180x_AlsData_t AlsData; - status=AlsGetMeasurement(&AlsData); - if(status) - VL6180x_ErrLog("Failed to get light measurement"); - ClrStatus=VL6180x_AlsClearInterrupt(Device); - if(ClrStatus) - VL6180x_ErrLog("VL6180x_AlsClearInterrupt fail"); - ClrStatus=VL6180x_ClearErrorInterrupt(Device); - if(ClrStatus) - VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail"); - EnableInterruptMeasureDetectionIRQ(); - status=GetAlsError(Data, AlsData); - if(!status) - Data->lux=AlsData.lux; - } - /* light and range measure */ - else if(measure_type==3) - { - VL6180x_RangeData_t RangeData; - VL6180x_AlsData_t AlsData; - status=RangeGetMeasurement(&RangeData); - if(status) - VL6180x_ErrLog("Failed to get range measurement"); - status=AlsGetMeasurement(&AlsData); - if(status) - VL6180x_ErrLog("Failed to get light measurement"); - ClrStatus=VL6180x_ClearAllInterrupt(Device); - if(ClrStatus) - VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail"); - EnableInterruptMeasureDetectionIRQ(); - status=GetAlsError(Data, AlsData); - if(!status) - Data->lux=AlsData.lux; - status=GetRangeError(Data, RangeData); - if(!status) - Data->range_mm=RangeData.range_mm; - } - else - printf("Error! Invalid parameter!"); + int status; + uint16_t low, high; + + status=VL6180x_RangeGetThresholds(Device, &low, &high); + if(!status) + status=VL6180x_RangeSetThresholds(Device, low, threshold, 1); + return status; } - - + + +int VL6180X::AlsSetLowThreshold(uint16_t threshold) +{ + int status; + uint16_t low, high; + + status=VL6180x_AlsGetThresholds(Device, &low, &high); + if(!status) + status=VL6180x_AlsSetThresholds(Device, threshold, high); + return status; +} + + +int VL6180X::AlsSetHighThreshold(uint16_t threshold) +{ + int status; + uint16_t low, high; + + status=VL6180x_AlsGetThresholds(Device, &low, &high); + if(!status) + status=VL6180x_AlsSetThresholds(Device, low, threshold); + return status; +} +int VL6180X::VL6180x_AlsGetThresholds(VL6180xDev_t dev, uint16_t *low, uint16_t *high) +{ + int status; + + status=VL6180x_RdWord(dev, SYSALS_THRESH_LOW, low); + if(status) + { + VL6180x_ErrLog("rd SYSALS_THRESH_LOW fail"); + return status; + } + status=VL6180x_RdWord(dev, SYSALS_THRESH_HIGH, high); + if(status) + { + VL6180x_ErrLog("rd SYSALS_THRESH_HIGH fail"); + return status; + } + return status; +} + + +int VL6180X::GetMeasurement(OperatingMode operating_mode, MeasureData_t *Data) +{ + switch(operating_mode) + { + case(range_continuous_polling): + case(range_continuous_interrupt): + case(range_continuous_polling_low_threshold): + case(range_continuous_polling_high_threshold): + case(range_continuous_polling_out_of_window): + case(range_continuous_interrupt_low_threshold): + case(range_continuous_interrrupt_high_threshold): + case(range_continuous_interrupt_out_of_window): + return GetRangeMeas(operating_mode, Data); + + case(als_continuous_polling): + case(als_continuous_interrupt): + case(als_continuous_polling_low_threshold): + case(als_continuous_polling_high_threshold): + case(als_continuous_polling_out_of_window): + case(als_continuous_interrupt_low_threshold): + case(als_continuous_interrupt_high_threshold): + case(als_continuous_interrupt_out_of_window): + return GetAlsMeas(operating_mode, Data); + + case(interleaved_mode_interrupt): + return GetRangeAlsMeas(Data); + + default: + return INVALID_PARAMS; + } +} + + +int VL6180X::GetRangeMeas(OperatingMode operating_mode, MeasureData_t *Data) +{ + VL6180x_RangeData_t RangeData; + int status, ClrStatus; + IntrStatus_t IntStatus; + + status=VL6180x_RangeGetInterruptStatus(Device, &IntStatus.val); + if(!status) + { + Data->int_error=IntStatus.status.Error; + if(IntStatus.status.Error!=0) + { + VL6180x_ErrLog("GPIO int Error report %d",(int)IntStatus.val); + return RANGE_ERROR; + } + } + else + { + VL6180x_ErrLog("Fail to read RESULT_INTERRUPT_STATUS_GPIO"); + return status; + } + if((operating_mode==range_continuous_polling)||(operating_mode==range_continuous_interrupt)) + { + if(IntStatus.status.Range==RES_INT_STAT_GPIO_NEW_SAMPLE_READY) + status=VL6180x_RangeGetMeasurement(Device, &RangeData); + else + return NOT_READY; + } + else if((operating_mode==range_continuous_polling_low_threshold)||(operating_mode==range_continuous_interrupt_low_threshold)) + { + if(IntStatus.status.Range==RES_INT_STAT_GPIO_LOW_LEVEL_THRESHOLD) + status=VL6180x_RangeGetMeasurement(Device, &RangeData); + else + return NOT_READY; + } + else if((operating_mode==range_continuous_polling_high_threshold)||(operating_mode==range_continuous_interrrupt_high_threshold)) + { + if(IntStatus.status.Range==RES_INT_STAT_GPIO_HIGH_LEVEL_THRESHOLD) + status=VL6180x_RangeGetMeasurement(Device, &RangeData); + else + return NOT_READY; + } + else if((operating_mode==range_continuous_polling_out_of_window)||(operating_mode==range_continuous_interrupt_out_of_window)) + { + if(IntStatus.status.Range==RES_INT_STAT_GPIO_OUT_OF_WINDOW) + status=VL6180x_RangeGetMeasurement(Device, &RangeData); + else + return NOT_READY; + } + if(!status) + { + status=GetRangeError(Data, RangeData); + if(!status) + Data->range_mm=RangeData.range_mm; + else + Data->range_mm=0xFFFFFFFF; + } + ClrStatus=VL6180x_RangeClearInterrupt(Device); + if(ClrStatus) + { + VL6180x_ErrLog("VL6180x_RangeClearInterrupt fail"); + return ClrStatus; + } + ClrStatus=VL6180x_ClearErrorInterrupt(Device); + if(ClrStatus) + { + VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail"); + return ClrStatus; + } + return status; +} + + +int VL6180X::GetAlsMeas(OperatingMode operating_mode, MeasureData_t *Data) +{ + VL6180x_AlsData_t AlsData; + int status, ClrStatus; + uint8_t IntStatus; + + status=VL6180x_AlsGetInterruptStatus(Device, &IntStatus); + if(status) + { + VL6180x_ErrLog("Fail to read RESULT_INTERRUPT_STATUS_GPIO"); + return status; + } + if((operating_mode==als_continuous_polling)||(operating_mode==als_continuous_interrupt)) + { + if(IntStatus==RES_INT_STAT_GPIO_NEW_SAMPLE_READY) + status=VL6180x_AlsGetMeasurement(Device, &AlsData); + else + return NOT_READY; + } + else if((operating_mode==als_continuous_polling_low_threshold)||(operating_mode==als_continuous_interrupt_low_threshold)) + { + if(IntStatus==RES_INT_STAT_GPIO_LOW_LEVEL_THRESHOLD) + status=VL6180x_AlsGetMeasurement(Device, &AlsData); + else + return NOT_READY; + } + else if((operating_mode==als_continuous_polling_high_threshold)||(operating_mode==als_continuous_interrupt_high_threshold)) + { + if(IntStatus==RES_INT_STAT_GPIO_HIGH_LEVEL_THRESHOLD) + status=VL6180x_AlsGetMeasurement(Device, &AlsData); + else + return NOT_READY; + } + else if((operating_mode==als_continuous_polling_out_of_window)||(operating_mode==als_continuous_interrupt_out_of_window)) + { + if(IntStatus==RES_INT_STAT_GPIO_OUT_OF_WINDOW) + status=VL6180x_AlsGetMeasurement(Device, &AlsData); + else + return NOT_READY; + } + if(!status) + { + status=GetAlsError(Data, AlsData); + if(!status) + Data->lux=AlsData.lux; + else + Data->lux=0xFFFFFFFF; + } + ClrStatus=VL6180x_AlsClearInterrupt(Device); + if(ClrStatus) + VL6180x_ErrLog("VL6180x_AlsClearInterrupt fail"); + ClrStatus=VL6180x_ClearErrorInterrupt(Device); + if(ClrStatus) + VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail"); + return status; +} + + +int VL6180X::GetRangeAlsMeas(MeasureData_t *Data) +{ + int status, ClrStatus, r_status, l_status; + IntrStatus_t IntStatus; + VL6180x_RangeData_t RangeData; + VL6180x_AlsData_t AlsData; + + status=VL6180x_RdByte(Device, RESULT_INTERRUPT_STATUS_GPIO, &IntStatus.val); + if(!status) + { + Data->int_error=IntStatus.status.Error; + if(IntStatus.status.Error!=0) + { + VL6180x_ErrLog("GPIO int Error report %d",(int)IntStatus.val); + return RANGE_ERROR; + } + } + else + { + VL6180x_ErrLog("Fail to read RESULT_INTERRUPT_STATUS_GPIO"); + return status; + } + + if(IntStatus.status.Als==RES_INT_STAT_GPIO_NEW_SAMPLE_READY) + { + r_status=VL6180x_RangeGetMeasurement(Device, &RangeData); + l_status=VL6180x_AlsGetMeasurement(Device, &AlsData); + if((!r_status)&&(!l_status)) + { + r_status=GetRangeError(Data, RangeData); + l_status=GetAlsError(Data, AlsData); + if(!r_status) + Data->range_mm=RangeData.range_mm; + else + Data->range_mm=0xFFFFFFFF; + if(!l_status) + Data->lux=AlsData.lux; + else + Data->lux=0xFFFFFFFF; + status=r_status|l_status; + } + else + { + status=r_status|l_status; + } + ClrStatus=VL6180x_ClearAllInterrupt(Device); + if(ClrStatus) + VL6180x_ErrLog("VL6180x_ClearAllInterrupt fail"); + } + else + return NOT_READY; + return status; +} + + +int VL6180X::StopMeasurement(OperatingMode operating_mode) +{ + int status; + + switch(operating_mode) + { + case(range_single_shot_polling): + case(range_continuous_polling): + case(range_continuous_interrupt): + case(range_continuous_polling_low_threshold): + case(range_continuous_polling_high_threshold): + case(range_continuous_polling_out_of_window): + case(range_continuous_interrupt_low_threshold): + case(range_continuous_interrrupt_high_threshold): + case(range_continuous_interrupt_out_of_window): + return StopRangeMeasurement(operating_mode); + + case(als_single_shot_polling): + case(als_continuous_polling): + case(als_continuous_interrupt): + case(als_continuous_polling_low_threshold): + case(als_continuous_polling_high_threshold): + case(als_continuous_polling_out_of_window): + case(als_continuous_interrupt_low_threshold): + case(als_continuous_interrupt_high_threshold): + case(als_continuous_interrupt_out_of_window): + return StopAlsMeasurement(operating_mode); + + case(interleaved_mode_interrupt): + status=StopRangeMeasurement(range_continuous_interrupt); + if(!status) + return StopAlsMeasurement(als_continuous_interrupt); + else return status; + + default: + return INVALID_PARAMS; + } +} + + +int VL6180X::StopRangeMeasurement(OperatingMode operating_mode) +{ + int status; + + if(operating_mode==range_single_shot_polling) + status=VL6180x_RangeSetSystemMode(Device, MODE_SINGLESHOT); + else + status=VL6180x_RangeSetSystemMode(Device, MODE_START_STOP|MODE_SINGLESHOT); + if(status) + return status; + status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if(status) + { + VL6180x_ErrLog("VL6180x_RangeConfigInterrupt fail"\n\r); + return status; + } + status=VL6180x_RangeClearInterrupt(Device); + if(status) + { + VL6180x_ErrLog("VL6180x_RangeClearInterrupt fail"); + return status; + } + status=VL6180x_ClearErrorInterrupt(Device); + if(status) + { + VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail"); + return status; + } + status=VL6180x_RangeSetRawThresholds(Device, 10, 200); + if(status) + VL6180x_ErrLog("VL6180x_RangeSetThresholds fail"); + return status; +} + + +int VL6180X::StopAlsMeasurement(OperatingMode operating_mode) +{ + int status; + + if(operating_mode==als_single_shot_polling) + status=VL6180x_AlsSetSystemMode(Device, MODE_SINGLESHOT); + else + status=VL6180x_AlsSetSystemMode(Device, MODE_START_STOP|MODE_SINGLESHOT); + if(status) + return status; + status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED); + if(status) + { + VL6180x_ErrLog("VL6180x_AlsConfigInterrupt fail"\n\r); + return status; + } + status=VL6180x_AlsClearInterrupt(Device); + if(status) + { + VL6180x_ErrLog("VL6180x_AlsClearInterrupt fail"); + return status; + } + status=VL6180x_ClearErrorInterrupt(Device); + if(status) + { + VL6180x_ErrLog("VL6180x_ClearErrorInterrupt fail"); + return status; + } + status=VL6180x_AlsSetThresholds(Device, 0x0, 0xFF); + if(status) + VL6180x_ErrLog("VL6180x_AlsSetThresholds fail"); + return status; +} + + + + /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/