#include "ioports.h"
#include "ui.h"
#include "idle.h"
+#include "commondef.h"
const char charcodemap[] = {charcode_0,
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;
/*
* 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) {
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)
{
int p = 0;
} while(p < 255);
}
-void print_numeric_nosupress(unsigned int data, unsigned char digit)
+
+
+void uint2bcd(unsigned long data, unsigned char *bcd)
{
- unsigned int i;
- int ref = 10;
- int div = 1;
+ 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 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, fact2;
- unsigned char bcd[5];
if(pos > 4) pos = 4;
- if((pos == 4) && (c > 6)) return 65535;
- 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;
}
unsigned char c;
unsigned char n;
char i;
- unsigned int val;
- unsigned char d;
- unsigned char input_flag;
+ 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--;
} else if(c == charcode_a) {
// Del
val = val / 10;
- if(i <= d) i++;
+ i++;
} else if(c == charcode_b) {
// cancel
val = initial;
i = d;
-// break;
+ break;
+ } else if(c == charcode_e) {
+ i++;
+ } else if(c == charcode_d) {
+ i--;
}
- } while(i >= 0);
- return val;
+ if(i <= 0) i = 0;
+ if(i > d) i = d;
+ } while(1);
+ _CURSOR_OFF();
+ if(val > 65535) val = 65535;
+ return (unsigned int)val;
}
-
-
-
-
-
-
unsigned char readkey_compare(void)
{
char b;
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++;
{
unsigned char i;
for(i = 0; i < 9; i++) {
- idle(0xfffc); // 3ms?
+ idle_time_ms(2); // 2ms
readkey_io(i);
+// ClrWdt();
}
readkey_compare();
return pop_keyinfifo();
* 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(65535 - 20 + 1); // 0.78*20 = 15.6ms.
-// idle(65535 - 2000 + 1); // 0.78*2000 = 1560ms.
- c = readkey(); // 0.78*2*8 = 11.2ms
+ 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;
}
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(65535 - 20 + 1); // 0.78*20 = 15.6ms.
-// idle(65535 - 2000 + 1); // 0.78*2000 = 1560ms.
- c = readkey(); // 0.78*2*8 = 11.2ms
+ 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: