OSDN Git Service

[UI] Add single keyin and getstr.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 21 Jun 2013 03:44:59 +0000 (12:44 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 21 Jun 2013 03:44:59 +0000 (12:44 +0900)
ioports.c
main.c
ui.c
ui.h

index b38c721..71ac49a 100644 (file)
--- a/ioports.c
+++ b/ioports.c
@@ -257,10 +257,15 @@ void readkey_io(unsigned char state)
                 keyin_now.byte[i] = 0x00;
             }
             latchvar = _KEY_SENDPORT;
-            latchvar &= ~_KEY_GRP1MASK;
+            latchvar |= _KEY_SENDPORTMASK;
             _KEY_SENDPORT = latchvar; // Group1 DOWN.
             break;
         case 1:
+            latchvar = _KEY_SENDPORT;
+            latchvar &= ~_KEY_GRP1MASK;
+            _KEY_SENDPORT = latchvar; // Group1 DOWN.
+            break;
+        case 2:
             portvar = _KEY_RECVPORT;
             if((portvar & _KEY_POS1MASK) == 0) {
                 keyin_now.BIT0A = 1;
@@ -283,15 +288,15 @@ void readkey_io(unsigned char state)
                 keyin_now.BIT3A = 0;
             }
             latchvar = _KEY_SENDPORT;
-            latchvar |= _KEY_GRP1MASK;
+            latchvar |= _KEY_SENDPORTMASK;
             _KEY_SENDPORT = latchvar; // Group1 UP.
             break;
-        case 2:
+        case 3:
             latchvar = _KEY_SENDPORT;
             latchvar &= ~_KEY_GRP2MASK;
             _KEY_SENDPORT = latchvar; // Group2 DOWN.
             break;
-        case 3:
+        case 4:
             portvar = _KEY_RECVPORT;
             if((portvar & _KEY_POS1MASK) == 0) {
                 keyin_now.BIT0B = 1;
@@ -314,15 +319,15 @@ void readkey_io(unsigned char state)
                 keyin_now.BIT3B = 0;
             }
             latchvar = _KEY_SENDPORT;
-            latchvar |= _KEY_GRP2MASK;
+            latchvar |= _KEY_SENDPORTMASK;
             _KEY_SENDPORT = latchvar; // Group1 UP.
             break;
-        case 4:
+        case 5:
             latchvar = _KEY_SENDPORT;
             latchvar &= ~_KEY_GRP3MASK;
             _KEY_SENDPORT = latchvar; // Group2 DOWN.
             break;
-        case 5:
+        case 6:
             portvar = _KEY_RECVPORT;
             if((portvar & _KEY_POS1MASK) == 0) {
                 keyin_now.BIT0C = 1;
@@ -345,15 +350,15 @@ void readkey_io(unsigned char state)
                 keyin_now.BIT3C = 0;
             }
             latchvar = _KEY_SENDPORT;
-            latchvar |= _KEY_GRP3MASK;
+            latchvar |= _KEY_SENDPORTMASK;
             _KEY_SENDPORT = latchvar; // Group1 UP.
             break;
-        case 6:
+        case 7:
             latchvar = _KEY_SENDPORT;
             latchvar &= ~_KEY_GRP4MASK;
             _KEY_SENDPORT = latchvar; // Group2 DOWN.
             break;
-        case 7:
+        case 8:
             portvar = _KEY_RECVPORT;
             if((portvar & _KEY_POS1MASK) == 0) {
                 keyin_now.BIT0D = 1;
@@ -376,7 +381,7 @@ void readkey_io(unsigned char state)
                 keyin_now.BIT3D = 0;
             }
             latchvar = _KEY_SENDPORT;
-            latchvar |= _KEY_GRP4MASK;
+            latchvar |= _KEY_SENDPORTMASK;
             _KEY_SENDPORT = latchvar; // Group4 UP.
 
             break;
diff --git a/main.c b/main.c
index 2dce408..b6f10d9 100644 (file)
--- a/main.c
+++ b/main.c
@@ -737,25 +737,24 @@ void main_menu(void)
 
 void setfreq_updown(unsigned char ctlword)
 {
-#ifndef _LCD_DEBUG
     switch(ctlword){
         case charcode_8: // Change band
             if(fm != 0){
                 amband++;
                 if(amband > 18) amband = 0;
 //                amfreq = akc6955_setfreq(amfreq)
-                akc6955_set_amband(amband);
+//                akc6955_set_amband(amband);
                 _AKC6955_WAIT_62_5MS(); // 62.5ms
-                amband = akc6955_get_amband();
-                amfreq = akc6955_get_freq();
+//                amband = akc6955_get_amband();
+//                amfreq = akc6955_get_freq();
             } else {
                 fmband++;
                 if(fmband > 7) fmband = 0;
 //                amfreq = akc6955_setfreq(amfreq)
-                akc6955_set_fmband(fmband);
+//                akc6955_set_fmband(fmband);
                 _AKC6955_WAIT_62_5MS(); // 62.5ms
-                fmband = akc6955_get_fmband();
-                fmfreq = akc6955_get_freq();
+//                fmband = akc6955_get_fmband();
+//                fmfreq = akc6955_get_freq();
             }
             break;
         case charcode_2: // Change band
@@ -764,61 +763,61 @@ void setfreq_updown(unsigned char ctlword)
                 if(amband == 0) amband = 18;
                 if(amband >= 18) amband = 18;
 //                amfreq = akc6955_setfreq(amfreq)
-                akc6955_set_amband(amband);
+//                akc6955_set_amband(amband);
                 _AKC6955_WAIT_62_5MS(); // 62.5ms
-                amband = akc6955_get_amband();
-                amfreq = akc6955_get_freq();
+//                amband = akc6955_get_amband();
+//                amfreq = akc6955_get_freq();
             } else {
                 fmband--;
                 if(fmband == 0) fmband = 7;
                 if(fmband >= 7) fmband = 7;
 //                amfreq = akc6955_setfreq(amfreq)
-                akc6955_set_fmband(fmband);
+//                akc6955_set_fmband(fmband);
                 _AKC6955_WAIT_62_5MS(); // 62.5ms
-                fmband = akc6955_get_fmband();
-                fmfreq = akc6955_get_freq();
+//                fmband = akc6955_get_fmband();
+//                fmfreq = akc6955_get_freq();
             }
             break;
         case charcode_4: // Down Freq;
             if(fm != 0){
-                fmfreq = akc6955_down_freq(10); // DOWN 100KHz
+  //              fmfreq = akc6955_down_freq(10); // DOWN 100KHz
             } else {
-                amfreq = akc6955_down_freq(10); // DOWN 10KHz
+  //              amfreq = akc6955_down_freq(10); // DOWN 10KHz
             }
             break;
         case charcode_6: // Down Freq;
             if(fm != 0){
-                fmfreq = akc6955_up_freq(10); // UP 100KHz
+    //            fmfreq = akc6955_up_freq(10); // UP 100KHz
             } else {
-                amfreq = akc6955_up_freq(10); // UP 10KHz
+    //            amfreq = akc6955_up_freq(10); // UP 10KHz
             }
             break;
         case charcode_7: // Down Fast;
             if(fm != 0){
-                fmfreq = akc6955_down_freq(50); // DOWN 500KHz
+      //          fmfreq = akc6955_down_freq(50); // DOWN 500KHz
             } else {
-                amfreq = akc6955_down_freq(50); // DOWN 50KHz
+      //          amfreq = akc6955_down_freq(50); // DOWN 50KHz
             }
             break;
         case charcode_9: // Down Fast;
             if(fm != 0){
-                fmfreq = akc6955_up_freq(50); // UP 100KHz
+        //        fmfreq = akc6955_up_freq(50); // UP 100KHz
             } else {
-                amfreq = akc6955_up_freq(50); // UP 10KHz
+        //        amfreq = akc6955_up_freq(50); // UP 10KHz
             }
             break;
         case charcode_1: // Down Slow;
             if(fm != 0){
-                fmfreq = akc6955_down_freq(5); // DOWN 50KHz
+        //        fmfreq = akc6955_down_freq(5); // DOWN 50KHz
             } else {
-                amfreq = akc6955_down_freq(5); // DOWN 50KHz
+          //      amfreq = akc6955_down_freq(5); // DOWN 50KHz
             }
             break;
         case charcode_3: // Down Slow;
             if(fm != 0){
-                fmfreq = akc6955_up_freq(5); // UP 50KHz
+        //        fmfreq = akc6955_up_freq(5); // UP 50KHz
             } else {
-                amfreq = akc6955_up_freq(5); // UP 5KHz
+        //        amfreq = akc6955_up_freq(5); // UP 5KHz
             }
             break;
         case charcode_0: // Step
@@ -828,20 +827,20 @@ void setfreq_updown(unsigned char ctlword)
                 } else {
                     am_mode3k = 0;
                 }
-                amfreq = akc6955_mode3k(am_mode3k);
+          //      amfreq = akc6955_mode3k(am_mode3k);
             }
             break;
         case charcode_a: // Toggle FM
             toggle_amfm();
             break;
         case charcode_b:
-            input_userband();
+            //input_userband();
             break;
         case charcode_c:
-            set_userband();
+            //set_userband();
             break;
         case charcode_d:
-            set_volume();
+            //set_volume();
             break;
         case charcode_e: // Backlight ON/OFF
             if(backlight_counter > 0) {
@@ -851,12 +850,11 @@ void setfreq_updown(unsigned char ctlword)
            }
             break;
         case charcode_f:
-            main_menu();
+            //main_menu();
             break;
         default:
             break;
     }
-#endif
 }
 /*
  * 
@@ -919,7 +917,7 @@ int main(void)
     printstr("Hello;-)");
     lcd_setbacklight(0xff, 100);
 //   PORTD |= _LCDPORT_CONT_RS;
-#if 1
+#if 0
     i = 10001;
     do {
         ClrWdt();
@@ -927,10 +925,11 @@ int main(void)
         set_amlamp(i & 1);
         set_powerlamp(i & 1);
         i = i + 1;
-        c = pollkeys(pollkeybuf, 30); // Poll about 600ms
+//        idle(65536 - 7182/10 + 1);
+        c = pollkeys(pollkeybuf, 60, 1); // Poll about 600ms
         if(c != 0) {
             unsigned char sp;
-            _LOCATE(0,0);
+//            _LOCATE(0,0);
             for(sp = 0; sp < c; sp++) _PUTCHAR(pollkeybuf[sp] + '0');
         } else {
             _CLS();
@@ -949,15 +948,7 @@ int main(void)
             printstr("EEPROM FORMATTING");
             _LOCATE(0,1);
             printstr("Press any key");
-            c = charcode_null;
-            do {
-                c = readkey();
-                idle(ui_idlecount);
-//                _CLS();
-                _LOCATE(0,0);
-                _PUTCHAR(c + '0');
-                ClrWdt();
-            } while(c == charcode_null);
+            c = pollkey_single();
             _CLS();
             _LOCATE(0,0);
             printstr("Formatting...");
@@ -966,20 +957,13 @@ int main(void)
             save_eeprom();
             break;
         case 0x00: // Checksum error
-            idle(0xff80);
+            idle(65535-7128*2+1);
             _CLS();
             _LOCATE(0,0);
             printstr("X-) Sum Error");
             _LOCATE(0,1);
             printstr("Press any key to format");
-            c = charcode_null;
-            do {
-                _CLS();
-                c = readkey();
-                idle(ui_idlecount);
-                _PUTCHAR(c + '0');
-                ClrWdt();
-            } while(c == charcode_null);
+            c = pollkey_single();
             _CLS();
             _LOCATE(0,0);
             printstr("Formatting...");
@@ -1018,9 +1002,9 @@ int main(void)
     printstr("OK");
     do {
         /* Main routine*/
-        c = readkey();
-        if(c != charcode_null){
-            if((c >= charcode_1) && (c <= charcode_0)) {
+        c = pollkeys(pollkeybuf, 60, 1);
+        if(c != 0){
+            if((pollkeybuf[0] >= charcode_1) && (pollkeybuf[0] <= charcode_0)) {
         //            setfreq_updown(readchar);
             } else {
                 // Other is skip
@@ -1031,7 +1015,7 @@ int main(void)
 //     update_status();
         // Putstring to LCD.
 
-//        update_display();
+        update_display();
         if(backlight_counter > 0) {
             backlight_counter--;
             lcd_setbacklight(0xff, backlight_level); // Turn ON
diff --git a/ui.c b/ui.c
index ed8b293..d0ac280 100644 (file)
--- a/ui.c
+++ b/ui.c
@@ -58,6 +58,8 @@ char keyin_nowp;
 char keyin_readp;
 char keyin_counter;
 
+unsigned char cold;
+
 void keyin_init(void)
 {
     char i;
@@ -71,7 +73,7 @@ void keyin_init(void)
     keyin_nowp = 0;
     keyin_readp = 0;
     keyin_counter = 0;
-
+    cold = charcode_null;
 }
 /*
  * Push to keyin fifo; not used atomic-writing.
@@ -80,12 +82,14 @@ void push_keyinfifo(char b) __critical
 {
     if(keyin_counter >= 31) {
         keyin_counter = 31;
-        return;
+        keyin_readp++; // Discard data
+//        return;
+        if((keyin_readp > 31) || (keyin_readp < 0)) keyin_readp = 0;
     }
     keyin_fifo[keyin_nowp] = b;
     keyin_nowp++;
-    if((keyin_nowp > 31) || (keyin_nowp < 0))keyin_nowp = 0;
     keyin_counter++;
+    if((keyin_nowp > 31) || (keyin_nowp < 0))keyin_nowp = 0;
 }
 
 /*
@@ -99,10 +103,9 @@ char pop_keyinfifo(void) __critical
         return charcode_null ;
     }
     c = keyin_fifo[keyin_readp];
-    if(keyin_readp > 31) keyin_readp = 0;
     keyin_readp++;
     keyin_counter--;
-    if(keyin_counter < 0) keyin_counter = 0;
+    if((keyin_readp > 31) || (keyin_readp < 0)) keyin_readp = 0;
     return c;
 }
 
@@ -339,8 +342,8 @@ unsigned char readkey_compare(void)
 unsigned char readkey(void)
 {
     unsigned char i;
-    for(i = 0; i < 8; i++) {
-        idle(0xfffe); // 1.5ms?
+    for(i = 0; i < 9; i++) {
+        idle(0xfffc); // 3ms?
         readkey_io(i);
     }
     readkey_compare();
@@ -354,33 +357,68 @@ unsigned char readkey(void)
  * 1~32 = Received.
  * if((limit * 19.6ms) elapsed), break;
  */
-unsigned char pollkeys(unsigned char *p, unsigned int limit)
+unsigned char pollkeys(unsigned char *p, unsigned int limit, unsigned char repeat)
 {
     unsigned int count = 0;
     unsigned int lifetime = 0;
+    unsigned int penalty = 0;
     unsigned char c;
-    unsigned char cold;
 
     do {
-        idle(65535 - 100 + 1); // 0.78*256 = 78ms.
+        idle(65535 - 20 + 1); // 0.78*20 = 15.6ms.
+//        idle(65535 - 2000 + 1); // 0.78*2000 = 1560ms.
         c = readkey(); // 0.78*2*8 = 11.2ms
+        ClrWdt();
         if(c != charcode_null) {
-            cold = c;
-            p[count++] = c;
-        }
-        do {
-            c = pop_keyinfifo();
-            if(c == charcode_null) break;
-            if(c != cold) {
-                p[count++] = c;
-                cold = c;
+            push_keyinfifo(c);
+            do {
+                c = pop_keyinfifo();
+                if(c == charcode_null) {
+                    break;
+                }
+                if(c != cold) {
+                    p[count++] = c;
+                    cold = c;
+                }
+            } while(count < 32);
+            penalty = 0;
+        } else {
+            penalty++;
+            if((limit > 3) && (penalty > limit / 4)){
+                penalty = 0;
+                cold = charcode_null;
             }
-        } while(count < 32);
+        }
         if(limit != 0) lifetime++;
-        if(lifetime >= limit) break;
+        if(lifetime > limit) break;
     } while(count < 32);
+    if(repeat != 0) cold = charcode_null;
     return count;
 }
+
+unsigned char pollkey_single(void)
+{
+    unsigned int count = 0;
+    unsigned int lifetime = 0;
+    unsigned int penalty = 0;
+    unsigned char c;
+
+    do {
+        idle(65535 - 20 + 1); // 0.78*20 = 15.6ms.
+//        idle(65535 - 2000 + 1); // 0.78*2000 = 1560ms.
+        c = readkey(); // 0.78*2*8 = 11.2ms
+        ClrWdt();
+        if(c != charcode_null) {
+            if(cold != c){
+                cold = c;
+                return c;
+            }
+        }
+        penalty++;
+        if(penalty > 20) cold = charcode_null;
+    } while(1);
+}
+
 /*
  * Notes:
  * Initialize sequence:
diff --git a/ui.h b/ui.h
index 39e0fe8..f0183cd 100644 (file)
--- a/ui.h
+++ b/ui.h
@@ -68,7 +68,8 @@ extern unsigned int read_numeric(unsigned int initial, unsigned char digit,
 extern unsigned int subst_numeric(unsigned int start, unsigned char pos, unsigned char c);
 extern void print_numeric_nosupress(unsigned int data, unsigned char digit);
 extern unsigned char readkey(void);
-extern unsigned char pollkeys(unsigned char *p, unsigned int limit);
+extern unsigned char pollkeys(unsigned char *p, unsigned int limit, unsigned char repeat);
+extern unsigned char pollkey_single(void);
 
 #ifdef __cplusplus
 }