home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 September / pcwk_09_96.iso / demo / wgelectr / pk51demo / files.2 / EXAMPLES / TDP / CMDPROC.C < prev    next >
C/C++ Source or Header  |  1995-08-30  |  4KB  |  184 lines

  1. /*------------------------------------------------------------------------------
  2. CMDPROC.C:  Routines to interpret command lines.
  3.  
  4. Copyright 1995 KEIL Software, Inc.
  5. ------------------------------------------------------------------------------*/
  6.  
  7. #include <ctype.h>
  8. #include <string.h>
  9. #include "tdp.h"
  10.  
  11. /*------------------------------------------------------------------------------
  12. ------------------------------------------------------------------------------*/
  13. static pdata char helptext [] =
  14.   "\r\n\r\n"
  15.   "HELP:\r\n"
  16.   "STCLK hhmmss -- Set Clock Time\r\n"
  17.   "RDCLK        -- Display Clock Time\r\n"
  18.   "SCCLK ON|OFF -- Display Clock Time Every Second\r\n"
  19.   "STALM hhmm   -- Set Alarm\r\n"
  20.   "RDALM        -- Display Alarm Time\r\n"
  21.   "CLALM        -- Clear Alarm Time\r\n"
  22.   "\r\n";
  23.  
  24. /*------------------------------------------------------------------------------
  25. Commands:
  26. HELP
  27. STCLK HHMMSS
  28. RDCLK
  29. SCCLK
  30. STALM HHMM
  31. RDALM
  32. CLALM
  33.  
  34. Responses:
  35. TIME: HH:MM:SS.HH    (current time)
  36. ALARM: HH:MM        (alarm time)
  37. <beep>            (alarm - for one minute only)
  38. ------------------------------------------------------------------------------*/
  39. enum
  40.   {
  41.   CID_SET_CLK,
  42.   CID_READ_CLK,
  43.   CID_SCAN_CLK,
  44.  
  45.   CID_SET_ALM,
  46.   CID_READ_ALM,
  47.   CID_CLR_ALM,
  48.  
  49.   CID_LAST
  50.   };
  51.  
  52. struct cmd_st
  53.   {
  54.   const char *cmdstr;
  55.   unsigned char id;
  56.   };
  57.  
  58. static pdata struct cmd_st cmd_tbl [] =
  59.   {
  60.     { "STCLK",        CID_SET_CLK },
  61.     { "RDCLK",        CID_READ_CLK },
  62.     { "SCCLK",        CID_SCAN_CLK },
  63.     { "STALM",        CID_SET_ALM },
  64.     { "RDALM",        CID_READ_ALM },
  65.     { "CLALM",        CID_CLR_ALM },
  66.   };
  67.  
  68. #define CMD_TBL_LEN (sizeof (cmd_tbl) / sizeof (cmd_tbl [0]))
  69.  
  70. /*------------------------------------------------------------------------------
  71. ------------------------------------------------------------------------------*/
  72. static unsigned char cmdid_search (
  73.   char *cmdstr)
  74. {
  75. struct cmd_st *ctp;
  76.  
  77. for (ctp = cmd_tbl; ctp < &cmd_tbl [CMD_TBL_LEN]; ctp++)
  78.   {
  79.   if (strcmp (ctp->cmdstr, cmdstr) == 0)
  80.     return (ctp->id);
  81.   }
  82.  
  83. return (CID_LAST);
  84. }
  85.  
  86. /*------------------------------------------------------------------------------
  87. ------------------------------------------------------------------------------*/
  88. char *strupr (
  89.   char *src)
  90. {
  91. char *p;
  92.  
  93. for (p = src; *p != '\0'; p++)
  94.   *p = toupper (*p);
  95.  
  96. return (src);
  97. }
  98.  
  99. /*------------------------------------------------------------------------------
  100. ------------------------------------------------------------------------------*/
  101. void cmd_proc (
  102.   const char *cmd)
  103. {
  104. xdata char cmdstr_buf [1 + MAX_CMD_LEN];
  105. xdata char argstr_buf [1 + MAX_CMD_LEN];
  106. char *argsep;
  107. unsigned char id;
  108.  
  109. /*------------------------------------------------
  110. ------------------------------------------------*/
  111. strncpy (cmdstr_buf, cmd, sizeof (cmdstr_buf) - 1);
  112. cmdstr_buf [sizeof (cmdstr_buf) - 1] = '\0';
  113. strupr (cmdstr_buf);
  114.  
  115. argsep = strchr (cmdstr_buf, ' ');
  116.  
  117. /*------------------------------------------------
  118. ------------------------------------------------*/
  119. if (argsep == NULL)
  120.   {
  121.   argstr_buf [0] = '\0';
  122.   }
  123. else
  124.   {
  125.   strcpy (argstr_buf, argsep + 1);
  126.   *argsep = '\0';
  127.   }
  128.  
  129. /*------------------------------------------------
  130. ------------------------------------------------*/
  131. id = cmdid_search (cmdstr_buf);
  132.  
  133. switch (id)
  134.   {
  135.   unsigned long tm;
  136.  
  137.   case CID_SET_CLK:
  138.     if (strtotm (&tm, argstr_buf) != 0)
  139.       goto CMDERR;
  140.     clock_set (tm * 100);
  141.     break;
  142.  
  143.   case CID_READ_CLK:
  144.     clock_out_time ();
  145.     break;
  146.     
  147.   case CID_SCAN_CLK:
  148.     if (strcmp (argstr_buf, "ON") == 0)
  149.       clock_scan (1);
  150.     else if (strcmp (argstr_buf, "OFF") == 0)
  151.       clock_scan (0);
  152.     else
  153.       goto CMDERR;
  154.     break;
  155.  
  156.   case CID_SET_ALM:
  157.     strcat (argstr_buf, "00");
  158.     if (strtotm (&tm, argstr_buf) != 0)
  159.       goto CMDERR;
  160.     alarm_set (tm / 60);
  161.     break;
  162.  
  163.   case CID_READ_ALM:
  164.     alarm_out_time ();
  165.     break;
  166.  
  167.   case CID_CLR_ALM:
  168.     alarm_clr ();
  169.     break;
  170.  
  171.   case CID_LAST:
  172. CMDERR:
  173.     com_puts (helptext);
  174.     break;
  175.   }
  176.  
  177. /*------------------------------------------------
  178. ------------------------------------------------*/
  179. }
  180.  
  181. /*------------------------------------------------------------------------------
  182. ------------------------------------------------------------------------------*/
  183.  
  184.