signal_gen_scene_pwm.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "../signal_gen_app_i.h"
  2. static const FuriHalPwmOutputId pwm_ch_id[] = {
  3. FuriHalPwmOutputIdNone,
  4. FuriHalPwmOutputIdTim1PA7,
  5. FuriHalPwmOutputIdLptim2PA4,
  6. };
  7. #define DEFAULT_FREQ 1000
  8. #define DEFAULT_DUTY 50
  9. static void
  10. signal_gen_pwm_callback(uint8_t channel_id, uint32_t freq, uint8_t duty, void* context) {
  11. SignalGenApp* app = context;
  12. app->pwm_freq = freq;
  13. app->pwm_duty = duty;
  14. if(app->pwm_ch != pwm_ch_id[channel_id]) { //-V1051
  15. app->pwm_ch_prev = app->pwm_ch;
  16. app->pwm_ch = pwm_ch_id[channel_id];
  17. view_dispatcher_send_custom_event(app->view_dispatcher, SignalGenPwmEventChannelChange);
  18. } else {
  19. app->pwm_ch = pwm_ch_id[channel_id]; //-V1048
  20. view_dispatcher_send_custom_event(app->view_dispatcher, SignalGenPwmEventUpdate);
  21. }
  22. }
  23. void signal_gen_scene_pwm_on_enter(void* context) {
  24. SignalGenApp* app = context;
  25. app->pwm_ch = FuriHalPwmOutputIdTim1PA7;
  26. app->pwm_ch_prev = FuriHalPwmOutputIdTim1PA7;
  27. view_dispatcher_switch_to_view(app->view_dispatcher, SignalGenViewPwm);
  28. signal_gen_pwm_set_callback(app->pwm_view, signal_gen_pwm_callback, app);
  29. signal_gen_pwm_set_params(app->pwm_view, 1, DEFAULT_FREQ, DEFAULT_DUTY);
  30. if(!furi_hal_pwm_is_running(pwm_ch_id[1])) {
  31. furi_hal_pwm_start(pwm_ch_id[1], DEFAULT_FREQ, DEFAULT_DUTY);
  32. } else {
  33. furi_hal_pwm_stop(pwm_ch_id[1]);
  34. furi_hal_pwm_start(pwm_ch_id[1], DEFAULT_FREQ, DEFAULT_DUTY);
  35. }
  36. }
  37. bool signal_gen_scene_pwm_on_event(void* context, SceneManagerEvent event) {
  38. SignalGenApp* app = context;
  39. bool consumed = false;
  40. if(event.type == SceneManagerEventTypeCustom) {
  41. if(event.event == SignalGenPwmEventUpdate) {
  42. consumed = true;
  43. furi_hal_pwm_set_params(app->pwm_ch, app->pwm_freq, app->pwm_duty);
  44. } else if(event.event == SignalGenPwmEventChannelChange) {
  45. consumed = true;
  46. // Stop previous channel PWM
  47. if(app->pwm_ch_prev != FuriHalPwmOutputIdNone &&
  48. furi_hal_pwm_is_running(app->pwm_ch_prev)) {
  49. furi_hal_pwm_stop(app->pwm_ch_prev);
  50. }
  51. // Start PWM and restart if it was starter already
  52. if(furi_hal_pwm_is_running(app->pwm_ch)) {
  53. furi_hal_pwm_stop(app->pwm_ch);
  54. furi_hal_pwm_start(app->pwm_ch, app->pwm_freq, app->pwm_duty);
  55. } else {
  56. furi_hal_pwm_start(app->pwm_ch, app->pwm_freq, app->pwm_duty);
  57. }
  58. }
  59. }
  60. return consumed;
  61. }
  62. void signal_gen_scene_pwm_on_exit(void* context) {
  63. SignalGenApp* app = context;
  64. variable_item_list_reset(app->var_item_list);
  65. if(furi_hal_pwm_is_running(app->pwm_ch)) {
  66. furi_hal_pwm_stop(app->pwm_ch);
  67. }
  68. }