The VL53L1CB proximity sensor, based on ST’s FlightSense™, Time-of-Flight technology.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   VL53L1CB_noshield_1sensor_polls_auton VL53L1CB_noshield_1sensor_interrupt_auton X_NUCLEO_53L1A2

Based on VL53L1 library, this is a library for the VL53L1CB ToF chip.

src/vl53l1_sigma_estimate.c

Committer:
charlesmn
Date:
2020-11-06
Revision:
0:3ac96e360672
Child:
7:1add29d51e72

File content as of revision 0:3ac96e360672:


/*******************************************************************************
 This file is part of VL53L1 Protected

 Copyright (c) 2020, STMicroelectronics - All Rights Reserved

 License terms: STMicroelectronics Proprietary in accordance with licensing
 terms at www.st.com/sla0081

 STMicroelectronics confidential
 Reproduction and Communication of this document is strictly prohibited unless
 specifically authorized in writing by STMicroelectronics.

*/




#include "vl53l1_types.h"
#include "vl53l1_platform_log.h"

#include "vl53l1_core_support.h"
#include "vl53l1_error_codes.h"

#include "vl53l1_sigma_estimate.h"


#define LOG_FUNCTION_START(fmt, ...) \
	_LOG_FUNCTION_START(VL53L1_TRACE_MODULE_PROTECTED, fmt, ##__VA_ARGS__)
#define LOG_FUNCTION_END(status, ...) \
	_LOG_FUNCTION_END(VL53L1_TRACE_MODULE_PROTECTED, status, ##__VA_ARGS__)
#define LOG_FUNCTION_END_FMT(status, fmt, ...) \
	_LOG_FUNCTION_END_FMT(VL53L1_TRACE_MODULE_PROTECTED, \
	status, fmt, ##__VA_ARGS__)

#define trace_print(level, ...) \
	_LOG_TRACE_PRINT(VL53L1_TRACE_MODULE_PROTECTED, \
	level, VL53L1_TRACE_FUNCTION_NONE, ##__VA_ARGS__)


uint16_t  VL53L1_f_042(
		uint8_t	 sigma_estimator__effective_pulse_width_ns,
		uint8_t  sigma_estimator__effective_ambient_width_ns,
		uint8_t	 sigma_estimator__sigma_ref_mm,
		VL53L1_range_data_t *pdata)
{



	uint16_t    sigma_est  = VL53L1_D_002;

	uint32_t    tmp0 = 0;
	uint32_t    tmp1 = 0;
	uint32_t    tmp2 = 0;

	uint32_t    sigma_est__rtn_array  = 0;
	uint32_t    sigma_est__ref_array  = 0;

	LOG_FUNCTION_START("");

	if (pdata->peak_signal_count_rate_mcps  > 0 &&
		pdata->VL53L1_p_013 > 0) {



		tmp0 =  100 *
			(uint32_t)sigma_estimator__effective_pulse_width_ns;



		tmp1 = ((uint32_t)sigma_estimator__effective_pulse_width_ns *
			100 *
			(uint32_t)sigma_estimator__effective_ambient_width_ns);

		tmp1 =  (tmp1 +
			(uint32_t)pdata->peak_signal_count_rate_mcps/2) /
			(uint32_t)pdata->peak_signal_count_rate_mcps;



		sigma_est__rtn_array =
			VL53L1_f_043(tmp0, tmp1);



		sigma_est__rtn_array =
			((VL53L1_SPEED_OF_LIGHT_IN_AIR + 1000) / 2000) *
			sigma_est__rtn_array;



		tmp2 =
			VL53L1_isqrt(12 * (uint32_t)pdata->VL53L1_p_013);

		if (tmp2 > 0) {

			sigma_est__rtn_array =
					(sigma_est__rtn_array + tmp2/2) / tmp2;



			sigma_est__ref_array =
				100 * (uint32_t)sigma_estimator__sigma_ref_mm;

			sigma_est =
				(uint16_t)VL53L1_f_043(
						(uint32_t)sigma_est__ref_array,
						sigma_est__rtn_array);

		} else {
			sigma_est = VL53L1_D_002;
		}

	}

	pdata->VL53L1_p_005  = sigma_est;

	LOG_FUNCTION_END(0);

	return sigma_est;

}


uint16_t VL53L1_f_044(
	uint8_t	 sigma_estimator__effective_pulse_width_ns,
	uint8_t  sigma_estimator__effective_ambient_width_ns,
	uint8_t	 sigma_estimator__sigma_ref_mm,
	VL53L1_range_data_t *pdata)
{


	uint16_t    sigma_est  = VL53L1_D_002;

	uint32_t    eqn7 = 0;
	uint32_t    sigma_est__ref_sq  = 0;
	uint32_t    sigma_est__rtn_sq  = 0;

	uint64_t    tmp0 = 0;
	uint64_t    tmp1 = 0;

	LOG_FUNCTION_START("");

	if (pdata->peak_signal_count_rate_mcps > 0 &&
		pdata->VL53L1_p_013         > 0) {



		eqn7 =  4573 * 4573;
		eqn7 =  eqn7 / (3 * (uint32_t)pdata->VL53L1_p_013);



		tmp0 = ((uint64_t)sigma_estimator__effective_pulse_width_ns)
				<< 8;



		tmp1 = ((uint64_t)pdata->ambient_count_rate_mcps *
			(uint64_t)sigma_estimator__effective_ambient_width_ns)
					<< 8;

		tmp1 = do_division_u(tmp1,
			(uint64_t)pdata->peak_signal_count_rate_mcps);



		tmp1 = 16 * (uint64_t)eqn7 * (tmp0 * tmp0 + tmp1 * tmp1);
		tmp1 = do_division_u(tmp1, (15625 * 15625));
		sigma_est__rtn_sq = (uint32_t)tmp1;



		sigma_est__ref_sq = ((uint32_t)sigma_estimator__sigma_ref_mm)
				<< 2;

		sigma_est__ref_sq = sigma_est__ref_sq * sigma_est__ref_sq;



		sigma_est = (uint16_t)VL53L1_isqrt(sigma_est__ref_sq +
				sigma_est__rtn_sq);

	}

	pdata->VL53L1_p_005  = sigma_est;

	LOG_FUNCTION_END(0);

	return sigma_est;

}



VL53L1_Error VL53L1_f_045(
	uint8_t	 sigma_estimator__sigma_ref_mm,
	uint32_t VL53L1_p_003,
	uint32_t VL53L1_p_018,
	uint32_t VL53L1_p_001,
	uint32_t a_zp,
	uint32_t c_zp,
	uint32_t bx,
	uint32_t ax_zp,
	uint32_t cx_zp,
	uint32_t VL53L1_p_004,
	uint16_t fast_osc_frequency,
	uint16_t *psigma_est)
{


	VL53L1_Error status = VL53L1_ERROR_DIVISION_BY_ZERO;
	uint32_t sigma_int  = VL53L1_D_002;

	uint32_t pll_period_mm  = 0;

	uint64_t tmp0        = 0;
	uint64_t tmp1        = 0;
	uint64_t b_minus_amb = 0;
	uint64_t VL53L1_p_041   = 0;

	*psigma_est  = VL53L1_D_002;



	if (fast_osc_frequency != 0) {



		pll_period_mm = VL53L1_calc_pll_period_mm(fast_osc_frequency);


		pll_period_mm = (pll_period_mm + 0x02) >> 2;



		if (VL53L1_p_004 > VL53L1_p_018)
			b_minus_amb =  (uint64_t)VL53L1_p_004 -
			(uint64_t)VL53L1_p_018;
		else
			b_minus_amb =  (uint64_t)VL53L1_p_018 -
			(uint64_t)VL53L1_p_004;



		if (VL53L1_p_003 > VL53L1_p_001)
			VL53L1_p_041 =  (uint64_t)VL53L1_p_003 -
			(uint64_t)VL53L1_p_001;
		else
			VL53L1_p_041 =  (uint64_t)VL53L1_p_001 -
			(uint64_t)VL53L1_p_003;





		if (b_minus_amb != 0) {



			tmp0 = (uint64_t)pll_period_mm *
					(uint64_t)pll_period_mm;
			tmp0 = tmp0 * ((uint64_t)c_zp +
					(uint64_t)cx_zp + (uint64_t)a_zp +
					(uint64_t)ax_zp);
			tmp0 = do_division_u((tmp0 + (b_minus_amb >> 1)),
				b_minus_amb);



			tmp1 = (uint64_t)pll_period_mm *
					(uint64_t)pll_period_mm * VL53L1_p_041;
			tmp1 = do_division_u((tmp1 + (b_minus_amb >> 1)),
				b_minus_amb);

			tmp1 =  tmp1 * VL53L1_p_041;
			tmp1 = do_division_u((tmp1 + (b_minus_amb >> 1)),
				b_minus_amb);

			tmp1 =  tmp1 * ((uint64_t)VL53L1_p_018 + (uint64_t)bx +
					(uint64_t)VL53L1_p_004);
			tmp1 = do_division_u((tmp1 + (b_minus_amb >> 1)),
				b_minus_amb);



			tmp0 = tmp0 + tmp1;
			tmp0 = do_division_u((tmp0 + (b_minus_amb >> 1)),
				b_minus_amb);
			tmp0 = (tmp0 + 0x01) >> 2;



			tmp1 = (uint64_t)sigma_estimator__sigma_ref_mm << 2;
			tmp1 = tmp1 * tmp1;
			tmp0 = tmp0 + tmp1;



			if (tmp0 > 0xFFFFFFFF)
				tmp0 =  0xFFFFFFFF;

			sigma_int = VL53L1_isqrt((uint32_t)tmp0);



			if (sigma_int > VL53L1_D_002)
				*psigma_est =
				(uint16_t)VL53L1_D_002;
			else
				*psigma_est = (uint16_t)sigma_int;

			status = VL53L1_ERROR_NONE;
		}

	}

	return status;
}



VL53L1_Error VL53L1_f_014(
	uint8_t	 sigma_estimator__sigma_ref_mm,
	uint32_t VL53L1_p_003,
	uint32_t VL53L1_p_018,
	uint32_t VL53L1_p_001,
	uint32_t a_zp,
	uint32_t c_zp,
	uint32_t bx,
	uint32_t ax_zp,
	uint32_t cx_zp,
	uint32_t VL53L1_p_004,
	uint16_t fast_osc_frequency,
	uint16_t *psigma_est)
{


	VL53L1_Error status = VL53L1_ERROR_DIVISION_BY_ZERO;
	uint32_t sigma_int  = VL53L1_D_002;

	uint32_t pll_period_mm  = 0;

	uint64_t tmp0        = 0;
	uint64_t tmp1        = 0;
	uint64_t b_minus_amb = 0;
	uint64_t VL53L1_p_041   = 0;

	*psigma_est  = VL53L1_D_002;



	if (fast_osc_frequency != 0) {



		pll_period_mm = VL53L1_calc_pll_period_mm(fast_osc_frequency);



		if (VL53L1_p_004 > VL53L1_p_018)
			b_minus_amb =  (uint64_t)VL53L1_p_004 -
			(uint64_t)VL53L1_p_018;
		else
			b_minus_amb =  (uint64_t)VL53L1_p_018 -
			(uint64_t)VL53L1_p_004;



		if (VL53L1_p_003 > VL53L1_p_001)
			VL53L1_p_041 =  (uint64_t)VL53L1_p_003 -
			(uint64_t)VL53L1_p_001;
		else
			VL53L1_p_041 =  (uint64_t)VL53L1_p_001 -
			(uint64_t)VL53L1_p_003;



		if (b_minus_amb != 0) {




			tmp0 = (uint64_t)VL53L1_p_018 + (uint64_t)bx +
					(uint64_t)VL53L1_p_004;
			if (tmp0 > VL53L1_D_003)
				tmp0 = VL53L1_D_003;



			tmp1 = (uint64_t)VL53L1_p_041 * (uint64_t)VL53L1_p_041;
			tmp1 = tmp1 << 8;


			if (tmp1 > VL53L1_D_004)
				tmp1 = VL53L1_D_004;


			tmp1 = do_division_u(tmp1, b_minus_amb);
			tmp1 = do_division_u(tmp1, b_minus_amb);


			if (tmp1 > (uint64_t)VL53L1_D_005)
				tmp1 = (uint64_t)VL53L1_D_005;


			tmp0 = tmp1 * tmp0;


			tmp1 = (uint64_t)c_zp + (uint64_t)cx_zp +
				(uint64_t)a_zp + (uint64_t)ax_zp;


			if (tmp1 > (uint64_t)VL53L1_D_003)
				tmp1 = (uint64_t)VL53L1_D_003;

			tmp1 = tmp1 << 8;


			tmp0 = tmp1 + tmp0;
			if (tmp0 > (uint64_t)VL53L1_D_006)
				tmp0 = (uint64_t)VL53L1_D_006;






			if (tmp0 > (uint64_t)VL53L1_D_007) {
				tmp0 = do_division_u(tmp0, b_minus_amb);
				tmp0 = tmp0 * pll_period_mm;
			} else {
				tmp0 = tmp0 * pll_period_mm;
				tmp0 = do_division_u(tmp0, b_minus_amb);
			}


			if (tmp0 > (uint64_t)VL53L1_D_006)
				tmp0 = (uint64_t)VL53L1_D_006;



			if (tmp0 > (uint64_t)VL53L1_D_007) {
				tmp0 = do_division_u(tmp0, b_minus_amb);
				tmp0 = do_division_u(tmp0, 4);
				tmp0 = tmp0 * pll_period_mm;
			} else {
				tmp0 = tmp0 * pll_period_mm;
				tmp0 = do_division_u(tmp0, b_minus_amb);
				tmp0 = do_division_u(tmp0, 4);
			}


			if (tmp0 > (uint64_t)VL53L1_D_006)
				tmp0 = (uint64_t)VL53L1_D_006;


			tmp0 = tmp0 >> 2;


			if (tmp0 > (uint64_t)VL53L1_D_007)
				tmp0 = (uint64_t)VL53L1_D_007;


			tmp1 = (uint64_t)sigma_estimator__sigma_ref_mm << 7;
			tmp1 = tmp1 * tmp1;
			tmp0 = tmp0 + tmp1;


			if (tmp0 > (uint64_t)VL53L1_D_007)
				tmp0 = (uint64_t)VL53L1_D_007;


			sigma_int = VL53L1_isqrt((uint32_t)tmp0);

			*psigma_est = (uint16_t)sigma_int;

			status = VL53L1_ERROR_NONE;
		}

	}

	return status;
}

uint32_t VL53L1_f_046(
	uint64_t VL53L1_p_003,
	uint32_t size
	)
{


	uint64_t next;
	uint64_t upper;
	uint64_t lower;
	uint32_t stepsize;
	uint32_t count;


	next = VL53L1_p_003;
	upper = 0;
	lower = 0;
	stepsize = size/2;
	count = 0;

	while (1) {
		upper = next >> stepsize;
		lower = next & ((1 << stepsize) - 1);

		if (upper != 0) {
			count += stepsize;
			next = upper;
		} else {
			next = lower;
		}

		stepsize = stepsize / 2;
		if (stepsize == 0)
			break;
	}

	return count;
}



uint32_t VL53L1_f_043(
	uint32_t VL53L1_p_003,
	uint32_t VL53L1_p_018)
{


	uint32_t  res = 0;

	if (VL53L1_p_003 > 65535 || VL53L1_p_018 > 65535)
		res = 65535;
	else
		res = VL53L1_isqrt(VL53L1_p_003*VL53L1_p_003 +
			VL53L1_p_018*VL53L1_p_018);

	return res;
}