diff --git a/applications/main.c b/applications/main.c index ee24b9c..409f75b 100644 --- a/applications/main.c +++ b/applications/main.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-10-23 17:14:16 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-17 11:47:24 + * @LastEditTime: 2024-12-25 17:03:21 * @FilePath: \ble_bjq_ch303rct6_ml307\applications\main.c * @Descrt_thread_ * @@ -40,7 +40,7 @@ rt_bool_t is_event_initialized = RT_FALSE; // 是否初始化完成 TsSysControl SysControl; struct rt_timer work_cnt_timer; -struct rt_timer preheat_timer;//传统模式需要进行预热, +struct rt_timer preheat_timer; // 传统模式需要进行预热, void Send_Laser_Alarm_Event(AlarmEvent event_type); @@ -153,7 +153,7 @@ void Preheat_Timer_Callback(void *parameter) LED_STOP(r); LED_STOP(g); LED_STOP(y); - LOG_D("预热完成"); + LOG_D("预热完成"); Send_Laser_Alarm_Event(kNormalDetectionEvents); } int main(void) @@ -170,272 +170,289 @@ int main(void) Flash_GetTotalRecord(&TotalRecords); g_Calibration_status = Flash_Get_Calibration_State(); rt_thread_mdelay(10); - if (g_Calibration_status == kNotCalibrated)//没标定 + while (1) { - LED_STOP(r); - LED_STOP(y); - LED_CTRL(g, "1000,500", -1); - LED_START(g); - - uint32_t ticks = 0, gas_calibration_voltage; - while (1) + if (g_Calibration_status == kNotCalibrated) // 没标定 { - gas_calibration_voltage = Get_Gas_VoltageAdcInt1000x(); - LOG_D("ticks[%d] gas_calibration_voltage = %d", ticks++, gas_calibration_voltage); + LED_STOP(r); + LED_STOP(y); + LED_CTRL(g, "1000,500", -1); + LED_START(g); - if (g_Calibration_status == kNotCalibrated)//没标定 + uint32_t ticks = 0, gas_calibration_voltage; + while (1) { - if (ticks > TIMEOUT_MS) + gas_calibration_voltage = Get_Gas_VoltageAdcInt1000x(); + LOG_D("ticks[%d] gas_calibration_voltage = %d", ticks++, gas_calibration_voltage); + + if (g_Calibration_status == kNotCalibrated) // 没标定 { - if(gas_calibration_voltage > (MQ_VOLTAGE_ALARM_DEFAULT - 500) - && gas_calibration_voltage < (MQ_VOLTAGE_ALARM_DEFAULT + 500)) + if (ticks > TIMEOUT_MS) { - uint8_t calibration_buf[2] = {0}; - calibration_buf[0] = gas_calibration_voltage & 0xFF; // 低字节 - calibration_buf[1] = (gas_calibration_voltage >> 8) & 0xFF; // 高字节 - LOG_D("calibration_buf[0] = %X calibration_buf[1] = %X", calibration_buf[0], calibration_buf[1]); - Flash_Sys_Cfg(kAlarmLValueId, calibration_buf, 2); - // 标定完成打开绿灯常亮,蜂鸣器叫一下 - BEEP_CALIBRATION_OK; - LED_STOP(g); - LED_ON(g); - Flash_Set_Calibration_State(kSysGasCalibStatus); - g_Calibration_status = kSysGasCalibStatus; + if (gas_calibration_voltage > (MQ_VOLTAGE_ALARM_DEFAULT - 800) && gas_calibration_voltage < (MQ_VOLTAGE_ALARM_DEFAULT + 800)) + { + uint8_t calibration_buf[2] = {0}; + calibration_buf[0] = gas_calibration_voltage & 0xFF; // 低字节 + calibration_buf[1] = (gas_calibration_voltage >> 8) & 0xFF; // 高字节 + LOG_D("calibration_buf[0] = %X calibration_buf[1] = %X", calibration_buf[0], calibration_buf[1]); + Flash_Sys_Cfg(kAlarmLValueId, calibration_buf, 2); + // 标定完成打开绿灯常亮,蜂鸣器叫一下 + BEEP_CALIBRATION_OK; + LED_STOP(g); + LED_ON(g); + Flash_Set_Calibration_State(kSysGasCalibStatus); + g_Calibration_status = kSysGasCalibStatus; + + break; + } } } - } - rt_thread_mdelay(1000); - } - } - else - { - SYS_EventInit(); - work_duration = Flash_Get_WorkDuration(); - rt_timer_init(&work_cnt_timer, - "work_cnt_timer", - Work_Cnt_Timer_Callback, - RT_NULL, - WORK_TIMER_CNT, - RT_TIMER_FLAG_SOFT_TIMER|RT_TIMER_FLAG_PERIODIC); - rt_timer_start(&work_cnt_timer); - rt_timer_init(&preheat_timer, - "preheat_timer", - Preheat_Timer_Callback, - RT_NULL, - TIMEOUT_MS, - RT_TIMER_FLAG_SOFT_TIMER|RT_TIMER_FLAG_ONE_SHOT); - if (Get_VIN_VoltageInt1000x() > 10000) - { - // 检测上电/掉电复位标志 - if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) // TODO:这块超级电容会造成掉电重启,并且标志是上电复位,只能通过其超级电容造成复位时事件创建失败进行判断,不治本 - { - Send_Laser_Alarm_Event(kPowerOnEvent); - TotalRecords.power_on++; - RCC_ClearFlag(); - } - else - { - Send_Laser_Alarm_Event(kPreheatingEvent); // 这一句的作用是设备不是掉电重启的情况,直接进入预热模式 + rt_thread_mdelay(1000); } } else { - LOG_D("欠压复位\r\n"); - } - - while (1) - { - result = rt_event_recv(&alarm_event, - Get_Sys_Event_Flag(kPowerOnEvent) | // 上电 - Get_Sys_Event_Flag(kPowerDownEvent) | // 掉电 - Get_Sys_Event_Flag(kPreheatingEvent) | // 预热 - Get_Sys_Event_Flag(kNormalDetectionEvents) | // 正常检测 - Get_Sys_Event_Flag(kAlarmExceptionEvent) | // 寿命到期 - Get_Sys_Event_Flag(kAlarmEvent) | // 报警 - Get_Sys_Event_Flag(kAlarmRcyEvent) | // 报警恢复 - Get_Sys_Event_Flag(kSelfCheckEvent) | // 自检 - Get_Sys_Event_Flag(kFaultEvent) | // 故障模式 - Get_Sys_Event_Flag(kFaultRcyEvent) | // 故障恢复 - Get_Sys_Event_Flag(KMuteEvent), // 消音 - RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, - RT_WAITING_FOREVER, &received_event); - if (result == RT_EOK) + SYS_EventInit(); + work_duration = Flash_Get_WorkDuration(); + rt_timer_init(&work_cnt_timer, + "work_cnt_timer", + Work_Cnt_Timer_Callback, + RT_NULL, + WORK_TIMER_CNT, + RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_PERIODIC); + rt_timer_start(&work_cnt_timer); + rt_timer_init(&preheat_timer, + "preheat_timer", + Preheat_Timer_Callback, + RT_NULL, + TIMEOUT_MS, + RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT); + if (Get_VIN_VoltageInt1000x() > 10000) { - if (is_event_initialized == RT_TRUE) + // 检测上电/掉电复位标志 + if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) // TODO:这块超级电容会造成掉电重启,并且标志是上电复位,只能通过其超级电容造成复位时事件创建失败进行判断,不治本 { - if (received_event & Get_Sys_Event_Flag(kPowerOnEvent)) // 上电 + Send_Laser_Alarm_Event(kPowerOnEvent); + TotalRecords.power_on++; + RCC_ClearFlag(); + } + else + { + Send_Laser_Alarm_Event(kPreheatingEvent); // 这一句的作用是设备不是掉电重启的情况,直接进入预热模式 + } + } + else + { + LOG_D("欠压复位\r\n"); + } + + while (1) + { + result = rt_event_recv(&alarm_event, + Get_Sys_Event_Flag(kPowerOnEvent) | // 上电 + Get_Sys_Event_Flag(kPowerDownEvent) | // 掉电 + Get_Sys_Event_Flag(kPreheatingEvent) | // 预热 + Get_Sys_Event_Flag(kNormalDetectionEvents) | // 正常检测 + Get_Sys_Event_Flag(kSensorFailureEvent) | // 寿命到期 + Get_Sys_Event_Flag(kAlarmEvent) | // 报警 + Get_Sys_Event_Flag(kAlarmRcyEvent) | // 报警恢复 + Get_Sys_Event_Flag(kSelfCheckEvent) | // 自检 + Get_Sys_Event_Flag(kFaultEvent) | // 故障模式 + Get_Sys_Event_Flag(kFaultRcyEvent) | // 故障恢复 + Get_Sys_Event_Flag(KMuteEvent), // 消音 + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_FOREVER, &received_event); + if (result == RT_EOK) + { + if (is_event_initialized == RT_TRUE) { - LOG_D("上电模式"); - LOG_D("is_event_initialized :%d", is_event_initialized); - SysControl.status = kPowerOnEvent; - - Flash_Write_Record(kRecordPowerOn); - Send_Laser_Alarm_Event(kPreheatingEvent); - } - else if (received_event & Get_Sys_Event_Flag(kPreheatingEvent)) // 预热 - { - LOG_D("预热模式"); - - SysControl.last_status = SysControl.status; - SysControl.status = kPreheatingEvent; - LED_G_PREAT; - rt_timer_start(&preheat_timer); - } - else if (received_event & Get_Sys_Event_Flag(kNormalDetectionEvents)) // 正常检测 - { - LOG_D("正常检测模式"); - - SysControl.last_status = SysControl.status; - SysControl.status = kNormalDetectionEvents; - LED_G_NORMAL; - LOG_D("LED_G_NORMAL"); - } - else if (received_event & Get_Sys_Event_Flag(kAlarmExceptionEvent)) // 浓度异常 - { - LOG_D("浓度异常模式"); - - SysControl.last_status = SysControl.status; - SysControl.status = kAlarmExceptionEvent; - - LED_R_ALARM; - LOG_D("LED_R_ALARM"); - } - else if (received_event & Get_Sys_Event_Flag(kAlarmEvent)) // 报警 - { - LOG_D("报警模式"); - - SysControl.last_status = SysControl.status; - SysControl.status = kAlarmEvent; - LED_R_ALARM; - BEEP_ALARM; - Flash_Write_Record(kRecordAlarm); // 写入flash报警信息 - Bt_Valve_Handler(kValveCmdCtr, 0, RT_NULL); - if (rt_sem_take(&bt_ctr_sem, 10000) == RT_EOK) + if (received_event & Get_Sys_Event_Flag(kPowerOnEvent)) // 上电 { - LOG_D("电磁阀动作完成"); + LOG_D("上电模式"); + LOG_D("is_event_initialized :%d", is_event_initialized); + SysControl.status = kPowerOnEvent; + + Flash_Write_Record(kRecordPowerOn); + Send_Laser_Alarm_Event(kPreheatingEvent); } - else + else if (received_event & Get_Sys_Event_Flag(kPreheatingEvent)) // 预热 { - LOG_E("电磁阀动作失败"); + LOG_D("预热模式"); + + SysControl.last_status = SysControl.status; + SysControl.status = kPreheatingEvent; + LED_G_PREAT; + rt_timer_start(&preheat_timer); + } + else if (received_event & Get_Sys_Event_Flag(kNormalDetectionEvents)) // 正常检测 + { + SysControl.last_status = SysControl.status; + SysControl.status = kNormalDetectionEvents; + + if (Sensor_device.detection_flag == kSensorAlarm) + { + Send_Laser_Alarm_Event(kAlarmEvent); + } + else if (Sensor_device.detection_flag == kSensorFault) + { + Send_Laser_Alarm_Event(kFaultEvent); + } + else if (Sensor_device.detection_flag == kSensorEndOfLife) + { + Send_Laser_Alarm_Event(kSensorFailureEvent); + } + else + { + LOG_D("正常检测模式"); + LED_G_NORMAL; + LOG_D("LED_G_NORMAL"); + } + } + else if (received_event & Get_Sys_Event_Flag(kAlarmExceptionEvent)) // 浓度异常 + { + LOG_D("浓度异常模式"); + + SysControl.last_status = SysControl.status; + SysControl.status = kAlarmExceptionEvent; + + LED_R_ALARM; + LOG_D("LED_R_ALARM"); + } + else if (received_event & Get_Sys_Event_Flag(kAlarmEvent)) // 报警 + { + LOG_D("报警模式"); + + SysControl.last_status = SysControl.status; + SysControl.status = kAlarmEvent; + LED_R_ALARM; + BEEP_ALARM; + Flash_Write_Record(kRecordAlarm); // 写入flash报警信息 + Bt_Valve_Handler(kValveCmdCtr, 0, RT_NULL); + if (rt_sem_take(&bt_ctr_sem, 10000) == RT_EOK) + { + LOG_D("电磁阀动作完成"); + } + else + { + LOG_E("电磁阀动作失败"); + } + +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307AlarmEvent); +#endif + } + else if (received_event & Get_Sys_Event_Flag(kAlarmRcyEvent)) // 报警恢复 + { + LOG_D("报警恢复模式"); + + SysControl.last_status = SysControl.status; + SysControl.status = kAlarmRcyEvent; + + Flash_Write_Record(kRecordAlarmRcy); + + BEEP_STOP; + +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307AlarmRcyEvent); +#endif + + Send_Laser_Alarm_Event(kNormalDetectionEvents); + } + else if (received_event & Get_Sys_Event_Flag(kFaultEvent)) // 故障 + { + LOG_D("故障模式"); + + SysControl.last_status = SysControl.status; + SysControl.status = kFaultEvent; + + Flash_Write_Record(kRecordFault); + + LED_Y_FAULT; + BEEP_FAULT; + +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307FaultEvent); +#endif + } + else if (received_event & Get_Sys_Event_Flag(kFaultRcyEvent)) // 故障恢复 + { + LOG_D("故障恢复模式"); + + SysControl.last_status = SysControl.status; + SysControl.status = kFaultRcyEvent; + + Flash_Write_Record(kRecordFaultRcy); + + BEEP_STOP; + + Send_Laser_Alarm_Event(kNormalDetectionEvents); +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307FaultRcyEvent); +#endif + } + else if (received_event & Get_Sys_Event_Flag(KMuteEvent)) // 消音 + { + LOG_D("消音模式"); + SysControl.last_status = SysControl.status; + SysControl.status = KMuteEvent; + +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307SilenceEvent); +#endif + BEEP_STOP; } -#if (IOT_MODULE_SWITCH == 1) - Ml307_Send_Event(kMl307AlarmEvent); -#endif - } - else if (received_event & Get_Sys_Event_Flag(kAlarmRcyEvent)) // 报警恢复 - { - LOG_D("报警恢复模式"); - - SysControl.last_status = SysControl.status; - SysControl.status = kAlarmRcyEvent; - - Flash_Write_Record(kRecordAlarmRcy); - - BEEP_STOP; - -#if (IOT_MODULE_SWITCH == 1) - Ml307_Send_Event(kMl307AlarmRcyEvent); -#endif - - Send_Laser_Alarm_Event(kNormalDetectionEvents); - } - else if (received_event & Get_Sys_Event_Flag(kFaultEvent)) // 故障 - { - LOG_D("故障模式"); - - SysControl.last_status = SysControl.status; - SysControl.status = kFaultEvent; - - Flash_Write_Record(kRecordFault); - - LED_Y_FAULT; - BEEP_FAULT; - -#if (IOT_MODULE_SWITCH == 1) - Ml307_Send_Event(kMl307FaultEvent); -#endif - } - else if (received_event & Get_Sys_Event_Flag(kFaultRcyEvent)) // 故障恢复 - { - LOG_D("故障恢复模式"); - - SysControl.last_status = SysControl.status; - SysControl.status = kFaultRcyEvent; - - Flash_Write_Record(kRecordFaultRcy); - - BEEP_STOP; - - Send_Laser_Alarm_Event(kNormalDetectionEvents); -#if (IOT_MODULE_SWITCH == 1) - Ml307_Send_Event(kMl307FaultRcyEvent); -#endif - } - else if (received_event & Get_Sys_Event_Flag(KMuteEvent)) // 消音 - { - LOG_D("消音模式"); - SysControl.last_status = SysControl.status; - SysControl.status = KMuteEvent; - -#if (IOT_MODULE_SWITCH == 1) - Ml307_Send_Event(kMl307SilenceEvent); -#endif - BEEP_STOP; - } - - else if (received_event & Get_Sys_Event_Flag(kPowerDownEvent)) // 掉电 - { - LOG_D("掉电模式"); - - SysControl.last_status = SysControl.status; - SysControl.status = kPowerDownEvent; - - // 写入掉电记录 - Flash_Write_Record(kRecordPowerDown); - - Flash_Set_WorkDuration(work_duration); // 写入工作时长 -#if (IOT_MODULE_SWITCH == 1) - Ml307_Send_Event(kMl307PowerDownEvent); -#endif - LOG_D("Enter AnalogWatchdog Interrupt"); - - Flash_Set_WorkDuration(work_duration); // 重启前保存参数 - // 等待180s,要是还没断电就重启 - for (uint8_t i = 0; i < 180; i++) + else if (received_event & Get_Sys_Event_Flag(kPowerDownEvent)) // 掉电 { - rt_thread_mdelay(1000); - LOG_D(" %d s", i); - } - NVIC_SystemReset(); // 直接重启系统 - } - else if (received_event & Get_Sys_Event_Flag(kSelfCheckEvent)) // 自检 - { - LOG_D("自检模式"); + LOG_D("掉电模式"); - SysControl.last_status = SysControl.status; - LOG_D("Self Check Mode SysControl.last_status:%d", SysControl.last_status); - SysControl.status = kSelfCheckEvent; + SysControl.last_status = SysControl.status; + SysControl.status = kPowerDownEvent; - _Self_Check_Mode(); - Send_Laser_Alarm_Event(SysControl.last_status); + // 写入掉电记录 + Flash_Write_Record(kRecordPowerDown); + + Flash_Set_WorkDuration(work_duration); // 写入工作时长 #if (IOT_MODULE_SWITCH == 1) - Ml307_Send_Event(kMl307SelfCheckEvent); + Ml307_Send_Event(kMl307PowerDownEvent); #endif - } - else if (received_event & Get_Sys_Event_Flag(kSensorFailureEvent)) // 失效 - { - LOG_D("传感器失效模式"); - - SysControl.last_status = SysControl.status; - SysControl.status = kSensorFailureEvent; - - if (Flash_GetNum_Records(kRecordSensoEndOfLife) == 0) - { - Flash_Write_Record(kRecordSensoEndOfLife); + LOG_D("Enter AnalogWatchdog Interrupt"); + // 等待30s,要是还没断电就重启 + for (uint8_t i = 0; i < 30; i++) + { + rt_thread_mdelay(1000); + LOG_D(" %d s", i); + } + NVIC_SystemReset(); // 直接重启系统 + } + else if (received_event & Get_Sys_Event_Flag(kSelfCheckEvent)) // 自检 + { + LOG_D("自检模式"); + + SysControl.last_status = SysControl.status; + LOG_D("Self Check Mode SysControl.last_status:%d", SysControl.last_status); + SysControl.status = kSelfCheckEvent; + + _Self_Check_Mode(); + Send_Laser_Alarm_Event(kNormalDetectionEvents); +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307SelfCheckEvent); +#endif + } + else if (received_event & Get_Sys_Event_Flag(kSensorFailureEvent)) // 失效 + { + LOG_D("传感器失效模式"); + + SysControl.last_status = SysControl.status; + SysControl.status = kSensorFailureEvent; + + if (Flash_GetNum_Records(kRecordSensoEndOfLife) == 0) + { + Flash_Write_Record(kRecordSensoEndOfLife); + } + BEEP_END_OF_LIFE; + LED_Y_END_OF_LIFE; } - BEEP_END_OF_LIFE; - LED_Y_END_OF_LIFE; } } } @@ -471,15 +488,15 @@ static void SYS_Set_RtcProductTime(int argc, char **argv) } MSH_CMD_EXPORT(SYS_Set_RtcProductTime, "SYS_Set_RtcProductTime"); -//测试系统标定值修改 +// 测试系统标定值修改 static void TEST_SYS_Calibartion(int argc, char **argv) { if (argc == 2) { - int calibartion_valve = atoi(argv[1]); + int calibartion_valve = atoi(argv[1]); uint8_t calibration_buf[2] = {0}; - calibration_buf[0] = calibartion_valve & 0xFF; // 低字节 - calibration_buf[1] = (calibartion_valve >> 8) & 0xFF; // 高字节 + calibration_buf[0] = calibartion_valve & 0xFF; // 低字节 + calibration_buf[1] = (calibartion_valve >> 8) & 0xFF; // 高字节 Flash_Sys_Cfg(kAlarmLValueId, calibration_buf, 2); LOG_D("标定值修改为 = %d", Flash_Get_SysCfg(kAlarmLValueId)); } diff --git a/applications/user_sys.h b/applications/user_sys.h index 2f72208..7a2ad59 100644 --- a/applications/user_sys.h +++ b/applications/user_sys.h @@ -32,7 +32,7 @@ typedef enum kPowerDownEvent, kSelfCheckEvent, KMuteEvent, - kAlarmExceptionEvent, // alarm_exception + kAlarmExceptionEvent, //浓度异常报警 kMaxEventcnt, } AlarmEvent; diff --git a/bsp/inc/bsp_mq.h b/bsp/inc/bsp_mq.h index 4e46bd3..ba19f03 100644 --- a/bsp/inc/bsp_mq.h +++ b/bsp/inc/bsp_mq.h @@ -26,7 +26,7 @@ // MQ采样间隔 #define MQ_SAMPLING_INTERVAL_MS (100U) -#define SENSOR_SAMPLING_TIMS (5U) +#define SENSOR_SAMPLING_TIMS (6U) // MQ采样时间窗口 #define MQ_SAMPLING_S (uint8_t)(3U) diff --git a/bsp/src/at_device_ml307.c b/bsp/src/at_device_ml307.c index 2337291..209c73b 100644 --- a/bsp/src/at_device_ml307.c +++ b/bsp/src/at_device_ml307.c @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-09-04 13:33:49 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-05 16:31:00 + * @LastEditTime: 2024-12-27 13:03:07 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\at_device_ml307.c * @Description : * @@ -51,6 +51,8 @@ ml307_sys_info ml307 = {0}; struct rt_completion ml307_init_complate; volatile rt_uint8_t socket_id = 0; +rt_sem_t ml307_connect_sem; + static rt_bool_t ml307_get_power_state(struct at_device *device) { struct at_device_ml307 *ml307 = RT_NULL; @@ -102,24 +104,6 @@ rt_err_t Ml307_Reset(struct at_device *device) { at_client_send("AT+MREBOOT\r\n", rt_strlen("AT+MREBOOT\r\n")); - // struct at_device_ml307 *ml307 = RT_NULL; - // ml307 = (struct at_device_ml307 *) device->user_data; - // do{ - /* not nead to set pin configuration for ml307 device power on */ - // if (ml307->power_status_pin == -1 || ml307->rst_pin == -1) - // { - // return; - // } - // if(ml307_get_power_state(device) == ML307_POWER_OFF) - // { - // return; - // } - // rt_pin_write(ml307->rst_pin, PIN_HIGH); - // rt_thread_mdelay(RT_TICK_PER_SECOND/2); - // rt_pin_write(ml307->rst_pin, PIN_LOW); - // rt_thread_mdelay(100); - // }while(ml307_get_power_state(device) != ML307_POWER_OFF); - return RT_EOK; } @@ -131,100 +115,6 @@ void TEST_Ml307_Reset() MSH_CMD_EXPORT(TEST_Ml307_Reset, "test_ml307_reset"); #endif -#if 0 -static int ml307_sleep(struct at_device *device) -{ - at_response_t resp = RT_NULL; - struct at_device_ml307 *ml307 = RT_NULL; - - ml307 = (struct at_device_ml307 *)device->user_data; - if (!ml307->power_status) // power off - { - return (RT_EOK); - } - if (ml307->sleep_status) // is sleep status - { - return (RT_EOK); - } - - resp = at_create_resp(64, 0, rt_tick_from_millisecond(300)); - if (resp == RT_NULL) - { - LOG_D("no memory for resp create."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - /* enable sleep mode */ - // Sleep 轻度睡眠 - if (at_obj_exec_cmd(device->client, resp, "AAT+MLPMCFG=\"sleepmode\",1,1") != RT_EOK) - { - LOG_D("enable sleep set.\"AT+MLPMCFG=\"sleepmode\",1,1\" execute fail."); - at_delete_resp(resp); - return (-RT_ERROR); - } - /* enable PSM mode */ - if (at_obj_exec_cmd(device->client, resp, "AT+MLPMCFG=\"psind\",1") != RT_EOK)//启用(配置协议栈低功耗状态是否上报URC) - { - LOG_D("enable sleep URC.\"AAT+MLPMCFG=\"psind\",1\" execute fail."); - at_delete_resp(resp); - return (-RT_ERROR); - } - ml307->sleep_status = RT_TRUE; - at_delete_resp(resp); - return (RT_EOK); -} -#endif - -#if 0 -static int ml307_wakeup(struct at_device *device) -{ - at_response_t resp = RT_NULL; - struct at_device_ml307 *ml307 = RT_NULL; - - ml307 = (struct at_device_ml307 *)device->user_data; - if (!ml307->power_status) // power off - { - LOG_E("the power is off and the wake-up cannot be performed"); - return (-RT_ERROR); - } - if (!ml307->sleep_status) // no sleep status - { - return (RT_EOK); - } - - resp = at_create_resp(64, 0, rt_tick_from_millisecond(300)); - if (resp == RT_NULL) - { - LOG_D("no memory for resp create."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - if (ml307->wkp_pin != -1) - { - rt_pin_write(ml307->wkp_pin, PIN_LOW); - rt_thread_mdelay(100); - rt_pin_write(ml307->wkp_pin, PIN_HIGH); - rt_thread_mdelay(100); - rt_pin_write(ml307->wkp_pin, PIN_LOW); - } - - /* disable sleep mode */ - if (at_obj_exec_cmd(device->client, resp, "AT+MLPMCFG=\"sleepmode\",0,1") != RT_EOK) - { - LOG_D("wake up fail. \"AT+MLPMCFG=\"sleepmode\",0,1\" execute fail."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - ml307->sleep_status = RT_FALSE; - - at_delete_resp(resp); - return (RT_EOK); -} -#endif - static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t size) { int id; @@ -276,10 +166,6 @@ static void urc_device_reset(struct at_client *client, const char *data, rt_size { LOG_D("device reset"); ml307_conncet_tcp_flag = 0; - if (SysControl.status == kNormalDetectionEvents) - { - LED_G_NORMAL; - } } static void urc_tcp_connect_state(struct at_client *client, const char *data, rt_size_t size) @@ -288,10 +174,11 @@ static void urc_tcp_connect_state(struct at_client *client, const char *data, rt if (sscanf(data, "+MIPOPEN:%d,%d", &id, &err_code) == 2) { - if ((id == socket_id) && (err_code == 0)) + if (id == socket_id) { LOG_D("ml307 connect to tcp server success"); ml307_conncet_tcp_flag = 1; + rt_sem_release(ml307_connect_sem); } } } @@ -332,31 +219,11 @@ static void urc_tcp_disconnect(struct at_client *client, const char *data, rt_si } } -// static void urc_tcp_send_check(struct at_client *client, const char *data, rt_size_t size) -// { -// size_t id, len; -// if (sscanf(data, "+MIPSEND:%d,%d", &id, &len) == 2) -// { -// if (id == socket_id) -// { -// if (len == ) -// { - -// } - -// LOG_D("ml307 send data success"); -// } -// } -// } - - static const struct at_urc urc_table[] = { - // {"+NSONMI:", "\r\n", urc_tcp_recv}, {"REBOOTING", "\r\n", urc_device_reset}, // 这个是软件复位时, {"+MIPOPEN:", "\r\n", urc_tcp_connect_state}, {"+MIPURC: \"disconn\"", "\r\n", urc_tcp_disconnect}, {"+MIPURC: \"rtcp\"", "\r\n", urc_tcp_recv}, - // {"+MIPSEND:", "\r\n", urc_tcp_send_check}, }; static void show_resp_info(at_response_t resp) { @@ -393,93 +260,30 @@ int at_device_ml307_disconnect_tcp(struct at_device *device) return -RT_ERROR; } ml307_conncet_tcp_flag = 0; - if (SysControl.status == kNormalDetectionEvents) - { - LED_G_NORMAL; - } show_resp_info(resp); at_delete_resp(resp); } return RT_EOK; } -#if 0 - - -int at_device_ml307_socket_creat(struct at_device *device) -{ - rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId); - at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN, 4, AT_DEFAULT_TIMEOUT); - if (resp == RT_NULL) - { - LOG_E("No memory for response structure!"); - at_delete_resp(resp); - return -RT_ENOMEM; - } - while (retry--) - { - if (at_obj_exec_cmd(device->client, resp, TCP_SOCKET_CREAT, TCP_SERVER_PORT) == RT_EOK) - { - if (at_resp_parse_line_args(resp, 2, "%d", &socket_id) > 0) - { - LOG_D("ml307 create tcp socket:%d", socket_id); - at_delete_resp(resp); - return RT_EOK; - } - else - { - LOG_E("ml307 create tcp socket failed. retry %d", retry); - } - } - } - at_delete_resp(resp); - Ml307_Reset(device); - - return RT_ERROR; -} -#endif // 0 - static int at_device_ml307_connect_tcp(struct at_device *device) { rt_err_t ret = RT_ERROR; ASSERT(device); rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId); - at_response_t resp = at_create_resp(64, 2, 2000); + at_response_t resp = at_create_resp(64, 2, 5000); if (resp == RT_NULL) { LOG_E("No memory for response structure!"); at_delete_resp(resp); return -RT_ENOMEM; } -#if 0 - if (at_device_ml307_socket_creat(device) != RT_EOK) - { - LOG_E("ml307 connect to tcp server failed."); - at_delete_resp(resp); - return -RT_ERROR; - } - - // /* read data from tcp server */ - // if (at_obj_exec_cmd(device->client, resp, TCP_READ_SET_CMD, socket_id, AT_CLIENT_RECV_BUFF_LEN) != RT_EOK) - // { - // at_delete_resp(resp); - // return RT_ERROR; - // } - - /* enable tcp notification */ - if (at_obj_exec_cmd(device->client, resp, TCP_SET_NSONMI, AT_NSONMI_MODE_DEFAULT) != RT_EOK) - { - at_delete_resp(resp); - return RT_ERROR; - } -#endif if (Flash_Get_Sever_Addr_Info(&sever_info) != RT_EOK) { LOG_E("Get Sever Data Failed"); at_delete_resp(resp); return RT_ERROR; } - // rt_uint16_t sever_port = strtol(sever_info.server_port, RT_NULL, 10); // 将字符串转为十进制 LOG_D("sever_info.server_url:%s sever_info.server_port:%s", sever_info.server_url, sever_info.server_port); for (size_t i = 0; i < retry; i++) { @@ -487,27 +291,20 @@ static int at_device_ml307_connect_tcp(struct at_device *device) { if (at_resp_get_line_by_kw(resp, "OK") != RT_NULL) { - rt_thread_mdelay(2000); - if (ml307_conncet_tcp_flag == RT_TRUE) + if (rt_sem_take(ml307_connect_sem, 5000) == RT_EOK) { LOG_D("ml307 connect to tcp server success"); ret = RT_EOK; break; } - } - else - { - ml307_conncet_tcp_flag = 0; - LOG_E("ml307 connect to tcp server failed."); - ret = -RT_ERROR; + else + { + LOG_E("ml307 connect to tcp server failed"); + } } } rt_thread_mdelay(3000); } - if ((SysControl.status == kNormalDetectionEvents) && (ml307_conncet_tcp_flag == RT_FALSE)) - { - LED_G_NORMAL; - } at_delete_resp(resp); return ret; } @@ -518,10 +315,6 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len) if (ml307_conncet_tcp_flag) { - if (SysControl.status == kNormalDetectionEvents) - { - LED_G_INTERNET; - } rt_uint8_t retry = 0; rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId); LOG_D("max_retry_count:%d", max_retry_count); @@ -535,6 +328,7 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len) } while (retry < max_retry_count) { + if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, send_len, data) == RT_EOK) { size_t len = 0; @@ -544,10 +338,6 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len) { LOG_D("send data success, len:%d", len); at_delete_resp(resp); - if (SysControl.status == kNormalDetectionEvents) - { - LED_G_NORMAL; - } return RT_EOK; } @@ -558,8 +348,8 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len) retry++; } } - rt_thread_mdelay(2000); retry++; + rt_thread_mdelay(1000); } at_delete_resp(resp); return -RT_ERROR; @@ -567,10 +357,6 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len) else { LOG_D("not connected tcp sever!"); - if (SysControl.status == kNormalDetectionEvents) - { - LED_G_NORMAL; - } return -RT_ERROR; } } @@ -592,21 +378,6 @@ static int ml307_check_link_status(struct at_device *device) LOG_E("no memory for resp create."); return -RT_ERROR; } - - // if (at_obj_exec_cmd(device->client, resp, "AT+MIPCALL?") < 0) // 建立模组应用层拨号连接 - // { - // result = -RT_ERROR; - // goto __exit; - // } - - // if (at_resp_parse_line_args_by_kw(resp, "+MIPCALL:", "+MIPCALL: %d,%*d,%*s", &link_stat) > 0) - // { - // if (link_stat == 1) - // { - // result = RT_EOK; - // } - // } - if (at_obj_exec_cmd(device->client, resp, "AT+CGACT?") < 0) { result = -RT_ERROR; @@ -690,49 +461,6 @@ static int ml307_netdev_set_info(struct netdev *netdev) inet_aton(ipaddr, &addr); netdev_low_level_set_ipaddr(netdev, &addr); } -#if 0 - /* set network interface device dns server */ - { -#define DNS_ADDR_SIZE_MAX 16 - char dns_server1[DNS_ADDR_SIZE_MAX] = {0}, dns_server2[DNS_ADDR_SIZE_MAX] = {0}; - char dns_str[DNS_ADDR_SIZE_MAX*3] = {0}; - - at_resp_set_info(resp, ML307_DNS_RESP_SIZE, 0, ML307_INFO_RESP_TIMO); - - /* send "AT+MDNSCFG=\"priority\",0" commond to set resolve IPV4 address priority */ - if (at_obj_exec_cmd(device->client, resp, "AT+MDNSCFG=\"priority\",0") < 0) - { - result = -RT_ERROR; - goto __exit; - } - /* send "AT+MDNSCFG=\"ip\"" commond to get DNS servers address */ - if (at_obj_exec_cmd(device->client, resp, "AT+MDNSCFG=\"ip\"") < 0) - { - result = -RT_ERROR; - goto __exit; - } - //+MDNSCFG: "ip","183.230.126.224",,"183.230.126.225" - if (at_resp_parse_line_args_by_kw(resp, "+MDNSCFG:", "+MDNSCFG: \"ip\",%s", dns_str) < 0) - { - result = -RT_ERROR; - goto __exit; - } - - const char *dns1_str = strstr(dns_str, "\""); - sscanf(dns1_str, "\"%[^\"]", dns_server1); - const char *dns2_str = strstr(dns_str, "\",\""); - sscanf(dns2_str, "\",\"%[^\"]", dns_server2); - - LOG_D("ml307 device(%s) primary DNS server address: %s", device->name, dns_server1); - LOG_D("ml307 device(%s) secondary DNS server address: %s", device->name, dns_server2); - - inet_aton(dns_server1, &addr); - netdev_low_level_set_dns_server(netdev, 0, &addr); - - inet_aton(dns_server2, &addr); - netdev_low_level_set_dns_server(netdev, 1, &addr); - } -#endif // __exit: if (resp) { @@ -1595,6 +1323,7 @@ static int ml307_init(struct at_device *device) LOG_E("add netdev(%s) failed.", ml307->device_name); return -RT_ERROR; } + ml307_connect_sem = rt_sem_create("ml307_connect_sem", 0, RT_IPC_FLAG_PRIO); /* initialize ml307 pin configuration */ if (ml307->pwr_en_pin != -1) { diff --git a/bsp/src/bsp_bt.c b/bsp/src/bsp_bt.c index 6632c81..348efab 100644 --- a/bsp/src/bsp_bt.c +++ b/bsp/src/bsp_bt.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-12-03 10:31:45 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-17 15:43:58 + * @LastEditTime: 2024-12-27 13:08:43 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_bt.c * @Description: * @@ -216,7 +216,6 @@ int BSP_Bt_Replace_Valve(rt_uint8_t id, rt_uint8_t *mac_addr, rt_uint8_t *new_ma int Bt_Valve_Handler(ValveCmdType type, rt_uint8_t id, rt_uint8_t *data) { int ret = RT_EOK; - switch (type) { case kValveCmdCtr: // 阀门控制 @@ -357,29 +356,74 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) static void BSP_Bt_Parse_Data(void) { rt_size_t len = lwrb_get_full(&bt_lwrb_rx); - // char *rx_ptr = rt_malloc(len + 1); - rt_uint8_t bt_rx_buf[256] = {0}; + char *rx_ptr = rt_malloc(len + 1); + // rt_uint8_t bt_rx_buf[256] = {0}; - BSP_Bt_Recv_Data(bt_rx_buf, len); + BSP_Bt_Recv_Data(rx_ptr, len); // 发送过来的数据格式为:帧头 + 数据长度 + 事件类型 + 数据 + 校验码 + 帧尾 - BSP_Bt_Process(bt_rx_buf, len); - // rt_free(rx_ptr); + BSP_Bt_Process(rx_ptr, len); + rt_free(rx_ptr); } +void BSP_Bt_Valve_Updata(void) +{ + uint8_t cnt = 0; + uint8_t mac[6] = {0}; + + uint8_t num = Flash_Get_Valve_Num(); + LOG_D("BSP_Bt_Valve_Updata num: %d ", num); + if (num == 0) + { + return; + } + + rt_memset(&valve[0], 0, sizeof(valve_data)); + + for (int i = 1; i <= MAX_VALVE_NUM; i++) // 这个循环是为了将数据拷贝到valve_list中, 并且保证id号和flash对应起来 + { + if (Flash_Get_Mac_Addr(mac, i) == 0) // 说明有MAC数据 + { + rt_memcpy(valve[cnt].valve_mac, mac, 6); // 这样做的目的就是读取方便,只需要根据flash中读取到的数量进行读取前N个值 + valve[cnt].valve_id = i + 1; + LOG_D("updata valve_id: %d, valve_mac: %02X %02X %02X %02X %02X %02X", + valve[cnt].valve_id, + valve[cnt].valve_mac[0], + valve[cnt].valve_mac[1], + valve[cnt].valve_mac[2], + valve[cnt].valve_mac[3], + valve[cnt].valve_mac[4], + valve[cnt].valve_mac[5]); + cnt++; + break; + } + else + { + LOG_D("BSP_Bt_Valve_Updata: flash read error"); + break; + } + } + Flash_Set_Valve_Num(cnt); + +} + + static void Bt_Thread_Entry(void *parameter) { - // 初始化阀门信息 - // valve[0].valve_id = 1; - // valve[0].valve_mac[0] = 0X93; - // valve[0].valve_mac[1] = 0xB4; - // valve[0].valve_mac[2] = 0x8F; - // valve[0].valve_mac[3] = 0x10; - // valve[0].valve_mac[4] = 0x53; - // valve[0].valve_mac[5] = 0x5C; -// - // Flash_Set_Mac_Addr(valve[0].valve_mac, 0); - // Flash_Set_Valve_Num(1); +#if 0 +// 初始化阀门信息 测试用 + valve[0].valve_id = 1; + valve[0].valve_mac[0] = 0X93; + valve[0].valve_mac[1] = 0xB4; + valve[0].valve_mac[2] = 0x8F; + valve[0].valve_mac[3] = 0x10; + valve[0].valve_mac[4] = 0x53; + valve[0].valve_mac[5] = 0x5C; + Flash_Set_Mac_Addr(valve[0].valve_mac, 0); + Flash_Set_Valve_Num(1); +#endif //0 + + BSP_Bt_Valve_Updata(); lwrb_init(&bt_lwrb_rx, bt_rx_buffer, sizeof(bt_rx_buffer)); lwrb_reset(&bt_lwrb_rx); @@ -453,7 +497,6 @@ static void TEST_BT_Send_Data(int argc, char **argv) { int mode = atoi(argv[1]); int id = atoi(argv[2]) - 1; - LOG_D("send data mode: %d id :%d", mode, id); switch (mode) { case 1: diff --git a/bsp/src/bsp_button.c b/bsp/src/bsp_button.c index 022b964..1f34fe6 100644 --- a/bsp/src/bsp_button.c +++ b/bsp/src/bsp_button.c @@ -1,17 +1,16 @@ #include #include "flexible_button.h" #include "bsp_button.h" - +#include "bsp_flash.h" #include "bsp_led.h" #include "bsp_beep.h" - +#include "bsp_bt.h" #include "user_sys.h" #define LOG_TAG "bsp_button" #define LOG_LVL LOG_LVL_DBG #include - #ifdef BUTTON_USE_THREAD ALIGN(RT_ALIGN_SIZE) static char button_thread_stack[BUTTON_THREAD_STACK_SIZE]; @@ -23,7 +22,7 @@ static rt_timer_t button_timer; typedef enum { USER_BUTTON_0 = 0, - USER_BUTTON_1 , + USER_BUTTON_1, USER_BUTTON_MAX } user_button_t; @@ -49,13 +48,6 @@ static uint8_t _CommonBtnRead(void *arg) return value; } -#if 0 -static uint8_t led_cnt = 1; -static uint8_t beep_cnt = 1; -static uint8_t relay_cnt = 1; -// static uint8_t emv_cnt = 0; -#endif - static void _CommonBtnEvtCb(void *arg) { static rt_uint8_t button_cnt = 0; @@ -64,8 +56,33 @@ static void _CommonBtnEvtCb(void *arg) { Send_Laser_Alarm_Event(kSelfCheckEvent); } -#if 1 - if ((flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_DOUBLE_CLICK)|| (flex_button_event_read(&user_button[USER_BUTTON_1]) == FLEX_BTN_PRESS_DOUBLE_CLICK)) + if ((flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_LONG_HOLD) || (flex_button_event_read(&user_button[USER_BUTTON_1]) == FLEX_BTN_PRESS_LONG_HOLD)) + { + LOG_I("本地清除阀门信息"); + LED_ON(r); + rt_uint8_t mac_addr[6] = {0}; + Bt_Valve_Handler(kValveCmdRem, 0, RT_NULL); + if (rt_sem_take(&bt_rem_sem, 10000) == RT_EOK) // 如果没刷掉数据,则黄灯会亮一秒,如果刷成功了,则红灯闪一下黄灯不会亮 + { + if (Flash_Set_Mac_Addr(mac_addr, 0) != -RT_ERROR) // 将flash数据清掉 + { + rt_thread_mdelay(100); + LED_OFF(r); + LOG_I("本地清除阀门信息成功"); + } + } + else + { + LOG_E("本地清除阀门信息错误"); + LED_OFF(r); + LED_OFF(g); + LED_ON(y); + rt_thread_mdelay(1000); + LED_OFF(y); + } + } +#if 1 // 测试LED灯状态用,测试完成后关闭 + if ((flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_DOUBLE_CLICK) || (flex_button_event_read(&user_button[USER_BUTTON_1]) == FLEX_BTN_PRESS_DOUBLE_CLICK)) { button_cnt++; if (button_cnt == 1) @@ -114,7 +131,7 @@ int BSP_BUTTON_Init(void) rt_pin_mode(BUTTON_0, PIN_MODE_INPUT_PULLUP); /* set KEY pin mode to input */ rt_pin_mode(BUTTON_1, PIN_MODE_INPUT_PULLUP); /* set KEY pin mode to input */ - + for (uint8_t i = 0; i < USER_BUTTON_MAX; i++) { user_button[i].id = i; diff --git a/bsp/src/bsp_flash.c b/bsp/src/bsp_flash.c index 6a68aeb..bb19003 100644 --- a/bsp/src/bsp_flash.c +++ b/bsp/src/bsp_flash.c @@ -2,7 +2,7 @@ #include "lwutil.h" #include "bsp_rtc.h" #include "bsp_hr.h" - #include "at_device_ml307.h" +#include "at_device_ml307.h" #include #include @@ -12,30 +12,28 @@ #include -//在此修改默认的服务器地址 +// 在此修改默认的服务器地址 struct flash_sever_info sever_info = -{ - .server_url = "8.130.122.162", - .server_port = "7153", - // .server_port = "36078", - // .server_url = "8.135.10.183", + { + .server_url = "8.130.122.162", + .server_port = "7153", + // .server_port = "36078", + // .server_url = "8.135.10.183", }; - - extern int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *hex_array); #define GETATTR(info, id) ((id) == kHwVerId ? (&(info)->hw_ver) \ : (id) == kSwVerId ? (&(info)->sw_ver) \ : (id) == kAlarmLValueId ? (&(info)->alarm_l_value) \ : (id) == kAlarmHValueId ? (&(info)->alarm_h_value) \ : (id) == kTempAlarmThresholdId ? (&(info)->temp_alarm_threshold) \ - : (id) == kIotUploadCycleId ? (&(info)->nb_upload_cycle) \ - : (id) == kIotRetryId ? (&(info)->nb_retry) \ + : (id) == kIotUploadCycleId ? (&(info)->nb_upload_cycle) \ + : (id) == kIotRetryId ? (&(info)->nb_retry) \ : (id) == kEmagneticSwitchId ? (&(info)->emagnetic_switch) \ : (id) == kRelaySwitchId ? (&(info)->relay_switch) \ - : (id) == kIotImeiId ? ((info)->nb_imei) \ - : (id) == kIotImsiId ? ((info)->nb_imsi) \ - : (id) == kIotIccidId ? ((info)->nb_iccid) \ + : (id) == kIotImeiId ? ((info)->nb_imei) \ + : (id) == kIotImsiId ? ((info)->nb_imsi) \ + : (id) == kIotIccidId ? ((info)->nb_iccid) \ : NULL) TsTotalRecords TotalRecords; @@ -93,15 +91,13 @@ static rt_base_t interrupt_value; rt_uint8_t sys_hw_ver = 0x10; rt_uint8_t sys_sw_ver = 0x11; rt_uint8_t sys_nb_retry = 0x03; // 重试次数3次 -rt_uint16_t sys_nb_upload_cycle = 0x000A; // 120分钟一次 -rt_uint16_t sys_alarm_h_value = 0x0032; // 50 -rt_uint16_t sys_alarm_l_value = 0x09C4; // 2500 +rt_uint16_t sys_nb_upload_cycle = 0x000A; // 120分钟一次 +rt_uint16_t sys_alarm_h_value = 0x0032; // 50 +rt_uint16_t sys_alarm_l_value = 0x09C4; // 2500 rt_uint8_t sys_temp_alarm_threshold = 0x32; rt_uint8_t sys_emagnetic_switch = 0x04; // 具备阀门功能 rt_uint8_t sys_relay_switch = 0x04; // 具备继电器功能 - - static void BSP_Flash_UnLock(void) { #if (SystemCoreClock > SYSCLK_FREQ_96MHz_HSE) @@ -142,8 +138,6 @@ static void BSP_Flash_FastLock(void) rt_hw_interrupt_enable(interrupt_value); } - - static rt_size_t Flash_Read(rt_uint32_t addr, rt_uint8_t *buf, rt_size_t len) { rt_size_t read_len = 0; @@ -158,7 +152,7 @@ static rt_size_t Flash_Read(rt_uint32_t addr, rt_uint8_t *buf, rt_size_t len) int Get_Iot_Imei(char *buf, rt_size_t len) { - if ((*(rt_uint8_t *)FLASH_NB_IMEI_ADDR != 0xE3)&&(*(rt_uint8_t *)FLASH_NB_IMEI_ADDR != 0x39)) + if ((*(rt_uint8_t *)FLASH_NB_IMEI_ADDR != 0xE3) && (*(rt_uint8_t *)FLASH_NB_IMEI_ADDR != 0x39)) { rt_memcpy(buf, (char *)FLASH_NB_IMEI_ADDR, len); @@ -179,7 +173,7 @@ int Get_Iot_Imei(char *buf, rt_size_t len) int Get_Iot_Imsi(char *buf, rt_size_t len) { - if ((*(rt_uint8_t *)FLASH_NB_IMSI_ADDR != 0xE3)&&(*(rt_uint8_t *)FLASH_NB_IMSI_ADDR != 0x39)) + if ((*(rt_uint8_t *)FLASH_NB_IMSI_ADDR != 0xE3) && (*(rt_uint8_t *)FLASH_NB_IMSI_ADDR != 0x39)) { rt_memcpy(buf, (char *)FLASH_NB_IMSI_ADDR, len); @@ -200,7 +194,7 @@ int Get_Iot_Imsi(char *buf, rt_size_t len) int Get_Iot_Iccid(char *buf, rt_size_t len) { - if ((*(rt_uint8_t *)FLASH_NB_ICCID_ADDR != 0xE3)&&(*(rt_uint8_t *)FLASH_NB_ICCID_ADDR != 0x39)) + if ((*(rt_uint8_t *)FLASH_NB_ICCID_ADDR != 0xE3) && (*(rt_uint8_t *)FLASH_NB_ICCID_ADDR != 0x39)) { rt_memcpy(buf, (char *)FLASH_NB_ICCID_ADDR, len); @@ -298,8 +292,8 @@ int Flash_Get_Sever_Addr_Info(struct flash_sever_info *sever_info) } LOG_D("data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x", 0, data[0], 1, data[1], 2, data[2], 3, data[3], 4, data[4], 5, data[5]); rt_snprintf(sever_info->server_url, sizeof(sever_info->server_url), "%d.%d.%d.%d", - data[3], data[2], data[1], data[0]); - + data[3], data[2], data[1], data[0]); + rt_uint16_t port_num = ((data[5] << 8) | data[4]); LOG_D("port_num = %d", port_num); rt_snprintf(sever_info->server_port, sizeof(sever_info->server_port), "%d", port_num); @@ -317,18 +311,17 @@ int Flash_Set_Sever_Addr_Info(rt_uint8_t *data) { return -RT_ERROR; } - + Flash_ErasePage_ReadConfigInfo(page_buf); - //*将传入的数据写到flash地址中 + //*将传入的数据写到flash地址中 for (size_t i = 0; i < FLASH_SERVER_LEN; i++) { page_buf[in_page_offset++] = data[i]; } - + return Flash_Write_ConfigInfo(page_buf); } - TeCalibrationStatus Flash_Get_Calibration_State(void) { return *(rt_uint8_t *)FLASH_CALIBRATION_STATUS_ADDR; @@ -340,21 +333,22 @@ int Flash_Set_Calibration_State(TeCalibrationStatus status) rt_uint8_t in_page_offset = (FLASH_CALIBRATION_STATUS_ADDR - FLASH_CONFIG_INFO_START_ADDR); LOG_D("FLASH_CALIBRATION_STATUS_ADDR = %X", FLASH_CALIBRATION_STATUS_ADDR); Flash_ErasePage_ReadConfigInfo(page_buf); - //*将传入的数据写到flash地址中 + //*将传入的数据写到flash地址中 page_buf[in_page_offset] = status; - + return Flash_Write_ConfigInfo(page_buf); } -/*写入MAC地址*/ +/*写入MAC地址 number :1-8 + */ int Flash_Set_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number) { rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0}; - rt_uint8_t in_page_offset = ((FLASH_VALVE_1_MAC_ADDR_ADDR + number * FLASH_VALVE_MAC_ADDR_LEN) - FLASH_CONFIG_INFO_START_ADDR); + rt_uint8_t in_page_offset = ((FLASH_VALVE_1_MAC_ADDR_ADDR + (number - 1) * FLASH_VALVE_MAC_ADDR_LEN) - FLASH_CONFIG_INFO_START_ADDR); if (mac_addr == RT_NULL) { - return -RT_ERROR; + return -RT_ERROR; } Flash_ErasePage_ReadConfigInfo(page_buf); for (size_t i = 0; i < FLASH_VALVE_MAC_ADDR_LEN; i++) @@ -364,26 +358,32 @@ int Flash_Set_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number) return Flash_Write_ConfigInfo(page_buf); } -/*读取MAC地址*/ +/*读取MAC地址 number :1-8*/ int Flash_Get_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number) { rt_uint8_t data[FLASH_VALVE_MAC_ADDR_LEN]; char mac[16] = {20}; - rt_memcpy(data, (rt_uint8_t *)(FLASH_VALVE_1_MAC_ADDR_ADDR + number * FLASH_VALVE_MAC_ADDR_LEN), FLASH_VALVE_MAC_ADDR_LEN); + rt_memcpy(data, (rt_uint8_t *)(FLASH_VALVE_1_MAC_ADDR_ADDR + (number - 1) * FLASH_VALVE_MAC_ADDR_LEN), FLASH_VALVE_MAC_ADDR_LEN); if (data == RT_NULL) { LOG_E("Flash_Get_Mac_Addr failed"); return -RT_ERROR; } - //进行两次判断的原因主要为,防止MAC地址确实有个e3或者e99,但是MAC地址确是正确的情况,防止出现错误,两次判断可以从一定程度上降低这种风险 - if (((data[0] == 0xe3) || (data[0] == 0x39))&&((data[1] == 0xe3) || (data[1] == 0x39))) + // 判断读出来的数是否是flash的默认值 如果默认值是0xe3e9的话 + if ((data[0] == 0xe3 || data[0] == 0xe9) && + (data[1] == 0xe3 || data[1] == 0xe9) && + (data[2] == 0xe3 || data[2] == 0xe9) && + (data[3] == 0xe3 || data[3] == 0xe9) && + (data[4] == 0xe3 || data[4] == 0xe9) && + (data[5] == 0xe3 || data[5] == 0xe9)) { - rt_memset(data, 0, sizeof(data)); - return RT_EEMPTY; + rt_memset(data, 0, 6); + rt_memcpy(mac_addr, data, FLASH_VALVE_MAC_ADDR_LEN); + return RT_EOK; } - + rt_snprintf(mac, 20, "%02x:%02x:%02x:%02x:%02x:%02x", - data[5], data[4], data[3], data[2], data[1], data[0]); + data[5], data[4], data[3], data[2], data[1], data[0]); LOG_I("mac_addr:%s", mac); rt_memcpy(mac_addr, data, FLASH_VALVE_MAC_ADDR_LEN); @@ -454,7 +454,6 @@ void Flash_Erase_Records(TeRecord record) LOG_D("Flash_Erase_Records(%d)", record); } - /* * @description: * @param {TeRecord} record @@ -482,7 +481,6 @@ static rt_uint16_t Flash_GetMaxIndex_Records(TeRecord record) return index_max; } - /** * @description: * @param {TeRecord} record @@ -507,8 +505,6 @@ rt_uint8_t Flash_GetNum_Records(TeRecord record) return num; } - - /** * @description: * @param {TuFlashHrRecordFrame*} pHrRecord @@ -656,7 +652,6 @@ void Flash_Write_Record(TeRecord record) Flash_Write_RecordIndex(&HrRecord, record, index_new); } - void Flash_ErasePage_ConfigInfo(void) { BSP_Flash_FastUnLock(); @@ -711,8 +706,6 @@ ErrorStatus Flash_GetProductTimeLimit(TuFlashProductTimeLimitFrame *pLimitTime, return flag; } - - void Flash_SetProductTimeLimit(rt_uint16_t year, rt_uint8_t mon, rt_uint8_t day, rt_uint8_t hour, rt_uint8_t min, rt_uint8_t second, TeFlashProductTimeLimitId id) @@ -786,7 +779,6 @@ void Set_ExpirationTime(rt_uint16_t days) } } - rt_uint8_t Flash_Sys_Cfg(TeFlashCfgInfoId id, rt_uint8_t *buf, rt_size_t len) { rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0}; @@ -814,10 +806,10 @@ size_t Flash_Get_SysCfg(TeFlashCfgInfoId id) { size_t value = 0; if (hr_sys_cfg_info_len[id] == 1) - { + { return *(rt_uint8_t *)hr_sys_cfg_info_addr[id]; } - else if (hr_sys_cfg_info_len[id] == 2) + else if (hr_sys_cfg_info_len[id] == 2) { rt_uint8_t buf[2] = {0}; @@ -830,8 +822,6 @@ size_t Flash_Get_SysCfg(TeFlashCfgInfoId id) return value; } - - ErrorStatus Flash_GetTotalRecord(TsTotalRecords *pTotalRecords) { ErrorStatus flag = NoREADY; @@ -902,7 +892,7 @@ int BSP_Flash_Init(void) LOG_D("BSP_Flash_EraseRecodrs!"); rt_uint8_t flash_init_flag[2]; sys_config_info sci; - rt_uint8_t sever_data[6] = {0}; + rt_uint8_t sever_data[6] = {0}; flash_init_flag[0] = FLASH_FIRST_INIT_VALUE % 256; flash_init_flag[1] = FLASH_FIRST_INIT_VALUE / 256; @@ -924,7 +914,7 @@ int BSP_Flash_Init(void) sci.temp_alarm_threshold = sys_temp_alarm_threshold; sci.emagnetic_switch = sys_emagnetic_switch; sci.relay_switch = sys_relay_switch; - + Flash_Set_WorkDuration(work_duration); LOG_D("work_duration:%d", Flash_Get_WorkDuration()); @@ -933,16 +923,15 @@ int BSP_Flash_Init(void) { LOG_D("%02x", sever_data[i]); } - - if(Flash_Set_Sever_Addr_Info(sever_data) <= 0) + + if (Flash_Set_Sever_Addr_Info(sever_data) <= 0) { LOG_D("Flash_Set_Sever_Addr_Info error!"); } - Flash_Set_Calibration_State(kSysGasCalibStatus);//未标定状态 + Flash_Set_Calibration_State(kSysGasCalibStatus); // 未标定状态 Flash_Set_Valve_Num(0); Flash_Write(FLASH_HW_VER_ADDR, (rt_uint8_t *)&sci, (sizeof(sys_config_info) - 50)); - } return 0; } @@ -950,7 +939,6 @@ int BSP_Flash_Init(void) INIT_PREV_EXPORT(BSP_Flash_Init); #endif - #ifdef TEST_ENABLE static void TEST_Flash_GetMaxIndex_Records(int argc, char **argv) { @@ -968,7 +956,6 @@ static void TEST_Flash_GetMaxIndex_Records(int argc, char **argv) MSH_CMD_EXPORT(TEST_Flash_GetMaxIndex_Records, "TEST_Flash_GetMaxIndex_Records"); - static void TEST_Flash_Erase_Records(int argc, char **argv) { if (argc == 2) diff --git a/bsp/src/bsp_ml307.c b/bsp/src/bsp_ml307.c index e0d780c..0a35911 100644 --- a/bsp/src/bsp_ml307.c +++ b/bsp/src/bsp_ml307.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-11-30 15:46:21 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-17 15:12:17 + * @LastEditTime: 2024-12-27 17:49:25 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c * @Description: * @@ -52,7 +52,7 @@ rt_sem_t ml307_life_sem; static rt_timer_t ml307_timer; // 上报心跳 static rt_timer_t ml307_upload_timer; // 更新本地时间定时器 static rt_timer_t ml307_power_error_timer; // 上电失败情况下启动定时器 -static rt_timer_t ml307_heartbeat_check_timer; // 用于检测定时器是否工作 + rt_uint8_t ml307_conncet_tcp_flag; Ml307EventIndex ml307_event_index; @@ -99,11 +99,10 @@ static rt_bool_t ml307_event_initialized = RT_FALSE; // 是否初 typedef enum { - - ML307_PRIORITY_LOWEST, // 4、优先级最低(定时心跳、浓度异常、报警触发、报警解除、传感器故障触发 传感器故障解除) - ML307_PRIORITY_MEDIUM, // 2、优先级第三高 自检触发 - ML307_PRIORITY_HIGH, // 1、优先级第二高 掉电 - ML307_PRIORITY_HIGHEST, // 0 优先级最高(设备上电时的定时心跳) + kMl307PriorityLowest, // 4、优先级最低(定时心跳、浓度异常、报警触发、报警解除、传感器故障触发 传感器故障解除) + kMl307PriorityMedium, // 2、优先级第三高 自检触发 + kMl307PriorityHigh, // 1、优先级第二高 掉电 + kMl307PriorityHighest, // 0 优先级最高(设备上电时的定时心跳) } Ml307Priority; typedef struct @@ -163,12 +162,10 @@ void Ml307_Send_Event(Ml307Event event_type) } } -static rt_uint8_t last_value = 0; // 用于存储上次检测的值 -static rt_uint8_t current_value = 0; // 用于存储当前检测的值 // 定义定时器回调函数 static void Ml307_Ht_Timer_Cb(void *parameter) { - current_value++; + Ml307_Send_Event(kMl307HeartbeatEvent); } @@ -184,25 +181,6 @@ static void Ml307_Error_Timer_Cb(void *parameter) } } -static void Ml307_Heartbeat_check_Timer_Cb(void *parameter) -{ - // static rt_uint8_t relay_cnt = 0; - if (last_value == current_value) - { - // rt_timer_start(ml307_timer); // 重启一下定时器 - // relay_cnt++; - reboot(); // 三个心跳周期定时器都没启动,直接重启 - } - // else - // { - // if (current_value > 100) // 随便设一个不大于255的数就行 目的就是循环检测,不超 - // { - // last_value = current_value; - // current_value = 0; - // } - // } -} - int _Pack_Send(struct Ml307_Ops *ops, char *buf) { char ml307_send_buf[1024] = {0}; // 发送缓冲区,用于存储最终发送的数据 @@ -378,21 +356,14 @@ int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_snprintf(temp, sizeof(temp), "%02X", ((rt_uint8_t *)ops->body)[i]); rt_memcpy(data_buf + i * 2, temp, 2); } - rt_mutex_release(ml307_mutex); ret = _Send_Handle(ops, data_num, cmd, data_buf); if (ret != RT_EOK) { - return -ret; + ret = -ret; } } } - else - { - rt_mutex_release(ml307_mutex); - LOG_E("ml307_conncet_tcp_flag = 0"); - ret = -RT_ERROR; - } - + rt_mutex_release(ml307_mutex); return ret; } @@ -496,7 +467,6 @@ int Ml307_Send_Alarm(struct at_device *device, void *param) LOG_E("ml307 param error\n"); return RT_ERROR; } - if (ml307_ops->send(ml307_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_ML307, EVENT_TYPE_ALARM)) { LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_ALARM); @@ -785,21 +755,21 @@ int Ml307_Send_Device_Failure(struct at_device *device, void *param) 在线程中,对任务队列进行查看并处理,看目前都有哪些事件,是处于那个优先级得,如果是最低优先级,就只发送一帧数据就行了, 如果是不同优先级,按照优先级顺序发送事件,但感觉这样会使得程序更复杂,本来发送就很快,感觉没必要这样搞*/ const Ml307EventInfo ml307_event_info[] = { - {kMl307PowerOnEvent, ML307_PRIORITY_HIGHEST, "上电心跳事件", Ml307_Send_Power_On}, - {kMl307PowerDownEvent, ML307_PRIORITY_HIGH, "掉电事件", Ml307_Send_Power_Off}, - {kMl307SelfCheckEvent, ML307_PRIORITY_MEDIUM, "自检事件", Ml307_Send_Self_Check}, - {kMl307HeartbeatEvent, ML307_PRIORITY_LOWEST, "定时心跳事件", Ml307_Send_Heartbeat}, - {kMl307TempAnomalyEvent, ML307_PRIORITY_LOWEST, "温度异常事件", Ml307_Send_Temp_Anomaly}, - {kMl307AlarmEvent, ML307_PRIORITY_LOWEST, "报警触发事件", Ml307_Send_Alarm}, - {kMl307AlarmRcyEvent, ML307_PRIORITY_LOWEST, "报警解除事件", Ml307_Send_Alarm_Recover}, - {kMl307FaultEvent, ML307_PRIORITY_LOWEST, "传感器故障事件", Ml307_Send_Fault}, - {kMl307FaultRcyEvent, ML307_PRIORITY_LOWEST, "传感器故障解除事件", Ml307_Send_Fault_Recover}, - {kMl307TimeCalibrationEvent, ML307_PRIORITY_LOWEST, "时间校准事件", Ml307_Send_Time_Calibration}, - {kMl307SilenceEvent, ML307_PRIORITY_LOWEST, "消音事件", Ml307_Send_Silence}, - // {kMl307ExceptionEvent, ML307_PRIORITY_LOWEST, "异常事件", Ml307_Send_Exception}, - {kMl307ValveStatusEvent, ML307_PRIORITY_LOWEST, "电磁阀状态改变事件", Ml307_Send_Valve_Status}, - {kMl307FanStatusEvent, ML307_PRIORITY_LOWEST, "风机状态改变事件", Ml307_Send_Fan_Status}, - {kMl307DeviceFailureEvent, ML307_PRIORITY_LOWEST, "设备失效事件", Ml307_Send_Device_Failure}}; + {kMl307PowerOnEvent, kMl307PriorityHighest, "上电心跳事件", Ml307_Send_Power_On}, + {kMl307PowerDownEvent, kMl307PriorityHigh, "掉电事件", Ml307_Send_Power_Off}, + {kMl307SelfCheckEvent, kMl307PriorityMedium, "自检事件", Ml307_Send_Self_Check}, + {kMl307HeartbeatEvent, kMl307PriorityLowest, "定时心跳事件", Ml307_Send_Heartbeat}, + {kMl307TempAnomalyEvent, kMl307PriorityLowest, "温度异常事件", Ml307_Send_Temp_Anomaly}, + {kMl307AlarmEvent, kMl307PriorityLowest, "报警触发事件", Ml307_Send_Alarm}, + {kMl307AlarmRcyEvent, kMl307PriorityLowest, "报警解除事件", Ml307_Send_Alarm_Recover}, + {kMl307FaultEvent, kMl307PriorityLowest, "传感器故障事件", Ml307_Send_Fault}, + {kMl307FaultRcyEvent, kMl307PriorityLowest, "传感器故障解除事件", Ml307_Send_Fault_Recover}, + {kMl307TimeCalibrationEvent, kMl307PriorityLowest, "时间校准事件", Ml307_Send_Time_Calibration}, + {kMl307SilenceEvent, kMl307PriorityLowest, "消音事件", Ml307_Send_Silence}, + // {kMl307ExceptionEvent, kMl307PriorityLowest, "异常事件", Ml307_Send_Exception}, + {kMl307ValveStatusEvent, kMl307PriorityLowest, "电磁阀状态改变事件", Ml307_Send_Valve_Status}, + {kMl307FanStatusEvent, kMl307PriorityLowest, "风机状态改变事件", Ml307_Send_Fan_Status}, + {kMl307DeviceFailureEvent, kMl307PriorityLowest, "设备失效事件", Ml307_Send_Device_Failure}}; /** * 处理ML307设备的事件 @@ -839,16 +809,11 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, { if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK) // 打开连接 { - // Reset_Ml307_Life_Timer(); - // 重启后重新尝试发送 result = event->send_func(device, ml307_ops); if (result != RT_EOK) { LOG_E("ml307 send cmd after module reset failed\n"); - // Flash_Set_WorkDuration(work_duration); // 重启前保存参数 - // NVIC_SystemReset(); // 直接重启系统 - Ml307_Reset(device); rt_thread_mdelay(5000); } @@ -955,57 +920,68 @@ rt_err_t Handle_Close_Valve(struct Ml307_Ops *ops) LOG_D("data[0] = %x data[1] = %x data[2] = %x data[3] = %x data[4] = %x, data[5] = %x data[6] = %x", data[0], data[1], data[2], data[3], data[4], data[5], data[6]); if ((data[0] > 0) && (data[0] < MAX_VALVE_NUM)) // 不为零则说明关闭无线阀门 { - LOG_D("无线阀门编号:%d\n", data[0]); - Flash_Get_Mac_Addr(mac_addr, 0); - LOG_D("mac_addr[0] = %x mac_addr[1] = %x mac_addr[2] = %x mac_addr[3] = %x mac_addr[4] = %x, mac_addr[5] = %x", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); - /*对两个数组进行比较,如果值不同则退出*/ - for (; i < FLASH_VALVE_MAC_ADDR_LEN; i++) + rt_uint8_t cnt = Flash_Get_Valve_Num(); + if (cnt == 0) { - if (mac_addr[i] != data[i + 1]) - { - LOG_E("mac_addr[%d][%x]!= data[%d][%x]\n", i, mac_addr[i], i + 1, data[i + 1]); - - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); - - return RT_ERROR; - } - } - if (i == FLASH_VALVE_MAC_ADDR_LEN) + LOG_E("没有设置无线阀门\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); + return RT_ERROR; + } + else { - LOG_D("mac地址匹配成功,执行关阀动作\n"); - // if (Bt_Valve_Handler(kValveCmdCtr, data[0] - 1, RT_NULL) != RT_EOK) - if (Bt_Valve_Handler(kValveCmdCtr, 0, RT_NULL) != RT_EOK) + LOG_D("无线阀门编号:%d\n", data[0]); + if(Flash_Get_Mac_Addr(mac_addr, data[0]) != RT_EOK) { - LOG_E("关阀失败\n"); + LOG_E("获取无线阀门mac地址失败\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); return RT_ERROR; } - if (rt_sem_take(&bt_ctr_sem, 15000) != RT_EOK) // 等待十秒获取信号量 + LOG_D("mac_addr[0] = %x mac_addr[1] = %x mac_addr[2] = %x mac_addr[3] = %x mac_addr[4] = %x, mac_addr[5] = %x", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + /*对两个数组进行比较,如果值不同则退出*/ + for (; i < FLASH_VALVE_MAC_ADDR_LEN; i++) { - LOG_E("获取信号量失败\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); - return RT_ERROR; + if (mac_addr[i] != data[i + 1]) + { + LOG_E("mac_addr[%d][%x]!= data[%d][%x]\n", i, mac_addr[i], i + 1, data[i + 1]); + + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); + + return RT_ERROR; + } + } + if (i == FLASH_VALVE_MAC_ADDR_LEN) + { + LOG_D("mac地址匹配成功,执行关阀动作\n"); + if (Bt_Valve_Handler(kValveCmdCtr, 0, RT_NULL) != RT_EOK) + { + LOG_E("关阀失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); + return RT_ERROR; + } + if (rt_sem_take(&bt_ctr_sem, 10000) != RT_EOK) // 等待十秒获取信号量 + { + LOG_E("获取信号量失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); + return RT_ERROR; + } + else + { + LOG_D("关阀成功\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS); + return RT_EOK; + } } else { - LOG_D("关阀成功\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS); - return RT_EOK; + LOG_E("mac地址匹配失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); } } - else - { - LOG_E("mac地址匹配失败\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); - } } else { LOG_D("关闭有线阀门\n"); // TODO:此处需要增加关阀有线阀门的逻辑 - // emv_state_flag = 0; // 电磁阀动作 - // rt_thread_mdelay(20); - // emv_state_flag = 0; ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS); return RT_EOK; } @@ -1201,62 +1177,50 @@ rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops) char imei[16] = {0}; char temp[32] = "0"; rt_uint8_t cnt = Flash_Get_Valve_Num(); - rt_uint8_t mac_addr[FLASH_VALVE_MAC_ADDR_LEN + 1] = {0}; Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); String2Hex(temp, imei); // 将字符串转为十六进制字符串 - if (cnt > MAX_VALVE_NUM) + if (cnt >= MAX_VALVE_NUM) { LOG_E("阀门设备数量超过最大值\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); return RT_ERROR; } - rt_memcpy(data, (ops->recv->recv_data.res_data + 8), FLASH_VALVE_MAC_ADDR_LEN + 1); - - LOG_D("data[0] = %x data[1] = %x data[2] = %x data[3] = %x data[4] = %x, data[5] = %x data[6] = %x", data[0], data[1], data[2], data[3], data[4], data[5], data[6]); - // 无阀门数据时添加,有阀门数据时不添加 - if ((Flash_Get_Mac_Addr(mac_addr, data[0]) == RT_EEMPTY) || ((Flash_Get_Mac_Addr(mac_addr, data[0]) == RT_EOK))) + if(cnt >= 0 && cnt < MAX_VALVE_NUM) { - if (mac_addr[0] == 0) // 无MAC地址数据,写入MAC地址数据 + rt_memcpy(data, (ops->recv->recv_data.res_data + 8), FLASH_VALVE_MAC_ADDR_LEN + 1); + + LOG_D("data[0] = %x data[1] = %x data[2] = %x data[3] = %x data[4] = %x, data[5] = %x data[6] = %x", data[0], data[1], data[2], data[3], data[4], data[5], data[6]); + + valve[data[0] - 1].valve_id = data[0];//更新阀门ID + rt_memcpy(valve[data[0] - 1].valve_mac, &data[1], FLASH_VALVE_MAC_ADDR_LEN); // 更新MAC地址 + if (Bt_Valve_Handler(kValveCmdReg, data[0] - 1, RT_NULL) != RT_EOK)//更新蓝牙端mac地址 { - valve[data[0] - 1].valve_id = data[0]; - rt_memcpy(valve[data[0] - 1].valve_mac, &data[1], FLASH_VALVE_MAC_ADDR_LEN); // 将信息更新 - if (Bt_Valve_Handler(kValveCmdReg, data[0] - 1, RT_NULL) != RT_EOK) - { - LOG_E("新增阀门设备失败\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); - return RT_ERROR; - } - // TODO:此处需要等待蓝牙响应数据 - if (rt_sem_take(&bt_reg_sem, 10000) != RT_EOK) // 等待十秒获取信号量 - { - LOG_E("获取信号量失败\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); - return RT_ERROR; - } - else - { - if (Flash_Set_Mac_Addr(&data[1], (data[0] - 1)) == RESET) - { - LOG_E("阀门设备写入FLash失败\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); - return RT_ERROR; - } - LOG_D("新增阀门设备成功\n"); - Flash_Set_Valve_Num(cnt + 1); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_SUCCESS); - return RT_EOK; - } + LOG_E("新增阀门设备失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); + return RT_ERROR; } - else // 不为空,不添加 + if (rt_sem_take(&bt_reg_sem, 10000) != RT_EOK) // 等待十秒获取信号量 { - LOG_E("该阀门设备已存在,请选择更换阀门编号后重试\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_OTHER_ERROR); + LOG_E("获取信号量失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); + return RT_ERROR; + } + else + { + if (Flash_Set_Mac_Addr(&data[1], data[0]) == RESET) + { + LOG_E("阀门设备写入FLash失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); + return RT_ERROR; + } + LOG_D("新增阀门设备成功\n"); + Flash_Set_Valve_Num(cnt + 1); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_SUCCESS); return RT_EOK; } } - return RT_EOK; } @@ -1274,7 +1238,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops) rt_memcpy(data, (ops->recv->recv_data.res_data + 2), (2 * FLASH_VALVE_MAC_ADDR_LEN + 1)); LOG_HEX("data", 16, data, sizeof(data)); /*设备编号(1byte)+ 新MAC地址(6)+ 旧阀门MAC地址(6) + 补零字节= 15byte*/ - if (Flash_Get_Mac_Addr(mac_addr, data[0] - 1) == RT_EOK) + if (Flash_Get_Mac_Addr(mac_addr, data[0]) == RT_EOK) { for (; i < FLASH_VALVE_MAC_ADDR_LEN; i++) { @@ -1282,7 +1246,6 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops) { LOG_E("旧阀门地址错误\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_OTHER_ERROR); - return RT_ERROR; } } @@ -1304,7 +1267,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops) } else { - if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) == RESET) + if (Flash_Set_Mac_Addr(&data[1], data[0]) == RESET) { LOG_E("更换阀门设备失败\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_ACTION_FAILURE); @@ -1319,7 +1282,6 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops) { LOG_E("旧阀门MAC地址错误\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_OTHER_ERROR); - return RT_ERROR; } } @@ -1334,25 +1296,24 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops) /*移除阀门设备*/ rt_err_t Handle_Remove_Valve(struct Ml307_Ops *ops) { - rt_uint8_t data[6] = {0}; + rt_uint8_t data[8] = {0}; char imei[16] = {0}; char temp[32] = "0"; rt_uint8_t cnt = Flash_Get_Valve_Num(); Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); String2Hex(temp, imei); // 将字符串转为十六进制字符串 + LOG_I("接收到服务器下发移除阀门指令"); +#if 1 if (cnt == 0) { - LOG_E("阀门设备数量为0, 无法移除\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_ACTION_FAILURE); + LOG_W("阀门设备数量为0\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_SUCCESS);//如果本地无阀门信息,直接返回成功 - return RT_ERROR; + return RT_EOK; } - rt_memcpy(data, (ops->recv->recv_data.res_data + 8), FLASH_VALVE_MAC_ADDR_LEN + 1); LOG_D("data[0] = %x data[1] = %x data[2] = %x data[3] = %x data[4] = %x, data[5] = %x", data[0], data[1], data[2], data[3], data[4], data[5], data[6]); - - // if (Bt_Valve_Handler(kValveCmdRem, data[0] - 1, RT_NULL) != RT_EOK) if (Bt_Valve_Handler(kValveCmdRem, 0, RT_NULL) != RT_EOK) { LOG_E("移除阀门设备失败\n"); @@ -1362,14 +1323,14 @@ rt_err_t Handle_Remove_Valve(struct Ml307_Ops *ops) } if (rt_sem_take(&bt_rem_sem, 10000) != RT_EOK) // 等待十秒获取信号量 { - LOG_E("获取更换阀门信号量失败\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); + LOG_E("获取移除阀门信号量失败\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_ACTION_FAILURE); return RT_ERROR; } else { - rt_memset(&data[1], 0, sizeof(data) - 1); - if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) == RESET) + rt_memset(&data[1], 0, 6); + if (Flash_Set_Mac_Addr(&data[1], data[0]) == RESET) { LOG_E("移除阀门设备失败\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_ACTION_FAILURE); @@ -1384,8 +1345,8 @@ rt_err_t Handle_Remove_Valve(struct Ml307_Ops *ops) return RT_EOK; } - } - + } +#endif } void Handle_Error(struct Ml307_Ops *ops, rt_err_t ret) @@ -1488,7 +1449,6 @@ void Handle_Cmd_Type(struct Ml307_Ops *ops) void Analyze_Recv_Frame(struct at_device *device, struct Ml307_Ops *ops) { rt_err_t ret = RT_EOK; - // Reset_Ml307_Life_Timer(); // 只要数据,则重置定时器,不管数据是否正确 ret = Compare_HeaderToTail(ops); if (ret == RT_EOK) @@ -1565,7 +1525,6 @@ static void Ml307_Send_Thread_Entry(void *param) } if (ml307_conncet_tcp_flag) { - // Reset_Ml307_Life_Timer(); if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307PowerOnEvent)) { result = Ml307_Process_Events(kMl307PowerOnEvent, device, ops); // 当上电心跳包发送不成功时,其他事件不启动 @@ -1711,17 +1670,13 @@ static void Ml307_Recv_Thread_Entry(void *parameter) struct at_device_ml307 *ml307 = &_dev; struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name); RT_ASSERT(device); - rt_err_t ret; LOG_D("ml307 recv thread entry\n"); while (1) { - ret = rt_sem_take(ml307_recv_sem, RT_WAITING_FOREVER); // 这个主要用来处理的数据 - if (ret == RT_EOK) + if (rt_sem_take(ml307_recv_sem, RT_WAITING_FOREVER) == RT_EOK) { - // rt_timer_start(ml307_life_timer); - /*对数据帧进行分析,判断所处的是对服务器响应还是指令下发*/ Analyze_Recv_Frame(device, ops); } } @@ -1803,17 +1758,6 @@ int BSP_Ml307_Thread_Init(void) RT_NULL, 24 * 60 * RT_TICK_PER_SECOND, // RT_TIMER_FLAG_PERIODIC); - // 创建定时器 - ml307_heartbeat_check_timer = rt_timer_create("ml307_check_hb", - Ml307_Heartbeat_check_Timer_Cb, - RT_NULL, - timeout * 3, // 3个定时心跳没有发送,就重启发送 - RT_TIMER_FLAG_PERIODIC); - - if (ml307_heartbeat_check_timer != RT_NULL) - { - rt_timer_start(ml307_heartbeat_check_timer); - } ret = rt_thread_init(&ml307_thread, "ml307_send_thread", Ml307_Send_Thread_Entry, diff --git a/bsp/src/bsp_mq.c b/bsp/src/bsp_mq.c index d3c7170..b0b3015 100644 --- a/bsp/src/bsp_mq.c +++ b/bsp/src/bsp_mq.c @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-06-18 15:48:01 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-17 15:52:30 + * @LastEditTime: 2024-12-25 17:10:33 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_mq.c * @Description : * @@ -25,12 +25,9 @@ #include "user_sys.h" #include "finsh.h" - - -#define LOG_TAG "bsp_mq" // 该模块对应的标签。不定义时,默认:NO_TAG -#define LOG_LVL LOG_LVL_DBG // 该模块对应的日志输出级别。不定义时,默认:调试级别 -#include // 必须在 LOG_TAG 与 LOG_LVL 下面 - +#define LOG_TAG "bsp_mq" // 该模块对应的标签。不定义时,默认:NO_TAG +#define LOG_LVL LOG_LVL_DBG // 该模块对应的日志输出级别。不定义时,默认:调试级别 +#include // 必须在 LOG_TAG 与 LOG_LVL 下面 ALIGN(RT_ALIGN_SIZE) static char sensor_thread_stack[GAS_SNESOR_THREAD_STACK_SIZE]; @@ -41,14 +38,14 @@ TsSensor_t Sensor_device; uint16_t Get_Gas_VoltageInt1000x(void) { uint16_t voltage = (Get_ADC_Average(kGasAdc) * 3.3 / 4096) * MQ_VOLTAGE_RATIO * 1000; - LOG_D("Get_Gas_VoltageInt1000x = %04d", voltage); + LOG_D("Get_Gas_VoltageInt1000x = %04d", voltage); return voltage; } uint16_t Get_Gas_VoltageAdcInt1000x(void) { rt_uint16_t voltage_adc = (Get_ADC_Average(kGasAdc) * 3.3 / 4096) * 1000; -// LOG_D("Get_Gas_VoltageAdcInt1000x = %04d", voltage_adc); + LOG_D("Get_Gas_VoltageAdcInt1000x = %04d", voltage_adc); return voltage_adc; } @@ -75,30 +72,32 @@ static uint8_t Sensor_Count(const rt_uint8_t *buffer, uint8_t value, uint8_t siz static void Sensor_HandleAlarm(uint8_t count, uint8_t *flag, uint8_t threshold) { - if (count > threshold && *flag == 0) + if (count >= threshold && *flag == 0) { Sensor_device.detection_flag = kSensorAlarm; Send_Laser_Alarm_Event(kAlarmEvent); *flag = 1; } - else if (*flag == 1 && count < threshold) + else if (*flag == 1 && count == 0) { - *flag = 0; + *flag = 0; + Sensor_device.detection_flag = kSensorNormal; Send_Laser_Alarm_Event(kAlarmRcyEvent); } } static void Sensor_HandleFault(uint8_t count, uint8_t *flag, uint8_t threshold) { - if (count > threshold && *flag != 1) + if (count >= threshold && *flag != 1) { - *flag = 1; + *flag = 1; Sensor_device.detection_flag = kSensorFault; Send_Laser_Alarm_Event(kFaultEvent); } - else if (*flag == 1 && count < threshold) + else if (*flag == 1 && count == 0) { - *flag = 0; + *flag = 0; + Sensor_device.detection_flag = kSensorNormal; Send_Laser_Alarm_Event(kFaultRcyEvent); } } @@ -107,24 +106,24 @@ static uint8_t Sensor_CheckData(void) { static rt_uint8_t alarm_count = 0, fault_count = 0; static rt_uint8_t alarm_flag = 0, fault_flag = 0; - static rt_uint8_t index = 0; + static rt_uint8_t index = 0; static rt_uint8_t alarm_status_buffer[SENSOR_SAMPLING_TIMS] = {0}; - static rt_uint8_t fault_buf[SENSOR_SAMPLING_TIMS] = {0}; - rt_uint16_t voltage = Get_Gas_VoltageAdcInt1000x(); + static rt_uint8_t fault_buf[SENSOR_SAMPLING_TIMS] = {0}; + rt_uint16_t voltage = Get_Gas_VoltageAdcInt1000x(); alarm_status_buffer[index] = ((voltage > Sensor_device.alarm_value) && (voltage < MQ_VOLTAGE_HIGH_LIMIT)) ? kSensorAlarm : kSensorNormal; - fault_buf[index] = ((voltage < MQ_VOLTAGE_LOW_LIMIT) || (voltage > MQ_VOLTAGE_HIGH_LIMIT)) ? kSensorFault : kSensorNormal; + fault_buf[index] = ((voltage < MQ_VOLTAGE_LOW_LIMIT) || (voltage > MQ_VOLTAGE_HIGH_LIMIT)) ? kSensorFault : kSensorNormal; index++; if (index >= SENSOR_SAMPLING_TIMS) { index = 0; } - + alarm_count = Sensor_Count(alarm_status_buffer, kSensorAlarm, SENSOR_SAMPLING_TIMS); fault_count = Sensor_Count(fault_buf, kSensorFault, SENSOR_SAMPLING_TIMS); - Sensor_HandleAlarm(alarm_count, &alarm_flag, SENSOR_SAMPLING_TIMS / 2 + 1); - Sensor_HandleFault(fault_count, &fault_flag, SENSOR_SAMPLING_TIMS / 2 + 1); + Sensor_HandleAlarm(alarm_count, &alarm_flag, SENSOR_SAMPLING_TIMS); + Sensor_HandleFault(fault_count, &fault_flag, SENSOR_SAMPLING_TIMS); return RT_EOK; } @@ -142,13 +141,13 @@ uint8_t IS_EndOfLife(void) // MQ检测线程函数 static void Sensor_detection_thread_entry(void *param) { - TuFlashProductTimeLimitFrame LimitTime; + TuFlashProductTimeLimitFrame LimitTime; if (Flash_GetProductTimeLimit(&LimitTime, kExpirationTimeId) == READY) { // 计算出 到期时间对应的RTC秒数 Sensor_device.expiration_seconds = DateTime2Seconds(LimitTime.Struct.year, - LimitTime.Struct.month, LimitTime.Struct.day, LimitTime.Struct.hour, - LimitTime.Struct.minute, LimitTime.Struct.second); + LimitTime.Struct.month, LimitTime.Struct.day, LimitTime.Struct.hour, + LimitTime.Struct.minute, LimitTime.Struct.second); LOG_D("device_expiration_time:%04d-%02d-%02d,%02d:%02d", LimitTime.Struct.year, LimitTime.Struct.month, LimitTime.Struct.day, LimitTime.Struct.hour, LimitTime.Struct.minute, LimitTime.Struct.second); @@ -174,7 +173,7 @@ static void Sensor_detection_thread_entry(void *param) { Sensor_CheckData(); } - rt_thread_mdelay(1000); + rt_thread_mdelay(500); } } @@ -182,13 +181,13 @@ int BSP_MQ_Init(void) { Sensor_device.alarm_value = Flash_Get_SysCfg(kAlarmLValueId); LOG_D("报警阈值为:%d", Sensor_device.alarm_value); - rt_thread_init(&Sensor_Thread, //可以用定时器做,没必要线程 - "sensor_thread", - Sensor_detection_thread_entry, - RT_NULL, - &sensor_thread_stack[0], - sizeof(sensor_thread_stack), - GAS_SENSOR_THREAD_PRIORITY, GAS_SENSOR_THREAD_TIMESLICE); + rt_thread_init(&Sensor_Thread, // 可以用定时器做,没必要线程 + "sensor_thread", + Sensor_detection_thread_entry, + RT_NULL, + &sensor_thread_stack[0], + sizeof(sensor_thread_stack), + GAS_SENSOR_THREAD_PRIORITY, GAS_SENSOR_THREAD_TIMESLICE); rt_thread_startup(&Sensor_Thread); return 0; @@ -204,4 +203,3 @@ static void TEST_MQ_EndOfLife(void) } MSH_CMD_EXPORT(TEST_MQ_EndOfLife, TEST_MQ_EndOfLife); #endif -