X-Git-Url: http://git.droids-corp.org/?p=aversive.git;a=blobdiff_plain;f=projects%2Fmicrob2010%2Fballboard%2Fi2c_protocol.c;fp=projects%2Fmicrob2010%2Fballboard%2Fi2c_protocol.c;h=f9e9b554bab378e031937675f06b061dd906c364;hp=8995e553f8dc6163e9910cdfd98f40681890217b;hb=c8bae2eb9f3084d53436bc6c9fee9952dfcc1fda;hpb=c5092ef0e45256f7e5ff2ceea8e1aa1cb33027db diff --git a/projects/microb2010/ballboard/i2c_protocol.c b/projects/microb2010/ballboard/i2c_protocol.c index 8995e55..f9e9b55 100644 --- a/projects/microb2010/ballboard/i2c_protocol.c +++ b/projects/microb2010/ballboard/i2c_protocol.c @@ -46,6 +46,7 @@ #include "../common/i2c_commands.h" #include "main.h" +#include "state.h" #include "actuator.h" void i2c_protocol_init(void) @@ -73,11 +74,18 @@ void i2c_send_status(void) i2c_flush(); ans.hdr.cmd = I2C_ANS_BALLBOARD_STATUS; ans.status = 0x55; /* XXX */ + ans.ball_count = state_get_ball_count(); i2c_send(I2C_ADD_MASTER, (uint8_t *) &ans, sizeof(ans), I2C_CTRL_GENERIC); } +static int8_t i2c_set_mode(struct i2c_cmd_ballboard_set_mode *cmd) +{ + state_set_mode(cmd->mode); + return 0; +} + void i2c_recvevent(uint8_t * buf, int8_t size) { void *void_cmd = buf; @@ -91,11 +99,11 @@ void i2c_recvevent(uint8_t * buf, int8_t size) if (size <= 0) { goto error; } - + switch (buf[0]) { /* Commands (no answer needed) */ - case I2C_CMD_GENERIC_LED_CONTROL: + case I2C_CMD_GENERIC_LED_CONTROL: { struct i2c_cmd_led_control *cmd = void_cmd; if (size != sizeof (*cmd)) @@ -103,7 +111,7 @@ void i2c_recvevent(uint8_t * buf, int8_t size) i2c_led_control(cmd->led_num, cmd->state); break; } - + case I2C_CMD_GENERIC_SET_COLOR: { struct i2c_cmd_generic_color *cmd = void_cmd; @@ -113,16 +121,25 @@ void i2c_recvevent(uint8_t * buf, int8_t size) break; } + case I2C_CMD_BALLBOARD_SET_MODE: + { + struct i2c_cmd_ballboard_set_mode *cmd = void_cmd; + if (size != sizeof(struct i2c_cmd_ballboard_set_mode)) + goto error; + i2c_set_mode(cmd); + break; + } + /* Add other commands here ...*/ case I2C_REQ_BALLBOARD_STATUS: { - struct i2c_req_ballboard_status *cmd = void_cmd; + struct i2c_req_ballboard_status *cmd = void_cmd; if (size != sizeof (*cmd)) goto error; - + i2c_send_status(); break; }