FreeCalypso > hg > fc-tourmaline
diff src/cs/services/vibr/vibr_process.c @ 294:e17bdedfbf2b
VIBR SWE initial implementation
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 27 Mar 2022 08:46:10 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/services/vibr/vibr_process.c Sun Mar 27 08:46:10 2022 +0000 @@ -0,0 +1,66 @@ +/* + * In this module we are going to implement the main process functions + * for VIBR. + */ + +#include "vibr/vibr_env.h" +#include "vibr/vibr_func_i.h" +#include "rv/rv_general.h" +#include "rvf/rvf_api.h" +#include "rvm/rvm_use_id_list.h" +#include "main/sys_types.h" +#include "buzzer/vibrator.h" + +/* duration of "on" and "off" phases of each vibration cycle */ +#define ON_PHASE_MS 500 +#define OFF_PHASE_MS 500 + +void vibr_process_start_req(struct vibr_start_msg *msg) +{ + vibr_env->vibr_level = msg->vibr_level; + /* start the first pulse */ + HW_vibrator_on(vibr_env->vibr_level); + vibr_env->on_state = TRUE; + rvf_start_timer(VIBR_TIMER, RVF_MS_TO_TICKS(ON_PHASE_MS), FALSE); + if (msg->num_pulses) { + vibr_env->cont_mode = FALSE; + vibr_env->remain_cycles = msg->num_pulses; + } else + vibr_env->cont_mode = TRUE; +} + +void vibr_process_stop_req(struct vibr_stop_msg *msg) +{ + HW_vibrator_off(); + rvf_stop_timer(VIBR_TIMER); +} + +static void on_phase_end(void) +{ + HW_vibrator_off(); + /* got more pulses? */ + if (!vibr_env->cont_mode) { + vibr_env->remain_cycles--; + if (!vibr_env->remain_cycles) + return; /* pulse train finished */ + } + /* time the "off" phase before next pulse */ + vibr_env->on_state = FALSE; + rvf_start_timer(VIBR_TIMER, RVF_MS_TO_TICKS(OFF_PHASE_MS), FALSE); +} + +static void off_phase_end(void) +{ + /* start the next pulse */ + HW_vibrator_on(vibr_env->vibr_level); + vibr_env->on_state = TRUE; + rvf_start_timer(VIBR_TIMER, RVF_MS_TO_TICKS(ON_PHASE_MS), FALSE); +} + +void vibr_handle_timer(void) +{ + if (vibr_env->on_state) + on_phase_end(); + else + off_phase_end(); +}