car_hw: cleanup Makefile and lib interfaces

This commit is contained in:
Eugene Batalov
2016-08-19 11:36:43 +03:00
parent e8f488a580
commit bbe506dbb5
21 changed files with 162 additions and 369 deletions
+2 -2
View File
@@ -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:
+64
View File
@@ -0,0 +1,64 @@
#include "car_conn.h"
#include <usbd_cdc_vcp.h>
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();
}
+14 -14
View File
@@ -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
+11 -11
View File
@@ -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);
}
-119
View File
@@ -1,119 +0,0 @@
#include <stddef.h>
#include <stdbool.h>
#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();
}
-69
View File
@@ -1,69 +0,0 @@
#include <stddef.h>
#include <stdbool.h>
#include <usbd_cdc_vcp.h>
#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();
}
+5 -5
View File
@@ -1,10 +1,10 @@
#include <stm32f4xx.h>
#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--;
+21
View File
@@ -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);
}
-59
View File
@@ -1,59 +0,0 @@
#include "communication.h"
#include <stddef.h>
#include <stdbool.h>
#include <usbd_cdc_vcp.h>
#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]));
}
}
+15
View File
@@ -0,0 +1,15 @@
#pragma once
#include <stddef.h>
#include <stdint.h>
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);
+6 -6
View File
@@ -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);
+8 -8
View File
@@ -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);
-4
View File
@@ -1,4 +0,0 @@
#pragma once
#include <stdbool.h>
void run_programmed_car(volatile bool *stop);
-4
View File
@@ -1,4 +0,0 @@
#pragma once
#include <stdbool.h>
void run_rc_car(volatile bool *stop);
+11
View File
@@ -0,0 +1,11 @@
#pragma once
#include <stdint.h>
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();
+3 -18
View File
@@ -3,24 +3,9 @@
#include <stdbool.h>
#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);
-13
View File
@@ -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();
-3
View File
@@ -1,3 +0,0 @@
#pragma once
extern char* malloc_static(int);
-9
View File
@@ -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();
-23
View File
@@ -1,23 +0,0 @@
#include <stddef.h>
#include <stdbool.h>
#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;
}
+2 -2
View File
@@ -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();
}
/******************************************************************************/