OSDN Git Service

[v1.0] Fix not up-freq on MW1/MW4@5KHz, fix to 10KHz up/down.
[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 void setfreq_direct(void)
82 {
83     unsigned long val;
84     _CLS();
85     _LOCATE(0,0);
86     printstr("Set Freq:");
87     _LOCATE(0,1);
88     if(setup.fm != 0){
89         // FM
90         printstr("FM ");
91         val = setup.fmfreq;
92         val = read_numeric(val, 5, 7, 1);
93         if((val & 0x80000000) != 0) return;
94         setup.fmfreq = val;
95     } else {
96         // FM
97         printstr("AM ");
98         val = setup.amfreq;
99         val = read_numeric(val, 5, 7, 1);
100         if((val & 0x80000000) != 0) return;
101         setup.amfreq = val;
102     }
103     akc6955_set_freq(val);
104 }
105
106 void setband_direct(void)
107 {
108     unsigned long band;
109     unsigned char band2;
110     unsigned int freq;
111     _CLS();
112     _LOCATE(0,0);
113     if(setup.fm != 0){
114         printstr("Set Band:FM#");
115         band2 = setup.fmband & 7;
116         setup.fmfreq_bank[setup.fmband] = setup.fmfreq;
117         band2 = pollkey_numeric(band2);
118         if(band2 < 8) {
119             setup.fmband = band2 & 7;
120             setup.fmfreq = setup.fmfreq_bank[setup.fmband];
121             akc6955_set_fmband(setup.fmband);
122             freq = setup.fmfreq;
123         }
124         akc6955_set_fmband(setup.fmband);
125         freq = setup.fmfreq;
126     } else {
127         printstr("Set Band:AM#");
128         band = setup.amband & 0x1f;
129         setup.amfreq_bank[setup.amband] = setup.amfreq;
130         band = read_numeric(band, 2, 7, 1);
131         if((band & 0x80000000) != 0) return;
132         setup.amband = band & 0x1f;
133         setup.amfreq = setup.amfreq_bank[setup.amband];
134         switch(band) {
135          case AKC6955_BAND_LW:
136          case AKC6955_BAND_MW2:
137            setup.am_mode3k = 0xff;
138            break;
139          case AKC6955_BAND_MW1:
140          case AKC6955_BAND_MW3:
141          case AKC6955_BAND_MW4:
142            setup.am_mode3k = 0x00;
143            break;
144          default:
145            break;
146         }
147
148         akc6955_set_amband(setup.amband);
149         freq = setup.amfreq;
150     }
151     akc6955_do_tune();
152     akc6955_set_freq(freq);
153 }
154
155 void menu_poweroff(void)
156 {
157     unsigned char c;
158     c = printhelp_2lines("Poweroff", "A=Yes");
159     if(c == charcode_a) {
160         shutdown(1);
161     }
162 }
163
164 void setup_akc6955(void)
165 {
166     akc6955_writecmd(AKC6955_POWER, 0xc0);  // You musto *not* mute, set b2 to '0".
167     akc6955_writecmd(AKC6955_VOLUME, 0xc0); // You must select to radio(b1 = '0).
168     if(setup.fm == 0) {
169         akc6955_set_amband(setup.amband);
170         if(setup.amband == AKC6955_BAND_AMUSER) call_userband(setup.am_userbandnum);
171         setup.amfreq = setup.amfreq_bank[setup.amband];
172         akc6955_chg_fm(0, setup.amfreq); // Set to AM
173         akc6955_set_freq(setup.amfreq);
174     } else {
175         akc6955_set_fmband(setup.fmband);
176         if(setup.fmband == AKC6955_BAND_FMUSER) call_userband(setup.fm_userbandnum);
177         setup.fmfreq = setup.fmfreq_bank[setup.fmband];
178         akc6955_chg_fm(0xff, setup.fmfreq); // Set to AM
179         akc6955_set_freq(setup.fmfreq);
180     }// Dummy, TBS (954KHz)
181     akc6955_set_power(0xff); // Power ON
182     akc6955_setvolume(36); // Temporally
183     akc6955_set_thresh_fmcnr(setup.threshold_fmcnr);
184     akc6955_set_thresh_amcnr(setup.threshold_amcnr);
185     akc6955_set_thresh_width(setup.threshold_width);
186     akc6955_set_thresh_fmstereo(setup.threshold_fmstereo);
187     akc6955_setvolumemode(0);
188     akc6955_set_lowboost(setup.lowboost);
189     set_stereomode();
190 }
191
192 /*
193  * Main Menu : initial-screen -> 'F'.
194  */
195 void main_menu(void)
196 {
197     unsigned char c;
198     unsigned char d;
199     unsigned int val;
200     unsigned int freq;
201
202     printhelp_2lines("Menu:F=HELP", "B=CANCEL");
203     c = pollkey_single(); // 1012ms
204     switch(c) {
205         case charcode_1:
206             // Band
207             setband_direct();
208             break;
209         case charcode_3:
210             // Band
211             setfreq_direct();
212             break;
213         case charcode_4:
214             on_call_userfreq();
215             break;
216             // Scan
217         case charcode_5:
218             break;
219         case charcode_6:
220             on_set_userfreq();
221             break;
222             // Scan
223         case charcode_7:
224             menu_poweroff();
225             break;
226         case charcode_8:
227             // Set volume
228             set_volume();
229             break;
230         case charcode_9:
231             freq = akc6955_get_freq();
232             akc6955_set_freq(freq);
233             break;
234         case charcode_0:
235             // Setup Menu
236             setup_menu();
237             break;
238         case charcode_a:
239             toggle_amfm();
240             break;
241         case charcode_c:
242             set_userband();
243             break;
244         case charcode_d:
245             input_userband();
246             break;
247         case charcode_f:
248             mainmenu_help();
249             // HELP
250             break;
251         default:
252             break;
253         }
254        _CLS();
255        _LOCATE(0,0);
256 }
257