This commit is contained in:
小马_666 2024-12-30 17:51:13 +08:00
parent 4cd6fccfa8
commit dac836d401
9 changed files with 568 additions and 833 deletions

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-10-23 17:14:16
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-17 11:47:24
* @LastEditTime: 2024-12-25 17:03:21
* @FilePath: \ble_bjq_ch303rct6_ml307\applications\main.c
* @Descrt_thread_
*
@ -40,7 +40,7 @@ rt_bool_t is_event_initialized = RT_FALSE; // 是否初始化完成
TsSysControl SysControl;
struct rt_timer work_cnt_timer;
struct rt_timer preheat_timer;//传统模式需要进行预热,
struct rt_timer preheat_timer; // 传统模式需要进行预热,
void Send_Laser_Alarm_Event(AlarmEvent event_type);
@ -170,7 +170,9 @@ int main(void)
Flash_GetTotalRecord(&TotalRecords);
g_Calibration_status = Flash_Get_Calibration_State();
rt_thread_mdelay(10);
if (g_Calibration_status == kNotCalibrated)//没标定
while (1)
{
if (g_Calibration_status == kNotCalibrated) // 没标定
{
LED_STOP(r);
LED_STOP(y);
@ -183,12 +185,11 @@ int main(void)
gas_calibration_voltage = Get_Gas_VoltageAdcInt1000x();
LOG_D("ticks[%d] gas_calibration_voltage = %d", ticks++, gas_calibration_voltage);
if (g_Calibration_status == kNotCalibrated)//没标定
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))
if (gas_calibration_voltage > (MQ_VOLTAGE_ALARM_DEFAULT - 800) && gas_calibration_voltage < (MQ_VOLTAGE_ALARM_DEFAULT + 800))
{
uint8_t calibration_buf[2] = {0};
calibration_buf[0] = gas_calibration_voltage & 0xFF; // 低字节
@ -201,6 +202,8 @@ int main(void)
LED_ON(g);
Flash_Set_Calibration_State(kSysGasCalibStatus);
g_Calibration_status = kSysGasCalibStatus;
break;
}
}
}
@ -216,14 +219,14 @@ int main(void)
Work_Cnt_Timer_Callback,
RT_NULL,
WORK_TIMER_CNT,
RT_TIMER_FLAG_SOFT_TIMER|RT_TIMER_FLAG_PERIODIC);
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);
RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT);
if (Get_VIN_VoltageInt1000x() > 10000)
{
// 检测上电/掉电复位标志
@ -250,7 +253,7 @@ int main(void)
Get_Sys_Event_Flag(kPowerDownEvent) | // 掉电
Get_Sys_Event_Flag(kPreheatingEvent) | // 预热
Get_Sys_Event_Flag(kNormalDetectionEvents) | // 正常检测
Get_Sys_Event_Flag(kAlarmExceptionEvent) | // 寿命到期
Get_Sys_Event_Flag(kSensorFailureEvent) | // 寿命到期
Get_Sys_Event_Flag(kAlarmEvent) | // 报警
Get_Sys_Event_Flag(kAlarmRcyEvent) | // 报警恢复
Get_Sys_Event_Flag(kSelfCheckEvent) | // 自检
@ -283,13 +286,28 @@ int main(void)
}
else if (received_event & Get_Sys_Event_Flag(kNormalDetectionEvents)) // 正常检测
{
LOG_D("正常检测模式");
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("浓度异常模式");
@ -399,10 +417,8 @@ int main(void)
Ml307_Send_Event(kMl307PowerDownEvent);
#endif
LOG_D("Enter AnalogWatchdog Interrupt");
Flash_Set_WorkDuration(work_duration); // 重启前保存参数
// 等待180s,要是还没断电就重启
for (uint8_t i = 0; i < 180; i++)
// 等待30s,要是还没断电就重启
for (uint8_t i = 0; i < 30; i++)
{
rt_thread_mdelay(1000);
LOG_D(" %d s", i);
@ -418,7 +434,7 @@ int main(void)
SysControl.status = kSelfCheckEvent;
_Self_Check_Mode();
Send_Laser_Alarm_Event(SysControl.last_status);
Send_Laser_Alarm_Event(kNormalDetectionEvents);
#if (IOT_MODULE_SWITCH == 1)
Ml307_Send_Event(kMl307SelfCheckEvent);
#endif
@ -441,6 +457,7 @@ int main(void)
}
}
}
}
}
#ifdef TEST_ENABLE
@ -471,7 +488,7 @@ static void SYS_Set_RtcProductTime(int argc, char **argv)
}
MSH_CMD_EXPORT(SYS_Set_RtcProductTime, "SYS_Set_RtcProductTime");
//测试系统标定值修改
// 测试系统标定值修改
static void TEST_SYS_Calibartion(int argc, char **argv)
{
if (argc == 2)

View File

@ -32,7 +32,7 @@ typedef enum
kPowerDownEvent,
kSelfCheckEvent,
KMuteEvent,
kAlarmExceptionEvent, // alarm_exception
kAlarmExceptionEvent, //浓度异常报警
kMaxEventcnt,
} AlarmEvent;

View File

@ -26,7 +26,7 @@
// MQ采样间隔
#define MQ_SAMPLING_INTERVAL_MS (100U)
#define SENSOR_SAMPLING_TIMS (5U)
#define SENSOR_SAMPLING_TIMS (6U)
// MQ采样时间窗口
#define MQ_SAMPLING_S (uint8_t)(3U)

View File

@ -2,7 +2,7 @@
* @Author : stark1898y 1658608470@qq.com
* @Date : 2024-09-04 13:33:49
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-05 16:31:00
* @LastEditTime: 2024-12-27 13:03:07
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\at_device_ml307.c
* @Description :
*
@ -51,6 +51,8 @@ ml307_sys_info ml307 = {0};
struct rt_completion ml307_init_complate;
volatile rt_uint8_t socket_id = 0;
rt_sem_t ml307_connect_sem;
static rt_bool_t ml307_get_power_state(struct at_device *device)
{
struct at_device_ml307 *ml307 = RT_NULL;
@ -102,24 +104,6 @@ rt_err_t Ml307_Reset(struct at_device *device)
{
at_client_send("AT+MREBOOT\r\n", rt_strlen("AT+MREBOOT\r\n"));
// struct at_device_ml307 *ml307 = RT_NULL;
// ml307 = (struct at_device_ml307 *) device->user_data;
// do{
/* not nead to set pin configuration for ml307 device power on */
// if (ml307->power_status_pin == -1 || ml307->rst_pin == -1)
// {
// return;
// }
// if(ml307_get_power_state(device) == ML307_POWER_OFF)
// {
// return;
// }
// rt_pin_write(ml307->rst_pin, PIN_HIGH);
// rt_thread_mdelay(RT_TICK_PER_SECOND/2);
// rt_pin_write(ml307->rst_pin, PIN_LOW);
// rt_thread_mdelay(100);
// }while(ml307_get_power_state(device) != ML307_POWER_OFF);
return RT_EOK;
}
@ -131,100 +115,6 @@ void TEST_Ml307_Reset()
MSH_CMD_EXPORT(TEST_Ml307_Reset, "test_ml307_reset");
#endif
#if 0
static int ml307_sleep(struct at_device *device)
{
at_response_t resp = RT_NULL;
struct at_device_ml307 *ml307 = RT_NULL;
ml307 = (struct at_device_ml307 *)device->user_data;
if (!ml307->power_status) // power off
{
return (RT_EOK);
}
if (ml307->sleep_status) // is sleep status
{
return (RT_EOK);
}
resp = at_create_resp(64, 0, rt_tick_from_millisecond(300));
if (resp == RT_NULL)
{
LOG_D("no memory for resp create.");
at_delete_resp(resp);
return (-RT_ERROR);
}
/* enable sleep mode */
// Sleep 轻度睡眠
if (at_obj_exec_cmd(device->client, resp, "AAT+MLPMCFG=\"sleepmode\",1,1") != RT_EOK)
{
LOG_D("enable sleep set.\"AT+MLPMCFG=\"sleepmode\",1,1\" execute fail.");
at_delete_resp(resp);
return (-RT_ERROR);
}
/* enable PSM mode */
if (at_obj_exec_cmd(device->client, resp, "AT+MLPMCFG=\"psind\",1") != RT_EOK)//启用配置协议栈低功耗状态是否上报URC)
{
LOG_D("enable sleep URC.\"AAT+MLPMCFG=\"psind\",1\" execute fail.");
at_delete_resp(resp);
return (-RT_ERROR);
}
ml307->sleep_status = RT_TRUE;
at_delete_resp(resp);
return (RT_EOK);
}
#endif
#if 0
static int ml307_wakeup(struct at_device *device)
{
at_response_t resp = RT_NULL;
struct at_device_ml307 *ml307 = RT_NULL;
ml307 = (struct at_device_ml307 *)device->user_data;
if (!ml307->power_status) // power off
{
LOG_E("the power is off and the wake-up cannot be performed");
return (-RT_ERROR);
}
if (!ml307->sleep_status) // no sleep status
{
return (RT_EOK);
}
resp = at_create_resp(64, 0, rt_tick_from_millisecond(300));
if (resp == RT_NULL)
{
LOG_D("no memory for resp create.");
at_delete_resp(resp);
return (-RT_ERROR);
}
if (ml307->wkp_pin != -1)
{
rt_pin_write(ml307->wkp_pin, PIN_LOW);
rt_thread_mdelay(100);
rt_pin_write(ml307->wkp_pin, PIN_HIGH);
rt_thread_mdelay(100);
rt_pin_write(ml307->wkp_pin, PIN_LOW);
}
/* disable sleep mode */
if (at_obj_exec_cmd(device->client, resp, "AT+MLPMCFG=\"sleepmode\",0,1") != RT_EOK)
{
LOG_D("wake up fail. \"AT+MLPMCFG=\"sleepmode\",0,1\" execute fail.");
at_delete_resp(resp);
return (-RT_ERROR);
}
ml307->sleep_status = RT_FALSE;
at_delete_resp(resp);
return (RT_EOK);
}
#endif
static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t size)
{
int id;
@ -276,10 +166,6 @@ static void urc_device_reset(struct at_client *client, const char *data, rt_size
{
LOG_D("device reset");
ml307_conncet_tcp_flag = 0;
if (SysControl.status == kNormalDetectionEvents)
{
LED_G_NORMAL;
}
}
static void urc_tcp_connect_state(struct at_client *client, const char *data, rt_size_t size)
@ -288,10 +174,11 @@ static void urc_tcp_connect_state(struct at_client *client, const char *data, rt
if (sscanf(data, "+MIPOPEN:%d,%d", &id, &err_code) == 2)
{
if ((id == socket_id) && (err_code == 0))
if (id == socket_id)
{
LOG_D("ml307 connect to tcp server success");
ml307_conncet_tcp_flag = 1;
rt_sem_release(ml307_connect_sem);
}
}
}
@ -332,31 +219,11 @@ static void urc_tcp_disconnect(struct at_client *client, const char *data, rt_si
}
}
// static void urc_tcp_send_check(struct at_client *client, const char *data, rt_size_t size)
// {
// size_t id, len;
// if (sscanf(data, "+MIPSEND:%d,%d", &id, &len) == 2)
// {
// if (id == socket_id)
// {
// if (len == )
// {
// }
// LOG_D("ml307 send data success");
// }
// }
// }
static const struct at_urc urc_table[] = {
// {"+NSONMI:", "\r\n", urc_tcp_recv},
{"REBOOTING", "\r\n", urc_device_reset}, // 这个是软件复位时,
{"+MIPOPEN:", "\r\n", urc_tcp_connect_state},
{"+MIPURC: \"disconn\"", "\r\n", urc_tcp_disconnect},
{"+MIPURC: \"rtcp\"", "\r\n", urc_tcp_recv},
// {"+MIPSEND:", "\r\n", urc_tcp_send_check},
};
static void show_resp_info(at_response_t resp)
{
@ -393,93 +260,30 @@ int at_device_ml307_disconnect_tcp(struct at_device *device)
return -RT_ERROR;
}
ml307_conncet_tcp_flag = 0;
if (SysControl.status == kNormalDetectionEvents)
{
LED_G_NORMAL;
}
show_resp_info(resp);
at_delete_resp(resp);
}
return RT_EOK;
}
#if 0
int at_device_ml307_socket_creat(struct at_device *device)
{
rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN, 4, AT_DEFAULT_TIMEOUT);
if (resp == RT_NULL)
{
LOG_E("No memory for response structure!");
at_delete_resp(resp);
return -RT_ENOMEM;
}
while (retry--)
{
if (at_obj_exec_cmd(device->client, resp, TCP_SOCKET_CREAT, TCP_SERVER_PORT) == RT_EOK)
{
if (at_resp_parse_line_args(resp, 2, "%d", &socket_id) > 0)
{
LOG_D("ml307 create tcp socket:%d", socket_id);
at_delete_resp(resp);
return RT_EOK;
}
else
{
LOG_E("ml307 create tcp socket failed. retry %d", retry);
}
}
}
at_delete_resp(resp);
Ml307_Reset(device);
return RT_ERROR;
}
#endif // 0
static int at_device_ml307_connect_tcp(struct at_device *device)
{
rt_err_t ret = RT_ERROR;
ASSERT(device);
rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
at_response_t resp = at_create_resp(64, 2, 2000);
at_response_t resp = at_create_resp(64, 2, 5000);
if (resp == RT_NULL)
{
LOG_E("No memory for response structure!");
at_delete_resp(resp);
return -RT_ENOMEM;
}
#if 0
if (at_device_ml307_socket_creat(device) != RT_EOK)
{
LOG_E("ml307 connect to tcp server failed.");
at_delete_resp(resp);
return -RT_ERROR;
}
// /* read data from tcp server */
// if (at_obj_exec_cmd(device->client, resp, TCP_READ_SET_CMD, socket_id, AT_CLIENT_RECV_BUFF_LEN) != RT_EOK)
// {
// at_delete_resp(resp);
// return RT_ERROR;
// }
/* enable tcp notification */
if (at_obj_exec_cmd(device->client, resp, TCP_SET_NSONMI, AT_NSONMI_MODE_DEFAULT) != RT_EOK)
{
at_delete_resp(resp);
return RT_ERROR;
}
#endif
if (Flash_Get_Sever_Addr_Info(&sever_info) != RT_EOK)
{
LOG_E("Get Sever Data Failed");
at_delete_resp(resp);
return RT_ERROR;
}
// rt_uint16_t sever_port = strtol(sever_info.server_port, RT_NULL, 10); // 将字符串转为十进制
LOG_D("sever_info.server_url:%s sever_info.server_port:%s", sever_info.server_url, sever_info.server_port);
for (size_t i = 0; i < retry; i++)
{
@ -487,27 +291,20 @@ static int at_device_ml307_connect_tcp(struct at_device *device)
{
if (at_resp_get_line_by_kw(resp, "OK") != RT_NULL)
{
rt_thread_mdelay(2000);
if (ml307_conncet_tcp_flag == RT_TRUE)
if (rt_sem_take(ml307_connect_sem, 5000) == RT_EOK)
{
LOG_D("ml307 connect to tcp server success");
ret = RT_EOK;
break;
}
}
else
{
ml307_conncet_tcp_flag = 0;
LOG_E("ml307 connect to tcp server failed.");
ret = -RT_ERROR;
LOG_E("ml307 connect to tcp server failed");
}
}
}
rt_thread_mdelay(3000);
}
if ((SysControl.status == kNormalDetectionEvents) && (ml307_conncet_tcp_flag == RT_FALSE))
{
LED_G_NORMAL;
}
at_delete_resp(resp);
return ret;
}
@ -518,10 +315,6 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
if (ml307_conncet_tcp_flag)
{
if (SysControl.status == kNormalDetectionEvents)
{
LED_G_INTERNET;
}
rt_uint8_t retry = 0;
rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
LOG_D("max_retry_count:%d", max_retry_count);
@ -535,6 +328,7 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
}
while (retry < max_retry_count)
{
if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, send_len, data) == RT_EOK)
{
size_t len = 0;
@ -544,10 +338,6 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
{
LOG_D("send data success, len:%d", len);
at_delete_resp(resp);
if (SysControl.status == kNormalDetectionEvents)
{
LED_G_NORMAL;
}
return RT_EOK;
}
@ -558,8 +348,8 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
retry++;
}
}
rt_thread_mdelay(2000);
retry++;
rt_thread_mdelay(1000);
}
at_delete_resp(resp);
return -RT_ERROR;
@ -567,10 +357,6 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
else
{
LOG_D("not connected tcp sever!");
if (SysControl.status == kNormalDetectionEvents)
{
LED_G_NORMAL;
}
return -RT_ERROR;
}
}
@ -592,21 +378,6 @@ static int ml307_check_link_status(struct at_device *device)
LOG_E("no memory for resp create.");
return -RT_ERROR;
}
// if (at_obj_exec_cmd(device->client, resp, "AT+MIPCALL?") < 0) // 建立模组应用层拨号连接
// {
// result = -RT_ERROR;
// goto __exit;
// }
// if (at_resp_parse_line_args_by_kw(resp, "+MIPCALL:", "+MIPCALL: %d,%*d,%*s", &link_stat) > 0)
// {
// if (link_stat == 1)
// {
// result = RT_EOK;
// }
// }
if (at_obj_exec_cmd(device->client, resp, "AT+CGACT?") < 0)
{
result = -RT_ERROR;
@ -690,49 +461,6 @@ static int ml307_netdev_set_info(struct netdev *netdev)
inet_aton(ipaddr, &addr);
netdev_low_level_set_ipaddr(netdev, &addr);
}
#if 0
/* set network interface device dns server */
{
#define DNS_ADDR_SIZE_MAX 16
char dns_server1[DNS_ADDR_SIZE_MAX] = {0}, dns_server2[DNS_ADDR_SIZE_MAX] = {0};
char dns_str[DNS_ADDR_SIZE_MAX*3] = {0};
at_resp_set_info(resp, ML307_DNS_RESP_SIZE, 0, ML307_INFO_RESP_TIMO);
/* send "AT+MDNSCFG=\"priority\",0" commond to set resolve IPV4 address priority */
if (at_obj_exec_cmd(device->client, resp, "AT+MDNSCFG=\"priority\",0") < 0)
{
result = -RT_ERROR;
goto __exit;
}
/* send "AT+MDNSCFG=\"ip\"" commond to get DNS servers address */
if (at_obj_exec_cmd(device->client, resp, "AT+MDNSCFG=\"ip\"") < 0)
{
result = -RT_ERROR;
goto __exit;
}
//+MDNSCFG: "ip","183.230.126.224",,"183.230.126.225"
if (at_resp_parse_line_args_by_kw(resp, "+MDNSCFG:", "+MDNSCFG: \"ip\",%s", dns_str) < 0)
{
result = -RT_ERROR;
goto __exit;
}
const char *dns1_str = strstr(dns_str, "\"");
sscanf(dns1_str, "\"%[^\"]", dns_server1);
const char *dns2_str = strstr(dns_str, "\",\"");
sscanf(dns2_str, "\",\"%[^\"]", dns_server2);
LOG_D("ml307 device(%s) primary DNS server address: %s", device->name, dns_server1);
LOG_D("ml307 device(%s) secondary DNS server address: %s", device->name, dns_server2);
inet_aton(dns_server1, &addr);
netdev_low_level_set_dns_server(netdev, 0, &addr);
inet_aton(dns_server2, &addr);
netdev_low_level_set_dns_server(netdev, 1, &addr);
}
#endif //
__exit:
if (resp)
{
@ -1595,6 +1323,7 @@ static int ml307_init(struct at_device *device)
LOG_E("add netdev(%s) failed.", ml307->device_name);
return -RT_ERROR;
}
ml307_connect_sem = rt_sem_create("ml307_connect_sem", 0, RT_IPC_FLAG_PRIO);
/* initialize ml307 pin configuration */
if (ml307->pwr_en_pin != -1)
{

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-12-03 10:31:45
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-17 15:43:58
* @LastEditTime: 2024-12-27 13:08:43
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_bt.c
* @Description:
*
@ -216,7 +216,6 @@ int BSP_Bt_Replace_Valve(rt_uint8_t id, rt_uint8_t *mac_addr, rt_uint8_t *new_ma
int Bt_Valve_Handler(ValveCmdType type, rt_uint8_t id, rt_uint8_t *data)
{
int ret = RT_EOK;
switch (type)
{
case kValveCmdCtr: // 阀门控制
@ -357,29 +356,74 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
static void BSP_Bt_Parse_Data(void)
{
rt_size_t len = lwrb_get_full(&bt_lwrb_rx);
// char *rx_ptr = rt_malloc(len + 1);
rt_uint8_t bt_rx_buf[256] = {0};
char *rx_ptr = rt_malloc(len + 1);
// rt_uint8_t bt_rx_buf[256] = {0};
BSP_Bt_Recv_Data(bt_rx_buf, len);
BSP_Bt_Recv_Data(rx_ptr, len);
// 发送过来的数据格式为:帧头 + 数据长度 + 事件类型 + 数据 + 校验码 + 帧尾
BSP_Bt_Process(bt_rx_buf, len);
// rt_free(rx_ptr);
BSP_Bt_Process(rx_ptr, len);
rt_free(rx_ptr);
}
void BSP_Bt_Valve_Updata(void)
{
uint8_t cnt = 0;
uint8_t mac[6] = {0};
uint8_t num = Flash_Get_Valve_Num();
LOG_D("BSP_Bt_Valve_Updata num: %d ", num);
if (num == 0)
{
return;
}
rt_memset(&valve[0], 0, sizeof(valve_data));
for (int i = 1; i <= MAX_VALVE_NUM; i++) // 这个循环是为了将数据拷贝到valve_list中 并且保证id号和flash对应起来
{
if (Flash_Get_Mac_Addr(mac, i) == 0) // 说明有MAC数据
{
rt_memcpy(valve[cnt].valve_mac, mac, 6); // 这样做的目的就是读取方便只需要根据flash中读取到的数量进行读取前N个值
valve[cnt].valve_id = i + 1;
LOG_D("updata valve_id: %d, valve_mac: %02X %02X %02X %02X %02X %02X",
valve[cnt].valve_id,
valve[cnt].valve_mac[0],
valve[cnt].valve_mac[1],
valve[cnt].valve_mac[2],
valve[cnt].valve_mac[3],
valve[cnt].valve_mac[4],
valve[cnt].valve_mac[5]);
cnt++;
break;
}
else
{
LOG_D("BSP_Bt_Valve_Updata: flash read error");
break;
}
}
Flash_Set_Valve_Num(cnt);
}
static void Bt_Thread_Entry(void *parameter)
{
// 初始化阀门信息
// valve[0].valve_id = 1;
// valve[0].valve_mac[0] = 0X93;
// valve[0].valve_mac[1] = 0xB4;
// valve[0].valve_mac[2] = 0x8F;
// valve[0].valve_mac[3] = 0x10;
// valve[0].valve_mac[4] = 0x53;
// valve[0].valve_mac[5] = 0x5C;
//
// Flash_Set_Mac_Addr(valve[0].valve_mac, 0);
// Flash_Set_Valve_Num(1);
#if 0
// 初始化阀门信息 测试用
valve[0].valve_id = 1;
valve[0].valve_mac[0] = 0X93;
valve[0].valve_mac[1] = 0xB4;
valve[0].valve_mac[2] = 0x8F;
valve[0].valve_mac[3] = 0x10;
valve[0].valve_mac[4] = 0x53;
valve[0].valve_mac[5] = 0x5C;
Flash_Set_Mac_Addr(valve[0].valve_mac, 0);
Flash_Set_Valve_Num(1);
#endif //0
BSP_Bt_Valve_Updata();
lwrb_init(&bt_lwrb_rx, bt_rx_buffer, sizeof(bt_rx_buffer));
lwrb_reset(&bt_lwrb_rx);
@ -453,7 +497,6 @@ static void TEST_BT_Send_Data(int argc, char **argv)
{
int mode = atoi(argv[1]);
int id = atoi(argv[2]) - 1;
LOG_D("send data mode: %d id :%d", mode, id);
switch (mode)
{
case 1:

View File

@ -1,17 +1,16 @@
#include <rtthread.h>
#include "flexible_button.h"
#include "bsp_button.h"
#include "bsp_flash.h"
#include "bsp_led.h"
#include "bsp_beep.h"
#include "bsp_bt.h"
#include "user_sys.h"
#define LOG_TAG "bsp_button"
#define LOG_LVL LOG_LVL_DBG
#include <ulog.h>
#ifdef BUTTON_USE_THREAD
ALIGN(RT_ALIGN_SIZE)
static char button_thread_stack[BUTTON_THREAD_STACK_SIZE];
@ -23,7 +22,7 @@ static rt_timer_t button_timer;
typedef enum
{
USER_BUTTON_0 = 0,
USER_BUTTON_1 ,
USER_BUTTON_1,
USER_BUTTON_MAX
} user_button_t;
@ -49,13 +48,6 @@ static uint8_t _CommonBtnRead(void *arg)
return value;
}
#if 0
static uint8_t led_cnt = 1;
static uint8_t beep_cnt = 1;
static uint8_t relay_cnt = 1;
// static uint8_t emv_cnt = 0;
#endif
static void _CommonBtnEvtCb(void *arg)
{
static rt_uint8_t button_cnt = 0;
@ -64,8 +56,33 @@ static void _CommonBtnEvtCb(void *arg)
{
Send_Laser_Alarm_Event(kSelfCheckEvent);
}
#if 1
if ((flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_DOUBLE_CLICK)|| (flex_button_event_read(&user_button[USER_BUTTON_1]) == FLEX_BTN_PRESS_DOUBLE_CLICK))
if ((flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_LONG_HOLD) || (flex_button_event_read(&user_button[USER_BUTTON_1]) == FLEX_BTN_PRESS_LONG_HOLD))
{
LOG_I("本地清除阀门信息");
LED_ON(r);
rt_uint8_t mac_addr[6] = {0};
Bt_Valve_Handler(kValveCmdRem, 0, RT_NULL);
if (rt_sem_take(&bt_rem_sem, 10000) == RT_EOK) // 如果没刷掉数据,则黄灯会亮一秒,如果刷成功了,则红灯闪一下黄灯不会亮
{
if (Flash_Set_Mac_Addr(mac_addr, 0) != -RT_ERROR) // 将flash数据清掉
{
rt_thread_mdelay(100);
LED_OFF(r);
LOG_I("本地清除阀门信息成功");
}
}
else
{
LOG_E("本地清除阀门信息错误");
LED_OFF(r);
LED_OFF(g);
LED_ON(y);
rt_thread_mdelay(1000);
LED_OFF(y);
}
}
#if 1 // 测试LED灯状态用测试完成后关闭
if ((flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_DOUBLE_CLICK) || (flex_button_event_read(&user_button[USER_BUTTON_1]) == FLEX_BTN_PRESS_DOUBLE_CLICK))
{
button_cnt++;
if (button_cnt == 1)

View File

@ -2,7 +2,7 @@
#include "lwutil.h"
#include "bsp_rtc.h"
#include "bsp_hr.h"
#include "at_device_ml307.h"
#include "at_device_ml307.h"
#include <rtthread.h>
#include <rthw.h>
@ -12,17 +12,15 @@
#include <stdlib.h>
//在此修改默认的服务器地址
// 在此修改默认的服务器地址
struct flash_sever_info sever_info =
{
{
.server_url = "8.130.122.162",
.server_port = "7153",
// .server_port = "36078",
// .server_url = "8.135.10.183",
};
extern int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *hex_array);
#define GETATTR(info, id) ((id) == kHwVerId ? (&(info)->hw_ver) \
: (id) == kSwVerId ? (&(info)->sw_ver) \
@ -100,8 +98,6 @@ rt_uint8_t sys_temp_alarm_threshold = 0x32;
rt_uint8_t sys_emagnetic_switch = 0x04; // 具备阀门功能
rt_uint8_t sys_relay_switch = 0x04; // 具备继电器功能
static void BSP_Flash_UnLock(void)
{
#if (SystemCoreClock > SYSCLK_FREQ_96MHz_HSE)
@ -142,8 +138,6 @@ static void BSP_Flash_FastLock(void)
rt_hw_interrupt_enable(interrupt_value);
}
static rt_size_t Flash_Read(rt_uint32_t addr, rt_uint8_t *buf, rt_size_t len)
{
rt_size_t read_len = 0;
@ -158,7 +152,7 @@ static rt_size_t Flash_Read(rt_uint32_t addr, rt_uint8_t *buf, rt_size_t len)
int Get_Iot_Imei(char *buf, rt_size_t len)
{
if ((*(rt_uint8_t *)FLASH_NB_IMEI_ADDR != 0xE3)&&(*(rt_uint8_t *)FLASH_NB_IMEI_ADDR != 0x39))
if ((*(rt_uint8_t *)FLASH_NB_IMEI_ADDR != 0xE3) && (*(rt_uint8_t *)FLASH_NB_IMEI_ADDR != 0x39))
{
rt_memcpy(buf, (char *)FLASH_NB_IMEI_ADDR, len);
@ -179,7 +173,7 @@ int Get_Iot_Imei(char *buf, rt_size_t len)
int Get_Iot_Imsi(char *buf, rt_size_t len)
{
if ((*(rt_uint8_t *)FLASH_NB_IMSI_ADDR != 0xE3)&&(*(rt_uint8_t *)FLASH_NB_IMSI_ADDR != 0x39))
if ((*(rt_uint8_t *)FLASH_NB_IMSI_ADDR != 0xE3) && (*(rt_uint8_t *)FLASH_NB_IMSI_ADDR != 0x39))
{
rt_memcpy(buf, (char *)FLASH_NB_IMSI_ADDR, len);
@ -200,7 +194,7 @@ int Get_Iot_Imsi(char *buf, rt_size_t len)
int Get_Iot_Iccid(char *buf, rt_size_t len)
{
if ((*(rt_uint8_t *)FLASH_NB_ICCID_ADDR != 0xE3)&&(*(rt_uint8_t *)FLASH_NB_ICCID_ADDR != 0x39))
if ((*(rt_uint8_t *)FLASH_NB_ICCID_ADDR != 0xE3) && (*(rt_uint8_t *)FLASH_NB_ICCID_ADDR != 0x39))
{
rt_memcpy(buf, (char *)FLASH_NB_ICCID_ADDR, len);
@ -328,7 +322,6 @@ int Flash_Set_Sever_Addr_Info(rt_uint8_t *data)
return Flash_Write_ConfigInfo(page_buf);
}
TeCalibrationStatus Flash_Get_Calibration_State(void)
{
return *(rt_uint8_t *)FLASH_CALIBRATION_STATUS_ADDR;
@ -347,11 +340,12 @@ int Flash_Set_Calibration_State(TeCalibrationStatus status)
return Flash_Write_ConfigInfo(page_buf);
}
/*写入MAC地址*/
/*写入MAC地址 number :1-8
*/
int Flash_Set_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number)
{
rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0};
rt_uint8_t in_page_offset = ((FLASH_VALVE_1_MAC_ADDR_ADDR + number * FLASH_VALVE_MAC_ADDR_LEN) - FLASH_CONFIG_INFO_START_ADDR);
rt_uint8_t in_page_offset = ((FLASH_VALVE_1_MAC_ADDR_ADDR + (number - 1) * FLASH_VALVE_MAC_ADDR_LEN) - FLASH_CONFIG_INFO_START_ADDR);
if (mac_addr == RT_NULL)
{
return -RT_ERROR;
@ -364,22 +358,28 @@ int Flash_Set_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number)
return Flash_Write_ConfigInfo(page_buf);
}
/*读取MAC地址*/
/*读取MAC地址 number :1-8*/
int Flash_Get_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number)
{
rt_uint8_t data[FLASH_VALVE_MAC_ADDR_LEN];
char mac[16] = {20};
rt_memcpy(data, (rt_uint8_t *)(FLASH_VALVE_1_MAC_ADDR_ADDR + number * FLASH_VALVE_MAC_ADDR_LEN), FLASH_VALVE_MAC_ADDR_LEN);
rt_memcpy(data, (rt_uint8_t *)(FLASH_VALVE_1_MAC_ADDR_ADDR + (number - 1) * FLASH_VALVE_MAC_ADDR_LEN), FLASH_VALVE_MAC_ADDR_LEN);
if (data == RT_NULL)
{
LOG_E("Flash_Get_Mac_Addr failed");
return -RT_ERROR;
}
//进行两次判断的原因主要为防止MAC地址确实有个e3或者e99但是MAC地址确是正确的情况防止出现错误两次判断可以从一定程度上降低这种风险
if (((data[0] == 0xe3) || (data[0] == 0x39))&&((data[1] == 0xe3) || (data[1] == 0x39)))
// 判断读出来的数是否是flash的默认值 如果默认值是0xe3e9的话
if ((data[0] == 0xe3 || data[0] == 0xe9) &&
(data[1] == 0xe3 || data[1] == 0xe9) &&
(data[2] == 0xe3 || data[2] == 0xe9) &&
(data[3] == 0xe3 || data[3] == 0xe9) &&
(data[4] == 0xe3 || data[4] == 0xe9) &&
(data[5] == 0xe3 || data[5] == 0xe9))
{
rt_memset(data, 0, sizeof(data));
return RT_EEMPTY;
rt_memset(data, 0, 6);
rt_memcpy(mac_addr, data, FLASH_VALVE_MAC_ADDR_LEN);
return RT_EOK;
}
rt_snprintf(mac, 20, "%02x:%02x:%02x:%02x:%02x:%02x",
@ -454,7 +454,6 @@ void Flash_Erase_Records(TeRecord record)
LOG_D("Flash_Erase_Records(%d)", record);
}
/*
* @description:
* @param {TeRecord} record
@ -482,7 +481,6 @@ static rt_uint16_t Flash_GetMaxIndex_Records(TeRecord record)
return index_max;
}
/**
* @description:
* @param {TeRecord} record
@ -507,8 +505,6 @@ rt_uint8_t Flash_GetNum_Records(TeRecord record)
return num;
}
/**
* @description:
* @param {TuFlashHrRecordFrame*} pHrRecord
@ -656,7 +652,6 @@ void Flash_Write_Record(TeRecord record)
Flash_Write_RecordIndex(&HrRecord, record, index_new);
}
void Flash_ErasePage_ConfigInfo(void)
{
BSP_Flash_FastUnLock();
@ -711,8 +706,6 @@ ErrorStatus Flash_GetProductTimeLimit(TuFlashProductTimeLimitFrame *pLimitTime,
return flag;
}
void Flash_SetProductTimeLimit(rt_uint16_t year, rt_uint8_t mon, rt_uint8_t day,
rt_uint8_t hour, rt_uint8_t min, rt_uint8_t second,
TeFlashProductTimeLimitId id)
@ -786,7 +779,6 @@ void Set_ExpirationTime(rt_uint16_t days)
}
}
rt_uint8_t Flash_Sys_Cfg(TeFlashCfgInfoId id, rt_uint8_t *buf, rt_size_t len)
{
rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0};
@ -830,8 +822,6 @@ size_t Flash_Get_SysCfg(TeFlashCfgInfoId id)
return value;
}
ErrorStatus Flash_GetTotalRecord(TsTotalRecords *pTotalRecords)
{
ErrorStatus flag = NoREADY;
@ -934,15 +924,14 @@ int BSP_Flash_Init(void)
LOG_D("%02x", sever_data[i]);
}
if(Flash_Set_Sever_Addr_Info(sever_data) <= 0)
if (Flash_Set_Sever_Addr_Info(sever_data) <= 0)
{
LOG_D("Flash_Set_Sever_Addr_Info error!");
}
Flash_Set_Calibration_State(kSysGasCalibStatus);//未标定状态
Flash_Set_Calibration_State(kSysGasCalibStatus); // 未标定状态
Flash_Set_Valve_Num(0);
Flash_Write(FLASH_HW_VER_ADDR, (rt_uint8_t *)&sci,
(sizeof(sys_config_info) - 50));
}
return 0;
}
@ -950,7 +939,6 @@ int BSP_Flash_Init(void)
INIT_PREV_EXPORT(BSP_Flash_Init);
#endif
#ifdef TEST_ENABLE
static void TEST_Flash_GetMaxIndex_Records(int argc, char **argv)
{
@ -968,7 +956,6 @@ static void TEST_Flash_GetMaxIndex_Records(int argc, char **argv)
MSH_CMD_EXPORT(TEST_Flash_GetMaxIndex_Records,
"TEST_Flash_GetMaxIndex_Records");
static void TEST_Flash_Erase_Records(int argc, char **argv)
{
if (argc == 2)

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-11-30 15:46:21
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-17 15:12:17
* @LastEditTime: 2024-12-27 17:49:25
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c
* @Description:
*
@ -52,7 +52,7 @@ rt_sem_t ml307_life_sem;
static rt_timer_t ml307_timer; // 上报心跳
static rt_timer_t ml307_upload_timer; // 更新本地时间定时器
static rt_timer_t ml307_power_error_timer; // 上电失败情况下启动定时器
static rt_timer_t ml307_heartbeat_check_timer; // 用于检测定时器是否工作
rt_uint8_t ml307_conncet_tcp_flag;
Ml307EventIndex ml307_event_index;
@ -99,11 +99,10 @@ static rt_bool_t ml307_event_initialized = RT_FALSE; // 是否初
typedef enum
{
ML307_PRIORITY_LOWEST, // 4、优先级最低定时心跳、浓度异常、报警触发、报警解除、传感器故障触发 传感器故障解除)
ML307_PRIORITY_MEDIUM, // 2、优先级第三高 自检触发
ML307_PRIORITY_HIGH, // 1、优先级第二高 掉电
ML307_PRIORITY_HIGHEST, // 0 优先级最高(设备上电时的定时心跳)
kMl307PriorityLowest, // 4、优先级最低定时心跳、浓度异常、报警触发、报警解除、传感器故障触发 传感器故障解除)
kMl307PriorityMedium, // 2、优先级第三高 自检触发
kMl307PriorityHigh, // 1、优先级第二高 掉电
kMl307PriorityHighest, // 0 优先级最高(设备上电时的定时心跳)
} Ml307Priority;
typedef struct
@ -163,12 +162,10 @@ void Ml307_Send_Event(Ml307Event event_type)
}
}
static rt_uint8_t last_value = 0; // 用于存储上次检测的值
static rt_uint8_t current_value = 0; // 用于存储当前检测的值
// 定义定时器回调函数
static void Ml307_Ht_Timer_Cb(void *parameter)
{
current_value++;
Ml307_Send_Event(kMl307HeartbeatEvent);
}
@ -184,25 +181,6 @@ static void Ml307_Error_Timer_Cb(void *parameter)
}
}
static void Ml307_Heartbeat_check_Timer_Cb(void *parameter)
{
// static rt_uint8_t relay_cnt = 0;
if (last_value == current_value)
{
// rt_timer_start(ml307_timer); // 重启一下定时器
// relay_cnt++;
reboot(); // 三个心跳周期定时器都没启动,直接重启
}
// else
// {
// if (current_value > 100) // 随便设一个不大于255的数就行 目的就是循环检测,不超
// {
// last_value = current_value;
// current_value = 0;
// }
// }
}
int _Pack_Send(struct Ml307_Ops *ops, char *buf)
{
char ml307_send_buf[1024] = {0}; // 发送缓冲区,用于存储最终发送的数据
@ -378,21 +356,14 @@ int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd,
rt_snprintf(temp, sizeof(temp), "%02X", ((rt_uint8_t *)ops->body)[i]);
rt_memcpy(data_buf + i * 2, temp, 2);
}
rt_mutex_release(ml307_mutex);
ret = _Send_Handle(ops, data_num, cmd, data_buf);
if (ret != RT_EOK)
{
return -ret;
ret = -ret;
}
}
}
else
{
rt_mutex_release(ml307_mutex);
LOG_E("ml307_conncet_tcp_flag = 0");
ret = -RT_ERROR;
}
return ret;
}
@ -496,7 +467,6 @@ int Ml307_Send_Alarm(struct at_device *device, void *param)
LOG_E("ml307 param error\n");
return RT_ERROR;
}
if (ml307_ops->send(ml307_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_ML307, EVENT_TYPE_ALARM))
{
LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_ALARM);
@ -785,21 +755,21 @@ int Ml307_Send_Device_Failure(struct at_device *device, void *param)
线
使*/
const Ml307EventInfo ml307_event_info[] = {
{kMl307PowerOnEvent, ML307_PRIORITY_HIGHEST, "上电心跳事件", Ml307_Send_Power_On},
{kMl307PowerDownEvent, ML307_PRIORITY_HIGH, "掉电事件", Ml307_Send_Power_Off},
{kMl307SelfCheckEvent, ML307_PRIORITY_MEDIUM, "自检事件", Ml307_Send_Self_Check},
{kMl307HeartbeatEvent, ML307_PRIORITY_LOWEST, "定时心跳事件", Ml307_Send_Heartbeat},
{kMl307TempAnomalyEvent, ML307_PRIORITY_LOWEST, "温度异常事件", Ml307_Send_Temp_Anomaly},
{kMl307AlarmEvent, ML307_PRIORITY_LOWEST, "报警触发事件", Ml307_Send_Alarm},
{kMl307AlarmRcyEvent, ML307_PRIORITY_LOWEST, "报警解除事件", Ml307_Send_Alarm_Recover},
{kMl307FaultEvent, ML307_PRIORITY_LOWEST, "传感器故障事件", Ml307_Send_Fault},
{kMl307FaultRcyEvent, ML307_PRIORITY_LOWEST, "传感器故障解除事件", Ml307_Send_Fault_Recover},
{kMl307TimeCalibrationEvent, ML307_PRIORITY_LOWEST, "时间校准事件", Ml307_Send_Time_Calibration},
{kMl307SilenceEvent, ML307_PRIORITY_LOWEST, "消音事件", Ml307_Send_Silence},
// {kMl307ExceptionEvent, ML307_PRIORITY_LOWEST, "异常事件", Ml307_Send_Exception},
{kMl307ValveStatusEvent, ML307_PRIORITY_LOWEST, "电磁阀状态改变事件", Ml307_Send_Valve_Status},
{kMl307FanStatusEvent, ML307_PRIORITY_LOWEST, "风机状态改变事件", Ml307_Send_Fan_Status},
{kMl307DeviceFailureEvent, ML307_PRIORITY_LOWEST, "设备失效事件", Ml307_Send_Device_Failure}};
{kMl307PowerOnEvent, kMl307PriorityHighest, "上电心跳事件", Ml307_Send_Power_On},
{kMl307PowerDownEvent, kMl307PriorityHigh, "掉电事件", Ml307_Send_Power_Off},
{kMl307SelfCheckEvent, kMl307PriorityMedium, "自检事件", Ml307_Send_Self_Check},
{kMl307HeartbeatEvent, kMl307PriorityLowest, "定时心跳事件", Ml307_Send_Heartbeat},
{kMl307TempAnomalyEvent, kMl307PriorityLowest, "温度异常事件", Ml307_Send_Temp_Anomaly},
{kMl307AlarmEvent, kMl307PriorityLowest, "报警触发事件", Ml307_Send_Alarm},
{kMl307AlarmRcyEvent, kMl307PriorityLowest, "报警解除事件", Ml307_Send_Alarm_Recover},
{kMl307FaultEvent, kMl307PriorityLowest, "传感器故障事件", Ml307_Send_Fault},
{kMl307FaultRcyEvent, kMl307PriorityLowest, "传感器故障解除事件", Ml307_Send_Fault_Recover},
{kMl307TimeCalibrationEvent, kMl307PriorityLowest, "时间校准事件", Ml307_Send_Time_Calibration},
{kMl307SilenceEvent, kMl307PriorityLowest, "消音事件", Ml307_Send_Silence},
// {kMl307ExceptionEvent, kMl307PriorityLowest, "异常事件", Ml307_Send_Exception},
{kMl307ValveStatusEvent, kMl307PriorityLowest, "电磁阀状态改变事件", Ml307_Send_Valve_Status},
{kMl307FanStatusEvent, kMl307PriorityLowest, "风机状态改变事件", Ml307_Send_Fan_Status},
{kMl307DeviceFailureEvent, kMl307PriorityLowest, "设备失效事件", Ml307_Send_Device_Failure}};
/**
* ML307设备的事件
@ -839,16 +809,11 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device,
{
if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK) // 打开连接
{
// Reset_Ml307_Life_Timer();
// 重启后重新尝试发送
result = event->send_func(device, ml307_ops);
if (result != RT_EOK)
{
LOG_E("ml307 send cmd after module reset failed\n");
// Flash_Set_WorkDuration(work_duration); // 重启前保存参数
// NVIC_SystemReset(); // 直接重启系统
Ml307_Reset(device);
rt_thread_mdelay(5000);
}
@ -954,9 +919,23 @@ rt_err_t Handle_Close_Valve(struct Ml307_Ops *ops)
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 ((data[0] > 0) && (data[0] < MAX_VALVE_NUM)) // 不为零则说明关闭无线阀门
{
rt_uint8_t cnt = Flash_Get_Valve_Num();
if (cnt == 0)
{
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("无线阀门编号:%d\n", data[0]);
Flash_Get_Mac_Addr(mac_addr, 0);
if(Flash_Get_Mac_Addr(mac_addr, data[0]) != RT_EOK)
{
LOG_E("获取无线阀门mac地址失败\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE);
return RT_ERROR;
}
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++)
@ -973,14 +952,13 @@ rt_err_t Handle_Close_Valve(struct Ml307_Ops *ops)
if (i == FLASH_VALVE_MAC_ADDR_LEN)
{
LOG_D("mac地址匹配成功,执行关阀动作\n");
// if (Bt_Valve_Handler(kValveCmdCtr, data[0] - 1, RT_NULL) != RT_EOK)
if (Bt_Valve_Handler(kValveCmdCtr, 0, RT_NULL) != RT_EOK)
{
LOG_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, 15000) != RT_EOK) // 等待十秒获取信号量
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);
@ -999,13 +977,11 @@ rt_err_t Handle_Close_Valve(struct Ml307_Ops *ops)
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE);
}
}
}
else
{
LOG_D("关闭有线阀门\n");
// TODO:此处需要增加关阀有线阀门的逻辑
// emv_state_flag = 0; // 电磁阀动作
// rt_thread_mdelay(20);
// emv_state_flag = 0;
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS);
return RT_EOK;
}
@ -1201,34 +1177,30 @@ rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops)
char imei[16] = {0};
char temp[32] = "0";
rt_uint8_t cnt = Flash_Get_Valve_Num();
rt_uint8_t mac_addr[FLASH_VALVE_MAC_ADDR_LEN + 1] = {0};
Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN);
String2Hex(temp, imei); // 将字符串转为十六进制字符串
if (cnt > MAX_VALVE_NUM)
if (cnt >= MAX_VALVE_NUM)
{
LOG_E("阀门设备数量超过最大值\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE);
return RT_ERROR;
}
// 无阀门数据时添加,有阀门数据时不添加
if(cnt >= 0 && cnt < MAX_VALVE_NUM)
{
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 (mac_addr[0] == 0) // 无MAC地址数据写入MAC地址数据
{
valve[data[0] - 1].valve_id = data[0];
rt_memcpy(valve[data[0] - 1].valve_mac, &data[1], FLASH_VALVE_MAC_ADDR_LEN); // 将信息更新
if (Bt_Valve_Handler(kValveCmdReg, data[0] - 1, RT_NULL) != RT_EOK)
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地址
{
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");
@ -1237,7 +1209,7 @@ rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops)
}
else
{
if (Flash_Set_Mac_Addr(&data[1], (data[0] - 1)) == RESET)
if (Flash_Set_Mac_Addr(&data[1], data[0]) == RESET)
{
LOG_E("阀门设备写入FLash失败\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE);
@ -1249,14 +1221,6 @@ rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops)
return RT_EOK;
}
}
else // 不为空,不添加
{
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);
return RT_EOK;
}
}
return RT_EOK;
}
@ -1274,7 +1238,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops)
rt_memcpy(data, (ops->recv->recv_data.res_data + 2), (2 * FLASH_VALVE_MAC_ADDR_LEN + 1));
LOG_HEX("data", 16, data, sizeof(data));
/*设备编号1byte+ 新MAC地址6+ 旧阀门MAC地址6 + 补零字节= 15byte*/
if (Flash_Get_Mac_Addr(mac_addr, data[0] - 1) == RT_EOK)
if (Flash_Get_Mac_Addr(mac_addr, data[0]) == RT_EOK)
{
for (; i < FLASH_VALVE_MAC_ADDR_LEN; i++)
{
@ -1282,7 +1246,6 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops)
{
LOG_E("旧阀门地址错误\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_OTHER_ERROR);
return RT_ERROR;
}
}
@ -1304,7 +1267,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops)
}
else
{
if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) == RESET)
if (Flash_Set_Mac_Addr(&data[1], data[0]) == RESET)
{
LOG_E("更换阀门设备失败\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_ACTION_FAILURE);
@ -1319,7 +1282,6 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops)
{
LOG_E("旧阀门MAC地址错误\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_OTHER_ERROR);
return RT_ERROR;
}
}
@ -1334,25 +1296,24 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops)
/*移除阀门设备*/
rt_err_t Handle_Remove_Valve(struct Ml307_Ops *ops)
{
rt_uint8_t data[6] = {0};
rt_uint8_t data[8] = {0};
char imei[16] = {0};
char temp[32] = "0";
rt_uint8_t cnt = Flash_Get_Valve_Num();
Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN);
String2Hex(temp, imei); // 将字符串转为十六进制字符串
LOG_I("接收到服务器下发移除阀门指令");
#if 1
if (cnt == 0)
{
LOG_E("阀门设备数量为0, 无法移除\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_ACTION_FAILURE);
LOG_W("阀门设备数量为0\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_SUCCESS);//如果本地无阀门信息,直接返回成功
return RT_ERROR;
return RT_EOK;
}
rt_memcpy(data, (ops->recv->recv_data.res_data + 8), FLASH_VALVE_MAC_ADDR_LEN + 1);
LOG_D("data[0] = %x data[1] = %x data[2] = %x data[3] = %x data[4] = %x, data[5] = %x", data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
// if (Bt_Valve_Handler(kValveCmdRem, data[0] - 1, RT_NULL) != RT_EOK)
if (Bt_Valve_Handler(kValveCmdRem, 0, RT_NULL) != RT_EOK)
{
LOG_E("移除阀门设备失败\n");
@ -1362,14 +1323,14 @@ rt_err_t Handle_Remove_Valve(struct Ml307_Ops *ops)
}
if (rt_sem_take(&bt_rem_sem, 10000) != RT_EOK) // 等待十秒获取信号量
{
LOG_E("获取更换阀门信号量失败\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE);
LOG_E("获取移除阀门信号量失败\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_ACTION_FAILURE);
return RT_ERROR;
}
else
{
rt_memset(&data[1], 0, sizeof(data) - 1);
if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) == RESET)
rt_memset(&data[1], 0, 6);
if (Flash_Set_Mac_Addr(&data[1], data[0]) == RESET)
{
LOG_E("移除阀门设备失败\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_ACTION_FAILURE);
@ -1385,7 +1346,7 @@ rt_err_t Handle_Remove_Valve(struct Ml307_Ops *ops)
return RT_EOK;
}
}
#endif
}
void Handle_Error(struct Ml307_Ops *ops, rt_err_t ret)
@ -1488,7 +1449,6 @@ void Handle_Cmd_Type(struct Ml307_Ops *ops)
void Analyze_Recv_Frame(struct at_device *device, struct Ml307_Ops *ops)
{
rt_err_t ret = RT_EOK;
// Reset_Ml307_Life_Timer(); // 只要数据,则重置定时器,不管数据是否正确
ret = Compare_HeaderToTail(ops);
if (ret == RT_EOK)
@ -1565,7 +1525,6 @@ static void Ml307_Send_Thread_Entry(void *param)
}
if (ml307_conncet_tcp_flag)
{
// Reset_Ml307_Life_Timer();
if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307PowerOnEvent))
{
result = Ml307_Process_Events(kMl307PowerOnEvent, device, ops); // 当上电心跳包发送不成功时,其他事件不启动
@ -1711,17 +1670,13 @@ static void Ml307_Recv_Thread_Entry(void *parameter)
struct at_device_ml307 *ml307 = &_dev;
struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name);
RT_ASSERT(device);
rt_err_t ret;
LOG_D("ml307 recv thread entry\n");
while (1)
{
ret = rt_sem_take(ml307_recv_sem, RT_WAITING_FOREVER); // 这个主要用来处理的数据
if (ret == RT_EOK)
if (rt_sem_take(ml307_recv_sem, RT_WAITING_FOREVER) == RT_EOK)
{
// rt_timer_start(ml307_life_timer);
/*对数据帧进行分析,判断所处的是对服务器响应还是指令下发*/
Analyze_Recv_Frame(device, ops);
}
}
@ -1803,17 +1758,6 @@ int BSP_Ml307_Thread_Init(void)
RT_NULL,
24 * 60 * RT_TICK_PER_SECOND, //
RT_TIMER_FLAG_PERIODIC);
// 创建定时器
ml307_heartbeat_check_timer = rt_timer_create("ml307_check_hb",
Ml307_Heartbeat_check_Timer_Cb,
RT_NULL,
timeout * 3, // 3个定时心跳没有发送就重启发送
RT_TIMER_FLAG_PERIODIC);
if (ml307_heartbeat_check_timer != RT_NULL)
{
rt_timer_start(ml307_heartbeat_check_timer);
}
ret = rt_thread_init(&ml307_thread,
"ml307_send_thread",
Ml307_Send_Thread_Entry,

View File

@ -2,7 +2,7 @@
* @Author : stark1898y 1658608470@qq.com
* @Date : 2024-06-18 15:48:01
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-17 15:52:30
* @LastEditTime: 2024-12-25 17:10:33
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_mq.c
* @Description :
*
@ -25,13 +25,10 @@
#include "user_sys.h"
#include "finsh.h"
#define LOG_TAG "bsp_mq" // 该模块对应的标签。不定义时默认NO_TAG
#define LOG_LVL LOG_LVL_DBG // 该模块对应的日志输出级别。不定义时,默认:调试级别
#include <ulog.h> // 必须在 LOG_TAG 与 LOG_LVL 下面
ALIGN(RT_ALIGN_SIZE)
static char sensor_thread_stack[GAS_SNESOR_THREAD_STACK_SIZE];
static struct rt_thread Sensor_Thread;
@ -48,7 +45,7 @@ uint16_t Get_Gas_VoltageInt1000x(void)
uint16_t Get_Gas_VoltageAdcInt1000x(void)
{
rt_uint16_t voltage_adc = (Get_ADC_Average(kGasAdc) * 3.3 / 4096) * 1000;
// LOG_D("Get_Gas_VoltageAdcInt1000x = %04d", voltage_adc);
LOG_D("Get_Gas_VoltageAdcInt1000x = %04d", voltage_adc);
return voltage_adc;
}
@ -75,30 +72,32 @@ static uint8_t Sensor_Count(const rt_uint8_t *buffer, uint8_t value, uint8_t siz
static void Sensor_HandleAlarm(uint8_t count, uint8_t *flag, uint8_t threshold)
{
if (count > threshold && *flag == 0)
if (count >= threshold && *flag == 0)
{
Sensor_device.detection_flag = kSensorAlarm;
Send_Laser_Alarm_Event(kAlarmEvent);
*flag = 1;
}
else if (*flag == 1 && count < threshold)
else if (*flag == 1 && count == 0)
{
*flag = 0;
Sensor_device.detection_flag = kSensorNormal;
Send_Laser_Alarm_Event(kAlarmRcyEvent);
}
}
static void Sensor_HandleFault(uint8_t count, uint8_t *flag, uint8_t threshold)
{
if (count > threshold && *flag != 1)
if (count >= threshold && *flag != 1)
{
*flag = 1;
Sensor_device.detection_flag = kSensorFault;
Send_Laser_Alarm_Event(kFaultEvent);
}
else if (*flag == 1 && count < threshold)
else if (*flag == 1 && count == 0)
{
*flag = 0;
Sensor_device.detection_flag = kSensorNormal;
Send_Laser_Alarm_Event(kFaultRcyEvent);
}
}
@ -123,8 +122,8 @@ static uint8_t Sensor_CheckData(void)
alarm_count = Sensor_Count(alarm_status_buffer, kSensorAlarm, SENSOR_SAMPLING_TIMS);
fault_count = Sensor_Count(fault_buf, kSensorFault, SENSOR_SAMPLING_TIMS);
Sensor_HandleAlarm(alarm_count, &alarm_flag, SENSOR_SAMPLING_TIMS / 2 + 1);
Sensor_HandleFault(fault_count, &fault_flag, SENSOR_SAMPLING_TIMS / 2 + 1);
Sensor_HandleAlarm(alarm_count, &alarm_flag, SENSOR_SAMPLING_TIMS);
Sensor_HandleFault(fault_count, &fault_flag, SENSOR_SAMPLING_TIMS);
return RT_EOK;
}
@ -174,7 +173,7 @@ static void Sensor_detection_thread_entry(void *param)
{
Sensor_CheckData();
}
rt_thread_mdelay(1000);
rt_thread_mdelay(500);
}
}
@ -182,7 +181,7 @@ 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, //可以用定时器做,没必要线程
rt_thread_init(&Sensor_Thread, // 可以用定时器做,没必要线程
"sensor_thread",
Sensor_detection_thread_entry,
RT_NULL,
@ -204,4 +203,3 @@ static void TEST_MQ_EndOfLife(void)
}
MSH_CMD_EXPORT(TEST_MQ_EndOfLife, TEST_MQ_EndOfLife);
#endif