OSDN Git Service

[v1.0][Doc] v1.0(.0) Release.
[openi2cradio/OpenI2CRadio.git] / power.c
diff --git a/power.c b/power.c
index b0a69e0..681e0a8 100644 (file)
--- a/power.c
+++ b/power.c
@@ -29,6 +29,8 @@
 #include "commondef.h"
 #include "lcd_acm1602.h"
 #include "power.h"
+#include "menu.h"
+#include "backlight.h"
 
 /*
  * Detect reset condition.
@@ -57,17 +59,23 @@ unsigned char chk_reset(void)
 #endif
     rcon.byte = RCON;
     stkptr.byte = STKPTR;
-    RCON |= 0b01010011; // SBOREN,*RI,*POR,*BOR = '1'.
-    if((rcon.b.POR ==0) && (rcon.b.BOR == 0)) {
+    if(rcon.b.POR ==0) {
+        RCONbits.POR = 1;
         return RESET_POR;
     }
 
-    if(rcon.b.BOR == 0) return RESET_BOR;
-    if(rcon.b.RI == 0) return RESET_SOFTWARE;
+    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.STKFUL == 1) return RESET_STACK_FULL;
-    if(stkptr.b.STKFUL == 1) return RESET_STACK_UNDER;
+    if(stkptr.b.STKOVF) return RESET_STACK_FULL;
+    if(stkptr.b.STKUNF) return RESET_STACK_UNDER;
     return RESET_MCLR;
 }
 
@@ -75,40 +83,29 @@ void power_on_inthook(void)
 {
 
     IOCB = 0x00;
-    IOCB |= 0x10; // IOCB4 ONLY.
-#ifdef __SDCC
-//    INTCON &= ~(_RBIF | _RBIE);
-//    INTCON |= _GIE;
-//    INTCON |= (_GIE | _PEIE);
+//    IOCBbits.IOCB4 = 1;
     INTCONbits.RBIE = 0;
-    INTCONbits.RBIF = 0;
     INTCONbits.GIE = 1;
     INTCONbits.PEIE = 1;
-
-#else
-    INTCON &= ~(_INTCON_RBIF_MASK | _INTCON_RBIE_MASK);
-//    INTCON |= _GIE;
-    INTCON |= (_INTCON_GIE_MASK | _INTCON_PEIE_MASK);
-#endif
 }
 
 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;
@@ -127,62 +124,61 @@ unsigned char chk_powerbutton(void)
 {
     unsigned char count = 0;
     char i;
-    for(i = 0; i < 24; i++) {  // 10*32=320ms.
-        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 > 15) {
+    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);
-    _AM_STATLAMP = 0;
-    _FM_STATLAMP = 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.
         INTCON2bits.RBIP = 1; // Priority = HIGH;
-        INTCONbits.RBIF = 0;
-        INTCONbits.GIE = 0;
-        INTCONbits.PEIE = 0;
-        INTCONbits.RBIE = 1;
-        power_on(0);
+        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;
-
-    INTCONbits.GIE = 1;
-    INTCONbits.PEIE = 1;
-
+    INTCONbits.RBIF = 0;
     // Button pressed, software reset.
     Reset();
 }
\ No newline at end of file