OSDN Git Service

[v1.0][Doc] v1.0(.0) Release.
[openi2cradio/OpenI2CRadio.git] / power.c
diff --git a/power.c b/power.c
index 7294d69..681e0a8 100644 (file)
--- a/power.c
+++ b/power.c
@@ -30,6 +30,7 @@
 #include "lcd_acm1602.h"
 #include "power.h"
 #include "menu.h"
+#include "backlight.h"
 
 /*
  * Detect reset condition.
@@ -58,13 +59,19 @@ 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.STKOVF) return RESET_STACK_FULL;
@@ -78,7 +85,6 @@ void power_on_inthook(void)
     IOCB = 0x00;
 //    IOCBbits.IOCB4 = 1;
     INTCONbits.RBIE = 0;
-    INTCONbits.RBIF = 0;
     INTCONbits.GIE = 1;
     INTCONbits.PEIE = 1;
 }
@@ -86,13 +92,13 @@ void power_on_inthook(void)
 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);
     }
 }
 
@@ -118,67 +124,61 @@ unsigned char chk_powerbutton(void)
 {
     unsigned char count = 0;
     char i;
-    for(i = 0; i < 24; i++) {  // 10*24=240ms.
+
+    TRISBbits.RB4 = 1; // Set Input
+    for(i = 0; i < 24; i++) {  // 2*24=48ms.
         if(PORTBbits.RB4) count++;
         _POWER_DELAY();
         ClrWdt();
     }
-    if(count <= 12) { // 120ms
+    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
     rfamp_power(RFAMP_OFF);
-//    _CLS();
+    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();
-
-    lcd_setbacklight(0, 0);
-    set_powerlamp(0);
+    if(save_v != 0) {
+        save_eeprom();
+//        save_frequencies();
+    }
     _AM_STATLAMP = 0;
     _FM_STATLAMP = 0;
-    power_on(0);
+    set_powerlamp(0);
 
     WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
     sts = 0;
     do {
-        IOCB = 0x00;
-        IOCBbits.IOCB4 = 1; // 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;
+        INTCON = 0b00001000;
+        T0CONbits.TMR0ON = 0;
         Sleep();
         // Wake up
         if(INTCONbits.RBIF) {
+                INTCONbits.RBIF = 0;
+                idle_init();
                 sts = chk_powerbutton();
+          //      sts = 0xff;
         }
     } while(sts == 0);
     
-    INTCONbits.RBIF = 0;
     INTCONbits.RBIE = 0;
-    OSCCONbits.IDLEN = 1; // Not Idle.
-
-    INTCONbits.GIE = 1;
-    INTCONbits.PEIE = 1;
-    WDTCONbits.SWDTEN = 1; //WDT ON.
-
+    INTCONbits.RBIF = 0;
     // Button pressed, software reset.
     Reset();
 }
\ No newline at end of file