OSDN Git Service

[UI][v2.0] Add rotary-encoder feature to USER FREQ MENU.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Thu, 24 Oct 2013 10:41:41 +0000 (19:41 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Thu, 24 Oct 2013 10:41:41 +0000 (19:41 +0900)
[RENC] Fix incorrect count of ROTARY ENCODER.

main.c
menu.h
menu_memoryfreq.c
rencoder.c
rencoder.h
ui_updown.c

diff --git a/main.c b/main.c
index e8fc3ad..d505a75 100644 (file)
--- a/main.c
+++ b/main.c
@@ -363,25 +363,9 @@ int main(void)
                rencoder_start();
 #endif
             }
-#ifdef USE_RENCODER
-          if((setup.fm == 0) && (setup.amband == AKC6955_BAND_MW2)) {
-               step = renc_count * 3;
-          } else {
-               step = renc_count;
-          }
-           
-            if(step != 0) {
-                if(renc_dir == RENC_LEFT) {
-                    akc6955_down_freq(step);
-                    rencoder_start();
-                } else if(renc_dir == RENC_RIGHT) {
-                    akc6955_up_freq(step);
-                    rencoder_start();
-                }
-            }
-#endif    
             ClrWdt();
         }
+         dispf = setfreq_renc_updown(dispf);
          update_status();
          dispf = backlight_dec(dispf); 
          if(dispf != 0)  update_display();
diff --git a/menu.h b/menu.h
index f1763f1..d0bc8eb 100644 (file)
--- a/menu.h
+++ b/menu.h
@@ -155,6 +155,7 @@ typedef struct {
      */
     extern void setfreq_updown(unsigned char ctlword);
     extern void setdefault(void);
+    extern unsigned char setfreq_renc_updown(unsigned char dispf);
 
     /*
      * menu_userband.c
index 740d21f..8b2a6fd 100644 (file)
@@ -31,6 +31,7 @@
 #include "commondef.h"
 #include "eeprom.h"
 #include "backlight.h"
+#include "rencoder.h"
 
 void call_freqbank(unsigned int num)
 {
@@ -128,6 +129,41 @@ void on_set_userfreq(void)
 //    save_eeprom();
 }
 
+static void disp_updown_lcd(void)
+{
+      //         _LOCATE(0,0);
+       printstr("CH:");
+       print_numeric_nosupress(setup.memorynum, 3);
+       printstr(" HELP=F");
+       update_status();
+       print_freq(1);
+       _HOME();
+
+}
+
+static unsigned char renc_updown_userfreq(unsigned char dispf)
+{
+    unsigned int count;
+    count = renc_count;
+
+    if((renc_dir == RENC_NONE) || (count == 0)) return dispf;
+    if(renc_dir == RENC_RIGHT) {
+        setup.memorynum += count;
+    } else if(renc_dir == RENC_LEFT) {
+        setup.memorynum = (setup.memorynum +
+                USER_MEMORY_NUM * USER_MEMORY_BANKS) - count;
+    } else {
+        return dispf;
+    }
+    setup.memorynum = setup.memorynum  % (USER_MEMORY_NUM * USER_MEMORY_BANKS);
+    rencoder_start();
+    call_freqbank(setup.memorynum);
+    backlight_reset(charcode_f);
+    dispf = backlight_dec(0x00);
+    disp_updown_lcd();
+    return dispf;
+}
+
 void on_updown_userfreq(void)
 {
     unsigned int _freq;
@@ -136,7 +172,11 @@ void on_updown_userfreq(void)
     unsigned char _userband;
     unsigned char c;
     unsigned char dispf = 0xff;
-
+    unsigned int _ui_idle = setup.ui_idlecount / 23;
+    unsigned char _ui_pad = setup.ui_idlecount % 23;
+    unsigned char changef = 0x00;
+    
+    if(_ui_idle == 0) _ui_idle = 1;
     _fm = setup.fm;
     _freq = setup.amfreq;
     _userband = setup.am_userbandnum;
@@ -149,62 +189,42 @@ void on_updown_userfreq(void)
 
     _CLS();
     do {
+       dispf = renc_updown_userfreq(dispf);
        if(dispf != 0)  {
-   //         _LOCATE(0,0);
-            printstr("CH:");
-            print_numeric_nosupress(setup.memorynum, 3);
-            printstr(" HELP=F");
-            update_status();
-            print_freq(1);
-            _HOME();
+           disp_updown_lcd();
        }
-       c = pollkey_single_timeout(41, 1); // 23*41 = 943ms
+       c = pollkey_single_timeout(_ui_idle, 1); // 23*41 = 943ms
        backlight_reset(c);
        dispf = backlight_dec(dispf);
 
+
        switch(c) {
            case charcode_7: // UP 1CH
                 setup.memorynum++;
-                if(setup.memorynum >= (USER_MEMORY_NUM * USER_MEMORY_BANKS)) setup.memorynum = 0;
-                call_freqbank(setup.memorynum);
+                changef = 0xff;
                 break;
            case charcode_1: // Down 1CH
-               if(setup.memorynum == 0) setup.memorynum = USER_MEMORY_NUM * USER_MEMORY_BANKS;
-               setup.memorynum--;
-               call_freqbank(setup.memorynum);
+                changef = 0xff;
+               setup.memorynum = setup.memorynum + (USER_MEMORY_NUM * USER_MEMORY_BANKS) - 1;
                break;
            case charcode_9: // Up CH FAST
+                changef = 0xff;
                setup.memorynum += 100;
-               if(setup.memorynum > (USER_MEMORY_NUM * USER_MEMORY_BANKS)) {
-                    setup.memorynum = setup.memorynum % 100;
-               }
-               call_freqbank(setup.memorynum);
                break;
            case charcode_3: // Down CH FAST
-               if(setup.memorynum < 100) {
-                    setup.memorynum = (((USER_MEMORY_NUM * USER_MEMORY_BANKS) / 100 - 1) * 100) + (setup.memorynum % 100);
-               } else {
-                    setup.memorynum -= 100;
-               }
-               call_freqbank(setup.memorynum);
+               changef = 0xff;
+               setup.memorynum = setup.memorynum + (USER_MEMORY_NUM * USER_MEMORY_BANKS) - 100;
                break;
            case charcode_8: // Up CH MID
+               changef = 0xff;
                setup.memorynum += USER_MEMORY_NUM;
-               if(setup.memorynum >= (USER_MEMORY_NUM * USER_MEMORY_BANKS)) {
-                    setup.memorynum = setup.memorynum - USER_MEMORY_NUM * USER_MEMORY_BANKS;
-               }
-               call_freqbank(setup.memorynum);
                break;
            case charcode_2: // Down CH MID
-               if(setup.memorynum < USER_MEMORY_NUM) {
-                    setup.memorynum = (USER_MEMORY_NUM * USER_MEMORY_BANKS) - USER_MEMORY_NUM + setup.memorynum;
-               } else {
-                    setup.memorynum -= USER_MEMORY_NUM;
-               }
-               call_freqbank(setup.memorynum);
+               changef = 0xff;
+               setup.memorynum = setup.memorynum + (USER_MEMORY_NUM * USER_MEMORY_BANKS) - USER_MEMORY_NUM;
                break;
             case charcode_5: // Recall
-               call_freqbank(setup.memorynum);
+               changef = 0xff;
                break;
             case charcode_d: // Reset
                if(_fm) { // AM
@@ -232,10 +252,22 @@ void on_updown_userfreq(void)
                _CLS();
                break;
            case charcode_e: // Set Light
+               if(dispf == 0x00){
+                   dispf = 0xff;
+               } else {
+                   dispf = 0x00;
+               }
+               break;
            default:
                break;
            }
-            idle_time_ms(9); // Pad 9ms, 1Loop = 1000ms.
+
+          setup.memorynum = setup.memorynum % (USER_MEMORY_NUM * USER_MEMORY_BANKS);
+           if(changef != 0) {
+                call_freqbank(setup.memorynum);
+           }
+           if(_ui_pad != 0) idle_time_ms(_ui_pad); // Pad 9ms, 1Loop = 1000ms.
+           changef = 0;
     } while(1);
 _l0:
     _CLS();
index d76b972..9a638f1 100644 (file)
  */
 #include "rencoder.h"
 
-unsigned char renc_state_a;
-unsigned char renc_state_b;
+static unsigned char renc_state_a;
+static unsigned char renc_state_b;
 unsigned char renc_dir;
 unsigned int renc_count;
-unsigned int renc_reset_count;
+static unsigned int renc_reset_count;
+//static unsigned char renc_penalty;
 
 void rencoder_init(void)
 {
@@ -39,9 +40,10 @@ void rencoder_init(void)
    RENC_TRIS_B = 1;
    renc_count = 0;
    renc_dir = RENC_NONE;
-   renc_state_a = 0;
-   renc_state_b = 0;
+   renc_state_a = RENC_PH_A;
+   renc_state_b = RENC_PH_B;
    renc_reset_count = 0;
+//   renc_penalty = 0;
 }
 
 
@@ -49,8 +51,8 @@ void rencoder_restart(void)
 {
  //  T1CONbits.TMR1ON = 1;
    T1CON = 0b10110100;// RD16, T1RUN=0, 1/32 fOSC, TNR1CS=0, TMR1ON=0;
-   TMR1H = (65536 - 800) >> 8; // Tick = 4us, Count = 800(3.2ms)
-   TMR1L = (65536 - 800) & 255;
+   TMR1H = (65536 - 600) >> 8; // Tick = 4us, Count = 600(2.4ms)
+   TMR1L = (65536 - 600) & 255;
 //   T1CONbits.TMR1ON = 0;
    PIR1bits.TMR1IF = 0;
    PIE1bits.TMR1IE = 1;
@@ -61,6 +63,7 @@ void rencoder_restart(void)
 void rencoder_start(void)
 {
     rencoder_stop();
+    rencoder_init();
     rencoder_restart();
 }
 
@@ -72,7 +75,7 @@ void rencoder_stop(void)
    PIR1bits.TMR1IF = 0;
    PIE1bits.TMR1IE = 0;
    IPR1bits.TMR1IP = 1;
-   rencoder_init();
+//   rencoder_init();
 }
 
 
@@ -82,6 +85,13 @@ void rencoder_count(void)
    unsigned char pha = RENC_PH_A;
    unsigned char phb = RENC_PH_B;
 
+//   if(renc_penalty != 0){
+//       renc_penalty++;
+//       if(renc_penalty > 1) {
+//           renc_penalty = 0;
+//       }
+//       return;
+//   }
    /*
     * Count sequence description of rotary-encoder:
     * See figure of http://homepage1.nifty.com/rikiya/software/113ROTENC.htm .
@@ -93,9 +103,8 @@ void rencoder_count(void)
            } else {
                dir = RENC_LEFT;
            }
-       }
-    renc_state_a = pha;
-    //renc_state_b = phb;
+        //   renc_penalty++;
+        }
     } else if(phb != renc_state_b){
         if(phb == 1){ // B: RISE UP
             if(pha == 0){ // A: Stable
@@ -103,31 +112,31 @@ void rencoder_count(void)
             } else {
                 dir = RENC_RIGHT;
             }
+      //      renc_penalty++;
         }
-    //renc_state_a = pha;
-    renc_state_b = phb;
-    }
-
-   if(dir != RENC_NONE) {
-      if(dir == renc_dir) {
-        renc_count++;
-      } else {
-        renc_count = 0;
-        renc_dir = dir;
-      }
-     renc_reset_count = 0;
-   } else{
+    }  else {
      renc_reset_count++;
-     if(renc_reset_count >= 1000) { // 3200ms
+     if(renc_reset_count >= 5000) { // 3200ms
        renc_count = 0;
        renc_dir = RENC_NONE;
        renc_state_a = 0;
        renc_state_b = 0;
        renc_reset_count = 0;
+        //renc_penalty = 0;
      }
+     return;
    }
-   
-   
+   renc_state_a = pha;
+   renc_state_b = phb;
+   if(dir == RENC_NONE) return;
+
+   if(dir == renc_dir) {
+     renc_count++;
+   } else {
+     renc_count = 0;
+     renc_dir = dir;
+    }
+   renc_reset_count = 0;
 //   rencoder_up(dir);
 }
 
index 9016c0c..afe7b11 100644 (file)
@@ -44,8 +44,6 @@
 #define RENC_LEFT 0x7f
 #define RENC_RIGHT 0xff
 
-extern unsigned char renc_state_a;
-extern unsigned char renc_state_b;
 extern unsigned char renc_dir;
 extern unsigned int renc_count;
 
index 7efa6f4..eaffc11 100644 (file)
@@ -52,6 +52,7 @@
 #include "power.h"
 #include "adc_int.h"
 #include "backlight.h"
+#include "rencoder.h"
 
 static void setfreq_updown_amsub(void)
 {
@@ -128,6 +129,55 @@ static void setband_updown(unsigned char updown)
     }
 }
 
+unsigned char setfreq_renc_updown(unsigned char dispf)
+{
+    unsigned int freq;
+
+    if(setup.fm != 0) {
+        switch(setup.fm_tunepitch & 3) {
+            case 0:
+                freq = 1; // 25KHz
+                break;
+            case 1:
+                freq = 2; // 50KHz
+                break;
+            case 2:
+                freq = 4; // 100KHz
+                break;
+            default:
+                freq = 8; // 200KHz excepts TV1/TV2.
+                if((setup.fmband == AKC6955_BAND_TV1) || (setup.fmband == AKC6955_BAND_TV2)) {
+                    freq = 4; // 100KHz
+                }
+                break;
+            }
+        freq = freq * renc_count;
+    } else {
+        if(setup.amband == AKC6955_BAND_MW2) {
+            freq = renc_count * 3;
+        } else {
+            freq = renc_count;
+        }
+    }
+
+    if(freq != 0) {  // WORKAROUND: IF STEP=0 then go maximum X-)
+        if(renc_dir == RENC_LEFT) {
+            akc6955_down_freq(freq);
+        } else if(renc_dir == RENC_RIGHT) {
+            akc6955_up_freq(freq);
+        }
+        if(dispf == 0) {
+             acm1602_resume(LCD_I2CADDR);
+             dispf = 0xff;
+        }
+       backlight_reset(charcode_f);
+       update_status();
+       update_display();
+       rencoder_start();
+    }
+    return dispf;
+}
+
 void setfreq_updown(unsigned char ctlword)
 {
     unsigned int freq;