@@ -45,13 +45,13 @@ extern Time64 time64;
4545#define ROLLOVER_US 10000
4646
4747#define LIDARLITE_STATE_IDLE 0
48- #define LIDARLITE_STATE_CHK_STATUS 1
49- #define LIDARLITE_STATE_READ_RANGE 2
50- #define LIDARLITE_STATE_DONE_READ 3
51- #define LIDARLITE_STATE_START 4
52- #define LIDARLITE_STATE_ERROR 0xF
53- // #define LIDARLITE_STATE_CHK_STATUS 1
54-
48+ #define LIDARLITE_STATE_POLLING 1
49+ #define LIDARLITE_STATE_STATUS_CMD 2
50+ #define LIDARLITE_STATE_STATUS_READ 3
51+ #define LIDARLITE_STATE_DATA_CMD 4
52+ #define LIDARLITE_STATE_DATA_READ 5
53+ #define LIDARLITE_STATE_MEASURE_CMD 6
54+ # define LIDARLITE_STATE_ERROR 7
5555
5656// Control Register List - Address Definitions
5757#define ACQ_COMMAND 0x00 // Device command
@@ -96,7 +96,6 @@ uint32_t Lidarlitev3hp::init(
9696 address_ = i2c_address << 1 ;
9797
9898 i2cState_ = LIDARLITE_STATE_IDLE;
99- dmaRunning_ = false ;
10099
101100 double_buffer_.init (lidarlite_double_buffer, sizeof (lidarlite_double_buffer));
102101
@@ -206,37 +205,84 @@ bool Lidarlitev3hp::poll(uint64_t poll_counter)
206205 PollingState poll_state = (PollingState) (poll_counter % (ROLLOVER_US / POLLING_PERIOD_US));
207206
208207 if ( poll_state == 0 ) {
209- startDrdyQuery (); // Read most recent measurement
208+ i2cState_ = LIDARLITE_STATE_POLLING;
209+ stateMachine ();
210210 }
211211
212212 return true ;
213213}
214214
215- void Lidarlitev3hp::startDrdyQuery (void ) {
216- lidarlite_i2c_dma_buf[ 0 ] = 0 ;
217- if ( HAL_I2C_Mem_Read_DMA (hi2c_, address_, STATUS, I2C_MEMADD_SIZE_8BIT, lidarlite_i2c_dma_buf, 1 ) == HAL_OK )
215+ void Lidarlitev3hp::stateMachine (void )
216+ {
217+ switch (i2cState_ )
218218 {
219- i2cState_ = LIDARLITE_STATE_CHK_STATUS;
219+ case LIDARLITE_STATE_IDLE:
220+ {
221+ i2cState_ = LIDARLITE_STATE_ERROR;
222+ break ; // pedantic.
223+ }
224+ case LIDARLITE_STATE_POLLING:
225+ {
226+ lidarlite_i2c_dma_buf[0 ] = STATUS;
227+ if (HAL_I2C_Master_Transmit_DMA (hi2c_, address_, lidarlite_i2c_dma_buf, 1 )==HAL_OK) {
228+ i2cState_ = LIDARLITE_STATE_STATUS_CMD;
220229 } else {
221230 i2cState_ = LIDARLITE_STATE_ERROR;
222231 }
223- return ;
232+ break ;
224233}
225-
226- void Lidarlitev3hp::endRxDma (void )
234+ case LIDARLITE_STATE_STATUS_CMD:
227235{
228- if (i2cState_ == LIDARLITE_STATE_CHK_STATUS )
236+ // Start read of Status
237+ lidarlite_i2c_dma_buf[0 ] = 0 ;
238+ if (HAL_I2C_Master_Receive_DMA (hi2c_, address_, lidarlite_i2c_dma_buf,1 ) == HAL_OK) {
239+ i2cState_ = LIDARLITE_STATE_STATUS_READ;
240+ } else {
241+ i2cState_ = LIDARLITE_STATE_ERROR;
242+ }
243+ break ;
244+ }
245+ case LIDARLITE_STATE_STATUS_READ:
229246 {
247+ // Check status
230248 status_ = lidarlite_i2c_dma_buf[0 ];
231- if ((status_ & 0x01 )==0x00 ) {
249+ if ((status_ & 0x01 )==0x00 )
250+ {
232251 drdy_ = time64.Us ();
233252 // status good, start a read
234- startDataRead ();
253+ lidarlite_i2c_dma_buf[0 ] = FULL_DELAY_HIGH;
254+
255+ if (HAL_I2C_Master_Transmit_DMA (hi2c_, address_, lidarlite_i2c_dma_buf,1 ) == HAL_OK) {
256+ i2cState_ = LIDARLITE_STATE_DATA_CMD;
257+ } else {
258+ i2cState_ = LIDARLITE_STATE_ERROR;
259+ }
260+ } else {
261+ // Give up and start a new measurement
262+ lidarlite_i2c_dma_buf[0 ] = ACQ_COMMAND;
263+ lidarlite_i2c_dma_buf[1 ] = 0x04 ;
264+ if (HAL_I2C_Master_Transmit_DMA (hi2c_, address_, lidarlite_i2c_dma_buf, 2 ) == HAL_OK) {
265+ i2cState_ = LIDARLITE_STATE_MEASURE_CMD;
266+ } else {
267+ i2cState_ = LIDARLITE_STATE_ERROR;
268+ }
269+ }
270+ break ;
271+ }
272+ case LIDARLITE_STATE_DATA_CMD:
273+ {
274+ // status good, start a read
275+ lidarlite_i2c_dma_buf[0 ] = 0 ;
276+ lidarlite_i2c_dma_buf[1 ] = 0 ;
277+ if (HAL_I2C_Master_Receive_DMA (hi2c_, address_, lidarlite_i2c_dma_buf,2 ) == HAL_OK) {
278+ i2cState_ = LIDARLITE_STATE_DATA_READ;
235279 } else {
236- // status not jump to command next read
237- startMeasure ();
280+ i2cState_ = LIDARLITE_STATE_ERROR;
281+ }
282+ break ;
238283 }
239- } else if (i2cState_ == LIDARLITE_STATE_READ_RANGE ) {
284+ case LIDARLITE_STATE_DATA_READ:
285+ {
240286 // Reading range data complete
241287 uint16_t urange = (lidarlite_i2c_dma_buf[0 ]<<8 ) | lidarlite_i2c_dma_buf[1 ]; // cm
242288
@@ -251,48 +297,32 @@ void Lidarlitev3hp::endRxDma(void)
251297 // no specific check for status because we did that before starting the read.
252298 write ((uint8_t *) &p, sizeof (p));
253299
254- // Command next read
255- startMeasure ();
300+ // Start Next Measurement
301+ lidarlite_i2c_dma_buf[0 ] = ACQ_COMMAND;
302+ lidarlite_i2c_dma_buf[1 ] = 0x04 ;
303+ if (HAL_I2C_Master_Transmit_DMA (hi2c_, address_, lidarlite_i2c_dma_buf, 2 )==HAL_OK) {
304+ i2cState_ = LIDARLITE_STATE_MEASURE_CMD;
256305 } else {
257306 i2cState_ = LIDARLITE_STATE_ERROR;
258307 }
259- return ;
308+ break ;
260309}
261-
262- void Lidarlitev3hp::startDataRead (void ) {
263- lidarlite_i2c_dma_buf[0 ] = 0 ;
264- lidarlite_i2c_dma_buf[1 ] = 0 ;
265- if (HAL_I2C_Mem_Read_DMA (hi2c_, address_, FULL_DELAY_HIGH, I2C_MEMADD_SIZE_8BIT, lidarlite_i2c_dma_buf,2 ) == HAL_OK)
310+ case LIDARLITE_STATE_MEASURE_CMD:
266311 {
267- i2cState_ = LIDARLITE_STATE_READ_RANGE;
268- } else {
269- i2cState_ = LIDARLITE_STATE_ERROR;
312+ i2cState_ = LIDARLITE_STATE_IDLE;
313+ break ;
270314 }
315+ case LIDARLITE_STATE_ERROR:
316+ {
317+ break ;
271318}
272-
273- void Lidarlitev3hp::startMeasure (void )
319+ default :
274320{
275- lidarlite_i2c_dma_buf[0 ] = ACQ_COMMAND;
276- lidarlite_i2c_dma_buf[1 ] = 0x04 ;
277- if ((dmaRunning_ = (HAL_OK == HAL_I2C_Master_Transmit_DMA (hi2c_, address_, lidarlite_i2c_dma_buf, 2 )))) {
278- i2cState_ = LIDARLITE_STATE_START;
279- } else {
280321 i2cState_ = LIDARLITE_STATE_ERROR;
322+ break ; // pedantic.
281323 }
282- return ;
283324}
284-
285- void Lidarlitev3hp::endTxDma (void )
286- {
287- if ( i2cState_ == LIDARLITE_STATE_START ) {
288- // Do nothing
289- } else {
290- i2cState_ = LIDARLITE_STATE_ERROR;
291325 }
292- return ;
293- }
294-
295-
296326
297327bool Lidarlitev3hp::display (void )
298328{
0 commit comments