diff --git a/GD32F103C8T6/App/User/Peripheral/Api/api.h b/GD32F103C8T6/App/User/Peripheral/Api/api.h index 3ffb644..b3186d5 100644 --- a/GD32F103C8T6/App/User/Peripheral/Api/api.h +++ b/GD32F103C8T6/App/User/Peripheral/Api/api.h @@ -22,7 +22,7 @@ #define API_FRAME_RESPONSE (0x01) /* 响应帧 */ #define API_FRAME_NOTIFICATION (0x02) /* 通知帧 */ -#define SOFTWARE_VERSION ("V1.25") +#define SOFTWARE_VERSION ("V1.26") #define HARDWARE_VERSION ("V1.01") extern uint8_t api_upgrade_mode; diff --git a/GD32F103C8T6/App/User/app.c b/GD32F103C8T6/App/User/app.c index 494095b..61e6d62 100644 --- a/GD32F103C8T6/App/User/app.c +++ b/GD32F103C8T6/App/User/app.c @@ -2,22 +2,23 @@ #include "can_parsing.h" -#define STROBE_LIGHT_MODE_SETTING_INDEX (0x00) -#define CAN_TYPE_SETTING_INDEX (0x01) -#define STROBE_LIGHT_ENABLE_SETTING_INDEX (0x02) -#define VOLUME_LEVEL_SETTING_INDEX (0x03) +#define STROBE_LIGHT_MODE_SETTING_INDEX (0x00) +#define CAN_TYPE_SETTING_INDEX (0x01) +#define STROBE_LIGHT_ENABLE_SETTING_INDEX (0x02) +#define VOLUME_LEVEL_SETTING_INDEX (0x03) static uint64_t can_rx_led_timestamp = 0; static uint64_t diaodu_rx_led_timestamp = 0; static uint64_t run_led_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_back_status = 1, door_back_status_temporary = 1; static uint8_t door_status = 2, door_status_temporary = 2; -static uint8_t turn_left_type = 0, turn_left_status = 1, turn_left_status_temporary = 1; /* turn_left_type:0 IO; 1 CAN */ -static uint8_t turn_left_parsing_count = 0; /* 转向接收次数 */ -static uint8_t turn_right_type = 1, turn_right_status = 1, turn_right_status_temporary = 1; +static uint8_t turn_left_status = 1, turn_left_status_temporary = 1; +static uint8_t turn_left_parsing_count = 0; /* 转向接收次数 */ +static uint8_t turn_right_status = 1, turn_right_status_temporary = 1; static uint8_t turn_right_parsing_count = 0; /* 转向接收次数 */ static uint8_t emergency_flashers_status = 1, emergency_flashers_status_temporary = 1; /* 双闪 */ static uint8_t reversing_status = 1, reversing_status_temporary = 1; @@ -88,30 +89,33 @@ void gpio_interrupt_callback(uint32_t pin) switch (pin) { case DOOR_FRONT_PIN: - door_front_status_temporary = gpio_input_bit_get(DOOR_FRONT_PERIPH, DOOR_FRONT_PIN); 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; case DOOR_BACK_PIN: - door_back_status_temporary = gpio_input_bit_get(DOOR_BACK_PERIPH, DOOR_BACK_PIN); 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; case TURN_LEFT_PIN: - turn_left_type = 0; - turn_left_status_temporary = gpio_input_bit_get(TURN_LEFT_PERIPH, TURN_LEFT_PIN); 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; case TURN_RIGHT_PIN: - turn_right_type = 0; - turn_right_status_temporary = gpio_input_bit_get(TURN_RIGHT_PERIPH, TURN_RIGHT_PIN); 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; case REVERSING_PIN: - reversing_status_temporary = gpio_input_bit_get(REVERSING_PERIPH, REVERSING_PIN); reversing_upload_status = 0x01; + vehicle_status_trigger_mode = 0; + reversing_status_temporary = gpio_input_bit_get(REVERSING_PERIPH, REVERSING_PIN); break; } } @@ -350,24 +354,26 @@ static void can_parsing_task(uint8_t uuid) { can_channge_status = 1; door_front_upload_status = 0x01; + vehicle_status_trigger_mode = 1; } if (door_back_status_temporary != door_back_status) { can_channge_status = 1; door_back_upload_status = 0x01; + vehicle_status_trigger_mode = 1; } if (turn_left_status_temporary != turn_left_status) { - turn_left_type = 1; can_channge_status = 1; turn_left_upload_status = 0x01; + vehicle_status_trigger_mode = 1; } if (turn_right_status_temporary != turn_right_status) { - turn_right_type = 1; + vehicle_status_trigger_mode = 1; can_channge_status = 1; turn_right_upload_status = 0x01; } @@ -376,6 +382,7 @@ static void can_parsing_task(uint8_t uuid) { can_channge_status = 1; reversing_upload_status = 0x01; + vehicle_status_trigger_mode = 1; } if (can_channge_status == 1) @@ -470,6 +477,10 @@ static void vehicle_status_parsing_task(uint8_t uuid) 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) { @@ -498,10 +509,17 @@ static void vehicle_status_parsing_task(uint8_t uuid) if (reversing_status == 0) return; - if (door_front_status_temporary != door_front_status) + /* IO状态下必须保持是实时状态 */ + if (vehicle_status_trigger_mode == 0) + { + door_front_status_temporary = gpio_input_bit_get(DOOR_FRONT_PERIPH, DOOR_FRONT_PIN); + door_back_status_temporary = gpio_input_bit_get(DOOR_BACK_PERIPH, DOOR_BACK_PIN); + } + + if (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_status_temporary = door_front_status_temporary & door_back_status_temporary; @@ -548,7 +566,7 @@ static void vehicle_status_parsing_task(uint8_t uuid) { status = 0x00; status_type = 5; - + door_status = 0x01; turn_left_status = 0x01; turn_right_status = 0x01; @@ -570,7 +588,7 @@ static void vehicle_status_parsing_task(uint8_t uuid) /* 优先级最高,关闭语音 */ v58_stop(); - + door_status = 0x01; turn_left_status = 0x01; turn_right_status = 0x01; @@ -579,14 +597,13 @@ static void vehicle_status_parsing_task(uint8_t uuid) 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); @@ -598,7 +615,7 @@ static void vehicle_status_parsing_task(uint8_t uuid) if (turn_left_status != turn_left_status_temporary) { /* 只有通过IO接收的数据,才需要做脉冲判断 */ - if (turn_left_type == 0) + if (vehicle_status_trigger_mode == 0) { /* 如果未触发状态, 需进行二次判断 */ if (turn_left_status_temporary == 1) @@ -634,7 +651,7 @@ TURN_RIGHT_STATUS_TAG2: if (turn_right_status != turn_right_status_temporary) { /* 只有通过IO接收的数据,才需要做脉冲判断 */ - if (turn_right_type == 0) + if (vehicle_status_trigger_mode == 0) { /* 如果未触发状态, 需进行二次判断 */ if (turn_right_status_temporary == 1) diff --git a/GD32F103C8T6/App/main.c b/GD32F103C8T6/App/main.c index 78b5dbb..734c848 100644 --- a/GD32F103C8T6/App/main.c +++ b/GD32F103C8T6/App/main.c @@ -49,21 +49,13 @@ static void bsp_initialization(void) 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_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(TURN_LEFT_PERIPH, TURN_LEFT_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_config(AMP_CTRL_PERIPH, AMP_CTRL_PIN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, SET);