OSDN Git Service

[SCHEMATIC] Add symbol: SA612 , NXP's mixer IC.
[openi2cradio/OpenI2CRadio.git] / ui.c
diff --git a/ui.c b/ui.c
index ed8b293..07dcc0a 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,
@@ -51,6 +52,8 @@ const char charcodemap[] = {charcode_0,
                             charcode_a,
 };
 
+extern unsigned char pollkeybuf[32];
+
 keyin_defs keyin_old[2];
 keyin_defs keyin_now;
 char keyin_fifo[32];
@@ -58,6 +61,60 @@ char keyin_nowp;
 char keyin_readp;
 char keyin_counter;
 
+unsigned char cold;
+
+// LCD Routines
+void _PUTCHAR(unsigned char c)
+{
+    acm1602_putchar(LCD_I2CADDR , c);
+}
+
+void _LOCATE(unsigned char x, unsigned char y)
+{
+    acm1602_locate_16x2(LCD_I2CADDR , x, y);
+}
+
+void _LOCATE_0_0(void)
+{
+    acm1602_locate_16x2(LCD_I2CADDR , 0, 0);
+}
+
+void _LOCATE_0_1(void)
+{
+    acm1602_locate_16x2(LCD_I2CADDR , 0, 1);
+}
+
+void _CLS(void)
+{
+    acm1602_cls(LCD_I2CADDR);
+}
+void _HOME(void)
+{
+    acm1602_home(LCD_I2CADDR);
+}
+
+void _CURSOR_ON(void)
+{
+    acm1602_dispcursor(LCD_I2CADDR, 0xff);
+}
+
+
+void _CURSOR_OFF(void)
+{
+    acm1602_dispcursor(LCD_I2CADDR, 0x00);
+}
+
+void _CURSOR_LEFT(void)
+{
+    acm1602_cursordir(LCD_I2CADDR , 0x00);
+}
+
+void _CURSOR_RIGHT(void)
+{
+    acm1602_cursordir(LCD_I2CADDR , 0xff);
+}
+
+
 void keyin_init(void)
 {
     char i;
@@ -67,31 +124,38 @@ void keyin_init(void)
         keyin_old[1].byte[i] = 0x00;
         keyin_now.byte[i] = 0x00;
     }
-    for(i = 0; i < 16; i++) keyin_fifo[i] = 0x00;
+    for(i = 0; i < 32; i++) keyin_fifo[i] = 0x00;
     keyin_nowp = 0;
     keyin_readp = 0;
     keyin_counter = 0;
-
+    cold = charcode_null;
 }
 /*
  * 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;
-        return;
+        return; // Discard data.
     }
     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;
 }
 
 /*
  * 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) {
@@ -99,206 +163,126 @@ 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;
     return c;
 }
 
-void print_numeric(int i, unsigned char supressf)
-{
-    if((i == 0) && (supressf != 0)){
-        unsigned char c;
-        c = '0';
-        _CURSOR_LEFT();
-        _PUTCHAR(c);
-        _CURSOR_RIGHT();
-    } else {
-        int l;
-        unsigned char supress = 0;
-        if(supressf == 0) supress = 1;
-         _CURSOR_LEFT();
-        if(i < 0){
-            _PUTCHAR('-');
-            i = -i;
-        }
-        l = i / 10000;
-        i = i % 10000;
-        if(l != 0) {
-            _PUTCHAR((l & 0x0f)+ '0');
-            supress = 1;
-        } else if(supress != 0) {
-            _PUTCHAR('0');
-        }
-        l = i / 1000;
-        i = i % 1000;
-        if(supress != 0){
-             _PUTCHAR((l & 0x0f)+ '0');
-        } else if(l != 0){
-             _PUTCHAR((l & 0x0f)+ '0');
-            supress = 1;
-
-        }
-        l = i / 100;
-        i = i % 100;
-        if(supress != 0){
-             _PUTCHAR((l & 0x0f)+ '0');
-        } else if(l != 0){
-             _PUTCHAR((l & 0x0f)+ '0');
-            supress = 1;
-
-        }
-        l = i / 10;
-        i = i % 10;
-        if(supress != 0){
-             _PUTCHAR((l & 0x0f)+ '0');
-        } else if(l != 0){
-             _PUTCHAR((l & 0x0f)+ '0');
-            supress = 1;
-
-        }
-        _PUTCHAR((i & 0x0f) + '0');
-        _CURSOR_RIGHT();
-    }
-
-}
-
-void printstr(char *s)
+void printstr(const char *s)
 {
     int p = 0;
-    _CURSOR_RIGHT();
+//    _CURSOR_RIGHT();
     if(s == NULL) return;
     do {
         if(s[p] == '\0') break;
         _PUTCHAR(s[p]);
         p++;
-    } while(p < 255);
+    } while(p < 32);
 }
 
-void print_numeric_nosupress(unsigned int data, unsigned char digit)
+
+
+static void uint2bcd(unsigned long data, unsigned char *bcd)
 {
-    unsigned int i;
-    int ref = 10;
-    int div = 1;
+    unsigned char i;
+    unsigned char j;
 
-    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--;
+    for(i = 0; i <= 10; i++){
+        bcd[i] = data % 10;
+        data = data / 10;
     }
-    if(digit == 2){
-        i = data / 10;
-        data = data % 10;
-        _PUTCHAR(i + '0');
-        digit--;
-    }
-    if(digit == 1){
-        i = data;
-        _PUTCHAR(i + '0');
-        digit--;
+    bcd[10] = 0;
+}
+
+void print_numeric_nosupress(unsigned long data, unsigned char digit)
+{
+    unsigned char i;
+    unsigned char bcd[11];
+
+    if(digit == 0) return;
+    if(digit > 10) digit = 10;
+    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 char c)
+unsigned long subst_numeric(unsigned long start, unsigned char pos, unsigned char c)
 {
-    unsigned int p = pos;
-    unsigned int val;
-    if(p > 4) p = 4;
-    switch(p){
-        case 0:
-            val = (start / 10) * 10 + c;
-            break;
-        case 1:
-            val = (start / 100) * 100 + start % 10 + c * 10;
-            break;
-        case 2:
-            val = (start / 1000) * 1000 + start % 100 + c * 100;
-            break;
-        case 3:
-            val = (start / 10000) * 10000 + start % 1000 + c * 1000;
-            break;
-        case 4:
-            val = start % 10000 + c * 10000;
-            break;
-        default:
-            val = start;
-            break;
-      }
+    unsigned long val;
+    unsigned char bcd[11];
+    char i;
+    unsigned long fact;
+
+    if(pos > 10) pos = 10;
+    uint2bcd(start, bcd);
+    bcd[pos] = c;
+    
+    fact = 1;
+    val = 0;
+    for(i = 0; i < 11; i++){
+        val = val + (bcd[i] * fact);
+        fact = fact * 10;
+    }
     return val;
 }
 
-unsigned int read_numeric(unsigned int initial, unsigned char digit,
+unsigned long read_numeric(unsigned int initial, unsigned char digit,
         char startx, char starty)
 {
     unsigned char c;
-    unsigned char i;
-    unsigned int val;
-    unsigned char d;
-    unsigned char input_flag;
-
-    d = digit;
-    if(d > 4) d = 4;
-    val = initial;
-    i = 0;
+    unsigned char n;
+    char i;
+    unsigned long val;
+    unsigned long v;
+    char d;
+
+    d = digit - 1;
+    val =(unsigned long) initial;
+    i = d;
     do {
+//        _CURSOR_OFF();
+       ClrWdt();
         _LOCATE(startx, starty);
         print_numeric_nosupress(val, digit);
-        
-        do {
-            input_flag = readkey_compare();
-            idle(0xff80);
-        } while(input_flag == 0);
-        c = pop_keyinfifo();
+       ClrWdt();
+        _LOCATE(startx + d -  i, starty);
+       _CURSOR_ON();
 
+        c = pollkey_single();
         if(c == charcode_0){
             val = subst_numeric(val, i, 0);
-            i++;
+            i--;
         } else if((c >= charcode_1) && (c <= charcode_9)) {
             val = subst_numeric(val, i, c - charcode_1 + 1);
+            i--;
         } else if(c == charcode_f) {
             // Enter
             break;
-        } else if(c == charcode_d) {
+        } else if(c == charcode_a) {
             // Del
-            if(i > 0) {
-                val = (val / 10) * 10;
-                i--;
-            }
+            val = val / 10;
+            i++;
         } else if(c == charcode_b) {
             // cancel
-            val = initial;
-            break;
+           _CURSOR_OFF();
+            return 0xffffffff;
+        }  else if(c == charcode_e) {
+            i++;
+        } else if(c == charcode_d) {
+            i--;
         }
-        print_numeric_nosupress(val, d);
-        idle(0xff00);
-    } while(i <= d);
+       if(i <= 0) i = 0;
+       if(i > d) i = d;
+    } while(1);
+    _CURSOR_OFF();
+    if(val > 0x7fffffff) val = 0x7fffffff;
     return val;
 }
 
-
-
-
-
-
-
 unsigned char readkey_compare(void)
 {
     char b;
@@ -324,9 +308,7 @@ unsigned char readkey_compare(void)
                 keyin_old[0].byte[d] &= ~shift;
                 keyin_old[1].byte[d] &= ~shift;
                 keyin_now.byte[d] &= ~shift;
-                if(e < 16) {
-                    push_keyinfifo(charcodemap[e]);
-                } 
+                push_keyinfifo(charcodemap[e]);
             }
             shift <<= 1;
             e++;
@@ -339,47 +321,108 @@ 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_time_ms(2); // 2ms
         readkey_io(i);
+//        ClrWdt();
     }
     readkey_compare();
     return pop_keyinfifo();
 }
 
-/*
- * Polling key
- * Max = 32bytes;
- * 0 = Timeout
- * 1~32 = Received.
- * if((limit * 19.6ms) elapsed), break;
- */
-unsigned char pollkeys(unsigned char *p, unsigned int limit)
+
+unsigned char pollkey_single(void)
 {
-    unsigned int count = 0;
-    unsigned int lifetime = 0;
+    unsigned int penalty = 0;
     unsigned char c;
-    unsigned char cold;
 
+//    cold = charcode_null;
     do {
-        idle(65535 - 100 + 1); // 0.78*256 = 78ms.
-        c = readkey(); // 0.78*2*8 = 11.2ms
+        idle_time_ms(5); // 5ms.
+        c = readkey(); // 2 * 9 = 18ms
+        ClrWdt();
         if(c != charcode_null) {
-            cold = c;
-            p[count++] = c;
+            if(cold != c){
+                cold = c;
+                return c;
+            }
+            penalty = 0;
+        } else {
+            penalty++;
+            if(penalty > 4) {
+                penalty = 0;
+                cold = charcode_null; // About 100ms
+            }
         }
-        do {
-            c = pop_keyinfifo();
-            if(c == charcode_null) break;
-            if(c != cold) {
-                p[count++] = c;
+    } while(1);
+}
+
+
+unsigned char pollkey_numeric(unsigned char init)
+{
+    unsigned char c;
+    _PUTCHAR('0' + init);
+    c = pollkey_single();
+    if(c == charcode_0) {
+        return 0;
+    } else if((c >= charcode_1) && (c <= charcode_9)){
+        return c;
+    } else {
+        return init;
+    }
+}
+
+unsigned char pollkey_single_timeout(unsigned char limit, unsigned char repeat)
+{
+    unsigned char c;
+    unsigned char 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;
             }
-        } while(count < 32);
-        if(limit != 0) lifetime++;
-        if(lifetime >= limit) break;
+        }  else {
+            penalty++;
+            if(penalty > 4){
+                penalty = 0;
+                cold = charcode_null;
+            }
+        }
     } while(count < 32);
-    return count;
+
+    /*
+     * Set Deadzone.
+     */
+    if(limit != 0) {
+        while(ticks <= limit) {
+            idle_time_ms(5 + 18);
+            ticks++;
+        }
+    }
+    c = pollkeybuf[0];
+    return c;
 }
 /*
  * Notes:
@@ -395,4 +438,4 @@ unsigned char pollkeys(unsigned char *p, unsigned int limit)
  * In application handler:
  * c = pop_keyinfifo();
  * if(c != 0) do(c);
- */
\ No newline at end of file
+ */