diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index f2398732994160a13b949f79825060221d53587f..b805b2b1fab1b59359b74354a8d456b0c9c52f4b 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 @@ -618,6 +619,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 ffe5969e103c1e736d502a2c79d8933fc5e5cf6b..6e450a859038dc8d123a537eb405e075620da896 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" @@ -128,6 +129,31 @@ int epic_leds_get_rocket(int led) return ret; } +static TimerHandle_t blink_timer[] = { NULL, NULL, NULL }; + +static void rocket_timer_callback(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, + rocket_timer_callback + ); + epic_leds_set_rocket(led, value); + } + epic_leds_set_rocket(led, value); + xTimerChangePeriod(blink_timer[id], ticks, 0); +} void epic_set_flashlight(bool power) { hwlock_acquire(HWLOCK_I2C); diff --git a/pycardium/modules/py/leds.py b/pycardium/modules/py/leds.py index 75f3aac87dbb362f16a8dc1c1f993c13f22ac158..c29d3347c17705a93a6d0389a12bf54dce57642f 100644 --- a/pycardium/modules/py/leds.py +++ b/pycardium/modules/py/leds.py @@ -95,6 +95,20 @@ def get_rocket(led): return sys_leds.get_rocket(led) +def blink_rocket(led, value, millis): + """ + Let one of the rockets blink for a certain time without + blocking the python interpreter. + + :param int led: Choose your rocket! + :param int value: brightness value (0 < value < 32) + :param int millis: duration of the rocket being on in milliseconds. + + .. versionadded:: 1.?? + """ + return sys_leds.blink_rocket(led, value, millis) + + def dim_top(value): """ Set global brightness for top RGB LEDs. diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index 3a6e9dfcf47dfd16160b9b0cf76809436176bc55..4e5456766e177d6fb81a2c949b29856d23184bbd 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 16efdcc9e69b2dc2f4c24b2b7630832faeea8b19..5b111d50f96ea28838d95200fe9dcffb97376767 100644 --- a/pycardium/modules/sys_leds.c +++ b/pycardium/modules/sys_leds.c @@ -213,6 +213,22 @@ 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 be < 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 +299,8 @@ 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) },