OSDN Git Service

[Power] More Power save VOLUME/USER-FREQ, backport from unstable.
[openi2cradio/OpenI2CRadio.git] / menu_memoryfreq.c
1 /*
2  * OpenI2CRADIO
3  * Menu sub-routines: Memory Freq.
4  * Copyright (C) 2013-08-14 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 "power.h"
31 #include "commondef.h"
32 #include "eeprom.h"
33 #include "backlight.h"
34
35 void call_freqbank(unsigned int num)
36 {
37     unsigned char _fm;
38     unsigned char _band;
39     unsigned char _userband;
40     unsigned int bank = num;
41     unsigned int n = num;
42
43     if(num >= USER_MEMORY_NUM) return;
44
45
46     _fm = setup.memoryfreqs[n].fm;
47     _userband = setup.memoryfreqs[n].band;
48     _band = _userband & 0x1f;
49     _userband = _userband >> 5;
50     if(_fm) { // AM
51         setup.fmband = _band;
52         setup.fm_userbandnum = _userband;
53     } else {
54         setup.amband = _band;
55         setup.am_userbandnum = _userband;
56     }
57     setup.memorynum = num;
58     akc6955_chg_fm(_fm, setup.memoryfreqs[n].freq);
59 }
60
61
62 void set_freqbank(unsigned int num)
63 {
64     unsigned char _fm;
65     unsigned char _band;
66     unsigned char _userband;
67     unsigned int _freq;
68     unsigned int n = num;
69
70     if(num >= USER_MEMORY_NUM) return;
71
72
73     _fm = setup.fm;
74     _freq = setup.amfreq;
75     _userband = setup.am_userbandnum;
76     _band = setup.amband;
77     if(_fm){
78         _userband = setup.fm_userbandnum;
79         _band = setup.fmband;
80         _freq = setup.fmfreq;
81     }
82     setup.memoryfreqs[n].fm = _fm;
83     setup.memoryfreqs[n].band = (_userband << 5) | (_band & 0x1f);
84     setup.memoryfreqs[n].freq = _freq;
85
86     save_eeprom();
87 }
88
89
90 void on_call_userfreq(void)
91 {
92     unsigned int val = USER_MEMORY_NUM;
93     _CLS();
94     _LOCATE(0,0);
95     printstr("Mem: 00-");
96     print_numeric_nosupress(val - 1, 2);
97     val = read_numeric(val, 2, 4, 1);
98     call_freqbank(val);
99 }
100
101 void on_set_userfreq(void)
102 {
103     unsigned int val = USER_MEMORY_NUM;
104     unsigned char n;
105     unsigned char c;
106     _CLS();
107     _LOCATE(0,0);
108     printstr("Set Mem: 00-");
109     print_numeric_nosupress(val - 1, 2);
110     val = read_numeric(val, 2, 4, 1);
111     _HOME();
112     printstr("OK? A=OK       ");
113     c = pollkey_single();
114     if(c != charcode_a) return;
115     set_freqbank(val);
116 }
117
118 void on_updown_userfreq(void)
119 {
120     unsigned int _freq;
121     unsigned char _fm;
122     unsigned char _band;
123     unsigned char _userband;
124     unsigned char dispf = 0xff;
125     unsigned char c;
126
127     _fm = setup.fm;
128     _freq = setup.amfreq;
129     _userband = setup.am_userbandnum;
130     _band = setup.amband;
131     if(_fm){
132         _userband = setup.fm_userbandnum;
133         _band = setup.fmband;
134         _freq = setup.fmfreq;
135     }
136
137     _CLS();
138     do {
139         if(dispf != 0) {
140             _LOCATE(0,0);
141             printstr("CH:");
142             print_numeric_nosupress(setup.memorynum, 2);
143             printstr(" 7/1/A/D");
144             update_status();
145             print_freq(1);
146             _HOME();
147         }
148         c = pollkey_single_timeout(41, 1); // About 1s
149         backlight_reset(c);
150         dispf = backlight_dec(dispf);
151        switch(c) {
152            case charcode_7: // UP 1CH
153                 setup.memorynum++;
154                 if(setup.memorynum >= USER_MEMORY_NUM) setup.memorynum = 0;
155                 call_freqbank(setup.memorynum);
156                 break;
157            case charcode_1: // Down 1CH
158                if(setup.memorynum == 0) setup.memorynum = USER_MEMORY_NUM;
159                setup.memorynum--;
160                call_freqbank(setup.memorynum);
161                break;
162             case charcode_5: // Recall
163                call_freqbank(setup.memorynum);
164                break;
165             case charcode_d: // Reset
166                if(_fm) { // AM
167                     setup.fmband = _band;
168                     setup.fm_userbandnum = _userband;
169                     setup.fmfreq = _freq;
170                } else {
171                     setup.amband = _band;
172                     setup.am_userbandnum = _userband;
173                     setup.amfreq = _freq;
174                }
175                akc6955_chg_fm(_fm, _freq);
176                break;
177            case charcode_4:
178                on_call_userfreq();
179                break;
180            case charcode_6:
181                on_set_userfreq();
182                break;
183            case charcode_a:
184                 goto _l0;
185                 break;
186            default:
187                break;
188            }
189        idle_time_ms(9);
190     } while(1);
191 _l0:
192     _CLS();
193
194 }