This commit is contained in:
parent
4cd6fccfa8
commit
dac836d401
|
@ -2,7 +2,7 @@
|
||||||
* @Author: mbw
|
* @Author: mbw
|
||||||
* @Date: 2024-10-23 17:14:16
|
* @Date: 2024-10-23 17:14:16
|
||||||
* @LastEditors: mbw && 1600520629@qq.com
|
* @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
|
* @FilePath: \ble_bjq_ch303rct6_ml307\applications\main.c
|
||||||
* @Descrt_thread_
|
* @Descrt_thread_
|
||||||
*
|
*
|
||||||
|
@ -40,7 +40,7 @@ rt_bool_t is_event_initialized = RT_FALSE; // 是否初始化完成
|
||||||
TsSysControl SysControl;
|
TsSysControl SysControl;
|
||||||
|
|
||||||
struct rt_timer work_cnt_timer;
|
struct rt_timer work_cnt_timer;
|
||||||
struct rt_timer preheat_timer;//传统模式需要进行预热,
|
struct rt_timer preheat_timer; // 传统模式需要进行预热,
|
||||||
|
|
||||||
void Send_Laser_Alarm_Event(AlarmEvent event_type);
|
void Send_Laser_Alarm_Event(AlarmEvent event_type);
|
||||||
|
|
||||||
|
@ -153,7 +153,7 @@ void Preheat_Timer_Callback(void *parameter)
|
||||||
LED_STOP(r);
|
LED_STOP(r);
|
||||||
LED_STOP(g);
|
LED_STOP(g);
|
||||||
LED_STOP(y);
|
LED_STOP(y);
|
||||||
LOG_D("预热完成");
|
LOG_D("预热完成");
|
||||||
Send_Laser_Alarm_Event(kNormalDetectionEvents);
|
Send_Laser_Alarm_Event(kNormalDetectionEvents);
|
||||||
}
|
}
|
||||||
int main(void)
|
int main(void)
|
||||||
|
@ -170,272 +170,289 @@ int main(void)
|
||||||
Flash_GetTotalRecord(&TotalRecords);
|
Flash_GetTotalRecord(&TotalRecords);
|
||||||
g_Calibration_status = Flash_Get_Calibration_State();
|
g_Calibration_status = Flash_Get_Calibration_State();
|
||||||
rt_thread_mdelay(10);
|
rt_thread_mdelay(10);
|
||||||
if (g_Calibration_status == kNotCalibrated)//没标定
|
while (1)
|
||||||
{
|
{
|
||||||
LED_STOP(r);
|
if (g_Calibration_status == kNotCalibrated) // 没标定
|
||||||
LED_STOP(y);
|
|
||||||
LED_CTRL(g, "1000,500", -1);
|
|
||||||
LED_START(g);
|
|
||||||
|
|
||||||
uint32_t ticks = 0, gas_calibration_voltage;
|
|
||||||
while (1)
|
|
||||||
{
|
{
|
||||||
gas_calibration_voltage = Get_Gas_VoltageAdcInt1000x();
|
LED_STOP(r);
|
||||||
LOG_D("ticks[%d] gas_calibration_voltage = %d", ticks++, gas_calibration_voltage);
|
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)
|
if (ticks > TIMEOUT_MS)
|
||||||
&& gas_calibration_voltage < (MQ_VOLTAGE_ALARM_DEFAULT + 500))
|
|
||||||
{
|
{
|
||||||
uint8_t calibration_buf[2] = {0};
|
if (gas_calibration_voltage > (MQ_VOLTAGE_ALARM_DEFAULT - 800) && gas_calibration_voltage < (MQ_VOLTAGE_ALARM_DEFAULT + 800))
|
||||||
calibration_buf[0] = gas_calibration_voltage & 0xFF; // 低字节
|
{
|
||||||
calibration_buf[1] = (gas_calibration_voltage >> 8) & 0xFF; // 高字节
|
uint8_t calibration_buf[2] = {0};
|
||||||
LOG_D("calibration_buf[0] = %X calibration_buf[1] = %X", calibration_buf[0], calibration_buf[1]);
|
calibration_buf[0] = gas_calibration_voltage & 0xFF; // 低字节
|
||||||
Flash_Sys_Cfg(kAlarmLValueId, calibration_buf, 2);
|
calibration_buf[1] = (gas_calibration_voltage >> 8) & 0xFF; // 高字节
|
||||||
// 标定完成打开绿灯常亮,蜂鸣器叫一下
|
LOG_D("calibration_buf[0] = %X calibration_buf[1] = %X", calibration_buf[0], calibration_buf[1]);
|
||||||
BEEP_CALIBRATION_OK;
|
Flash_Sys_Cfg(kAlarmLValueId, calibration_buf, 2);
|
||||||
LED_STOP(g);
|
// 标定完成打开绿灯常亮,蜂鸣器叫一下
|
||||||
LED_ON(g);
|
BEEP_CALIBRATION_OK;
|
||||||
Flash_Set_Calibration_State(kSysGasCalibStatus);
|
LED_STOP(g);
|
||||||
g_Calibration_status = kSysGasCalibStatus;
|
LED_ON(g);
|
||||||
|
Flash_Set_Calibration_State(kSysGasCalibStatus);
|
||||||
|
g_Calibration_status = kSysGasCalibStatus;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
rt_thread_mdelay(1000);
|
||||||
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); // 这一句的作用是设备不是掉电重启的情况,直接进入预热模式
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_D("欠压复位\r\n");
|
SYS_EventInit();
|
||||||
}
|
work_duration = Flash_Get_WorkDuration();
|
||||||
|
rt_timer_init(&work_cnt_timer,
|
||||||
while (1)
|
"work_cnt_timer",
|
||||||
{
|
Work_Cnt_Timer_Callback,
|
||||||
result = rt_event_recv(&alarm_event,
|
RT_NULL,
|
||||||
Get_Sys_Event_Flag(kPowerOnEvent) | // 上电
|
WORK_TIMER_CNT,
|
||||||
Get_Sys_Event_Flag(kPowerDownEvent) | // 掉电
|
RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_PERIODIC);
|
||||||
Get_Sys_Event_Flag(kPreheatingEvent) | // 预热
|
rt_timer_start(&work_cnt_timer);
|
||||||
Get_Sys_Event_Flag(kNormalDetectionEvents) | // 正常检测
|
rt_timer_init(&preheat_timer,
|
||||||
Get_Sys_Event_Flag(kAlarmExceptionEvent) | // 寿命到期
|
"preheat_timer",
|
||||||
Get_Sys_Event_Flag(kAlarmEvent) | // 报警
|
Preheat_Timer_Callback,
|
||||||
Get_Sys_Event_Flag(kAlarmRcyEvent) | // 报警恢复
|
RT_NULL,
|
||||||
Get_Sys_Event_Flag(kSelfCheckEvent) | // 自检
|
TIMEOUT_MS,
|
||||||
Get_Sys_Event_Flag(kFaultEvent) | // 故障模式
|
RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT);
|
||||||
Get_Sys_Event_Flag(kFaultRcyEvent) | // 故障恢复
|
if (Get_VIN_VoltageInt1000x() > 10000)
|
||||||
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)
|
// 检测上电/掉电复位标志
|
||||||
|
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("上电模式");
|
if (received_event & Get_Sys_Event_Flag(kPowerOnEvent)) // 上电
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
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)
|
else if (received_event & Get_Sys_Event_Flag(kPowerDownEvent)) // 掉电
|
||||||
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++)
|
|
||||||
{
|
{
|
||||||
rt_thread_mdelay(1000);
|
LOG_D("掉电模式");
|
||||||
LOG_D(" %d s", i);
|
|
||||||
}
|
|
||||||
NVIC_SystemReset(); // 直接重启系统
|
|
||||||
}
|
|
||||||
else if (received_event & Get_Sys_Event_Flag(kSelfCheckEvent)) // 自检
|
|
||||||
{
|
|
||||||
LOG_D("自检模式");
|
|
||||||
|
|
||||||
SysControl.last_status = SysControl.status;
|
SysControl.last_status = SysControl.status;
|
||||||
LOG_D("Self Check Mode SysControl.last_status:%d", SysControl.last_status);
|
SysControl.status = kPowerDownEvent;
|
||||||
SysControl.status = kSelfCheckEvent;
|
|
||||||
|
|
||||||
_Self_Check_Mode();
|
// 写入掉电记录
|
||||||
Send_Laser_Alarm_Event(SysControl.last_status);
|
Flash_Write_Record(kRecordPowerDown);
|
||||||
|
|
||||||
|
Flash_Set_WorkDuration(work_duration); // 写入工作时长
|
||||||
#if (IOT_MODULE_SWITCH == 1)
|
#if (IOT_MODULE_SWITCH == 1)
|
||||||
Ml307_Send_Event(kMl307SelfCheckEvent);
|
Ml307_Send_Event(kMl307PowerDownEvent);
|
||||||
#endif
|
#endif
|
||||||
}
|
LOG_D("Enter AnalogWatchdog Interrupt");
|
||||||
else if (received_event & Get_Sys_Event_Flag(kSensorFailureEvent)) // 失效
|
// 等待30s,要是还没断电就重启
|
||||||
{
|
for (uint8_t i = 0; i < 30; i++)
|
||||||
LOG_D("传感器失效模式");
|
{
|
||||||
|
rt_thread_mdelay(1000);
|
||||||
SysControl.last_status = SysControl.status;
|
LOG_D(" %d s", i);
|
||||||
SysControl.status = kSensorFailureEvent;
|
}
|
||||||
|
NVIC_SystemReset(); // 直接重启系统
|
||||||
if (Flash_GetNum_Records(kRecordSensoEndOfLife) == 0)
|
}
|
||||||
{
|
else if (received_event & Get_Sys_Event_Flag(kSelfCheckEvent)) // 自检
|
||||||
Flash_Write_Record(kRecordSensoEndOfLife);
|
{
|
||||||
|
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");
|
MSH_CMD_EXPORT(SYS_Set_RtcProductTime, "SYS_Set_RtcProductTime");
|
||||||
|
|
||||||
//测试系统标定值修改
|
// 测试系统标定值修改
|
||||||
static void TEST_SYS_Calibartion(int argc, char **argv)
|
static void TEST_SYS_Calibartion(int argc, char **argv)
|
||||||
{
|
{
|
||||||
if (argc == 2)
|
if (argc == 2)
|
||||||
{
|
{
|
||||||
int calibartion_valve = atoi(argv[1]);
|
int calibartion_valve = atoi(argv[1]);
|
||||||
uint8_t calibration_buf[2] = {0};
|
uint8_t calibration_buf[2] = {0};
|
||||||
calibration_buf[0] = calibartion_valve & 0xFF; // 低字节
|
calibration_buf[0] = calibartion_valve & 0xFF; // 低字节
|
||||||
calibration_buf[1] = (calibartion_valve >> 8) & 0xFF; // 高字节
|
calibration_buf[1] = (calibartion_valve >> 8) & 0xFF; // 高字节
|
||||||
Flash_Sys_Cfg(kAlarmLValueId, calibration_buf, 2);
|
Flash_Sys_Cfg(kAlarmLValueId, calibration_buf, 2);
|
||||||
LOG_D("标定值修改为 = %d", Flash_Get_SysCfg(kAlarmLValueId));
|
LOG_D("标定值修改为 = %d", Flash_Get_SysCfg(kAlarmLValueId));
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ typedef enum
|
||||||
kPowerDownEvent,
|
kPowerDownEvent,
|
||||||
kSelfCheckEvent,
|
kSelfCheckEvent,
|
||||||
KMuteEvent,
|
KMuteEvent,
|
||||||
kAlarmExceptionEvent, // alarm_exception
|
kAlarmExceptionEvent, //浓度异常报警
|
||||||
kMaxEventcnt,
|
kMaxEventcnt,
|
||||||
} AlarmEvent;
|
} AlarmEvent;
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
// MQ采样间隔
|
// MQ采样间隔
|
||||||
#define MQ_SAMPLING_INTERVAL_MS (100U)
|
#define MQ_SAMPLING_INTERVAL_MS (100U)
|
||||||
|
|
||||||
#define SENSOR_SAMPLING_TIMS (5U)
|
#define SENSOR_SAMPLING_TIMS (6U)
|
||||||
|
|
||||||
// MQ采样时间窗口
|
// MQ采样时间窗口
|
||||||
#define MQ_SAMPLING_S (uint8_t)(3U)
|
#define MQ_SAMPLING_S (uint8_t)(3U)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author : stark1898y 1658608470@qq.com
|
* @Author : stark1898y 1658608470@qq.com
|
||||||
* @Date : 2024-09-04 13:33:49
|
* @Date : 2024-09-04 13:33:49
|
||||||
* @LastEditors: mbw && 1600520629@qq.com
|
* @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
|
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\at_device_ml307.c
|
||||||
* @Description :
|
* @Description :
|
||||||
*
|
*
|
||||||
|
@ -51,6 +51,8 @@ ml307_sys_info ml307 = {0};
|
||||||
struct rt_completion ml307_init_complate;
|
struct rt_completion ml307_init_complate;
|
||||||
volatile rt_uint8_t socket_id = 0;
|
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)
|
static rt_bool_t ml307_get_power_state(struct at_device *device)
|
||||||
{
|
{
|
||||||
struct at_device_ml307 *ml307 = RT_NULL;
|
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"));
|
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;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,100 +115,6 @@ void TEST_Ml307_Reset()
|
||||||
MSH_CMD_EXPORT(TEST_Ml307_Reset, "test_ml307_reset");
|
MSH_CMD_EXPORT(TEST_Ml307_Reset, "test_ml307_reset");
|
||||||
#endif
|
#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)
|
static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t size)
|
||||||
{
|
{
|
||||||
int id;
|
int id;
|
||||||
|
@ -276,10 +166,6 @@ static void urc_device_reset(struct at_client *client, const char *data, rt_size
|
||||||
{
|
{
|
||||||
LOG_D("device reset");
|
LOG_D("device reset");
|
||||||
ml307_conncet_tcp_flag = 0;
|
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)
|
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 (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");
|
LOG_D("ml307 connect to tcp server success");
|
||||||
ml307_conncet_tcp_flag = 1;
|
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[] = {
|
static const struct at_urc urc_table[] = {
|
||||||
// {"+NSONMI:", "\r\n", urc_tcp_recv},
|
|
||||||
{"REBOOTING", "\r\n", urc_device_reset}, // 这个是软件复位时,
|
{"REBOOTING", "\r\n", urc_device_reset}, // 这个是软件复位时,
|
||||||
{"+MIPOPEN:", "\r\n", urc_tcp_connect_state},
|
{"+MIPOPEN:", "\r\n", urc_tcp_connect_state},
|
||||||
{"+MIPURC: \"disconn\"", "\r\n", urc_tcp_disconnect},
|
{"+MIPURC: \"disconn\"", "\r\n", urc_tcp_disconnect},
|
||||||
{"+MIPURC: \"rtcp\"", "\r\n", urc_tcp_recv},
|
{"+MIPURC: \"rtcp\"", "\r\n", urc_tcp_recv},
|
||||||
// {"+MIPSEND:", "\r\n", urc_tcp_send_check},
|
|
||||||
};
|
};
|
||||||
static void show_resp_info(at_response_t resp)
|
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;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
ml307_conncet_tcp_flag = 0;
|
ml307_conncet_tcp_flag = 0;
|
||||||
if (SysControl.status == kNormalDetectionEvents)
|
|
||||||
{
|
|
||||||
LED_G_NORMAL;
|
|
||||||
}
|
|
||||||
show_resp_info(resp);
|
show_resp_info(resp);
|
||||||
at_delete_resp(resp);
|
at_delete_resp(resp);
|
||||||
}
|
}
|
||||||
return RT_EOK;
|
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)
|
static int at_device_ml307_connect_tcp(struct at_device *device)
|
||||||
{
|
{
|
||||||
rt_err_t ret = RT_ERROR;
|
rt_err_t ret = RT_ERROR;
|
||||||
ASSERT(device);
|
ASSERT(device);
|
||||||
rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
|
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)
|
if (resp == RT_NULL)
|
||||||
{
|
{
|
||||||
LOG_E("No memory for response structure!");
|
LOG_E("No memory for response structure!");
|
||||||
at_delete_resp(resp);
|
at_delete_resp(resp);
|
||||||
return -RT_ENOMEM;
|
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)
|
if (Flash_Get_Sever_Addr_Info(&sever_info) != RT_EOK)
|
||||||
{
|
{
|
||||||
LOG_E("Get Sever Data Failed");
|
LOG_E("Get Sever Data Failed");
|
||||||
at_delete_resp(resp);
|
at_delete_resp(resp);
|
||||||
return RT_ERROR;
|
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);
|
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++)
|
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)
|
if (at_resp_get_line_by_kw(resp, "OK") != RT_NULL)
|
||||||
{
|
{
|
||||||
rt_thread_mdelay(2000);
|
if (rt_sem_take(ml307_connect_sem, 5000) == RT_EOK)
|
||||||
if (ml307_conncet_tcp_flag == RT_TRUE)
|
|
||||||
{
|
{
|
||||||
LOG_D("ml307 connect to tcp server success");
|
LOG_D("ml307 connect to tcp server success");
|
||||||
ret = RT_EOK;
|
ret = RT_EOK;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
LOG_E("ml307 connect to tcp server failed");
|
||||||
ml307_conncet_tcp_flag = 0;
|
}
|
||||||
LOG_E("ml307 connect to tcp server failed.");
|
|
||||||
ret = -RT_ERROR;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rt_thread_mdelay(3000);
|
rt_thread_mdelay(3000);
|
||||||
}
|
}
|
||||||
if ((SysControl.status == kNormalDetectionEvents) && (ml307_conncet_tcp_flag == RT_FALSE))
|
|
||||||
{
|
|
||||||
LED_G_NORMAL;
|
|
||||||
}
|
|
||||||
at_delete_resp(resp);
|
at_delete_resp(resp);
|
||||||
return ret;
|
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 (ml307_conncet_tcp_flag)
|
||||||
{
|
{
|
||||||
if (SysControl.status == kNormalDetectionEvents)
|
|
||||||
{
|
|
||||||
LED_G_INTERNET;
|
|
||||||
}
|
|
||||||
rt_uint8_t retry = 0;
|
rt_uint8_t retry = 0;
|
||||||
rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
|
rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
|
||||||
LOG_D("max_retry_count:%d", max_retry_count);
|
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)
|
while (retry < max_retry_count)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, send_len, data) == RT_EOK)
|
if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, send_len, data) == RT_EOK)
|
||||||
{
|
{
|
||||||
size_t len = 0;
|
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);
|
LOG_D("send data success, len:%d", len);
|
||||||
at_delete_resp(resp);
|
at_delete_resp(resp);
|
||||||
if (SysControl.status == kNormalDetectionEvents)
|
|
||||||
{
|
|
||||||
LED_G_NORMAL;
|
|
||||||
}
|
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -558,8 +348,8 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
|
||||||
retry++;
|
retry++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rt_thread_mdelay(2000);
|
|
||||||
retry++;
|
retry++;
|
||||||
|
rt_thread_mdelay(1000);
|
||||||
}
|
}
|
||||||
at_delete_resp(resp);
|
at_delete_resp(resp);
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
|
@ -567,10 +357,6 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_D("not connected tcp sever!");
|
LOG_D("not connected tcp sever!");
|
||||||
if (SysControl.status == kNormalDetectionEvents)
|
|
||||||
{
|
|
||||||
LED_G_NORMAL;
|
|
||||||
}
|
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -592,21 +378,6 @@ static int ml307_check_link_status(struct at_device *device)
|
||||||
LOG_E("no memory for resp create.");
|
LOG_E("no memory for resp create.");
|
||||||
return -RT_ERROR;
|
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)
|
if (at_obj_exec_cmd(device->client, resp, "AT+CGACT?") < 0)
|
||||||
{
|
{
|
||||||
result = -RT_ERROR;
|
result = -RT_ERROR;
|
||||||
|
@ -690,49 +461,6 @@ static int ml307_netdev_set_info(struct netdev *netdev)
|
||||||
inet_aton(ipaddr, &addr);
|
inet_aton(ipaddr, &addr);
|
||||||
netdev_low_level_set_ipaddr(netdev, &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:
|
__exit:
|
||||||
if (resp)
|
if (resp)
|
||||||
{
|
{
|
||||||
|
@ -1595,6 +1323,7 @@ static int ml307_init(struct at_device *device)
|
||||||
LOG_E("add netdev(%s) failed.", ml307->device_name);
|
LOG_E("add netdev(%s) failed.", ml307->device_name);
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
|
ml307_connect_sem = rt_sem_create("ml307_connect_sem", 0, RT_IPC_FLAG_PRIO);
|
||||||
/* initialize ml307 pin configuration */
|
/* initialize ml307 pin configuration */
|
||||||
if (ml307->pwr_en_pin != -1)
|
if (ml307->pwr_en_pin != -1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author: mbw
|
* @Author: mbw
|
||||||
* @Date: 2024-12-03 10:31:45
|
* @Date: 2024-12-03 10:31:45
|
||||||
* @LastEditors: mbw && 1600520629@qq.com
|
* @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
|
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_bt.c
|
||||||
* @Description:
|
* @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 Bt_Valve_Handler(ValveCmdType type, rt_uint8_t id, rt_uint8_t *data)
|
||||||
{
|
{
|
||||||
int ret = RT_EOK;
|
int ret = RT_EOK;
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case kValveCmdCtr: // 阀门控制
|
case kValveCmdCtr: // 阀门控制
|
||||||
|
@ -357,29 +356,74 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
|
||||||
static void BSP_Bt_Parse_Data(void)
|
static void BSP_Bt_Parse_Data(void)
|
||||||
{
|
{
|
||||||
rt_size_t len = lwrb_get_full(&bt_lwrb_rx);
|
rt_size_t len = lwrb_get_full(&bt_lwrb_rx);
|
||||||
// char *rx_ptr = rt_malloc(len + 1);
|
char *rx_ptr = rt_malloc(len + 1);
|
||||||
rt_uint8_t bt_rx_buf[256] = {0};
|
// 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);
|
BSP_Bt_Process(rx_ptr, len);
|
||||||
// rt_free(rx_ptr);
|
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)
|
static void Bt_Thread_Entry(void *parameter)
|
||||||
{
|
{
|
||||||
// 初始化阀门信息
|
#if 0
|
||||||
// valve[0].valve_id = 1;
|
// 初始化阀门信息 测试用
|
||||||
// valve[0].valve_mac[0] = 0X93;
|
valve[0].valve_id = 1;
|
||||||
// valve[0].valve_mac[1] = 0xB4;
|
valve[0].valve_mac[0] = 0X93;
|
||||||
// valve[0].valve_mac[2] = 0x8F;
|
valve[0].valve_mac[1] = 0xB4;
|
||||||
// valve[0].valve_mac[3] = 0x10;
|
valve[0].valve_mac[2] = 0x8F;
|
||||||
// valve[0].valve_mac[4] = 0x53;
|
valve[0].valve_mac[3] = 0x10;
|
||||||
// valve[0].valve_mac[5] = 0x5C;
|
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);
|
|
||||||
|
|
||||||
|
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_init(&bt_lwrb_rx, bt_rx_buffer, sizeof(bt_rx_buffer));
|
||||||
lwrb_reset(&bt_lwrb_rx);
|
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 mode = atoi(argv[1]);
|
||||||
int id = atoi(argv[2]) - 1;
|
int id = atoi(argv[2]) - 1;
|
||||||
LOG_D("send data mode: %d id :%d", mode, id);
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
|
|
|
@ -1,17 +1,16 @@
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
#include "flexible_button.h"
|
#include "flexible_button.h"
|
||||||
#include "bsp_button.h"
|
#include "bsp_button.h"
|
||||||
|
#include "bsp_flash.h"
|
||||||
#include "bsp_led.h"
|
#include "bsp_led.h"
|
||||||
#include "bsp_beep.h"
|
#include "bsp_beep.h"
|
||||||
|
#include "bsp_bt.h"
|
||||||
#include "user_sys.h"
|
#include "user_sys.h"
|
||||||
|
|
||||||
#define LOG_TAG "bsp_button"
|
#define LOG_TAG "bsp_button"
|
||||||
#define LOG_LVL LOG_LVL_DBG
|
#define LOG_LVL LOG_LVL_DBG
|
||||||
#include <ulog.h>
|
#include <ulog.h>
|
||||||
|
|
||||||
|
|
||||||
#ifdef BUTTON_USE_THREAD
|
#ifdef BUTTON_USE_THREAD
|
||||||
ALIGN(RT_ALIGN_SIZE)
|
ALIGN(RT_ALIGN_SIZE)
|
||||||
static char button_thread_stack[BUTTON_THREAD_STACK_SIZE];
|
static char button_thread_stack[BUTTON_THREAD_STACK_SIZE];
|
||||||
|
@ -23,7 +22,7 @@ static rt_timer_t button_timer;
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
USER_BUTTON_0 = 0,
|
USER_BUTTON_0 = 0,
|
||||||
USER_BUTTON_1 ,
|
USER_BUTTON_1,
|
||||||
USER_BUTTON_MAX
|
USER_BUTTON_MAX
|
||||||
} user_button_t;
|
} user_button_t;
|
||||||
|
|
||||||
|
@ -49,13 +48,6 @@ static uint8_t _CommonBtnRead(void *arg)
|
||||||
return value;
|
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 void _CommonBtnEvtCb(void *arg)
|
||||||
{
|
{
|
||||||
static rt_uint8_t button_cnt = 0;
|
static rt_uint8_t button_cnt = 0;
|
||||||
|
@ -64,8 +56,33 @@ static void _CommonBtnEvtCb(void *arg)
|
||||||
{
|
{
|
||||||
Send_Laser_Alarm_Event(kSelfCheckEvent);
|
Send_Laser_Alarm_Event(kSelfCheckEvent);
|
||||||
}
|
}
|
||||||
#if 1
|
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))
|
||||||
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))
|
{
|
||||||
|
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++;
|
button_cnt++;
|
||||||
if (button_cnt == 1)
|
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_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 */
|
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++)
|
for (uint8_t i = 0; i < USER_BUTTON_MAX; i++)
|
||||||
{
|
{
|
||||||
user_button[i].id = i;
|
user_button[i].id = i;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "lwutil.h"
|
#include "lwutil.h"
|
||||||
#include "bsp_rtc.h"
|
#include "bsp_rtc.h"
|
||||||
#include "bsp_hr.h"
|
#include "bsp_hr.h"
|
||||||
#include "at_device_ml307.h"
|
#include "at_device_ml307.h"
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
#include <rthw.h>
|
#include <rthw.h>
|
||||||
|
|
||||||
|
@ -12,30 +12,28 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
//在此修改默认的服务器地址
|
// 在此修改默认的服务器地址
|
||||||
struct flash_sever_info sever_info =
|
struct flash_sever_info sever_info =
|
||||||
{
|
{
|
||||||
.server_url = "8.130.122.162",
|
.server_url = "8.130.122.162",
|
||||||
.server_port = "7153",
|
.server_port = "7153",
|
||||||
// .server_port = "36078",
|
// .server_port = "36078",
|
||||||
// .server_url = "8.135.10.183",
|
// .server_url = "8.135.10.183",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *hex_array);
|
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) \
|
#define GETATTR(info, id) ((id) == kHwVerId ? (&(info)->hw_ver) \
|
||||||
: (id) == kSwVerId ? (&(info)->sw_ver) \
|
: (id) == kSwVerId ? (&(info)->sw_ver) \
|
||||||
: (id) == kAlarmLValueId ? (&(info)->alarm_l_value) \
|
: (id) == kAlarmLValueId ? (&(info)->alarm_l_value) \
|
||||||
: (id) == kAlarmHValueId ? (&(info)->alarm_h_value) \
|
: (id) == kAlarmHValueId ? (&(info)->alarm_h_value) \
|
||||||
: (id) == kTempAlarmThresholdId ? (&(info)->temp_alarm_threshold) \
|
: (id) == kTempAlarmThresholdId ? (&(info)->temp_alarm_threshold) \
|
||||||
: (id) == kIotUploadCycleId ? (&(info)->nb_upload_cycle) \
|
: (id) == kIotUploadCycleId ? (&(info)->nb_upload_cycle) \
|
||||||
: (id) == kIotRetryId ? (&(info)->nb_retry) \
|
: (id) == kIotRetryId ? (&(info)->nb_retry) \
|
||||||
: (id) == kEmagneticSwitchId ? (&(info)->emagnetic_switch) \
|
: (id) == kEmagneticSwitchId ? (&(info)->emagnetic_switch) \
|
||||||
: (id) == kRelaySwitchId ? (&(info)->relay_switch) \
|
: (id) == kRelaySwitchId ? (&(info)->relay_switch) \
|
||||||
: (id) == kIotImeiId ? ((info)->nb_imei) \
|
: (id) == kIotImeiId ? ((info)->nb_imei) \
|
||||||
: (id) == kIotImsiId ? ((info)->nb_imsi) \
|
: (id) == kIotImsiId ? ((info)->nb_imsi) \
|
||||||
: (id) == kIotIccidId ? ((info)->nb_iccid) \
|
: (id) == kIotIccidId ? ((info)->nb_iccid) \
|
||||||
: NULL)
|
: NULL)
|
||||||
|
|
||||||
TsTotalRecords TotalRecords;
|
TsTotalRecords TotalRecords;
|
||||||
|
@ -93,15 +91,13 @@ static rt_base_t interrupt_value;
|
||||||
rt_uint8_t sys_hw_ver = 0x10;
|
rt_uint8_t sys_hw_ver = 0x10;
|
||||||
rt_uint8_t sys_sw_ver = 0x11;
|
rt_uint8_t sys_sw_ver = 0x11;
|
||||||
rt_uint8_t sys_nb_retry = 0x03; // 重试次数3次
|
rt_uint8_t sys_nb_retry = 0x03; // 重试次数3次
|
||||||
rt_uint16_t sys_nb_upload_cycle = 0x000A; // 120分钟一次
|
rt_uint16_t sys_nb_upload_cycle = 0x000A; // 120分钟一次
|
||||||
rt_uint16_t sys_alarm_h_value = 0x0032; // 50
|
rt_uint16_t sys_alarm_h_value = 0x0032; // 50
|
||||||
rt_uint16_t sys_alarm_l_value = 0x09C4; // 2500
|
rt_uint16_t sys_alarm_l_value = 0x09C4; // 2500
|
||||||
rt_uint8_t sys_temp_alarm_threshold = 0x32;
|
rt_uint8_t sys_temp_alarm_threshold = 0x32;
|
||||||
rt_uint8_t sys_emagnetic_switch = 0x04; // 具备阀门功能
|
rt_uint8_t sys_emagnetic_switch = 0x04; // 具备阀门功能
|
||||||
rt_uint8_t sys_relay_switch = 0x04; // 具备继电器功能
|
rt_uint8_t sys_relay_switch = 0x04; // 具备继电器功能
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void BSP_Flash_UnLock(void)
|
static void BSP_Flash_UnLock(void)
|
||||||
{
|
{
|
||||||
#if (SystemCoreClock > SYSCLK_FREQ_96MHz_HSE)
|
#if (SystemCoreClock > SYSCLK_FREQ_96MHz_HSE)
|
||||||
|
@ -142,8 +138,6 @@ static void BSP_Flash_FastLock(void)
|
||||||
rt_hw_interrupt_enable(interrupt_value);
|
rt_hw_interrupt_enable(interrupt_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static rt_size_t Flash_Read(rt_uint32_t addr, rt_uint8_t *buf, rt_size_t len)
|
static rt_size_t Flash_Read(rt_uint32_t addr, rt_uint8_t *buf, rt_size_t len)
|
||||||
{
|
{
|
||||||
rt_size_t read_len = 0;
|
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)
|
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);
|
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)
|
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);
|
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)
|
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);
|
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]);
|
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",
|
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]);
|
rt_uint16_t port_num = ((data[5] << 8) | data[4]);
|
||||||
LOG_D("port_num = %d", port_num);
|
LOG_D("port_num = %d", port_num);
|
||||||
rt_snprintf(sever_info->server_port, sizeof(sever_info->server_port), "%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;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Flash_ErasePage_ReadConfigInfo(page_buf);
|
Flash_ErasePage_ReadConfigInfo(page_buf);
|
||||||
//*将传入的数据写到flash地址中
|
//*将传入的数据写到flash地址中
|
||||||
for (size_t i = 0; i < FLASH_SERVER_LEN; i++)
|
for (size_t i = 0; i < FLASH_SERVER_LEN; i++)
|
||||||
{
|
{
|
||||||
page_buf[in_page_offset++] = data[i];
|
page_buf[in_page_offset++] = data[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
return Flash_Write_ConfigInfo(page_buf);
|
return Flash_Write_ConfigInfo(page_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TeCalibrationStatus Flash_Get_Calibration_State(void)
|
TeCalibrationStatus Flash_Get_Calibration_State(void)
|
||||||
{
|
{
|
||||||
return *(rt_uint8_t *)FLASH_CALIBRATION_STATUS_ADDR;
|
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);
|
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);
|
LOG_D("FLASH_CALIBRATION_STATUS_ADDR = %X", FLASH_CALIBRATION_STATUS_ADDR);
|
||||||
Flash_ErasePage_ReadConfigInfo(page_buf);
|
Flash_ErasePage_ReadConfigInfo(page_buf);
|
||||||
//*将传入的数据写到flash地址中
|
//*将传入的数据写到flash地址中
|
||||||
|
|
||||||
page_buf[in_page_offset] = status;
|
page_buf[in_page_offset] = status;
|
||||||
|
|
||||||
return Flash_Write_ConfigInfo(page_buf);
|
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)
|
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 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)
|
if (mac_addr == RT_NULL)
|
||||||
{
|
{
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
Flash_ErasePage_ReadConfigInfo(page_buf);
|
Flash_ErasePage_ReadConfigInfo(page_buf);
|
||||||
for (size_t i = 0; i < FLASH_VALVE_MAC_ADDR_LEN; i++)
|
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);
|
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)
|
int Flash_Get_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number)
|
||||||
{
|
{
|
||||||
rt_uint8_t data[FLASH_VALVE_MAC_ADDR_LEN];
|
rt_uint8_t data[FLASH_VALVE_MAC_ADDR_LEN];
|
||||||
char mac[16] = {20};
|
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)
|
if (data == RT_NULL)
|
||||||
{
|
{
|
||||||
LOG_E("Flash_Get_Mac_Addr failed");
|
LOG_E("Flash_Get_Mac_Addr failed");
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
//进行两次判断的原因主要为,防止MAC地址确实有个e3或者e99,但是MAC地址确是正确的情况,防止出现错误,两次判断可以从一定程度上降低这种风险
|
// 判断读出来的数是否是flash的默认值 如果默认值是0xe3e9的话
|
||||||
if (((data[0] == 0xe3) || (data[0] == 0x39))&&((data[1] == 0xe3) || (data[1] == 0x39)))
|
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));
|
rt_memset(data, 0, 6);
|
||||||
return RT_EEMPTY;
|
rt_memcpy(mac_addr, data, FLASH_VALVE_MAC_ADDR_LEN);
|
||||||
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
rt_snprintf(mac, 20, "%02x:%02x:%02x:%02x:%02x:%02x",
|
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);
|
LOG_I("mac_addr:%s", mac);
|
||||||
rt_memcpy(mac_addr, data, FLASH_VALVE_MAC_ADDR_LEN);
|
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);
|
LOG_D("Flash_Erase_Records(%d)", record);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @description:
|
* @description:
|
||||||
* @param {TeRecord} record
|
* @param {TeRecord} record
|
||||||
|
@ -482,7 +481,6 @@ static rt_uint16_t Flash_GetMaxIndex_Records(TeRecord record)
|
||||||
return index_max;
|
return index_max;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description:
|
* @description:
|
||||||
* @param {TeRecord} record
|
* @param {TeRecord} record
|
||||||
|
@ -507,8 +505,6 @@ rt_uint8_t Flash_GetNum_Records(TeRecord record)
|
||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description:
|
* @description:
|
||||||
* @param {TuFlashHrRecordFrame*} pHrRecord
|
* @param {TuFlashHrRecordFrame*} pHrRecord
|
||||||
|
@ -656,7 +652,6 @@ void Flash_Write_Record(TeRecord record)
|
||||||
Flash_Write_RecordIndex(&HrRecord, record, index_new);
|
Flash_Write_RecordIndex(&HrRecord, record, index_new);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Flash_ErasePage_ConfigInfo(void)
|
void Flash_ErasePage_ConfigInfo(void)
|
||||||
{
|
{
|
||||||
BSP_Flash_FastUnLock();
|
BSP_Flash_FastUnLock();
|
||||||
|
@ -711,8 +706,6 @@ ErrorStatus Flash_GetProductTimeLimit(TuFlashProductTimeLimitFrame *pLimitTime,
|
||||||
return flag;
|
return flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Flash_SetProductTimeLimit(rt_uint16_t year, rt_uint8_t mon, rt_uint8_t day,
|
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,
|
rt_uint8_t hour, rt_uint8_t min, rt_uint8_t second,
|
||||||
TeFlashProductTimeLimitId id)
|
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 Flash_Sys_Cfg(TeFlashCfgInfoId id, rt_uint8_t *buf, rt_size_t len)
|
||||||
{
|
{
|
||||||
rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0};
|
rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0};
|
||||||
|
@ -814,10 +806,10 @@ size_t Flash_Get_SysCfg(TeFlashCfgInfoId id)
|
||||||
{
|
{
|
||||||
size_t value = 0;
|
size_t value = 0;
|
||||||
if (hr_sys_cfg_info_len[id] == 1)
|
if (hr_sys_cfg_info_len[id] == 1)
|
||||||
{
|
{
|
||||||
return *(rt_uint8_t *)hr_sys_cfg_info_addr[id];
|
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};
|
rt_uint8_t buf[2] = {0};
|
||||||
|
|
||||||
|
@ -830,8 +822,6 @@ size_t Flash_Get_SysCfg(TeFlashCfgInfoId id)
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ErrorStatus Flash_GetTotalRecord(TsTotalRecords *pTotalRecords)
|
ErrorStatus Flash_GetTotalRecord(TsTotalRecords *pTotalRecords)
|
||||||
{
|
{
|
||||||
ErrorStatus flag = NoREADY;
|
ErrorStatus flag = NoREADY;
|
||||||
|
@ -902,7 +892,7 @@ int BSP_Flash_Init(void)
|
||||||
LOG_D("BSP_Flash_EraseRecodrs!");
|
LOG_D("BSP_Flash_EraseRecodrs!");
|
||||||
rt_uint8_t flash_init_flag[2];
|
rt_uint8_t flash_init_flag[2];
|
||||||
sys_config_info sci;
|
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[0] = FLASH_FIRST_INIT_VALUE % 256;
|
||||||
flash_init_flag[1] = 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.temp_alarm_threshold = sys_temp_alarm_threshold;
|
||||||
sci.emagnetic_switch = sys_emagnetic_switch;
|
sci.emagnetic_switch = sys_emagnetic_switch;
|
||||||
sci.relay_switch = sys_relay_switch;
|
sci.relay_switch = sys_relay_switch;
|
||||||
|
|
||||||
Flash_Set_WorkDuration(work_duration);
|
Flash_Set_WorkDuration(work_duration);
|
||||||
LOG_D("work_duration:%d", Flash_Get_WorkDuration());
|
LOG_D("work_duration:%d", Flash_Get_WorkDuration());
|
||||||
|
|
||||||
|
@ -933,16 +923,15 @@ int BSP_Flash_Init(void)
|
||||||
{
|
{
|
||||||
LOG_D("%02x", sever_data[i]);
|
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!");
|
LOG_D("Flash_Set_Sever_Addr_Info error!");
|
||||||
}
|
}
|
||||||
Flash_Set_Calibration_State(kSysGasCalibStatus);//未标定状态
|
Flash_Set_Calibration_State(kSysGasCalibStatus); // 未标定状态
|
||||||
Flash_Set_Valve_Num(0);
|
Flash_Set_Valve_Num(0);
|
||||||
Flash_Write(FLASH_HW_VER_ADDR, (rt_uint8_t *)&sci,
|
Flash_Write(FLASH_HW_VER_ADDR, (rt_uint8_t *)&sci,
|
||||||
(sizeof(sys_config_info) - 50));
|
(sizeof(sys_config_info) - 50));
|
||||||
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -950,7 +939,6 @@ int BSP_Flash_Init(void)
|
||||||
INIT_PREV_EXPORT(BSP_Flash_Init);
|
INIT_PREV_EXPORT(BSP_Flash_Init);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef TEST_ENABLE
|
#ifdef TEST_ENABLE
|
||||||
static void TEST_Flash_GetMaxIndex_Records(int argc, char **argv)
|
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,
|
MSH_CMD_EXPORT(TEST_Flash_GetMaxIndex_Records,
|
||||||
"TEST_Flash_GetMaxIndex_Records");
|
"TEST_Flash_GetMaxIndex_Records");
|
||||||
|
|
||||||
|
|
||||||
static void TEST_Flash_Erase_Records(int argc, char **argv)
|
static void TEST_Flash_Erase_Records(int argc, char **argv)
|
||||||
{
|
{
|
||||||
if (argc == 2)
|
if (argc == 2)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author: mbw
|
* @Author: mbw
|
||||||
* @Date: 2024-11-30 15:46:21
|
* @Date: 2024-11-30 15:46:21
|
||||||
* @LastEditors: mbw && 1600520629@qq.com
|
* @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
|
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c
|
||||||
* @Description:
|
* @Description:
|
||||||
*
|
*
|
||||||
|
@ -52,7 +52,7 @@ rt_sem_t ml307_life_sem;
|
||||||
static rt_timer_t ml307_timer; // 上报心跳
|
static rt_timer_t ml307_timer; // 上报心跳
|
||||||
static rt_timer_t ml307_upload_timer; // 更新本地时间定时器
|
static rt_timer_t ml307_upload_timer; // 更新本地时间定时器
|
||||||
static rt_timer_t ml307_power_error_timer; // 上电失败情况下启动定时器
|
static rt_timer_t ml307_power_error_timer; // 上电失败情况下启动定时器
|
||||||
static rt_timer_t ml307_heartbeat_check_timer; // 用于检测定时器是否工作
|
|
||||||
|
|
||||||
rt_uint8_t ml307_conncet_tcp_flag;
|
rt_uint8_t ml307_conncet_tcp_flag;
|
||||||
Ml307EventIndex ml307_event_index;
|
Ml307EventIndex ml307_event_index;
|
||||||
|
@ -99,11 +99,10 @@ static rt_bool_t ml307_event_initialized = RT_FALSE; // 是否初
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
kMl307PriorityLowest, // 4、优先级最低(定时心跳、浓度异常、报警触发、报警解除、传感器故障触发 传感器故障解除)
|
||||||
ML307_PRIORITY_LOWEST, // 4、优先级最低(定时心跳、浓度异常、报警触发、报警解除、传感器故障触发 传感器故障解除)
|
kMl307PriorityMedium, // 2、优先级第三高 自检触发
|
||||||
ML307_PRIORITY_MEDIUM, // 2、优先级第三高 自检触发
|
kMl307PriorityHigh, // 1、优先级第二高 掉电
|
||||||
ML307_PRIORITY_HIGH, // 1、优先级第二高 掉电
|
kMl307PriorityHighest, // 0 优先级最高(设备上电时的定时心跳)
|
||||||
ML307_PRIORITY_HIGHEST, // 0 优先级最高(设备上电时的定时心跳)
|
|
||||||
} Ml307Priority;
|
} Ml307Priority;
|
||||||
|
|
||||||
typedef struct
|
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)
|
static void Ml307_Ht_Timer_Cb(void *parameter)
|
||||||
{
|
{
|
||||||
current_value++;
|
|
||||||
Ml307_Send_Event(kMl307HeartbeatEvent);
|
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)
|
int _Pack_Send(struct Ml307_Ops *ops, char *buf)
|
||||||
{
|
{
|
||||||
char ml307_send_buf[1024] = {0}; // 发送缓冲区,用于存储最终发送的数据
|
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_snprintf(temp, sizeof(temp), "%02X", ((rt_uint8_t *)ops->body)[i]);
|
||||||
rt_memcpy(data_buf + i * 2, temp, 2);
|
rt_memcpy(data_buf + i * 2, temp, 2);
|
||||||
}
|
}
|
||||||
rt_mutex_release(ml307_mutex);
|
|
||||||
ret = _Send_Handle(ops, data_num, cmd, data_buf);
|
ret = _Send_Handle(ops, data_num, cmd, data_buf);
|
||||||
if (ret != RT_EOK)
|
if (ret != RT_EOK)
|
||||||
{
|
{
|
||||||
return -ret;
|
ret = -ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
rt_mutex_release(ml307_mutex);
|
||||||
{
|
|
||||||
rt_mutex_release(ml307_mutex);
|
|
||||||
LOG_E("ml307_conncet_tcp_flag = 0");
|
|
||||||
ret = -RT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -496,7 +467,6 @@ int Ml307_Send_Alarm(struct at_device *device, void *param)
|
||||||
LOG_E("ml307 param error\n");
|
LOG_E("ml307 param error\n");
|
||||||
return RT_ERROR;
|
return RT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ml307_ops->send(ml307_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_ML307, EVENT_TYPE_ALARM))
|
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);
|
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[] = {
|
const Ml307EventInfo ml307_event_info[] = {
|
||||||
{kMl307PowerOnEvent, ML307_PRIORITY_HIGHEST, "上电心跳事件", Ml307_Send_Power_On},
|
{kMl307PowerOnEvent, kMl307PriorityHighest, "上电心跳事件", Ml307_Send_Power_On},
|
||||||
{kMl307PowerDownEvent, ML307_PRIORITY_HIGH, "掉电事件", Ml307_Send_Power_Off},
|
{kMl307PowerDownEvent, kMl307PriorityHigh, "掉电事件", Ml307_Send_Power_Off},
|
||||||
{kMl307SelfCheckEvent, ML307_PRIORITY_MEDIUM, "自检事件", Ml307_Send_Self_Check},
|
{kMl307SelfCheckEvent, kMl307PriorityMedium, "自检事件", Ml307_Send_Self_Check},
|
||||||
{kMl307HeartbeatEvent, ML307_PRIORITY_LOWEST, "定时心跳事件", Ml307_Send_Heartbeat},
|
{kMl307HeartbeatEvent, kMl307PriorityLowest, "定时心跳事件", Ml307_Send_Heartbeat},
|
||||||
{kMl307TempAnomalyEvent, ML307_PRIORITY_LOWEST, "温度异常事件", Ml307_Send_Temp_Anomaly},
|
{kMl307TempAnomalyEvent, kMl307PriorityLowest, "温度异常事件", Ml307_Send_Temp_Anomaly},
|
||||||
{kMl307AlarmEvent, ML307_PRIORITY_LOWEST, "报警触发事件", Ml307_Send_Alarm},
|
{kMl307AlarmEvent, kMl307PriorityLowest, "报警触发事件", Ml307_Send_Alarm},
|
||||||
{kMl307AlarmRcyEvent, ML307_PRIORITY_LOWEST, "报警解除事件", Ml307_Send_Alarm_Recover},
|
{kMl307AlarmRcyEvent, kMl307PriorityLowest, "报警解除事件", Ml307_Send_Alarm_Recover},
|
||||||
{kMl307FaultEvent, ML307_PRIORITY_LOWEST, "传感器故障事件", Ml307_Send_Fault},
|
{kMl307FaultEvent, kMl307PriorityLowest, "传感器故障事件", Ml307_Send_Fault},
|
||||||
{kMl307FaultRcyEvent, ML307_PRIORITY_LOWEST, "传感器故障解除事件", Ml307_Send_Fault_Recover},
|
{kMl307FaultRcyEvent, kMl307PriorityLowest, "传感器故障解除事件", Ml307_Send_Fault_Recover},
|
||||||
{kMl307TimeCalibrationEvent, ML307_PRIORITY_LOWEST, "时间校准事件", Ml307_Send_Time_Calibration},
|
{kMl307TimeCalibrationEvent, kMl307PriorityLowest, "时间校准事件", Ml307_Send_Time_Calibration},
|
||||||
{kMl307SilenceEvent, ML307_PRIORITY_LOWEST, "消音事件", Ml307_Send_Silence},
|
{kMl307SilenceEvent, kMl307PriorityLowest, "消音事件", Ml307_Send_Silence},
|
||||||
// {kMl307ExceptionEvent, ML307_PRIORITY_LOWEST, "异常事件", Ml307_Send_Exception},
|
// {kMl307ExceptionEvent, kMl307PriorityLowest, "异常事件", Ml307_Send_Exception},
|
||||||
{kMl307ValveStatusEvent, ML307_PRIORITY_LOWEST, "电磁阀状态改变事件", Ml307_Send_Valve_Status},
|
{kMl307ValveStatusEvent, kMl307PriorityLowest, "电磁阀状态改变事件", Ml307_Send_Valve_Status},
|
||||||
{kMl307FanStatusEvent, ML307_PRIORITY_LOWEST, "风机状态改变事件", Ml307_Send_Fan_Status},
|
{kMl307FanStatusEvent, kMl307PriorityLowest, "风机状态改变事件", Ml307_Send_Fan_Status},
|
||||||
{kMl307DeviceFailureEvent, ML307_PRIORITY_LOWEST, "设备失效事件", Ml307_Send_Device_Failure}};
|
{kMl307DeviceFailureEvent, kMl307PriorityLowest, "设备失效事件", Ml307_Send_Device_Failure}};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理ML307设备的事件
|
* 处理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) // 打开连接
|
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);
|
result = event->send_func(device, ml307_ops);
|
||||||
if (result != RT_EOK)
|
if (result != RT_EOK)
|
||||||
{
|
{
|
||||||
LOG_E("ml307 send cmd after module reset failed\n");
|
LOG_E("ml307 send cmd after module reset failed\n");
|
||||||
|
|
||||||
// Flash_Set_WorkDuration(work_duration); // 重启前保存参数
|
|
||||||
// NVIC_SystemReset(); // 直接重启系统
|
|
||||||
|
|
||||||
Ml307_Reset(device);
|
Ml307_Reset(device);
|
||||||
rt_thread_mdelay(5000);
|
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]);
|
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)) // 不为零则说明关闭无线阀门
|
if ((data[0] > 0) && (data[0] < MAX_VALVE_NUM)) // 不为零则说明关闭无线阀门
|
||||||
{
|
{
|
||||||
LOG_D("无线阀门编号:%d\n", data[0]);
|
rt_uint8_t cnt = Flash_Get_Valve_Num();
|
||||||
Flash_Get_Mac_Addr(mac_addr, 0);
|
if (cnt == 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++)
|
|
||||||
{
|
{
|
||||||
if (mac_addr[i] != data[i + 1])
|
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);
|
||||||
LOG_E("mac_addr[%d][%x]!= data[%d][%x]\n", i, mac_addr[i], i + 1, data[i + 1]);
|
return RT_ERROR;
|
||||||
|
}
|
||||||
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE);
|
else
|
||||||
|
|
||||||
return RT_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i == FLASH_VALVE_MAC_ADDR_LEN)
|
|
||||||
{
|
{
|
||||||
LOG_D("mac地址匹配成功,执行关阀动作\n");
|
LOG_D("无线阀门编号:%d\n", data[0]);
|
||||||
// if (Bt_Valve_Handler(kValveCmdCtr, data[0] - 1, RT_NULL) != RT_EOK)
|
if(Flash_Get_Mac_Addr(mac_addr, data[0]) != RT_EOK)
|
||||||
if (Bt_Valve_Handler(kValveCmdCtr, 0, RT_NULL) != 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);
|
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;
|
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");
|
if (mac_addr[i] != 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;
|
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
|
else
|
||||||
{
|
{
|
||||||
LOG_D("关阀成功\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_SUCCESS);
|
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE);
|
||||||
return RT_EOK;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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
|
else
|
||||||
{
|
{
|
||||||
LOG_D("关闭有线阀门\n");
|
LOG_D("关闭有线阀门\n");
|
||||||
// TODO:此处需要增加关阀有线阀门的逻辑
|
// 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);
|
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS);
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
@ -1201,62 +1177,50 @@ rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops)
|
||||||
char imei[16] = {0};
|
char imei[16] = {0};
|
||||||
char temp[32] = "0";
|
char temp[32] = "0";
|
||||||
rt_uint8_t cnt = Flash_Get_Valve_Num();
|
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);
|
Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN);
|
||||||
String2Hex(temp, imei); // 将字符串转为十六进制字符串
|
String2Hex(temp, imei); // 将字符串转为十六进制字符串
|
||||||
|
|
||||||
if (cnt > MAX_VALVE_NUM)
|
if (cnt >= MAX_VALVE_NUM)
|
||||||
{
|
{
|
||||||
LOG_E("阀门设备数量超过最大值\n");
|
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);
|
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;
|
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];
|
LOG_E("新增阀门设备失败\n");
|
||||||
rt_memcpy(valve[data[0] - 1].valve_mac, &data[1], FLASH_VALVE_MAC_ADDR_LEN); // 将信息更新
|
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE);
|
||||||
if (Bt_Valve_Handler(kValveCmdReg, data[0] - 1, RT_NULL) != RT_EOK)
|
return RT_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;
|
|
||||||
}
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else // 不为空,不添加
|
if (rt_sem_take(&bt_reg_sem, 10000) != RT_EOK) // 等待十秒获取信号量
|
||||||
{
|
{
|
||||||
LOG_E("该阀门设备已存在,请选择更换阀门编号后重试\n");
|
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);
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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));
|
rt_memcpy(data, (ops->recv->recv_data.res_data + 2), (2 * FLASH_VALVE_MAC_ADDR_LEN + 1));
|
||||||
LOG_HEX("data", 16, data, sizeof(data));
|
LOG_HEX("data", 16, data, sizeof(data));
|
||||||
/*设备编号(1byte)+ 新MAC地址(6)+ 旧阀门MAC地址(6) + 补零字节= 15byte*/
|
/*设备编号(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++)
|
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");
|
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);
|
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;
|
return RT_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1304,7 +1267,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops)
|
||||||
}
|
}
|
||||||
else
|
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");
|
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);
|
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");
|
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);
|
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;
|
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_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 imei[16] = {0};
|
||||||
char temp[32] = "0";
|
char temp[32] = "0";
|
||||||
rt_uint8_t cnt = Flash_Get_Valve_Num();
|
rt_uint8_t cnt = Flash_Get_Valve_Num();
|
||||||
Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN);
|
Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN);
|
||||||
String2Hex(temp, imei); // 将字符串转为十六进制字符串
|
String2Hex(temp, imei); // 将字符串转为十六进制字符串
|
||||||
|
|
||||||
LOG_I("接收到服务器下发移除阀门指令");
|
LOG_I("接收到服务器下发移除阀门指令");
|
||||||
|
#if 1
|
||||||
if (cnt == 0)
|
if (cnt == 0)
|
||||||
{
|
{
|
||||||
LOG_E("阀门设备数量为0, 无法移除\n");
|
LOG_W("阀门设备数量为0\n");
|
||||||
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_ACTION_FAILURE);
|
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);
|
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]);
|
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)
|
if (Bt_Valve_Handler(kValveCmdRem, 0, RT_NULL) != RT_EOK)
|
||||||
{
|
{
|
||||||
LOG_E("移除阀门设备失败\n");
|
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) // 等待十秒获取信号量
|
if (rt_sem_take(&bt_rem_sem, 10000) != RT_EOK) // 等待十秒获取信号量
|
||||||
{
|
{
|
||||||
LOG_E("获取更换阀门信号量失败\n");
|
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);
|
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;
|
return RT_ERROR;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rt_memset(&data[1], 0, sizeof(data) - 1);
|
rt_memset(&data[1], 0, 6);
|
||||||
if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) == RESET)
|
if (Flash_Set_Mac_Addr(&data[1], data[0]) == RESET)
|
||||||
{
|
{
|
||||||
LOG_E("移除阀门设备失败\n");
|
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);
|
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;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Handle_Error(struct Ml307_Ops *ops, rt_err_t ret)
|
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)
|
void Analyze_Recv_Frame(struct at_device *device, struct Ml307_Ops *ops)
|
||||||
{
|
{
|
||||||
rt_err_t ret = RT_EOK;
|
rt_err_t ret = RT_EOK;
|
||||||
// Reset_Ml307_Life_Timer(); // 只要数据,则重置定时器,不管数据是否正确
|
|
||||||
|
|
||||||
ret = Compare_HeaderToTail(ops);
|
ret = Compare_HeaderToTail(ops);
|
||||||
if (ret == RT_EOK)
|
if (ret == RT_EOK)
|
||||||
|
@ -1565,7 +1525,6 @@ static void Ml307_Send_Thread_Entry(void *param)
|
||||||
}
|
}
|
||||||
if (ml307_conncet_tcp_flag)
|
if (ml307_conncet_tcp_flag)
|
||||||
{
|
{
|
||||||
// Reset_Ml307_Life_Timer();
|
|
||||||
if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307PowerOnEvent))
|
if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307PowerOnEvent))
|
||||||
{
|
{
|
||||||
result = Ml307_Process_Events(kMl307PowerOnEvent, device, ops); // 当上电心跳包发送不成功时,其他事件不启动
|
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_ml307 *ml307 = &_dev;
|
||||||
struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name);
|
struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name);
|
||||||
RT_ASSERT(device);
|
RT_ASSERT(device);
|
||||||
rt_err_t ret;
|
|
||||||
|
|
||||||
LOG_D("ml307 recv thread entry\n");
|
LOG_D("ml307 recv thread entry\n");
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
ret = rt_sem_take(ml307_recv_sem, RT_WAITING_FOREVER); // 这个主要用来处理的数据
|
if (rt_sem_take(ml307_recv_sem, RT_WAITING_FOREVER) == RT_EOK)
|
||||||
if (ret == RT_EOK)
|
|
||||||
{
|
{
|
||||||
// rt_timer_start(ml307_life_timer);
|
|
||||||
/*对数据帧进行分析,判断所处的是对服务器响应还是指令下发*/
|
|
||||||
Analyze_Recv_Frame(device, ops);
|
Analyze_Recv_Frame(device, ops);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1803,17 +1758,6 @@ int BSP_Ml307_Thread_Init(void)
|
||||||
RT_NULL,
|
RT_NULL,
|
||||||
24 * 60 * RT_TICK_PER_SECOND, //
|
24 * 60 * RT_TICK_PER_SECOND, //
|
||||||
RT_TIMER_FLAG_PERIODIC);
|
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,
|
ret = rt_thread_init(&ml307_thread,
|
||||||
"ml307_send_thread",
|
"ml307_send_thread",
|
||||||
Ml307_Send_Thread_Entry,
|
Ml307_Send_Thread_Entry,
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author : stark1898y 1658608470@qq.com
|
* @Author : stark1898y 1658608470@qq.com
|
||||||
* @Date : 2024-06-18 15:48:01
|
* @Date : 2024-06-18 15:48:01
|
||||||
* @LastEditors: mbw && 1600520629@qq.com
|
* @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
|
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_mq.c
|
||||||
* @Description :
|
* @Description :
|
||||||
*
|
*
|
||||||
|
@ -25,12 +25,9 @@
|
||||||
#include "user_sys.h"
|
#include "user_sys.h"
|
||||||
#include "finsh.h"
|
#include "finsh.h"
|
||||||
|
|
||||||
|
#define LOG_TAG "bsp_mq" // 该模块对应的标签。不定义时,默认:NO_TAG
|
||||||
|
#define LOG_LVL LOG_LVL_DBG // 该模块对应的日志输出级别。不定义时,默认:调试级别
|
||||||
#define LOG_TAG "bsp_mq" // 该模块对应的标签。不定义时,默认:NO_TAG
|
#include <ulog.h> // 必须在 LOG_TAG 与 LOG_LVL 下面
|
||||||
#define LOG_LVL LOG_LVL_DBG // 该模块对应的日志输出级别。不定义时,默认:调试级别
|
|
||||||
#include <ulog.h> // 必须在 LOG_TAG 与 LOG_LVL 下面
|
|
||||||
|
|
||||||
|
|
||||||
ALIGN(RT_ALIGN_SIZE)
|
ALIGN(RT_ALIGN_SIZE)
|
||||||
static char sensor_thread_stack[GAS_SNESOR_THREAD_STACK_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 Get_Gas_VoltageInt1000x(void)
|
||||||
{
|
{
|
||||||
uint16_t voltage = (Get_ADC_Average(kGasAdc) * 3.3 / 4096) * MQ_VOLTAGE_RATIO * 1000;
|
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;
|
return voltage;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t Get_Gas_VoltageAdcInt1000x(void)
|
uint16_t Get_Gas_VoltageAdcInt1000x(void)
|
||||||
{
|
{
|
||||||
rt_uint16_t voltage_adc = (Get_ADC_Average(kGasAdc) * 3.3 / 4096) * 1000;
|
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;
|
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)
|
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;
|
Sensor_device.detection_flag = kSensorAlarm;
|
||||||
Send_Laser_Alarm_Event(kAlarmEvent);
|
Send_Laser_Alarm_Event(kAlarmEvent);
|
||||||
*flag = 1;
|
*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);
|
Send_Laser_Alarm_Event(kAlarmRcyEvent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Sensor_HandleFault(uint8_t count, uint8_t *flag, uint8_t threshold)
|
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;
|
Sensor_device.detection_flag = kSensorFault;
|
||||||
Send_Laser_Alarm_Event(kFaultEvent);
|
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);
|
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_count = 0, fault_count = 0;
|
||||||
static rt_uint8_t alarm_flag = 0, fault_flag = 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 alarm_status_buffer[SENSOR_SAMPLING_TIMS] = {0};
|
||||||
static rt_uint8_t fault_buf[SENSOR_SAMPLING_TIMS] = {0};
|
static rt_uint8_t fault_buf[SENSOR_SAMPLING_TIMS] = {0};
|
||||||
rt_uint16_t voltage = Get_Gas_VoltageAdcInt1000x();
|
rt_uint16_t voltage = Get_Gas_VoltageAdcInt1000x();
|
||||||
|
|
||||||
alarm_status_buffer[index] = ((voltage > Sensor_device.alarm_value) && (voltage < MQ_VOLTAGE_HIGH_LIMIT)) ? kSensorAlarm : kSensorNormal;
|
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++;
|
index++;
|
||||||
if (index >= SENSOR_SAMPLING_TIMS)
|
if (index >= SENSOR_SAMPLING_TIMS)
|
||||||
{
|
{
|
||||||
index = 0;
|
index = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
alarm_count = Sensor_Count(alarm_status_buffer, kSensorAlarm, SENSOR_SAMPLING_TIMS);
|
alarm_count = Sensor_Count(alarm_status_buffer, kSensorAlarm, SENSOR_SAMPLING_TIMS);
|
||||||
fault_count = Sensor_Count(fault_buf, kSensorFault, 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_HandleAlarm(alarm_count, &alarm_flag, SENSOR_SAMPLING_TIMS);
|
||||||
Sensor_HandleFault(fault_count, &fault_flag, SENSOR_SAMPLING_TIMS / 2 + 1);
|
Sensor_HandleFault(fault_count, &fault_flag, SENSOR_SAMPLING_TIMS);
|
||||||
|
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
@ -142,13 +141,13 @@ uint8_t IS_EndOfLife(void)
|
||||||
// MQ检测线程函数
|
// MQ检测线程函数
|
||||||
static void Sensor_detection_thread_entry(void *param)
|
static void Sensor_detection_thread_entry(void *param)
|
||||||
{
|
{
|
||||||
TuFlashProductTimeLimitFrame LimitTime;
|
TuFlashProductTimeLimitFrame LimitTime;
|
||||||
if (Flash_GetProductTimeLimit(&LimitTime, kExpirationTimeId) == READY)
|
if (Flash_GetProductTimeLimit(&LimitTime, kExpirationTimeId) == READY)
|
||||||
{
|
{
|
||||||
// 计算出 到期时间对应的RTC秒数
|
// 计算出 到期时间对应的RTC秒数
|
||||||
Sensor_device.expiration_seconds = DateTime2Seconds(LimitTime.Struct.year,
|
Sensor_device.expiration_seconds = DateTime2Seconds(LimitTime.Struct.year,
|
||||||
LimitTime.Struct.month, LimitTime.Struct.day, LimitTime.Struct.hour,
|
LimitTime.Struct.month, LimitTime.Struct.day, LimitTime.Struct.hour,
|
||||||
LimitTime.Struct.minute, LimitTime.Struct.second);
|
LimitTime.Struct.minute, LimitTime.Struct.second);
|
||||||
LOG_D("device_expiration_time:%04d-%02d-%02d,%02d:%02d",
|
LOG_D("device_expiration_time:%04d-%02d-%02d,%02d:%02d",
|
||||||
LimitTime.Struct.year, LimitTime.Struct.month, LimitTime.Struct.day,
|
LimitTime.Struct.year, LimitTime.Struct.month, LimitTime.Struct.day,
|
||||||
LimitTime.Struct.hour, LimitTime.Struct.minute, LimitTime.Struct.second);
|
LimitTime.Struct.hour, LimitTime.Struct.minute, LimitTime.Struct.second);
|
||||||
|
@ -174,7 +173,7 @@ static void Sensor_detection_thread_entry(void *param)
|
||||||
{
|
{
|
||||||
Sensor_CheckData();
|
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);
|
Sensor_device.alarm_value = Flash_Get_SysCfg(kAlarmLValueId);
|
||||||
LOG_D("报警阈值为:%d", Sensor_device.alarm_value);
|
LOG_D("报警阈值为:%d", Sensor_device.alarm_value);
|
||||||
rt_thread_init(&Sensor_Thread, //可以用定时器做,没必要线程
|
rt_thread_init(&Sensor_Thread, // 可以用定时器做,没必要线程
|
||||||
"sensor_thread",
|
"sensor_thread",
|
||||||
Sensor_detection_thread_entry,
|
Sensor_detection_thread_entry,
|
||||||
RT_NULL,
|
RT_NULL,
|
||||||
&sensor_thread_stack[0],
|
&sensor_thread_stack[0],
|
||||||
sizeof(sensor_thread_stack),
|
sizeof(sensor_thread_stack),
|
||||||
GAS_SENSOR_THREAD_PRIORITY, GAS_SENSOR_THREAD_TIMESLICE);
|
GAS_SENSOR_THREAD_PRIORITY, GAS_SENSOR_THREAD_TIMESLICE);
|
||||||
rt_thread_startup(&Sensor_Thread);
|
rt_thread_startup(&Sensor_Thread);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -204,4 +203,3 @@ static void TEST_MQ_EndOfLife(void)
|
||||||
}
|
}
|
||||||
MSH_CMD_EXPORT(TEST_MQ_EndOfLife, TEST_MQ_EndOfLife);
|
MSH_CMD_EXPORT(TEST_MQ_EndOfLife, TEST_MQ_EndOfLife);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue