From d9b4e922ce1253224adb937d65c8c2e7cd5cfe87 Mon Sep 17 00:00:00 2001
From: zer0 <zer0@carbon.local>
Date: Sat, 8 May 2010 02:15:43 +0200
Subject: [PATCH] kickstand

---
 projects/microb2010/ballboard/ax12_user.c     |  1 -
 projects/microb2010/cobboard/ax12_user.c      |  1 -
 .../microb2010/cobboard/commands_cobboard.c   |  4 +-
 projects/microb2010/cobboard/shovel.c         |  7 +++
 projects/microb2010/cobboard/shovel.h         |  1 +
 projects/microb2010/cobboard/state.c          | 49 +++++++++++++------
 projects/microb2010/common/i2c_commands.h     |  6 ++-
 .../microb2010/mainboard/commands_mainboard.c |  4 +-
 8 files changed, 53 insertions(+), 20 deletions(-)

diff --git a/projects/microb2010/ballboard/ax12_user.c b/projects/microb2010/ballboard/ax12_user.c
index e3a5f9f..ae443f1 100644
--- a/projects/microb2010/ballboard/ax12_user.c
+++ b/projects/microb2010/ballboard/ax12_user.c
@@ -80,7 +80,6 @@
  */
 
 static volatile uint8_t ax12_state = AX12_STATE_READ;
-extern volatile struct cirbuf g_tx_fifo[]; /* uart fifo */
 static volatile uint8_t ax12_nsent = 0;
 
 /* Called by ax12 module to send a character on serial line. Count the
diff --git a/projects/microb2010/cobboard/ax12_user.c b/projects/microb2010/cobboard/ax12_user.c
index b022ef7..ceb8413 100644
--- a/projects/microb2010/cobboard/ax12_user.c
+++ b/projects/microb2010/cobboard/ax12_user.c
@@ -91,7 +91,6 @@ static microseconds t_prev_msg = 0;
  */
 
 static volatile uint8_t ax12_state = AX12_STATE_READ;
-extern volatile struct cirbuf g_tx_fifo[]; /* uart fifo */
 static volatile uint8_t ax12_nsent = 0;
 
 /* Called by ax12 module to send a character on serial line. Count the
diff --git a/projects/microb2010/cobboard/commands_cobboard.c b/projects/microb2010/cobboard/commands_cobboard.c
index 9cfda19..24226e1 100644
--- a/projects/microb2010/cobboard/commands_cobboard.c
+++ b/projects/microb2010/cobboard/commands_cobboard.c
@@ -193,6 +193,8 @@ static void cmd_state1_parsed(void *parsed_result,
 		state_init();
 	else if (!strcmp_P(res->arg1, PSTR("eject")))
 		state_set_mode(I2C_COBBOARD_MODE_EJECT);
+	else if (!strcmp_P(res->arg1, PSTR("kickstand")))
+		state_set_mode(I2C_COBBOARD_MODE_KICKSTAND);
 	else if (!strcmp_P(res->arg1, PSTR("ignore_i2c")))
 		state_set_i2c_ignore(1);
 	else if (!strcmp_P(res->arg1, PSTR("care_i2c")))
@@ -203,7 +205,7 @@ static void cmd_state1_parsed(void *parsed_result,
 
 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#eject#ignore_i2c#care_i2c";
+prog_char str_state1_arg1[] = "init#eject#ignore_i2c#care_i2c#kickstand";
 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";
diff --git a/projects/microb2010/cobboard/shovel.c b/projects/microb2010/cobboard/shovel.c
index 56efa96..71139ab 100644
--- a/projects/microb2010/cobboard/shovel.c
+++ b/projects/microb2010/cobboard/shovel.c
@@ -142,6 +142,13 @@ void shovel_up(void)
 	cs_set_consign(&cobboard.shovel.cs, SHOVEL_UP);
 }
 
+void shovel_kickstand(void)
+{
+	quadramp_set_1st_order_vars(&cobboard.shovel.qr, 200, 200);
+	quadramp_set_2nd_order_vars(&cobboard.shovel.qr, 10, 10);
+	cs_set_consign(&cobboard.shovel.cs, SHOVEL_UP);
+}
+
 uint8_t shovel_is_up(void)
 {
 	return shovel_is_at_pos(SHOVEL_UP);
diff --git a/projects/microb2010/cobboard/shovel.h b/projects/microb2010/cobboard/shovel.h
index fa0e2a2..3b01e77 100644
--- a/projects/microb2010/cobboard/shovel.h
+++ b/projects/microb2010/cobboard/shovel.h
@@ -32,6 +32,7 @@ void shovel_set(void *mot, int32_t cmd);
 void shovel_down(void);
 void shovel_mid(void);
 void shovel_up(void);
+void shovel_kickstand(void);
 
 uint8_t shovel_is_up(void);
 uint8_t shovel_is_down(void);
diff --git a/projects/microb2010/cobboard/state.c b/projects/microb2010/cobboard/state.c
index 4eef55f..d9e6533 100644
--- a/projects/microb2010/cobboard/state.c
+++ b/projects/microb2010/cobboard/state.c
@@ -66,6 +66,7 @@ static uint8_t cob_count;
 #define INIT(mode)       ((mode) == I2C_COBBOARD_MODE_INIT)
 #define HARVEST(mode)    ((mode) == I2C_COBBOARD_MODE_HARVEST)
 #define EJECT(mode)      ((mode) == I2C_COBBOARD_MODE_EJECT)
+#define KICKSTAND(mode)  ((mode) == I2C_COBBOARD_MODE_KICKSTAND)
 
 uint8_t state_debug = 0;
 
@@ -131,6 +132,10 @@ uint8_t state_spicklemode_weak(uint8_t side)
 /* pack/deploy spickles depending on mode */
 static void spickle_prepare(uint8_t side)
 {
+	/* pack spickle if we are not in harvest mode */
+	if (!HARVEST(state_mode))
+		spickle_pack(side);
+
 	/* we do nothing in mode no out */
 	if (state_spicklemode_nomove(side))
 		return;
@@ -337,20 +342,36 @@ void state_machine(void)
 			state_mode = I2C_COBBOARD_MODE_HARVEST;
 		}
 
-		/* pack/deply spickles, enable/disable roller */
-		cobroller_off(I2C_LEFT_SIDE);
-		cobroller_off(I2C_RIGHT_SIDE);
-		spickle_prepare(I2C_LEFT_SIDE);
-		spickle_prepare(I2C_RIGHT_SIDE);
-
-		/* harvest */
-		if (cob_count < 5) {
-			if (state_spicklemode_deployed(I2C_LEFT_SIDE) &&
-			    state_spicklemode_autoharvest(I2C_LEFT_SIDE))
-				state_do_harvest(I2C_LEFT_SIDE);
-			if (state_spicklemode_deployed(I2C_RIGHT_SIDE) &&
-			    state_spicklemode_autoharvest(I2C_RIGHT_SIDE))
-				state_do_harvest(I2C_RIGHT_SIDE);
+		if (HARVEST(state_mode)) {
+			/* init for each loop */
+			shovel_down();
+			servo_carry_close();
+			servo_door_close();
+			shovel_current_limit_enable(0);
+
+			/* pack/deply spickles, enable/disable roller */
+			cobroller_off(I2C_LEFT_SIDE);
+			cobroller_off(I2C_RIGHT_SIDE);
+			spickle_prepare(I2C_LEFT_SIDE);
+			spickle_prepare(I2C_RIGHT_SIDE);
+
+			/* harvest if not many cobs */
+			if (cob_count < 5) {
+				if (state_spicklemode_deployed(I2C_LEFT_SIDE) &&
+				    state_spicklemode_autoharvest(I2C_LEFT_SIDE))
+					state_do_harvest(I2C_LEFT_SIDE);
+				if (state_spicklemode_deployed(I2C_RIGHT_SIDE) &&
+				    state_spicklemode_autoharvest(I2C_RIGHT_SIDE))
+					state_do_harvest(I2C_RIGHT_SIDE);
+			}
+		}
+
+		/* help to climb the hill */
+		if (KICKSTAND(state_mode)) {
+			servo_carry_open();
+			servo_door_open();
+			shovel_current_limit_enable(1);
+			shovel_kickstand();
 		}
 
 		/* eject */
diff --git a/projects/microb2010/common/i2c_commands.h b/projects/microb2010/common/i2c_commands.h
index b5c9d36..5e4a449 100644
--- a/projects/microb2010/common/i2c_commands.h
+++ b/projects/microb2010/common/i2c_commands.h
@@ -1,6 +1,6 @@
 /*
- *  Copyright Droids Corporation (2007)
- * 
+ *  Copyright Droids Corporation (2010)
+ *
  *  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
@@ -78,6 +78,7 @@ struct i2c_cmd_cobboard_set_mode {
 #define I2C_COBBOARD_MODE_HARVEST      0x01 /* harvest mode */
 #define I2C_COBBOARD_MODE_EJECT        0x02 /* eject cobs */
 #define I2C_COBBOARD_MODE_INIT         0x03 /* init state machine */
+#define I2C_COBBOARD_MODE_KICKSTAND    0x04 /* help to climb the hill */
 	uint8_t mode;
 };
 
@@ -128,6 +129,7 @@ struct i2c_ans_cobboard_status {
 #define I2C_COBBOARD_STATUS_LBUSY         0x02
 #define I2C_COBBOARD_STATUS_RBUSY         0x03
 #define I2C_COBBOARD_STATUS_EJECT         0x04
+#define I2C_COBBOARD_STATUS_KICKSTAND     0x05
 	uint8_t status;
 
 	uint8_t cob_count;
diff --git a/projects/microb2010/mainboard/commands_mainboard.c b/projects/microb2010/mainboard/commands_mainboard.c
index 2335ce3..04e8c91 100644
--- a/projects/microb2010/mainboard/commands_mainboard.c
+++ b/projects/microb2010/mainboard/commands_mainboard.c
@@ -738,11 +738,13 @@ static void cmd_cobboard_setmode1_parsed(void *parsed_result, void *data)
 		i2c_cobboard_set_mode(I2C_COBBOARD_MODE_INIT);
 	else if (!strcmp_P(res->arg1, PSTR("eject")))
 		i2c_cobboard_set_mode(I2C_COBBOARD_MODE_EJECT);
+	else if (!strcmp_P(res->arg1, PSTR("kickstand")))
+		i2c_cobboard_set_mode(I2C_COBBOARD_MODE_KICKSTAND);
 }
 
 prog_char str_cobboard_setmode1_arg0[] = "cobboard";
 parse_pgm_token_string_t cmd_cobboard_setmode1_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_cobboard_setmode1_result, arg0, str_cobboard_setmode1_arg0);
-prog_char str_cobboard_setmode1_arg1[] = "init#eject";
+prog_char str_cobboard_setmode1_arg1[] = "init#eject#kickstand";
 parse_pgm_token_string_t cmd_cobboard_setmode1_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_cobboard_setmode1_result, arg1, str_cobboard_setmode1_arg1);
 
 prog_char help_cobboard_setmode1[] = "set cobboard mode (mode)";
-- 
2.39.5