代码暂存 阀门状态上报及优化按键中断

This commit is contained in:
常正强 2025-05-07 11:24:51 +08:00
parent 34e0700abc
commit b76977326a
6 changed files with 117 additions and 77 deletions

View File

@ -109,8 +109,8 @@ int main(void)
BSP_VBAT_Init(); BSP_VBAT_Init();
logDebug("VBAT init ok\n"); logDebug("VBAT init ok\n");
BSP_Ml307r_Init(); // BSP_Ml307r_Init();
logDebug("BSP_M1307r ok\n"); // logDebug("BSP_M1307r ok\n");
ShowRestartReason(); ShowRestartReason();
IWDG_Init(5000); IWDG_Init(5000);

View File

@ -1,6 +1 @@
获取sim信息(用于上报) 目前存在当电容电压较低时启动模组会偶现系统卡住现象
获取实时时间
数据上报(低电压、阀门状态)
下行数据处理
滴答定时器精度

View File

@ -19,9 +19,9 @@
typedef struct __attribute__((packed)) typedef struct __attribute__((packed))
{ {
uint8_t module_init_flag : 1; //模块初始化 uint8_t module_init_flag : 1; //模块初始化
uint8_t module_Sleep_flag : 1; //模块睡眠 uint8_t Date_Sending_flag : 1; //数据发送中
uint8_t Low_Voltage_flag : 1; //低电压 uint8_t Low_Voltage_flag : 1; //低电压
uint8_t Regular_report_flag : 1; //定期上报 uint8_t Key_Finish_flag : 1; //按键完成
uint8_t PowerOn_success_flag : 1; //模块开机成功 uint8_t PowerOn_success_flag : 1; //模块开机成功
uint8_t PowerOn_error_flag : 1; //模块开机失败 uint8_t PowerOn_error_flag : 1; //模块开机失败
@ -110,6 +110,7 @@ static void BSP_Ml307_Power_Off(void);
void BSP_Ml307r_Init(void); void BSP_Ml307r_Init(void);
void Iot_Send_Data(void);
void Ml307r_Loop(void); void Ml307r_Loop(void);
void BSP_Module_Emergency_Send(uint8_t* data, uint8_t len); void BSP_Module_Emergency_Send(uint8_t* data, uint8_t len);
void BSP_ML307_StartTimeoutTimer(void); void BSP_ML307_StartTimeoutTimer(void);

View File

@ -730,7 +730,6 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
{ {
if (events & CHECK_EVT_START) if (events & CHECK_EVT_START)
{ {
uint8_t Status_upload = 0;
// logDebug("fault_state = %d \r\n",fault_state); // logDebug("fault_state = %d \r\n",fault_state);
if(!fault_state) if(!fault_state)
{ {
@ -738,9 +737,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
if(P[0] - P[2] >= 80) //8000 if(P[0] - P[2] >= 80) //8000
{ {
VALVE_CLOSE(); VALVE_CLOSE();
IotFlag_t.Valve_Close_flag = 1;
fault_state = 1; fault_state = 1;
Status_upload = 1;
tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000 tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000
logDebug("motor high close"); logDebug("motor high close");
} }
@ -748,9 +745,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
if(P[0] - P[2] <= 80) //800 if(P[0] - P[2] <= 80) //800
{ {
VALVE_CLOSE(); VALVE_CLOSE();
IotFlag_t.Valve_Close_flag = 1;
fault_state = 2; fault_state = 2;
Status_upload = 1;
tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000 tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000
logDebug("motor low close"); logDebug("motor low close");
} }
@ -758,9 +753,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
if( P[0] - P[1] >= 7) //700 if( P[0] - P[1] >= 7) //700
{ {
VALVE_CLOSE(); VALVE_CLOSE();
IotFlag_t.Valve_Close_flag = 1;
fault_state = 3; fault_state = 3;
Status_upload = 1;
tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000 tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000
logDebug("motor ver close"); logDebug("motor ver close");
} }
@ -773,7 +766,6 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
VALVE_OPEN(); VALVE_OPEN();
IotFlag_t.Valve_Open_flag = 1; IotFlag_t.Valve_Open_flag = 1;
fault_state = 0; fault_state = 0;
Status_upload = 2;
LED_VALVE_OPEN; LED_VALVE_OPEN;
logDebug("motor/LED open"); logDebug("motor/LED open");
tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1000)); tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1000));
@ -782,17 +774,11 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
{ {
motor_flag = 0; motor_flag = 0;
VALVE_CLOSE(); VALVE_CLOSE();
IotFlag_t.Valve_Close_flag = 1;
Status_upload = 1;
LED_VALVE_CLOSE; LED_VALVE_CLOSE;
fault_state = 4;
logDebug("motor/LED close"); logDebug("motor/LED close");
tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1000)); tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1000));
} }
// if(Status_upload){
// logDebug("BSP_M1307r start_send message!!!\n");
// BSP_Ml307r_Init();
// Status_upload = 0;
// }
tmos_start_task(check_task_id, CHECK_EVT_START, MS1_TO_SYSTEM_TIME(200)); //100 tmos_start_task(check_task_id, CHECK_EVT_START, MS1_TO_SYSTEM_TIME(200)); //100
return (events ^ CHECK_EVT_START); return (events ^ CHECK_EVT_START);
} }
@ -800,6 +786,11 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
{ {
VALVE_STOP(); VALVE_STOP();
logDebug("motor STOP"); logDebug("motor STOP");
if(fault_state == 4)
{
IotFlag_t.Valve_Close_flag = 1;
Iot_Send_Data();
}
return (events ^ MOTOR_STOP_EVT); return (events ^ MOTOR_STOP_EVT);
} }
return 0; return 0;

View File

@ -2,6 +2,7 @@
#include "bsp_motor.h" #include "bsp_motor.h"
#include "bsp_uart.h" #include "bsp_uart.h"
#include "bsp_led.h" #include "bsp_led.h"
#include "bsp_ml307r.h"
#include "log.h" #include "log.h"
#include "SLEEP.h" #include "SLEEP.h"
@ -38,9 +39,8 @@ void app_task_handler(TeAppEvtType app_evt_type)
case kKeyRelease: case kKeyRelease:
BSP_KEY_EnterLowpower(); BSP_KEY_EnterLowpower();
// DelayMs(10); // DelayMs(10);
// BSP_RequestSleep(); BSP_RequestSleep();
logDebug("gpio relase;BSP_RequestSleep "); logDebug("gpio relase;BSP_RequestSleep ");
break; break;
default: default:
break; break;
@ -123,10 +123,21 @@ static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events)
} }
else else
{ {
// if(key_run == 1)
// {
// p_handler(kKeyRelease);
// key_run = 0;
// }
if(key_run == 1) if(key_run == 1)
{ {
p_handler(kKeyRelease); // 确保按键已真正释放后再触发释放事件
key_run = 0; if (!IS_KEY_Vaild()) {
p_handler(kKeyRelease);
key_run = 0;
} else {
// 按键仍未释放,继续检测
tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(KEY_SACN_MS));
}
} }
} }
return (events ^ KEY_SCAN_EVT); return (events ^ KEY_SCAN_EVT);
@ -317,6 +328,7 @@ void KEY_ProcessLoop(void)
// logDebug("KEY_ProcessLoop"); // logDebug("KEY_ProcessLoop");
// } // }
// } // }
if (key_wakeup_flag) if (key_wakeup_flag)
{ {
key_wakeup_flag = 0; key_wakeup_flag = 0;
@ -350,25 +362,36 @@ __INTERRUPT // 告诉编译器使用硬件压栈
__HIGH_CODE // 放到RAM里 __HIGH_CODE // 放到RAM里
void GPIOB_IRQHandler(void) void GPIOB_IRQHandler(void)
{ {
// 阻止睡眠 // 清除中断标志位
BSP_BlockSleep();
// 关按键中断
BSP_KEY_ExitLowpower();
printf("KEY IRQ");
GPIOB_ClearITFlagBit(KEY_B_PIN); GPIOB_ClearITFlagBit(KEY_B_PIN);
key_wakeup_flag = 1; // 检查是否为真实按键事件通过确认电平是否真的接近0V
// key_timeout_flag = 0; if (GPIOB_ReadPortPin(KEY_B_PIN) == 0) {
// 再次确认是否真的为低电平接近0V
DelayUs(50); // 短暂延时
if (GPIOB_ReadPortPin(KEY_B_PIN) == 0) {
// 确认是真实按键事件
// 阻止睡眠
BSP_BlockSleep();
// 关按键中断
BSP_KEY_ExitLowpower();
printf("KEY IRQ");
key_wakeup_flag = 1;
}
} else {
// 可能是电源波动导致的中断,忽略此次中断
printf("Power Fluctuation - Ignored");
}
// // 阻止睡眠
// BSP_BlockSleep(); // BSP_BlockSleep();
// // 关按键中断
// BSP_KEY_ExitLowpower();
// printf("KEY IRQ");
// GPIOB_ClearITFlagBit(KEY_B_PIN);
// key_wakeup_flag = 1;
// if (R16_PB_INT_IF & KEY_B_PIN)
// {
// R16_PB_INT_IF = KEY_B_PIN;
// // tmos_set_event(key_task_id, KEY_SCAN_EVT);
// BSP_KEY_ExitLowpower();
// }
// tmos_set_event(key_task_id,KEY_SCAN_EVT);
} }

View File

@ -30,20 +30,9 @@ MultiTimer Multi_StopTask_t; //StopTask
MultiTimer Multi_Loop_t; //Loop MultiTimer Multi_Loop_t; //Loop
MultiTimer Multi_GetInfo_t; //siminfo MultiTimer Multi_GetInfo_t; //siminfo
// 电源状态
typedef enum {
POWER_STATE_INIT,
POWER_STATE_ON_START,
POWER_STATE_ON_COMPLETE,
POWER_STATE_OFF_START,
POWER_STATE_OFF_COMPLETE
} ml307_power_state_t;
static ml307_power_state_t ml307_power_state = POWER_STATE_INIT;
static tmosTaskID ml307_task_id = INVALID_TASK_ID; static tmosTaskID ml307_task_id = INVALID_TASK_ID;
at_obj_t *ml307r_obj; at_obj_t *ml307r_obj;
uint8_t databuf[5] = {0x01,0xaa,0x12,0xde,0x39};
int Ml307r_Gpio_Init(void) int Ml307r_Gpio_Init(void)
@ -58,7 +47,6 @@ int Ml307r_Gpio_Init(void)
GPIOB_ModeCfg(ML307_PWR_PIN, GPIO_ModeOut_PP_5mA); GPIOB_ModeCfg(ML307_PWR_PIN, GPIO_ModeOut_PP_5mA);
return 0; return 0;
} }
@ -107,7 +95,7 @@ static uint8_t state = 0;
#define CPIN_RETRY_INTERVAL_TIME (20*1000UL) #define CPIN_RETRY_INTERVAL_TIME (20*1000UL)
#define CONNECT_RETRY_INTERVAL_TIME (20*1000UL) #define CONNECT_RETRY_INTERVAL_TIME (20*1000UL)
#define SEND_RETRY_INTERVAL_TIME (30*1000UL) #define SEND_RETRY_INTERVAL_TIME (30*1000UL)
#define STOP_TASK_INTERVAL_TIME (25*1000UL) #define STOP_TASK_INTERVAL_TIME (15*1000UL)
#define LOOP_INTERVAL_TIME (30*1000UL) #define LOOP_INTERVAL_TIME (30*1000UL)
#define GETINFO_INTERVAL_TIME (20*1000UL) #define GETINFO_INTERVAL_TIME (20*1000UL)
@ -167,10 +155,11 @@ void StopTask_CallBack(MultiTimer* timer, void* userData)
tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT); tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT);
BSP_RequestSleep(); BSP_RequestSleep();
}else{ }else{
BSP_Ml307_Power_Off(); //关机 // BSP_Ml307_Power_Off(); //关机
tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT); tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT);
BSP_RequestSleep(); BSP_RequestSleep();
} }
IotFlag_t.Date_Sending_flag = 0;
} }
//模块准备就绪 //模块准备就绪
@ -530,7 +519,7 @@ static int BSP_Module_Connect_CtWing_Handle(at_env_t *e)
{ {
case 0: case 0:
logDebug("create device...\r\n"); logDebug("create device...\r\n");
e->println(e, "AT+MIPOPEN=0,\"TCP\",\"112.125.89.8\",42499,,1"); // 8.135.10.183,32994 e->println(e, "AT+MIPOPEN=0,\"TCP\",\"112.125.89.8\",44679,,1"); // 8.135.10.183,32994
e->reset_timer(e); e->reset_timer(e);
e->state++; e->state++;
break; break;
@ -819,13 +808,20 @@ void BSP_ML307_SendMessage(void)
// 根据系统状态确定设备状态 // 根据系统状态确定设备状态
device_status_t device_status; device_status_t device_status;
// 这里根据实际系统状态判断逻辑进行修改 // // 这里根据实际系统状态判断逻辑进行修改
if (fault_state) { // if (fault_state) {
device_status = DEVICE_STATUS_FAULT; // device_status = DEVICE_STATUS_FAULT;
} else { // } else {
// 检查其他状态,例如电池电量等 // // 检查其他状态,例如电池电量等
// 这里可以添加更多状态检测逻辑 // // 这里可以添加更多状态检测逻辑
device_status = DEVICE_STATUS_NORMAL; // device_status = DEVICE_STATUS_NORMAL;
// }
if(IotFlag_t.Valve_Close_flag)
{
IotFlag_t.Valve_Close_flag = 0;
device_status = DEVICE_STATUS_CLOSED;
} }
@ -1191,16 +1187,50 @@ uint16_t Ml307r_Handle(uint8_t task_id, uint16_t events)
void BSP_Ml307r_Init(void) void BSP_Ml307r_Init(void)
{ {
Ml307r_Gpio_Init(); if(IotFlag_t.Date_Sending_flag == 0)
BSP_UART1_Init();
Init_cJSON_With_TMOS();
ml307r_obj = at_obj_create(&at_adapter);//Create AT communication object
if(ml307r_obj != NULL)
{ {
at_obj_set_urc(ml307r_obj, urc_table, sizeof(urc_table) / sizeof(urc_table[0])); BSP_UART1_Init();
IotFlag_t.module_init_flag = 1; Ml307r_Gpio_Init();
BSP_BlockSleep(); ml307r_obj = at_obj_create(&at_adapter);//Create AT communication object
if(ml307r_obj != NULL)
{
Init_cJSON_With_TMOS();
at_obj_set_urc(ml307r_obj, urc_table, sizeof(urc_table) / sizeof(urc_table[0]));
IotFlag_t.module_init_flag = 1;
IotFlag_t.Date_Sending_flag = 1;
BSP_BlockSleep();
ml307_task_id = TMOS_ProcessEventRegister(Ml307r_Handle);
// tmos_set_event(ml307_task_id, ML307_PERIODIC_EVT);
tmos_start_task(ml307_task_id, ML307_PERIODIC_EVT, MS1_TO_SYSTEM_TIME(300)); //电流稳定后再启动模组
}
}else
{
logDebug("ERROR ,Iot_Send_Data!!!\r\n");
}
}
void Iot_Send_Data(void)
{
if(IotFlag_t.Date_Sending_flag == 0)
{
logDebug("Iot_Send_Data!!!\r\n");
BSP_UART1_Init();
Ml307r_Gpio_Init();
logDebug("Ml307r_Init_Finish!!!\r\n");
if(ml307r_obj != NULL)
{
IotFlag_t.Date_Sending_flag = 1;
IotFlag_t.module_init_flag = 1;
BSP_BlockSleep();
ml307_task_id = TMOS_ProcessEventRegister(Ml307r_Handle);
// tmos_set_event(ml307_task_id, ML307_PERIODIC_EVT);
tmos_start_task(ml307_task_id, ML307_PERIODIC_EVT, MS1_TO_SYSTEM_TIME(300)); //电流稳定后再启动模组
}else
{
BSP_Ml307r_Init();
}
}else
{
logDebug("ERROR ,Iot_Send_Data!!!\r\n");
} }
ml307_task_id = TMOS_ProcessEventRegister(Ml307r_Handle);
tmos_set_event(ml307_task_id, ML307_PERIODIC_EVT);
} }