buzzer.c
Go to the documentation of this file.00001
00040 #include "buzzer.h"
00041
00042 #include "hw/hw_buzzer.h"
00043 #include <drv/timer.h>
00044
00045 #include <mware/event.h>
00046
00047 #include <cfg/debug.h>
00048 #include <cfg/module.h>
00049
00050
00051
00052 static Timer buz_timer;
00053 static bool buz_timer_running;
00054 static mtime_t buz_repeat_interval;
00055 static mtime_t buz_repeat_duration;
00056
00057
00061 static void buz_softint(void)
00062 {
00063 if (IS_BUZZER_ON)
00064 {
00065 BUZZER_OFF;
00066 if (buz_repeat_interval)
00067 {
00068
00069 timer_setDelay(&buz_timer, ms_to_ticks(buz_repeat_interval));
00070 timer_add(&buz_timer);
00071 }
00072 else
00073 buz_timer_running = false;
00074 }
00075 else if (buz_repeat_interval)
00076 {
00077
00078 BUZZER_ON;
00079 timer_setDelay(&buz_timer, ms_to_ticks(buz_repeat_duration));
00080 timer_add(&buz_timer);
00081 }
00082 else
00083 buz_timer_running = false;
00084 }
00085
00086
00090 void buz_beep(mtime_t time)
00091 {
00092 cpu_flags_t flags;
00093 IRQ_SAVE_DISABLE(flags);
00094
00095
00096 if (buz_timer_running)
00097 timer_abort(&buz_timer);
00098
00099
00100 BUZZER_ON;
00101
00102
00103 buz_timer_running = true;
00104 timer_setDelay(&buz_timer, ms_to_ticks(time));
00105 timer_add(&buz_timer);
00106
00107 IRQ_RESTORE(flags);
00108 }
00109
00110
00114 void buz_repeat_start(mtime_t duration, mtime_t interval)
00115 {
00116 buz_repeat_interval = interval;
00117 buz_repeat_duration = duration;
00118 buz_beep(duration);
00119 }
00120
00121
00125 void buz_repeat_stop(void)
00126 {
00127 cpu_flags_t flags;
00128 IRQ_SAVE_DISABLE(flags);
00129
00130
00131 if (buz_timer_running)
00132 {
00133 timer_abort(&buz_timer);
00134 buz_timer_running = false;
00135 }
00136
00137 buz_repeat_interval = 0;
00138 BUZZER_OFF;
00139
00140 IRQ_RESTORE(flags);
00141 }
00142
00143 MOD_DEFINE(buzzer)
00144
00145
00148 void buz_init(void)
00149 {
00150 MOD_CHECK(timer);
00151
00152 BUZZER_HW_INIT;
00153
00154
00155 timer_setSoftint(&buz_timer, (Hook)buz_softint, 0);
00156
00157 MOD_INIT(buzzer);
00158 }