[tuxdroid-svn] r1139 - software_suite_v2/middleware/tuxdriver/trunk/src
Status: Beta
Brought to you by:
ks156
From: eFfeM <c2m...@c2...> - 2008-05-12 08:04:05
|
Author: eFfeM Date: 2008-05-12 10:03:59 +0200 (Mon, 12 May 2008) New Revision: 1139 Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_cmd_parser.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_mouth.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_types.h Log: made individual data structures for all sub_command types (see comment in tux_types.h) fixed a few bugs removed a few forgotten debug fprintf's 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-08 16:40:57 UTC (rev 1138) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_cmd_parser.c 2008-05-12 08:03:59 UTC (rev 1139) @@ -272,7 +272,7 @@ else if (strcmp(tokens[2], "MUTE") == 0) { cmd->sub_command = MUTE; - if (str_to_bool(tokens[3], &cmd->audio_parameters.muteflag)) + if (str_to_bool(tokens[3], &cmd->audio_mute_parameters.muteflag)) { // write to struct ret = E_TUXDRV_NOERROR; @@ -302,8 +302,8 @@ else if (strcmp(tokens[2], "ON") == 0) { cmd->sub_command = ON; - if (str_to_uint8(tokens[3], &cmd->eyes_parameters.nr_movements) && - str_to_state_t(tokens[4], &cmd->eyes_parameters.state)) + if (str_to_uint8(tokens[3], &cmd->eyes_on_parameters.nr_movements) && + str_to_state_t(tokens[4], &cmd->eyes_on_parameters.state)) { ret = E_TUXDRV_NOERROR; } @@ -311,8 +311,8 @@ else if (strcmp(tokens[2], "ON_DURING") == 0) { cmd->sub_command = ON_DURING; - if (str_to_float(tokens[3], &cmd->eyes_parameters.duration) && - str_to_state_t(tokens[4], &cmd->eyes_parameters.state)) + if (str_to_float(tokens[3], &cmd->eyes_on_during_parameters.duration) && + str_to_state_t(tokens[4], &cmd->eyes_on_during_parameters.state)) { ret = E_TUXDRV_NOERROR; } @@ -346,8 +346,8 @@ else if (strcmp(tokens[2], "SEND") == 0) { cmd->sub_command = SEND; - if (str_to_uint8(tokens[3], &cmd->ir_parameters.address) && - str_to_uint8(tokens[4], &cmd->ir_parameters.command)) + if (str_to_uint8(tokens[3], &cmd->ir_send_parameters.address) && + str_to_uint8(tokens[4], &cmd->ir_send_parameters.command)) { ret = E_TUXDRV_NOERROR; } @@ -363,51 +363,58 @@ parse_tux_led_command(tokens_t tokens, delay_cmd_t *cmd) { TuxDrvError ret = E_TUXDRV_INVALIDCOMMAND; - if (str_to_leds_t(tokens[3], &cmd->led_parameters.leds)) + if (strcmp(tokens[2], "BLINK") == 0) { - if (strcmp(tokens[2], "BLINK") == 0) + cmd->sub_command = BLINK; + if (str_to_leds_t(tokens[3], &cmd->led_blink_parameters.leds) && + str_to_uint8(tokens[4], &cmd->led_blink_parameters.pulse_count) && + str_to_float(tokens[5], &cmd->led_blink_parameters.pulse_period)) { - cmd->sub_command = BLINK; - if (str_to_uint8(tokens[4], &cmd->led_parameters.nr_blinks) && - str_to_float(tokens[5], &cmd->led_parameters.duration)) - { - ret = E_TUXDRV_NOERROR; - } + ret = E_TUXDRV_NOERROR; } - else if (strcmp(tokens[2], "OFF") == 0) + } + else if (strcmp(tokens[2], "OFF") == 0) + { + cmd->sub_command = OFF; + if (str_to_leds_t(tokens[3], &cmd->led_off_parameters.leds)) { - cmd->sub_command = OFF; ret = E_TUXDRV_NOERROR; } - else if (strcmp(tokens[2], "ON") == 0) + } + else if (strcmp(tokens[2], "ON") == 0) + { + cmd->sub_command = ON; + if (str_to_leds_t(tokens[3], &cmd->led_on_parameters.leds) && + str_to_float(tokens[4], &cmd->led_on_parameters.intensity)) { - cmd->sub_command = ON; ret = E_TUXDRV_NOERROR; } - else if (strcmp(tokens[2], "PULSE") == 0) + } + else if (strcmp(tokens[2], "PULSE") == 0) + { + cmd->sub_command = PULSE; + if (str_to_leds_t(tokens[3], &cmd->led_pulse_parameters.leds) && + str_to_float(tokens[4], &cmd->led_pulse_parameters.min_intensity) && + str_to_float(tokens[5], &cmd->led_pulse_parameters.max_intensity) && + str_to_uint8(tokens[6], &cmd->led_pulse_parameters.pulse_count) && + str_to_float(tokens[7], &cmd->led_pulse_parameters.pulse_period) && + str_to_effect_type(tokens[8], &cmd->led_pulse_parameters.effect_type) && + str_to_float(tokens[9], &cmd->led_pulse_parameters.effect_speed) && + str_to_uint8(tokens[10], &cmd->led_pulse_parameters.effect_step)) { - cmd->sub_command = PULSE; - if (str_to_float(tokens[4], &cmd->led_parameters.min_intensity) && - str_to_float(tokens[5], &cmd->led_parameters.max_intensity) && - str_to_uint8(tokens[6], &cmd->led_parameters.pulse_count) && - str_to_float(tokens[7], &cmd->led_parameters.pulse_period) && - str_to_effect_type(tokens[8], &cmd->led_parameters.effect_type) && - str_to_float(tokens[9], &cmd->led_parameters.effect_speed) && - str_to_uint8(tokens[10], &cmd->led_parameters.effect_step)) - { - ret = E_TUXDRV_NOERROR; - } + ret = E_TUXDRV_NOERROR; } - else if (strcmp(tokens[2], "SET") == 0) + } + else if (strcmp(tokens[2], "SET") == 0) + { + cmd->sub_command = SET; + if (str_to_leds_t(tokens[3], &cmd->led_set_parameters.leds) && + str_to_float(tokens[4], &cmd->led_set_parameters.intensity) && + str_to_effect_type(tokens[5], &cmd->led_set_parameters.effect_type) && + str_to_float(tokens[6], &cmd->led_set_parameters.effect_speed) && + str_to_uint8(tokens[7], &cmd->led_set_parameters.effect_step)) { - cmd->sub_command = SET; - if (str_to_float(tokens[4], &cmd->led_parameters.intensity) && - str_to_effect_type(tokens[5], &cmd->led_parameters.effect_type) && - str_to_float(tokens[6], &cmd->led_parameters.effect_speed) && - str_to_uint8(tokens[7], &cmd->led_parameters.effect_step)) - { - ret = E_TUXDRV_NOERROR; - } + ret = E_TUXDRV_NOERROR; } } return ret; @@ -434,8 +441,8 @@ else if (strcmp(tokens[2], "ON") == 0) { cmd->sub_command = ON; - if (str_to_uint8(tokens[3], &cmd->mouth_parameters.nr_movements) && - str_to_state_t(tokens[4], &cmd->mouth_parameters.state)) + if (str_to_uint8(tokens[3], &cmd->mouth_on_parameters.nr_movements) && + str_to_state_t(tokens[4], &cmd->mouth_on_parameters.state)) { ret = E_TUXDRV_NOERROR; } @@ -443,8 +450,8 @@ else if (strcmp(tokens[2], "ON_DURING") == 0) { cmd->sub_command = ON_DURING; - if (str_to_float(tokens[3], &cmd->mouth_parameters.duration) && - str_to_state_t(tokens[4], &cmd->mouth_parameters.state)) + if (str_to_float(tokens[3], &cmd->mouth_on_during_parameters.duration) && + str_to_state_t(tokens[4], &cmd->mouth_on_during_parameters.state)) { ret = E_TUXDRV_NOERROR; } @@ -468,8 +475,8 @@ if (strcmp(tokens[2], "PLAY") == 0) { cmd->sub_command = PLAY; - if (str_to_uint8(tokens[3], &cmd->sound_flash_parameters.track) && - str_to_float(tokens[4], &cmd->sound_flash_parameters.volume)) + if (str_to_uint8(tokens[3], &cmd->sound_flash_play_parameters.track) && + str_to_float(tokens[4], &cmd->sound_flash_play_parameters.volume)) { ret = E_TUXDRV_NOERROR; } @@ -488,7 +495,7 @@ if (strcmp(tokens[2], "LEFT_ON") == 0) { cmd->sub_command = LEFT_ON; - if (str_to_uint8(tokens[3], &cmd->spinning_parameters.nr_qturns)) + if (str_to_uint8(tokens[3], &cmd->spinning_on_parameters.nr_qturns)) { ret = E_TUXDRV_NOERROR; } @@ -496,7 +503,7 @@ else if (strcmp(tokens[2], "LEFT_ON_DURING") == 0) { cmd->sub_command = LEFT_ON_DURING; - if (str_to_float(tokens[3], &cmd->spinning_parameters.duration)) + if (str_to_float(tokens[3], &cmd->spinning_on_during_parameters.duration)) { ret = E_TUXDRV_NOERROR; } @@ -504,7 +511,7 @@ else if (strcmp(tokens[2], "RIGHT_ON") == 0) { cmd->sub_command = RIGHT_ON; - if (str_to_uint8(tokens[3], &cmd->spinning_parameters.nr_qturns)) + if (str_to_uint8(tokens[3], &cmd->spinning_on_parameters.nr_qturns)) { ret = E_TUXDRV_NOERROR; } @@ -512,7 +519,7 @@ else if (strcmp(tokens[2], "RIGHT_ON_DURING") == 0) { cmd->sub_command = RIGHT_ON_DURING; - if (str_to_float(tokens[3], &cmd->spinning_parameters.duration)) + if (str_to_float(tokens[3], &cmd->spinning_on_during_parameters.duration)) { ret = E_TUXDRV_NOERROR; } @@ -525,7 +532,7 @@ else if (strcmp(tokens[2], "SPEED") == 0) { cmd->sub_command = SPEED; - if (str_to_uint8(tokens[3], &cmd->spinning_parameters.speed)) + if (str_to_uint8(tokens[3], &cmd->spinning_speed_parameters.speed)) { ret = E_TUXDRV_NOERROR; } @@ -554,8 +561,8 @@ else if (strcmp(tokens[2], "ON") == 0) { cmd->sub_command = ON; - if (str_to_uint8(tokens[3], &cmd->wings_parameters.nr_movements) && - str_to_state_t(tokens[4], &cmd->wings_parameters.state)) + if (str_to_uint8(tokens[3], &cmd->wings_on_parameters.nr_movements) && + str_to_state_t(tokens[4], &cmd->wings_on_parameters.state)) { ret = E_TUXDRV_NOERROR; } @@ -563,10 +570,9 @@ else if (strcmp(tokens[2], "ON_DURING") == 0) { cmd->sub_command = ON_DURING; - if (str_to_float(tokens[3], &cmd->wings_parameters.duration) && - str_to_state_t(tokens[4], &cmd->wings_parameters.state)) + if (str_to_float(tokens[3], &cmd->wings_on_during_parameters.duration) && + str_to_state_t(tokens[4], &cmd->wings_on_during_parameters.state)) { - fprintf(stderr, "parse duration = %f\n", cmd->wings_parameters.duration); ret = E_TUXDRV_NOERROR; } cmd->sub_command = ON_DURING; @@ -580,7 +586,7 @@ else if (strcmp(tokens[2], "SPEED") == 0) { cmd->sub_command = SPEED; - if (str_to_uint8(tokens[3], &cmd->wings_parameters.speed)) + if (str_to_uint8(tokens[3], &cmd->wings_speed_parameters.speed)) { ret = E_TUXDRV_NOERROR; } @@ -711,7 +717,7 @@ tux_audio_cmd_channel_tts(); break; case MUTE: - tux_audio_cmd_mute(cmd->audio_parameters.muteflag); + tux_audio_cmd_mute(cmd->audio_mute_parameters.muteflag); break; default: /* should not occur */ log_error("execute invalid audio command"); @@ -727,13 +733,13 @@ switch (cmd->sub_command) { case ON: tux_eyes_cmd_on( - cmd->eyes_parameters.nr_movements, - cmd->eyes_parameters.state); + cmd->eyes_on_parameters.nr_movements, + cmd->eyes_on_parameters.state); break; case ON_DURING: tux_eyes_cmd_on_during( - cmd->eyes_parameters.duration, - cmd->eyes_parameters.state); + cmd->eyes_on_during_parameters.duration, + cmd->eyes_on_during_parameters.state); break; case OPEN: tux_eyes_cmd_open(); @@ -763,8 +769,8 @@ tux_user_inputs_cmd_ir_off(); case SEND: tux_user_inputs_cmd_ir_send( - cmd->ir_parameters.address, - cmd->ir_parameters.command); + cmd->ir_send_parameters.address, + cmd->ir_send_parameters.command); break; default: /* should not occur */ log_error("execute invalid ir command"); @@ -780,15 +786,15 @@ switch (cmd->sub_command) { case ON: tux_leds_cmd_set( - cmd->led_parameters.leds, - cmd->led_parameters.intensity, + cmd->led_on_parameters.leds, + cmd->led_on_parameters.intensity, NONE, 0, 0); break; case OFF: tux_leds_cmd_set( - cmd->led_parameters.leds, + cmd->led_off_parameters.leds, 0.0, NONE, 0, @@ -796,33 +802,33 @@ break; case PULSE: tux_leds_cmd_pulse( - cmd->led_parameters.leds, - cmd->led_parameters.min_intensity, - cmd->led_parameters.max_intensity, - cmd->led_parameters.pulse_count, - cmd->led_parameters.pulse_period, - cmd->led_parameters.effect_type, - cmd->led_parameters.effect_speed, - cmd->led_parameters.effect_step); + cmd->led_pulse_parameters.leds, + cmd->led_pulse_parameters.min_intensity, + cmd->led_pulse_parameters.max_intensity, + cmd->led_pulse_parameters.pulse_count, + cmd->led_pulse_parameters.pulse_period, + cmd->led_pulse_parameters.effect_type, + cmd->led_pulse_parameters.effect_speed, + cmd->led_pulse_parameters.effect_step); break; case BLINK: tux_leds_cmd_pulse( - cmd->led_parameters.leds, + cmd->led_blink_parameters.leds, 0.0, 1.0, - cmd->led_parameters.pulse_count, - cmd->led_parameters.pulse_period, + cmd->led_blink_parameters.pulse_count, + cmd->led_blink_parameters.pulse_period, NONE, 0, 0); break; case SET: tux_leds_cmd_set( - cmd->led_parameters.leds, - cmd->led_parameters.intensity, - cmd->led_parameters.effect_type, - cmd->led_parameters.effect_speed, - cmd->led_parameters.effect_step); + cmd->led_set_parameters.leds, + cmd->led_set_parameters.intensity, + cmd->led_set_parameters.effect_type, + cmd->led_set_parameters.effect_speed, + cmd->led_set_parameters.effect_step); break; default: /* should not occur */ log_error("execute invalid led command"); @@ -838,13 +844,13 @@ switch (cmd->sub_command) { case ON: tux_mouth_cmd_on( - cmd->mouth_parameters.nr_movements, - cmd->mouth_parameters.state); + cmd->mouth_on_parameters.nr_movements, + cmd->mouth_on_parameters.state); break; case ON_DURING: tux_mouth_cmd_on_during( - cmd->mouth_parameters.duration, - cmd->mouth_parameters.state); + cmd->mouth_on_during_parameters.duration, + cmd->mouth_on_during_parameters.state); break; case OPEN: tux_mouth_cmd_open(); @@ -869,8 +875,8 @@ switch (cmd->sub_command) { case PLAY: tux_sound_flash_cmd_play( - cmd->sound_flash_parameters.track, - cmd->sound_flash_parameters.volume); + cmd->sound_flash_play_parameters.track, + cmd->sound_flash_play_parameters.volume); break; default: /* should not occur */ log_error("execute invalid sound flash command"); @@ -885,22 +891,22 @@ { switch (cmd->sub_command) { case LEFT_ON: - tux_spinning_cmd_left_on(cmd->spinning_parameters.nr_qturns); + tux_spinning_cmd_left_on(cmd->spinning_on_parameters.nr_qturns); break; case RIGHT_ON: - tux_spinning_cmd_right_on(cmd->spinning_parameters.nr_qturns); + tux_spinning_cmd_right_on(cmd->spinning_on_parameters.nr_qturns); break; case LEFT_ON_DURING: - tux_spinning_cmd_left_on_during(cmd->spinning_parameters.duration); + tux_spinning_cmd_left_on_during(cmd->spinning_on_during_parameters.duration); break; case RIGHT_ON_DURING: - tux_spinning_cmd_right_on_during(cmd->spinning_parameters.duration); + tux_spinning_cmd_right_on_during(cmd->spinning_on_during_parameters.duration); break; case OFF: tux_spinning_cmd_off(); break; case SPEED: - tux_spinning_cmd_speed(cmd->spinning_parameters.speed); + tux_spinning_cmd_speed(cmd->spinning_speed_parameters.speed); break; default: /* should not occur */ log_error("execute invalid spinning command"); @@ -916,14 +922,13 @@ switch (cmd->sub_command) { case ON: tux_wings_cmd_on( - cmd->wings_parameters.nr_movements, - cmd->wings_parameters.state); + cmd->wings_on_parameters.nr_movements, + cmd->wings_on_parameters.state); break; case ON_DURING: - fprintf(stderr, "duration = %f\n", cmd->wings_parameters.duration); tux_wings_cmd_on_during( - cmd->wings_parameters.duration, - cmd->wings_parameters.state); + cmd->wings_on_during_parameters.duration, + cmd->wings_on_during_parameters.state); break; case OFF: tux_wings_cmd_off(); @@ -935,7 +940,7 @@ tux_wings_cmd_down(); break; case SPEED: - tux_wings_cmd_speed(cmd->wings_parameters.speed); + tux_wings_cmd_speed(cmd->wings_speed_parameters.speed); break; default: /* should not occur */ log_error("execute invalid wings command"); @@ -1120,7 +1125,6 @@ { if (curtime >= user_cmd_stack.cmd_list[i].timeout) { - fprintf(stderr, "executing user command %d\n", i); execute_command(&user_cmd_stack.cmd_list[i]); /* next two commands are faster than a memset writing a null byte to the first char of cmd is sufficient @@ -1134,7 +1138,6 @@ { if (curtime >= sys_cmd_stack.cmd_list[i].timeout) { - fprintf(stderr, "executing system command %d\n", i); execute_command(&sys_cmd_stack.cmd_list[i]); sys_cmd_stack.cmd_list[i].timeout = 0; sys_cmd_stack.cmd_list[i].command_group = NO_CMD; Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_mouth.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_mouth.c 2008-05-08 16:40:57 UTC (rev 1138) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_mouth.c 2008-05-12 08:03:59 UTC (rev 1139) @@ -118,19 +118,15 @@ switch (final_state) { case FINAL_ST_UNDEFINED: - fprintf(stderr, "1"); cmd.sub_command = OFF; break; case FINAL_ST_OPEN_UP: - fprintf(stderr, "2"); cmd.sub_command = OPEN; break; case FINAL_ST_CLOSE_DOWN: - fprintf(stderr, "3"); cmd.sub_command = CLOSE; break; case FINAL_ST_STOP: - fprintf(stderr, "4"); cmd.sub_command = OFF; break; } Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_types.h =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_types.h 2008-05-08 16:40:57 UTC (rev 1138) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_types.h 2008-05-12 08:03:59 UTC (rev 1139) @@ -29,12 +29,14 @@ #define CMDSIZE 1024 +/* command groups */ typedef enum { NO_CMD = 0, TUX_CMD, RAW_CMD } tux_command_group_t; +/* commands */ typedef enum { AUDIO, EYES, @@ -46,6 +48,7 @@ WINGS } tux_command_t; +/* subcommands */ typedef enum { BLINK, CHANNEL_GENERAL, @@ -69,26 +72,55 @@ UP } tux_sub_command_t; +/* + The data structures for the invididual commands. + It was decided to make separate structures for each subcommand + (instead of e.g. clubbing all parameters together) + Rationale: + separate structures make it more straigthforward to add a new subcommand. + separate structures make it simpler to create a C api. + depending on the compiler this could also result in stricter type + checking + For now the types are not used to communicate between parser and + individual functions. + Note that storage waste by duplicate data fields is recouped + as all data is in a union +*/ + +/* audio */ typedef struct { bool muteflag; -} audio_parameters_t; +} audio_mute_parameters_t; +/* eyes */ typedef struct { + move_final_state_t state; unsigned char nr_movements; +} eyes_on_parameters_t; + +typedef struct { move_final_state_t state; float duration; -} eyes_parameters_t; +} eyes_on_during_parameters_t; +/* ir */ typedef struct { unsigned char address; unsigned char command; -} ir_parameters_t; +} ir_send_parameters_t; +/* leds */ typedef struct { leds_t leds; - unsigned char nr_blinks; - float duration; float intensity; +} led_on_parameters_t; + +typedef struct { + leds_t leds; +} led_off_parameters_t; + +typedef struct { + leds_t leds; float min_intensity; float max_intensity; unsigned char pulse_count; @@ -96,39 +128,76 @@ effect_type_t effect_type; float effect_speed; unsigned char effect_step; -} led_parameters_t; +} led_pulse_parameters_t; typedef struct { + leds_t leds; + unsigned char pulse_count; + float pulse_period; +} led_blink_parameters_t; + +typedef struct { + leds_t leds; + float intensity; + effect_type_t effect_type; + float effect_speed; + unsigned char effect_step; +} led_set_parameters_t; + +/* mouth */ +typedef struct { + move_final_state_t state; unsigned char nr_movements; +} mouth_on_parameters_t; + +typedef struct { move_final_state_t state; float duration; -} mouth_parameters_t; +} mouth_on_during_parameters_t; +/* sound flash */ typedef struct { unsigned char track; float volume; -} sound_flash_parameters_t; +} sound_flash_play_parameters_t; +/* spinning */ typedef struct { unsigned char nr_qturns; +} spinning_on_parameters_t; + +typedef struct { float duration; +} spinning_on_during_parameters_t; + +typedef struct { unsigned char speed; -} spinning_parameters_t; +} spinning_speed_parameters_t; +/* wings */ typedef struct { + move_final_state_t state; unsigned char nr_movements; +} wings_on_parameters_t; + +typedef struct { move_final_state_t state; float duration; +} wings_on_during_parameters_t; + +typedef struct { unsigned char speed; -} wings_parameters_t; +} wings_speed_parameters_t; +/* raw */ 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) + this is the struct which contains all commands and arguments + the union is there to save storage + based upon command/sub_command we exactly know which union field we need */ typedef struct { double timeout; @@ -136,15 +205,25 @@ 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; + audio_mute_parameters_t audio_mute_parameters; + eyes_on_parameters_t eyes_on_parameters; + eyes_on_during_parameters_t eyes_on_during_parameters; + ir_send_parameters_t ir_send_parameters; + led_on_parameters_t led_on_parameters; + led_off_parameters_t led_off_parameters; + led_pulse_parameters_t led_pulse_parameters; + led_blink_parameters_t led_blink_parameters; + led_set_parameters_t led_set_parameters; + mouth_on_parameters_t mouth_on_parameters; + mouth_on_during_parameters_t mouth_on_during_parameters; + sound_flash_play_parameters_t sound_flash_play_parameters; + spinning_on_parameters_t spinning_on_parameters; + spinning_on_during_parameters_t spinning_on_during_parameters; + spinning_speed_parameters_t spinning_speed_parameters; + wings_on_parameters_t wings_on_parameters; + wings_on_during_parameters_t wings_on_during_parameters; + wings_speed_parameters_t wings_speed_parameters; + raw_parameters_t raw_parameters; }; } delay_cmd_t; |