OSDN Git Service

[Schematic][v2.0] For v2.00. Some of circuit is changed(see diff).
[openi2cradio/OpenI2CRadio.git] / ui.c
diff --git a/ui.c b/ui.c
index b61870f..6a3ba64 100644 (file)
--- a/ui.c
+++ b/ui.c
@@ -28,6 +28,7 @@
 #include "ioports.h"
 #include "ui.h"
 #include "idle.h"
+#include "commondef.h"
 
 
 const char charcodemap[] = {charcode_0,
@@ -80,24 +81,29 @@ void keyin_init(void)
 /*
  * Push to keyin fifo; not used atomic-writing.
  */
+#ifdef __SDCC
 void push_keyinfifo(char b) __critical
+#else
+void push_keyinfifo(char b)
+#endif
 {
     if(keyin_counter >= 31) {
-        keyin_counter = 31;
-        keyin_readp++; // Discard data
-//        return;
-        if((keyin_readp > 31) || (keyin_readp < 0)) keyin_readp = 0;
+        return; // Discard data.
     }
     keyin_fifo[keyin_nowp] = b;
     keyin_nowp++;
     keyin_counter++;
-    if((keyin_nowp > 31) || (keyin_nowp < 0))keyin_nowp = 0;
+    if((keyin_nowp > 31) || (keyin_nowp < 0)) keyin_nowp = 0;
 }
 
 /*
  * Pop from keyin fifo; not used atomic-reading.
  */
+#ifdef __SDCC
 char pop_keyinfifo(void) __critical
+#else
+char pop_keyinfifo(void)
+#endif
 {
     char c;
     if(keyin_counter <= 0) {
@@ -123,73 +129,46 @@ void printstr(char *s)
     } while(p < 255);
 }
 
-void print_numeric_nosupress(unsigned int data, unsigned char digit)
+
+
+void uint2bcd(unsigned long data, unsigned char *bcd)
+{
+    unsigned char i;
+    unsigned char j;
+
+    for(i = 0; i < 5; i++){
+        bcd[i] = data % 10;
+        data = data / 10;
+    }
+    bcd[5] = 0;
+}
+
+void print_numeric_nosupress(unsigned long data, unsigned char digit)
 {
-    unsigned int i;
-    int ref = 10;
-    int div = 1;
+    unsigned char i;
+    unsigned char bcd[6];
+
 
     if(digit == 0) return;
     if(digit >= 5) digit = 5;
-    if(digit == 5){
-        i = data / 10000;
-        data = data % 10000;
-        _PUTCHAR(i + '0');
-        digit--;
-    }
-    if(digit == 4){
-        i = data / 1000;
-        data = data % 1000;
-        _PUTCHAR(i + '0');
-        digit--;
-    }
-    if(digit == 3){
-        i = data / 100;
-        data = data % 100;
-        _PUTCHAR(i + '0');
-        digit--;
-    }
-    if(digit == 2){
-        i = data / 10;
-        data = data % 10;
-        _PUTCHAR(i + '0');
-        digit--;
-    }
-    if(digit == 1){
-        i = data;
-        _PUTCHAR(i + '0');
-        digit--;
+    uint2bcd(data, bcd);
+    for(i = digit; i > 0; i--){
+        _PUTCHAR('0' + bcd[i - 1]);
     }
 }
 /*
  * Read Numeric(int)
  */
-unsigned int subst_numeric(unsigned int start, unsigned char pos, unsigned int c)
+unsigned long subst_numeric(unsigned long start, unsigned char pos, unsigned char c)
 {
-    unsigned int val;
+    unsigned long val;
+    unsigned char bcd[6];
     char i;
-    unsigned int fact;
-    unsigned char bcd[5];
 
     if(pos > 4) pos = 4;
-    if((pos == 4) && (c > 6)) return start;
-    val = start;
-    // binary to BCD
-    fact = 10000;
-    for(i = 4; i >= 0; i--){
-        bcd[i] = val / fact;
-        val = val % fact;
-        fact = fact / 10;
-    }
-    // subst
+    uint2bcd(start, bcd);
     bcd[pos] = c;
-    val = 0;
-    for(i = 3; i >= 0; i--){
-        val = val * 10;
-        val = val + bcd[i];
-    }
-    if((bcd[4] == 6) && (val > 5535)) return val;
-    val = val + bcd[4] * 10000;
+    val = bcd[0] + bcd[1] * 10 + bcd[2] * 100 + bcd[3] * 1000 + bcd[4] * 10000;
     return val;
 }
 
@@ -199,21 +178,23 @@ unsigned int read_numeric(unsigned int initial, unsigned char digit,
     unsigned char c;
     unsigned char n;
     char i;
-    unsigned int val;
+    unsigned long val;
+    unsigned long v;
     char d;
 
     d = digit - 1;
-    val = initial;
+    val =(unsigned long) initial;
     i = d;
     do {
+        _CURSOR_OFF();
+       ClrWdt();
         _LOCATE(startx, starty);
         print_numeric_nosupress(val, digit);
-        
-       do {
-           n = pollkeys(pollkeybuf, 60, 0);
-       } while(n == 0);
-       c = pollkeybuf[0];
+       ClrWdt();
+        _LOCATE(startx + d -  i, starty);
+       _CURSOR_ON();
 
+        c = pollkey_single();
         if(c == charcode_0){
             val = subst_numeric(val, i, 0);
             i--;
@@ -240,7 +221,9 @@ unsigned int read_numeric(unsigned int initial, unsigned char digit,
        if(i <= 0) i = 0;
        if(i > d) i = d;
     } while(1);
-    return val;
+    _CURSOR_OFF();
+    if(val > 65535) val = 65535;
+    return (unsigned int)val;
 }
 
 unsigned char readkey_compare(void)
@@ -284,6 +267,7 @@ unsigned char readkey(void)
     for(i = 0; i < 9; i++) {
         idle_time_ms(2); // 2ms
         readkey_io(i);
+//        ClrWdt();
     }
     readkey_compare();
     return pop_keyinfifo();
@@ -294,35 +278,33 @@ unsigned char readkey(void)
  * Max = 32bytes;
  * 0 = Timeout
  * 1~32 = Received.
- * if((limit * 19.6ms) elapsed), break;
+ * if((limit * 23ms) elapsed), break;
  */
 unsigned char pollkeys(unsigned char *p, unsigned int limit, unsigned char repeat)
 {
-    unsigned int count = 0;
+    unsigned char count = 0;
     unsigned int lifetime = 0;
     unsigned int penalty = 0;
     unsigned char c;
+    unsigned char i;
 
     do {
-        idle_time_ms(10); // 0.78*20 = 15.6ms.
-        c = readkey(); //
+        idle_time_ms(5); // 5ms.
+        c = readkey(); //18ms
         ClrWdt();
-        if(c != charcode_null) {
-            push_keyinfifo(c);
-            do {
-                c = pop_keyinfifo();
-                if(c == charcode_null) {
-                    break;
-                }
-                if(c != cold) {
-                    p[count++] = c;
-                    cold = c;
+        if(c != charcode_null){
+            if(cold != c) {
+                p[count++] = c;
+                cold = c;
+                count++;
+                if(repeat == 0) {
+                        break;
                 }
-            } while(count < 32);
-            penalty = 0;
-        } else {
+                penalty = 0;
+            }
+        }  else {
             penalty++;
-            if((limit > 3) && (penalty > limit / 4)){
+            if(penalty > 4){
                 penalty = 0;
                 cold = charcode_null;
             }
@@ -330,32 +312,88 @@ unsigned char pollkeys(unsigned char *p, unsigned int limit, unsigned char repea
         if(limit != 0) lifetime++;
         if(lifetime > limit) break;
     } while(count < 32);
-    if(repeat != 0) cold = charcode_null;
+    p[count] = charcode_null;
     return count;
 }
 
 unsigned char pollkey_single(void)
 {
-    unsigned int count = 0;
-    unsigned int lifetime = 0;
     unsigned int penalty = 0;
     unsigned char c;
 
+//    cold = charcode_null;
     do {
-        idle_time_ms(10); // 0.125 * 4 * 20 = 10ms.
-        c = readkey(); // 2 * 9 = 16ms
+        idle_time_ms(5); // 5ms.
+        c = readkey(); // 2 * 9 = 18ms
         ClrWdt();
         if(c != charcode_null) {
             if(cold != c){
                 cold = c;
                 return c;
             }
+            penalty = 0;
+        } else {
+            penalty++;
+            if(penalty > 4) {
+                penalty = 0;
+                cold = charcode_null; // About 100ms
+            }
         }
-        penalty++;
-        if(penalty > 20) cold = charcode_null;
     } while(1);
 }
 
+unsigned char pollkey_single_timeout(unsigned int limit, unsigned char repeat)
+{
+    unsigned char c;
+    unsigned int ticks = 0;
+    unsigned char penalty = 0;
+    unsigned char count = 0;
+
+
+    cold = charcode_null;
+    pollkeybuf[0] = charcode_null;
+    do {
+        if(limit != 0) {
+            ticks++;
+            if(ticks > limit) {
+                break;
+            }
+        }
+        idle_time_ms(5); // 5ms.
+        c = readkey(); // 2 * 9 = 18ms
+        ClrWdt();
+        ticks++;
+        if(c != charcode_null){
+            if(cold != c) {
+                pollkeybuf[count++] = c;
+                cold = c;
+                count++;
+                if(repeat == 0) {
+                        break;
+                }
+                penalty = 0;
+            }
+        }  else {
+            penalty++;
+            if(penalty > 4){
+                penalty = 0;
+                cold = charcode_null;
+            }
+        }
+    } while(count < 32);
+
+    /*
+     * Set Deadzone.
+     */
+    if(limit == 0) {
+        while(ticks <= limit) {
+            idle_time_ms(5 + 18);
+            ticks++;
+        }
+    }
+    c = pollkeybuf[0];
+    return c;
+}
 /*
  * Notes:
  * Initialize sequence: