use xbee module from aversive
[protos/xbee-avr.git] / beep.c
1 /*
2  * Copyright (c) 2011, Olivier MATZ <zer0@droids-corp.org>
3  * All rights reserved.
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of the University of California, Berkeley nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include <stdint.h>
29 #include <stdio.h>
30
31 #include <aversive.h>
32 #include <aversive/wait.h>
33
34 #include <scheduler.h>
35 #include <cirbuf.h>
36
37 #include "main.h"
38
39 /* 100 ms */
40 #define BEEP_PERIOD (100000UL/SCHEDULER_UNIT)
41
42 static struct cirbuf beep_fifo;
43 static char beep_fifo_buf[16];
44 volatile uint8_t beep_mask = 1; /* init beep */
45
46 union beep_t {
47         uint8_t u08;
48         struct {
49                 uint8_t tone:2;
50                 uint8_t len:3;
51                 uint8_t pause:3;
52         };
53 };
54 static volatile union beep_t current_beep;
55
56 /* called by the scheduler */
57 static void beep_cb(void *arg)
58 {
59         (void)arg;
60
61         beep_mask = 0;
62         if (current_beep.len == 0 && current_beep.pause == 0) {
63                 if (CIRBUF_GET_LEN(&beep_fifo) == 0)
64                         return;
65                 current_beep.u08 = cirbuf_get_head(&beep_fifo);
66                 cirbuf_del_head(&beep_fifo);
67         }
68
69         if (current_beep.len > 0) {
70                 current_beep.len --;
71                 switch (current_beep.tone) {
72                         case 0: beep_mask = 1; break;
73                         case 1: beep_mask = 2; break;
74                         case 2: beep_mask = 4; break;
75                         case 3: beep_mask = 8; break;
76                         default: break;
77                 }
78                 return;
79         }
80
81         if (current_beep.pause > 0) {
82                 current_beep.pause --;
83         }
84 }
85
86 void beep(uint8_t tone, uint8_t len, uint8_t pause)
87 {
88         uint8_t flags;
89         union beep_t b;
90
91         b.tone = tone;
92         b.len = len;
93         b.pause = pause;
94         IRQ_LOCK(flags);
95         cirbuf_add_tail(&beep_fifo, b.u08);
96         IRQ_UNLOCK(flags);
97 }
98
99 void beep_init(void)
100 {
101         cirbuf_init(&beep_fifo, beep_fifo_buf, 0, sizeof(beep_fifo_buf));
102         scheduler_add_periodical_event_priority(&beep_cb, NULL,
103                                             BEEP_PERIOD, BEEP_PRIO);
104 }