From a345b8cf788c00afc69d2f7b125e7a7afa1fdcbf Mon Sep 17 00:00:00 2001 From: fleur <spacecarrot@fleurshax.net> Date: Fri, 23 Aug 2019 19:54:14 +0200 Subject: [PATCH] DIRECT IR LED ADC READOUT NO LIMITS GO NUTS --- epicardium/epicardium.h | 11 +++++++++++ epicardium/modules/light_sensor.c | 7 +++++++ pycardium/modules/light_sensor.c | 9 ++++++++- pycardium/modules/qstrdefs.h | 1 + 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 08f5ff97b..84ba3925b 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -102,6 +102,7 @@ typedef _Bool bool; #define API_LIGHT_SENSOR_RUN 0x80 #define API_LIGHT_SENSOR_GET 0x81 #define API_LIGHT_SENSOR_STOP 0x82 +#define API_LIGHT_SENSOR_READ 0x83 #define API_BUTTONS_READ 0x90 @@ -1386,6 +1387,16 @@ API(API_LIGHT_SENSOR_GET, int epic_light_sensor_get(uint16_t* value)); */ API(API_LIGHT_SENSOR_STOP, int epic_light_sensor_stop()); +/** + * Get the light level directly. Each call has an intrinsic delay of about 240us, I recommend another 100-300us delay via utime.sleep_ms() between calls. Whether or not the IR LED is fast enough is another issue. + * + * :return: Light level + * + * - ``-ENODATA``: Continuous readout not currently running. + */ +API(API_LIGHT_SENSOR_READ, uint16_t epic_light_sensor_read(void)); + + /** * File * ==== diff --git a/epicardium/modules/light_sensor.c b/epicardium/modules/light_sensor.c index ff2cd81c1..3f3573f17 100644 --- a/epicardium/modules/light_sensor.c +++ b/epicardium/modules/light_sensor.c @@ -27,6 +27,13 @@ static int light_sensor_init() return 0; } +uint16_t epic_light_sensor_read() +{ + ADC_StartConvert(ADC_CH_7, 0, 0); + ADC_GetData(&last_value); + return last_value; +} + static void readAdcCallback() { if (hwlock_acquire(HWLOCK_ADC, 0) != 0) { diff --git a/pycardium/modules/light_sensor.c b/pycardium/modules/light_sensor.c index ce8343aa7..a27791de1 100644 --- a/pycardium/modules/light_sensor.c +++ b/pycardium/modules/light_sensor.c @@ -42,11 +42,18 @@ static mp_obj_t mp_light_sensor_stop() } static MP_DEFINE_CONST_FUN_OBJ_0(light_sensor_stop_obj, mp_light_sensor_stop); +static mp_obj_t mp_light_sensor_read() +{ + return mp_obj_new_int_from_uint(epic_light_sensor_read()); +} +static MP_DEFINE_CONST_FUN_OBJ_0(light_sensor_read_obj, mp_light_sensor_read); + static const mp_rom_map_elem_t light_sensor_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_light_sensor) }, { MP_ROM_QSTR(MP_QSTR_start), MP_ROM_PTR(&light_sensor_start_obj) }, { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&light_sensor_stop_obj) }, - { MP_ROM_QSTR(MP_QSTR_get_reading), MP_ROM_PTR(&light_sensor_get_obj) } + { MP_ROM_QSTR(MP_QSTR_get_reading), MP_ROM_PTR(&light_sensor_get_obj) }, + { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&light_sensor_read_obj) }, }; static MP_DEFINE_CONST_DICT( light_sensor_module_globals, light_sensor_module_globals_table diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index d789c8730..2eca23420 100644 --- a/pycardium/modules/qstrdefs.h +++ b/pycardium/modules/qstrdefs.h @@ -97,6 +97,7 @@ Q(light_sensor) Q(start) Q(get_reading) Q(stop) +Q(read) /* bme680 */ Q(bme680) -- GitLab