strat db + avoid
[aversive.git] / projects / microb2010 / mainboard / i2c_protocol.c
index 4e5c174..aed92c7 100644 (file)
@@ -53,6 +53,9 @@
 #include "main.h"
 #include "sensor.h"
 #include "i2c_protocol.h"
+#ifdef HOST_VERSION
+#include "robotsim.h"
+#endif
 
 #define I2C_STATE_MAX 4
 
@@ -269,7 +272,7 @@ void i2c_recvevent(uint8_t * buf, int8_t size)
                        goto error;
 
                /* status */
-               cobboard.mode = ans->mode;
+               //cobboard.mode = ans->mode;
                cobboard.status = ans->status;
                cobboard.left_cobroller_speed = ans->left_cobroller_speed;
                cs_set_consign(&mainboard.left_cobroller.cs, cobboard.left_cobroller_speed);
@@ -321,7 +324,7 @@ static int8_t
 i2c_send_command(uint8_t addr, uint8_t * buf, uint8_t size)
 {
 #ifdef HOST_VERSION
-       return 0;
+       return robotsim_i2c(addr, buf, size);
 #else
        uint8_t flags;
         microseconds us = time_get_us2();
@@ -351,6 +354,7 @@ static int8_t i2c_req_cobboard_status(void)
        int8_t err;
 
        buf.hdr.cmd = I2C_REQ_COBBOARD_STATUS;
+       buf.mode = cobboard.mode;
        err = i2c_send(I2C_COBBOARD_ADDR, (uint8_t*)&buf,
                        sizeof(buf), I2C_CTRL_GENERIC);
 
@@ -387,20 +391,38 @@ int8_t i2c_led_control(uint8_t addr, uint8_t led, uint8_t state)
        return i2c_send_command(addr, (uint8_t*)&buf, sizeof(buf));
 }
 
-int8_t i2c_cobboard_mode_eject(void)
+static int8_t i2c_cobboard_set_mode(uint8_t mode)
 {
+#ifdef HOST_VERSION
+       return robotsim_i2c_cobboard_set_mode(mode);
+#else
+       cobboard.mode = mode;
+       return 0;
+#endif
+
+#if 0 /* old */
        struct i2c_cmd_cobboard_set_mode buf;
        buf.hdr.cmd = I2C_CMD_COBBOARD_SET_MODE;
        buf.mode = cobboard.mode | I2C_COBBOARD_MODE_EJECT;
        return i2c_send_command(I2C_COBBOARD_ADDR, (uint8_t*)&buf, sizeof(buf));
+#endif
+}
+
+int8_t i2c_cobboard_mode_eject(void)
+{
+       /* XXXXXXXXX bad bad bad */
+       uint8_t mode = cobboard.mode | I2C_COBBOARD_MODE_EJECT;
+       i2c_cobboard_set_mode(mode);
+       time_wait_ms(500);
+       mode = cobboard.mode & (~I2C_COBBOARD_MODE_EJECT);
+       i2c_cobboard_set_mode(mode);
+       return 0;
 }
 
 int8_t i2c_cobboard_mode_harvest(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;
                mode |= I2C_COBBOARD_MODE_L_HARVEST;
@@ -409,16 +431,13 @@ int8_t i2c_cobboard_mode_harvest(uint8_t side)
                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));
+       return i2c_cobboard_set_mode(mode);
 }
 
 int8_t i2c_cobboard_mode_deploy(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;
@@ -427,30 +446,23 @@ int8_t i2c_cobboard_mode_deploy(uint8_t side)
                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_mode(mode);
 }
 
 int8_t i2c_cobboard_mode_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);
        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_mode(mode);
 }
 
 int8_t i2c_cobboard_mode_init(void)
 {
-       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_mode(I2C_COBBOARD_MODE_INIT);
 }
 
 int8_t i2c_ballboard_set_mode(uint8_t mode)
@@ -458,6 +470,6 @@ 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));
+       return i2c_send_command(I2C_BALLBOARD_ADDR, (uint8_t*)&buf, sizeof(buf));
 }