OSDN Git Service

[Schematic] Add another type: Using plain AKC6955.
[openi2cradio/OpenI2CRadio.git] / main.c
diff --git a/main.c b/main.c
index af5cd39..f1c2ab6 100644 (file)
--- a/main.c
+++ b/main.c
 #include "menu.h"
 #include "power.h"
 #include "adc_int.h"
+#include "i2c_eeprom.h"
+#include "backlight.h"
+#include "rencoder.h"
+#include "euart.h"
+#include "uart_termio.h"
+#include "shell_strutl.h"
+#include "term_shell.h"
 
 /*
  * Config words.
 #pragma config EBTR0=OFF,EBTR1=OFF,EBTRB=OFF
 #endif
 // For 4xK20 or 2xK20 Series
-#if defined(__SDCC)
 #if defined(pic18f43k20) || defined(pic18f44k20) || defined(pic18f45k20) || defined(pic18f46k20) || \
-    defined(pic18f23k20) || defined(pic18f24k20) || defined(pic18f25k20) || defined(pic18f26k20)
+    defined(pic18f23k20) || defined(pic18f24k20) || defined(pic18f25k20) || defined(pic18f26k20) || \
+    defined(_18F43K20)  || defined(_18F44K20)  || defined(_18F45K20)  || defined(_18F46K20)  || \
+    defined(_18F23K20)  || defined(_18F24K20)  || defined(_18F25K20)  || defined(_18F26K20) 
 
+#ifdef __SDCC
 #pragma stack 0x200 256
+#endif
+
 #pragma config FOSC=HS,FCMEN=ON,PWRT=ON,BOREN=NOSLP,BORV=27, \
                WDTEN=ON,WDTPS=32768,PBADEN=OFF,HFOFST=OFF,LPT1OSC=OFF, \
-               MCLRE=ON,STVREN=ON,DEBUG=ON, \
+               MCLRE=ON,STVREN=ON,DEBUG=ON,LVP=OFF, \
                XINST=OFF
-//#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF
-//#pragma config CPB=OFF,CPD=OFF
-//#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF
-//#pragma config WRTC=OFF,WRTB=OFF,WRTD=OFF
-//#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF
 #endif
-#elif defined(__XC8)
 
-#endif
+
 /*
  * Statuses
   */
@@ -94,10 +99,10 @@ unsigned char cnrlevel;
 int diffstat;
 unsigned int batlevel_6955;
 unsigned int battlevel;
+unsigned char ui_idlekey;
+unsigned char ui_idlepad;
 
 int recv_signal;
-int backlight_counter;
-unsigned char backlight_level;
 unsigned char pollkeybuf[33];
 
 //#define _LCD_DEBUG 1
@@ -112,7 +117,7 @@ SIGHANDLER(TMR0_handler)
    T0CONbits.TMR0ON = 0;
 
    // Clear interrupt flag
-   INTCONbits.TMR0IF = 0;
+//   INTCONbits.TMR0IF = 0;
    INTCONbits.TMR0IE = 0;;
 
    return;
@@ -121,14 +126,24 @@ SIGHANDLER(TMR0_handler)
  * Interrupt wake up every 1ms.
  */
 #ifdef __XC
+void TMR1_Handler(void)
+#else
+SIGHANDLER(TMR1_Handler)
+#endif
+{
+//    rencoder_count();
+        rencoder_tmrhook();
+}
+
+#ifdef __XC
 void TMR3_Handler(void)
 #else
 SIGHANDLER(TMR3_Handler)
 #endif
 {
-    PIR2bits.TMR3IF  = 0;
-    PIE2bits.TMR3IE  = 0;
-    T3CONbits.TMR3ON = 0;
+   PIR2bits.TMR3IF = 0;
+   PIE2bits.TMR3IE = 0;
+   IPR2bits.TMR3IP = 0;
 }
 
 #ifdef __XC
@@ -151,13 +166,14 @@ void RBIF_handler(void)
 SIGHANDLER(RBIF_handler)
 #endif
 {
-    power_on_inthook();
-//    if(chk_powerbutton(0, 0) != 0) { // If pressed on
-//      power_off(1); //
-//    }
+    if(IOCBbits.IOCB4 != 0) {
+        power_on_inthook();
+    } else {
+        rencoder_inthook();
+    }
 }
 #ifdef __XC
-void EEPROM_handler(void)
+void  EEPROM_handler(void)
 #else
 SIGHANDLER(EEPROM_handler)
 #endif
@@ -180,6 +196,7 @@ SIGHANDLER(INADC_handler)
 //    if(a != 0xffff) {
 //        battlevel = adc_rawtobatt(a);
 //    }
+    PIR1bits.ADIF = 0;
 }
 #ifdef __XC
 void I2C_handler(void)
@@ -198,41 +215,58 @@ SIGHANDLER(I2CBus_handler)
     PIR2bits.BCLIF = 0;
 }
 
+#ifdef __XC
+void UART_R_Handler(void)
+#else
+SIGHANDLER(UART_R_Handler)
+#endif
+{
+    uart_inthdr_rx();
+}
 
 
 #ifdef __SDCC
 DEF_INTLOW(intlow_handler)
   DEF_HANDLER(SIG_TMR0, TMR0_handler)
   DEF_HANDLER(SIG_INT0, EXINT_Handler)
-//  DEF_HANDLER(SIG_TMR3, I2C_handler)
+//  DEF_HANDLER(SIG_TMR3, TMR3_Handler)
 END_DEF
 
 DEF_INTHIGH(inthigh_handler)
-  DEF_HANDLER(SIG_RBIF, RBIF_handler)
-  DEF_HANDLER(SIG_EEIF, EEPROM_handler)
-  DEF_HANDLER(SIG_TMR3, TMR3_Handler)
-  DEF_HANDLER(SIG_TMR0, TMR0_handler)
-  DEF_HANDLER(SIG_INT1, EXINT_Handler)
-  DEF_HANDLER(SIG_INT2, EXINT_Handler)
-  DEF_HANDLER(SIG_AD, INADC_handler)
+ DEF_HANDLER(SIG_RBIF, RBIF_handler)
+ DEF_HANDLER(SIG_RCIF, UART_R_handler)
+// DEF_HANDLER(SIG_TMR1, TMR1_Handler)
+// DEF_HANDLER(SIG_INT1, EXINT_Handler)
+ DEF_HANDLER(SIG_INT2, EXINT_Handler)
+ DEF_HANDLER(SIG_AD, INADC_handler)
   //DEF_HANDLER(SIG_SSP, I2C_handler)
   //DEF_HANDLER(SIG_BCOL, I2CBus_handler)
 END_DEF
 #else
-void interrupt low_priority isr(void)
+void interrupt low_priority intlow_handler(void)
 {
-  if(INTCONbits.T0IF)  TMR0_handler();
-  if(INTCONbits.INT0F) EXINT_Handler();
+    if(INTCONbits.TMR0IF) TMR0_handler();
+    if(INTCONbits.INT0IF) EXINT_Handler();
+//    if(PIR1bits.TMR1IF) TMR1_Handler();
 }
-void interrupt isr_high(void)
+
+void interrupt high_priority inthigh_handler(void)
 {
-    if(INTCONbits.RBIF)   RBIF_handler();
-    if(PIR2bits.EEIF)     EEPROM_handler();
-    if(PIR2bits.TMR3IF)   TMR3_Handler();
-    if(INTCONbits.TMR0IF) TMR0_handler();
-    if(INTCON3bits.INT1F || INTCON3bits.INT2IF) EXINT_Handler();
+    if(INTCONbits.RBIF) RBIF_handler();
+    if(PIR1bits.TMR1IF) TMR1_Handler();
+    if(PIR1bits.RC1IF)   UART_R_Handler();
+//    if(PIR2bits.TMR3IF) TMR3_Handler();
+//    if(INTCON3bits.INT1IF) EXINT_Handler();
+//    if(INTCON3bits.INT2IF) EXINT_Handler();
     if(PIR1bits.ADIF) INADC_handler();
+
+//    if(PIR1bits.SSPIF)    I2C_handler();
 }
+
+#ifdef __XC
+
+
+#endif
 #endif
 
 
@@ -244,111 +278,104 @@ void lowbatt(void)
     shutdown(1);
 }
 
+
 int main(void)
 {
     unsigned char c;
-    unsigned int sum = 0;
     unsigned char pbutton;
     unsigned char reset_status;
     unsigned char p;
-    
-#ifdef __SDCC
+    unsigned char lvcount = 0;
+    unsigned char dispf = 0xff;
+    unsigned char i;
+    unsigned int step;
+
     OSCCON =  (0x80 & 0b11111100) | 0b00111000;
 //    OSCCON =  (0x80 & 0b11111100) | 0b00110010; // 8MHz 
-#else
-    OSCCON = (_OSCCON_IDLEN_MASK & 0b11111100 ) | 0b00111000;
-#endif
     idle_init();
     keyin_init();
     keyin_ioinit();
-
-    WDTCONbits.SWDTEN = 0; // WDT OFF.
+    i2c1_init();
     reset_status = chk_reset();
     idle_time_ms(300); // Wait for setup.
-#if 1
+    WDTCONbits.SWDTEN = 0; // WDT OFF.
     switch(reset_status){
         case RESET_MCLR:
-            power_off(0); // When press reset, state to power_off.
-            break;
-        case RESET_WDT:  // Workaround random reset.
-            power_off(0);
-            break;
         case RESET_BOR:
-            power_off(0); // Save and halt on BOR.
+            shutdown(0); // Save and halt on BOR.
             break;
         case RESET_SOFTWARE: //
-//            do {
-//                pbutton = chk_powerbutton();
-//                ClrWdt();
- //               if(pbutton == 0) power_off(0); // Button not pressed.
-//            } while(pbutton == 0);
+            RCONbits.RI = 0;
+           pbutton = chk_powerbutton();
+            if(pbutton == 0) shutdown(0); // Not-Pressed power-button -> shutdown( not save).
+            break;
+        case RESET_POR:
+        case RESET_WDT:  // Workaround random reset.
+ //           shutdown(0);
             break;
         default:
             break;
     }
-#endif
     WDTCONbits.SWDTEN = 1; // WDT ON.
-    i2c1_init();
     power_on(1);
-    intadc_init();
-    set_powerlamp(1);
-    idle_time_ms(125);
+    //intadc_init();
     valinit();
-
-    acm1602_init(0xa0, 1); //Init LCD
-    idle_time_ms(125);
-    _LOCATE(0,0);  // It's BAD-KNOWHOW, but needs AKIZUKI'S LCD :(
-    _PUTCHAR(' '); //
-    _LOCATE(0,1);
-    printstr("Hello;-)");
+    acm1602_init(LCD_I2CADDR, 1); //Init LCD
     lcd_setbacklight(0xff, 255);
-    idle_time_ms(1000);
-    check_eeprom();
-    // Init AKC6955
     /* Check EEPROM */
-    /* Push default parameters to AKC6955*/
+    check_eeprom();
+  /* Push default parameters to AKC6955*/
     setup_akc6955();
     _CLS();
-    _LOCATE(0,0);
+    uart_init();
+    //_LOCATE(0,0);
     _PUTCHAR(' ');
- //   batlevel_6955 = 330;
-   update_status();
-   update_display();
+    update_status();
+    update_display();
     ClrWdt();
-//    _LOCATE(0,0);
-//    printstr("OK");
-   lcd_setbacklight(0xff, 255);
-    do {
-//        set_powerlamp(0);
-            if(battlevel <= 340) { // 3.4V
-               lowbatt();
+   ui_idlekey = setup.ui_idlecount / 92;
+   ui_idlepad = setup.ui_idlecount % 23;
+   rencoder_init();
+   rencoder_start();
+   do {
+
+        if(battlevel < 340) { // 3.4V
+                lvcount++;
+                if(lvcount > 4) {
+                    if(dispf == 0) {
+                        acm1602_resume(LCD_I2CADDR);
+                        dispf = 0xff;
+                     }
+                    lowbatt(); //Zap 4Times on LowVoltage.
+                }
+            } else {
+                lvcount = 0;
             }
         /* Main routine*/
-       c = pollkeys(pollkeybuf, 10, 1); // 23*10=230ms
-       p = 0;
-       while(c > 0) {
-           ClrWdt();
-           setfreq_updown(pollkeybuf[p]);
-           c--;
-           p++;
-       }
-//       set_powerlamp(1);
-//       idle_time_ms(ui_idlecount);
-        // Putstring to LCD.
-        _LOCATE(0,0);
-        pbutton = chk_powerbutton();
-        if(pbutton != 0) shutdown(1); // Button pressed.
-
-        if(backlight_counter > 0) {
-            backlight_counter--;
-            lcd_setbacklight(0xff, backlight_level); // Turn ON
-        } else {
-            lcd_setbacklight(0x00, 0); // Turn OFF
-       }
-        update_status();
-//        ClrWdt();
-        update_display();
-        ClrWdt();
+
+        term_shell(0); // Steel Shell
+       for(i = 0; i < 4; i++) {
+           c = pollkey_single_timeout(ui_idlekey, 1); // 23*41 = 943ms
+           p = 0;
+            if(c != charcode_null) {
+                ClrWdt();
+                if(dispf == 0) {
+                    acm1602_resume(LCD_I2CADDR);
+                    dispf = 0xff;
+                }
+               setfreq_updown(c);
+               update_status();
+                update_display();
+               rencoder_start();
+            }
+            ClrWdt();
+        }
+         dispf = setfreq_renc_updown(dispf);
+         update_status();
+         dispf = backlight_dec(dispf); 
+         if(dispf != 0)  update_display();
+         if(ui_idlepad != 0) idle_time_ms(ui_idlepad);
+         ClrWdt();
     } while(1);
 }