OSDN Git Service

[v2.0][BACKPORT] Backport from v1.0, fix up/down and add helps.
[openi2cradio/OpenI2CRadio.git] / menu.c
1 /*
2  * OpenI2CRADIO
3  * Menu sub-routines.
4  * Copyright (C) 2013-06-21 K.Ohta <whatisthis.sowhat ai gmail.com>
5  * License: GPL2+LE
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2,
10  *  or (at your option) any later version.
11  *  This library / program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *  See the GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this library; see the file COPYING. If not, write to the
18  *  Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
19  *  MA 02110-1301, USA.
20  *
21  *  As a special exception, if you link this(includeed from sdcc) library
22  *  with other files, some of which are compiled with SDCC,
23  *  to produce an executable, this library does not by itself cause
24  *  the resulting executable to be covered by the GNU General Public License.
25  *  This exception does not however invalidate any other reasons why
26  *  the executable file might be covered by the GNU General Public License.
27  */
28
29 #include "menu.h"
30 #include "menu_memoryfreq.h"
31 #include "power.h"
32 #include "commondef.h"
33 #include "backlight.h"
34
35 void toggle_amfm(void)
36 {
37     unsigned int freq;
38     if(setup.fm != 0){
39         setup.fm = 0;
40         setup.fmfreq_bank[setup.fmband] = setup.fmfreq;
41   //      akc6955_set_amband(amband);
42         freq = setup.amfreq_bank[setup.amband];
43     } else {
44         setup.fm = 0xff;
45         setup.amfreq_bank[setup.amband] = setup.amfreq;
46 //        akc6955_set_fmband(fmband);
47         freq = setup.fmfreq_bank[setup.fmband];
48     }
49     akc6955_chg_fm(setup.fm, freq);
50     idle_time_ms(500);
51 //    akc6955_set_freq(freq);
52 }
53
54
55
56 void set_stereomode(void)
57 {
58     __bitops_t mode;
59     mode.byte = 0x00;
60     if(setup.stereo == 0x00){
61             mode.b0 = 1; // Force mono
62     } else if(setup.stereo < 0x80){
63             mode.b1 = 1; // Force stereo
64     }
65     akc6955_set_stereomode(mode.byte);
66 }
67
68 void set_stereo(void)
69 {
70     
71     if(setup.stereo == 0xff) {// Force Mono
72         setup.stereo = 0x00;
73     } else if(setup.stereo == 0x00) { //Mono->Stereo
74         setup.stereo = 0x7f;
75     } else { // Default, Stereo->auto
76         setup.stereo = 0xff;
77     }
78     set_stereomode();
79 }
80
81
82 void set_volume(void)
83 {
84     unsigned char c;
85     unsigned char d;
86     unsigned char fact;
87     unsigned char dispf = 0xff;
88
89     _CLS();
90     do {
91         if(dispf != 0) {
92             _LOCATE(0,0);
93              d = akc6955_getvolumemode();
94             if(d == 0){
95                  _PUTCHAR('D');
96             } else {
97                  _PUTCHAR('K');
98             }
99             printstr(" Vol:");
100             print_numeric_nosupress(setup.volume, 2);
101             printstr("  F:Exit");
102             _LOCATE(0,1);
103             printstr("Pre:");
104             _PUTCHAR('0' + (setup.prevolume & 3));
105             _LOCATE(16-4, 1);
106             if(setup.lowboost == 0x00){
107                  printstr("   ");
108             } else {
109                  printstr("LOW");
110          }
111             _HOME();
112         }
113      c = pollkey_single_timeout(41, 1); // 943ms
114      backlight_reset(c);
115      dispf = backlight_dec(dispf);
116
117      switch(c) {
118              case charcode_6:
119                  setup.volume++;
120                  if(setup.volume > 63) setup.volume = 63;
121                  akc6955_setvolume(setup.volume);
122                  break;
123              case charcode_4:
124                  setup.volume--;
125                  if(setup.volume < 23) setup.volume = 23;
126                  akc6955_setvolume(setup.volume);
127                  break;
128              case charcode_f:
129                  _CLS();
130                  return;
131              case charcode_a:
132                  fact = 0xff;
133                  if(d != 0){
134                      fact = 0x00;
135                  }
136                  akc6955_setvolumemode(fact);
137                  akc6955_setvolume(setup.volume);
138                  break;
139              case charcode_b:
140                  setup.prevolume++;
141                  if(setup.prevolume > 3) setup.prevolume = 0;
142                  akc6955_set_prevolume(setup.prevolume);
143                  akc6955_setvolume(setup.volume);
144                  break;
145              case charcode_d:
146                  fact = 0x00;
147                  if(setup.lowboost == 0x00){
148                      fact = 0xff;
149                  }
150                  setup.lowboost = fact;
151                  akc6955_set_lowboost(setup.lowboost);
152                  akc6955_setvolume(setup.volume);
153                  break;
154              default:
155                  break;
156          }
157          if(setup.volume < 24){
158              set_examp_mute(1);
159         } else {
160              set_examp_mute(0);
161         }
162         idle_time_ms(9); // Pad.
163     } while(1);
164 }
165
166
167 void scan_start(void)
168 {
169     unsigned char c;
170     unsigned char cc;
171     unsigned char n;
172     _CLS();
173     scanflag = 0;
174     do {
175         do {
176              c = pollkey_single_timeout(20, 0) ; // 23*20 = 460ms
177             update_status();
178             cc = ' ';
179             if((akc6955_chk_donescan() == 0) && (scanflag != 0)){
180                 cc = '>';
181             }
182             _PUTCHAR(cc);
183             printstr("Scan A/4/6/F");
184             print_freq(1);
185             _HOME();
186         } while(c == charcode_null);
187       // New Scan
188        switch(c){
189            case charcode_6:
190                scanflag = 0xff;
191                akc6955_do_scan(0xff);
192                break;
193            case charcode_4:
194                scanflag = 0xff;
195                akc6955_do_scan(0);
196                break;
197            case charcode_a:
198                akc6955_abort_scan();
199                goto _l0;
200                break;
201            case charcode_f:
202                goto _l0;
203                break;
204            default:
205                break;
206        }
207     } while(1);
208 _l0:
209     _CLS();
210 }
211
212 void setfreq_direct(void)
213 {
214     unsigned int val;
215     _CLS();
216     _LOCATE(0,0);
217     printstr("Set Freq:");
218     _LOCATE(0,1);
219     if(setup.fm != 0){
220         // FM
221         printstr("FM ");
222         val = setup.fmfreq;
223         val = read_numeric(val, 5, 7, 1);
224         setup.fmfreq = val;
225     } else {
226         // FM
227         printstr("AM ");
228         val = setup.amfreq;
229         val = read_numeric(val, 5, 7, 1);
230         setup.amfreq = val;
231     }
232     akc6955_set_freq(val);
233 }
234
235 void setband_direct(void)
236 {
237     unsigned int band;
238     unsigned int freq;
239     _CLS();
240     _LOCATE(0,0);
241     if(setup.fm != 0){
242         printstr("Set Band:FM#");
243         band = setup.fmband & 7;
244         setup.fmfreq_bank[setup.fmband] = setup.fmfreq;
245         setup.fmband = read_numeric(band, 2, 7, 1);
246         setup.fmfreq = setup.fmfreq_bank[setup.fmband];
247         akc6955_set_fmband(setup.fmband);
248         freq = setup.fmfreq;
249     } else {
250         printstr("Set Band:AM#");
251         band = setup.amband & 0x1f;
252         setup.amfreq_bank[setup.amband] = setup.amfreq;
253         setup.amband = read_numeric(band, 2, 7, 1);
254         setup.amfreq = setup.amfreq_bank[setup.amband];
255         switch(band) {
256          case AKC6955_BAND_LW:
257          case AKC6955_BAND_MW2:
258            setup.am_mode3k = 0xff;
259            break;
260          case AKC6955_BAND_MW1:
261          case AKC6955_BAND_MW3:
262          case AKC6955_BAND_MW4:
263            setup.am_mode3k = 0x00;
264            break;
265          default:
266            break;
267         }
268        
269         akc6955_set_amband(setup.amband);
270         freq = setup.amfreq;
271     }
272     akc6955_do_tune();
273     akc6955_set_freq(freq);
274 }
275
276 void call_userband(unsigned char num)
277 {
278     unsigned int freq;
279     unsigned int ch;
280     unsigned char start;
281     unsigned char end;
282     unsigned char mode3k;
283     unsigned char freq2;
284     _userband_t *p;
285
286     if(num >= USER_BAND_NUM) return;
287     
288     p = &(setup.am_usrbands[num]);
289     if(setup.fm != 0){
290         p = &(setup.fm_usrbands[num]);
291     }
292     freq = p->freq;
293     start = p->start;
294     end = p->stop;
295     mode3k = p->mode3k;
296     if(setup.fm != 0) {
297         ch = ((freq - 3000) / 5) * 2;
298         setup.fmband = AKC6955_BAND_FMUSER;
299     } else {
300         unsigned int q = 5;
301         if(mode3k != 0) q = 3;
302         ch = freq / q;
303         setup.amband = AKC6955_BAND_AMUSER;
304     }
305
306     if(start > end) {
307         unsigned char tmp;
308         tmp = start;
309         start = end;
310         end = tmp;
311     }
312     
313     freq2 = ch / 32;
314     if(freq2 > end) {
315         ch = end * 32;
316     }
317     if(freq2 < start){
318         ch = start * 32;
319     }
320     akc6955_set_userband(start, end, ch, mode3k);
321 }
322
323 void set_userband(void)
324 {
325     unsigned int from,to;
326     unsigned char c;
327     unsigned char pp;
328     unsigned char mode3k;
329     char cc;
330
331     _CLS();
332     _LOCATE(0,0);
333     printstr("User ch:");
334     c = pollkey_single();
335
336     if(c > charcode_0) return;
337     if(c < charcode_1) return;
338     if(c == charcode_0) {
339         c = 0;
340     } else {
341         c = c - charcode_1 + 1;
342     }
343     if(c >= USER_BAND_NUM) return;
344
345     if(setup.fm != 0){
346         from = setup.fm_usrbands[c].start * 80 + 3000; // 32*25/10
347         to = setup.fm_usrbands[c].stop * 80 + 3000;
348         _CLS();
349         _LOCATE(0,0);
350         _LOCATE(0,0);
351         printstr("FM#");
352         print_numeric_nosupress(c, 1);
353         _LOCATE(0,1);
354         printstr(" From:");
355         from = read_numeric(from, 5, 7, 1);
356         _LOCATE(0,1);
357         printstr(" To:  ");
358         to = read_numeric(to, 5, 7, 1);
359         setup.fm_usrbands[c].start = (from - 3000) / 80;
360         setup.fm_usrbands[c].stop = (to - 3000) / 80;
361         setup.fm_usrbands[c].freq = from * 80 + 3000;
362         setup.fm_userbandnum = c;
363     } else {
364         mode3k = setup.am_usrbands[c].mode3k;
365         pp = 96; // 3*32
366         if(mode3k == 0) pp = 160; // 5*32
367         from = setup.am_usrbands[c].start * pp;
368         to = setup.am_usrbands[c].stop * pp;
369         _CLS();
370         _LOCATE(0,0);
371         printstr("AM#");
372         print_numeric_nosupress(c, 1);
373         printstr(" Step:");
374         _LOCATE(0,1);
375         printstr("0=3k 1=5k");
376         cc = pollkey_single();
377         if(cc == charcode_0){
378             pp = 96;
379             mode3k = 0xff;
380         } else if(cc = charcode_1) {
381             pp = 160;
382             mode3k = 0;
383         }
384         _CLS();
385         _LOCATE(0,0);
386         printstr("AM#");
387         print_numeric_nosupress(c, 1);
388         _LOCATE(0,1);
389         printstr(" From:");
390         from = read_numeric(from, 5, 7, 1);
391         _LOCATE(0,1);
392         printstr(" To:  ");
393         to = read_numeric(to, 5, 7, 1);
394         setup.am_usrbands[c].start = from / pp;
395         setup.am_usrbands[c].stop = to  / pp;
396         setup.am_usrbands[c].mode3k = mode3k;
397         setup.am_usrbands[c].freq = from * pp;
398         setup.am_userbandnum = c;
399     }
400     call_userband(c);
401     _CLS();
402 }
403
404 void input_userband(void)
405 {
406     unsigned char c;
407     do{
408       c = printhelp_2lines("User Band", "   #");
409
410
411        if((c >= charcode_a) && (c <= charcode_f)){
412           break;
413        }
414        if(c == charcode_0) {
415           _PUTCHAR('0');
416           if(setup.fm != 0){
417              setup.fm_userbandnum = 0;
418           } else {
419              setup.am_userbandnum = 0;
420           }
421           call_userband(0);
422        } else {
423           c = c - charcode_1 + 1;
424           if(c < USER_BAND_NUM) {
425              _PUTCHAR(c + '0');
426              if(setup.fm != 0){
427                setup.fm_userbandnum = c;
428             } else {
429                setup.am_userbandnum = c;
430             }
431             call_userband(c);
432         }
433        }
434        idle(setup.ui_idlecount);
435     } while(1);
436     _CLS();
437 }
438
439
440 void menu_poweroff(void)
441 {
442     unsigned char c;
443     c = printhelp_2lines("Poweroff", "A=Yes");
444     if(c == charcode_a) {
445         shutdown(1);
446     }
447 }
448
449 void setup_akc6955(void)
450 {
451     akc6955_writecmd(AKC6955_POWER, 0xc0);  // You musto *not* mute, set b2 to '0".
452     akc6955_writecmd(AKC6955_VOLUME, 0xc0); // You must select to radio(b1 = '0).
453     if(setup.fm == 0) {
454         akc6955_set_amband(setup.amband);
455         if(setup.amband == AKC6955_BAND_AMUSER) call_userband(setup.am_userbandnum);
456         setup.amfreq = setup.amfreq_bank[setup.amband];
457         akc6955_chg_fm(0, setup.amfreq); // Set to AM
458         akc6955_set_freq(setup.amfreq);
459     } else {
460         akc6955_set_fmband(setup.fmband);
461         if(setup.fmband == AKC6955_BAND_FMUSER) call_userband(setup.fm_userbandnum);
462         setup.fmfreq = setup.fmfreq_bank[setup.fmband];
463         akc6955_chg_fm(0xff, setup.fmfreq); // Set to AM
464         akc6955_set_freq(setup.fmfreq);
465     }// Dummy, TBS (954KHz)
466     akc6955_set_power(0xff); // Power ON
467     akc6955_setvolume(36); // Temporally
468     akc6955_set_thresh_fmcnr(setup.threshold_fmcnr);
469     akc6955_set_thresh_amcnr(setup.threshold_amcnr);
470     akc6955_set_thresh_width(setup.threshold_width);
471     akc6955_set_thresh_fmstereo(setup.threshold_fmstereo);
472     akc6955_setvolumemode(0);
473     akc6955_set_lowboost(setup.lowboost);
474     set_stereomode();
475 }
476
477 void menu_save(void)
478 {
479     unsigned char c;
480     c = printhelp_2lines("Save settings", "A=Yes");
481     if(c == charcode_a) {
482         save_eeprom();
483     }
484 }
485
486 void menu_load(void)
487 {
488     unsigned char c;
489     c = printhelp_2lines("Load settings", "A=Yes B=Init");
490     if(c == charcode_a) {
491         c = load_eeprom();
492         if( c != 0xff) {
493             _CLS();
494             _LOCATE(0,0);
495             c = printhelp_2lines("X) Load Error", "A=Fix");
496             setdefault();
497             if(c == charcode_a){
498                 save_eeprom();
499             }
500         }
501         setup_akc6955();
502     } else if(c == charcode_b){
503         setdefault();
504         setup_akc6955();
505     }
506 }
507
508 void setup_menu(void)
509 {
510     unsigned char c;
511     unsigned int val;
512
513     c = printhelp_2lines("Setup F=HELP", "5=Return");
514     switch(c){
515         case charcode_3:
516             _CLS();
517             _LOCATE(0,0);
518             printstr("BL Level:");
519             val = read_numeric(setup.backlight_level, 3, 0,1);
520             if(val > 255) val = 255;
521             if(val < 10) val = 15;
522             setup.backlight_level = (unsigned char)val;
523             break;
524         case charcode_4:
525             _CLS();
526             _LOCATE(0,0);
527             printstr("FM Bandwidth:");
528             akc6955_get_fmbandwidth(val);
529             val = read_numeric(val, 1, 0, 1) & 3;
530             setup.fmbandwidth = (unsigned char)val;
531             akc6955_set_fmbandwidth(setup.fmbandwidth);
532             break;
533         case charcode_5:
534             break;
535         case charcode_7:
536             _CLS();
537             _LOCATE(0,0);
538             printstr("FM-CNR threshold:");
539             val = setup.threshold_fmcnr;
540             val = read_numeric(val, 1, 0, 1);
541             akc6955_set_thresh_fmcnr((unsigned char)val);
542             break;
543         case charcode_8:
544             _CLS();
545             _LOCATE(0,0);
546             printstr("AM-CNR threshold:");
547             val = setup.threshold_amcnr;
548             val = read_numeric(val, 1, 0, 1);
549             akc6955_set_thresh_amcnr((unsigned char)val);
550             break;
551         case charcode_9:
552             _CLS();
553             _LOCATE(0,0);
554             printstr("Stereo threshold:");
555             val = setup.threshold_fmstereo;
556             val = read_numeric(val, 1, 0, 1);
557             akc6955_set_thresh_fmstereo((unsigned char)val);
558             break;
559         case charcode_0:
560             menu_poweroff();
561             break;
562         case charcode_a:
563             menu_load();
564             break;
565         case charcode_c:
566             menu_save();
567             break;
568         case charcode_d:
569             setdefault();
570             break;
571         case charcode_e:
572             _CLS();
573             _LOCATE(0,0);
574             printstr("BL Long:");
575             val = read_numeric(setup.backlight_long, 3, 0,1);
576             if(val > 999) val = 999;
577             setup.backlight_long = val;
578             break;
579         case charcode_f:
580             setup_help();
581             break;
582         default:
583             break;
584     }
585 }
586 /*
587  * Main Menu : initial-screen -> 'F'.
588  */
589 void main_menu(void)
590 {
591     unsigned char c;
592     unsigned int val;
593
594     printhelp_2lines("Menu:F=HELP", "B=CANCEL");
595     c = pollkey_single(); // 1012ms
596         if(c == charcode_1){
597             // Band
598             setband_direct();
599         } else if(c == charcode_3){
600             // Band
601             setfreq_direct();
602         }else if(c == charcode_4){
603             on_call_userfreq();
604             // Scan
605         }else if(c == charcode_5){
606          //   scan_start();
607             // Scan
608         }else if(c == charcode_6){
609             on_set_userfreq();
610             // Scan
611         } else if(c == charcode_7){
612             menu_poweroff();
613         } else if(c == charcode_8){
614             // Set volume
615             set_volume();
616         } else if(c == charcode_9){
617             _CLS();
618             _LOCATE(0,0);
619             printstr("Sig width:");
620             val = setup.threshold_width;
621             val = read_numeric(val, 1, 0, 1);
622             akc6955_set_thresh_width((unsigned char)val);
623             // Set NF
624         } else if(c == charcode_0){
625             // Setup Menu
626             setup_menu();
627         } else if(c == charcode_a){
628             toggle_amfm();
629         } else if(c == charcode_c){
630             // Set userband
631             set_userband();
632         } else if(c == charcode_d){
633             // Call userband
634             input_userband();
635         } else if (c == charcode_f){
636             mainmenu_help();
637             // HELP
638         }
639        _CLS();
640        _LOCATE(0,0);
641 }
642