@@ -317,25 +317,6 @@ static pbio_port_dcm_t dcm_state[PBIO_CONFIG_PORT_DCM_NUM_DEV];
317317#define DCM_LOOP_STEADY_STATE_COUNT (20)
318318#define DCM_LOOP_DISCONNECT_COUNT (5)
319319
320- pbio_error_t pbio_port_dcm_await_new_nxt_analog_sample (pbio_port_dcm_t * dcm , pbio_os_timer_t * timer , const pbdrv_ioport_pins_t * pins , uint32_t * value ) {
321- pbio_os_state_t * state = & dcm -> child ;
322-
323- PBIO_OS_ASYNC_BEGIN (state );
324-
325- // Wait for LED to settle.
326- PBIO_OS_AWAIT_MS (state , timer , 1 );
327-
328- // Request a new ADC sample. Revisit: Call back on completion instead of time.
329- pbdrv_adc_update_soon ();
330- PBIO_OS_AWAIT_MS (state , timer , 4 );
331-
332- // Get the value.
333- uint8_t pin = dcm -> category == DCM_CATEGORY_NXT_COLOR ? 6 : 1 ;
334- * value = pbio_port_dcm_get_mv (pins , pin );
335-
336- PBIO_OS_ASYNC_END (PBIO_SUCCESS );
337- }
338-
339320/**
340321 * Thread that detects the device type. It monitors the ID1 and ID2 pins
341322 * on the port to see when devices are connected or disconnected.
@@ -387,6 +368,25 @@ pbio_error_t pbio_port_dcm_thread(pbio_os_state_t *state, pbio_os_timer_t *timer
387368 continue ;
388369 }
389370
371+ if (dcm -> category == DCM_CATEGORY_NXT_LIGHT ) {
372+ debug_pr ("Reading NXT Light Sensor until disconnected.\n" );
373+ // While plugged in, get reflected and ambient light intensity.
374+ while (!pbdrv_gpio_input (& pins -> p2 )) {
375+ // Reflected intensity.
376+ pbdrv_gpio_out_high (& pins -> p5 );
377+ PBIO_OS_AWAIT_MS (state , timer , 2 );
378+ PBIO_OS_AWAIT (state , & dcm -> child , pbdrv_adc_await_new_samples (& dcm -> child ));
379+ dcm -> nxt_rgba .r = pbio_port_dcm_get_mv (pins , 1 );
380+
381+ // Ambient intensity.
382+ pbdrv_gpio_out_low (& pins -> p5 );
383+ PBIO_OS_AWAIT_MS (state , timer , 2 );
384+ PBIO_OS_AWAIT (state , & dcm -> child , pbdrv_adc_await_new_samples (& dcm -> child ));
385+ dcm -> nxt_rgba .a = pbio_port_dcm_get_mv (pins , 1 );
386+ }
387+ continue ;
388+ }
389+
390390 if (dcm -> category == DCM_CATEGORY_NXT_COLOR ) {
391391 debug_pr ("Initializing NXT Color Sensor.\n" );
392392
@@ -405,30 +405,31 @@ pbio_error_t pbio_port_dcm_thread(pbio_os_state_t *state, pbio_os_timer_t *timer
405405 pbio_port_dcm_nxt_color_rx_msg (& dcm -> child , & dcm -> nxt_color_state , pins , timer , (uint8_t * )& dcm -> nxt_color_state .data + dcm -> count ));
406406 }
407407
408- // Checksum and continue on failure.
408+ // REVISIT: Test checksum and exit on failure.
409409 debug_pr ("Finished initializing NXT Color Sensor.\n" );
410- }
411410
412- if (dcm -> category == DCM_CATEGORY_NXT_LIGHT || dcm -> category == DCM_CATEGORY_NXT_COLOR ) {
413- debug_pr ("Reading NXT Light/Color Sensor until disconnected.\n" );
414- // While plugged in, toggle through available colors.
411+ // While plugged in, toggle through available colors and measure intensity.
415412 while (!pbdrv_gpio_input (& pins -> p2 )) {
416413
417414 pbdrv_gpio_out_low (& pins -> p5 );
418- PBIO_OS_AWAIT (state , & dcm -> child , pbio_port_dcm_await_new_nxt_analog_sample ( dcm , timer , pins , & dcm -> nxt_rgba . a ) );
419- pbdrv_gpio_out_high ( & pins -> p5 );
420- PBIO_OS_AWAIT ( state , & dcm -> child , pbio_port_dcm_await_new_nxt_analog_sample ( dcm , timer , pins , & dcm -> nxt_rgba . r ) );
415+ PBIO_OS_AWAIT_MS (state , timer , 2 );
416+ PBIO_OS_AWAIT ( state , & dcm -> child , pbdrv_adc_await_new_samples ( & dcm -> child ) );
417+ dcm -> nxt_rgba . a = pbio_port_dcm_get_mv ( pins , 6 );
421418
422- if ( dcm -> category == DCM_CATEGORY_NXT_LIGHT ) {
423- // Light sensor doesn't have green and blue.
424- continue ;
425- }
419+ pbdrv_gpio_out_high ( & pins -> p5 );
420+ PBIO_OS_AWAIT_MS ( state , timer , 2 );
421+ PBIO_OS_AWAIT ( state , & dcm -> child , pbdrv_adc_await_new_samples ( & dcm -> child )) ;
422+ dcm -> nxt_rgba . r = pbio_port_dcm_get_mv ( pins , 6 );
426423
427424 pbdrv_gpio_out_low (& pins -> p5 );
428- PBIO_OS_AWAIT (state , & dcm -> child , pbio_port_dcm_await_new_nxt_analog_sample ( dcm , timer , pins , & dcm -> nxt_rgba . g ) );
429- pbdrv_gpio_out_high ( & pins -> p5 );
430- PBIO_OS_AWAIT ( state , & dcm -> child , pbio_port_dcm_await_new_nxt_analog_sample ( dcm , timer , pins , & dcm -> nxt_rgba . b ) );
425+ PBIO_OS_AWAIT_MS (state , timer , 2 );
426+ PBIO_OS_AWAIT ( state , & dcm -> child , pbdrv_adc_await_new_samples ( & dcm -> child ) );
427+ dcm -> nxt_rgba . g = pbio_port_dcm_get_mv ( pins , 6 );
431428
429+ pbdrv_gpio_out_high (& pins -> p5 );
430+ PBIO_OS_AWAIT_MS (state , timer , 2 );
431+ PBIO_OS_AWAIT (state , & dcm -> child , pbdrv_adc_await_new_samples (& dcm -> child ));
432+ dcm -> nxt_rgba .b = pbio_port_dcm_get_mv (pins , 6 );
432433 }
433434 pbdrv_gpio_out_low (& pins -> p5 );
434435 continue ;
0 commit comments