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

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();
logDebug("VBAT init ok\n");
BSP_Ml307r_Init();
logDebug("BSP_M1307r ok\n");
// BSP_Ml307r_Init();
// logDebug("BSP_M1307r ok\n");
ShowRestartReason();
IWDG_Init(5000);

View File

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

View File

@ -19,9 +19,9 @@
typedef struct __attribute__((packed))
{
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 Regular_report_flag : 1; //定期上报
uint8_t Key_Finish_flag : 1; //按键完成
uint8_t PowerOn_success_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 Iot_Send_Data(void);
void Ml307r_Loop(void);
void BSP_Module_Emergency_Send(uint8_t* data, uint8_t len);
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)
{
uint8_t Status_upload = 0;
// logDebug("fault_state = %d \r\n",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
{
VALVE_CLOSE();
IotFlag_t.Valve_Close_flag = 1;
fault_state = 1;
Status_upload = 1;
tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000
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
{
VALVE_CLOSE();
IotFlag_t.Valve_Close_flag = 1;
fault_state = 2;
Status_upload = 1;
tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000
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
{
VALVE_CLOSE();
IotFlag_t.Valve_Close_flag = 1;
fault_state = 3;
Status_upload = 1;
tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000
logDebug("motor ver close");
}
@ -773,7 +766,6 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
VALVE_OPEN();
IotFlag_t.Valve_Open_flag = 1;
fault_state = 0;
Status_upload = 2;
LED_VALVE_OPEN;
logDebug("motor/LED open");
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;
VALVE_CLOSE();
IotFlag_t.Valve_Close_flag = 1;
Status_upload = 1;
LED_VALVE_CLOSE;
fault_state = 4;
logDebug("motor/LED close");
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
return (events ^ CHECK_EVT_START);
}
@ -800,6 +786,11 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
{
VALVE_STOP();
logDebug("motor STOP");
if(fault_state == 4)
{
IotFlag_t.Valve_Close_flag = 1;
Iot_Send_Data();
}
return (events ^ MOTOR_STOP_EVT);
}
return 0;

View File

@ -2,6 +2,7 @@
#include "bsp_motor.h"
#include "bsp_uart.h"
#include "bsp_led.h"
#include "bsp_ml307r.h"
#include "log.h"
#include "SLEEP.h"
@ -38,9 +39,8 @@ void app_task_handler(TeAppEvtType app_evt_type)
case kKeyRelease:
BSP_KEY_EnterLowpower();
// DelayMs(10);
// BSP_RequestSleep();
BSP_RequestSleep();
logDebug("gpio relase;BSP_RequestSleep ");
break;
default:
break;
@ -123,10 +123,21 @@ static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events)
}
else
{
// if(key_run == 1)
// {
// p_handler(kKeyRelease);
// key_run = 0;
// }
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);
@ -317,6 +328,7 @@ void KEY_ProcessLoop(void)
// logDebug("KEY_ProcessLoop");
// }
// }
if (key_wakeup_flag)
{
key_wakeup_flag = 0;
@ -350,25 +362,36 @@ __INTERRUPT // 告诉编译器使用硬件压栈
__HIGH_CODE // 放到RAM里
void GPIOB_IRQHandler(void)
{
// 阻止睡眠
BSP_BlockSleep();
// 关按键中断
BSP_KEY_ExitLowpower();
printf("KEY IRQ");
// 清除中断标志位
GPIOB_ClearITFlagBit(KEY_B_PIN);
key_wakeup_flag = 1;
// key_timeout_flag = 0;
// 检查是否为真实按键事件通过确认电平是否真的接近0V
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_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_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;
at_obj_t *ml307r_obj;
uint8_t databuf[5] = {0x01,0xaa,0x12,0xde,0x39};
int Ml307r_Gpio_Init(void)
@ -58,7 +47,6 @@ int Ml307r_Gpio_Init(void)
GPIOB_ModeCfg(ML307_PWR_PIN, GPIO_ModeOut_PP_5mA);
return 0;
}
@ -107,7 +95,7 @@ static uint8_t state = 0;
#define CPIN_RETRY_INTERVAL_TIME (20*1000UL)
#define CONNECT_RETRY_INTERVAL_TIME (20*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 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);
BSP_RequestSleep();
}else{
BSP_Ml307_Power_Off(); //关机
// BSP_Ml307_Power_Off(); //关机
tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT);
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:
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->state++;
break;
@ -819,13 +808,20 @@ void BSP_ML307_SendMessage(void)
// 根据系统状态确定设备状态
device_status_t device_status;
// 这里根据实际系统状态判断逻辑进行修改
if (fault_state) {
device_status = DEVICE_STATUS_FAULT;
} else {
// 检查其他状态,例如电池电量等
// 这里可以添加更多状态检测逻辑
device_status = DEVICE_STATUS_NORMAL;
// // 这里根据实际系统状态判断逻辑进行修改
// if (fault_state) {
// device_status = DEVICE_STATUS_FAULT;
// } else {
// // 检查其他状态,例如电池电量等
// // 这里可以添加更多状态检测逻辑
// 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)
{
Ml307r_Gpio_Init();
BSP_UART1_Init();
Init_cJSON_With_TMOS();
ml307r_obj = at_obj_create(&at_adapter);//Create AT communication object
if(ml307r_obj != NULL)
if(IotFlag_t.Date_Sending_flag == 0)
{
at_obj_set_urc(ml307r_obj, urc_table, sizeof(urc_table) / sizeof(urc_table[0]));
IotFlag_t.module_init_flag = 1;
BSP_BlockSleep();
BSP_UART1_Init();
Ml307r_Gpio_Init();
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);
}