BeRTOS
|
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 /* Local vars */ 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 /* Wait for interval time */ 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 /* Wait for beep time */ 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 /* Remove the software interrupt if it was already queued */ 00096 if (buz_timer_running) 00097 timer_abort(&buz_timer); 00098 00099 /* Turn on buzzer */ 00100 BUZZER_ON; 00101 00102 /* Add software interrupt to turn the buzzer off later */ 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 /* Remove the software interrupt if it was already queued */ 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 /* Init software interrupt. */ 00155 timer_setSoftint(&buz_timer, (Hook)buz_softint, 0); 00156 00157 MOD_INIT(buzzer); 00158 }