[tuxdroid-svn] r1099 - software_suite_v2/middleware/tuxdriver/trunk/src
Status: Beta
Brought to you by:
ks156
From: eFfeM <c2m...@c2...> - 2008-05-04 20:42:41
|
Author: eFfeM Date: 2008-05-04 22:42:43 +0200 (Sun, 04 May 2008) New Revision: 1099 Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_cmd_parser.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_types.h Log: intermediate commit for the new parser code (fully functional) Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_cmd_parser.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_cmd_parser.c 2008-05-04 19:01:13 UTC (rev 1098) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_cmd_parser.c 2008-05-04 20:42:43 UTC (rev 1099) @@ -777,18 +777,46 @@ it is a valid command when executing the command does not need to be parsed any more but can be executed directly + +todo: +define data structure for parameters +write data to parameters +some functions do not have a check for correctness +(reading effect_type and final_state); +add execute function +remove old code (cmd param in struct, old parsing code etc) */ + /** * */ static TuxDrvError -parse_tux_audio_command(const char *cmd_str, delay_cmd_t *cmd) +parse_tux_audio_command(tokens_t tokens, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; - char *p; - int len; + if (strcmp(tokens[2], "CHANNEL_GENERAL") == 0) + { + cmd->sub_command = CHANNEL_GENERAL; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "CHANNEL_TTS") == 0) + { + cmd->sub_command = CHANNEL_TTS; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "MUTE") == 0) + { + bool value; + + cmd->sub_command = MUTE; + if (str_to_bool(tokens[3], &value)) + { + // write to struct + ret = E_TUXDRV_NOERROR; + } + } return ret; } @@ -796,12 +824,53 @@ * */ static TuxDrvError -parse_tux_eyes_command(const char *cmd_str, delay_cmd_t *cmd) +parse_tux_eyes_command(tokens_t tokens, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; - char *p; - int len; + if (strcmp(tokens[2], "CLOSE") == 0) + { + cmd->sub_command = CLOSE; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "OFF") == 0) + { + cmd->sub_command = OFF; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "ON") == 0) + { + unsigned char counter; + + cmd->sub_command = ON; + if (str_to_uint8(tokens[3], &counter)) + { + unsigned char final_state; + + final_state = tux_movement_conststr_to_val(tokens[4]); + // write to struct + ret = E_TUXDRV_NOERROR; + } + } + else if (strcmp(tokens[2], "ON_DURING") == 0) + { + float timeout = 0; + + cmd->sub_command = ON_DURING; + if (str_to_float(tokens[3], &timeout)) + { + unsigned char final_state; + + final_state = tux_movement_conststr_to_val(tokens[4]); + // write to struct + ret = E_TUXDRV_NOERROR; + } + } + else if (strcmp(tokens[2], "OPEN") == 0) + { + cmd->sub_command = OPEN; + ret = E_TUXDRV_NOERROR; + } return ret; } @@ -809,12 +878,34 @@ * */ static TuxDrvError -parse_tux_ir_command(const char *cmd_str, delay_cmd_t *cmd) +parse_tux_ir_command(tokens_t tokens, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; - char *p; - int len; + if (strcmp(tokens[2], "ON") == 0) + { + cmd->sub_command = ON; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "OFF") == 0) + { + cmd->sub_command = OFF; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "SEND") == 0) + { + cmd->sub_command = SEND; + unsigned char address; + unsigned char command; + + // write to struct + if (str_to_uint8(tokens[3], &address) && + str_to_uint8(tokens[4], &command)) + { + ret = E_TUXDRV_NOERROR; + } + } + return ret; } @@ -822,12 +913,72 @@ * */ static TuxDrvError -parse_tux_led_command(const char *cmd_str, delay_cmd_t *cmd) +parse_tux_led_command(tokens_t tokens, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; - char *p; - int len; + leds_t leds; + leds = conststr_to_ledval(tokens[3]); // check if ok + if (strcmp(tokens[2], "BLINK") == 0) + { + unsigned char pulse_count; + float pulse_period; + + cmd->sub_command = BLINK; + if (str_to_uint8(tokens[4], &pulse_count) && + str_to_float(tokens[5], &pulse_period)) + { + ret = E_TUXDRV_NOERROR; + } + } + else if (strcmp(tokens[2], "OFF") == 0) + { + cmd->sub_command = OFF; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "ON") == 0) + { + cmd->sub_command = ON; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "PULSE") == 0) + { + float min_intensity; + float max_intensity; + unsigned char pulse_count; + float pulse_period; + unsigned char effect_type; + float effect_speed; + unsigned char effect_step; + + cmd->sub_command = PULSE; + effect_type = conststr_to_effectval(tokens[8]); + if (str_to_float(tokens[4], &min_intensity) && + str_to_float(tokens[5], &max_intensity) && + str_to_uint8(tokens[6], &pulse_count) && + str_to_float(tokens[7], &pulse_period) && + str_to_float(tokens[9], &effect_speed) && + str_to_uint8(tokens[10], &effect_step)) + { + ret = E_TUXDRV_NOERROR; + } + } + else if (strcmp(tokens[2], "SET") == 0) + { + float intensity; + unsigned char effect_type; + float effect_speed; + unsigned char effect_step; + + cmd->sub_command = SET; + effect_type = conststr_to_effectval(tokens[5]); + if (str_to_float(tokens[4], &intensity) && + str_to_float(tokens[6], &effect_speed) && + str_to_uint8(tokens[7], &effect_step)) + { + ret = E_TUXDRV_NOERROR; + } + } return ret; } @@ -835,12 +986,53 @@ * */ static TuxDrvError -parse_tux_mouth_command(const char *cmd_str, delay_cmd_t *cmd) +parse_tux_mouth_command(tokens_t tokens, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; - char *p; - int len; + if (strcmp(tokens[2], "CLOSE") == 0) + { + cmd->sub_command = CLOSE; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "OFF") == 0) + { + cmd->sub_command = OFF; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "ON") == 0) + { + unsigned char counter; + + cmd->sub_command = ON; + if (str_to_uint8(tokens[3], &counter)) + { + unsigned char final_state; + + final_state = tux_movement_conststr_to_val(tokens[4]); + // write to struct + ret = E_TUXDRV_NOERROR; + } + } + else if (strcmp(tokens[2], "ON_DURING") == 0) + { + float timeout = 0; + + cmd->sub_command = ON_DURING; + if (str_to_float(tokens[3], &timeout)) + { + unsigned char final_state; + + final_state = tux_movement_conststr_to_val(tokens[4]); + // write to struct + ret = E_TUXDRV_NOERROR; + } + } + else if (strcmp(tokens[2], "OPEN") == 0) + { + cmd->sub_command = SET; + ret = E_TUXDRV_NOERROR; + } return ret; } @@ -848,12 +1040,22 @@ * */ static TuxDrvError -parse_tux_sound_flash_command(const char *cmd_str, delay_cmd_t *cmd) +parse_tux_sound_flash_command(tokens_t tokens, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; - char *p; - int len; + if (strcmp(tokens[2], "PLAY") == 0) + { + unsigned char track_num = 1; + float volume = 0; + + cmd->sub_command = PLAY; + if (str_to_uint8(tokens[3], &track_num) && + str_to_float(tokens[4], &volume)) + { + ret = E_TUXDRV_NOERROR; + } + } return ret; } @@ -861,12 +1063,65 @@ * */ static TuxDrvError -parse_tux_spinning_command(const char *cmd_str, delay_cmd_t *cmd) +parse_tux_spinning_command(tokens_t tokens, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; - char *p; - int len; + if (strcmp(tokens[2], "LEFT_ON") == 0) + { + unsigned char speed; + + cmd->sub_command = LEFT_ON; + if (str_to_uint8(tokens[3], &speed)) + { + ret = E_TUXDRV_NOERROR; + } + } + else if (strcmp(tokens[2], "LEFT_ON_DURING") == 0) + { + float timeout; + + cmd->sub_command = LEFT_ON_DURING; + if (str_to_float(tokens[3], &timeout)) + { + ret = E_TUXDRV_NOERROR; + } + } + else if (strcmp(tokens[2], "RIGHT_ON") == 0) + { + unsigned char speed; + + cmd->sub_command = RIGHT_ON; + if (str_to_uint8(tokens[3], &speed)) + { + ret = E_TUXDRV_NOERROR; + } + } + else if (strcmp(tokens[2], "RIGHT_ON_DURING") == 0) + { + float timeout; + + cmd->sub_command = RIGHT_ON_DURING; + if (str_to_float(tokens[3], &timeout)) + { + ret = E_TUXDRV_NOERROR; + } + } + else if (strcmp(tokens[2], "OFF") == 0) + { + cmd->sub_command = OFF; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "SPEED") == 0) + { + unsigned char speed; + + cmd->sub_command = SPEED; + if (str_to_uint8(tokens[3], &speed)) + { + ret = E_TUXDRV_NOERROR; + } + } return ret; } @@ -874,12 +1129,65 @@ * */ static TuxDrvError -parse_tux_wings_command(const char *cmd_str, delay_cmd_t *cmd) +parse_tux_wings_command(tokens_t tokens, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; - char *p; - int len; + if (strcmp(tokens[2], "DOWN") == 0) + { + cmd->sub_command = DOWN; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "OFF") == 0) + { + cmd->sub_command = OFF; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "ON") == 0) + { + unsigned char counter; + + cmd->sub_command = ON; + if (str_to_uint8(tokens[3], &counter)) + { + unsigned char final_state; + + final_state = tux_movement_conststr_to_val(tokens[4]); + // write to struct + ret = E_TUXDRV_NOERROR; + } + } + else if (strcmp(tokens[2], "ON_DURING") == 0) + { + float timeout = 0; + + cmd->sub_command = ON_DURING; + if (str_to_float(tokens[3], &timeout)) + { + unsigned char final_state; + + final_state = tux_movement_conststr_to_val(tokens[4]); + // write to struct + ret = E_TUXDRV_NOERROR; + } + cmd->sub_command = ON_DURING; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "UP") == 0) + { + cmd->sub_command = UP; + ret = E_TUXDRV_NOERROR; + } + else if (strcmp(tokens[2], "SPEED") == 0) + { + unsigned char speed; + + cmd->sub_command = SPEED; + if (str_to_uint8(tokens[3], &speed)) + { + ret = E_TUXDRV_NOERROR; + } + } return ret; } @@ -887,54 +1195,49 @@ * */ static TuxDrvError -parse_tux_command(const char *cmd_str, delay_cmd_t *cmd) +parse_tux_command(tokens_t tokens, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; - char *p; - int len; - p = strchr(cmd_str, ':'); - len = p - cmd_str; - - if (strncmp(cmd_str, "AUDIO", len) == 0) + if (strcmp(tokens[1], "AUDIO") == 0) { cmd->command = AUDIO; - ret = parse_tux_audio_command(p, cmd); + ret = parse_tux_audio_command(tokens, cmd); } - else if (strncmp(cmd_str, "EYES", len) == 0) + else if (strcmp(tokens[1], "EYES") == 0) { cmd->command = EYES; - ret = parse_tux_eyes_command(p, cmd); + ret = parse_tux_eyes_command(tokens, cmd); } - else if (strncmp(cmd_str, "IR", len) == 0) + else if (strcmp(tokens[1], "IR") == 0) { cmd->command = IR; - ret = parse_tux_ir_command(p, cmd); + ret = parse_tux_ir_command(tokens, cmd); } - else if (strncmp(cmd_str, "LED", len) == 0) + else if (strcmp(tokens[1], "LED") == 0) { cmd->command = LED; - ret = parse_tux_led_command(p, cmd); + ret = parse_tux_led_command(tokens, cmd); } - else if (strncmp(cmd_str, "MOUTH", len) == 0) + else if (strcmp(tokens[1], "MOUTH") == 0) { cmd->command = MOUTH; - ret = parse_tux_mouth_command(p, cmd); + ret = parse_tux_mouth_command(tokens, cmd); } - else if (strncmp(cmd_str, "SOUND_FLASH", len) == 0) + else if (strcmp(tokens[1], "SOUND_FLASH") == 0) { cmd->command = SOUND_FLASH; - ret = parse_tux_sound_flash_command(p, cmd); + ret = parse_tux_sound_flash_command(tokens, cmd); } - else if (strncmp(cmd_str, "SPINNING", len) == 0) + else if (strcmp(tokens[1], "SPINNING") == 0) { cmd->command = SPINNING; - ret = parse_tux_spinning_command(p, cmd); + ret = parse_tux_spinning_command(tokens, cmd); } - else if (strncmp(cmd_str, "WINGS", len) == 0) + else if (strcmp(tokens[1], "WINGS") == 0) { cmd->command = WINGS; - ret = parse_tux_wings_command(p, cmd); + ret = parse_tux_wings_command(tokens, cmd); } return ret; } @@ -943,16 +1246,13 @@ * */ static TuxDrvError -parse_raw_command(const char *cmd_str, delay_cmd_t *cmd) +parse_raw_command(tokens_t tokens, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; -/* - char *p; - int len; - p = strchr(cmd_str, ':'); - len = p - cmd_str; -*/ + /* + tokens [1] to tokens[6] should be hex + */ ret = E_TUXDRV_NOERROR; return ret; } @@ -964,20 +1264,28 @@ parse_command(const char *cmd_str, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; - char *p; - int len; + tokens_t tokens; + int nr_tokens; + + /* If the parser is not enabled then fail */ + if (!cmd_parser_enable) + { + return E_TUXDRV_PARSERISDISABLED; + } + + log_debug("Parse command : [%s]", cmd_str); + memset(&tokens, 0, sizeof(tokens_t)); + nr_tokens = tux_cmd_parser_get_tokens(cmd_str, &tokens, 32, ":,"); - p = strchr(cmd_str, ':'); - len = p - cmd_str; - if (strncmp(cmd_str, "TUX_CMD", len) == 0) + if (strcmp(tokens[0], "TUX_CMD") == 0) { cmd->command_group = TUX_CMD; - ret = parse_tux_command(p, cmd); + ret = parse_tux_command(tokens, cmd); } - else if (strncmp(cmd_str, "RAW_CMD", len) == 0) + else if (strcmp(tokens[0], "RAW_CMD") == 0) { cmd->command_group = RAW_CMD; - ret = parse_raw_command(p, cmd); + ret = parse_raw_command(tokens, cmd); } return ret; } @@ -996,7 +1304,7 @@ { if (!strcmp(stack->cmd_list[i].cmd, "")) { - parse_command(cmd_str, &(stack->cmd_list[i])); + //parse_command(cmd_str, &(stack->cmd_list[i])); strcpy(stack->cmd_list[i].cmd, cmd_str); stack->cmd_list[i].timeout = delay + curtime; ret = E_TUXDRV_NOERROR; Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_types.h =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_types.h 2008-05-04 19:01:13 UTC (rev 1098) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_types.h 2008-05-04 20:42:43 UTC (rev 1099) @@ -21,6 +21,8 @@ #ifndef _TUX_TYPES_H_ #define _TUX_TYPES_H_ +#include "tux_leds.h" + typedef unsigned char data_frame[4]; typedef unsigned char raw_frame[5]; @@ -29,7 +31,7 @@ typedef enum { TUX_CMD, RAW_CMD -} tux_command_group; +} tux_command_group_t; typedef enum { AUDIO, @@ -40,21 +42,111 @@ SOUND_FLASH, SPINNING, WINGS -} tux_command; +} tux_command_t; typedef enum { - xON, // to be completed -} tux_sub_command; + BLINK, + CHANNEL_GENERAL, + CHANNEL_TTS, + CLOSE, + DOWN, + LEFT_ON, + LEFT_ON_DURING, + MUTE, + OFF, + ON, + ON_DURING, + OPEN, + PLAY, + PULSE, + RIGHT_ON, + RIGHT_ON_DURING, + SEND, + SET, + SPEED, + UP +} tux_sub_command_t; +typedef enum { + CLOSED, + NDEF, + OPENED +} state_t; + +typedef struct { + bool muteflag; +} audio_parameters_t; + +typedef struct { + unsigned char nr_movements; + state_t state; + float duration; +} eyes_parameters_t; + +typedef struct { + unsigned char address; + unsigned char command; +} ir_parameters_t; + +typedef struct { + leds_t leds; + unsigned char nr_blinks; + float duration; + float intensity; + float min_intensity; + float max_intensity; + unsigned char pulse_count; + float pulse_period; + // effect type + float effect_speed; + unsigned char effect_step; +} led_parameters_t; + +typedef struct { + unsigned char nr_movements; + state_t state; +} mouth_parameters_t; + +typedef struct { + unsigned char track; + float volume; +} sound_flash_parameters_t; + +typedef struct { + unsigned char nr_qturns; + float duration; + unsigned char speed; +} spinning_parameters_t; + +typedef struct { + unsigned char nr_movements; + state_t state; +} wings_parameters_t; + +typedef struct { + unsigned char raw[5]; +} raw_parameters_t; + /* this struct is still under development plan is to split cmd into various fields (making it typed) */ typedef struct { double timeout; - tux_command_group command_group; - tux_command command; - tux_sub_command sub_command; + tux_command_group_t command_group; + tux_command_t command; + tux_sub_command_t sub_command; + union { + audio_parameters_t audio_parameters; + eyes_parameters_t eyes_parameters; + ir_parameters_t ir_parameters; + led_parameters_t led_parameters; + mouth_parameters_t mouth_parameters; + sound_flash_parameters_t sound_flash_parameters; + spinning_parameters_t spinning_parameters; + wings_parameters_t wings_parameters; + raw_parameters_t raw_parameters; + } parameters; char cmd[CMDSIZE]; } delay_cmd_t; |