OSDN Git Service

[SCHEMATIC] Modify SW/MW/LW Preamp, insert galbanic-isolator replace of common-mode...
[openi2cradio/OpenI2CRadio.git] / uart_termio.c
index fce6877..5e70e25 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * OpenI2CRADIO
  * EUSART Handler
- * Copyright (C) 2013-06-20 K.Ohta <whatisthis.sowhat ai gmail.com>
+ * Copyright (C) 2013-11-07 K.Ohta <whatisthis.sowhat ai gmail.com>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 #include "ioports.h"
 #include "euart.h"
 #include "menu.h"
-
-#define TERM_NONSREC -1
-#define TERM_STRERR -2
-#define TERM_SUMERR -3
+#include "uart_termio.h"
+#include "shell_strutl.h"
+#include "power.h"
 
 unsigned char uart_term_putstr(unsigned char *s)
 {
@@ -50,294 +49,63 @@ unsigned char uart_term_putstr(unsigned char *s)
     if((uart_getstat() & UART_WAKEUP) == 0) return 0; // Error
     while(s[p] != 0x00)
     {
-        uart_pushchar(s[p], 0x0000);
+        uart_pushchar(s[p], 200); // Timeout = 10ms
         p++;
         if(p >= 255) return 0; // Overlen
     }
     return 0xff;
 }
 
-void uart_term_getstr(unsigned char *s, unsigned char maxlen, unsigned char echo)
+void uart_term_getstr(unsigned char *s, unsigned int timeout, unsigned char echo)
 {
     unsigned int i = 0;
     unsigned char c = 0x00;
-    while(c != '\n'){
+    unsigned int tim;
+    unsigned char pwr;
+    unsigned char cnt;
+    tim = 0;
+    cnt = 0;
+    while(1){
+        ClrWdt();
         c = uart_pullchar();
         if(c != 0x00) {
-            s[i] = c;
-            if(echo != 0) uart_pushchar(c, 0); // Echoback
-            i++;
-            if(i >= maxlen) break;
-        }
+           if(cnt > 10) {
+               if(chk_powerbutton() != 0) {
+                   shutdown(0xff);
+               }
+              cnt = 0;
+           }
+           cnt++;
+            if(echo != 0) uart_pushchar(c, 200); // Echoback
+            if(c == '\b') { // BS
+                if(i > 0) {
+                  s[i] = '\0';
+                  i--;
+               }
+            } else
+            if(c < 0x80) {
+               s[i] = c;
+                i++;
+                if((c == '\t') || (c == '\n') || (c == '\r')) break; // TAB OR CR
+                if(i >= 128) break;
+            }
+           tim = 0;
+       } else if(timeout != 0) { // ZAP n * 100mSec.
+           if(chk_powerbutton() != 0) shutdown(0xff); 
+           idle_time_ms(100 - 48); // Poll 0.1Sec
+           tim++;
+           if(tim > timeout) {
+              s[0] = TERM_CHAR_TIMEOUT;
+              i = 1;
+              break;
+           }
+       } else {
+         idle_time_ms(100 - 48); // Wait 100ms if none (and no Timeout).
+         if(chk_powerbutton() != 0) shutdown(0xff); 
+       }
     }
     s[i] = '\0';
 }
 
-unsigned char c2h(unsigned char c)
-{
-    if(c < '1') return 0xff;
-    if(c > 'F') return 0xff;
-    if(c <= '9') return c - '0';
-    if(c >= 'A') return c - 'A' + 10;
-    return 0xff;
-}
-
-char str_hex2bin(unsigned char *s, unsigned char *p, unsigned char len)
-{
-    unsigned char sum = 0;
-    unsigned char pp;
-    unsigned char i;
-    unsigned char h, l;
-    unsigned char c;
-    // Get Header
-    if((s[0] != 'S') || (s[1] != '0')) {
-        // Header
-        return TERM_NONSREC;
-    }
-    i = 2;
-    for(pp = 0; pp <= len ; pp++){
-        h = c2h(s[i]);
-        if(h >= 0x10) return TERM_STRERR;
-        l = c2h(s[i + 1]);
-        if(l >= 0x10) return TERM_STRERR;
-        c =  (h << 8 ) + l;
-        sum += c;
-        p[pp] = c;
-        i += 2;
-    }
-    h = c2h(s[i]);
-    if(h >= 0x10) return TERM_STRERR;
-    l = c2h(s[i + 1]);
-    if(l >= 0x10) return TERM_STRERR;
-    c = (h << 8) + l;
-    if(c != sum) return TERM_SUMERR;
-    return 0;
-}
-
-unsigned char shell_strlen(char *s)
-{
-    unsigned char i = 0;
-    while(i < 128) {
-        if(s[i] == '\0') break;
-        i++;
-    }
-    return i;
-}
-
-unsigned char shell_gettok(char *dst, char *src)
-{
-    unsigned char i;
-    i = 0;
-    while(src[i] != '\0') {
-        if(src[i] == ' ') break;
-        if(src[i] == '\t') break;
-        dst[i] = src[i];
-        i++;
-        if(i > 128) break;
-    }
-    dst[i] = '\0';
-    return i;
-}
-
-int shell_strcmp(char *from, char *to)
-{
-    unsigned char f, t;
-    unsigned char i;
-    int p = 0;
-    
-    f = strlen(from);
-    t = strlen(to);
-    i = f;
-    if(i > t) i = t;
-    while(i != 0){
-        if(from[p] != to[p]) return -1;
-        p++;
-        i--;
-    }
-    return p;
-}
-
-#define SHELL_CMD_NONE -1
-#define SHELL_CMD_NOTFOUND -2
-#define SHELL_CMD_ILLTOKEN -3
-#define SHELL_CMD_TOOLONG -4
-#define SHELL_CMD_OK 0
-
-char shellstr[192];
-
-#define SHELL_TOPCMDS 16
-const char *cmdstr[SHELL_TOPCMDS] = {
-    "HELP",
-    "FREQ",
-    "STAT",
-    "LOAD",
-    "SAVE",
-    "FM",
-    "AM",
-    "POFF",
-    "PON",
-    "SEQ",
-    "LOG",
-    "SCAN",
-    "BAND",
-    "?",
-    "?",
-    "?"
-};
-
-long term_getuint(char *pool)
-{
-    long i = 0;
-    unsigned char p = 0;
-    unsigned char c;
-
-    do {
-        c = pool[p];
-        if((c < '0') || (c > '9')) return -1;
-        if(c == '\0') break;
-        i *= 10;
-        i = i + (c - '0');
-        p++;
-    } while(p <= 10);
-
-    return i;
-}
-
-void term_printnum(char *pool, unsigned int num)
-{
-    char p[5];
-    unsigned char i, j, ii;
-
-    for(i = 0; i < 5; i++){
-        p[i] = num % 10;
-        num = num / 10;
-    }
-    i = 4;
-    do {
-        if(p[i] != 0) break;
-        i--;
-    } while(i != 0);
-    if(i == 0){
-        pool[0] = '0';
-        pool[1] = '\0';
-        return;
-    }
-    ii = i;
-    for(j = 0; j <= ii; j++) {
-        pool[j] = p[i] + '0';
-        i--;
-    }
-    pool[j] = '\0';
-    return;
-}
-/*
- * Set Frequency: Arg1 = Freq.
- */
-static void term_freq(char *p)
-{
-    unsigned int freq;
-    long l;
-    char pp[6];
-
-    l = term_getuint(p);
-    uart_term_putstr("\nSet Freq:");
-    if((l < 0) || (l > 30000)) {
-        uart_term_putstr("\nE:Illegal freq range.\n");
-        return;
-    }
-    freq = (unsigned int)l;
-    if(setup.fm == 0){
-        term_printnum(pp, setup.amfreq);
-        // AM
-        setup.amfreq = freq;
-    } else {
-        term_printnum(pp, setup.fmfreq);
-        // FM
-        setup.fmfreq = freq;
-    }
-    uart_term_putstr(pp);
-    uart_term_putstr("->");
-    term_printnum(pp, freq);
-    uart_term_putstr(pp);
-
-    akc6955_set_freq(freq);
-    uart_term_putstr("\ndone.\n");
-}
 
-/*
- * Print status
- * Arg = none.
- */
-static void term_printstatus(char *p)
-{
-    char pp[6];
-    uart_term_putstr("\nStatus:\n");
-    if(setup.fm == 0){
-        uart_term_putstr("AM \nBand = ");
-        term_printnum(pp, setup.amband);
-        uart_term_putstr(pp);
-        uart_term_putstr("\nFreq = ");
-        term_printnum(pp, setup.amfreq);
-        uart_term_putstr(pp);
-        uart_term_putstr("\n");
-    } else {
-        uart_term_putstr("FM \nBand = ");
-        term_printnum(pp, setup.fmband);
-        uart_term_putstr(pp);
-        uart_term_putstr("\nFreq = ");
-        term_printnum(pp, setup.fmfreq);
-        uart_term_putstr(pp);
-        uart_term_putstr("\n");
-    }
-    
-    uart_term_putstr("\n");
-}
-/*
- * Open the Shell: Return cmdcode.
- */
-char term_shell(unsigned int timeout)
-{
-    unsigned int t;
-    unsigned char pp;
-    unsigned char c;
-    int i;
-    unsigned int ii;
-    char pool[128];
-
-    shellstr[0] = '\0';
-    if(timeout != 0) {
-        t = timeout;
-        while((uart_getstat() & UART_WAKEUP) == 0) {
-            if(t == 0) return SHELL_CMD_NONE;
-            t--;
-            idle_time_ms(1);
-        }
-    } else {
-        if((uart_getstat() & UART_WAKEUP) == 0) return SHELL_CMD_NONE;
-    }
-    uart_term_putstr("\n$>");
-    uart_term_getstr(shellstr, 128, 1); // With Echo
-
-    ii = shell_gettok(pool, shellstr);
-    if(ii >= 128) return SHELL_CMD_TOOLONG;
-
-    for(t = 0; t < SHELL_TOPCMDS; t++) 
-    {
-        i = shell_strcmp((char *)cmdstr[t], pool);
-        if(i > 0) break;
-    }
-    if(i <= 0) return SHELL_CMD_NOTFOUND;
-    ii = shell_gettok(pool, &shellstr[ii]);
-    switch(t){
-        case 1: // Freq
-            term_freq(pool);
-            break;
-        case 2:
-            term_printstatus(pool);
-            break;
-        default:
-            break;
-    }
 
-    return SHELL_CMD_OK;
-}
\ No newline at end of file