diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 21ce07ec662863067b34d3a7dedd71e7842379ad..7886cc5f0bb28fbc2ba5d818e43ef5f7879c0e50 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -11,6 +11,7 @@ #define API_UART_READ 0x2 #define API_LEDS_SET 0x3 #define API_VIBRA_SET 0x4 +#define API_VIBRA_VIBRATE 0x5 /* clang-format on */ /** @@ -66,4 +67,11 @@ API(API_LEDS_SET, void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b)); */ API(API_VIBRA_SET, void epic_vibra_set(int status)); +/** + * Turn vibration motor on for a given time + * + * :param millis: number of milliseconds to run the vibration motor. + */ +API(API_VIBRA_VIBRATE, void epic_vibra_vibrate(int millis)); + #endif /* _EPICARDIUM_H */ diff --git a/epicardium/modules/vibra.c b/epicardium/modules/vibra.c index 5fbc3bb78cd67ad9bb747df48e65ec1707e80045..dd7c3131d88f5d1a656a1371ea2f2bda0ac7098c 100644 --- a/epicardium/modules/vibra.c +++ b/epicardium/modules/vibra.c @@ -1,9 +1,13 @@ #include "gpio.h" +#include "FreeRTOS.h" +#include "timers.h" static const gpio_cfg_t motor_pin = { PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE }; +static TimerHandle_t vibra_timer; + void epic_vibra_set(int status) { if (status) { @@ -12,3 +16,17 @@ void epic_vibra_set(int status) GPIO_OutClr(&motor_pin); } } + +void vTimerCallback() +{ + epic_vibra_set(0); +} + +void epic_vibra_vibrate(int millis) +{ + int ticks = millis * (configTICK_RATE_HZ / 1000); + epic_vibra_set(1); + vibra_timer = + xTimerCreate("vibratimer", ticks, pdFALSE, 0, vTimerCallback); + xTimerStart(vibra_timer, 0); +} diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index 37d5082b7b7c00b14e11e28fd7a11ea2c64292b0..2a6dcbe6beb7ebe5a4a5a29226b7eca0a6b9c901 100644 --- a/pycardium/modules/qstrdefs.h +++ b/pycardium/modules/qstrdefs.h @@ -23,4 +23,5 @@ Q(ticks_add) Q(ticks_diff) /* vibra */ -Q(vibra) \ No newline at end of file +Q(vibra) +Q(vibrate) diff --git a/pycardium/modules/vibra.c b/pycardium/modules/vibra.c index aca3fba6c79644871281ab15a71e3436449b8eb4..50bd07210ebb0cbda3ae37963bd7245e4989b316 100644 --- a/pycardium/modules/vibra.c +++ b/pycardium/modules/vibra.c @@ -16,9 +16,18 @@ STATIC mp_obj_t mp_vibra_set(mp_obj_t state_obj) } STATIC MP_DEFINE_CONST_FUN_OBJ_1(vibra_set_obj, mp_vibra_set); +STATIC mp_obj_t mp_vibra_vibrate(mp_obj_t a_obj) +{ + int millis = mp_obj_get_int(a_obj); + epic_vibra_vibrate(millis); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(vibra_vibrate_obj, mp_vibra_vibrate); + STATIC const mp_rom_map_elem_t vibra_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_vibra) }, { MP_ROM_QSTR(MP_QSTR_set), MP_ROM_PTR(&vibra_set_obj) }, + { MP_ROM_QSTR(MP_QSTR_vibrate), MP_ROM_PTR(&vibra_vibrate_obj) } }; STATIC MP_DEFINE_CONST_DICT(vibra_module_globals, vibra_module_globals_table);