From 39e200e1f43474a96888f97e2271728c9605ccbe Mon Sep 17 00:00:00 2001 From: Daniele Basile Date: Wed, 25 Jan 2012 14:12:45 +0100 Subject: [PATCH] Refactor to use new protocol module and sipo. --- boards/triface/examples/triface/cmd.c | 238 +----------------- boards/triface/examples/triface/cmd.h | 14 +- boards/triface/examples/triface/main.c | 12 +- .../triface/examples/triface/triface_user.mk | 3 +- 4 files changed, 29 insertions(+), 238 deletions(-) diff --git a/boards/triface/examples/triface/cmd.c b/boards/triface/examples/triface/cmd.c index 14523575..47712beb 100644 --- a/boards/triface/examples/triface/cmd.c +++ b/boards/triface/examples/triface/cmd.c @@ -26,7 +26,7 @@ * invalidate any other reasons why the executable file might be covered by * the GNU General Public License. * - * Copyright 2003, 2004, 2006 Develer S.r.l. (http://www.develer.com/) + * Copyright 2003, 2004, 2006, 2012 Develer S.r.l. (http://www.develer.com/) * Copyright 2000 Bernie Innocenti * * --> @@ -40,221 +40,30 @@ * \author Daniele Basile */ -#include "protocol.h" +#include "cmd.h" #include "verstag.h" #include "hw/hw_input.h" - #include "cfg/cfg_parser.h" #include #include +#include #include #include #include #include -#include #include -#include -#include - -#include - -#include -#include +#include // Define the format string for ADC #define ADC_FORMAT_STR "dddd" #define ADC_CHANNEL_NUM 4 -// 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 protocol mode, we implement the default protocol - */ -static bool interactive; - -/// Readline context, used for interactive mode. -static struct RLContext rl_ctx; - -static Sipo fd_sipo; - -uint8_t reg_status_dout; -/** - * Send a NAK asking the host to send the current message again. - * - * \a fd kfile handler for serial. - * \a err human-readable description of the error for debug purposes. - */ -INLINE void NAK(KFile *fd, const char *err) -{ -#ifdef _DEBUG - kfile_printf(fd, "NAK \"%s\"\r\n", err); -#else - kfile_printf(fd, "NAK\r\n"); -#endif -} - -static void protocol_prompt(KFile *fd) -{ - kfile_print(fd, ">> "); -} - -/* - * Print args on s, with format specified in t->result_fmt. - * Return number of valid arguments or -1 in case of error. - */ -static bool protocol_reply(KFile *fd, const struct CmdTemplate *t, - const parms *args) -{ - unsigned short offset = strlen(t->arg_fmt) + 1; - unsigned short nres = strlen(t->result_fmt); - - for (unsigned short i = 0; i < nres; ++i) - { - if (t->result_fmt[i] == 'd') - { - kfile_printf(fd, " %ld", args[offset+i].l); - } - else if (t->result_fmt[i] == 's') - { - kfile_printf(fd, " %s", args[offset+i].s); - } +static Sipo *local_sipo; +static uint8_t reg_status_dout; - else - { - abort(); - } - } - kfile_printf(fd, "\r\n"); - return true; -} - -static void protocol_parse(KFile *fd, const char *buf) -{ - const struct CmdTemplate *templ; - - /* Command check. */ - templ = parser_get_cmd_template(buf); - if (!templ) - { - kfile_print(fd, "-1 Invalid command.\r\n"); - protocol_prompt(fd); - return; - } - - parms args[CONFIG_PARSER_MAX_ARGS]; - - /* Args Check. TODO: Handle different case. see doc/PROTOCOL . */ - if (!parser_get_cmd_arguments(buf, templ, args)) - { - kfile_print(fd, "-2 Invalid arguments.\r\n"); - protocol_prompt(fd); - return; - } - - /* Execute. */ - if(!parser_execute_cmd(templ, args)) - { - NAK(fd, "Error in executing command."); - } - if (!protocol_reply(fd, templ, args)) - { - NAK(fd, "Invalid return format."); - } - - protocol_prompt(fd); - return; -} - -void protocol_run(KFile *fd) -{ - /** - * \todo to be removed, we could probably access the serial FIFO - * directly - */ - static char linebuf[80]; - - if (!interactive) - { - kfile_gets(fd, linebuf, sizeof(linebuf)); - - // reset serial port error anyway - kfile_clearerr(fd); - - // check message minimum length - if (linebuf[0]) - { - /* If we enter lines beginning with sharp(#) - they are stripped out from commands */ - if(linebuf[0] != '#') - { - if (linebuf[0] == 0x1B && linebuf[1] == 0x1B) // ESC - { - interactive = true; - kfile_printf(fd, "Entering interactive mode\r\n"); - } - else - { - protocol_parse(fd, linebuf); - } - } - } - } - else - { - const char *buf; - - /* - * Read a line from serial. We use a temporary buffer - * because otherwise we would have to extract a message - * from the port immediately: there might not be any - * available, and one might get free while we read - * the line. We also add a fake ID at the start to - * fool the parser. - */ - buf = rl_readline(&rl_ctx); - - /* If we enter lines beginning with sharp(#) - they are stripped out from commands */ - if(buf && buf[0] != '#') - { - if (buf[0] != '\0') - { - // exit special case to immediately change serial input - if (!strcmp(buf, "exit") || !strcmp(buf, "quit")) - { - rl_clear_history(&rl_ctx); - kfile_printf(fd, "Leaving interactive mode...\r\n"); - interactive = FORCE_INTERACTIVE; - } - else - { - //TODO: remove sequence numbers - linebuf[0] = '0'; - linebuf[1] = ' '; - - strncpy(linebuf + 2, buf, sizeof(linebuf) - 3); - linebuf[sizeof(linebuf) - 1] = '\0'; - protocol_parse(fd, linebuf); - } - } - } - } -} - -/* - * Commands. - * TODO: Command declarations and definitions should be in another file(s). - * Maybe we should use CMD_HUNK_TEMPLATE. - * - */ MAKE_CMD(ver, "", "ddd", ({ @@ -282,7 +91,7 @@ MAKE_CMD(ping, "", "", /* Dout */ MAKE_CMD(dout, "d", "", ({ - kfile_putc((uint8_t)args[1].l, &fd_sipo.fd); + kfile_putc((uint8_t)args[1].l, &local_sipo->fd); //Store status of dout ports. reg_status_dout = (uint8_t)args[1].l; @@ -321,7 +130,6 @@ MAKE_CMD(din, "", "d", }), 0) - /* Ain */ MAKE_CMD(ain, "", ADC_FORMAT_STR, ({ @@ -340,14 +148,12 @@ MAKE_CMD(beep, "d", "", }), 0) /* Register commands. */ -static void protocol_registerCmds(void) +void cmd_register(void) { REGISTER_CMD(ver); REGISTER_CMD(sleep); REGISTER_CMD(ping); REGISTER_CMD(dout); - //Set off all dout ports. - reg_status_dout = 0; REGISTER_CMD(rdout); REGISTER_CMD(reset); REGISTER_CMD(din); @@ -355,29 +161,9 @@ static void protocol_registerCmds(void) REGISTER_CMD(beep); } -/* Initialization: readline context, parser and register commands. */ -void protocol_init(KFile *fd) +void cmd_init(Sipo *sipo) { - /* SPI Port Initialization */ - fd_sipo.load_device = TRIFACE_DOUT; - fd_sipo.bit_order = SIPO_DATAORDER_LSB; - fd_sipo.clock_pol = SIPO_START_LOW; - fd_sipo.load_pol = SIPO_LOW_TO_HIGH; - - sipo_init(&fd_sipo); - - interactive = FORCE_INTERACTIVE; - - rl_init_ctx(&rl_ctx); - //rl_setprompt(&rl_ctx, ">> "); - rl_sethook_get(&rl_ctx, (getc_hook)kfile_getc, fd); - rl_sethook_put(&rl_ctx, (putc_hook)kfile_putc, fd); - rl_sethook_match(&rl_ctx, parser_rl_match, NULL); - rl_sethook_clear(&rl_ctx, (clear_hook)kfile_clearerr,fd); - - parser_init(); - - protocol_registerCmds(); - - protocol_prompt(fd); + ASSERT(sipo); + local_sipo = sipo; + reg_status_dout = 0; } diff --git a/boards/triface/examples/triface/cmd.h b/boards/triface/examples/triface/cmd.h index e3c95b4e..138da4d0 100644 --- a/boards/triface/examples/triface/cmd.h +++ b/boards/triface/examples/triface/cmd.h @@ -26,7 +26,7 @@ * invalidate any other reasons why the executable file might be covered by * the GNU General Public License. * - * Copyright 2003, 2004, 2006 Develer S.r.l. (http://www.develer.com/) + * Copyright 2003, 2004, 2006, 2012 Develer S.r.l. (http://www.develer.com/) * Copyright 2000 Bernie Innocenti * * --> @@ -37,14 +37,12 @@ */ -#ifndef PROTOCOL_H -#define PROTOCOL_H +#ifndef TRIFACE_CMD_H +#define TRIFACE_CMD_H #include -#include +void cmd_register(void); +void cmd_init(Sipo *sipo); -void protocol_init(KFile *fd); -void protocol_run(KFile *fd); - -#endif // PROTOOCOL_H +#endif /* TRIFACE_CMD_H */ diff --git a/boards/triface/examples/triface/main.c b/boards/triface/examples/triface/main.c index 045e6522..1638f148 100644 --- a/boards/triface/examples/triface/main.c +++ b/boards/triface/examples/triface/main.c @@ -26,7 +26,7 @@ * invalidate any other reasons why the executable file might be covered by * the GNU General Public License. * - * Copyright 2003, 2004, 2006, 2008, 2010 Develer S.r.l. (http://www.develer.com/) + * Copyright 2003, 2004, 2006, 2008, 2010, 2012 Develer S.r.l. (http://www.develer.com/) * Copyright 2000 Bernie Innocenti * * --> @@ -49,7 +49,7 @@ * the automatic opendoor, reading the tag key that will pass on the rfid reader. */ -#include "protocol.h" +#include "cmd.h" #include "hw/hw_input.h" @@ -62,10 +62,13 @@ #include #include + #include +#include static Serial fd_ser; static Serial tag_ser; +static Sipo fd_sipo; static void init(void) { @@ -87,6 +90,9 @@ int main(void) /* Initialize Tag serial port and data structure */ TagPacket pkt; + /* SPI Port Initialization */ + sipo_init(&fd_sipo, TRIFACE_DOUT, SIPO_DATAORDER_LSB | SIPO_START_LOW | SIPO_LOW_TO_HIGH); + /* Open the main communication port */ ser_init(&fd_ser, SER_UART1); ser_setbaudrate(&fd_ser, 115200); @@ -98,7 +104,7 @@ int main(void) /* Init the tag parser */ keytag_init(&pkt, &fd_ser.fd, &tag_ser.fd); - protocol_init(&fd_ser.fd); + protocol_init(&fd_ser.fd, cmd_register); while (1) { diff --git a/boards/triface/examples/triface/triface_user.mk b/boards/triface/examples/triface/triface_user.mk index 2f52da95..8c38f816 100644 --- a/boards/triface/examples/triface/triface_user.mk +++ b/boards/triface/examples/triface/triface_user.mk @@ -10,7 +10,8 @@ triface_PROGRAMMER_PORT = none # Files included by the user. triface_USER_CSRC = \ $(triface_SRC_PATH)/main.c \ - $(triface_SRC_PATH)/protocol.c \ + $(triface_SRC_PATH)/cmd.c \ + bertos/net/protocol.c \ # # Files included by the user. -- 2.25.1