/*
* 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)
{
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