OSDN Git Service

[Doc] GITLOG to v1.0beta1.1.
[openi2cradio/OpenI2CRadio.git] / power.c
1 /*
2  * OpenI2CRADIO
3  * Power switch.
4  * Copyright (C) 2013-06-10 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 "commondef.h"
30 #include "lcd_acm1602.h"
31 #include "power.h"
32 #include "menu.h"
33
34 /*
35  * Detect reset condition.
36  */
37 unsigned char chk_reset(void)
38 {
39
40 #ifdef __SDCC
41     union {
42         __RCONbits_t b;
43         unsigned char byte;
44     } rcon;
45     union {
46         __STKPTRbits_t b;
47         unsigned char byte;
48     } stkptr;
49 #else
50     union {
51         RCONbits_t b;
52         unsigned char byte;
53     } rcon;
54     union {
55         STKPTRbits_t b;
56         unsigned char byte;
57     } stkptr;
58 #endif
59     rcon.byte = RCON;
60     stkptr.byte = STKPTR;
61     if(rcon.b.POR ==0) {
62         RCONbits.POR = 1;
63         return RESET_POR;
64     }
65
66     if(rcon.b.BOR == 0) {
67         RCONbits.BOR = 1;
68         return RESET_BOR;
69     }
70     if(rcon.b.RI == 0) {
71         RCONbits.RI = 1;
72         return RESET_SOFTWARE;
73     }
74     if(rcon.b.TO == 0) return RESET_WDT;
75     if(rcon.b.PD == 0) return RESET_POWERDOWN;
76     if(stkptr.b.STKOVF) return RESET_STACK_FULL;
77     if(stkptr.b.STKUNF) return RESET_STACK_UNDER;
78     return RESET_MCLR;
79 }
80
81 void power_on_inthook(void)
82 {
83
84     IOCB = 0x00;
85 //    IOCBbits.IOCB4 = 1;
86     INTCONbits.RBIE = 0;
87     INTCONbits.GIE = 1;
88     INTCONbits.PEIE = 1;
89 }
90
91 void power_on(unsigned char f)
92 {
93     if(f == 0x00){
94         set_examp_mute(0xff);
95         idle_time_ms(200);
96         set_radiopower(0x00);
97     } else {
98         set_examp_mute(0x00);
99         idle_time_ms(100);
100         set_radiopower(0xff);
101     }
102 }
103
104 void rfamp_power(unsigned char b)
105 {
106     __bitops_t bx;
107     
108     bx.byte = b;
109     if(bx.b0) {
110         _RFAMP_SEL_B0 = 1;
111     } else {
112         _RFAMP_SEL_B0 = 0;
113     }
114     if(bx.b1) {
115         _RFAMP_SEL_B1 = 1;
116     } else {
117         _RFAMP_SEL_B1 = 0;
118     }
119
120 }
121
122 unsigned char chk_powerbutton(void)
123 {
124     unsigned char count = 0;
125     char i;
126
127     TRISBbits.RB4 = 1; // Set Input
128     for(i = 0; i < 24; i++) {  // 2*24=48ms.
129         if(PORTBbits.RB4) count++;
130         _POWER_DELAY();
131         ClrWdt();
132     }
133     if(count <= 12) { // 24ms
134         return 0xff; // Pressed
135     }
136     return 0; // Not pressed
137 }
138
139 void shutdown(unsigned char save)
140 {
141     rfamp_power(RFAMP_OFF);
142     acm1602_suspend(LCD_I2CADDR);
143     power_off(save);
144 }
145
146 void power_off(unsigned char save)
147 {
148     unsigned char sts;
149
150     if(save != 0) save_eeprom();
151
152     lcd_setbacklight(0, 0);
153     set_powerlamp(0);
154     _AM_STATLAMP = 0;
155     _FM_STATLAMP = 0;
156     power_on(0);
157
158     WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
159     sts = 0;
160     do {
161         RCONbits.IPEN = 1;
162         IOCB = 0x10; // IOCB4 ONLY.
163         OSCCONbits.IDLEN = 0; // Not Idle.
164         INTCON2bits.RBIP = 1; // Priority = HIGH;
165         INTCON = 0b0000100;
166         T0CONbits.TMR0ON = 0;
167         Sleep();
168         // Wake up
169         if(INTCONbits.RBIF) {
170                 INTCONbits.RBIF = 0;
171                 idle_init();
172                 sts = chk_powerbutton();
173           //      sts = 0xff;
174         }
175     } while(sts == 0);
176     
177     INTCONbits.RBIE = 0;
178     INTCONbits.RBIF = 0;
179     // Button pressed, software reset.
180     Reset();
181 }