OSDN Git Service

[v1.0][Doc] v1.0(.0) Release.
[openi2cradio/OpenI2CRadio.git] / power.c
diff --git a/power.c b/power.c
index 8de0d34..681e0a8 100644 (file)
--- a/power.c
+++ b/power.c
  *  the executable file might be covered by the GNU General Public License.
  */
 
+#include "commondef.h"
 #include "lcd_acm1602.h"
 #include "power.h"
+#include "menu.h"
+#include "backlight.h"
 
 /*
  * Detect reset condition.
 unsigned char chk_reset(void)
 {
 
+#ifdef __SDCC
     union {
-        __RCONbits_t bit;
+        __RCONbits_t b;
         unsigned char byte;
     } rcon;
     union {
-        __STKPTRbits_t bit;
+        __STKPTRbits_t b;
         unsigned char byte;
     } stkptr;
-
+#else
+    union {
+        RCONbits_t b;
+        unsigned char byte;
+    } rcon;
+    union {
+        STKPTRbits_t b;
+        unsigned char byte;
+    } stkptr;
+#endif
     rcon.byte = RCON;
     stkptr.byte = STKPTR;
-    RCON |= 0b01010011; // SBOREN,*RI,*POR,*BOR = '1'.
-    if((rcon.bit.POR ==0) && (rcon.bit.BOR == 0)) {
+    if(rcon.b.POR ==0) {
+        RCONbits.POR = 1;
         return RESET_POR;
     }
 
-    if(rcon.bit.BOR == 0) return RESET_BOR;
-    if(rcon.bit.RI == 0) return RESET_SOFTWARE;
-    if(rcon.bit.TO == 0) return RESET_WDT;
-    if(rcon.bit.PD == 0) return RESET_POWERDOWN;
-    if(stkptr.bit.STKFUL == 1) return RESET_STACK_FULL;
-    if(stkptr.bit.STKFUL == 1) return RESET_STACK_UNDER;
+    if(rcon.b.BOR == 0) {
+        RCONbits.BOR = 1;
+        return RESET_BOR;
+    }
+    if(rcon.b.RI == 0) {
+        RCONbits.RI = 1;
+        return RESET_SOFTWARE;
+    }
+    if(rcon.b.TO == 0) return RESET_WDT;
+    if(rcon.b.PD == 0) return RESET_POWERDOWN;
+    if(stkptr.b.STKOVF) return RESET_STACK_FULL;
+    if(stkptr.b.STKUNF) return RESET_STACK_UNDER;
     return RESET_MCLR;
 }
 
 void power_on_inthook(void)
 {
+
     IOCB = 0x00;
-    IOCB |= 0x10; // IOCB4 ONLY.
-    INTCON &= ~(_RBIF | _RBIE);
-//    INTCON |= _GIE;
-    INTCON |= (_GIE | _PEIE);
+//    IOCBbits.IOCB4 = 1;
+    INTCONbits.RBIE = 0;
+    INTCONbits.GIE = 1;
+    INTCONbits.PEIE = 1;
 }
 
 void power_on(unsigned char f)
 {
     if(f == 0x00){
-        set_examp_mute(1);
-        idle_time_ms(200);
-        set_radiopower(0);
+        set_radiopower(0x00);
+//        idle_time_ms(200);
+        set_examp_mute(0xff);
     } else {
-        set_examp_mute(0);
+        set_examp_mute(0x00);
         idle_time_ms(100);
-        set_radiopower(1);
+        set_radiopower(0xff);
+    }
+}
+
+void rfamp_power(unsigned char b)
+{
+    __bitops_t bx;
+    
+    bx.byte = b;
+    if(bx.b0) {
+        _RFAMP_SEL_B0 = 1;
+    } else {
+        _RFAMP_SEL_B0 = 0;
     }
+    if(bx.b1) {
+        _RFAMP_SEL_B1 = 1;
+    } else {
+        _RFAMP_SEL_B1 = 0;
+    }
+
 }
 
 unsigned char chk_powerbutton(void)
 {
     unsigned char count = 0;
     char i;
-    for(i = 0; i < 16; i++) {  // 2*16=64ms.
-        if(PORTBbits.RB4 == 0) count++;
+
+    TRISBbits.RB4 = 1; // Set Input
+    for(i = 0; i < 24; i++) {  // 2*24=48ms.
+        if(PORTBbits.RB4) count++;
         _POWER_DELAY();
+        ClrWdt();
     }
-    if(count > 12) {
+    if(count <= 12) { // 24ms
         return 0xff; // Pressed
     }
     return 0; // Not pressed
 }
 
-void shutdown(unsigned char save)
+void shutdown(unsigned char save_v)
 {
-    _CLS();
-    _LOCATE(0,0);
-//    printstr("Bye...");
-    idle_time_ms(1500); // 1.5Sec
-    lcd_setbacklight(0, 0);
-    set_powerlamp(0);
-    set_amlamp(0);
-    set_fmlamp(0);
-//              _CLS();
+    rfamp_power(RFAMP_OFF);
+    power_on(0);
     acm1602_suspend(LCD_I2CADDR);
-    power_off(save);
+    lcd_setbacklight(0, 0);
+    power_off(save_v);
 }
 
-void power_off(unsigned char save)
+void power_off(unsigned char save_v)
 {
     unsigned char sts;
-    if(save != 0) save_eeprom();
-    WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
 
+    if(save_v != 0) {
+        save_eeprom();
+//        save_frequencies();
+    }
+    _AM_STATLAMP = 0;
+    _FM_STATLAMP = 0;
+    set_powerlamp(0);
+
+    WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
+    sts = 0;
     do {
-        IOCB = 0x00;
-        IOCB |= 0x10; // IOCB4 ONLY.
+        RCONbits.IPEN = 1;
+        IOCB = 0x10; // IOCB4 ONLY.
         OSCCONbits.IDLEN = 0; // Not Idle.
-        INTCON2 |= _RBIP; // Priority = HIGH;
-        INTCON &= ~(_RBIF | _GIE | _PEIE);
-        INTCON |= _RBIE;
-        power_on(0);
+        INTCON2bits.RBIP = 1; // Priority = HIGH;
+        INTCON = 0b00001000;
+        T0CONbits.TMR0ON = 0;
         Sleep();
         // Wake up
-        if(INTCONbits.RBIF == 1) {
-            sts = chk_powerbutton();
-        } else {
-            sts = 0;
+        if(INTCONbits.RBIF) {
+                INTCONbits.RBIF = 0;
+                idle_init();
+                sts = chk_powerbutton();
+          //      sts = 0xff;
         }
     } while(sts == 0);
-    INTCONbits.RBIF = 0;
+    
     INTCONbits.RBIE = 0;
-
-    INTCON |= (_GIE | _PEIE);
-
+    INTCONbits.RBIF = 0;
     // Button pressed, software reset.
     Reset();
 }
\ No newline at end of file