www.pudn.com > study_CIP51.rar > cmdproc.c
#include#include #include "tdp.h" /* Define prompt of Help */ static pdata char helptext[]= "\r\n" "HELP:\r\n" "STCLK hhmmss -- Set Clock Time\r\n" "RDCLK -- Display Clock Time\r\n" "SCCLK ON|OFF -- Display CLock Time Every Second\r\n" "STALM hhmm -- Set Alarm\r\n" "RDALM -- Display Alarm Time\r\n" "CLALM -- Clear Alarm Time\r\n"; enum{ CID_SET_CLK, CID_READ_CLK, CID_SCAN_CLK, CID_SET_ALM, CID_READ_ALM, CID_CLR_ALM, CID_LAST }; struct cmd_st { const char *cmdstr; unsigned char id; }; static pdata struct cmd_st cmd_tbl [] = { { "STCLK", CID_SET_CLK }, { "RDCLK", CID_READ_CLK }, { "SCCLK", CID_SCAN_CLK }, { "STALM", CID_SET_ALM }, { "RDALM", CID_READ_ALM }, { "CLALM", CID_CLR_ALM }, }; #define CMD_TBL_LEN (sizeof (cmd_tbl) / sizeof(cmd_tbl[0])) static unsigned char cmdid_search(char *cmdstr) { struct cmd_st *ctp; for (ctp = cmd_tbl; ctp <&cmd_tbl[CMD_TBL_LEN]; ctp++) { if(strcmp(ctp->cmdstr,cmdstr) ==0) return(ctp->id); } return(CID_LAST); } char *strupr(char *src) { char *s; for (s = src; *s != '\0'; s++) *s = toupper(*s); return(src); } /* Command Processing */ void cmd_proc(const char *cmd) { xdata char cmdstr_buf[1 + MAX_CMD_LEN]; xdata char argstr_buf[1 + MAX_CMD_LEN]; char *argsep; unsigned char id; strncpy(cmdstr_buf, cmd, sizeof(cmdstr_buf) - 1); cmdstr_buf[sizeof(cmdstr_buf) - 1] = '\0'; strupr(cmdstr_buf); argsep = strchr(cmdstr_buf, ' '); if(argsep == NULL) { argstr_buf[0] = '\0'; } else { strcpy(argstr_buf,argsep + 1); *argsep = '\0'; } id = cmdid_search(cmdstr_buf); switch (id) { unsigned long tm; case CID_SET_CLK: if(strtotm(&tm, argstr_buf) != 0) goto CMDERR; clock_set(tm * 100); break; case CID_READ_CLK: clock_out_time(); break; case CID_SCAN_CLK: if(strcmp(argstr_buf,"ON") ==0 ) clock_scan(1); else if (strcmp(argstr_buf,"OFF") == 0) clock_scan(0); else goto CMDERR; break; case CID_SET_ALM: strcat(argstr_buf, "00"); if(strtotm(&tm,argstr_buf) != 0) goto CMDERR; alarm_set(tm / 60); break; case CID_READ_ALM: alarm_out_time(); break; case CID_CLR_ALM: alarm_clr(); break; case CID_LAST: CMDERR: com_puts(helptext); break; } }