diff options
| -rw-r--r-- | protocol.md | 13 | ||||
| -rw-r--r-- | robot/calibration.c | 1 | ||||
| -rw-r--r-- | robot/errcatch.c | 3 | ||||
| -rw-r--r-- | robot/grid.c | 1 | ||||
| -rw-r--r-- | robot/halt.c | 5 | ||||
| -rw-r--r-- | robot/maze.c | 1 | ||||
| -rw-r--r-- | robot/mode_grid.c | 3 | ||||
| -rw-r--r-- | robot/mode_grid.h (renamed from robot/grid.h) | 0 | ||||
| -rw-r--r-- | robot/mode_halt.c | 3 | ||||
| -rw-r--r-- | robot/mode_halt.h (renamed from robot/halt.h) | 0 | ||||
| -rw-r--r-- | robot/mode_lcal.c | 1 | ||||
| -rw-r--r-- | robot/mode_lcal.h (renamed from robot/calibration.h) | 2 | ||||
| -rw-r--r-- | robot/mode_maze.c | 3 | ||||
| -rw-r--r-- | robot/mode_maze.h (renamed from robot/maze.h) | 0 | ||||
| -rw-r--r-- | robot/modes.c | 20 | ||||
| -rw-r--r-- | robot/modes.h | 30 | ||||
| -rw-r--r-- | robot/readme.md | 2 | ||||
| -rw-r--r-- | robot/sercomm.c | 8 | ||||
| -rw-r--r-- | robot/setup.c | 1 | ||||
| -rw-r--r-- | robot/tests/mode.bin | 1 | 
20 files changed, 81 insertions, 17 deletions
| diff --git a/protocol.md b/protocol.md index 7084d14..345fe50 100644 --- a/protocol.md +++ b/protocol.md @@ -34,7 +34,7 @@ readability.  |--:|---|:-:|:-:|---|  |`0x00`|[PING](#ping)|yes|`r <=> c`|<u>ping</u>  |`0x02`|[EXPT](#expt)|yes|`r --> c`|<u>ex</u>ce<u>pt</u>ion -|`0x04`|[MODE](#mode)|no|`r <=> c`|<u>mode</u> +|`0x04`|[MODE](#mode)|yes|`r <=> c`|<u>mode</u>  |`0x06`|[SPED](#sped)|no|`r <-- c`|<u>spe</u>e<u>d</u>  |`0x08`|[DIRC](#dirc)|no|`r <-- c`|<u>dir</u>ect <u>c</u>ontrol  |`0x0a`|[CORD](#cord)|no|`r <=> c`|<u>co</u>o<u>rd</u>inate @@ -96,7 +96,16 @@ message, and can be 0 in case of no message.  |`uint8_t`|mode code|  when initiated from the client, the **mode** command forces the robot to change -execution mode. the mode codes are undetermined as of now. +execution mode. **mode** can be one of: + +- 0: mode_maze +- 1: mode_grid +- 2: mode_halt +- 3: mode_lcal +- 4: mode_chrg +- 5: mode_dirc +- 6: mode_spin +- 7: mode_scal  #### get mode (`r --> c`) (2 bytes) diff --git a/robot/calibration.c b/robot/calibration.c deleted file mode 100644 index 7788532..0000000 --- a/robot/calibration.c +++ /dev/null @@ -1 +0,0 @@ -#include "calibration.h" diff --git a/robot/errcatch.c b/robot/errcatch.c index 99f1063..cf06f5d 100644 --- a/robot/errcatch.c +++ b/robot/errcatch.c @@ -2,7 +2,6 @@  #include <string.h>  #include "errcatch.h" -#include "halt.h"  #include "modes.h"  #include "orangutan_shim.h"  #include "sercomm.h" @@ -52,7 +51,7 @@ void w2_errcatch_handle_error(w2_s_error *error) {  	uint8_t severity = error->code & W2_E_TYPE_MASK;  	// trigger emergency mode for critical errors -	if ((severity ^ W2_E_TYPE_CRIT) == 0) g_w2_current_mode = &w2_mode_halt; +	if ((severity ^ W2_E_TYPE_CRIT) == 0) w2_modes_switch(W2_M_HALT);  	// TODO: handle more error types  	switch (error->code) { diff --git a/robot/grid.c b/robot/grid.c deleted file mode 100644 index 0c83272..0000000 --- a/robot/grid.c +++ /dev/null @@ -1 +0,0 @@ -#include "grid.h" diff --git a/robot/halt.c b/robot/halt.c deleted file mode 100644 index 2f159f0..0000000 --- a/robot/halt.c +++ /dev/null @@ -1,5 +0,0 @@ -#include <stdbool.h> - -#include "halt.h" - -void w2_mode_halt() { return; } diff --git a/robot/maze.c b/robot/maze.c deleted file mode 100644 index a27414f..0000000 --- a/robot/maze.c +++ /dev/null @@ -1 +0,0 @@ -#include "maze.h" diff --git a/robot/mode_grid.c b/robot/mode_grid.c new file mode 100644 index 0000000..8526499 --- /dev/null +++ b/robot/mode_grid.c @@ -0,0 +1,3 @@ +#include "mode_grid.h" + +void w2_mode_grid() {} diff --git a/robot/grid.h b/robot/mode_grid.h index fcf9100..fcf9100 100644 --- a/robot/grid.h +++ b/robot/mode_grid.h diff --git a/robot/mode_halt.c b/robot/mode_halt.c new file mode 100644 index 0000000..88d6183 --- /dev/null +++ b/robot/mode_halt.c @@ -0,0 +1,3 @@ +#include "mode_halt.h" + +void w2_mode_halt() { return; } diff --git a/robot/halt.h b/robot/mode_halt.h index d92905e..d92905e 100644 --- a/robot/halt.h +++ b/robot/mode_halt.h diff --git a/robot/mode_lcal.c b/robot/mode_lcal.c new file mode 100644 index 0000000..6b4e736 --- /dev/null +++ b/robot/mode_lcal.c @@ -0,0 +1 @@ +#include "mode_lcal.h" diff --git a/robot/calibration.h b/robot/mode_lcal.h index 5c1af38..dd373f0 100644 --- a/robot/calibration.h +++ b/robot/mode_lcal.h @@ -6,4 +6,4 @@   * turns robot on its own axis 360 degress, and aligns the front sensors with   * the line if found, else triggers halt mode (emergency)   */ -void w2_mode_calb(); +void w2_mode_lcal(); diff --git a/robot/mode_maze.c b/robot/mode_maze.c new file mode 100644 index 0000000..6ae62be --- /dev/null +++ b/robot/mode_maze.c @@ -0,0 +1,3 @@ +#include "mode_maze.h" + +void w2_mode_maze() {} diff --git a/robot/maze.h b/robot/mode_maze.h index 9fbeb8c..9fbeb8c 100644 --- a/robot/maze.h +++ b/robot/mode_maze.h diff --git a/robot/modes.c b/robot/modes.c index c22875c..1f36703 100644 --- a/robot/modes.c +++ b/robot/modes.c @@ -1,6 +1,24 @@  #include "modes.h" -#include "halt.h" +#include "sercomm.h"  void (*g_w2_current_mode)() = &w2_mode_halt;  void w2_modes_main() { (*g_w2_current_mode)(); } + +void w2_modes_switch(w2_e_mode new_mode) { +	if (new_mode == W2_M_PREV) { +		// TODO implement previous mode buffer +	} else { +		g_w2_current_mode = W2_MODES[new_mode]; +	} + +	// forward mode change to sercomm +	size_t msg_size		  = sizeof(w2_s_cmd_mode_tx); +	w2_s_cmd_mode_tx *msg = malloc(msg_size); +	msg->opcode			  = W2_CMD_MODE | W2_CMDDIR_TX; +	msg->mode			  = (uint8_t)new_mode; +	w2_s_bin *msg_bin	  = w2_bin_s_alloc(msg_size, (uint8_t *)msg); +	w2_sercomm_append_msg(msg_bin); +	free(msg); +	free(msg_bin); +} diff --git a/robot/modes.h b/robot/modes.h index dd34690..fe81043 100644 --- a/robot/modes.h +++ b/robot/modes.h @@ -1,5 +1,11 @@  #pragma once +#include "mode_grid.h" +#include "mode_halt.h" +#include "mode_lcal.h" +#include "mode_maze.h" + +/** function pointer to current mode */  extern void (*g_w2_current_mode)();  /** @@ -8,3 +14,27 @@ extern void (*g_w2_current_mode)();   * executes mode in g_w2_current_mode   */  void w2_modes_main(); + +/** mode constants */ +typedef enum { +	W2_M_PREV = -1, +	W2_M_MAZE = 0, +	W2_M_GRID = 1, +	W2_M_HALT = 2, +	W2_M_LCAL = 3, +	W2_M_CHRG = 4, +	W2_M_DIRC = 5, +	W2_M_SPIN = 6, +	W2_M_SCAL = 7, +} w2_e_mode; + +/** array that maps w2_e_mode to mode function pointers */ +static const void(*const W2_MODES[]) = { +	&w2_mode_maze, +	&w2_mode_grid, +	&w2_mode_grid, +	&w2_mode_halt, +}; + +/** switch the current mode */ +void w2_modes_switch(w2_e_mode new_mode); diff --git a/robot/readme.md b/robot/readme.md index 2de14db..31acafc 100644 --- a/robot/readme.md +++ b/robot/readme.md @@ -62,7 +62,7 @@ what they're supposed to do:  |maze            |`mode_maze  `|Jorn & Abdullaahi| controls robot during maze portion of map; hands off control to warehouse module|  |warehouse       |`mode_grid  `|Loek| controls robot during warehouse portion of map; hands off control to maze module|  |emergency stop  |`mode_halt  `|Fiona| stops all execution until emergency mode is reset by software or user| -|calibration     |`mode_calb  `|Fiona| find line by turning on own axis if lost| +|calibration     |`mode_lcal  `|Fiona| find line by turning on own axis if lost|  ## some standards diff --git a/robot/sercomm.c b/robot/sercomm.c index a3ccdb0..e972f28 100644 --- a/robot/sercomm.c +++ b/robot/sercomm.c @@ -4,6 +4,7 @@  #include "../shared/bin.h"  #include "../shared/serial_parse.h"  #include "hypervisor.h" +#include "modes.h"  #include "orangutan_shim.h"  #include "sercomm.h" @@ -66,7 +67,12 @@ void w2_cmd_ping_rx(w2_s_bin *data) {  	free(return_message_bin);  } -void w2_cmd_mode_rx(w2_s_bin *data) { return; } +void w2_cmd_mode_rx(w2_s_bin *data) { +	w2_s_cmd_mode_rx *message = malloc(w2_cmd_sizeof(data->data, data->bytes)); +	memcpy(message, data->data, data->bytes); + +	w2_modes_switch(message->mode); +}  void w2_cmd_sped_rx(w2_s_bin *data) { return; } diff --git a/robot/setup.c b/robot/setup.c index d075c41..1ecda43 100644 --- a/robot/setup.c +++ b/robot/setup.c @@ -2,7 +2,6 @@  #include "../shared/bin.h"  #include "../shared/consts.h" -#include "halt.h"  #include "modes.h"  #include "orangutan_shim.h"  #include "sercomm.h" diff --git a/robot/tests/mode.bin b/robot/tests/mode.bin new file mode 100644 index 0000000..35ebd35 --- /dev/null +++ b/robot/tests/mode.bin @@ -0,0 +1 @@ +ÿ
\ No newline at end of file |