diff --git a/car_hw/Makefile b/car_hw/Makefile index 261741378fa..3e96486f015 100644 --- a/car_hw/Makefile +++ b/car_hw/Makefile @@ -1,4 +1,4 @@ -BIN_DIR=$(PWD)/bin +BIN_DIR=bin SRC_DIR=src LIB_DIR=$(SRC_DIR)/lib OS_ARCH=linux-arm @@ -65,7 +65,7 @@ $(CAR_OBJ): \ $(LD_ALL_DEPS) $(BIN_DIR)/$(CAR_OBJ_PREFIX)%.o: $(SRC_DIR)/%.c \ - $(call dirhs,$(SRC_DIR)) + $(call dirhs,$(SRC_DIR)/include) $(CC_ALL_DEPS) clean: diff --git a/car_hw/src/car_conn.c b/car_hw/src/car_conn.c new file mode 100644 index 00000000000..739e8043fb5 --- /dev/null +++ b/car_hw/src/car_conn.c @@ -0,0 +1,64 @@ +#include "car_conn.h" + +#include + +void car_conn_init(void) +{ + VCP_init(); + car_conn_rcv_buf_clear(); +} + +void car_conn_rcv_buf_clear(void) +{ + uint8_t tmp_char; + while (VCP_get_char(&tmp_char)); +} + +void car_conn_snd_byte(uint8_t b) +{ + VCP_put_char(b); +} + +void car_conn_snd_int(int32_t n) +{ + VCP_put_char(n >> 24); + VCP_put_char(n >> 16); + VCP_put_char(n >> 8); + VCP_put_char(n); +} + +void car_conn_snd_buf(uint32_t size, int buf) +{ + size_t i = 0; + uint8_t *cbuf = (uint8_t *)buf; + + for (; i < size; ++i) + car_conn_snd_byte(cbuf[i]); +} + +uint8_t car_conn_rcv_byte(void) +{ + uint8_t byte = 0; + while (!VCP_get_char(&byte)); + return byte; +} + +int32_t car_conn_rcv_int(void) +{ + int32_t result = 0; + + result += (car_conn_rcv_byte() << 24); + result += (car_conn_rcv_byte() << 16); + result += (car_conn_rcv_byte() << 8); + result += car_conn_rcv_byte(); + return result; +} + +void car_conn_rcv_buf(uint32_t size, int buf) +{ + uint8_t* cbuf = (uint8_t *)buf; + size_t i = 0; + + for (; i < size; ++i) + cbuf[i] = car_conn_rcv_byte(); +} diff --git a/car_hw/src/car_engine.c b/car_hw/src/car_engine.c index f1c21f22801..0b5e3e95f4e 100644 --- a/car_hw/src/car_engine.c +++ b/car_hw/src/car_engine.c @@ -13,7 +13,7 @@ #define CAR_ENGINE_RWHEEL_FWD_PIN GPIO_Pin_6 #define CAR_ENGINE_RWHEEL_BKWD_PIN GPIO_Pin_7 -void engine_init(void) +void car_engine_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(CAR_ENGINE_GPIO_PORT_CLOCK, ENABLE); @@ -29,7 +29,7 @@ void engine_init(void) GPIO_Init(CAR_ENGINE_GPIO_PORT, &GPIO_InitStructure); } -void engine_stop(void) +void car_engine_stop(void) { GPIO_ResetBits(CAR_ENGINE_GPIO_PORT, 0 | CAR_ENGINE_LWHEEL_BKWD_PIN @@ -40,40 +40,40 @@ void engine_stop(void) } #ifdef CAR_ENGINE_ENABLE -void engine_forward(void) +void car_engine_forward(void) { - engine_stop(); + car_engine_stop(); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_ENABLE_PIN); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_LWHEEL_FWD_PIN); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_RWHEEL_FWD_PIN); } -void engine_backward(void) +void car_engine_backward(void) { - engine_stop(); + car_engine_stop(); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_ENABLE_PIN); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_LWHEEL_BKWD_PIN); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_RWHEEL_BKWD_PIN); } -void engine_turn_left(void) +void car_engine_turn_left(void) { - engine_stop(); + car_engine_stop(); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_ENABLE_PIN); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_LWHEEL_BKWD_PIN); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_RWHEEL_FWD_PIN); } -void engine_turn_right(void) +void car_engine_turn_right(void) { - engine_stop(); + car_engine_stop(); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_ENABLE_PIN); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_LWHEEL_FWD_PIN); GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_RWHEEL_BKWD_PIN); } #else -void engine_forward(void) {} -void engine_backward(void) {} -void engine_turn_right(void) {} -void engine_turn_left(void) {} +void car_engine_forward(void) {} +void car_engine_backward(void) {} +void car_engine_turn_right(void) {} +void car_engine_turn_left(void) {} #endif // CAR_ENGINE_ENABLE diff --git a/car_hw/src/car_leds.c b/car_hw/src/car_leds.c index d49ed2f9b85..250cc711238 100644 --- a/car_hw/src/car_leds.c +++ b/car_hw/src/car_leds.c @@ -5,15 +5,15 @@ #include "stm32f4_discovery.h" #include "stm32f4xx_conf.h" -void leds_init(void) +void car_leds_init(void) { - STM_EVAL_LEDInit(LED_RED); - STM_EVAL_LEDInit(LED_ORANGE); - STM_EVAL_LEDInit(LED_GREEN); - STM_EVAL_LEDInit(LED_BLUE); + STM_EVAL_LEDInit(CAR_LED_RED); + STM_EVAL_LEDInit(CAR_LED_ORANGE); + STM_EVAL_LEDInit(CAR_LED_GREEN); + STM_EVAL_LEDInit(CAR_LED_BLUE); } -void led_set(int led, bool on) +void car_led_set(int led, bool on) { if (on) STM_EVAL_LEDOn(led); @@ -21,10 +21,10 @@ void led_set(int led, bool on) STM_EVAL_LEDOff(led); } -void leds_clear_all(void) +void car_leds_clear_all(void) { - led_set(LED_GREEN, false); - led_set(LED_ORANGE, false); - led_set(LED_RED, false); - led_set(LED_BLUE, false); + car_led_set(CAR_LED_GREEN, false); + car_led_set(CAR_LED_ORANGE, false); + car_led_set(CAR_LED_RED, false); + car_led_set(CAR_LED_BLUE, false); } diff --git a/car_hw/src/car_prog.c b/car_hw/src/car_prog.c deleted file mode 100644 index c81adb87a95..00000000000 --- a/car_hw/src/car_prog.c +++ /dev/null @@ -1,119 +0,0 @@ -#include -#include - -#include "car_leds.h" -#include "car_engine.h" -#include "car_prog.h" -#include "time.h" - -const uint32_t PROGRAM_DURATION_MS = 3000; - -static void program_stop(void) -{ - wait(PROGRAM_DURATION_MS); -} - -static void program_forward(void) -{ - engine_forward(); - wait(PROGRAM_DURATION_MS); -} - -static void program_backward(void) -{ - engine_backward(); - wait(PROGRAM_DURATION_MS); -} - -static void program_rotation_left(void) -{ - engine_turn_left(); - wait(PROGRAM_DURATION_MS); -} - -static void program_rotation_right(void) -{ - engine_turn_right(); - wait(PROGRAM_DURATION_MS); -} - -static void program_arbitraty_route(void) -{ - const int ROUTE_PIECE_DURATION = 6 * PROGRAM_DURATION_MS; - engine_forward(); - wait(ROUTE_PIECE_DURATION); - - engine_backward(); - wait(ROUTE_PIECE_DURATION); - - engine_forward(); - wait(ROUTE_PIECE_DURATION / 2); - - engine_turn_right(); - wait(ROUTE_PIECE_DURATION); - - engine_forward(); - wait(ROUTE_PIECE_DURATION / 2); - - engine_backward(); - wait(ROUTE_PIECE_DURATION / 2); - - engine_turn_left(); - wait(ROUTE_PIECE_DURATION); - - engine_backward(); - wait(ROUTE_PIECE_DURATION / 2); - - engine_stop(); - wait(ROUTE_PIECE_DURATION / 2); -} - -typedef void (*car_program_code_t)(void); -typedef struct car_program_desc { - car_program_code_t code; - struct { - bool green : 1; - bool orange : 1; - bool red : 1; - bool blue : 1; - } leds; -} car_program_desc_t; - -static car_program_desc_t const PROGRAMS[] = { - { .code = program_stop, .leds = {} }, - { .code = program_forward, .leds = { .green = 1 } }, - { .code = program_backward, .leds = { .orange = 1 } }, - { .code = program_rotation_left, .leds = { .red = 1 } }, - { .code = program_rotation_right, .leds = { .blue = 1 } }, - { .code = program_arbitraty_route, .leds = { .green = 1, .orange = 1 } } -}; -static const size_t PROGRAMS_CNT = sizeof(PROGRAMS) / sizeof(PROGRAMS[0]); -static size_t cur_program_ix; - -static void set_cur_program(size_t program_ix) -{ - cur_program_ix = program_ix; - - leds_clear_all(); - - const car_program_desc_t *cpd = &PROGRAMS[cur_program_ix]; - if (cpd->leds.green) - led_set(LED_GREEN, true); - if (cpd->leds.orange) - led_set(LED_ORANGE, true); - if (cpd->leds.red) - led_set(LED_RED, true); - if (cpd->leds.blue) - led_set(LED_BLUE, true); -} - -void run_programmed_car(volatile bool *stop) -{ - set_cur_program(0); - while(!*stop) { - PROGRAMS[cur_program_ix].code(); - set_cur_program((cur_program_ix + 1) % PROGRAMS_CNT); - } - leds_clear_all(); - engine_stop(); -} diff --git a/car_hw/src/car_rc.c b/car_hw/src/car_rc.c deleted file mode 100644 index c15f468931b..00000000000 --- a/car_hw/src/car_rc.c +++ /dev/null @@ -1,69 +0,0 @@ -#include -#include -#include - -#include "car_rc.h" -#include "car_leds.h" -#include "car_engine.h" - -typedef enum { - RC_CAR_CMD_STOP = '0', - RC_CAR_CMD_FWD = '1', - RC_CAR_CMD_BKWD = '2', - RC_CAR_CMD_RIGHT = '3', - RC_CAR_CMD_LEFT = '4' -} RC_CAR_CMD; - -void send_cmd_result(uint8_t cmd, uint8_t result) -{ - VCP_put_char('('); - VCP_put_char(cmd); - VCP_put_char(':'); - VCP_put_char(result); - VCP_put_char(')'); -} - -void run_rc_car(volatile bool *stop) -{ - led_set(LED_GREEN, true); - led_set(LED_ORANGE, true); - led_set(LED_RED, true); - led_set(LED_BLUE, true); - engine_stop(); - - // Cleanup VCP buffer. This doesn't clean all the garbage. - // Some garbage arrives much later then we read here. - uint8_t tmp_char; - while(VCP_get_char(&tmp_char)); - - uint8_t cur_cmd = RC_CAR_CMD_STOP; - uint8_t new_cmd = cur_cmd; - - while(true) { - while((!*stop) && !VCP_get_char(&new_cmd)) {} - if (*stop) - break; - - if (cur_cmd == new_cmd) {} - else if (new_cmd == RC_CAR_CMD_STOP) - engine_stop(); - else if (new_cmd == RC_CAR_CMD_FWD) - engine_forward(); - else if (new_cmd == RC_CAR_CMD_BKWD) - engine_backward(); - else if (new_cmd == RC_CAR_CMD_RIGHT) - engine_turn_right(); - else if (new_cmd == RC_CAR_CMD_LEFT) - engine_turn_left(); - else { - send_cmd_result(new_cmd, '1'); - continue; - } - - send_cmd_result(new_cmd, '0'); - cur_cmd = new_cmd; - } - - leds_clear_all(); - engine_stop(); -} diff --git a/car_hw/src/time.c b/car_hw/src/car_time.c similarity index 73% rename from car_hw/src/time.c rename to car_hw/src/car_time.c index 071b3a9bc0a..7f34154c40a 100644 --- a/car_hw/src/time.c +++ b/car_hw/src/car_time.c @@ -1,10 +1,10 @@ #include -#include "time.h" +#include "car_time.h" static volatile uint32_t pending_timer_ticks, ticks_since_boot; -void time_init(void) +void car_time_init(void) { // XXX this is copy pasted and it doesn't provide 1ms periodic // timer interrupt @@ -12,17 +12,17 @@ void time_init(void) while (1){}; } -void wait(volatile uint32_t ms) { +void car_time_wait(volatile uint32_t ms) { pending_timer_ticks = ms; while(pending_timer_ticks){}; } -uint32_t get_timestamp(void) +uint32_t car_time_get_timestamp(void) { return ticks_since_boot; } -void timer_irq_handler() { +void car_time_irq_handler() { if (pending_timer_ticks) pending_timer_ticks--; diff --git a/car_hw/src/car_user_btn.c b/car_hw/src/car_user_btn.c new file mode 100644 index 00000000000..f802b74d50f --- /dev/null +++ b/car_hw/src/car_user_btn.c @@ -0,0 +1,21 @@ +#include "car_user_btn.h" + +static car_user_btn_handler_t user_btn_handler; + +void car_user_btn_init(car_user_btn_handler_t handler) +{ + user_btn_handler = handler; + STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); +} + +bool car_user_btn_is_pushed(void) +{ + return STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET; +} + +void EXTI0_IRQHandler(void) +{ + if (user_btn_handler) + user_btn_handler(); + EXTI_ClearITPendingBit(USER_BUTTON_EXTI_LINE); +} diff --git a/car_hw/src/communication.c b/car_hw/src/communication.c deleted file mode 100644 index 368029b7e1f..00000000000 --- a/car_hw/src/communication.c +++ /dev/null @@ -1,59 +0,0 @@ -#include "communication.h" - -#include -#include -#include - -#include "memory.h" - -void clear_buffer() -{ - uint8_t tmp_char; - while (VCP_get_char(&tmp_char)); -} - -void send_int(int n) -{ - VCP_put_char(n >> 24); - VCP_put_char(n >> 16); - VCP_put_char(n >> 8); - VCP_put_char(n); -} - -void send_buffer(int size, int pointer) -{ - int i = 0; - char *buffer = (char *) pointer; - - send_int(size); - for (; i < size; ++i) { - VCP_put_char(buffer[i]); - } -} - -int receive_int() -{ - int result = 0; - uint8_t byte = 0; - - while (!VCP_get_char(&byte)); - result += (byte << 24); - while (!VCP_get_char(&byte)); - result += (byte << 16); - while (!VCP_get_char(&byte)); - result += (byte << 8); - while (!VCP_get_char(&byte)); - result += byte; - - return result; -} - -void receive_buffer(int size, int pointer) -{ - char* buffer = (char*) pointer; - int i = 0; - - for (; i < size; ++i) { - while(!VCP_get_char(&buffer[i])); - } -} diff --git a/car_hw/src/include/car_conn.h b/car_hw/src/include/car_conn.h new file mode 100644 index 00000000000..6f0a99c47eb --- /dev/null +++ b/car_hw/src/include/car_conn.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +void car_conn_init(void); +void car_conn_rcv_buf_clear(void); + +void car_conn_snd_byte(uint8_t b); +void car_conn_snd_int(int32_t n); +void car_conn_snd_buf(uint32_t size, /*void */int buf); + +uint8_t car_conn_rcv_byte(void); +int32_t car_conn_rcv_int(void); +void car_conn_rcv_buf(uint32_t size, /*void **/int buf); diff --git a/car_hw/src/include/car_engine.h b/car_hw/src/include/car_engine.h index 9637808cfc9..56885b70d99 100644 --- a/car_hw/src/include/car_engine.h +++ b/car_hw/src/include/car_engine.h @@ -1,8 +1,8 @@ #pragma once -void engine_init(void); -void engine_stop(void); -void engine_forward(void); -void engine_backward(void); -void engine_turn_left(void); -void engine_turn_right(void); +void car_engine_init(void); +void car_engine_stop(void); +void car_engine_forward(void); +void car_engine_backward(void); +void car_engine_turn_left(void); +void car_engine_turn_right(void); diff --git a/car_hw/src/include/car_leds.h b/car_hw/src/include/car_leds.h index 7384538b485..8089c0fbf58 100644 --- a/car_hw/src/include/car_leds.h +++ b/car_hw/src/include/car_leds.h @@ -5,12 +5,12 @@ typedef enum { - LED_GREEN = LED4, - LED_ORANGE = LED3, - LED_RED = LED5, - LED_BLUE = LED6 -} led_t; + CAR_LED_GREEN = LED4, + CAR_LED_ORANGE = LED3, + CAR_LED_RED = LED5, + CAR_LED_BLUE = LED6 +} car_led_t; -void leds_init(void); -void leds_clear_all(void); -void led_set(int led, bool on); +void car_leds_init(void); +void car_leds_clear_all(void); +void car_led_set(int led, bool on); diff --git a/car_hw/src/include/car_prog.h b/car_hw/src/include/car_prog.h deleted file mode 100644 index ebdd9715b4f..00000000000 --- a/car_hw/src/include/car_prog.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#include -void run_programmed_car(volatile bool *stop); diff --git a/car_hw/src/include/car_rc.h b/car_hw/src/include/car_rc.h deleted file mode 100644 index e42da955435..00000000000 --- a/car_hw/src/include/car_rc.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#include -void run_rc_car(volatile bool *stop); diff --git a/car_hw/src/include/car_time.h b/car_hw/src/include/car_time.h new file mode 100644 index 00000000000..babad33c08f --- /dev/null +++ b/car_hw/src/include/car_time.h @@ -0,0 +1,11 @@ +#pragma once + +#include + +void car_time_init(void); +void car_time_wait(volatile uint32_t ms); +uint32_t car_time_get_timestamp(void); +/* + * Called from systick handler + */ +void car_time_irq_handler(); diff --git a/car_hw/src/include/car_user_btn.h b/car_hw/src/include/car_user_btn.h index 79dccf90c89..b78673a8798 100644 --- a/car_hw/src/include/car_user_btn.h +++ b/car_hw/src/include/car_user_btn.h @@ -3,24 +3,9 @@ #include #include "stm32f4_discovery.h" -typedef void (*user_btn_handler_t)(void); -static user_btn_handler_t user_btn_handler; +typedef void (*car_user_btn_handler_t)(void); // @handler can be NULL -inline void user_btn_init(user_btn_handler_t handler) -{ - user_btn_handler = handler; - STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); -} +void car_user_btn_init(car_user_btn_handler_t handler); -inline bool user_btn_is_pushed(void) -{ - return STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET; -} - -void EXTI0_IRQHandler(void) -{ - if (user_btn_handler) - user_btn_handler(); - EXTI_ClearITPendingBit(USER_BUTTON_EXTI_LINE); -} +bool car_user_btn_is_pushed(void); diff --git a/car_hw/src/include/communication.h b/car_hw/src/include/communication.h deleted file mode 100644 index cc9284874ef..00000000000 --- a/car_hw/src/include/communication.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -void clear_buffer(); - -void send_int(int i); -void send_buffer(int size, int pointer); - -int receive_int(); -void receive_buffer(int size, int pointer); - -void set_state(int i); -int get_state(); - diff --git a/car_hw/src/include/memory.h b/car_hw/src/include/memory.h deleted file mode 100644 index 738b4c1687c..00000000000 --- a/car_hw/src/include/memory.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -extern char* malloc_static(int); diff --git a/car_hw/src/include/time.h b/car_hw/src/include/time.h deleted file mode 100644 index 81871c3bb30..00000000000 --- a/car_hw/src/include/time.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -void time_init(void); -void wait(volatile uint32_t ms); -uint32_t get_timestamp(void); -/* - * Called from systick handler - */ -void timer_irq_handler(); diff --git a/car_hw/src/main.c b/car_hw/src/main.c deleted file mode 100644 index 22bb7f8c191..00000000000 --- a/car_hw/src/main.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include - -#include "car_engine.h" -#include "car_leds.h" -#include "car_rc.h" -#include "car_user_btn.h" -#include "communication.h" -#include "time.h" - -#include "stm32f4xx_conf.h" -#include "stm32f4xx_it.h" - -int state = 0; - -void set_state(int i) { - state = i; -} - -int get_state() { - return state; -} - diff --git a/car_hw/src/stm32f4xx_it.c b/car_hw/src/stm32f4xx_it.c index c4045acc8a6..314958c8e7c 100644 --- a/car_hw/src/stm32f4xx_it.c +++ b/car_hw/src/stm32f4xx_it.c @@ -5,7 +5,7 @@ #include "usbd_core.h" #include "usbd_cdc_core.h" -#include "time.h" +#include "car_time.h" extern uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev); extern USB_OTG_CORE_HANDLE USB_OTG_dev; @@ -110,7 +110,7 @@ void PendSV_Handler(void) */ void SysTick_Handler(void) { - timer_irq_handler(); + car_time_irq_handler(); } /******************************************************************************/