Compare commits

...

5 Commits

7 changed files with 189 additions and 115 deletions

1
.gitignore vendored
View File

@ -6,3 +6,4 @@ GD32F103C8T6/Bootloader/Output/*
GD32F103C8T6/._GD32F10x.emProject GD32F103C8T6/._GD32F10x.emProject
*.emSession *.emSession
*.jlink *.jlink
._*

View File

@ -23,6 +23,7 @@ static uint16_t upgrade_write_index = 0;
/* 升级包数据接收长度 */ /* 升级包数据接收长度 */
static uint8_t upgrade_rx_buffer[1024] = {0}; static uint8_t upgrade_rx_buffer[1024] = {0};
static void api_write_upgrade_buffer(void);
static void api_notify_upgrade(uint8_t *buffer, uint16_t length); static void api_notify_upgrade(uint8_t *buffer, uint16_t length);
static void api_notify_get_fhss_channel(void); static void api_notify_get_fhss_channel(void);
static void api_package(uint8_t type, uint8_t command, uint8_t *data, uint8_t length); static void api_package(uint8_t type, uint8_t command, uint8_t *data, uint8_t length);
@ -199,6 +200,16 @@ void api_upload_data_forwarding(uint8_t type, uint8_t value)
__weak void api_notify_data_forwarding(uint8_t type, uint8_t value) { } __weak void api_notify_data_forwarding(uint8_t type, uint8_t value) { }
static void api_write_upgrade_buffer(void)
{
/* 写入升级包数据 */
fmc_write_bytes(FMC_ADDRESS_UPGRADE_BUFFER + upgrade_write_index * FMC_PAGE_SIZE, upgrade_rx_buffer, upgrade_rx_index / 4 + (upgrade_rx_index % 4 ? 1 : 0));
upgrade_write_index++;
upgrade_rx_length += upgrade_rx_index;
upgrade_rx_index = 0;
}
/** /**
* @brief * @brief
*/ */
@ -226,24 +237,22 @@ static void api_notify_upgrade(uint8_t *buffer, uint16_t length)
upgrade_pack_index = 0; upgrade_pack_index = 0;
} }
for (uint16_t i = 0; i < pack_length; i++)
upgrade_rx_buffer[upgrade_rx_index++] = buffer[i + 9];
if (index == upgrade_pack_index + 1) if (index == upgrade_pack_index + 1)
{ {
/* 更改ARM接收到的升级包序号 */ /* 更改ARM接收到的升级包序号 */
upgrade_pack_index = index; upgrade_pack_index = index;
if (upgrade_rx_index >= 1024 || upgrade_pack_index == upgrade_pack_count) for (uint16_t i = 0; i < pack_length; i++)
{ {
/* 写入升级包数据 */ upgrade_rx_buffer[upgrade_rx_index++] = buffer[i + 9];
fmc_write_bytes(FMC_ADDRESS_UPGRADE_BUFFER + upgrade_write_index * FMC_PAGE_SIZE, upgrade_rx_buffer, upgrade_rx_index / 4 + (upgrade_rx_index % 4 ? 1 : 0));
upgrade_write_index++; if (upgrade_rx_index >= 1024)
upgrade_rx_length += upgrade_rx_index; api_write_upgrade_buffer();
upgrade_rx_index = 0;
} }
if (upgrade_pack_index == upgrade_pack_count)
api_write_upgrade_buffer();
/* 通知上位机当前升级包成功接收 */ /* 通知上位机当前升级包成功接收 */
api_response_success(API_COMMAND_UPGRADE); api_response_success(API_COMMAND_UPGRADE);

View File

@ -22,7 +22,7 @@
#define API_FRAME_RESPONSE (0x01) /* 响应帧 */ #define API_FRAME_RESPONSE (0x01) /* 响应帧 */
#define API_FRAME_NOTIFICATION (0x02) /* 通知帧 */ #define API_FRAME_NOTIFICATION (0x02) /* 通知帧 */
#define SOFTWARE_VERSION ("V1.24") #define SOFTWARE_VERSION ("V1.28")
#define HARDWARE_VERSION ("V1.01") #define HARDWARE_VERSION ("V1.01")
extern uint8_t api_upgrade_mode; extern uint8_t api_upgrade_mode;

View File

@ -85,6 +85,8 @@ void v58_volume_down(void)
*/ */
void v58_stop(void) void v58_stop(void)
{ {
delay_ms(100);
/* 停止 */ /* 停止 */
v58_send_pulse(1); v58_send_pulse(1);

View File

@ -12,6 +12,7 @@ static uint64_t diaodu_rx_led_timestamp = 0;
static uint64_t run_led_timestamp = 0; static uint64_t run_led_timestamp = 0;
static uint64_t diaodu_status_rx_timestamp = 0; static uint64_t diaodu_status_rx_timestamp = 0;
static uint8_t vehicle_status_trigger_mode = 0; /* 车辆状态触发方式:0 IO; 1 CAN */
static uint8_t door_front_status = 1, door_front_status_temporary = 1; static uint8_t door_front_status = 1, door_front_status_temporary = 1;
static uint8_t door_back_status = 1, door_back_status_temporary = 1; static uint8_t door_back_status = 1, door_back_status_temporary = 1;
static uint8_t door_status = 2, door_status_temporary = 2; static uint8_t door_status = 2, door_status_temporary = 2;
@ -51,6 +52,8 @@ static uint8_t diaodu_upload_status = 0;
static void strobe_light_reset(void); static void strobe_light_reset(void);
/* 频闪灯闪烁*/ /* 频闪灯闪烁*/
static void strobe_light_toggle(uint8_t count); static void strobe_light_toggle(uint8_t count);
/* 投影灯控制 */
static void lp_light_write(uint8_t status);
/* 设置音量级别 */ /* 设置音量级别 */
static void set_volume_level(uint8_t level); static void set_volume_level(uint8_t level);
@ -88,28 +91,33 @@ void gpio_interrupt_callback(uint32_t pin)
switch (pin) switch (pin)
{ {
case DOOR_FRONT_PIN: case DOOR_FRONT_PIN:
door_front_status_temporary = gpio_input_bit_get(DOOR_FRONT_PERIPH, DOOR_FRONT_PIN);
door_front_upload_status = 0x01; door_front_upload_status = 0x01;
vehicle_status_trigger_mode = 0;
door_front_status_temporary = gpio_input_bit_get(DOOR_FRONT_PERIPH, DOOR_FRONT_PIN);
break; break;
case DOOR_BACK_PIN: case DOOR_BACK_PIN:
door_back_status_temporary = gpio_input_bit_get(DOOR_BACK_PERIPH, DOOR_BACK_PIN);
door_back_upload_status = 0x01; door_back_upload_status = 0x01;
vehicle_status_trigger_mode = 0;
door_back_status_temporary = gpio_input_bit_get(DOOR_BACK_PERIPH, DOOR_BACK_PIN);
break; break;
case TURN_LEFT_PIN: case TURN_LEFT_PIN:
turn_left_status_temporary = gpio_input_bit_get(TURN_LEFT_PERIPH, TURN_LEFT_PIN);
turn_left_upload_status = 0x01; turn_left_upload_status = 0x01;
vehicle_status_trigger_mode = 0;
turn_left_status_temporary = gpio_input_bit_get(TURN_LEFT_PERIPH, TURN_LEFT_PIN);
break; break;
case TURN_RIGHT_PIN: case TURN_RIGHT_PIN:
turn_right_status_temporary = gpio_input_bit_get(TURN_RIGHT_PERIPH, TURN_RIGHT_PIN);
turn_right_upload_status = 0x01; turn_right_upload_status = 0x01;
vehicle_status_trigger_mode = 0;
turn_right_status_temporary = gpio_input_bit_get(TURN_RIGHT_PERIPH, TURN_RIGHT_PIN);
break; break;
case REVERSING_PIN: case REVERSING_PIN:
reversing_status_temporary = gpio_input_bit_get(REVERSING_PERIPH, REVERSING_PIN);
reversing_upload_status = 0x01; reversing_upload_status = 0x01;
vehicle_status_trigger_mode = 0;
reversing_status_temporary = gpio_input_bit_get(REVERSING_PERIPH, REVERSING_PIN);
break; break;
} }
} }
@ -194,6 +202,9 @@ void app_init(void)
static void strobe_light_reset(void) static void strobe_light_reset(void)
{ {
gpio_bit_write(LED_STROBE_PERIPH, LED_STROBE_PIN, RESET); gpio_bit_write(LED_STROBE_PERIPH, LED_STROBE_PIN, RESET);
/* 恢复投影灯状态 */
lp_light_write(0);
} }
static void strobe_light_toggle(uint8_t count) static void strobe_light_toggle(uint8_t count)
@ -207,6 +218,14 @@ static void strobe_light_toggle(uint8_t count)
} }
} }
static void lp_light_write(uint8_t status)
{
/* 激光投影设备 */
gpio_bit_write(LP_FRONT_DOOR_PERIPH, LP_FRONT_DOOR_PIN, (bit_status)status);
gpio_bit_write(LP_BACK_DOOR_PERIPH, LP_BACK_DOOR_PIN, (bit_status)status);
gpio_bit_write(LP_CAR_REAR_PERIPH, LP_CAR_REAR_PIN, (bit_status)status);
}
static void led_parsing_task(uint8_t uuid) static void led_parsing_task(uint8_t uuid)
{ {
/* 超过 2s 未检测到CAN数据变化熄灭发送指示灯 */ /* 超过 2s 未检测到CAN数据变化熄灭发送指示灯 */
@ -348,22 +367,26 @@ static void can_parsing_task(uint8_t uuid)
{ {
can_channge_status = 1; can_channge_status = 1;
door_front_upload_status = 0x01; door_front_upload_status = 0x01;
vehicle_status_trigger_mode = 1;
} }
if (door_back_status_temporary != door_back_status) if (door_back_status_temporary != door_back_status)
{ {
can_channge_status = 1; can_channge_status = 1;
door_back_upload_status = 0x01; door_back_upload_status = 0x01;
vehicle_status_trigger_mode = 1;
} }
if (turn_left_status_temporary != turn_left_status) if (turn_left_status_temporary != turn_left_status)
{ {
can_channge_status = 1; can_channge_status = 1;
turn_left_upload_status = 0x01; turn_left_upload_status = 0x01;
vehicle_status_trigger_mode = 1;
} }
if (turn_right_status_temporary != turn_right_status) if (turn_right_status_temporary != turn_right_status)
{ {
vehicle_status_trigger_mode = 1;
can_channge_status = 1; can_channge_status = 1;
turn_right_upload_status = 0x01; turn_right_upload_status = 0x01;
} }
@ -372,6 +395,7 @@ static void can_parsing_task(uint8_t uuid)
{ {
can_channge_status = 1; can_channge_status = 1;
reversing_upload_status = 0x01; reversing_upload_status = 0x01;
vehicle_status_trigger_mode = 1;
} }
if (can_channge_status == 1) if (can_channge_status == 1)
@ -396,6 +420,9 @@ static void strobe_light_operate_task(uint8_t uuid)
return; return;
} }
lp_light_write(1);
strobe_light_flashing_count += 1; strobe_light_flashing_count += 1;
if (strobe_light_flashing_mode == 0) if (strobe_light_flashing_mode == 0)
@ -414,8 +441,6 @@ static void strobe_light_operate_task(uint8_t uuid)
/* 频闪 */ /* 频闪 */
gpio_bit_write(LED_STROBE_PERIPH, LED_STROBE_PIN, !(strobe_light_flashing_count % 2)); gpio_bit_write(LED_STROBE_PERIPH, LED_STROBE_PIN, !(strobe_light_flashing_count % 2));
//gpio_bit_toggle(LED_STROBE_PERIPH, LED_STROBE_PIN);
if (strobe_light_flashing_count >= 4) if (strobe_light_flashing_count >= 4)
{ {
strobe_light_flashing_count = 0; strobe_light_flashing_count = 0;
@ -466,6 +491,10 @@ static void vehicle_status_parsing_task(uint8_t uuid)
uint8_t door_change = 0; uint8_t door_change = 0;
/* IO状态下必须保持是实时状态 */
if (vehicle_status_trigger_mode == 0)
reversing_status_temporary = gpio_input_bit_get(REVERSING_PERIPH, REVERSING_PIN);
/* 倒车状态判断 */ /* 倒车状态判断 */
if (reversing_status != reversing_status_temporary) if (reversing_status != reversing_status_temporary)
{ {
@ -477,8 +506,16 @@ static void vehicle_status_parsing_task(uint8_t uuid)
/* 优先级最高, 如果状态为触发, 关闭语音 */ /* 优先级最高, 如果状态为触发, 关闭语音 */
if (reversing_status == 0) if (reversing_status == 0)
{
v58_stop(); v58_stop();
/* 修改系统当前状态 */
diaodu_status = 0xFF;
door_status = 0x01;
turn_left_status = 0x01;
turn_right_status = 0x01;
}
goto EXECUTE; goto EXECUTE;
} }
@ -486,50 +523,17 @@ static void vehicle_status_parsing_task(uint8_t uuid)
if (reversing_status == 0) if (reversing_status == 0)
return; return;
/* 进出站状态判断 */ /* IO状态下必须保持是实时状态 */
if (diaodu_status_temporry != 0 && diaodu_status != diaodu_status_temporry) if (vehicle_status_trigger_mode == 0)
{ {
/* 当前为出站状态, 如果之前是进站状态,则停止播报, 否则不处理 */ door_front_status_temporary = gpio_input_bit_get(DOOR_FRONT_PERIPH, DOOR_FRONT_PIN);
if(diaodu_status_temporry == 2) door_back_status_temporary = gpio_input_bit_get(DOOR_BACK_PERIPH, DOOR_BACK_PIN);
{
if(diaodu_status == 1)
{
status = 0x00;
status_type = 5;
}
}
/* 到站 */
else if (diaodu_status_temporry == 1)
{
status = 0x01;
status_type = 4;
/* 优先级最高,关闭语音 */
v58_stop();
} }
diaodu_status = diaodu_status_temporry; if (door_front_status != door_front_status_temporary)
goto EXECUTE;
}
/* 如果一直处于进站状态, 超过 2 分钟, 则取消该状态, 并停止语音 */
if (diaodu_status == 1)
{
if(diaodu_status_rx_timestamp != 0 &&
timestamp - diaodu_status_rx_timestamp >= 120000)
{
/* 修改为出站状态 */
diaodu_arrival_or_departure_parsing(0x02);
goto EXECUTE;
}
}
if (door_front_status_temporary != door_front_status)
door_front_status = door_front_status_temporary; door_front_status = door_front_status_temporary;
if (door_back_status_temporary != door_back_status) if (door_back_status != door_back_status_temporary)
door_back_status = door_back_status_temporary; door_back_status = door_back_status_temporary;
door_status_temporary = door_front_status_temporary & door_back_status_temporary; door_status_temporary = door_front_status_temporary & door_back_status_temporary;
@ -543,7 +547,7 @@ static void vehicle_status_parsing_task(uint8_t uuid)
status_type = 0; status_type = 0;
} }
/* 当前后门开启后 */ /* 当前后门开启后 */
if (door_status == 0) if (door_status == 0)
{ {
/* 进站状态, 不继续执行 */ /* 进站状态, 不继续执行 */
@ -556,12 +560,76 @@ static void vehicle_status_parsing_task(uint8_t uuid)
diaodu_status_temporry = diaodu_status = 0; diaodu_status_temporry = diaodu_status = 0;
} }
turn_left_status = 0x01;
turn_right_status = 0x01;
/* 不处理其他数据 */ /* 不处理其他数据 */
goto EXECUTE; goto EXECUTE;
} }
/* 当前、后车门状态关闭, 才进行调度处理 */
if (door_status == 1)
{
/* 进出站状态判断 */
if (diaodu_status_temporry != 0 && diaodu_status != diaodu_status_temporry)
{
/* 当前为出站状态, 如果之前是进站状态,则停止播报, 否则不处理 */
if (diaodu_status_temporry == 2)
{
if (diaodu_status == 1)
{
status = 0x00;
status_type = 5;
door_status = 0x01;
turn_left_status = 0x01;
turn_right_status = 0x01;
diaodu_status = diaodu_status_temporry;
goto EXECUTE;
}
diaodu_status = diaodu_status_temporry;
return;
}
/* 到站 */
else if (diaodu_status_temporry == 1)
{
status = 0x01;
status_type = 4;
/* 优先级最高,关闭语音 */
v58_stop();
door_status = 0x01;
turn_left_status = 0x01;
turn_right_status = 0x01;
diaodu_status = diaodu_status_temporry;
goto EXECUTE;
}
}
}
/* 如果一直处于进站状态, 超过 2 分钟, 则取消该状态, 并停止语音 */
if (diaodu_status == 1)
{
/* 修改为出站状态 */
if (diaodu_status_rx_timestamp != 0 &&
timestamp - diaodu_status_rx_timestamp >= 120000)
diaodu_arrival_or_departure_parsing(0x02);
return;
}
/* 左转弯状态判断 */ /* 左转弯状态判断 */
if (turn_left_status != turn_left_status_temporary) if (turn_left_status != turn_left_status_temporary)
{
/* 只有通过IO接收的数据才需要做脉冲判断 */
if (vehicle_status_trigger_mode == 0)
{ {
/* 如果未触发状态, 需进行二次判断 */ /* 如果未触发状态, 需进行二次判断 */
if (turn_left_status_temporary == 1) if (turn_left_status_temporary == 1)
@ -571,6 +639,7 @@ static void vehicle_status_parsing_task(uint8_t uuid)
if (turn_left_parsing_count < 3) if (turn_left_parsing_count < 3)
goto TURN_RIGHT_STATUS_TAG2; goto TURN_RIGHT_STATUS_TAG2;
} }
}
turn_left_parsing_count = 0; turn_left_parsing_count = 0;
@ -594,6 +663,9 @@ static void vehicle_status_parsing_task(uint8_t uuid)
TURN_RIGHT_STATUS_TAG2: TURN_RIGHT_STATUS_TAG2:
/* 右转弯状态判断 */ /* 右转弯状态判断 */
if (turn_right_status != turn_right_status_temporary) if (turn_right_status != turn_right_status_temporary)
{
/* 只有通过IO接收的数据才需要做脉冲判断 */
if (vehicle_status_trigger_mode == 0)
{ {
/* 如果未触发状态, 需进行二次判断 */ /* 如果未触发状态, 需进行二次判断 */
if (turn_right_status_temporary == 1) if (turn_right_status_temporary == 1)
@ -603,6 +675,7 @@ TURN_RIGHT_STATUS_TAG2:
if (turn_right_parsing_count < 3) if (turn_right_parsing_count < 3)
goto EXECUTE; goto EXECUTE;
} }
}
turn_right_parsing_count = 0; turn_right_parsing_count = 0;
@ -791,26 +864,6 @@ void diaodu_arrival_or_departure_parsing(uint8_t status)
gpio_bit_write(LED_DIAODU_PERIPH, LED_DIAODU_PIN, SET); gpio_bit_write(LED_DIAODU_PERIPH, LED_DIAODU_PIN, SET);
} }
//void ir_key_triggered(uint8_t key)
//{
// uint8_t level = 0x00;
// if (key == 0x98) /* + */
// level = volume_level - 1;
// else if (key == 0x68) /* - */
// level = volume_level + 1;
// else if(key == 0xA2)
// level = 3;
// else
// return;
// strobe_light_toggle(2);
// set_volume_level(level);
// api_upload_data_forwarding(0x06, level);
//}
void api_notify_data_upload(uint8_t *buffer, uint16_t length) void api_notify_data_upload(uint8_t *buffer, uint16_t length)
{ {
led_tx_update(); led_tx_update();
@ -911,8 +964,7 @@ void api_notify_data_forwarding(uint8_t type, uint8_t value)
break; break;
case 0x05: case 0x05:
diaodu_upload_status = 0x01; diaodu_arrival_or_departure_parsing(value);
diaodu_status_temporry = value;
break; break;
case 0x06: case 0x06:

View File

@ -49,19 +49,11 @@ static void bsp_initialization(void)
gpio_config(VOLUME_3_PERIPH, VOLUME_3_PIN, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, nullptr); gpio_config(VOLUME_3_PERIPH, VOLUME_3_PIN, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, nullptr);
gpio_config(VOLUME_4_PERIPH, VOLUME_4_PIN, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, nullptr); gpio_config(VOLUME_4_PERIPH, VOLUME_4_PIN, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, nullptr);
/* 前门 检测引脚 初始化 */ /* 前门 后门 左转弯 右转弯 倒车 检测引脚 初始化 */
gpio_interrupt_config(DOOR_FRONT_PERIPH, DOOR_FRONT_PIN, EXTI_TRIG_BOTH); gpio_interrupt_config(DOOR_FRONT_PERIPH, DOOR_FRONT_PIN, EXTI_TRIG_BOTH);
/* 后门 检测引脚 初始化 */
gpio_interrupt_config(DOOR_BACK_PERIPH, DOOR_BACK_PIN, EXTI_TRIG_BOTH); gpio_interrupt_config(DOOR_BACK_PERIPH, DOOR_BACK_PIN, EXTI_TRIG_BOTH);
/* 左转弯 检测引脚 初始化 */
gpio_interrupt_config(TURN_LEFT_PERIPH, TURN_LEFT_PIN, EXTI_TRIG_BOTH); gpio_interrupt_config(TURN_LEFT_PERIPH, TURN_LEFT_PIN, EXTI_TRIG_BOTH);
/* 右转弯 检测引脚 初始化 */
gpio_interrupt_config(TURN_RIGHT_PERIPH, TURN_RIGHT_PIN, EXTI_TRIG_BOTH); gpio_interrupt_config(TURN_RIGHT_PERIPH, TURN_RIGHT_PIN, EXTI_TRIG_BOTH);
/* 倒车 检测引脚 初始化 */
gpio_interrupt_config(REVERSING_PERIPH, REVERSING_PIN, EXTI_TRIG_BOTH); gpio_interrupt_config(REVERSING_PERIPH, REVERSING_PIN, EXTI_TRIG_BOTH);
/* 功放控制脚,默认开启 */ /* 功放控制脚,默认开启 */
@ -75,6 +67,12 @@ static void bsp_initialization(void)
iic_config(M62429_SDA_PERIPH, M62429_SDA_PIN, M62429_SCL_PERIPH, M62429_SCL_PIN); iic_config(M62429_SDA_PERIPH, M62429_SDA_PIN, M62429_SCL_PERIPH, M62429_SCL_PIN);
/* 激光投影设备 控制引脚 初始化 */
gpio_config(LP_FRONT_DOOR_PERIPH, LP_FRONT_DOOR_PIN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, RESET);
gpio_config(LP_BACK_DOOR_PERIPH, LP_BACK_DOOR_PIN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, RESET);
gpio_config(LP_CAR_REAR_PERIPH, LP_CAR_REAR_PIN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, RESET);
/* CAN指示灯 控制引脚 初始化 */ /* CAN指示灯 控制引脚 初始化 */
gpio_config(LED_CAN_PERIPH, LED_CAN_PIN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, RESET); gpio_config(LED_CAN_PERIPH, LED_CAN_PIN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, RESET);

View File

@ -104,6 +104,18 @@
#define M62429_SDA_PERIPH GPIOB #define M62429_SDA_PERIPH GPIOB
#define M62429_SDA_PIN GPIO_PIN_11 #define M62429_SDA_PIN GPIO_PIN_11
/* 激光投影设备(前门) */
#define LP_FRONT_DOOR_PERIPH GPIOC
#define LP_FRONT_DOOR_PIN GPIO_PIN_13
/* 激光投影设备(后门) */
#define LP_BACK_DOOR_PERIPH GPIOC
#define LP_BACK_DOOR_PIN GPIO_PIN_14
/* 激光投影设备(车尾) */
#define LP_CAR_REAR_PERIPH GPIOC
#define LP_CAR_REAR_PIN GPIO_PIN_15
#define LED_CAN_PERIPH GPIOA #define LED_CAN_PERIPH GPIOA
#define LED_CAN_PIN GPIO_PIN_5 #define LED_CAN_PIN GPIO_PIN_5