From ee85ee6813bc4f9691a458f7bc9d3ce6fc8fb769 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B0=8F=E9=A9=AC=5F666?=
<13089258+pony-six-hundred-and-sixty-six@user.noreply.gitee.com>
Date: Sun, 1 Dec 2024 15:31:07 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=A0=87=E5=AE=9A?=
=?UTF-8?q?=E9=83=A8=E5=88=86=E7=A8=8B=E5=BA=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.cproject | 2 +-
applications/main.c | 507 ++++++++++++++++++++------------------
applications/user_sys.c | 1 +
applications/user_sys.h | 52 ++--
bsp/inc/bsp_beep.h | 7 +
bsp/inc/bsp_flash.h | 27 +-
bsp/src/bsp_flash.c | 48 +++-
bsp/src/bsp_mb26.c | 20 --
bsp/src/bsp_mq.c | 1 +
rt-thread/include/rtdef.h | 1 +
10 files changed, 367 insertions(+), 299 deletions(-)
diff --git a/.cproject b/.cproject
index 07e4900..17229bb 100644
--- a/.cproject
+++ b/.cproject
@@ -197,5 +197,5 @@
-
+
diff --git a/applications/main.c b/applications/main.c
index eea7901..65e4b1a 100644
--- a/applications/main.c
+++ b/applications/main.c
@@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-10-23 17:14:16
* @LastEditors: mbw && 1600520629@qq.com
- * @LastEditTime: 2024-12-01 13:04:55
+ * @LastEditTime: 2024-12-01 14:44:58
* @FilePath: \ble_bjq_ch303rct6_ml307\applications\main.c
* @Descrt_thread_
*
@@ -21,7 +21,7 @@
#include "bsp_flash.h"
#include "bsp_hr.h"
#include "bsp_mq.h"
- #include "bsp_button.h"
+#include "bsp_button.h"
#include "bsp_mb26.h"
#include "bsp_vin_detection.h"
#include "user_sys.h"
@@ -41,6 +41,7 @@ TsSysControl SysControl;
struct rt_timer work_cnt_timer;
void Send_Laser_Alarm_Event(AlarmEvent event_type);
+TeCalibrationStatus g_Calibration_status = kNotCalibrated;
static void Set_Event(AlarmEvent event_type)
{
if (event_type < kMaxEventcnt)
@@ -118,7 +119,7 @@ int _Self_Check_Mode(void)
rt_thread_mdelay(2000);
// 第5s关闭电磁阀
LOG_I("自检电磁阀动作");
-
+
LOG_I("自检风机动作");
return RT_EOK;
@@ -139,261 +140,299 @@ void Work_Cnt_Timer_Callback(void *parameter)
int main(void)
{
// 定义超时时间,单位为毫秒
-#define TIMEOUT_MS 10000
+#define TIMEOUT_MS 3 * 60 * 1000
#define WORK_TIMER_CNT (1000 * 60 * 60 * 24)
-
rt_err_t result = RT_EINVAL;
rt_uint32_t received_event;
- rt_kprintf("JT-DT-YD4N02A Software version: %02X", (uint8_t)Flash_Get_SysCfg(kSwVerId));
+ rt_kprintf("JT-DT-YD4N02A Software version: %02X\r\n", (uint8_t)Flash_Get_SysCfg(kSwVerId));
// 读取历史记录总数
Flash_GetTotalRecord(&TotalRecords);
-
- 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_PERIODIC);
- rt_timer_start(&work_cnt_timer);
- if (Get_VIN_VoltageInt1000x() > 10000)
+ g_Calibration_status = Flash_Get_Calibration_State();
+ if (g_Calibration_status == kNotCalibrated)//没标定
{
- // 检测上电/掉电复位标志
- if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) // TODO:这块超级电容会造成掉电重启,并且标志是上电复位,只能通过其超级电容造成复位时事件创建失败进行判断,不治本
+ LED_STOP(r);
+ LED_STOP(y);
+ LED_CTRL(g, "1000,500", -1);
+ LED_START(g);
+
+ uint16_t ticks = 0, gas_calibration_voltage;
+ while (1)
{
- Send_Laser_Alarm_Event(kPowerOnEvent);
- TotalRecords.power_on++;
- RCC_ClearFlag();
- }
- else
- {
- Send_Laser_Alarm_Event(kPreheatingEvent); // 这一句的作用是设备不是掉电重启的情况,直接进入预热模式
+ gas_calibration_voltage = Get_Gas_VoltageInt1000x();
+ LOG_D("ticks[%d] gas_calibration_voltage = %d", ticks++, gas_calibration_voltage);
+
+ if (g_Calibration_status == kNotCalibrated)//没标定
+ {
+ if (ticks > TIMEOUT_MS)
+ {
+ if(gas_calibration_voltage > (MQ_VOLTAGE_ALARM_DEFAULT - 500)
+ && gas_calibration_voltage < (MQ_VOLTAGE_ALARM_DEFAULT + 500))
+ {
+ uint8_t calibration_buf[2] = {0};
+ calibration_buf[0] = gas_calibration_voltage << 8;// 低字节
+ calibration_buf[1] = gas_calibration_voltage >> 8;//高字节
+ LOG_D("calibration_buf[0] = %X calibration_buf[1] = %X", calibration_buf[0], calibration_buf[1]);
+ Flash_Sys_Cfg(kAlarmLValueId, calibration_buf, 2);
+ // 标定完成打开绿灯常亮,蜂鸣器叫一下
+ BEEP_CALIBRATION_OK;
+ LED_STOP(g);
+ LED_ON(g);
+ Flash_Set_Calibration_State(kSysGasCalibStatus);
+ g_Calibration_status = kSysGasCalibStatus;
+ }
+ }
+ }
+ rt_thread_mdelay(1000);
}
}
else
{
- LOG_D("欠压复位\r\n");
- }
-
- while (1)
- {
- result = rt_event_recv(&alarm_event,
- Get_Sys_Event_Flag(kPowerOnEvent) | // 上电
- Get_Sys_Event_Flag(kPowerDownEvent) | // 掉电
- Get_Sys_Event_Flag(kPreheatingEvent) | // 预热
- Get_Sys_Event_Flag(kNormalDetectionEvents) | // 正常检测
- Get_Sys_Event_Flag(kAlarmExceptionEvent) | // 寿命到期
- Get_Sys_Event_Flag(kAlarmEvent) | // 报警
- Get_Sys_Event_Flag(kAlarmRcyEvent) | // 报警恢复
- Get_Sys_Event_Flag(kSelfCheckEvent) | // 自检
- Get_Sys_Event_Flag(kFaultEvent) | // 故障模式
- Get_Sys_Event_Flag(kFaultRcyEvent) | // 故障恢复
- Get_Sys_Event_Flag(KMuteEvent), // 消音
- RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
- RT_WAITING_FOREVER, &received_event);
- if (result == RT_EOK)
+ SYS_EventInit();
+ work_duration = Flash_Get_WorkDuration();
+ rt_timer_init(&work_cnt_timer,
+ "work_cnt_timer",
+ Work_Cnt_Timer_Callback,
+ RT_NULL,
+ WORK_TIMER_CNT,
+ RT_TIMER_FLAG_PERIODIC);
+ rt_timer_start(&work_cnt_timer);
+ if (Get_VIN_VoltageInt1000x() > 10000)
{
- if (is_event_initialized == RT_TRUE)
+ // 检测上电/掉电复位标志
+ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) // TODO:这块超级电容会造成掉电重启,并且标志是上电复位,只能通过其超级电容造成复位时事件创建失败进行判断,不治本
{
- if (received_event & Get_Sys_Event_Flag(kPowerOnEvent)) // 上电
+ Send_Laser_Alarm_Event(kPowerOnEvent);
+ TotalRecords.power_on++;
+ RCC_ClearFlag();
+ }
+ else
+ {
+ Send_Laser_Alarm_Event(kPreheatingEvent); // 这一句的作用是设备不是掉电重启的情况,直接进入预热模式
+ }
+ }
+ else
+ {
+ LOG_D("欠压复位\r\n");
+ }
+
+ while (1)
+ {
+ result = rt_event_recv(&alarm_event,
+ Get_Sys_Event_Flag(kPowerOnEvent) | // 上电
+ Get_Sys_Event_Flag(kPowerDownEvent) | // 掉电
+ Get_Sys_Event_Flag(kPreheatingEvent) | // 预热
+ Get_Sys_Event_Flag(kNormalDetectionEvents) | // 正常检测
+ Get_Sys_Event_Flag(kAlarmExceptionEvent) | // 寿命到期
+ Get_Sys_Event_Flag(kAlarmEvent) | // 报警
+ Get_Sys_Event_Flag(kAlarmRcyEvent) | // 报警恢复
+ Get_Sys_Event_Flag(kSelfCheckEvent) | // 自检
+ Get_Sys_Event_Flag(kFaultEvent) | // 故障模式
+ Get_Sys_Event_Flag(kFaultRcyEvent) | // 故障恢复
+ Get_Sys_Event_Flag(KMuteEvent), // 消音
+ RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
+ RT_WAITING_FOREVER, &received_event);
+ if (result == RT_EOK)
+ {
+ if (is_event_initialized == RT_TRUE)
{
- LOG_D("上电模式");
- LOG_D("is_event_initialized :%d", is_event_initialized);
- SysControl.status = kPowerOnEvent;
-
- Flash_Write_Record(kRecordPowerOn);
- Send_Laser_Alarm_Event(kPreheatingEvent);
- }
- else if (received_event & Get_Sys_Event_Flag(kPreheatingEvent)) // 预热
- {
- LOG_D("预热模式");
-
- SysControl.last_status = SysControl.status;
- SysControl.status = kPreheatingEvent;
-
- LED_STOP(r);
- LED_STOP(g);
- LED_STOP(y);
- LED_CTRL(g, "500,2500", -1);
- LED_START(g);
- rt_thread_mdelay(1000);
- LED_CTRL(y, "500,2500", -1);
- LED_START(y);
- rt_thread_mdelay(1000);
- LED_CTRL(r, "500,2500", -1);
- LED_START(r);
- rt_thread_mdelay(1000);
-
- BEEP_PREAT_OK;
- LED_STOP(r);
- LED_STOP(g);
- LED_STOP(y);
- LOG_D("预热完成");
- Send_Laser_Alarm_Event(kNormalDetectionEvents);
-
- }
- else if (received_event & Get_Sys_Event_Flag(kNormalDetectionEvents)) // 正常检测
- {
- LOG_D("正常检测模式");
-
- SysControl.last_status = SysControl.status;
- SysControl.status = kNormalDetectionEvents;
-#if (NB_MODULE_SWITCH == 1)
- if (mb26_conncet_tcp_flag)
+ if (received_event & Get_Sys_Event_Flag(kPowerOnEvent)) // 上电
{
- LED_G_INTERNET;
+ 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)) // 预热
{
-#endif
- LED_G_NORMAL;
-#if (NB_MODULE_SWITCH == 1)
- }
-#endif
- rt_thread_mdelay(10);
- LOG_D("LED_G_NORMAL");
- }
- else if (received_event & Get_Sys_Event_Flag(kAlarmExceptionEvent)) // 浓度异常
- {
- LOG_D("浓度异常模式");
+ LOG_D("预热模式");
- SysControl.last_status = SysControl.status;
- SysControl.status = kAlarmExceptionEvent;
+ SysControl.last_status = SysControl.status;
+ SysControl.status = kPreheatingEvent;
- 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;
-
- Flash_Write_Record(kRecordAlarm); // 写入flash报警信息
-
- LED_R_ALARM;
- BEEP_ALARM;
-
-#if (NB_MODULE_SWITCH == 1)
- Mb26_Send_Event(kMb26AlarmEvent);
-#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 (NB_MODULE_SWITCH == 1)
- Mb26_Send_Event(kMb26AlarmRcyEvent);
-#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 (NB_MODULE_SWITCH == 1)
- Mb26_Send_Event(kMb26FaultEvent);
-#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 (NB_MODULE_SWITCH == 1)
- Mb26_Send_Event(kMb26FaultRcyEvent);
-#endif
- }
- else if (received_event & Get_Sys_Event_Flag(KMuteEvent)) // 消音
- {
- LOG_D("消音模式");
- SysControl.last_status = SysControl.status;
- SysControl.status = KMuteEvent;
-
-#if (NB_MODULE_SWITCH == 1)
- Mb26_Send_Event(kMb26SilenceEvent);
-#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 (NB_MODULE_SWITCH == 1)
- Mb26_Send_Event(kMb26PowerDownEvent);
-#endif
- LOG_D("Enter AnalogWatchdog Interrupt");
-
- Flash_Set_WorkDuration(work_duration); // 重启前保存参数
- // 等待180s,要是还没断电就重启
- for (uint8_t i = 0; i < 180; i++)
- {
+ LED_STOP(r);
+ LED_STOP(g);
+ LED_STOP(y);
+ LED_CTRL(g, "500,2500", -1);
+ LED_START(g);
rt_thread_mdelay(1000);
- LOG_D(" %d s", i);
+ LED_CTRL(y, "500,2500", -1);
+ LED_START(y);
+ rt_thread_mdelay(1000);
+ LED_CTRL(r, "500,2500", -1);
+ LED_START(r);
+ rt_thread_mdelay(1000);
+
+ BEEP_PREAT_OK;
+ LED_STOP(r);
+ LED_STOP(g);
+ LED_STOP(y);
+ LOG_D("预热完成");
+ Send_Laser_Alarm_Event(kNormalDetectionEvents);
}
- NVIC_SystemReset(); // 直接重启系统
- }
- else if (received_event & Get_Sys_Event_Flag(kSelfCheckEvent)) // 自检
- {
- LOG_D("自检模式");
-
- SysControl.last_status = SysControl.status;
- LOG_D("Self Check Mode SysControl.last_status:%d", SysControl.last_status);
- SysControl.status = kSelfCheckEvent;
-
- _Self_Check_Mode();
- Send_Laser_Alarm_Event(SysControl.last_status);
-#if (NB_MODULE_SWITCH == 1)
- Mb26_Send_Event(kMb26SelfCheckEvent);
-#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)
+ else if (received_event & Get_Sys_Event_Flag(kNormalDetectionEvents)) // 正常检测
{
- Flash_Write_Record(kRecordSensoEndOfLife);
+ LOG_D("正常检测模式");
+
+ SysControl.last_status = SysControl.status;
+ SysControl.status = kNormalDetectionEvents;
+#if (NB_MODULE_SWITCH == 1)
+ if (mb26_conncet_tcp_flag)
+ {
+ LED_G_INTERNET;
+ }
+ else
+ {
+#endif
+ LED_G_NORMAL;
+#if (NB_MODULE_SWITCH == 1)
+ }
+#endif
+ rt_thread_mdelay(10);
+ 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;
+
+ Flash_Write_Record(kRecordAlarm); // 写入flash报警信息
+
+ LED_R_ALARM;
+ BEEP_ALARM;
+
+#if (NB_MODULE_SWITCH == 1)
+ Mb26_Send_Event(kMb26AlarmEvent);
+#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 (NB_MODULE_SWITCH == 1)
+ Mb26_Send_Event(kMb26AlarmRcyEvent);
+#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 (NB_MODULE_SWITCH == 1)
+ Mb26_Send_Event(kMb26FaultEvent);
+#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 (NB_MODULE_SWITCH == 1)
+ Mb26_Send_Event(kMb26FaultRcyEvent);
+#endif
+ }
+ else if (received_event & Get_Sys_Event_Flag(KMuteEvent)) // 消音
+ {
+ LOG_D("消音模式");
+ SysControl.last_status = SysControl.status;
+ SysControl.status = KMuteEvent;
+
+#if (NB_MODULE_SWITCH == 1)
+ Mb26_Send_Event(kMb26SilenceEvent);
+#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 (NB_MODULE_SWITCH == 1)
+ Mb26_Send_Event(kMb26PowerDownEvent);
+#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(" %d s", i);
+ }
+ NVIC_SystemReset(); // 直接重启系统
+ }
+ else if (received_event & Get_Sys_Event_Flag(kSelfCheckEvent)) // 自检
+ {
+ LOG_D("自检模式");
+
+ SysControl.last_status = SysControl.status;
+ LOG_D("Self Check Mode SysControl.last_status:%d", SysControl.last_status);
+ SysControl.status = kSelfCheckEvent;
+
+ _Self_Check_Mode();
+ Send_Laser_Alarm_Event(SysControl.last_status);
+#if (NB_MODULE_SWITCH == 1)
+ Mb26_Send_Event(kMb26SelfCheckEvent);
+#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;
}
}
}
diff --git a/applications/user_sys.c b/applications/user_sys.c
index 38d1f7a..9808fe3 100644
--- a/applications/user_sys.c
+++ b/applications/user_sys.c
@@ -13,6 +13,7 @@
#include "ctype.h"
#include "rtthread.h"
#include "stdlib.h"
+#include "bsp_flash.h"
volatile rt_uint16_t work_duration = 1; // 工作时长
volatile rt_uint8_t device_life_check = 0;
diff --git a/applications/user_sys.h b/applications/user_sys.h
index 50d7631..5e6e5bb 100644
--- a/applications/user_sys.h
+++ b/applications/user_sys.h
@@ -2,8 +2,8 @@
* @Author: mbw
* @Date: 2024-10-09 08:42:14
* @LastEditors: mbw && 1600520629@qq.com
- * @LastEditTime: 2024-11-12 14:19:50
- * @FilePath: \JT-DT-YD4N02A_RTT_MRS\applications\user_sys.h
+ * @LastEditTime: 2024-12-01 14:18:19
+ * @FilePath: \ble_bjq_ch303rct6_ml307\applications\user_sys.h
* @Description:
* @
* @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
@@ -12,7 +12,6 @@
#define __USER_SYS_H__
#include "rtdef.h"
-#include "bsp_flash.h"
#define SYS_PREHEAT_TIME_S (10U)
@@ -37,45 +36,27 @@ typedef enum
kMaxEventcnt,
} AlarmEvent;
+// 定义系统状态枚举类型
+typedef enum
+{
+ kNotCalibrated = 0, // 未标定
+ kSysGasCalibStatus, // 已经标定
+}TeCalibrationStatus;
// 定义开关状态枚举类型
typedef enum
{
kStatusOff = 0, // 关闭状态
kStatusOn // 打开状态
} TeStatus;
+
// 定义系统标志位结构体
typedef struct
{
TeStatus valve_status; // 阀门状态
TeStatus relay_status; // 继电器状态
} TsDeviceStatus;
-
-
-// 定义系统状态枚举类型
-typedef enum
-{
- kSysToBeCalibStatus = 0, // 系统待校准状态
- kSysGasCalibStatus, // 气体校准状态
- KSysTestStatus, // 测试状态
-
- kSysSelfCheckingStatus, // 自检状态
-
- kSysPowerUpStatus, // 上电状态
- kSysPowerDownStatus, // 下电状态
-
- kSysStartupPreheatingStatus, // 启动预热状态
- kSysRuningStatus, // 运行中状态
-
- kSysAlarmStatus, // 报警状态
- kSysMuteStatus, // 消音状态
-
- kSysFaultStatus, // 故障状态
- kSysSensorEndOfLifeStatus, // 传感器寿命结束状态
-
- kSysRestoreFactoryStatus, // 恢复出厂设置状态
-}TeSysStatus;
-
+
// 定义系统控制结构体
typedef struct
{
@@ -85,19 +66,24 @@ typedef struct
extern volatile rt_uint16_t work_duration;//工作天数
extern volatile rt_uint8_t device_state_flag;
-
+extern TeCalibrationStatus g_Calibration_status;
extern struct rt_event alarm_event;
extern TsSysControl SysControl;
+
+
+
void Send_Laser_Alarm_Event(AlarmEvent event);
-
-
unsigned short crc1021(const char *data, unsigned int length);
void HexStrToBytes(const char *hexString, unsigned char *byteArray, size_t byteCount);
void String2Hex(char *hex_arry, char *str);
unsigned int VerToHex(const char *version);
int Extract_Value(const char *str, const char *key);
int _Self_Check_Mode(void);
-int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *hex_array);
+
+
+
+
+
#endif //!__USER_SYS_H__
diff --git a/bsp/inc/bsp_beep.h b/bsp/inc/bsp_beep.h
index 8b0a579..7714653 100644
--- a/bsp/inc/bsp_beep.h
+++ b/bsp/inc/bsp_beep.h
@@ -29,6 +29,13 @@ extern agile_led_t *beep;
} while (0U)
/************************预设的一些鸣叫模式**************/
+#define BEEP_CALIBRATION_OK \
+ do \
+ { \
+ BEEP_CTRL("1000,100", 1); \
+ BEEP_START; \
+ } while (0U)
+
#define BEEP_PREAT_OK \
do \
{ \
diff --git a/bsp/inc/bsp_flash.h b/bsp/inc/bsp_flash.h
index fd7ac29..88eaee4 100644
--- a/bsp/inc/bsp_flash.h
+++ b/bsp/inc/bsp_flash.h
@@ -14,6 +14,8 @@
#include "board.h"
#include "rtdef.h"
#include "bsp_hr.h"
+#include "user_sys.h"
+
#define FLASH_PAGE_SIZE (256U)
#define FLASH_PAGE_HR_RECORD_NUM (25U)
@@ -122,7 +124,9 @@
#define FLASH_SERVER_ADDR_ADDR (FLASH_WORK_TIME_ADDR + FLASH_WORK_TIME_LEN)
#define FLASH_SERVER_LEN (6) //FF.FF.FF.FF:FFFF
-
+/*标定状态*/
+#define FLASH_CALIBRATION_STATUS_ADDR (FLASH_SERVER_ADDR_ADDR + FLASH_SERVER_LEN)
+#define FLASH_CALIBRATION_STATUS_LEN (1)
@@ -236,8 +240,8 @@ typedef struct __attribute__((packed))
{
rt_uint8_t hw_ver; // 硬件版本号
rt_uint8_t sw_ver; // 软件版本号
- rt_uint8_t alarm_l_value; // 报警低阈值
- rt_uint8_t alarm_h_value; // 报警高阈值
+ rt_uint16_t alarm_l_value; // 报警低阈值
+ rt_uint16_t alarm_h_value; // 报警高阈值
rt_uint8_t temp_alarm_threshold;//温度报警阈值
rt_uint16_t nb_upload_cycle; // NB上传周期
rt_uint8_t nb_retry; // 重试次数
@@ -253,7 +257,9 @@ struct flash_sever_info
char server_url[64];
char server_port[8];
};
+
extern struct flash_sever_info sever_info;
+
void Flash_Write_Record(TeRecord record);
int Get_Nb_Imei(char *buf, rt_size_t len);
int Get_Nb_Imsi(char *buf, rt_size_t len);
@@ -295,8 +301,23 @@ int Flash_Set_Sever_Data(rt_uint8_t *data);
rt_uint16_t Flash_Get_WorkDuration(void);
int Flash_Set_WorkDuration(rt_uint16_t value);
+TeCalibrationStatus Flash_Get_Calibration_State(void);
+int Flash_Set_Calibration_State(TeCalibrationStatus status);
+
+
+
+
+
+
+
+
+
+
+
#endif //!@__BSP_FLASH_H__
+
+
diff --git a/bsp/src/bsp_flash.c b/bsp/src/bsp_flash.c
index 4b20745..453b477 100644
--- a/bsp/src/bsp_flash.c
+++ b/bsp/src/bsp_flash.c
@@ -1,12 +1,10 @@
#include "bsp_flash.h"
#include "lwutil.h"
#include "bsp_rtc.h"
-// #include "bsp_wdg.h"
#include "bsp_hr.h"
-#include "at_device_mb26.h"
+ #include "at_device_mb26.h"
#include
#include
-#include "user_sys.h"
#define LOG_TAG "bsp_flash"
#define LOG_LVL LOG_LVL_DBG
@@ -14,6 +12,7 @@
#include
+extern int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *hex_array);
#define GETATTR(info, id) ((id) == kHwVerId ? (&(info)->hw_ver) \
: (id) == kSwVerId ? (&(info)->sw_ver) \
: (id) == kAlarmLValueId ? (&(info)->alarm_l_value) \
@@ -85,11 +84,12 @@ rt_uint8_t sys_sw_ver = 0x11;
rt_uint8_t sys_nb_retry = 0x03; // 重试次数3次
rt_uint16_t sys_nb_upload_cycle = 0x7800; // 120分钟一次 ,低位在前,高为在后,为了和服务器下发时保持一致,有利于读取
rt_uint16_t sys_alarm_h_value = 0x0032; // 50
-rt_uint16_t sys_alarm_l_value = 0x000A; // 10
+rt_uint16_t sys_alarm_l_value = 0x09C4; // 10
rt_uint8_t sys_temp_alarm_threshold = 0x32;
rt_uint8_t sys_emagnetic_switch = 0x04; // 具备阀门功能
rt_uint8_t sys_relay_switch = 0x04; // 具备继电器功能
-struct flash_sever_info sever_info =
+
+struct flash_sever_info sever_info =
{
.server_url = "47.94.169.135",
.server_port = "7150",
@@ -322,6 +322,26 @@ int Flash_Set_Sever_Data(rt_uint8_t *data)
return Flash_Write_ConfigInfo(page_buf);
}
+
+TeCalibrationStatus Flash_Get_Calibration_State(void)
+{
+ return *(rt_uint8_t *)FLASH_CALIBRATION_STATUS_ADDR;
+}
+
+int Flash_Set_Calibration_State(TeCalibrationStatus status)
+{
+ rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0};
+ rt_uint8_t in_page_offset = (FLASH_CALIBRATION_STATUS_ADDR - FLASH_CONFIG_INFO_START_ADDR);
+
+ Flash_ErasePage_ReadConfigInfo(page_buf);
+ //*将传入的数据写到flash地址中
+
+ page_buf[in_page_offset] = status;
+
+ return Flash_Write_ConfigInfo(page_buf);
+}
+
+
/**
* @description: Flash Erase Page
* @param {TeRecord} record
@@ -730,8 +750,19 @@ rt_uint8_t Flash_Sys_Cfg(TeFlashCfgInfoId id, rt_uint8_t *buf, rt_size_t len)
size_t Flash_Get_SysCfg(TeFlashCfgInfoId id)
{
size_t value = 0;
- rt_memcpy(&value, (void *)hr_sys_cfg_info_addr[id], hr_sys_cfg_info_len[id]);
-
+ if (hr_sys_cfg_info_len[id] == 1)
+ {
+ return *(rt_uint8_t *)hr_sys_cfg_info_addr[id];
+ }
+ else if (hr_sys_cfg_info_len[id] == 2)
+ {
+ rt_uint8_t buf[2] = {0};
+
+ rt_memcpy(&buf, (rt_uint8_t *)hr_sys_cfg_info_addr[id], hr_sys_cfg_info_len[id]);
+ value = buf[0] | (buf[1] << 8);
+
+ LOG_D("buf[0]= %u, buf[1]: %u", buf[0], buf[1]);
+ }
LOG_D("value: %u", value);
return value;
}
@@ -844,7 +875,8 @@ int BSP_Flash_Init(void)
{
LOG_D("Flash_Set_Sever_Data error!");
}
-
+ Flash_Set_Calibration_State(kNotCalibrated);//未标定状态
+
Flash_Write(FLASH_HW_VER_ADDR, (rt_uint8_t *)&sci,
(sizeof(sys_config_info) - 50));
diff --git a/bsp/src/bsp_mb26.c b/bsp/src/bsp_mb26.c
index 9d09938..9250349 100644
--- a/bsp/src/bsp_mb26.c
+++ b/bsp/src/bsp_mb26.c
@@ -8,26 +8,6 @@
*
* Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
*/
-/*
- * @Author: mbw
- * @Date: 2024-10-09 08:42:14
- * @LastEditors: mbw && 1600520629@qq.com
- * @LastEditTime: 2024-11-29 14:38:14
- * @FilePath: \JT-DT-YD4N02A_RTT_MRS\bsp\src\bsp_mb26.c
- * @Description:
- *
- * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
- */
-/*
- * Copyright (c) 2006-2023, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2019-12-13 qiyongzhong first version
- */
-
#include
#include "drv_gpio.h"
#include "bsp_mb26.h"
diff --git a/bsp/src/bsp_mq.c b/bsp/src/bsp_mq.c
index c34f5ef..8378325 100644
--- a/bsp/src/bsp_mq.c
+++ b/bsp/src/bsp_mq.c
@@ -172,6 +172,7 @@ static void Sensor_detection_thread_entry(void *param)
int BSP_MQ_Init(void)
{
Sensor_device.alarm_value = Flash_Get_SysCfg(kAlarmLValueId);
+ LOG_D("报警阈值为:%d", Sensor_device.alarm_value);
rt_thread_init(&Sensor_Thread, //可以用定时器做,没必要线程
"sensor_thread",
Sensor_detection_thread_entry,
diff --git a/rt-thread/include/rtdef.h b/rt-thread/include/rtdef.h
index 0de2c22..442ee58 100644
--- a/rt-thread/include/rtdef.h
+++ b/rt-thread/include/rtdef.h
@@ -54,6 +54,7 @@
#include
#include
#include
+
#endif /* RT_USING_LIBC */
#ifdef __cplusplus