2024-04-15 09:23:32 +08:00
|
|
|
|
#include "b6x.h"
|
|
|
|
|
#include "drvs.h"
|
|
|
|
|
#include "dbg.h"
|
|
|
|
|
#include "sftmr.h"
|
|
|
|
|
|
|
|
|
|
#include "app_uart.h"
|
|
|
|
|
#include "app_speed_governor.h"
|
|
|
|
|
#include "app_control_out.h"
|
|
|
|
|
|
|
|
|
|
// 使能电平
|
|
|
|
|
bool app_control_en[PA_MAX]={
|
2024-04-19 15:13:25 +08:00
|
|
|
|
[IN_GPS] =OE_LOW, // GPS超距 /L:超出活动区域(同)
|
|
|
|
|
[IN_EXTI0_Custom0] =OE_LOW, // 管理员模式
|
2024-04-15 09:23:32 +08:00
|
|
|
|
[OUT_Door_lock] =OE_HIGH, // 开锁 /H:开锁(同)
|
|
|
|
|
[OUT_Push_key] =OE_HIGH, // 开启推车 /L:开启推车(反)
|
|
|
|
|
[OUT_Switch_gear] =OE_LOW, // 限速/H:限速(反)
|
2024-04-19 15:13:25 +08:00
|
|
|
|
[OUT_High_speed] =OE_LOW, // 使能高速档位 /H:高使能(反)
|
2024-04-15 09:23:32 +08:00
|
|
|
|
[OUT_Low_speed] =OE_HIGH, // 使能低速档位 /L:低使能(反)
|
|
|
|
|
[OUT_Back_car] =OE_HIGH, // 使能倒车 /L:低使能倒车(反)
|
|
|
|
|
[OUT_Low_brake] =OE_HIGH, // 使能低制动 /L:低使能(反)
|
|
|
|
|
[OUT_High_brake] =OE_LOW // 使能高制动 /H:高使能(反)
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//中控控制IO初始化
|
|
|
|
|
void app_control_init(void){
|
|
|
|
|
// out
|
|
|
|
|
gpio_dir_output(OUT_Door_lock,OE_LOW);// 默认锁车
|
|
|
|
|
gpio_dir_output(OUT_Push_key,OE_LOW);// 默认关闭推车模式
|
|
|
|
|
gpio_dir_output(OUT_Switch_gear,OE_LOW);// 默认转把调速模式
|
|
|
|
|
gpio_dir_output(OUT_High_speed,OE_LOW);// 高速档位,默认失能
|
|
|
|
|
gpio_dir_output(OUT_Low_speed,OE_LOW);// 低速档位,默认失能
|
|
|
|
|
gpio_dir_output(OUT_Back_car,OE_LOW);// 默认前进模式
|
|
|
|
|
gpio_dir_output(OUT_Low_brake,OE_LOW);// 默认关低制动
|
|
|
|
|
gpio_dir_output(OUT_High_brake,OE_HIGH);// 默认关高制动
|
|
|
|
|
//in
|
|
|
|
|
gpio_dir_input(OUT_Door_lock,IE_DOWN);// 默认锁车
|
|
|
|
|
gpio_dir_input(OUT_Push_key,IE_DOWN);// 默认关闭推车模式
|
|
|
|
|
gpio_dir_input(OUT_Switch_gear,IE_DOWN);// 默认转把调速模式
|
|
|
|
|
gpio_dir_input(OUT_High_speed,IE_DOWN);// 高速档位,默认失能
|
|
|
|
|
gpio_dir_input(OUT_Low_speed,IE_DOWN);// 低速档位,默认失能
|
|
|
|
|
gpio_dir_input(OUT_Back_car,IE_DOWN);// 默认前进模式
|
|
|
|
|
gpio_dir_input(OUT_Low_brake,IE_DOWN);// 默认关低制动
|
|
|
|
|
gpio_dir_input(OUT_High_brake,IE_UP);// 默认关高制动
|
|
|
|
|
|
|
|
|
|
//默认都失能
|
|
|
|
|
Set_Status(OUT_Door_lock,0);
|
|
|
|
|
Set_Status(OUT_Push_key,0);
|
|
|
|
|
Set_Status(OUT_Switch_gear,0);
|
|
|
|
|
Set_Status(OUT_High_speed,0);
|
|
|
|
|
Set_Status(OUT_Low_speed,0);
|
|
|
|
|
Set_Status(OUT_Back_car,0); //失能倒车
|
|
|
|
|
Set_Status(OUT_Low_brake,0);
|
|
|
|
|
Set_Status(OUT_High_brake,0);
|
|
|
|
|
|
|
|
|
|
// app_set_Door_lock_status(0);// 默认锁车
|
|
|
|
|
// app_set_Push_status(0);// 默认关闭推车模式
|
|
|
|
|
// app_set_gears_status(0);// 默认转把调速模式
|
|
|
|
|
// app_set_brake_status(0);// 默认关制动
|
|
|
|
|
// app_set_Back_car_status(0);// 默认前进模式
|
|
|
|
|
|
|
|
|
|
// in
|
|
|
|
|
gpio_dir_input(IN_EXTI0_Custom0, IE_UP); // Input enable, pull-up
|
2024-04-19 15:13:25 +08:00
|
|
|
|
// gpio_dir_input(IN_EXTI1_Custom1, IE_UP);
|
2024-04-15 09:23:32 +08:00
|
|
|
|
gpio_dir_input(IN_GPS, IE_UP);
|
|
|
|
|
|
|
|
|
|
// EXTI config
|
|
|
|
|
exti_init(EXTI_DBC(15, 4));
|
2024-04-19 15:13:25 +08:00
|
|
|
|
exti_set(EXTI_FTS, EXTI_SRC(IN_EXTI0_Custom0) | EXTI_SRC(IN_GPS)); // falling
|
|
|
|
|
exti_set(EXTI_DBE, EXTI_SRC(IN_EXTI0_Custom0) | EXTI_SRC(IN_GPS));
|
|
|
|
|
exti_set(EXTI_IER, EXTI_SRC(IN_EXTI0_Custom0) | EXTI_SRC(IN_GPS));
|
2024-04-15 09:23:32 +08:00
|
|
|
|
|
|
|
|
|
// IRQ enable
|
|
|
|
|
NVIC_EnableIRQ(EXTI_IRQn);
|
|
|
|
|
__enable_irq();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取档位状态/0:管理员模式速度无限制/1:游客模式油门限速/2:低速档/3:高速档
|
|
|
|
|
uint8_t app_get_gears_status(void){
|
|
|
|
|
uint8_t ret=0;
|
|
|
|
|
|
2024-04-19 15:13:25 +08:00
|
|
|
|
if(0 ==Get_Status(OUT_Switch_gear) && 1 ==Get_Status(OUT_High_speed) && 0 ==Get_Status(OUT_Low_speed)){
|
2024-04-15 09:23:32 +08:00
|
|
|
|
ret =0;
|
|
|
|
|
}else if(0 ==Get_Status(OUT_Switch_gear) && 0 ==Get_Status(OUT_High_speed) && 1 ==Get_Status(OUT_Low_speed)){
|
2024-04-19 15:13:25 +08:00
|
|
|
|
ret =1;
|
|
|
|
|
}else if(1 ==Get_Status(OUT_Switch_gear) && 0 ==Get_Status(OUT_High_speed) && 0 ==Get_Status(OUT_Low_speed)){
|
2024-04-15 09:23:32 +08:00
|
|
|
|
ret =2;
|
2024-04-19 15:13:25 +08:00
|
|
|
|
}else if(0 ==Get_Status(OUT_Switch_gear) && 0 ==Get_Status(OUT_High_speed) && 0 ==Get_Status(OUT_Low_speed)){
|
2024-04-15 09:23:32 +08:00
|
|
|
|
ret =3;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
//设置档位状态/0:管理员模式速度无限制/1:游客模式油门限速/2:低速档/3:高速档
|
|
|
|
|
uint8_t app_set_gears_status(uint8_t val){
|
|
|
|
|
if(0 ==val){ //管理员模式速度无限制
|
|
|
|
|
Set_Status(OUT_Switch_gear,0);
|
2024-04-19 15:13:25 +08:00
|
|
|
|
Set_Status(OUT_High_speed,1);
|
2024-04-15 09:23:32 +08:00
|
|
|
|
Set_Status(OUT_Low_speed,0);
|
|
|
|
|
}else if(1 ==val){//游客模式油门限速
|
|
|
|
|
Set_Status(OUT_Switch_gear,0);
|
|
|
|
|
Set_Status(OUT_High_speed,0);
|
|
|
|
|
Set_Status(OUT_Low_speed,1);
|
2024-04-19 15:13:25 +08:00
|
|
|
|
}else if(2 ==val){//低速模式
|
|
|
|
|
Set_Status(OUT_Switch_gear,1);
|
|
|
|
|
Set_Status(OUT_High_speed,0);
|
|
|
|
|
Set_Status(OUT_Low_speed,0);
|
2024-04-15 09:23:32 +08:00
|
|
|
|
}else if(3 ==val){//高速模式
|
|
|
|
|
Set_Status(OUT_Switch_gear,0);
|
2024-04-19 15:13:25 +08:00
|
|
|
|
Set_Status(OUT_High_speed,0);
|
2024-04-15 09:23:32 +08:00
|
|
|
|
Set_Status(OUT_Low_speed,0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return app_get_gears_status();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取刹车状态/0:取消刹车/1:低刹/2:高刹
|
|
|
|
|
uint8_t app_get_brake_status(void){
|
|
|
|
|
uint8_t ret=0;
|
|
|
|
|
|
|
|
|
|
if(0 ==Get_Status(OUT_Low_brake) && 0 ==Get_Status(OUT_High_brake)){
|
|
|
|
|
ret =0;
|
|
|
|
|
}else if(1 ==Get_Status(OUT_Low_brake) && 0 ==Get_Status(OUT_High_brake)){
|
|
|
|
|
ret =1;
|
|
|
|
|
}else if(0 ==Get_Status(OUT_Low_brake) && 1 ==Get_Status(OUT_High_brake)){
|
|
|
|
|
ret =2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
//设置刹车状态/0:取消刹车/1:低刹/2:高刹
|
|
|
|
|
uint8_t app_set_brake_status(uint8_t val){
|
|
|
|
|
if(1 ==val){//低刹
|
|
|
|
|
Set_Status(OUT_Low_brake,1);
|
|
|
|
|
Set_Status(OUT_High_brake,0);
|
|
|
|
|
}else if(2 ==val){//高刹
|
|
|
|
|
Set_Status(OUT_Low_brake,0);
|
|
|
|
|
Set_Status(OUT_High_brake,1);
|
|
|
|
|
}else{ //无刹
|
|
|
|
|
Set_Status(OUT_Low_brake,0);
|
|
|
|
|
Set_Status(OUT_High_brake,0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return app_get_brake_status();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取电门锁状态设置/0:锁车状态/1:开锁状态
|
|
|
|
|
uint8_t app_get_Door_lock_status(void){
|
|
|
|
|
|
|
|
|
|
return Get_Status(OUT_Door_lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//电门锁状态设置/0:锁车/1:开锁
|
|
|
|
|
uint8_t app_set_Door_lock_status(bool val){
|
|
|
|
|
Set_Status(OUT_Door_lock,val);
|
|
|
|
|
|
|
|
|
|
return Get_Status(OUT_Door_lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//推车模式设置/0:退出推车状态/1:推车状态
|
|
|
|
|
uint8_t app_set_Push_status(bool val){
|
|
|
|
|
|
|
|
|
|
Set_Status(OUT_Push_key,val);
|
|
|
|
|
|
|
|
|
|
return Get_Status(OUT_Push_key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//设置行驶方向/0:前进;1:倒车
|
|
|
|
|
uint8_t app_set_Back_car_status(bool val){
|
|
|
|
|
Set_Status(OUT_Back_car,val);
|
|
|
|
|
|
|
|
|
|
return Get_Status(OUT_Back_car);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// GPIO外部中端处理
|
|
|
|
|
void EXTI_IRQHandler(void)
|
|
|
|
|
{
|
|
|
|
|
uint32_t irq_sta = EXTI->RIF.Word;
|
|
|
|
|
|
|
|
|
|
if (irq_sta & EXTI_SRC(IN_GPS))//
|
|
|
|
|
{
|
|
|
|
|
EXTI->ICR.Word = EXTI_SRC(IN_GPS);
|
2024-04-19 15:13:25 +08:00
|
|
|
|
if(1==Get_Status(IN_GPS)){
|
|
|
|
|
Set_Status(OUT_Door_lock,0);//GPS超出范围,直接锁车
|
|
|
|
|
}
|
2024-04-15 09:23:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (irq_sta & EXTI_SRC(IN_EXTI0_Custom0))
|
|
|
|
|
{
|
|
|
|
|
EXTI->ICR.Word = EXTI_SRC(IN_EXTI0_Custom0);
|
2024-04-19 15:13:25 +08:00
|
|
|
|
if(1==Get_Status(IN_EXTI0_Custom0)){ //进入管理员模式
|
|
|
|
|
Set_Status(OUT_High_speed,1);//开启高速模式
|
|
|
|
|
}
|
2024-04-15 09:23:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (irq_sta & EXTI_SRC(IN_EXTI1_Custom1))
|
|
|
|
|
{
|
|
|
|
|
EXTI->ICR.Word = EXTI_SRC(IN_EXTI1_Custom1);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|