OSDN Git Service

[General] Licence changed to GPL2->GPL+LE cause of sdcc's libraries; See http://sdcc...
[openi2cradio/OpenI2CRadio.git] / ui.c
1 /*
2  * OpenI2CRADIO
3  * UI Handler
4  * (C) 2013-06-10 K.Ohta <whatisthis.sowhat ai gmail.com>
5  * License: GPL2+LE
6  */
7
8 #include "ui.h"
9
10 keyin_defs keyin_old[2];
11 keyin_defs keyin_now;
12 char keyin_fifo[16];
13 char keyin_nowp;
14 char keyin_readp;
15 char keyin_counter;
16
17 void keyin_init(void)
18 {
19     char i;
20     /* Initialize vars*/
21     for(i = 0; i < 3; i++) {
22         keyin_old[0].byte[i] = 0x00;
23         keyin_old[1].byte[i] = 0x00;
24         keyin_now.byte[i] = 0x00;
25     }
26     for(i = 0; i < 16; i++) keyin_fifo[i] = 0x00;
27     keyin_nowp = 0;
28     keyin_readp = 0;
29     keyin_counter = 0;
30
31 }
32
33 void keyin_ioinit(void)
34 {
35     /* Initialize IOPORTS*/
36     PORTA = 0x00;
37     LATA = 0x00;
38     ANSELA = AN_A_VAL;
39     TRISA = TRIS_A_VAL;
40
41     PORTB = 0x00;
42     LATB = 0x00;
43     ANSELB = AN_B_VAL;
44     TRISB = TRIS_B_VAL;
45
46     PORTC = 0x00;
47     LATC = 0x00;
48     ANSELC = AN_C_VAL;
49     TRISC = TRIS_C_VAL_O;
50 }
51
52 /*
53  * Push to keyin fifo; not used atomic-writing.
54  */
55 void push_keyinfifo(char b)
56 {
57     keyin_nowp++;
58     if((keyin_nowp > 15) || (keyin_nowp < 0))keyin_nowp = 0;
59     keyin_fifo[keyin_nowp] = b;
60     keyin_counter++;
61     if(keyin_counter > 16) keyin_counter = 16;
62 }
63
64 /*
65  * Pop from keyin fifo; not used atomic-reading.
66  */
67 char pop_keyinfifo(void)
68 {
69     char c;
70     if(keyin_counter <= 0) {
71         keyin_counter = 0;
72         return charcode_null ;
73     }
74     if(keyin_readp > 15) keyin_readp = 15;
75     c = keyin_fifo[keyin_readp];
76     keyin_readp++;
77     if(keyin_readp > 15) keyin_readp = 0;
78     keyin_counter--;
79     if(keyin_counter < 0)keyin_counter = 0;
80     return c;
81 }
82
83 void print_numeric(int i)
84 {
85     if(i == 0){
86         unsigned char c;
87         c = '0';
88         _CURSOR_LEFT();
89         _PUTCHAR(c);
90         _CURSOR_RIGHT();
91     } else {
92         int l;
93         unsigned char supress = 0;
94          _CURSOR_LEFT();
95         if(i < 0){
96             _PUTCHAR('-');
97             i = -i;
98         }
99         l = i / 10000;
100         i = i % 10000;
101         if(l != 0) {
102             _PUTCHAR((l & 0x0f)+ '0');
103             supress = 1;
104         }
105         l = i / 1000;
106         i = i % 1000;
107         if(supress != 0){
108              _PUTCHAR((l & 0x0f)+ '0');
109         } else if(l != 0){
110              _PUTCHAR((l & 0x0f)+ '0');
111             supress = 1;
112
113         }
114         l = i / 100;
115         i = i % 100;
116         if(supress != 0){
117              _PUTCHAR((l & 0x0f)+ '0');
118         } else if(l != 0){
119              _PUTCHAR((l & 0x0f)+ '0');
120             supress = 1;
121
122         }
123         l = i / 10;
124         i = i % 10;
125         if(supress != 0){
126              _PUTCHAR((l & 0x0f)+ '0');
127         } else if(l != 0){
128              _PUTCHAR((l & 0x0f)+ '0');
129             supress = 1;
130
131         }
132         _PUTCHAR((i & 0x0f) + '0');
133         _CURSOR_RIGHT();
134     }
135
136 }
137
138 void printstr(char *s)
139 {
140     int p = 0;
141     _CURSOR_RIGHT();
142     if(s == NULL) return;
143     do {
144         if(s[p] == '\0') break;
145         _PUTCHAR(s[p]);
146         p++;
147     } while(p < 255);
148 }
149
150 void setsignal_tune(unsigned char flag)
151 {
152     if(flag != 0){
153         LATCbits.LATC0 = 1;
154     } else {
155         LATCbits.LATC0 = 0;
156     }
157 }
158
159 void set_backlight(unsigned char flag, unsigned int val)
160 {
161     if(flag != 0){
162         LATBbits.LATB0 = 1;
163     } else {
164         LATBbits.LATB0 = 0;
165     }
166 }
167
168
169 /*
170  * Read IOPORTS for KEY.
171  */
172 void readkey_io(void)
173 {
174     char i;
175     unsigned char portvar;
176     unsigned char latchvar;
177     unsigned char high;
178     unsigned char low;
179     if(keyin_counter > 16) keyin_counter = 0;
180     for(i = 0; i < 3; i++){
181         keyin_old[1].byte[i] = keyin_old[0].byte[i];
182         keyin_old[0].byte[i] = keyin_now.byte[i];
183         keyin_now.byte[i] = 0x00;
184      }
185      /* SCANLINE A*/
186     latchvar = LATA | 0x02;
187     LATA = latchvar;
188     portvar = PORTA;
189     low = (portvar & 0x3c) >>2;
190     latchvar = LATA & 0xfd;
191     LATA = latchvar;
192     /* SCANLINE B*/
193     latchvar = LATB | 0x02;
194     LATB = latchvar;
195     portvar = PORTA;
196     high = (portvar & 0x3c) >>2;
197     latchvar = LATB & 0xfd;
198     LATB = latchvar;
199     /* Pos */
200     keyin_now.byte[0] = (low << 4) | high;
201
202     /* SCANLINE C*/
203     latchvar = LATB | 0x04;
204     LATA = latchvar;
205     portvar = PORTA;
206     low = (portvar & 0x3c) >>2;
207     latchvar = LATB & 0xfb;
208     LATA = latchvar;
209     /* SCANLINE D*/
210     latchvar = LATB | 0x20;
211     LATB = latchvar;
212     portvar = PORTA;
213     high = (portvar & 0x3c) >>2;
214     latchvar = LATB & 0xdf;
215     LATB = latchvar;
216     /* Pos */
217     keyin_now.byte[1] = (low << 4) | high;
218
219     /* Special KEYS */
220     keyin_now.BIT0F = PORTBbits.RB1;
221     keyin_now.BIT1F = PORTBbits.RB2;
222     keyin_now.BIT2F = PORTBbits.RB3;
223     keyin_now.BIT3F = 0; // Reserve
224 }
225
226 unsigned char readkey_compare(void)
227 {
228     char b;
229     char c;
230     char d;
231     char e;
232     unsigned char shift;
233     unsigned char f;
234     f = 0;
235     e = 0;
236     for(d = 0; d < 3; d++) {
237         shift = 0x01;
238         for(b = 0; b < 8; b++){
239             c = 0;
240             if((keyin_now.byte[c] & shift) != 0) c++;
241             if((keyin_old[0].byte[c] & shift) != 0) c++;
242             if((keyin_old[1].byte[c] & shift) != 0) c++;
243             if(c >= 2) {
244             /*
245              * Clear older-inputs on .
246              */
247                 f |= 1;
248                 keyin_old[0].byte[c] &= ~shift;
249                 keyin_old[1].byte[c] &= ~shift;
250                 keyin_now.byte[c] &= ~shift;
251                 if(e == 0) {
252                     push_keyinfifo(charcode_0);
253                 } else if(e <= 15) {
254                     push_keyinfifo(b);
255                 } else if(e < 20) {
256                     push_keyinfifo(e + 1);
257                 }
258             }
259             shift <<= 1;
260             e++;
261         }
262     }
263     /**/
264     return f;
265 }
266
267 /*
268  * Notes:
269  * Initialize sequence:
270  * keyin_init();
271  * keyin_ioinit();
272  * 
273  * Read-key-sequence:
274  * In interrupt/unsleep hook(call per Nms):
275  * readkey_io();
276  * readkey_compare();
277  *
278  * In application handler:
279  * c = pop_keyinfifo();
280  * if(c != 0) do(c);
281  */