Merge remote-tracking branch 'mjb/master'
[fw/altos] / src / drivers / ao_seven_segment.c
1 /*
2  * Copyright © 2012 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2 of the License.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
16  */
17
18 #include <ao.h>
19 #include <ao_seven_segment.h>
20 #include <ao_lcd_stm.h>
21
22 /*
23  *         0
24  *      -------
25  *     |       |  
26  *   1 |       | 2
27  *     |   3   |
28  *      -------
29  *     |       |
30  *   4 |       | 5
31  *     |   6   |
32  *      -------
33  *              [] 7
34  *
35  */
36
37 static const uint8_t ao_segments[] = {
38         (1 << AO_SEGMENT_0) |
39         (1 << AO_SEGMENT_1) |
40         (1 << AO_SEGMENT_2) |
41         (0 << AO_SEGMENT_3) |
42         (1 << AO_SEGMENT_4) |
43         (1 << AO_SEGMENT_5) |
44         (1 << AO_SEGMENT_6),            /* 0 */
45
46         (0 << AO_SEGMENT_0) |
47         (0 << AO_SEGMENT_1) |
48         (1 << AO_SEGMENT_2) |
49         (0 << AO_SEGMENT_3) |
50         (0 << AO_SEGMENT_4) |
51         (1 << AO_SEGMENT_5) |
52         (0 << AO_SEGMENT_6),            /* 1 */
53
54         (1 << AO_SEGMENT_0) |
55         (0 << AO_SEGMENT_1) |
56         (1 << AO_SEGMENT_2) |
57         (1 << AO_SEGMENT_3) |
58         (1 << AO_SEGMENT_4) |
59         (0 << AO_SEGMENT_5) |
60         (1 << AO_SEGMENT_6),            /* 2 */
61
62         (1 << AO_SEGMENT_0) |
63         (0 << AO_SEGMENT_1) |
64         (1 << AO_SEGMENT_2) |
65         (1 << AO_SEGMENT_3) |
66         (0 << AO_SEGMENT_4) |
67         (1 << AO_SEGMENT_5) |
68         (1 << AO_SEGMENT_6),            /* 3 */
69
70         (0 << AO_SEGMENT_0) |
71         (1 << AO_SEGMENT_1) |
72         (1 << AO_SEGMENT_2) |
73         (1 << AO_SEGMENT_3) |
74         (0 << AO_SEGMENT_4) |
75         (1 << AO_SEGMENT_5) |
76         (0 << AO_SEGMENT_6),            /* 4 */
77
78         (1 << AO_SEGMENT_0) |
79         (1 << AO_SEGMENT_1) |
80         (0 << AO_SEGMENT_2) |
81         (1 << AO_SEGMENT_3) |
82         (0 << AO_SEGMENT_4) |
83         (1 << AO_SEGMENT_5) |
84         (1 << AO_SEGMENT_6),            /* 5 */
85
86         (1 << AO_SEGMENT_0) |
87         (1 << AO_SEGMENT_1) |
88         (0 << AO_SEGMENT_2) |
89         (1 << AO_SEGMENT_3) |
90         (1 << AO_SEGMENT_4) |
91         (1 << AO_SEGMENT_5) |
92         (1 << AO_SEGMENT_6),            /* 6 */
93
94         (1 << AO_SEGMENT_0) |
95         (0 << AO_SEGMENT_1) |
96         (1 << AO_SEGMENT_2) |
97         (0 << AO_SEGMENT_3) |
98         (0 << AO_SEGMENT_4) |
99         (1 << AO_SEGMENT_5) |
100         (0 << AO_SEGMENT_6),            /* 7 */
101
102         (1 << AO_SEGMENT_0) |
103         (1 << AO_SEGMENT_1) |
104         (1 << AO_SEGMENT_2) |
105         (1 << AO_SEGMENT_3) |
106         (1 << AO_SEGMENT_4) |
107         (1 << AO_SEGMENT_5) |
108         (1 << AO_SEGMENT_6),            /* 8 */
109
110         (1 << AO_SEGMENT_0) |
111         (1 << AO_SEGMENT_1) |
112         (1 << AO_SEGMENT_2) |
113         (1 << AO_SEGMENT_3) |
114         (0 << AO_SEGMENT_4) |
115         (1 << AO_SEGMENT_5) |
116         (1 << AO_SEGMENT_6),            /* 9 */
117
118         (1 << AO_SEGMENT_0) |
119         (1 << AO_SEGMENT_1) |
120         (1 << AO_SEGMENT_2) |
121         (1 << AO_SEGMENT_3) |
122         (1 << AO_SEGMENT_4) |
123         (1 << AO_SEGMENT_5) |
124         (0 << AO_SEGMENT_6),            /* A */
125
126         (0 << AO_SEGMENT_0) |
127         (1 << AO_SEGMENT_1) |
128         (0 << AO_SEGMENT_2) |
129         (1 << AO_SEGMENT_3) |
130         (1 << AO_SEGMENT_4) |
131         (1 << AO_SEGMENT_5) |
132         (1 << AO_SEGMENT_6),            /* b */
133
134         (1 << AO_SEGMENT_0) |
135         (1 << AO_SEGMENT_1) |
136         (0 << AO_SEGMENT_2) |
137         (0 << AO_SEGMENT_3) |
138         (1 << AO_SEGMENT_4) |
139         (0 << AO_SEGMENT_5) |
140         (1 << AO_SEGMENT_6),            /* c */
141
142         (0 << AO_SEGMENT_0) |
143         (0 << AO_SEGMENT_1) |
144         (1 << AO_SEGMENT_2) |
145         (1 << AO_SEGMENT_3) |
146         (1 << AO_SEGMENT_4) |
147         (1 << AO_SEGMENT_5) |
148         (1 << AO_SEGMENT_6),            /* d */
149
150         (1 << AO_SEGMENT_0) |
151         (1 << AO_SEGMENT_1) |
152         (0 << AO_SEGMENT_2) |
153         (1 << AO_SEGMENT_3) |
154         (1 << AO_SEGMENT_4) |
155         (0 << AO_SEGMENT_5) |
156         (1 << AO_SEGMENT_6),            /* E */
157
158         (1 << AO_SEGMENT_0) |
159         (1 << AO_SEGMENT_1) |
160         (0 << AO_SEGMENT_2) |
161         (1 << AO_SEGMENT_3) |
162         (1 << AO_SEGMENT_4) |
163         (0 << AO_SEGMENT_5) |
164         (0 << AO_SEGMENT_6),            /* F */
165 };
166
167 void
168 ao_seven_segment_set(uint8_t digit, uint8_t value)
169 {
170         uint8_t s;
171         uint8_t segments;
172
173         if (value == AO_SEVEN_SEGMENT_CLEAR)
174                 segments = 0;
175         else {
176                 segments = ao_segments[value & 0xf];
177
178                 /* Check for decimal point */
179                 if (value & 0x10)
180                         segments |= (1 << AO_SEGMENT_7);
181         }
182
183         for (s = 0; s <= 7; s++)
184                 ao_lcd_set(digit, s, !!(segments & (1 << s)));
185         ao_lcd_flush();
186 }
187
188 void
189 ao_seven_segment_clear(void)
190 {
191         ao_lcd_clear();
192 }
193
194
195 #if 0
196 static void
197 ao_seven_segment_show(void)
198 {
199         uint8_t digit, value;
200         ao_cmd_decimal();
201         digit = ao_cmd_lex_i;
202         ao_cmd_decimal();
203         value = ao_cmd_lex_i;
204         ao_seven_segment_set(digit, value);
205 }
206
207
208 static const struct ao_cmds ao_seven_segment_cmds[] = {
209         { ao_seven_segment_show,        "S <digit> <value>\0Set LCD digit" },
210         { 0, NULL },
211 };
212 #endif
213
214 void
215 ao_seven_segment_init(void)
216 {
217 #if 0
218         ao_cmd_register(ao_seven_segment_cmds);
219 #endif
220 }