optim cobboard
[aversive.git] / projects / microb2010 / mainboard / i2c_protocol.c
index a4aa028..9908f1a 100644 (file)
@@ -274,6 +274,7 @@ void i2c_recvevent(uint8_t * buf, int8_t size)
                /* status */
                cobboard.mode = ans->mode;
                cobboard.status = ans->status;
                /* status */
                cobboard.mode = ans->mode;
                cobboard.status = ans->status;
+               cobboard.cob_count = ans->cob_count;
                cobboard.left_cobroller_speed = ans->left_cobroller_speed;
                cs_set_consign(&mainboard.left_cobroller.cs, cobboard.left_cobroller_speed);
                cobboard.right_cobroller_speed = ans->right_cobroller_speed;
                cobboard.left_cobroller_speed = ans->left_cobroller_speed;
                cs_set_consign(&mainboard.left_cobroller.cs, cobboard.left_cobroller_speed);
                cobboard.right_cobroller_speed = ans->right_cobroller_speed;
@@ -283,6 +284,7 @@ void i2c_recvevent(uint8_t * buf, int8_t size)
        }
 
        case I2C_ANS_BALLBOARD_STATUS: {
        }
 
        case I2C_ANS_BALLBOARD_STATUS: {
+               uint8_t tmp;
                struct i2c_ans_ballboard_status * ans =
                        (struct i2c_ans_ballboard_status *)buf;
 
                struct i2c_ans_ballboard_status * ans =
                        (struct i2c_ans_ballboard_status *)buf;
 
@@ -291,6 +293,12 @@ void i2c_recvevent(uint8_t * buf, int8_t size)
                ballboard.mode = ans->mode;
                ballboard.status = ans->status;
                ballboard.ball_count = ans->ball_count;
                ballboard.mode = ans->mode;
                ballboard.status = ans->status;
                ballboard.ball_count = ans->ball_count;
+               tmp = ans->lcob;
+               if (tmp != I2C_COB_NONE)
+                       ballboard.lcob = tmp;
+               tmp = ans->rcob;
+               if (tmp != I2C_COB_NONE)
+                       ballboard.rcob = tmp;
                break;
        }
 
                break;
        }
 
@@ -354,6 +362,8 @@ static int8_t i2c_req_cobboard_status(void)
        int8_t err;
 
        buf.hdr.cmd = I2C_REQ_COBBOARD_STATUS;
        int8_t err;
 
        buf.hdr.cmd = I2C_REQ_COBBOARD_STATUS;
+       buf.lspickle = cobboard.lspickle;
+       buf.rspickle = cobboard.rspickle;
        err = i2c_send(I2C_COBBOARD_ADDR, (uint8_t*)&buf,
                        sizeof(buf), I2C_CTRL_GENERIC);
 
        err = i2c_send(I2C_COBBOARD_ADDR, (uint8_t*)&buf,
                        sizeof(buf), I2C_CTRL_GENERIC);
 
@@ -390,70 +400,42 @@ int8_t i2c_led_control(uint8_t addr, uint8_t led, uint8_t state)
        return i2c_send_command(addr, (uint8_t*)&buf, sizeof(buf));
 }
 
        return i2c_send_command(addr, (uint8_t*)&buf, sizeof(buf));
 }
 
-int8_t i2c_cobboard_mode_eject(void)
+int8_t i2c_cobboard_set_mode(uint8_t mode)
 {
 {
+#ifdef HOST_VERSION
+       return robotsim_i2c_cobboard_set_mode(mode);
+#else
        struct i2c_cmd_cobboard_set_mode buf;
        buf.hdr.cmd = I2C_CMD_COBBOARD_SET_MODE;
        struct i2c_cmd_cobboard_set_mode buf;
        buf.hdr.cmd = I2C_CMD_COBBOARD_SET_MODE;
-       buf.mode = cobboard.mode | I2C_COBBOARD_MODE_EJECT;
+       buf.mode = mode;
        return i2c_send_command(I2C_COBBOARD_ADDR, (uint8_t*)&buf, sizeof(buf));
        return i2c_send_command(I2C_COBBOARD_ADDR, (uint8_t*)&buf, sizeof(buf));
+#endif
 }
 
 }
 
-int8_t i2c_cobboard_mode_harvest(uint8_t side)
+static int8_t i2c_cobboard_set_spickle(uint8_t side, uint8_t flags)
 {
 {
-       struct i2c_cmd_cobboard_set_mode buf;
-       uint8_t mode = cobboard.mode;
-
-       buf.hdr.cmd = I2C_CMD_COBBOARD_SET_MODE;
-       if (side == I2C_LEFT_SIDE) {
-               mode |= I2C_COBBOARD_MODE_L_DEPLOY;
-               mode |= I2C_COBBOARD_MODE_L_HARVEST;
-       }
-       else {
-               mode |= I2C_COBBOARD_MODE_R_DEPLOY;
-               mode |= I2C_COBBOARD_MODE_R_HARVEST;
-       }
-       buf.mode = mode;
-       return i2c_send_command(I2C_COBBOARD_ADDR, (uint8_t*)&buf, sizeof(buf));
+       if (side == I2C_LEFT_SIDE)
+               cobboard.lspickle = flags;
+       else
+               cobboard.rspickle = flags;
+       return 0;
 }
 
 }
 
-int8_t i2c_cobboard_mode_deploy(uint8_t side)
+int8_t i2c_cobboard_pack(uint8_t side)
 {
 {
-       struct i2c_cmd_cobboard_set_mode buf;
-       uint8_t mode = cobboard.mode;
-
-       buf.hdr.cmd = I2C_CMD_COBBOARD_SET_MODE;
-       if (side == I2C_LEFT_SIDE) {
-               mode &= ~(I2C_COBBOARD_MODE_L_DEPLOY | I2C_COBBOARD_MODE_L_HARVEST);
-               mode |= I2C_COBBOARD_MODE_L_DEPLOY;
-       }
-       else {
-               mode &= ~(I2C_COBBOARD_MODE_R_DEPLOY | I2C_COBBOARD_MODE_R_HARVEST);
-               mode |= I2C_COBBOARD_MODE_R_DEPLOY;
-       }
-       buf.mode = mode;
-       return i2c_send_command(I2C_COBBOARD_ADDR, (uint8_t*)&buf, sizeof(buf));
+       return i2c_cobboard_set_spickle(side, 0);
 }
 
 }
 
-int8_t i2c_cobboard_mode_pack(uint8_t side)
+int8_t i2c_cobboard_autoharvest(uint8_t side)
 {
 {
-       struct i2c_cmd_cobboard_set_mode buf;
-       uint8_t mode = cobboard.mode;
-
-       buf.hdr.cmd = I2C_CMD_COBBOARD_SET_MODE;
-       if (side == I2C_LEFT_SIDE)
-               mode &= ~(I2C_COBBOARD_MODE_L_DEPLOY | I2C_COBBOARD_MODE_L_HARVEST);
-       else
-               mode &= ~(I2C_COBBOARD_MODE_R_DEPLOY | I2C_COBBOARD_MODE_R_HARVEST);
-       buf.mode = mode;
-       return i2c_send_command(I2C_COBBOARD_ADDR, (uint8_t*)&buf, sizeof(buf));
+       return i2c_cobboard_set_spickle(side,
+                                       I2C_COBBOARD_SPK_DEPLOY |
+                                       I2C_COBBOARD_SPK_AUTOHARVEST);
 }
 
 }
 
-int8_t i2c_cobboard_mode_init(void)
+int8_t i2c_cobboard_deploy(uint8_t side)
 {
 {
-       struct i2c_cmd_cobboard_set_mode buf;
-       buf.hdr.cmd = I2C_CMD_COBBOARD_SET_MODE;
-       buf.mode = I2C_COBBOARD_MODE_INIT;
-       return i2c_send_command(I2C_COBBOARD_ADDR, (uint8_t*)&buf, sizeof(buf));
+       return i2c_cobboard_set_spickle(side, I2C_COBBOARD_SPK_DEPLOY);
 }
 
 int8_t i2c_ballboard_set_mode(uint8_t mode)
 }
 
 int8_t i2c_ballboard_set_mode(uint8_t mode)