add ballboard commands on mainboard
authorzer0 <zer0@carbon.local>
Sat, 3 Apr 2010 13:02:33 +0000 (15:02 +0200)
committerzer0 <zer0@carbon.local>
Sat, 3 Apr 2010 13:02:33 +0000 (15:02 +0200)
projects/microb2010/mainboard/actuator.c
projects/microb2010/mainboard/commands_mainboard.c
projects/microb2010/mainboard/i2c_protocol.c
projects/microb2010/mainboard/i2c_protocol.h
projects/microb2010/mainboard/main.h

index 24ad07f..1d134bb 100644 (file)
@@ -68,12 +68,12 @@ void pwm_set_and_save(void *pwm, int32_t val)
 void support_balls_deploy(void)
 {
        pwm_ng_set(SUPPORT_BALLS_R_SERVO, 510);
-       pwm_ng_set(SUPPORT_BALLS_L_SERVO, 240);
+       pwm_ng_set(SUPPORT_BALLS_L_SERVO, 205);
 }
 
 void support_balls_pack(void)
 {
-       pwm_ng_set(SUPPORT_BALLS_R_SERVO, 200);
+       pwm_ng_set(SUPPORT_BALLS_R_SERVO, 250);
        pwm_ng_set(SUPPORT_BALLS_L_SERVO, 480);
 }
 
index 29ecd3d..fcadd07 100644 (file)
@@ -662,6 +662,7 @@ static void cmd_cobboard_show_parsed(void * parsed_result, void * data)
 {
        printf_P(PSTR("mode = %x\r\n"), cobboard.mode);
        printf_P(PSTR("status = %x\r\n"), cobboard.status);
+       printf_P(PSTR("cob_count = %x\r\n"), cobboard.cob_count);
        printf_P(PSTR("left_cobroller_speed = %d\r\n"), cobboard.left_cobroller_speed);
        printf_P(PSTR("right_cobroller_speed = %d\r\n"), cobboard.right_cobroller_speed);
 }
@@ -807,6 +808,171 @@ parse_pgm_inst_t cmd_cobboard_setmode3 = {
 };
 
 /**********************************************************/
+/* Ballboard_Show */
+
+/* this structure is filled when cmd_ballboard_show is parsed successfully */
+struct cmd_ballboard_show_result {
+       fixed_string_t arg0;
+       fixed_string_t arg1;
+};
+
+/* function called when cmd_ballboard_show is parsed successfully */
+static void cmd_ballboard_show_parsed(void * parsed_result, void * data)
+{
+       printf_P(PSTR("mode = %x\r\n"), ballboard.mode);
+       printf_P(PSTR("status = %x\r\n"), ballboard.status);
+       printf_P(PSTR("ball_count = %d\r\n"), ballboard.ball_count);
+}
+
+prog_char str_ballboard_show_arg0[] = "ballboard";
+parse_pgm_token_string_t cmd_ballboard_show_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_ballboard_show_result, arg0, str_ballboard_show_arg0);
+prog_char str_ballboard_show_arg1[] = "show";
+parse_pgm_token_string_t cmd_ballboard_show_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_ballboard_show_result, arg1, str_ballboard_show_arg1);
+
+prog_char help_ballboard_show[] = "show ballboard status";
+parse_pgm_inst_t cmd_ballboard_show = {
+       .f = cmd_ballboard_show_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_ballboard_show,
+       .tokens = {        /* token list, NULL terminated */
+               (prog_void *)&cmd_ballboard_show_arg0, 
+               (prog_void *)&cmd_ballboard_show_arg1, 
+               NULL,
+       },
+};
+
+/**********************************************************/
+/* Ballboard_Setmode1 */
+
+/* this structure is filled when cmd_ballboard_setmode1 is parsed successfully */
+struct cmd_ballboard_setmode1_result {
+       fixed_string_t arg0;
+       fixed_string_t arg1;
+};
+
+/* function called when cmd_ballboard_setmode1 is parsed successfully */
+static void cmd_ballboard_setmode1_parsed(void *parsed_result, void *data)
+{
+       struct cmd_ballboard_setmode1_result *res = parsed_result;
+
+       if (!strcmp_P(res->arg1, PSTR("init")))
+               i2c_ballboard_set_mode(I2C_BALLBOARD_MODE_INIT);
+       else if (!strcmp_P(res->arg1, PSTR("off")))
+               i2c_ballboard_set_mode(I2C_BALLBOARD_MODE_OFF);
+       else if (!strcmp_P(res->arg1, PSTR("eject")))
+               i2c_ballboard_set_mode(I2C_BALLBOARD_MODE_EJECT);
+       else if (!strcmp_P(res->arg1, PSTR("harvest")))
+               i2c_ballboard_set_mode(I2C_BALLBOARD_MODE_HARVEST);
+
+       /* other commands */
+}
+
+prog_char str_ballboard_setmode1_arg0[] = "ballboard";
+parse_pgm_token_string_t cmd_ballboard_setmode1_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_ballboard_setmode1_result, arg0, str_ballboard_setmode1_arg0);
+prog_char str_ballboard_setmode1_arg1[] = "init#eject#harvest#off";
+parse_pgm_token_string_t cmd_ballboard_setmode1_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_ballboard_setmode1_result, arg1, str_ballboard_setmode1_arg1);
+
+prog_char help_ballboard_setmode1[] = "set ballboard mode (mode)";
+parse_pgm_inst_t cmd_ballboard_setmode1 = {
+       .f = cmd_ballboard_setmode1_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_ballboard_setmode1,
+       .tokens = {        /* token list, NULL terminated */
+               (prog_void *)&cmd_ballboard_setmode1_arg0, 
+               (prog_void *)&cmd_ballboard_setmode1_arg1, 
+               NULL,
+       },
+};
+
+/**********************************************************/
+/* Ballboard_Setmode2 */
+
+/* this structure is filled when cmd_ballboard_setmode2 is parsed successfully */
+struct cmd_ballboard_setmode2_result {
+       fixed_string_t arg0;
+       fixed_string_t arg1;
+       fixed_string_t arg2;
+};
+
+/* function called when cmd_ballboard_setmode2 is parsed successfully */
+static void cmd_ballboard_setmode2_parsed(void * parsed_result, void * data)
+{
+       struct cmd_ballboard_setmode2_result *res = parsed_result;
+       uint8_t mode = I2C_BALLBOARD_MODE_INIT;
+
+       if (!strcmp_P(res->arg2, PSTR("left"))) {
+               if (!strcmp_P(res->arg1, PSTR("prepare")))
+                       mode = I2C_BALLBOARD_MODE_PREP_L_FORK;
+               else if (!strcmp_P(res->arg1, PSTR("take")))
+                       mode = I2C_BALLBOARD_MODE_TAKE_L_FORK;
+       }
+       else {
+               if (!strcmp_P(res->arg1, PSTR("prepare")))
+                       mode = I2C_BALLBOARD_MODE_PREP_R_FORK;
+               else if (!strcmp_P(res->arg1, PSTR("take")))
+                       mode = I2C_BALLBOARD_MODE_TAKE_R_FORK;
+       }
+       i2c_ballboard_set_mode(mode);
+}
+
+prog_char str_ballboard_setmode2_arg0[] = "ballboard";
+parse_pgm_token_string_t cmd_ballboard_setmode2_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_ballboard_setmode2_result, arg0, str_ballboard_setmode2_arg0);
+prog_char str_ballboard_setmode2_arg1[] = "prepare#take";
+parse_pgm_token_string_t cmd_ballboard_setmode2_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_ballboard_setmode2_result, arg1, str_ballboard_setmode2_arg1);
+prog_char str_ballboard_setmode2_arg2[] = "left#right";
+parse_pgm_token_string_t cmd_ballboard_setmode2_arg2 = TOKEN_STRING_INITIALIZER(struct cmd_ballboard_setmode2_result, arg2, str_ballboard_setmode2_arg2);
+
+prog_char help_ballboard_setmode2[] = "set ballboard mode (mode, side)";
+parse_pgm_inst_t cmd_ballboard_setmode2 = {
+       .f = cmd_ballboard_setmode2_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_ballboard_setmode2,
+       .tokens = {        /* token list, NULL terminated */
+               (prog_void *)&cmd_ballboard_setmode2_arg0, 
+               (prog_void *)&cmd_ballboard_setmode2_arg1, 
+               (prog_void *)&cmd_ballboard_setmode2_arg2, 
+               NULL,
+       },
+};
+
+/**********************************************************/
+/* Ballboard_Setmode3 */
+
+/* this structure is filled when cmd_ballboard_setmode3 is parsed successfully */
+struct cmd_ballboard_setmode3_result {
+       fixed_string_t arg0;
+       fixed_string_t arg1;
+       uint8_t level;
+};
+
+/* function called when cmd_ballboard_setmode3 is parsed successfully */
+static void cmd_ballboard_setmode3_parsed(void *parsed_result, void *data)
+{
+       struct cmd_ballboard_setmode3_result *res = parsed_result;
+       if (!strcmp_P(res->arg1, PSTR("xxx")))
+               printf("faux\r\n");
+}
+
+prog_char str_ballboard_setmode3_arg0[] = "ballboard";
+parse_pgm_token_string_t cmd_ballboard_setmode3_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_ballboard_setmode3_result, arg0, str_ballboard_setmode3_arg0);
+prog_char str_ballboard_setmode3_arg1[] = "xxx";
+parse_pgm_token_string_t cmd_ballboard_setmode3_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_ballboard_setmode3_result, arg1, str_ballboard_setmode3_arg1);
+parse_pgm_token_num_t cmd_ballboard_setmode3_arg2 = TOKEN_NUM_INITIALIZER(struct cmd_ballboard_setmode3_result, level, UINT8);
+
+prog_char help_ballboard_setmode3[] = "set ballboard mode (mode, level)";
+parse_pgm_inst_t cmd_ballboard_setmode3 = {
+       .f = cmd_ballboard_setmode3_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_ballboard_setmode3,
+       .tokens = {        /* token list, NULL terminated */
+               (prog_void *)&cmd_ballboard_setmode3_arg0, 
+               (prog_void *)&cmd_ballboard_setmode3_arg1, 
+               (prog_void *)&cmd_ballboard_setmode3_arg2, 
+               NULL,
+       },
+};
+
+/**********************************************************/
 /* Servo_Balls */
 
 /* this structure is filled when cmd_servo_balls is parsed successfully */
index d0726cb..403decd 100644 (file)
@@ -270,14 +270,16 @@ void i2c_recvevent(uint8_t * buf, int8_t size)
 
                break;
        }
-               
+
        case I2C_ANS_BALLBOARD_STATUS: {
                struct i2c_ans_ballboard_status * ans = 
                        (struct i2c_ans_ballboard_status *)buf;
-               
+
                if (size != sizeof (*ans))
                        goto error;
+               ballboard.mode = ans->mode;
                ballboard.status = ans->status;
+               ballboard.ball_count = ans->ball_count;
                break;
        }
 
@@ -296,13 +298,11 @@ void i2c_recvevent(uint8_t * buf, int8_t size)
                i2c_errors = 0;
        }
 }
-       
+
 void i2c_recvbyteevent(uint8_t hwstatus, uint8_t i, uint8_t c)
 {
 }
 
-
-
 /* ******** ******** ******** ******** */
 /* commands */
 /* ******** ******** ******** ******** */
@@ -438,3 +438,11 @@ int8_t i2c_cobboard_mode_init(void)
        return i2c_send_command(I2C_COBBOARD_ADDR, (uint8_t*)&buf, sizeof(buf));
 }
 
+int8_t i2c_ballboard_set_mode(uint8_t mode)
+{
+       struct i2c_cmd_ballboard_set_mode buf;
+       buf.hdr.cmd = I2C_CMD_BALLBOARD_SET_MODE;
+       buf.mode = mode;
+       return i2c_send_command(I2C_COBBOARD_ADDR, (uint8_t*)&buf, sizeof(buf));
+}
+
index d788ed7..7ae7283 100644 (file)
@@ -41,4 +41,6 @@ int8_t i2c_cobboard_mode_harvest(uint8_t side);
 int8_t i2c_cobboard_mode_deploy(uint8_t side);
 int8_t i2c_cobboard_mode_pack(uint8_t side);
 
+int8_t i2c_ballboard_set_mode(uint8_t mode);
+
 #endif
index 2fdd212..c248644 100755 (executable)
@@ -115,7 +115,7 @@ struct genboard {
        struct pwm_ng servo2;
        struct pwm_ng servo3;
        struct pwm_ng servo4;
-       
+
        /* ax12 interface */
        AX12 ax12;
 
@@ -165,7 +165,7 @@ struct mainboard {
 
 /* state of cobboard, synchronized through i2c */
 struct cobboard {
-       uint8_t mode;   
+       uint8_t mode;
        uint8_t status;
        int16_t left_cobroller_speed;
        int16_t right_cobroller_speed;
@@ -174,7 +174,9 @@ struct cobboard {
 
 /* state of ballboard, synchronized through i2c */
 struct ballboard {
+       uint8_t mode;
        uint8_t status;
+       uint8_t ball_count;
 };
 
 extern struct genboard gen;