diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 63dca86829849069780800f5d3f531fd69e9e3e5..bc374b4554cc6269ea0deb394038d7718da237d6 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -100,6 +100,7 @@ typedef _Bool bool; #define API_LEDS_CLEAR_ALL 0x6d #define API_LEDS_GET_ROCKET 0x6e #define API_LEDS_GET 0x6f +#define API_LEDS_BLINK_ROCKET 0x72 #define API_VIBRA_SET 0x70 #define API_VIBRA_VIBRATE 0x71 @@ -613,6 +614,19 @@ API(API_LEDS_SET, void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b)); */ API(API_LEDS_GET, int epic_leds_get_rgb(int led, uint8_t * rgb)); +/** + * Set one of the rockets to blink for a certain time. + * + * :c:func:`epic_leds_blink_rocket` will set a timer for blinking of the rocket. + * + * :param int led: Number of rocket to let blink + * :param uint8_t value: brightness of the 'on'-state of this rocket ( 0 < value < 32) + * :param int millis: time in milliseconds the rocket should be 'on' + * + * .. versionadded:: 1.?? + */ +API(API_LEDS_BLINK_ROCKET, void epic_leds_blink_rocket(int led, uint8_t valiue, int millis)); + /** * Set one of card10's RGB LEDs to a certain color in HSV format. * diff --git a/epicardium/modules/leds.c b/epicardium/modules/leds.c index ad08487d10d02b61e192cf6414aa4126d02f264f..d413e836df798daf17a1ee3191714c06fe19a0b7 100644 --- a/epicardium/modules/leds.c +++ b/epicardium/modules/leds.c @@ -1,6 +1,7 @@ #include "leds.h" #include "pmic.h" #include "FreeRTOS.h" +#include "timers.h" #include "task.h" #include "epicardium.h" #include "modules.h" @@ -10,6 +11,7 @@ //TODO: create smth like vTaskDelay(pdMS_TO_TICKS(//put ms here)) for us, remove blocking delay from /lib/leds.c to avoid process blocking #define NUM_LEDS 15 /* Take from lib/card10/leds.c */ +#define NUM_ROCKETS static void do_update() { @@ -144,6 +146,31 @@ int epic_leds_get_rocket(int led) return ret; } +static TimerHandle_t blink_timer[NUM_ROCKETS]; + +void bTimerCallback(TimerHandle_t blink_timer) +{ + uint32_t id = (uint32_t) pvTimerGetTimerID(blink_timer); + epic_leds_set_rocket(id, 0); +} + +void epic_leds_blink_rocket(int led, uint8_t value, int millis) +{ + int ticks = millis * (configTICK_RATE_HZ / 1000); + int32_t id = led; + if (blink_timer[id] == NULL) { + blink_timer[id] = xTimerCreate( + "blinktimer", + ticks, + pdFALSE, + (void*) id, + bTimerCallback + ); + } else { + epic_leds_set_rocket(led, value); + xTimerChangePeriod(blink_timer[id], ticks, 0); + } +} void epic_set_flashlight(bool power) { while (hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(1)) < 0) { diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index 0430d4d7c2df04658765d8cfa99b475ff84c6d87..aaa5ac7ba9654daa0ae29e93db9e386af0d34a3b 100644 --- a/pycardium/modules/qstrdefs.h +++ b/pycardium/modules/qstrdefs.h @@ -17,6 +17,7 @@ Q(set_all_hsv) Q(set_flashlight) Q(set_rocket) Q(get_rocket) +Q(blink_rocket) Q(set_powersave) Q(set_gamma) Q(dim_top) diff --git a/pycardium/modules/sys_leds.c b/pycardium/modules/sys_leds.c index a5f5747970e1060f545ab45702695a6e1985f247..720cd5d1d933c1665e988aca6c42713e9ef56ddf 100644 --- a/pycardium/modules/sys_leds.c +++ b/pycardium/modules/sys_leds.c @@ -213,6 +213,21 @@ static mp_obj_t mp_leds_get_rocket(mp_obj_t led_in) } static MP_DEFINE_CONST_FUN_OBJ_1(leds_get_rocket_obj, mp_leds_get_rocket); +static mp_obj_t mp_leds_blink_rocket(mp_obj_t led_in, mp_obj_t value_in, mp_obj_t time_in) +{ + int led = mp_obj_get_int(led_in); + int value = mp_obj_get_int(value_in); + int time = mp_obj_get_int(time_in); + + if (value > 31) { + mp_raise_ValueError("brightness must by < 32"); + } + + epic_leds_blink_rocket(led, value, time); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_3(leds_blink_rocket_obj, mp_leds_blink_rocket); + static mp_obj_t mp_leds_dim_top(mp_obj_t dim_in) { int dim = mp_obj_get_int(dim_in); @@ -283,6 +298,7 @@ static const mp_rom_map_elem_t leds_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_set_all_hsv), MP_ROM_PTR(&leds_set_all_hsv_obj) }, { MP_ROM_QSTR(MP_QSTR_set_rocket), MP_ROM_PTR(&leds_set_rocket_obj) }, { MP_ROM_QSTR(MP_QSTR_get_rocket), MP_ROM_PTR(&leds_get_rocket_obj) }, + { MP_ROM_QSTR(MP_QSTR_blink_rocket), MP_ROM_PTR(&leds_blink_rocket_obj) }, { MP_ROM_QSTR(MP_QSTR_set_flashlight), MP_ROM_PTR(&leds_set_flashlight_obj) }, { MP_ROM_QSTR(MP_QSTR_update), MP_ROM_PTR(&leds_update_obj) },