OSDN Git Service

[General] Licence changed to GPL2->GPL+LE cause of sdcc's libraries; See http://sdcc...
[openi2cradio/OpenI2CRadio.git] / main.c
1 /*
2  * OpenI2CRADIO
3  * Config & Main routine.
4  * (C) 2013-06-10 K.Ohta <whatisthis.sowhat ai gmail.com>
5  * License: GPL2+LE
6  */
7
8 #include <stdarg.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <sdcc-lib.h>
13 #include <pic18fregs.h> /* ONLY FOR PIC18x */
14 #include <signal.h>
15 #include <delay.h>
16
17 #include "iodef.h"
18 #include "idle.h"
19 #include "i2c_io.h"
20 #include "akc6955.h"
21 #include "lcd_acm1602.h"
22 #include "ui.h"
23
24 /*
25  * Config words.
26  */
27 __at(__CONFIG1H) _config1h = _FOSC_INTIO67_1H;
28 __at(__CONFIG2L) _config2l = _BORV_190_2L & _BOREN_ON_2L & _PWRTEN_ON_2L;
29 __at(__CONFIG2H) _config2h = _WDTEN_ON_2H & _WDTPS_32768_2H;
30 __at(__CONFIG3H) _config3h = _PBADEN_OFF_3H & _MCLRE_EXTMCLR_3H;
31 __at(__CONFIG4L) _config4l = _STVREN_ON_4L & _LVP_OFF_4L & _XINST_ON_4L & _DEBUG_ON_4L;
32 __at(__CONFIG5L) _config5l = _CP0_OFF_5L & _CP1_OFF_5L;
33 __at(__CONFIG5H) _config5h = _CPB_OFF_5H & _CPD_OFF_5H;
34 __at(__CONFIG6L) _config6l = _WRT0_OFF_6L & _WRT1_OFF_6L;
35 __at(__CONFIG6H) _config6h = _WRTD_OFF_6H & _WRTB_OFF_6H & _WRTC_OFF_6H;
36 __at(__CONFIG7L) _config7l = _EBTR0_OFF_7L & _EBTR1_OFF_7L;
37 __at(__CONFIG7H) _config7h = _EBTRB_OFF_7H;
38
39
40
41 SIGHANDLER(TMR0_handler)
42 {
43    unsigned char tmr0f;
44    unsigned char t0con;
45
46    // Stop timer0
47    t0con = T0CON;
48    t0con &= ~_IDLEN;
49    T0CON = t0con;
50
51    // Read IOKEYS
52    readkey_io();
53
54    // Clear interrupt flag
55    tmr0f = INTCON;
56    tmr0f &= ~(_TMR0IF);
57    INTCON = tmr0f;
58
59    return;
60 }
61
62
63 DEF_INTLOW(intlow_handler)
64   DEF_HANDLER(SIG_TMR0, TMR0_handler)
65 END_DEF
66
67
68 unsigned int amfreq;
69 unsigned int fmfreq;
70 unsigned char amband;
71 unsigned char fmband;
72 unsigned char fm;
73 unsigned char am_mode3k;
74 int recv_signal;
75
76
77
78
79 static void update_display(void)
80 {
81     if(fm != 0){ // FM
82         _LOCATE(0,0);
83         if(fmband < AKC6955_BAND_TV1) {
84             printstr("FM");
85             _PUTCHAR('1' + (fmband & 7));
86         } else if(fmband < AKC6955_BAND_FMUSER){
87             printstr("TV");
88             _PUTCHAR('1' + fmband - AKC6955_BAND_TV1);
89         } else { // USER
90             printstr("FMUSR");
91         }
92     } else { // AM
93         _LOCATE(0,1);
94         if(amband == AKC6955_BAND_LW) {
95             printstr("LW");
96         } else if(amband <AKC6955_BAND_SW1) { //MW
97             printstr("MW");
98             _PUTCHAR('1' + amband - AKC6955_BAND_MW1);
99         } else if(amband < AKC6955_BAND_AMUSER) { //MW
100             printstr("SW");
101             _PUTCHAR('1' + amband - AKC6955_BAND_SW1);
102         } else if(amband == AKC6955_BAND_MW4){
103             printstr("MW4");
104         } else {
105             printstr("AMUSR");
106         }
107      }
108      _LOCATE(16-4 ,1);
109      if(fm != 0){
110          printstr("MHz");
111      } else {
112          printstr("KHz");
113      }
114      _LOCATE(16-5, 1);
115      if(fm != 0){
116          int freq_lo = fmfreq % 100;
117          int freq_hi = fmfreq / 100;
118          print_numeric(freq_hi);
119          _PUTCHAR('.');
120          print_numeric(freq_lo);
121      } else {
122          int freq = amfreq;
123          print_numeric(freq);
124      }
125      // Signal
126      _LOCATE(0, 0);
127      printstr("S=");
128      print_numeric(recv_signal);
129 }
130
131
132 static void setfreq_updown(unsigned char ctlword)
133 {
134     switch(ctlword){
135         case charcode_8: // Change band
136             if(fm != 0){
137                 amband++;
138                 if(amband > 18) amband = 0;
139 //                amfreq = akc6955_setfreq(amfreq)
140                 akc6955_set_amband(amband);
141                 delay1ktcy(500); // 62.5ms
142                 amband = akc6955_get_amband();
143                 amfreq = akc6955_get_freq();
144             } else {
145                 fmband++;
146                 if(fmband > 7) fmband = 0;
147 //                amfreq = akc6955_setfreq(amfreq)
148                 akc6955_set_fmband(fmband);
149                 delay1ktcy(500); // 62.5ms
150                 fmband = akc6955_get_fmband();
151                 fmfreq = akc6955_get_freq();
152             }
153             break;
154         case charcode_2: // Change band
155             if(fm != 0){
156                 amband--;
157                 if(amband == 0) amband = 18;
158                 if(amband >= 18) amband = 18;
159 //                amfreq = akc6955_setfreq(amfreq)
160                 akc6955_set_amband(amband);
161                 delay1ktcy(500); // 62.5ms
162                 amband = akc6955_get_amband();
163                 amfreq = akc6955_get_freq();
164             } else {
165                 fmband--;
166                 if(fmband == 0) fmband = 7;
167                 if(fmband >= 7) fmband = 7;
168 //                amfreq = akc6955_setfreq(amfreq)
169                 akc6955_set_fmband(fmband);
170                 delay1ktcy(500); // 62.5ms
171                 fmband = akc6955_get_fmband();
172                 fmfreq = akc6955_get_freq();
173             }
174             break;
175         case charcode_4: // Down Freq;
176             if(fm != 0){
177                 fmfreq = akc6955_down_freq(10); // DOWN 100KHz
178             } else {
179                 amfreq = akc6955_down_freq(10); // DOWN 10KHz
180             }
181             break;
182         case charcode_6: // Down Freq;
183             if(fm != 0){
184                 fmfreq = akc6955_up_freq(10); // UP 100KHz
185             } else {
186                 amfreq = akc6955_up_freq(10); // UP 10KHz
187             }
188             break;
189         case charcode_7: // Down Fast;
190             if(fm != 0){
191                 fmfreq = akc6955_down_freq(50); // DOWN 500KHz
192             } else {
193                 amfreq = akc6955_down_freq(50); // DOWN 50KHz
194             }
195             break;
196         case charcode_9: // Down Fast;
197             if(fm != 0){
198                 fmfreq = akc6955_up_freq(50); // UP 100KHz
199             } else {
200                 amfreq = akc6955_up_freq(50); // UP 10KHz
201             }
202             break;
203         case charcode_1: // Down Slow;
204             if(fm != 0){
205                 fmfreq = akc6955_down_freq(5); // DOWN 50KHz
206             } else {
207                 amfreq = akc6955_down_freq(5); // DOWN 50KHz
208             }
209             break;
210         case charcode_3: // Down Slow;
211             if(fm != 0){
212                 fmfreq = akc6955_up_freq(5); // UP 50KHz
213             } else {
214                 amfreq = akc6955_up_freq(5); // UP 5KHz
215             }
216             break;
217         case charcode_0: // Step
218             if(fm == 0){
219                 if(am_mode3k == 0) {
220                     am_mode3k = 0xff;
221                 } else {
222                     am_mode3k = 0;
223                 }
224                 amfreq = akc6955_mode3k(am_mode3k);
225             }
226             break;
227         default:
228             break;
229     }
230 }
231 /*
232  * 
233  */
234 int main(void)
235 {
236     char readchar;
237     unsigned char input_flag;
238
239     keyin_init();
240     keyin_ioinit();
241     idle_init();
242
243     i2c1_init();
244
245     delay1ktcy(1000); // Wait 125ms
246
247     acm1602_init(0xa0, 1); //Init LCD
248
249     delay1ktcy(1000); // Wait 125ms
250
251     
252     // Init AKC6955
253     amfreq = 954;
254     fmfreq = 8000; // 10KHz order.
255     amband = AKC6955_BAND_MW2;
256     fmband = AKC6955_BAND_FM2;
257     am_mode3k = 0xff;
258     fm = 0;
259     recv_signal = 0;
260
261     /* Check EEPROM */
262     /* Push default parameters to AKC6955*/
263     
264     akc6955_chg_fm(fm); // Set to AM
265     akc6955_set_amband(amband);
266     akc6955_set_freq(amfreq); // Dummy, TBS (954KHz)
267     akc6955_set_power(0xff); // Power ON
268     idle(0xff00);
269     do {
270         /* Main routine*/
271         input_flag = readkey_compare();
272         if(input_flag != 0){
273             readchar = pop_keyinfifo();
274             switch(readchar) {
275                 // Top of input-tree.
276                 case charcode_s0:
277                     // Change FM/AM
278                     if(fm != 0){
279                         fm = 0;
280                         akc6955_chg_fm(fm);
281                         akc6955_set_amband(amband);
282                         akc6955_set_freq(amfreq);
283                     } else {
284                         fm = 0xff;
285                         akc6955_chg_fm(fm);
286                         akc6955_set_fmband(fmband);
287                         akc6955_set_freq(fmfreq);
288                     }
289                     break;
290                 case charcode_s1:
291                     // 
292                     break;
293                 case charcode_s2:
294                     // ENTER
295                     break;
296                 case charcode_s3:
297                     // Reserve
298                     break;
299                 case charcode_null: // None
300                     break;
301                 default:
302                     // Numeric 0to9, or a to f.
303                     setfreq_updown(readchar);
304                     break;
305             }
306         }
307         recv_signal = akc6955_read_level();
308         if(fm != 0){
309             fmfreq = akc6955_get_freq();
310         } else {
311             amfreq = akc6955_get_freq();
312         }
313         // Check battery (include idle?)
314         // Read AKJC6955's status
315         // Putstring to LCD.
316         update_display();
317         idle(0xf800);
318     } while(1);
319
320 }
321