implemented some commands (ver and sleep)
authormarco <marco@38d2e660-2303-0410-9eaa-f027e97ec537>
Mon, 12 Jun 2006 21:37:02 +0000 (21:37 +0000)
committermarco <marco@38d2e660-2303-0410-9eaa-f027e97ec537>
Mon, 12 Jun 2006 21:37:02 +0000 (21:37 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@662 38d2e660-2303-0410-9eaa-f027e97ec537

app/triface/appconfig.h
app/triface/doc/PROTOCOL
app/triface/protocol.c
app/triface/triface.c
app/triface/triface.mk
config.mk
drv/timer_avr.c
mware/parser.h
mware/pgm.h

index 31ee1e854c51f9b588e9a67cc4f0a270c4875533..c7ceca08aa137dc2c19fd0c7cd28128cb787a0a0 100755 (executable)
@@ -46,6 +46,9 @@
 
 /*#*
  *#* $Log$
+ *#* Revision 1.3  2006/06/12 21:37:01  marco
+ *#* implemented some commands (ver and sleep)
+ *#*
  *#* Revision 1.2  2006/06/01 12:29:21  marco
  *#* Add first simple protocol command (version request).
  *#*
 /*\}*/
 
 /// Hardware timer selection for drv/timer.c
-#define CONFIG_TIMER  TIMER_ON_OUTPUT_COMPARE2
+#define CONFIG_TIMER  TIMER_ON_OUTPUT_COMPARE0
 
 /// Debug timer interrupt using a strobe pin.
 #define CONFIG_TIMER_STROBE  0
index d4dbee74f5d4bbf0095f0c13509541d668437c17..defc38d5365e2c17609b7d686c1cf9b81f8ec7ac 100755 (executable)
@@ -4,7 +4,7 @@ Command format:
   <command><SP><arg1><SP>...<argN><CR><LF>
 
 Where:
-  command - alphanurmeric command name
+  command - alphanumeric command name
   argN    - numeric argument (unsigned base 10, 0-65535)
 
 Positive response format:
index 1b66c9908dd9f5b2fc3dfe1cc93c35e888a4be7c..c833837d52da547b415ab259373bb5aa19522b2d 100755 (executable)
@@ -16,6 +16,9 @@
 
 /*#*
  *#* $Log$
+ *#* Revision 1.2  2006/06/12 21:37:02  marco
+ *#* implemented some commands (ver and sleep)
+ *#*
  *#* Revision 1.1  2006/06/01 12:29:21  marco
  *#* Add first simple protocol command (version request).
  *#*
 #include "protocol.h"
 
 #include <drv/ser.h>
+#include <drv/timer.h>
 #include <mware/readline.h>
 #include <mware/parser.h>
 #include <cfg/compiler.h>
 #include <cfg/debug.h>
 #include <verstag.h>
 
+#include <stdlib.h> /* malloc()
+                      TODO: substitute with a more appropriate
+                      memory allocator. */
+
 #include <string.h>
 
+#include <cmd_hunk.h>
+
 
 // DEBUG: set to 1 to force interactive mode
 #define FORCE_INTERACTIVE         1
 
 /**
  * True if we are in interactive mode, false if we are in protocol mode.
- * In interactive mode, commands are read through readline() (prompt, completion,
- * history) without IDs, and replies/errors are sent to the serial output.
+ * In interactive mode, commands are read through readline() (prompt,
+ * completion, history) without IDs, and replies/errors are sent to the serial
+ * output.
  * In protocol mode, we implement the default protocol
  */
 static bool interactive;
@@ -62,32 +73,79 @@ INLINE void NAK(Serial *ser, const char *err)
 #endif
 }
 
+/*
+ * Print args on s, with format specified in t->result_fmt.
+ * Return number of valid arguments or -1 in case of error.
+ */
+static int protocol_reply(Serial *s, const struct CmdTemplate *t,
+                         const parms *args)
+{
+       int nres = strlen(t->result_fmt);
+
+       if (nres > 0)
+       {
+               for (int i = strlen(t->arg_fmt); i < nres; ++i)
+               {
+                       if (t->result_fmt[i] == 'd')
+                       {
+                               ser_printf(s, "%ld", args[i].l);
+                       }
+                       else if (t->result_fmt[i] == 's')
+                       {
+                               ser_printf(s, "%s ", args[i].s);
+                       }
+                       else
+                       {
+                               return -1;
+                       }
+               }
+       }
+       ser_print(s, "\r\n");
+       return nres;
+}
+
 static void protocol_parse(Serial *ser, const char *buf)
 {
        const struct CmdTemplate *templ;
-       parms args[8]; // FIXME FIXME!!
 
+       /* Command check.  */
        templ = parser_get_cmd_template(buf);
-
        if (!templ)
        {
-               NAK(ser, "invalid command");
+               NAK(ser, "Invalid command.");
                return;
        }
 
-       // Extract the arguments for the command
+       parms args[PARSER_MAX_ARGS];
+
+       /* Args Check.  */
        if (!parser_get_cmd_arguments(buf, templ, args))
        {
-               NAK(ser, "invalid arguments");
+               NAK(ser, "Invalid arguments.");
                return;
        }
 
-       // EXEC!
+       /* Execute. */
+       if (!parser_execute_cmd(templ, args))
+       {
+               NAK(ser, "Command failed.");
+       }
+       else
+       {
+               if (protocol_reply(ser, templ, args) < 0)
+               {
+                       NAK(ser, "Invalid return format.");
+               }
+       }
+       return;
 }
 
 void protocol_run(Serial *ser)
 {
-       // \todo to be removed, we could probably access the serial FIFO directly
+       /**
+        * \todo to be removed, we could probably access the serial FIFO
+        * directly
+        */
        static char linebuf[80];
 
        if (!interactive)
@@ -103,10 +161,13 @@ void protocol_run(Serial *ser)
                        if (linebuf[0] == 0x1B && linebuf[1] == 0x1B)  // ESC
                        {
                                interactive = true;
-                               ser_printf(ser, "Entering interactive mode\r\n");
+                               ser_printf(ser,
+                                          "Entering interactive mode\r\n");
                        }
                        else
+                       {
                                protocol_parse(ser, linebuf);
+                       }
                }
        }
        else
@@ -129,7 +190,8 @@ void protocol_run(Serial *ser)
                        if (!strcmp(buf, "exit") || !strcmp(buf, "quit"))
                        {
                                rl_clear_history(&rl_ctx);
-                               ser_printf(ser, "Leaving interactive mode...\r\n");
+                               ser_printf(ser,
+                                          "Leaving interactive mode...\r\n");
                                interactive = FORCE_INTERACTIVE;
                        }
                        else
@@ -146,21 +208,50 @@ void protocol_run(Serial *ser)
        }
 }
 
+/*
+ * Commands.
+ * TODO: Command declarations and definitions should be in another file(s).
+ * Maybe we should use CMD_HUNK_TEMPLATE.
+ *
+ */
+
+/* Version.  */
 static ResultCode cmd_ver(const char **str)
 {
        *str = VERS_TAG;
-kprintf("hello, version world!\nver=" VERS_TAG "\n");
-       return RC_REPLY;
+       return 0;
 }
-static ResultCode cmd_add_hunk(parms args_results[])
+static ResultCode cmd_ver_hunk(parms args_results[])
 {
        return cmd_ver(&args_results[0].s);
 }
+
 const struct CmdTemplate cmd_ver_template =
 {
-       "ver", "", "d", cmd_add_hunk
+       "ver", "", "s", cmd_ver_hunk, 0
+};
+
+//DECLARE_CMD_HUNK(ver, (NIL), (string)(NIL));
+
+/* Sleep.  */
+
+static ResultCode cmd_sleep(const long ms)
+{
+       timer_delay((mtime_t)ms);
+       return 0;
+}
+
+static ResultCode cmd_sleep_hunk(parms args[])
+{
+       return cmd_sleep(args[1].l);
+}
+
+const struct CmdTemplate cmd_sleep_template =
+{
+       "sleep", "d", "", cmd_sleep_hunk, 0
 };
 
+/* Register commands.  */
 static void protocol_registerCmds(void)
 {
 //     parser_register_cmd(&CMD_HUNK_TEMPLATE(quit));
@@ -175,6 +266,7 @@ static void protocol_registerCmds(void)
 //     parser_register_cmd(&CMD_HUNK_TEMPLATE(power_off));
 
        parser_register_cmd(&cmd_ver_template);
+       parser_register_cmd(&cmd_sleep_template);
 }
 void protocol_init(Serial *ser)
 {
index 7cd01e00301cab72ec87bd4400fb916e05b9c2bf..759ba3bfc90c83b5c34bfba9ff2db406edef56ed 100755 (executable)
@@ -15,6 +15,9 @@
 
 /*#*
  *#* $Log$
+ *#* Revision 1.3  2006/06/12 21:37:02  marco
+ *#* implemented some commands (ver and sleep)
+ *#*
  *#* Revision 1.2  2006/06/01 12:29:21  marco
  *#* Add first simple protocol command (version request).
  *#*
@@ -43,6 +46,7 @@ int main(void)
        ser_setbaudrate(host_port, 38400);
 
        protocol_init(host_port);
+       timer_delay(2000);
 
        // Main loop
        for(;;)
index 79b5223503b8b0e2d45e4745c5304bd2d582ef0c..c1d095dccef8eb111165a11964103468a2a6af9f 100755 (executable)
@@ -8,6 +8,9 @@
 # Author: Bernardo Innocenti <bernie@develer.com>
 #
 # $Log$
+# Revision 1.3  2006/06/12 21:37:02  marco
+# implemented some commands (ver and sleep)
+#
 # Revision 1.2  2006/06/01 12:29:21  marco
 # Add first simple protocol command (version request).
 #
@@ -39,7 +42,8 @@ triface_CSRC = \
 
 triface_PCSRC += mware/formatwr.c
 
-triface_CFLAGS = -Os -D'ARCH=0' -Iapp/triface/hw -Iapp/triface
+#triface_CFLAGS = -O3 -D'ARCH=0' -Iapp/triface/hw -Iapp/triface
+triface_CFLAGS = -O0 -D'ARCH=0' -Iapp/triface/hw -Iapp/triface
 triface_MCU = atmega128
 
 # Debug stuff
index 9e6b18db5bfbfe191449b458c4467928e00a499a..27c0e82289983e18d31319d398a0f816ab845dd2 100755 (executable)
--- a/config.mk
+++ b/config.mk
@@ -10,6 +10,9 @@
 # Author: Bernardo Innocenti <bernie@develer.com>
 #
 # $Log$
+# Revision 1.5  2006/06/12 21:37:01  marco
+# implemented some commands (ver and sleep)
+#
 # Revision 1.4  2006/05/27 22:41:46  bernie
 # Tweak optimization flags for loops.
 #
@@ -28,7 +31,8 @@
 # Programmer type
 #
 # AVR ISP dongle that blows up easily
-DPROG = -V -c stk500 -P /dev/ttyS0
+DPROG = -V -c jtag2slow
+#-P /dev/ttyUSB0
 
 # STK200 parallel cable
 #DPROG = -c stk200 -E noreset
@@ -36,7 +40,8 @@ DPROG = -V -c stk500 -P /dev/ttyS0
 # PonyProg serial programmer
 #DPROG = -c dasa2
 
-OPTCFLAGS = -ffunction-sections -fdata-sections -funsafe-loop-optimizations
+#OPTCFLAGS = -ffunction-sections -fdata-sections -funsafe-loop-optimizations
+OPTCFLAGS = -funsafe-loop-optimizations
 
 # For AVRStudio
 #DEBUGCFLAGS = -gdwarf-2
@@ -47,7 +52,7 @@ DEBUGCFLAGS = -ggdb
 #
 # define some variables based on the AVR base path in $(AVR)
 #
-CROSS   = 
+CROSS   = avr-
 CC      = $(CROSS)gcc
 AS      = $(CC) -x assembler-with-cpp
 LD      = $(CC)
@@ -116,7 +121,7 @@ CPPAFLAGS = $(DEBUGCFLAGS) -MMD
 ASFLAGS        = $(DEBUGCFLAGS)
 
 # Default linker flags
-#LDFLAGS = $(MAP_FLAGS)
+LDFLAGS = $(MAP_FLAGS)
 
 #bernie: does not complain for missing symbols!
 #LDFLAGS = $(MAP_FLAGS) -Wl,--gc-sections
index 0b24b0438927b86d9f9a1bb4bb5dc9f6b6f50fee..877f9193b34d676777b7d2e8ae62854e5f4994a9 100755 (executable)
@@ -15,6 +15,9 @@
 
 /*#*
  *#* $Log$
+ *#* Revision 1.3  2006/06/12 21:37:02  marco
+ *#* implemented some commands (ver and sleep)
+ *#*
  *#* Revision 1.2  2006/05/18 00:37:58  bernie
  *#* Don't include unneeded header hw.h.
  *#*
@@ -28,7 +31,7 @@
 #include <drv/timer_avr.h>
 #include <cfg/macros.h> // BV()
 
-#include <avr/signal.h>
+#include <avr/interrupt.h>
 #include <avr/io.h>
 
 /*! HW dependent timer initialization  */
index 34f6a14d3f0dfc50dd7354d76e1243bcc714c026..9ad6567d74db8d9c6bed625886714ad1b8714402 100755 (executable)
@@ -14,6 +14,9 @@
 
 /*#*
  *#* $Log$
+ *#* Revision 1.2  2006/06/12 21:37:02  marco
+ *#* implemented some commands (ver and sleep)
+ *#*
  *#* Revision 1.1  2006/06/01 12:27:39  marco
  *#* Added utilities for protocols
  *#*
@@ -57,10 +60,11 @@ typedef ResultCode (*CmdFuncPtr)(parms args_results[]);
  */
 struct CmdTemplate
 {
-       const char *name;          //!< name of command
-       const char *arg_fmt;       //!< format string for the input
-       const char *result_fmt;    //!< format string for the output
-       CmdFuncPtr func;           //!< pointer to the handler function
+       const char *name;          ///< Name of command
+       const char *arg_fmt;       ///< Format string for the input
+       const char *result_fmt;    ///< Format string for the output
+       CmdFuncPtr func;           ///< Pointer to the handler function
+       uint16_t   flags;          ///< Currently unused.
 };
 
 /**
index 4bd1018c451f7020f598f2800b6f812698591795..8f5b878d954e1286a4fa5d94a69671ab9d5845fe 100755 (executable)
        #ifndef PSTR
        #define PSTR(s) ({ static const char __c[] PROGMEM = (s); &__c[0]; })
        #endif
+       #ifndef PFUNC
+       #define PFUNC(x)      x ## _P
+       #endif
 
 #elif CPU_HARVARD
        #error Missing CPU support
 #define PSTR            /* nothing */
 #endif
 
+#ifndef PFUNC
+#define PFUNC(x) x
+#endif
+
 #ifndef PROGMEM
 #define PROGMEM         /* nothing */
 #endif
@@ -209,7 +216,7 @@ typedef PROGMEM uint32_t pgm_uint32_t;
  */
 #ifdef _PROGMEM
        #define PGM_READ_CHAR(s) pgm_read_char(s)
-       #define PGM_FUNC(x)      x ## _P
+       #define PGM_FUNC(x)      PFUNC(x)
        #define PGM_STR(x)       PSTR(x)
        #define PGM_ATTR         PROGMEM
 #else