#include "shell_strutl.h"
#include "uart_termio.h"
#include "term_shell.h"
+#include "eeprom_util.h"
-unsigned char cmd_shellstr[127];
-static char shell_strbuf[127];
+unsigned char cmd_shellstr[130];
+static char shell_strbuf[130];
static char xarg1[66];
static char xarg2[66];
static char xarg3[66];
+static unsigned char tmparea[256];
-#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
-
-#define SHELL_TOPCMDS 16
static void shell_printnum(unsigned int v)
{
term_printnum(s, v);
uart_term_putstr(s);
}
+
/*
* Set Frequency: Arg1 = Freq.
*/
l = term_getuint(p);
uart_term_putstr("\nSet Freq:");
- if((l < 0) || (l > 30000)) {
+ if((l < 100) || (l > 30000)) {
uart_term_putstr("\nE:Illegal freq range.\n");
return;
}
*/
static void term_printstatus(char *p)
{
+ update_status();
uart_term_putstr("\nStatus:\n");
if(setup.fm == 0){
- uart_term_putstr("AM \nBand = ");
+ uart_term_putstr("AM \nBAND = ");
shell_printnum(setup.amband);
- uart_term_putstr("\nFreq = ");
+ uart_term_putstr("\nFREQ = ");
shell_printnum(setup.amfreq);
- uart_term_putstr("\n");
+ uart_term_putstr("KHz");
+ uart_term_putstr("\nDIFF = ");
+ shell_printnum(diffstat);
} else {
- uart_term_putstr("FM \nBand = ");
+ uart_term_putstr("FM \nBAND = ");
shell_printnum(setup.fmband);
- uart_term_putstr("\nFreq = ");
- shell_printnum(setup.fmfreq);
- uart_term_putstr("\n");
+ uart_term_putstr("\nFREQ = ");
+ shell_printnum(setup.fmfreq / 100);
+ uart_term_putstr(".");
+ shell_printnum(setup.fmfreq % 100);
+ uart_term_putstr("MHz");
+ uart_term_putstr("\nDIFF = ");
+ shell_printnum(diffstat);
+ uart_term_putstr("\nSTEREO = ");
+ if(stereoflag == 0) {
+ uart_term_putstr("NO");
+ } else {
+ uart_term_putstr("YES");
+ }
}
-
+ uart_term_putstr("\nSIGNAL-LEVEL = ");
+ shell_printnum(recv_signal);
+ uart_term_putstr("dB");
+
+ uart_term_putstr("\nCNR-LEVEL = ");
+ shell_printnum(cnrlevel);
+ uart_term_putstr("dB");
+
+ uart_term_putstr("\nBATT = ");
+ shell_printnum(battlevel / 100);
+ uart_term_putstr(".");
+ shell_printnum(battlevel % 100);
+ uart_term_putstr("V\n");
+
uart_term_putstr("\n");
}
-static void term_help(char *p)
+static void term_fm(char *p)
{
+ unsigned int freq;
+ setup.fm = 0xff;
+ setup.amfreq_bank[setup.amband] = setup.amfreq;
+ freq = setup.fmfreq_bank[setup.fmband];
+ akc6955_chg_fm(setup.fm, freq);
+}
+static void term_am(char *p)
+{
+ unsigned int freq;
+ setup.fm = 0x00;
+ setup.fmfreq_bank[setup.fmband] = setup.fmfreq;
+ freq = setup.amfreq_bank[setup.amband];
+ akc6955_chg_fm(setup.fm, freq);
}
+
/*
* Poweroff.
* Arg1: 'N'/'n' : not save.
{
}
-static unsigned char put_hexline(unsigned char *dat, unsigned int addr, unsigned char len)
+
+static void term_band(char *p)
+{
+ unsigned char slen;
+ unsigned char n;
+ unsigned char band;
+ slen = shell_gettok(xarg1, p);
+}
+
+
+static unsigned char put_hexline(unsigned char *dat, unsigned long addr, unsigned char len)
{
unsigned char l;
l = str_bin2hex((unsigned char *)shell_strbuf, dat, addr, len);
uart_term_putstr("\n--- END---\n");
}
+
+
+static void save_hex_page(unsigned char *p, unsigned int len, unsigned long baseaddr)
+{
+ unsigned int pp;
+ unsigned int l = len;
+ for(pp = 0; pp < len; pp += 16){
+ if(l > 16) {
+ put_hexline(&p[pp], pp + baseaddr, 16);
+ l -= 16;
+ } else {
+ put_hexline(&p[pp], pp + baseaddr, l);
+ break;
+ }
+ idle_time_ms(100); // Line wait.
+ }
+}
+
+
+void shell_memcpy(unsigned char *to, unsigned char *from, unsigned char len)
+{
+ unsigned char l;
+ for(l = 0; l < len; l++) to[l] = from[l];
+}
+
+
+static char wait_for_sheader(unsigned char *file, unsigned char retry)
+{
+ unsigned char _try = 0;
+ unsigned char _err = 0;
+ int stat;
+ file[0] = '\0';
+
+ do {
+ shell_strbuf[0] = '\0';
+ uart_term_getstr(shell_strbuf, 100, 0); // With Echo, timeout=10Sec.
+ stat = search_head_s(shell_strbuf);
+ if(stat < 0) {
+ _err++;
+ if(_err > 100) return -1; // Error
+ continue;
+ }
+ _err = 0;
+ stat = str_shexheader(&shell_strbuf[stat], file);
+ if(stat == TERM_OK) break;
+ _try++;
+ } while(_try <= retry);
+ return stat;
+}
+
+static unsigned long load_hex_page(unsigned char *p, unsigned long *addr, unsigned int len)
+{
+ int stat;
+ unsigned char l;
+ unsigned long a;
+ unsigned char __err = 0;
+ unsigned long bytes = 0;
+ int pos;
+ unsigned char sbuf[20];
+
+ while(len > 0){
+_l0:
+
+ shell_strbuf[0] = '\0';
+ uart_term_getstr(shell_strbuf, 1000, 0); // Without Echo, timeout=100Sec.
+
+ stat = search_head_s(shell_strbuf);
+ if(stat < 0) {
+ __err++;
+ if(__err > 100) {
+ return 0xffffffff; // Error
+ }
+ ClrWdt();
+ idle_time_ms(10);
+ goto _l0;
+ }
+ __err = 0;
+ pos = stat;
+ stat = str_shex2bin(&shell_strbuf[stat], p, &a, &l);
+ if(stat == TERM_SRECEND) {
+ return bytes; // Return head
+ }
+
+ if(stat != TERM_OK) {
+ return 0xffffffff; // Some error
+ }
+
+ bytes += l;
+ *addr = a;
+ if(l >= len) break; // End addr
+ p += l;
+ len -= l;
+ }
+ // Check return header
+ shell_strbuf[0] = '\0';
+ uart_term_getstr(shell_strbuf, 1000, 0); // Without Echo, timeout=100Sec.
+ stat = search_head_s(shell_strbuf);
+ if(stat < 0) return 0xffffffff;
+ stat = str_shex2bin(&shell_strbuf[stat], p, &a, &l);
+ if(stat != TERM_SRECEND) return 0xffffffff;
+ return bytes;
+}
+/*
+ * Load from S record.
+ */
+static void load_from_term(unsigned char *p)
+{
+ unsigned char slen = shell_gettok(xarg1, p);
+ unsigned long addr = 0;
+ unsigned char *pv;
+ unsigned int len;
+ unsigned char fbuf[128];
+ unsigned long l;
+ int stat;
+
+ if(shell_strcmp(xarg1, "INT") > 0) { // Internal EEPROM
+ uart_term_putstr("\nPls. start internal eeprom data...\n");
+
+ stat = wait_for_sheader(fbuf, 10);
+
+ if(stat != TERM_OK) goto _loaderr;
+ if(shell_strcmp(fbuf, "INT_EEPROM") < 0) goto _fileerr;
+ len = sizeof(__radioset_t);
+ pv = tmparea;
+// pv = &setup;
+ l = load_hex_page(pv, &addr, len);
+ if(l == 0xffffffff) goto _loaderr;
+ if(addr >= 255) goto _loaderr; // Too large
+
+ shell_memcpy((unsigned char *)(&setup) , &tmparea, len);
+ setup_akc6955(); // DO!
+ } else if(shell_strcmp(xarg1, "FTBL") > 0) { // External EEPROM, Freq TBL
+ } else if(shell_strcmp(xarg1, "BAND") > 0) { // band
+ }
+_OK:
+
+ uart_term_putstr("\nOK.\n");
+ return;
+
+_loaderr:
+ uart_term_putstr("\nERR: LOAD Error\n");
+ return;
+_addrerr:
+ uart_term_putstr("\nERR: Address Error\n");
+ return;
+_fileerr:
+ uart_term_putstr("\nERR: Not correct filename\n");
+ return;
+}
+
/*
* Save ROM as S record.
*/
unsigned char slen;
unsigned int len;
unsigned int pp;
- long i;
int addr;
unsigned char *pv;
+ unsigned long base;
slen = shell_gettok(xarg1, p);
addr = 0;
put_hexheader("INT_EEPROM");
len = sizeof(__radioset_t);
pv = &setup;
- for(pp = 0; pp < sizeof(__radioset_t); pp += 16){
- if(len > 16) {
- put_hexline(&pv[pp], pp, 16);
- len -= 16;
- } else {
- put_hexline(&pv[pp], pp, len);
- }
- }
+ save_hex_page(pv, len, 0);
put_hexfooter();
} else if(shell_strcmp(xarg1, "FTBL") > 0) { // External EEPROM, Freq TBL
put_hexheader("EXT_FREQTBL");
+ base = 0x100000;
+ for(pp = 0; pp < USER_MEMORY_BANKS; pp++) {
+ if(load_frequencies(pp, 0xff) != 0) break; // Error
+ save_hex_page((unsigned char *)(&freqset_temp), sizeof(__freqset_t), base + (pp << 9)) ;
+ }
put_hexfooter();
} else if(shell_strcmp(xarg1, "BAND") > 0) { // band
put_hexheader("EXT_BANDTBL");
"AM",
"POFF",
"PON",
- "SEQ",
+ "DUMP",
"LOG",
"SCAN",
"BAND",
"EXIT"
};
+
+static const char shell_helpstr_help[] = "HELP [about-command]\n -- Online help.\n";
+static const char shell_helpstr_freq[] = "FREQ frequency\n -- Set frequency.\n";
+static const char shell_helpstr_stat[] = "STAT\n -- Print status.\n";
+static const char shell_helpstr_load[] = "LOAD section [S]\n -- Load settings from terminal.\n Arg2: if 'S' then Save to internal EEPROM.\n";
+static const char shell_helpstr_save[] = "SAVE section\n -- Save settings to terminal.\n";
+static const char shell_helpstr_fm[] = "FM\n -- Switch to FM.\n";
+static const char shell_helpstr_am[] = "AM\n -- Switch to AM.\n";
+static const char shell_helpstr_poff[] = "\nPOFF [savef]\n -- Power OFF.\n savef: if 'N' then power-off without saving.\n";
+static const char shell_helpstr_pon[] = "\nPON\n -- Power ON.\n";
+static const char shell_helpstr_dump[] = "\nDUMP section [number]\n -- Dump section(s).\n";
+static const char shell_helpstr_log[] = "\nLOG\n -- View Log.\n";
+static const char shell_helpstr_scan[] = "\nSCAN [direction]\n -- DO Scan.\n direction : UP / DOWN\n";
+static const char shell_helpstr_band[] = "\nBAND [band-name]\n -- Set band\n";
+static const char shell_helpstr_set[] = "\nSET entry [value]\n -- Set setting / viewing value.\n value : Decimal.\n";
+static const char shell_helpstr_print[] = "\nPRINT [entry]\n -- Print system value(s).\n";
+static const char shell_helpstr_exit[] = "\nEXIT\n -- EXIT FROM SHELL.\n";
+
+
+static const char *shell_helpstr_sections[2] = {
+ "\nsection :\n INT : Internal EEPROM\n FTBL : Freq table\n",
+ "\n FREQ num : Save user freq #num.\n BAND : Save user band table."
+};
+
+
static void cmd_printhelp(char cmdnum)
{
- uart_term_putstr("\nSynopsys:\n");
- switch(cmdnum){
- case 0:
- uart_term_putstr("HELP [about-command]\n");
- uart_term_putstr(" -- Online help.\n");
- break;
- case 1:
- uart_term_putstr("FREQ frequency\n");
- uart_term_putstr(" -- Set frequency.\n");
- break;
- case 2:
- uart_term_putstr("\nSTAT\n");
- uart_term_putstr(" -- Print status.\n");
- break;
- case 3:
- uart_term_putstr("\nLOAD direction [S]\n");
- uart_term_putstr(" -- Load settings from terminal.\n");
- uart_term_putstr(" Arg2: if 'S' then Save to internal EEPROM.\n");
- break;
- case 4:
- uart_term_putstr("\nSAVE section\n");
- uart_term_putstr(" -- Save settings to terminal.\n");
- break;
- case 5:
- uart_term_putstr("\nFM\n");
- uart_term_putstr(" -- Change to FM\n");
- break;
- case 6:
- uart_term_putstr("\nAM\n");
- uart_term_putstr(" -- Change to AM\n");
- break;
- case 7:
- uart_term_putstr("\nPOFF [savef]\n");
- uart_term_putstr(" -- Power OFF\n");
- uart_term_putstr(" savef: if 'N' then power-off without saving.\n");
- break;
- case 8:
- uart_term_putstr("\nPON\n");
- uart_term_putstr(" -- Power ON\n");
- break;
- case 9:
- uart_term_putstr("\nSEQ\n");
- break;
- case 10:
- uart_term_putstr("\nLOG\n");
- uart_term_putstr(" -- View LOG(Reserved command)\n");
- break;
- case 11:
- uart_term_putstr("\nSCAN [direction]\n");
- uart_term_putstr(" -- DO Scan\n");
- uart_term_putstr(" direction : UP / DOWN\n");
- break;
- case 12:
- uart_term_putstr("\nBAND [band-name]\n");
- uart_term_putstr(" -- Set band\n");
- break;
- case 13:
- uart_term_putstr("\nSET offset value\n");
- uart_term_putstr(" -- Set system value.\n");
- break;
- case 14:
- uart_term_putstr("\nPRINT offset\n");
- uart_term_putstr(" -- PRINT system value.\n");
- break;
- case 15:
- uart_term_putstr("\nEXIT\n");
- uart_term_putstr(" -- EXIT shell\n");
- break;
- default:
- break;
- }
+ const char *p;
+ unsigned char i;
+ unsigned char sectionf = 0;
+
+ switch(cmdnum) {
+ case 0:
+ p = shell_helpstr_help;
+ break;
+ case 1:
+ p = shell_helpstr_freq;
+ break;
+ case 2:
+ p = shell_helpstr_stat;
+ break;
+ case 3:
+ p = shell_helpstr_load;
+ sectionf = 0xff;
+ break;
+ case 4:
+ p = shell_helpstr_save;
+ sectionf = 0xff;
+ break;
+ case 5:
+ p = shell_helpstr_fm;
+ break;
+ case 6:
+ p = shell_helpstr_am;
+ break;
+ case 7:
+ p = shell_helpstr_poff;
+ break;
+ case 8:
+ p = shell_helpstr_pon;
+ break;
+ case 9:
+ p = shell_helpstr_dump;
+ sectionf = 0xff;
+ break;
+ case 10:
+ p = shell_helpstr_log;
+ break;
+ case 11:
+ p = shell_helpstr_scan;
+ break;
+ case 12:
+ p = shell_helpstr_band;
+ break;
+ case 13:
+ p = shell_helpstr_set;
+ break;
+ case 14:
+ p = shell_helpstr_print;
+ break;
+ case 15:
+ p = shell_helpstr_exit;
+ break;
+ default:
+ return;
+ };
+ uart_term_putstr(p);
+ if(sectionf != 0) {
+ for(i = 0; i < 2; i++) {
+ uart_term_putstr(shell_helpstr_sections[i]);
+ }
+ }
}
static void cmd_help(char *p)
int f;
slen = shell_gettok(xarg1, p);
- if(slen != 0) {
+ if(slen > 1) {
for(i = 0; i < SHELL_TOPCMDS; i++){
f = shell_strcmp(xarg1, cmdstr[i]);
if(f > 0) {
case 2:
term_printstatus(pool);
break;
+ case 3:
+ load_from_term(pool);
+ break;
case 4:
save_to_term(pool);
break;
+ case 5:
+ term_fm(pool);
+ break;
+ case 6:
+ term_am(pool);
+ break;
case 7:
term_poweroff(pool);
break;
case 8:
term_poweron(pool);
break;
+ case 12: // BAND
+ term_band(pool);
+ break;
case 15: // Exit
uart_term_putstr("\nBye... (^^)/~~\n");
- uart_init();
- return SHELL_CMD_OK;
- break;
+ goto _l0;
+ break;
default:
uart_term_putstr("\n?? CMD Error\n");
break;
}
} while(1);
+_l0:
+ uart_init();
return SHELL_CMD_OK;
}