cobboard no move mode
[aversive.git] / projects / microb2010 / cobboard / commands_cobboard.c
index 3c6e3e3..669c4c8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Copyright Droids Corporation (2009)
- * 
+ *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
@@ -17,7 +17,7 @@
  *
  *  Revision : $Id: commands_cobboard.c,v 1.6 2009-11-08 17:25:00 zer0 Exp $
  *
- *  Olivier MATZ <zer0@droids-corp.org> 
+ *  Olivier MATZ <zer0@droids-corp.org>
  */
 
 #include <stdio.h>
@@ -51,8 +51,7 @@
 #include "i2c_protocol.h"
 #include "actuator.h"
 #include "spickle.h"
-
-extern uint16_t state_debug;
+#include "shovel.h"
 
 struct cmd_event_result {
        fixed_string_t arg0;
@@ -67,22 +66,24 @@ static void cmd_event_parsed(void *parsed_result, __attribute__((unused)) void *
        u08 bit=0;
 
        struct cmd_event_result * res = parsed_result;
-       
+
        if (!strcmp_P(res->arg1, PSTR("all"))) {
-               bit = DO_ENCODERS | DO_CS | DO_BD | DO_POWER;
+               bit = 0xFF;
                if (!strcmp_P(res->arg2, PSTR("on")))
                        cobboard.flags |= bit;
                else if (!strcmp_P(res->arg2, PSTR("off")))
                        cobboard.flags &= bit;
                else { /* show */
-                       printf_P(PSTR("encoders is %s\r\n"), 
+                       printf_P(PSTR("encoders is %s\r\n"),
                                 (DO_ENCODERS & cobboard.flags) ? "on":"off");
-                       printf_P(PSTR("cs is %s\r\n"), 
+                       printf_P(PSTR("cs is %s\r\n"),
                                 (DO_CS & cobboard.flags) ? "on":"off");
-                       printf_P(PSTR("bd is %s\r\n"), 
+                       printf_P(PSTR("bd is %s\r\n"),
                                 (DO_BD & cobboard.flags) ? "on":"off");
-                       printf_P(PSTR("power is %s\r\n"), 
+                       printf_P(PSTR("power is %s\r\n"),
                                 (DO_POWER & cobboard.flags) ? "on":"off");
+                       printf_P(PSTR("errblock is %s\r\n"),
+                                (DO_ERRBLOCKING & cobboard.flags) ? "on":"off");
                }
                return;
        }
@@ -96,6 +97,8 @@ static void cmd_event_parsed(void *parsed_result, __attribute__((unused)) void *
                bit = DO_BD;
        else if (!strcmp_P(res->arg1, PSTR("power")))
                bit = DO_POWER;
+       else if (!strcmp_P(res->arg1, PSTR("errblock")))
+               bit = DO_ERRBLOCKING;
 
 
        if (!strcmp_P(res->arg2, PSTR("on")))
@@ -108,13 +111,13 @@ static void cmd_event_parsed(void *parsed_result, __attribute__((unused)) void *
                }
                cobboard.flags &= (~bit);
        }
-       printf_P(PSTR("%s is %s\r\n"), res->arg1, 
+       printf_P(PSTR("%s is %s\r\n"), res->arg1,
                      (bit & cobboard.flags) ? "on":"off");
 }
 
 prog_char str_event_arg0[] = "event";
 parse_pgm_token_string_t cmd_event_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_event_result, arg0, str_event_arg0);
-prog_char str_event_arg1[] = "all#encoders#cs#bd#power";
+prog_char str_event_arg1[] = "all#encoders#cs#bd#power#errblock";
 parse_pgm_token_string_t cmd_event_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_event_result, arg1, str_event_arg1);
 prog_char str_event_arg2[] = "on#off#show";
 parse_pgm_token_string_t cmd_event_arg2 = TOKEN_STRING_INITIALIZER(struct cmd_event_result, arg2, str_event_arg2);
@@ -125,9 +128,9 @@ parse_pgm_inst_t cmd_event = {
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_event,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_event_arg0, 
-               (prog_void *)&cmd_event_arg1, 
-               (prog_void *)&cmd_event_arg2, 
+               (prog_void *)&cmd_event_arg0,
+               (prog_void *)&cmd_event_arg1,
+               (prog_void *)&cmd_event_arg2,
                NULL,
        },
 };
@@ -145,18 +148,18 @@ struct cmd_color_result {
 static void cmd_color_parsed(void *parsed_result, __attribute__((unused)) void *data)
 {
        struct cmd_color_result *res = (struct cmd_color_result *) parsed_result;
-       if (!strcmp_P(res->color, PSTR("red"))) {
-               cobboard.our_color = I2C_COLOR_RED;
+       if (!strcmp_P(res->color, PSTR("yellow"))) {
+               cobboard.our_color = I2C_COLOR_YELLOW;
        }
-       else if (!strcmp_P(res->color, PSTR("green"))) {
-               cobboard.our_color = I2C_COLOR_GREEN;
+       else if (!strcmp_P(res->color, PSTR("blue"))) {
+               cobboard.our_color = I2C_COLOR_BLUE;
        }
        printf_P(PSTR("Done\r\n"));
 }
 
 prog_char str_color_arg0[] = "color";
 parse_pgm_token_string_t cmd_color_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_color_result, arg0, str_color_arg0);
-prog_char str_color_color[] = "green#red";
+prog_char str_color_color[] = "blue#yellow";
 parse_pgm_token_string_t cmd_color_color = TOKEN_STRING_INITIALIZER(struct cmd_color_result, color, str_color_color);
 
 prog_char help_color[] = "Set our color";
@@ -165,8 +168,8 @@ parse_pgm_inst_t cmd_color = {
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_color,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_color_arg0, 
-               (prog_void *)&cmd_color_color, 
+               (prog_void *)&cmd_color_arg0,
+               (prog_void *)&cmd_color_color,
                NULL,
        },
 };
@@ -185,23 +188,22 @@ static void cmd_state1_parsed(void *parsed_result,
                              __attribute__((unused)) void *data)
 {
        struct cmd_state1_result *res = parsed_result;
-       struct i2c_cmd_cobboard_set_mode command;
 
-       if (!strcmp_P(res->arg1, PSTR("init"))) {
+       if (!strcmp_P(res->arg1, PSTR("init")))
                state_init();
-               return;
-       }
-
-       if (!strcmp_P(res->arg1, PSTR("manual")))
-               command.mode = I2C_COBBOARD_MODE_MANUAL;
-       else if (!strcmp_P(res->arg1, PSTR("harvest")))
-               command.mode = I2C_COBBOARD_MODE_HARVEST;
-       state_set_mode(&command);
+       else if (!strcmp_P(res->arg1, PSTR("eject")))
+               state_set_mode(I2C_COBBOARD_MODE_EJECT);
+       else if (!strcmp_P(res->arg1, PSTR("ignore_i2c")))
+               state_set_i2c_ignore(1);
+       else if (!strcmp_P(res->arg1, PSTR("care_i2c")))
+               state_set_i2c_ignore(0);
+
+       /* other commands */
 }
 
 prog_char str_state1_arg0[] = "cobboard";
 parse_pgm_token_string_t cmd_state1_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_state1_result, arg0, str_state1_arg0);
-prog_char str_state1_arg1[] = "init#manual";
+prog_char str_state1_arg1[] = "init#eject#ignore_i2c#care_i2c";
 parse_pgm_token_string_t cmd_state1_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_state1_result, arg1, str_state1_arg1);
 
 prog_char help_state1[] = "set cobboard mode";
@@ -210,8 +212,8 @@ parse_pgm_inst_t cmd_state1 = {
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_state1,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_state1_arg0, 
-               (prog_void *)&cmd_state1_arg1, 
+               (prog_void *)&cmd_state1_arg0,
+               (prog_void *)&cmd_state1_arg1,
                NULL,
        },
 };
@@ -231,26 +233,42 @@ static void cmd_state2_parsed(void *parsed_result,
                              __attribute__((unused)) void *data)
 {
        struct cmd_state2_result *res = parsed_result;
-       struct i2c_cmd_cobboard_set_mode command;
        uint8_t side;
 
        if (!strcmp_P(res->arg2, PSTR("left")))
                side = I2C_LEFT_SIDE;
-       else if (!strcmp_P(res->arg2, PSTR("right")))
+       else
                side = I2C_RIGHT_SIDE;
 
-       if (!strcmp_P(res->arg1, PSTR("yyy"))) {
+       if (!strcmp_P(res->arg1, PSTR("pack"))) {
+               state_set_mode(I2C_COBBOARD_MODE_HARVEST);
+               state_set_spickle(side, 0);
        }
-       else if (!strcmp_P(res->arg1, PSTR("xxx"))) {
+       else if (!strcmp_P(res->arg1, PSTR("deploy"))) {
+               state_set_mode(I2C_COBBOARD_MODE_HARVEST);
+               state_set_spickle(side, I2C_COBBOARD_SPK_DEPLOY);
+       }
+       else if (!strcmp_P(res->arg1, PSTR("harvest"))) {
+               state_set_mode(I2C_COBBOARD_MODE_HARVEST);
+               state_set_spickle(side, I2C_COBBOARD_SPK_DEPLOY |
+                                 I2C_COBBOARD_SPK_AUTOHARVEST);
+       }
+       else if (!strcmp_P(res->arg1, PSTR("deploy_nomove"))) {
+               state_set_mode(I2C_COBBOARD_MODE_HARVEST);
+               state_set_spickle(side, I2C_COBBOARD_SPK_DEPLOY |
+                                 I2C_COBBOARD_SPK_NO_MOVE);
+       }
+       else if (!strcmp_P(res->arg1, PSTR("harvest_nomove"))) {
+               state_set_mode(I2C_COBBOARD_MODE_HARVEST);
+               state_set_spickle(side, I2C_COBBOARD_SPK_DEPLOY |
+                                 I2C_COBBOARD_SPK_AUTOHARVEST |
+                                 I2C_COBBOARD_SPK_NO_MOVE);
        }
-
-
-       state_set_mode(&command);
 }
 
 prog_char str_state2_arg0[] = "cobboard";
 parse_pgm_token_string_t cmd_state2_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_state2_result, arg0, str_state2_arg0);
-prog_char str_state2_arg1[] = "xxx";
+prog_char str_state2_arg1[] = "harvest#deploy#pack#harvest_nomove#deploy_nomove";
 parse_pgm_token_string_t cmd_state2_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_state2_result, arg1, str_state2_arg1);
 prog_char str_state2_arg2[] = "left#right";
 parse_pgm_token_string_t cmd_state2_arg2 = TOKEN_STRING_INITIALIZER(struct cmd_state2_result, arg2, str_state2_arg2);
@@ -261,9 +279,9 @@ parse_pgm_inst_t cmd_state2 = {
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_state2,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_state2_arg0, 
-               (prog_void *)&cmd_state2_arg1, 
-               (prog_void *)&cmd_state2_arg2, 
+               (prog_void *)&cmd_state2_arg0,
+               (prog_void *)&cmd_state2_arg1,
+               (prog_void *)&cmd_state2_arg2,
                NULL,
        },
 };
@@ -279,18 +297,17 @@ struct cmd_state3_result {
 };
 
 /* function called when cmd_state3 is parsed successfully */
-static void cmd_state3_parsed(void *parsed_result, 
+static void cmd_state3_parsed(void *parsed_result,
                              __attribute__((unused)) void *data)
 {
        struct cmd_state3_result *res = parsed_result;
-       struct i2c_cmd_cobboard_set_mode command;
 
        if (!strcmp_P(res->arg1, PSTR("xxx"))) {
                /* xxx = res->arg2 */
        }
        else if (!strcmp_P(res->arg1, PSTR("yyy"))) {
        }
-       state_set_mode(&command);
+       state_set_mode(0);
 }
 
 prog_char str_state3_arg0[] = "cobboard";
@@ -305,9 +322,9 @@ parse_pgm_inst_t cmd_state3 = {
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_state3,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_state3_arg0, 
-               (prog_void *)&cmd_state3_arg1, 
-               (prog_void *)&cmd_state3_arg2, 
+               (prog_void *)&cmd_state3_arg0,
+               (prog_void *)&cmd_state3_arg1,
+               (prog_void *)&cmd_state3_arg2,
                NULL,
        },
 };
@@ -336,7 +353,7 @@ parse_pgm_inst_t cmd_state_machine = {
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_state_machine,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_state_machine_arg0, 
+               (prog_void *)&cmd_state_machine_arg0,
                NULL,
        },
 };
@@ -362,14 +379,14 @@ prog_char str_state_debug_arg0[] = "state_debug";
 parse_pgm_token_string_t cmd_state_debug_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_state_debug_result, arg0, str_state_debug_arg0);
 parse_pgm_token_num_t cmd_state_debug_on = TOKEN_NUM_INITIALIZER(struct cmd_state_debug_result, on, UINT8);
 
-prog_char help_state_debug[] = "Set debug timer for state machine";
+prog_char help_state_debug[] = "Set debug for state machine";
 parse_pgm_inst_t cmd_state_debug = {
        .f = cmd_state_debug_parsed,  /* function to call */
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_state_debug,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_state_debug_arg0, 
-               (prog_void *)&cmd_state_debug_on, 
+               (prog_void *)&cmd_state_debug_arg0,
+               (prog_void *)&cmd_state_debug_on,
                NULL,
        },
 };
@@ -392,11 +409,13 @@ static void cmd_servo_door_parsed(void *parsed_result,
                servo_door_open();
        else if (!strcmp_P(res->arg1, PSTR("closed")))
                servo_door_close();
+       else if (!strcmp_P(res->arg1, PSTR("block")))
+               servo_door_close();
 }
 
 prog_char str_servo_door_arg0[] = "door";
 parse_pgm_token_string_t cmd_servo_door_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_servo_door_result, arg0, str_servo_door_arg0);
-prog_char str_servo_door_arg1[] = "open#closed";
+prog_char str_servo_door_arg1[] = "open#closed#block";
 parse_pgm_token_string_t cmd_servo_door_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_servo_door_result, arg1, str_servo_door_arg1);
 
 prog_char help_servo_door[] = "Servo door function";
@@ -405,8 +424,95 @@ parse_pgm_inst_t cmd_servo_door = {
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_servo_door,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_servo_door_arg0, 
-               (prog_void *)&cmd_servo_door_arg1, 
+               (prog_void *)&cmd_servo_door_arg0,
+               (prog_void *)&cmd_servo_door_arg1,
+               NULL,
+       },
+};
+
+/**********************************************************/
+/* cobroller */
+
+/* this structure is filled when cmd_cobroller is parsed successfully */
+struct cmd_cobroller_result {
+       fixed_string_t arg0;
+       fixed_string_t arg1;
+       fixed_string_t arg2;
+};
+
+/* function called when cmd_cobroller is parsed successfully */
+static void cmd_cobroller_parsed(void *parsed_result,
+                                   __attribute__((unused)) void *data)
+{
+       struct cmd_cobroller_result *res = parsed_result;
+       uint8_t side;
+
+       if (!strcmp_P(res->arg1, PSTR("left")))
+               side = I2C_LEFT_SIDE;
+       else
+               side = I2C_RIGHT_SIDE;
+
+       if (!strcmp_P(res->arg2, PSTR("on")))
+               cobroller_on(side);
+       else if (!strcmp_P(res->arg2, PSTR("off")))
+               cobroller_off(side);
+}
+
+prog_char str_cobroller_arg0[] = "cobroller";
+parse_pgm_token_string_t cmd_cobroller_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_cobroller_result, arg0, str_cobroller_arg0);
+prog_char str_cobroller_arg1[] = "left#right";
+parse_pgm_token_string_t cmd_cobroller_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_cobroller_result, arg1, str_cobroller_arg1);
+prog_char str_cobroller_arg2[] = "on#off";
+parse_pgm_token_string_t cmd_cobroller_arg2 = TOKEN_STRING_INITIALIZER(struct cmd_cobroller_result, arg2, str_cobroller_arg2);
+
+prog_char help_cobroller[] = "Servo door function";
+parse_pgm_inst_t cmd_cobroller = {
+       .f = cmd_cobroller_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_cobroller,
+       .tokens = {        /* token list, NULL terminated */
+               (prog_void *)&cmd_cobroller_arg0,
+               (prog_void *)&cmd_cobroller_arg1,
+               (prog_void *)&cmd_cobroller_arg2,
+               NULL,
+       },
+};
+
+/**********************************************************/
+/* shovel */
+
+/* this structure is filled when cmd_shovel is parsed successfully */
+struct cmd_shovel_result {
+       fixed_string_t arg0;
+       fixed_string_t arg1;
+};
+
+/* function called when cmd_shovel is parsed successfully */
+static void cmd_shovel_parsed(void *parsed_result,
+                             __attribute__((unused)) void *data)
+{
+       struct cmd_shovel_result *res = parsed_result;
+       if (!strcmp_P(res->arg1, PSTR("down")))
+               shovel_down();
+       else if (!strcmp_P(res->arg1, PSTR("up")))
+               shovel_up();
+       else if (!strcmp_P(res->arg1, PSTR("mid")))
+               shovel_mid();
+}
+
+prog_char str_shovel_arg0[] = "shovel";
+parse_pgm_token_string_t cmd_shovel_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_shovel_result, arg0, str_shovel_arg0);
+prog_char str_shovel_arg1[] = "down#up#mid";
+parse_pgm_token_string_t cmd_shovel_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_shovel_result, arg1, str_shovel_arg1);
+
+prog_char help_shovel[] = "Servo shovel function";
+parse_pgm_inst_t cmd_shovel = {
+       .f = cmd_shovel_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_shovel,
+       .tokens = {        /* token list, NULL terminated */
+               (prog_void *)&cmd_shovel_arg0,
+               (prog_void *)&cmd_shovel_arg1,
                NULL,
        },
 };
@@ -442,19 +548,20 @@ parse_pgm_inst_t cmd_servo_carry = {
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_servo_carry,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_servo_carry_arg0, 
-               (prog_void *)&cmd_servo_carry_arg1, 
+               (prog_void *)&cmd_servo_carry_arg0,
+               (prog_void *)&cmd_servo_carry_arg1,
                NULL,
        },
 };
 
 /**********************************************************/
-/* Spickles tests */
+/* Spickle tests */
 
 /* this structure is filled when cmd_spickle is parsed successfully */
 struct cmd_spickle_result {
        fixed_string_t arg0;
        fixed_string_t arg1;
+       fixed_string_t arg2;
 };
 
 /* function called when cmd_spickle is parsed successfully */
@@ -462,36 +569,44 @@ static void cmd_spickle_parsed(void * parsed_result,
                               __attribute__((unused)) void *data)
 {
        struct cmd_spickle_result * res = parsed_result;
-       
-       if (!strcmp_P(res->arg1, PSTR("up"))) {
-               spickle_up();
-       }
-       else if (!strcmp_P(res->arg1, PSTR("down"))) {
-               spickle_down();
+       uint8_t side;
+
+       if (!strcmp_P(res->arg1, PSTR("left")))
+               side = I2C_LEFT_SIDE;
+       else
+               side = I2C_RIGHT_SIDE;
+
+       if (!strcmp_P(res->arg2, PSTR("deploy"))) {
+               spickle_deploy(side);
        }
-       else if (!strcmp_P(res->arg1, PSTR("stop"))) {
-               spickle_stop();
+       else if (!strcmp_P(res->arg2, PSTR("pack"))) {
+               spickle_pack(side);
        }
-       else if (!strcmp_P(res->arg1, PSTR("auto"))) {
-               spickle_auto();
+       else if (!strcmp_P(res->arg2, PSTR("mid"))) {
+               spickle_mid(side);
        }
-
        printf_P(PSTR("done\r\n"));
 }
 
 prog_char str_spickle_arg0[] = "spickle";
-parse_pgm_token_string_t cmd_spickle_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_spickle_result, arg0, str_spickle_arg0);
-prog_char str_spickle_arg1[] = "auto#up#down#stop";
-parse_pgm_token_string_t cmd_spickle_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_spickle_result, arg1, str_spickle_arg1);
-
-prog_char help_spickle[] = "spickle auto mode: spickle auto delay_up delay_down";
+parse_pgm_token_string_t cmd_spickle_arg0 =
+       TOKEN_STRING_INITIALIZER(struct cmd_spickle_result, arg0, str_spickle_arg0);
+prog_char str_spickle_arg1[] = "left#right";
+parse_pgm_token_string_t cmd_spickle_arg1 =
+       TOKEN_STRING_INITIALIZER(struct cmd_spickle_result, arg1, str_spickle_arg1);
+prog_char str_spickle_arg2[] = "deploy#pack#mid";
+parse_pgm_token_string_t cmd_spickle_arg2 =
+       TOKEN_STRING_INITIALIZER(struct cmd_spickle_result, arg2, str_spickle_arg2);
+
+prog_char help_spickle[] = "move spickle";
 parse_pgm_inst_t cmd_spickle = {
        .f = cmd_spickle_parsed,  /* function to call */
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_spickle,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_spickle_arg0, 
-               (prog_void *)&cmd_spickle_arg1, 
+               (prog_void *)&cmd_spickle_arg0,
+               (prog_void *)&cmd_spickle_arg1,
+               (prog_void *)&cmd_spickle_arg2,
                NULL,
        },
 };
@@ -503,8 +618,10 @@ parse_pgm_inst_t cmd_spickle = {
 struct cmd_spickle_params_result {
        fixed_string_t arg0;
        fixed_string_t arg1;
-       int32_t arg2;
+       fixed_string_t arg2;
        int32_t arg3;
+       int32_t arg4;
+       int32_t arg5;
 };
 
 /* function called when cmd_spickle_params is parsed successfully */
@@ -512,45 +629,57 @@ static void cmd_spickle_params_parsed(void *parsed_result,
                                      __attribute__((unused)) void *data)
 {
        struct cmd_spickle_params_result * res = parsed_result;
-       
-       
-       if (!strcmp_P(res->arg1, PSTR("delay"))) {
-               spickle_set_delays(res->arg2, res->arg3);
-       }
-       else if (!strcmp_P(res->arg1, PSTR("coef"))) {
-               spickle_set_coefs(res->arg2, res->arg3);
-       }
-       else if (!strcmp_P(res->arg1, PSTR("pos"))) {
-               spickle_set_pos(res->arg2, res->arg3);
+       uint8_t side;
+
+       if (!strcmp_P(res->arg1, PSTR("show"))) {
+               spickle_dump_params();
+               return;
        }
 
-       /* else show */
-       spickle_dump_params();
+       if (!strcmp_P(res->arg1, PSTR("left")))
+               side = I2C_LEFT_SIDE;
+       else
+               side = I2C_RIGHT_SIDE;
+
+       if (!strcmp_P(res->arg2, PSTR("pos")))
+               spickle_set_pos(side, res->arg3, res->arg4, res->arg5);
 }
 
 prog_char str_spickle_params_arg0[] = "spickle_params";
-parse_pgm_token_string_t cmd_spickle_params_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_spickle_params_result, arg0, str_spickle_params_arg0);
-prog_char str_spickle_params_arg1[] = "delay#pos#coef";
-parse_pgm_token_string_t cmd_spickle_params_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_spickle_params_result, arg1, str_spickle_params_arg1);
-parse_pgm_token_num_t cmd_spickle_params_arg2 = TOKEN_NUM_INITIALIZER(struct cmd_spickle_params_result, arg2, INT32);
-parse_pgm_token_num_t cmd_spickle_params_arg3 = TOKEN_NUM_INITIALIZER(struct cmd_spickle_params_result, arg3, INT32);
-
-prog_char help_spickle_params[] = "Set spickle_params values";
+parse_pgm_token_string_t cmd_spickle_params_arg0 =
+       TOKEN_STRING_INITIALIZER(struct cmd_spickle_params_result, arg0, str_spickle_params_arg0);
+prog_char str_spickle_params_arg1[] = "left#right";
+parse_pgm_token_string_t cmd_spickle_params_arg1 =
+       TOKEN_STRING_INITIALIZER(struct cmd_spickle_params_result, arg1, str_spickle_params_arg1);
+prog_char str_spickle_params_arg2[] = "pos";
+parse_pgm_token_string_t cmd_spickle_params_arg2 =
+       TOKEN_STRING_INITIALIZER(struct cmd_spickle_params_result, arg2, str_spickle_params_arg2);
+parse_pgm_token_num_t cmd_spickle_params_arg3 =
+       TOKEN_NUM_INITIALIZER(struct cmd_spickle_params_result, arg3, INT32);
+parse_pgm_token_num_t cmd_spickle_params_arg4 =
+       TOKEN_NUM_INITIALIZER(struct cmd_spickle_params_result, arg4, INT32);
+parse_pgm_token_num_t cmd_spickle_params_arg5 =
+       TOKEN_NUM_INITIALIZER(struct cmd_spickle_params_result, arg5, INT32);
+
+prog_char help_spickle_params[] = "Set spickle pos values: left|right pos INTPACK INTMID INTDEPL";
 parse_pgm_inst_t cmd_spickle_params = {
        .f = cmd_spickle_params_parsed,  /* function to call */
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_spickle_params,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_spickle_params_arg0, 
-               (prog_void *)&cmd_spickle_params_arg1, 
-               (prog_void *)&cmd_spickle_params_arg2, 
-               (prog_void *)&cmd_spickle_params_arg3, 
+               (prog_void *)&cmd_spickle_params_arg0,
+               (prog_void *)&cmd_spickle_params_arg1,
+               (prog_void *)&cmd_spickle_params_arg2,
+               (prog_void *)&cmd_spickle_params_arg3,
+               (prog_void *)&cmd_spickle_params_arg4,
+               (prog_void *)&cmd_spickle_params_arg5,
                NULL,
        },
 };
 
 prog_char str_spickle_params_arg1_show[] = "show";
-parse_pgm_token_string_t cmd_spickle_params_arg1_show = TOKEN_STRING_INITIALIZER(struct cmd_spickle_params_result, arg1, str_spickle_params_arg1_show);
+parse_pgm_token_string_t cmd_spickle_params_arg1_show =
+       TOKEN_STRING_INITIALIZER(struct cmd_spickle_params_result, arg1, str_spickle_params_arg1_show);
 
 prog_char help_spickle_params_show[] = "show spickle params";
 parse_pgm_inst_t cmd_spickle_params_show = {
@@ -558,8 +687,74 @@ parse_pgm_inst_t cmd_spickle_params_show = {
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_spickle_params_show,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_spickle_params_arg0, 
-               (prog_void *)&cmd_spickle_params_arg1_show, 
+               (prog_void *)&cmd_spickle_params_arg0,
+               (prog_void *)&cmd_spickle_params_arg1_show,
+               NULL,
+       },
+};
+
+/**********************************************************/
+/* Set Spickle Params */
+
+/* this structure is filled when cmd_spickle_params2 is parsed successfully */
+struct cmd_spickle_params2_result {
+       fixed_string_t arg0;
+       fixed_string_t arg1;
+       int32_t arg2;
+       int32_t arg3;
+};
+
+/* function called when cmd_spickle_params2 is parsed successfully */
+static void cmd_spickle_params2_parsed(void *parsed_result,
+                                     __attribute__((unused)) void *data)
+{
+       struct cmd_spickle_params2_result * res = parsed_result;
+
+       if (!strcmp_P(res->arg1, PSTR("coef"))) {
+               spickle_set_coefs(res->arg2, res->arg3);
+       }
+
+       /* else show */
+       spickle_dump_params();
+}
+
+prog_char str_spickle_params2_arg0[] = "spickle_params2";
+parse_pgm_token_string_t cmd_spickle_params2_arg0 =
+       TOKEN_STRING_INITIALIZER(struct cmd_spickle_params2_result, arg0, str_spickle_params2_arg0);
+prog_char str_spickle_params2_arg1[] = "coef";
+parse_pgm_token_string_t cmd_spickle_params2_arg1 =
+       TOKEN_STRING_INITIALIZER(struct cmd_spickle_params2_result, arg1, str_spickle_params2_arg1);
+parse_pgm_token_num_t cmd_spickle_params2_arg2 =
+       TOKEN_NUM_INITIALIZER(struct cmd_spickle_params2_result, arg2, INT32);
+parse_pgm_token_num_t cmd_spickle_params2_arg3 =
+       TOKEN_NUM_INITIALIZER(struct cmd_spickle_params2_result, arg3, INT32);
+
+prog_char help_spickle_params2[] = "Set spickle_params2 values";
+parse_pgm_inst_t cmd_spickle_params2 = {
+       .f = cmd_spickle_params2_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_spickle_params2,
+       .tokens = {        /* token list, NULL terminated */
+               (prog_void *)&cmd_spickle_params2_arg0,
+               (prog_void *)&cmd_spickle_params2_arg1,
+               (prog_void *)&cmd_spickle_params2_arg2,
+               (prog_void *)&cmd_spickle_params2_arg3,
+               NULL,
+       },
+};
+
+prog_char str_spickle_params2_arg1_show[] = "show";
+parse_pgm_token_string_t cmd_spickle_params2_arg1_show =
+       TOKEN_STRING_INITIALIZER(struct cmd_spickle_params2_result, arg1, str_spickle_params2_arg1_show);
+
+prog_char help_spickle_params2_show[] = "show spickle params";
+parse_pgm_inst_t cmd_spickle_params2_show = {
+       .f = cmd_spickle_params2_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_spickle_params2_show,
+       .tokens = {        /* token list, NULL terminated */
+               (prog_void *)&cmd_spickle_params2_arg0,
+               (prog_void *)&cmd_spickle_params2_arg1_show,
                NULL,
        },
 };
@@ -579,7 +774,8 @@ static void cmd_test_parsed(__attribute__((unused)) void *parsed_result,
 }
 
 prog_char str_test_arg0[] = "test";
-parse_pgm_token_string_t cmd_test_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_test_result, arg0, str_test_arg0);
+parse_pgm_token_string_t cmd_test_arg0 =
+       TOKEN_STRING_INITIALIZER(struct cmd_test_result, arg0, str_test_arg0);
 
 prog_char help_test[] = "Test function";
 parse_pgm_inst_t cmd_test = {
@@ -587,7 +783,7 @@ parse_pgm_inst_t cmd_test = {
        .data = NULL,      /* 2nd arg of func */
        .help_str = help_test,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_test_arg0, 
+               (prog_void *)&cmd_test_arg0,
                NULL,
        },
 };