JT-DT-YD4N02B_4G_RTT_MRS/bsp/src/bsp_nt26k.c

1678 lines
60 KiB
C
Raw Normal View History

2024-12-30 11:50:48 +08:00
/*
* @Author: mbw
* @Date: 2024-10-09 08:42:14
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2025-02-06 08:41:05
* @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\bsp\src\bsp_nt26k.c
2024-12-30 11:50:48 +08:00
* @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
*/
2024-12-30 18:04:47 +08:00
#include <at_device_nt26k.h>
2024-12-30 11:50:48 +08:00
#include "drv_gpio.h"
2024-12-30 18:04:47 +08:00
#include "bsp_nt26k.h"
2024-12-30 11:50:48 +08:00
#include "user_sys.h"
#include "bsp_flash.h"
#include "bsp_h308.h"
#include "stddef.h"
#include "bsp_emv.h"
#include "bsp_rtc.h"
#include "bsp_relay.h"
#include "bsp_rng.h"
2024-12-30 18:04:47 +08:00
#define LOG_TAG "nt26k"
2024-12-30 11:50:48 +08:00
#include <at_log.h>
2024-12-30 18:04:47 +08:00
#if IOT_MODULE_SWITCH == 1
2025-01-17 13:23:16 +08:00
#define NT26K_THREAD_STACK_SIZE (4096)
2024-12-30 18:04:47 +08:00
#define NT26K_RECV_THREAD_STACK_SIZE (4096)
2025-01-09 15:29:36 +08:00
#define NT26K_LIFE_THREAD_STACK_SIZE (2048)
2025-01-17 13:23:16 +08:00
#define NT26K_THREAD_PRIORITY 25
#define NT26K_THREAD_TICKS 50
#define NT26K_RECV_THREAD_PRIORITY 24
#define NT26K_RECV_THREAD_TICKS 10
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
#define NT26K_LIFE_THREAD_PRIORITY 26
#define NT26K_LIFE_THREAD_TICKS 10
2024-12-30 11:50:48 +08:00
2024-12-30 18:04:47 +08:00
// static rt_uint32_t nt26k_status = 0;
2025-01-17 13:23:16 +08:00
ALIGN(RT_ALIGN_SIZE)
2024-12-30 18:04:47 +08:00
static char nt26k_thread_stack[NT26K_THREAD_STACK_SIZE];
static struct rt_thread nt26k_thread;
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
ALIGN(RT_ALIGN_SIZE)
2024-12-30 18:04:47 +08:00
static char nt26k_recv_thread_stack[NT26K_RECV_THREAD_STACK_SIZE];
static struct rt_thread nt26k_recv_thread;
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
ALIGN(RT_ALIGN_SIZE)
2024-12-30 18:04:47 +08:00
static char nt26k_life_thread_stack[NT26K_LIFE_THREAD_STACK_SIZE];
static struct rt_thread nt26k_life_thread;
2024-12-30 11:50:48 +08:00
struct rt_event at_device_event;
2024-12-30 18:04:47 +08:00
rt_sem_t nt26k_recv_sem;
2025-01-22 13:33:38 +08:00
rt_sem_t nt26k_recv_msg_sem; // 用于接收信号
2024-12-31 17:48:22 +08:00
rt_sem_t nt26k_disconnect_sem;
static rt_timer_t nt26k_timer; // 上报心跳
static rt_timer_t nt26k_upload_timer; // 更新本地时间定时器
static rt_timer_t nt26k_error_timer; // 上电失败情况下启动定时器
2024-12-31 17:48:22 +08:00
rt_uint8_t device_power_down_flag;
rt_uint8_t nt26k_power_down_flag;
rt_uint8_t nt26k_connect_sever_flag;
2025-01-24 17:32:54 +08:00
rt_uint8_t nt26k_send_error_flag;
2024-12-30 18:04:47 +08:00
rt_uint8_t nt26k_conncet_tcp_flag;
2025-01-17 13:23:16 +08:00
rt_uint8_t nt26k_disconnect_pdp_flag; // PDP断开连接标志
rt_uint8_t nt26k_disconnect_retry_flag = 0; // 用于判断是否已经启动了重连,如果启动,不需要每次都进入
2024-12-30 18:04:47 +08:00
Nt26kEventIndex nt26k_event_index;
2024-12-30 11:50:48 +08:00
rt_uint8_t power_on_send_flag = 0;
2024-12-30 18:04:47 +08:00
rt_mutex_t nt26k_mutex;
2025-01-17 13:23:16 +08:00
int BSP_Nt26k_Init(struct Nt26k_Ops *ops, rt_uint8_t version);
int BSP_Nt26k_Update(struct Nt26k_Ops *ops, rt_uint8_t device_type, rt_uint8_t event_type);
int Nt26k_Send_Data(struct Nt26k_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type);
int Data_Resp(struct Nt26k_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type, char *data, rt_uint8_t res);
int Nt26k_Recv_Data(struct Nt26k_Ops *ops, char *data);
2024-12-30 11:50:48 +08:00
static struct DataBody body;
2024-12-30 18:04:47 +08:00
static struct Nt26kDataFrame frame;
static struct Nt26kRecvData nt26k_recv;
2024-12-30 11:50:48 +08:00
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops nt26k_ops = {
2025-01-17 13:23:16 +08:00
.body = &body,
.frame = &frame,
.recv = &nt26k_recv,
.init = BSP_Nt26k_Init,
2024-12-30 18:04:47 +08:00
.update_data = BSP_Nt26k_Update,
2025-01-17 13:23:16 +08:00
.send = Nt26k_Send_Data,
.Resp = Data_Resp,
2024-12-30 18:04:47 +08:00
// .Recv = Nt26k_Recv_Data,//,没用到
2024-12-30 11:50:48 +08:00
};
2024-12-30 18:04:47 +08:00
static struct at_device_nt26k _dev =
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
NT26K_SAMPLE_DEIVCE_NAME,
NT26K_SAMPLE_CLIENT_NAME,
2024-12-30 11:50:48 +08:00
2024-12-30 18:04:47 +08:00
NT26K_PWR_EN_PIN,
NT26K_RST_PIN,
2024-12-31 17:48:22 +08:00
NT26K_PWR_KEY_PIN,
2024-12-30 11:50:48 +08:00
2024-12-30 18:04:47 +08:00
NT26K_SAMPLE_RECV_BUFF_LEN,
2024-12-30 11:50:48 +08:00
};
2024-12-30 18:04:47 +08:00
static rt_uint32_t nt26k_event_flags[kNt26kMaxEventcnt] = {0};
2025-01-17 13:23:16 +08:00
static rt_bool_t nt26k_event_initialized = RT_FALSE; // 是否初始化完成
2024-12-30 11:50:48 +08:00
typedef enum
{
2025-01-17 13:23:16 +08:00
NT26K_PRIORITY_LOWEST, // 4、优先级最低定时心跳、浓度异常、报警触发、报警解除、传感器故障触发 传感器故障解除)
NT26K_PRIORITY_MEDIUM, // 2、优先级第三高 自检触发
NT26K_PRIORITY_HIGH, // 1、优先级第二高 掉电
NT26K_PRIORITY_HIGHEST, // 0 优先级最高(设备上电时的定时心跳)
2024-12-30 18:04:47 +08:00
} Nt26kPriority;
2024-12-30 11:50:48 +08:00
typedef struct
{
2024-12-30 18:04:47 +08:00
Nt26kEvent event_flag;
Nt26kPriority priority;
2024-12-30 11:50:48 +08:00
const char *event_name;
2025-01-17 13:23:16 +08:00
int (*send_func)(struct at_device *device, void *param);
2024-12-30 18:04:47 +08:00
} Nt26kEventInfo;
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
static void Nt26k_Set_Event(Nt26kEvent event_type)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
if (event_type < kNt26kMaxEventcnt)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
nt26k_event_flags[event_type] = (1 << event_type);
2024-12-30 11:50:48 +08:00
}
}
2025-01-17 13:23:16 +08:00
void Nt26k_Event_Init(void)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
rt_err_t ret = rt_event_init(&at_device_event, "nt26k_event", RT_IPC_FLAG_PRIO);
2024-12-30 11:50:48 +08:00
if (ret == RT_EOK)
{
2024-12-30 18:04:47 +08:00
nt26k_event_initialized = RT_TRUE;
for (Nt26kEvent event = kNt26kHeartbeatEvent; event < kNt26kMaxEventcnt; event++)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
Nt26k_Set_Event(event);
2024-12-30 11:50:48 +08:00
}
}
else
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k_event init failed!");
2024-12-30 11:50:48 +08:00
}
}
2025-01-17 13:23:16 +08:00
rt_uint32_t Nt26k_Get_Event_Flag(Nt26kEvent event_type)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
if (event_type < kNt26kMaxEventcnt)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
return nt26k_event_flags[event_type];
2024-12-30 11:50:48 +08:00
}
return 0;
}
2025-01-17 13:23:16 +08:00
void Nt26k_Send_Event(Nt26kEvent event_type)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("Send_Nt26k_Event = %d", event_type);
nt26k_event_index.last_event = nt26k_event_index.current_event;
2024-12-30 18:04:47 +08:00
nt26k_event_index.current_event = event_type;
if (nt26k_event_initialized == RT_TRUE)
2024-12-30 11:50:48 +08:00
{
if (nt26k_event_index.current_event != kNt26kPowerOnEvent)
{
if (power_on_send_flag)
{
rt_event_send(&at_device_event, Nt26k_Get_Event_Flag(event_type));
}
}
2025-01-24 10:01:26 +08:00
else
{
rt_event_send(&at_device_event, Nt26k_Get_Event_Flag(event_type));
}
2024-12-30 11:50:48 +08:00
}
else
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k_event_initialized is false");
2024-12-30 11:50:48 +08:00
}
}
// 定义定时器回调函数
2025-01-17 13:23:16 +08:00
static void Nt26k_Ht_Timer_Cb(void *parameter)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
Nt26k_Send_Event(kNt26kHeartbeatEvent);
2024-12-30 11:50:48 +08:00
}
// 定时器回调函数,当1分钟内没有数据交互时关闭tcp连接
2025-01-17 13:23:16 +08:00
static void Nt26k_Error_Timer_Cb(void *parameter)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
if (power_on_send_flag) // 上电成功时,停止定时器
2024-12-30 11:50:48 +08:00
{
2025-01-24 17:32:54 +08:00
rt_timer_stop(nt26k_error_timer);
2024-12-30 11:50:48 +08:00
}
else
{
2025-01-17 13:23:16 +08:00
Nt26k_Send_Event(kNt26kPowerOnEvent);
2024-12-30 11:50:48 +08:00
}
}
2025-01-17 13:23:16 +08:00
int _Pack_Send(struct Nt26k_Ops *ops, char *buf)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
char nt26k_send_buf[512] = {0}; // 发送缓冲区,用于存储最终发送的数据
// char byteArr1[512]; // 转换成字节值
unsigned short crc16 = 0; // 存储CRC16校验和
struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, NT26K_SAMPLE_DEIVCE_NAME);
ASSERT(device);
crc16 = crc1021(buf, rt_strlen(buf));
LOG_D("buf: %s", buf);
LOG_D("crc16: %X", crc16);
2024-12-30 11:50:48 +08:00
// 将数据、校验和及尾部标识添加到发送缓冲区中
2025-01-17 13:23:16 +08:00
if (rt_snprintf(nt26k_send_buf, sizeof(nt26k_send_buf),
"%s%04X%02X%02X%02X",
buf,
crc16,
ops->frame->tail[0],
ops->frame->tail[1],
ops->frame->tail[2]) >= sizeof(nt26k_send_buf))
2024-12-30 11:50:48 +08:00
{
// 发生缓冲区溢出
2025-01-17 13:23:16 +08:00
LOG_E("Buffer overflow in nt26k_send_buf");
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
// 打印调试信息
2024-12-30 18:04:47 +08:00
// LOG_D("nt26k_send_buf: %s", nt26k_send_buf);
2025-01-17 13:23:16 +08:00
rt_uint16_t data_len = rt_strlen(nt26k_send_buf);
2024-12-30 18:04:47 +08:00
// 通过AT指令发送数据给NT26K模块
2025-01-17 13:23:16 +08:00
if (at_send_data(device, nt26k_send_buf, data_len / 2) != RT_EOK)
2024-12-30 11:50:48 +08:00
{
return -RT_ERROR;
}
return RT_EOK;
}
/**
2024-12-30 18:04:47 +08:00
* @brief nt26k模块
2024-12-30 11:50:48 +08:00
*
* CRC16校验和
2024-12-30 18:04:47 +08:00
* NT26K模块
2024-12-30 11:50:48 +08:00
*@param version
* @param data
* @param len
* @param data_num
* @param cmd_num
* @return int 0
*/
2025-01-17 13:23:16 +08:00
static int _Send_Handle(struct Nt26k_Ops *ops, rt_size_t data_num, rt_size_t cmd_num, const char *data)
2024-12-30 11:50:48 +08:00
{
// 临时缓冲区,用于格式化数据
char data_buf[512] = {0};
2025-01-17 13:23:16 +08:00
rt_size_t data_len = rt_strlen(data);
2024-12-30 11:50:48 +08:00
2024-12-30 18:04:47 +08:00
// 格式化数据构建发送给NT26K模块的数据包
2025-01-17 13:23:16 +08:00
rt_int32_t len = rt_snprintf(data_buf, sizeof(data_buf),
"%02X%02X%02X%02X%04X%04X%02X%04X%s",
ops->frame->header[0],
ops->frame->header[1],
ops->frame->header[2],
ops->frame->version, // 协议版本
ops->frame->manufacture, // 制造商ID
data_num,
cmd_num,
data_len / 2,
data);
if (len < 0 || len >= sizeof(data_buf))
{
LOG_E("Send Data buffer overflow");
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
// LOG_D("data_buf: %s", data_buf);
2025-01-17 13:23:16 +08:00
return _Pack_Send(ops, data_buf);
2024-12-30 11:50:48 +08:00
}
// 初始化函数
2025-01-17 13:23:16 +08:00
int BSP_Nt26k_Init(struct Nt26k_Ops *ops, rt_uint8_t version)
2024-12-30 11:50:48 +08:00
{
if (ops->frame == RT_NULL)
{
2025-01-17 13:23:16 +08:00
LOG_E("Memory allocation failed");
2024-12-30 11:50:48 +08:00
return -RT_ENOMEM;
}
2025-01-17 13:23:16 +08:00
rt_memset(ops->frame, 0, sizeof(struct Nt26kDataFrame));
2024-12-30 11:50:48 +08:00
ops->frame->header[0] = 0x4A;
ops->frame->header[1] = 0x54;
ops->frame->header[2] = 0x34;
2025-01-17 13:23:16 +08:00
ops->frame->version = version;
2024-12-30 11:50:48 +08:00
ops->frame->manufacture = DEVICE_MANUFACTURE;
ops->frame->tail[0] = 0x42;
ops->frame->tail[1] = 0x4A;
ops->frame->tail[2] = 0x51;
return RT_EOK;
}
2025-01-09 15:29:36 +08:00
2024-12-30 11:50:48 +08:00
// 更新函数
2025-01-17 13:23:16 +08:00
int BSP_Nt26k_Update(struct Nt26k_Ops *ops, rt_uint8_t device_type, rt_uint8_t event_type)
2024-12-30 11:50:48 +08:00
{
ops->body->device_type = device_type;
2025-01-17 13:23:16 +08:00
ops->body->event_type = event_type;
ops->body->hw = (rt_uint8_t)Flash_Get_SysCfg(kHwVerId);
ops->body->sw = (rt_uint8_t)Flash_Get_SysCfg(kSwVerId);
rt_memcpy(ops->body->imei, &nt26k, sizeof(nt26k_sys_info)); // 直接赋值结构体数据
rt_memcpy(&(ops->body->lel), &H308.Data, (rt_ubase_t)offsetof(TsH308Data, checksum)); // 复制除了校验码以外的数据
ops->body->product_work_temperature = ops->body->temp; // 暂时定为激光器测量的环境温度
ops->body->work_duration = work_duration;
ops->body->device_status = device_state_flag;
ops->body->emv_status = emv_state_flag;
ops->body->relay_status = relay_state_flag;
2024-12-30 11:50:48 +08:00
return RT_EOK;
}
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Data(struct Nt26k_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
int ret = 0;
2024-12-30 11:50:48 +08:00
char data_buf[512] = {0};
2025-01-17 13:23:16 +08:00
char temp[3]; // 临时缓冲区,用于存储每个字节的十六进制表示
2024-12-30 11:50:48 +08:00
if (ops == NULL || ops->body == NULL)
{
// 处理 ops 或 ops->body 为 NULL 的情况
2025-01-17 13:23:16 +08:00
return RT_ERROR; // 或者抛出异常,返回错误码等
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
if (sizeof(struct DataBody) == 0)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
data_buf[0] = '\0'; // 确保 data_buf 被正确初始化
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
rt_memset(ops->body, 0, sizeof(struct DataBody));
rt_mutex_take(nt26k_mutex, RT_WAITING_FOREVER);
ret = nt26k_ops.update_data(ops, device_type, event_type);
2024-12-30 11:50:48 +08:00
if (ret == RT_EOK)
{
2025-01-17 13:23:16 +08:00
for (int i = 0; i < sizeof(struct DataBody); i++)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
rt_snprintf(temp, sizeof(temp), "%02X", ((rt_uint8_t *)ops->body)[i]);
rt_memcpy(data_buf + i * 2, temp, 2);
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
ret = _Send_Handle(ops, data_num, cmd, data_buf);
2024-12-30 11:50:48 +08:00
if (ret != RT_EOK)
{
ret = -ret;
}
}
2025-01-17 13:23:16 +08:00
rt_mutex_release(nt26k_mutex);
2024-12-30 11:50:48 +08:00
return ret;
}
2025-01-17 13:23:16 +08:00
int Data_Resp(struct Nt26k_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type, char *data, rt_uint8_t res)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
if (nt26k_conncet_tcp_flag != 1)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k_conncet_tcp_flag error");
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
char data_buf[512] = {0};
2025-01-17 13:23:16 +08:00
rt_int32_t len = rt_snprintf(data_buf, sizeof(data_buf), "%02X%02X%30s%02X", device_type, event_type, data, res);
if (len < 0 || len >= sizeof(data_buf))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("Resp Data buffer overflow");
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
// LOG_D("data_buf: %s", data_buf);
2025-01-17 13:23:16 +08:00
return _Send_Handle(ops, data_num, cmd, data_buf);
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
int Nt26k_Recv_Data(struct Nt26k_Ops *ops, char *data)
2024-12-30 11:50:48 +08:00
{
// ops->body = (struct DataBody *)rt_malloc(sizeof(struct DataBody));
// rt_memset(ops->body, 0, sizeof(struct DataBody));
// rt_free(ops->body);
return RT_EOK;
}
/***************************************发送处理函数************************************************ */
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Heartbeat(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
2025-01-17 13:23:16 +08:00
int ret = 0;
2024-12-30 11:50:48 +08:00
2024-12-30 18:04:47 +08:00
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
ret = device->class->device_ops->control(device, AT_DEVICE_CTRL_GET_SIGNAL, RT_NULL);
2024-12-30 11:50:48 +08:00
if (ret != RT_EOK)
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k get signal failed\n");
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
2025-01-17 13:23:16 +08:00
ret = nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_DATA_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_HEARTBEAT);
2024-12-30 11:50:48 +08:00
if (ret != RT_EOK)
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed\n");
2024-12-30 11:50:48 +08:00
return ret;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Time_Calibration(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_TIME_CALIBRATION, DEVICE_TYPE_NT26K, EVENT_TYPE_TIME_CALIBRATION))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", CMD_TYPE_TIME_CALIBRATION);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Alarm(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_ALARM))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_ALARM);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Alarm_Recover(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_ALARM_RECOVER))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_ALARM_RECOVER);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Fault(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_FAULT))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_FAULT);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Fault_Recover(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_FAULT_RECOVER))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_FAULT_RECOVER);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Self_Check(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_SELF_CHECK))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_SELF_CHECK);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Silence(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_SILENCE))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_SILENCE);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Exception(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_EXCEPTION))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_EXCEPTION);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Valve_Status(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_VALVE_STATUS))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_VALVE_STATUS);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Fan_Status(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_FAN_STATUS))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_FAN_STATUS);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Temp_Anomaly(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_TEMP_ANOMALY))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_TEMP_ANOMALY);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Power_Off(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_POWER_OFF))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_POWER_OFF);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Power_On(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_POWER_ON))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_POWER_ON);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
/**
*
* @param device
* @param param
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Send_Device_Failure(struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
if ((device == RT_NULL) || (nt26k_ops == RT_NULL))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k param error\n");
2024-12-30 11:50:48 +08:00
return RT_ERROR;
}
2025-01-17 13:23:16 +08:00
if (nt26k_ops->send(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_NT26K, EVENT_TYPE_DEVICE_FAILURE))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send cmd[%X] failed\n", EVENT_TYPE_DEVICE_FAILURE);
2024-12-30 11:50:48 +08:00
return -RT_ERROR;
}
return RT_EOK;
}
2025-01-09 15:29:36 +08:00
2024-12-30 11:50:48 +08:00
/*这个【4、优先级最低当同时触发后相同服务直接合并】暂时还没想好怎么做
线
线
使*/
2024-12-30 18:04:47 +08:00
const Nt26kEventInfo nt26k_event_info[] = {
2025-01-17 13:23:16 +08:00
{kNt26kPowerOnEvent, NT26K_PRIORITY_HIGHEST, "上电心跳事件", Nt26k_Send_Power_On},
{kNt26kPowerDownEvent, NT26K_PRIORITY_HIGH, "掉电事件", Nt26k_Send_Power_Off},
{kNt26kSelfCheckEvent, NT26K_PRIORITY_MEDIUM, "自检事件", Nt26k_Send_Self_Check},
{kNt26kHeartbeatEvent, NT26K_PRIORITY_LOWEST, "定时心跳事件", Nt26k_Send_Heartbeat},
{kNt26kTempAnomalyEvent, NT26K_PRIORITY_LOWEST, "温度异常事件", Nt26k_Send_Temp_Anomaly},
{kNt26kAlarmEvent, NT26K_PRIORITY_LOWEST, "报警触发事件", Nt26k_Send_Alarm},
{kNt26kAlarmRcyEvent, NT26K_PRIORITY_LOWEST, "报警解除事件", Nt26k_Send_Alarm_Recover},
{kNt26kFaultEvent, NT26K_PRIORITY_LOWEST, "传感器故障事件", Nt26k_Send_Fault},
{kNt26kFaultRcyEvent, NT26K_PRIORITY_LOWEST, "传感器故障解除事件", Nt26k_Send_Fault_Recover},
{kNt26kTimeCalibrationEvent, NT26K_PRIORITY_LOWEST, "时间校准事件", Nt26k_Send_Time_Calibration},
{kNt26kSilenceEvent, NT26K_PRIORITY_LOWEST, "消音事件", Nt26k_Send_Silence},
{kNt26kExceptionEvent, NT26K_PRIORITY_LOWEST, "异常事件", Nt26k_Send_Exception},
{kNt26kValveStatusEvent, NT26K_PRIORITY_LOWEST, "电磁阀状态改变事件", Nt26k_Send_Valve_Status},
{kNt26kFanStatusEvent, NT26K_PRIORITY_LOWEST, "风机状态改变事件", Nt26k_Send_Fan_Status},
{kNt26kDeviceFailureEvent, NT26K_PRIORITY_LOWEST, "设备失效事件", Nt26k_Send_Device_Failure}};
2024-12-30 11:50:48 +08:00
/**
2024-12-30 18:04:47 +08:00
* NT26K设备的事件
* @param nt26k_recv_event NT26K事件标志
2024-12-30 11:50:48 +08:00
* @return
*/
2025-01-17 13:23:16 +08:00
int Nt26k_Process_Events(Nt26kEvent nt26k_recv_event, struct at_device *device, void *param)
2024-12-30 11:50:48 +08:00
{
rt_err_t ret = RT_EOK;
rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
2025-01-22 13:33:38 +08:00
LOG_D("max_retry_count:%d\n", max_retry_count);
2025-01-09 15:29:36 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)param;
2024-12-30 18:04:47 +08:00
const Nt26kEventInfo *event = RT_NULL;
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
for (size_t i = 0; i < sizeof(nt26k_event_info) / sizeof(Nt26kEventInfo); ++i)
2024-12-30 11:50:48 +08:00
{
// 检查当前事件是否在接收到的事件标志中
2024-12-30 18:04:47 +08:00
if (nt26k_recv_event == nt26k_event_info[i].event_flag)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
event = &nt26k_event_info[i];
2024-12-30 11:50:48 +08:00
break;
}
}
2025-01-17 13:23:16 +08:00
if (event) // 处理该事件
2024-12-30 11:50:48 +08:00
{
LOG_D("%s上报\n", event->event_name);// 打印事件的名称
for (size_t i = 0; i < max_retry_count; i++)
2024-12-30 11:50:48 +08:00
{
if (nt26k_conncet_tcp_flag)
2024-12-30 11:50:48 +08:00
{
if (event->send_func)// 如果事件有关联的发送函数,则调用该发送函数
2024-12-30 11:50:48 +08:00
{
2025-01-15 10:32:56 +08:00
#ifdef TEST_ENABLE
2025-01-17 13:23:16 +08:00
RTC_ShowTime(); // 每次发送打印下时间,容易定位问题
2025-01-15 10:32:56 +08:00
#endif
2025-01-17 13:23:16 +08:00
rt_thread_mdelay(IMEI_Delay());
int result = event->send_func(device, nt26k_ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-21 09:18:29 +08:00
LOG_E("nt26k send failed\n");
ret = RT_ERROR;
2025-01-17 13:23:16 +08:00
continue;
2024-12-30 11:50:48 +08:00
}
else
{
2025-01-22 13:33:38 +08:00
if (rt_sem_take(nt26k_recv_msg_sem, 5000) == RT_EOK)
{
2025-01-22 13:33:38 +08:00
LOG_D("收到回复\n");
nt26k_connect_sever_flag = 1;
ret = RT_EOK; // 函数执行完毕返回0
2025-01-24 10:24:53 +08:00
break;
}
else
{
2025-01-22 13:33:38 +08:00
// 收不到说明在平台未注册,此时nt26k_connect_sever_flag 为0但nt26k_conncet_tcp_flag = 1此时不发起重连等待事件触发就行
nt26k_connect_sever_flag = 0;
ret = RT_ERROR;
}
2025-01-17 13:23:16 +08:00
}
2024-12-30 11:50:48 +08:00
}
}
else
{
2025-01-17 13:23:16 +08:00
if (!nt26k_disconnect_retry_flag)
{
LOG_D("断网,启动重连\n");
rt_sem_release(nt26k_disconnect_sem);
}
LOG_D("断网,等待连接中......\n");
ret = RT_ERROR;
}
2025-01-23 09:24:23 +08:00
rt_thread_mdelay(3000);
2024-12-30 11:50:48 +08:00
}
}
2025-01-24 10:24:53 +08:00
if (rt_strcmp(event->event_name, "掉电事件") == RT_EOK)
{
rt_uint8_t cnt = 0;
while ((device_power_down_flag == 0) && (cnt < 10))
2025-01-24 10:24:53 +08:00
{
rt_thread_mdelay(500);
}
if (device->class->device_ops->control(device, AT_DEVICE_CTRL_POWER_OFF, RT_NULL) == RT_EOK)
{
LOG_D("关闭模组");
nt26k_power_down_flag = 1;
ret = RT_EOK;
2025-01-24 10:24:53 +08:00
}
}
return ret;
2024-12-30 11:50:48 +08:00
}
// 比较帧头和帧尾
2025-01-17 13:23:16 +08:00
int Compare_HeaderToTail(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
// 比较帧头
for (int i = 0; i < 3; i++)
{
if (ops->frame->header[i] != ops->recv->header[i])
{
2025-01-17 13:23:16 +08:00
LOG_E("ops->frame->header[%x] != ops->recv->header[%x]\n", ops->frame->header[i], ops->recv->header[i]);
2024-12-30 11:50:48 +08:00
return -1;
}
}
// 比较帧尾
for (int i = 0; i < 3; i++)
{
if (ops->frame->tail[i] != ops->recv->tail[i])
{
2025-01-17 13:23:16 +08:00
LOG_E("ops->frame->tail[%x] != ops->recv->tail[%x]\n", ops->frame->tail[i], ops->recv->tail[i]);
2024-12-30 11:50:48 +08:00
return -2;
}
}
2025-01-17 13:23:16 +08:00
if (ops->recv->recv_data.res_num != RESPONSE_CODE_SUCCESS) // 判断是否为成功响应
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("ops->recv->recv_data.res_num[%x] != RESPONSE_CODE_SUCCESS\n", ops->recv->recv_data.res_num);
2024-12-30 11:50:48 +08:00
return -3;
}
return RT_EOK;
}
2025-01-17 13:23:16 +08:00
void Handle_Server_Reply(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
2025-01-09 15:29:36 +08:00
if ((ops->recv->recv_data.event_type == INSTRUCTION_HEART_BEAT) || (ops->recv->recv_data.event_type == EVENT_TYPE_POWER_ON))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("nt26k send data success\n");
2024-12-30 11:50:48 +08:00
}
else if (ops->recv->recv_data.event_type == EVENT_TYPE_POWER_OFF) // 是掉电事件回应
{
device_power_down_flag = 1;
}
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
void Handle_Self_Check(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("服务器下发自检指令\n");
2024-12-30 11:50:48 +08:00
char imei[16] = {0};
2025-01-17 13:23:16 +08:00
Get_IotImei(imei, FLASH_IOT_IMEI_LEN);
LOG_D("imei:%s\n", imei);
2024-12-30 11:50:48 +08:00
char temp[32] = "0";
2025-01-17 13:23:16 +08:00
String2Hex(temp, imei); // 将字符串转为十六进制字符串
LOG_D("temp: %s", temp);
Send_Laser_Alarm_Event(kSelfCheckEvent);
rt_thread_mdelay(100);
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_SELF_CHECK, temp, RESPONSE_CODE_SUCCESS);
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
void Handle_Mute(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("服务器下发消音指令\n");
2024-12-30 11:50:48 +08:00
char imei[16] = {0};
2025-01-17 13:23:16 +08:00
Get_IotImei(imei, FLASH_IOT_IMEI_LEN);
2024-12-30 11:50:48 +08:00
char temp[32] = "0";
2025-01-17 13:23:16 +08:00
String2Hex(temp, imei); // 将字符串转为十六进制字符串
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
Send_Laser_Alarm_Event(KMuteEvent);
rt_thread_mdelay(100);
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_MUTE, temp, RESPONSE_CODE_SUCCESS);
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
void Handle_Close_Valve(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("服务器下发关闭阀门指令\n");
2024-12-30 11:50:48 +08:00
char imei[16] = {0};
2025-01-17 13:23:16 +08:00
Get_IotImei(imei, FLASH_IOT_IMEI_LEN);
2024-12-30 11:50:48 +08:00
char temp[32] = "0";
2025-01-17 13:23:16 +08:00
String2Hex(temp, imei); // 将字符串转为十六进制字符串
2024-12-30 11:50:48 +08:00
EMV_CLOSE_VALVE;
2025-01-17 13:23:16 +08:00
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS);
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
void Handle_Open_Valve(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("服务器下发打开阀门指令\n");
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
void Handle_Open_Relay(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("服务器下发打开继电器指令\n");
2024-12-30 11:50:48 +08:00
char imei[16] = {0};
2025-01-17 13:23:16 +08:00
Get_IotImei(imei, FLASH_IOT_IMEI_LEN);
2024-12-30 11:50:48 +08:00
char temp[32] = "0";
2025-01-17 13:23:16 +08:00
String2Hex(temp, imei); // 将字符串转为十六进制字符串
2024-12-30 11:50:48 +08:00
relay_state_flag = 1;
2025-01-17 13:23:16 +08:00
rt_thread_mdelay(10);
2024-12-30 11:50:48 +08:00
// rt_uint8_t ret = BSP_Set_Relay_Status(0);
2025-01-17 13:23:16 +08:00
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_OPEN_RELAY, temp, RESPONSE_CODE_SUCCESS);
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
void Handle_Close_Relay(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("服务器下发关闭继电器指令\n");
2024-12-30 11:50:48 +08:00
char imei[16] = {0};
char temp[32] = "0";
2025-01-17 13:23:16 +08:00
Get_IotImei(imei, FLASH_IOT_IMEI_LEN);
String2Hex(temp, imei); // 将字符串转为十六进制字符串
2024-12-30 11:50:48 +08:00
relay_state_flag = 0;
2025-01-17 13:23:16 +08:00
rt_thread_mdelay(100);
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_CLOSE_RELAY, temp, RESPONSE_CODE_SUCCESS);
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
void Handle_Query_Params(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
rt_uint8_t data[10] = {0};
2025-01-17 13:23:16 +08:00
char str[64] = {0};
LOG_D("服务器下发查询系统参数\n");
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
rt_memcpy(data, (rt_uint8_t *)FLASH_HW_VER_ADDR, sizeof(sys_config_info) - 50);
LOG_D("hw_ver:%02x sw_ver:%02x alarm_low:%02x alarm_high:%02x temp_alarm:%02x iot_upload_cycle:%dmin retry:%02x emagnetic:%02X relay_switch:%02X\n",
data[0], data[1], data[2], data[3], data[4], ((data[5]) | (data[6] << 8)), data[7], data[8], data[9]);
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
rt_sprintf(str, "0000000000%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9]);
rt_thread_mdelay(100); // 释放下线程
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_QUERY_PARAMS, str, RESPONSE_CODE_SUCCESS);
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
int Handle_Config_Params(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
char data_buf[32] = {0};
rt_uint8_t recv_data[16] = {0};
2024-12-30 11:50:48 +08:00
rt_uint8_t flash_info[16] = {0};
2025-01-17 13:23:16 +08:00
char imei[16] = {0};
char temp[32] = "0";
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
LOG_D("服务器下发配置参数\n");
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
Get_IotImei(imei, FLASH_IOT_IMEI_LEN);
String2Hex(temp, imei); // 将字符串转为十六进制字符串
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
rt_memset(data_buf, '0', 32);
rt_memcpy(recv_data, (ops->recv->recv_data.res_data + 5), sizeof(sys_config_info) - 50);
rt_memcpy(flash_info, (rt_uint8_t *)FLASH_HW_VER_ADDR, sizeof(sys_config_info) - 50);
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
LOG_D("hw_ver:%02x sw_ver:%02x alarm_low:%02x alarm_high:%02x temp_alarm:%02x iot_upload_cycle:%d min retry:%02x emagnetic:%02X relay_switch:%02X\n",
flash_info[0], flash_info[1], flash_info[2], flash_info[3], flash_info[4], (flash_info[5] | (flash_info[6] << 8)), flash_info[7], flash_info[8], recv_data[9]);
LOG_D("recv_data: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x \n",
recv_data[0], recv_data[1], recv_data[2], recv_data[3], recv_data[4],
recv_data[5], recv_data[6], recv_data[7], recv_data[8], recv_data[9],
recv_data[10], recv_data[11], recv_data[12], recv_data[13], recv_data[14], recv_data[15]);
LOG_D("data:%s\n", data_buf);
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
for (rt_uint8_t i = 0; i < (sizeof(sys_config_info) - 50); i++)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("recv_data[%d] = %d", i, recv_data[i]);
2024-12-30 11:50:48 +08:00
if (recv_data[i] != flash_info[i])
{
if ((recv_data[2] > 25) || (recv_data[2] < 5)) /*家报的报警设定值应在5%~25%之间*/
{
2025-01-17 13:23:16 +08:00
if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_ACTION_FAILURE) == RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_W("recv_data[3] :%d", recv_data[3]);
LOG_W("配置参数超出范围,请核实后重试\n");
2024-12-30 11:50:48 +08:00
}
return RT_EOK;
}
2025-01-17 13:23:16 +08:00
else // 如果没有超出,再写入信息
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
if (BSP_Flash_Write_Info(recv_data, sizeof(sys_config_info) - 50) != 0)
2024-12-30 11:50:48 +08:00
{
2025-01-18 15:44:29 +08:00
rt_uint32_t iot_upload_time = (uint16_t)Flash_Get_SysCfg(kIotUploadCycleId);
rt_uint32_t timeout = iot_upload_time * 60 * RT_TICK_PER_SECOND;
2025-01-18 15:44:29 +08:00
if (iot_upload_time > 24 * 60 * 60 * RT_TICK_PER_SECOND)
{
timeout = 24 * 60 * 60 * RT_TICK_PER_SECOND;
LOG_E("iot_upload_time > 24 * 60 * 60 * RT_TICK_PER_SECOND");
}
else
{
timeout = iot_upload_time * 60 * RT_TICK_PER_SECOND;
}
2025-01-17 13:23:16 +08:00
rt_timer_control(nt26k_timer, RT_TIMER_CTRL_SET_TIME, (void *)&timeout); // 更新上报周期
rt_timer_start(nt26k_timer);
LOG_D("上报周期由%dmin更新为%dmin", ((flash_info[5] << 8) | flash_info[6]), iot_upload_time);
if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_SUCCESS) == RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("配置参数写入成功\n");
2024-12-30 11:50:48 +08:00
}
return RT_EOK;
}
else
{
2025-01-17 13:23:16 +08:00
LOG_D("配置参数写入失败\n");
if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_ACTION_FAILURE) == RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("写入失败响应成功\n");
2024-12-30 11:50:48 +08:00
}
return RT_ERROR;
}
}
}
}
2025-01-17 13:23:16 +08:00
if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_SUCCESS) == RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("配置参数没有变化\n");
2024-12-30 11:50:48 +08:00
}
return RT_EOK;
}
2025-01-17 13:23:16 +08:00
void Handle_Time_Calibration_Data(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
rt_uint8_t data[10] = {0};
TsRtcDateTime rtc_dt;
char imei[16] = {0};
char temp[32] = "0";
2025-01-17 13:23:16 +08:00
LOG_D("时间校准数据\n");
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
Get_IotImei(imei, FLASH_IOT_IMEI_LEN);
String2Hex(temp, imei); // 将字符串转为十六进制字符串
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
rt_memcpy(data, ops->recv->recv_data.res_data, sizeof(data));
2024-12-30 11:50:48 +08:00
// 提取后4个字节作为时间戳
time_t timestamp = (data[6] << 24) | (data[7] << 16) | (data[8] << 8) | data[9];
2025-01-17 13:23:16 +08:00
Timestamp_To_Rtc_DateTime(timestamp, &rtc_dt);
2024-12-30 11:50:48 +08:00
// 打印结果
2025-01-17 13:23:16 +08:00
LOG_I("时间: %04d-%02d-%02d %02d:%02d:%02d (星期%d)\n",
rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second, rtc_dt.week);
RTC_SetTime(rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, 0); /* Setup Time */
rt_thread_mdelay(100); // 释放下线程
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_TIME_CALIBRATION, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_TIME_CALIBRATION, temp, RESPONSE_CODE_SUCCESS);
2024-12-30 11:50:48 +08:00
}
// 下发修改服务器地址指令
2025-01-17 13:23:16 +08:00
void Handle_Sever_Addr_Set(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
rt_uint8_t data[6] = {0};
char imei[16] = {0};
char temp[32] = "0";
flash_sever_info sever_info = {0};
2025-01-17 13:23:16 +08:00
Get_IotImei(imei, FLASH_IOT_IMEI_LEN);
String2Hex(temp, imei); // 将字符串转为十六进制字符串
rt_memcpy(data, (ops->recv->recv_data.res_data + 9), FLASH_SERVER_LEN);
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]);
Flash_Set_Sever_Data(data);
rt_thread_mdelay(10);
2025-01-17 13:23:16 +08:00
if (Flash_Get_Sever_Data(&sever_info) != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("服务器地址修改失败\n");
2024-12-30 11:50:48 +08:00
}
else
{
2025-01-17 13:23:16 +08:00
LOG_D("服务器地址修改成功\n");
if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_SEVER_ADDR, temp, RESPONSE_CODE_SUCCESS) == RT_EOK)
{
Flash_Set_WorkDuration(work_duration);
2025-01-23 09:24:23 +08:00
rt_thread_mdelay(100);
reboot();
}
2024-12-30 11:50:48 +08:00
}
}
2025-01-17 13:23:16 +08:00
void Handle_Error(struct Nt26k_Ops *ops, rt_err_t ret)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("数据帧解析失败,错误码: %d", ret);
2024-12-30 11:50:48 +08:00
char imei[16] = {0};
char temp[32] = "0";
2025-01-17 13:23:16 +08:00
Get_IotImei(imei, FLASH_IOT_IMEI_LEN);
String2Hex(temp, imei); // 将字符串转为十六进制字符串
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, ops->recv->cmd, temp, RESPONSE_CODE_PARSE_FAIL);
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
void Handle_Instruction_Down(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)ops;
2024-12-30 11:50:48 +08:00
2024-12-30 18:04:47 +08:00
switch (nt26k_ops->recv->recv_data.event_type)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
case INSTRUCTION_DOWN_SELF_CHECK:
Handle_Self_Check(nt26k_ops);
break;
case INSTRUCTION_DOWN_MUTE:
Handle_Mute(nt26k_ops);
break;
case INSTRUCTION_DOWN_CLOSE_VALVE:
Handle_Close_Valve(nt26k_ops);
break;
case INSTRUCTION_DOWN_OPEN_VALVE:
Handle_Open_Valve(nt26k_ops);
break;
case INSTRUCTION_DOWN_OPEN_RELAY:
Handle_Open_Relay(nt26k_ops);
break;
case INSTRUCTION_DOWN_CLOSE_RELAY:
Handle_Close_Relay(nt26k_ops);
break;
case INSTRUCTION_DOWN_QUERY_PARAMS:
Handle_Query_Params(nt26k_ops);
break;
case INSTRUCTION_DOWN_CONFIG_PARAMS:
Handle_Config_Params(nt26k_ops);
break;
case INSTRUCTION_DOWN_TIME_CALIBRATION:
Handle_Time_Calibration_Data(nt26k_ops);
break;
case INSTRUCTION_DOWN_SEVER_ADDR:
Handle_Sever_Addr_Set(nt26k_ops);
break;
2024-12-30 11:50:48 +08:00
}
}
2025-01-17 13:23:16 +08:00
void Handle_Time_Calibration(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
rt_uint8_t data[10] = {0};
2025-01-17 13:23:16 +08:00
LOG_D("服务器下发时间校准数据\n");
rt_memcpy(data, ops->recv->recv_data.res_data, sizeof(data));
2024-12-30 11:50:48 +08:00
TsRtcDateTime rtc_dt;
// 提取后4个字节作为时间戳
time_t timestamp = (data[6] << 24) | (data[7] << 16) | (data[8] << 8) | data[9];
2025-01-17 13:23:16 +08:00
Timestamp_To_Rtc_DateTime(timestamp, &rtc_dt);
2024-12-30 11:50:48 +08:00
// 打印结果
2025-01-17 13:23:16 +08:00
LOG_I("时间: %04d-%02d-%02d %02d:%02d:%02d (星期%d)\n",
rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second, rtc_dt.week);
RTC_SetTime(rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second); /* Setup Time */
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_TIME_CALIBRATION, NT26K_DEFIENE_DATA, RESPONSE_CODE_SUCCESS);
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
void Handle_Cmd_Type(struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct Nt26k_Ops *nt26k_ops = (struct Nt26k_Ops *)ops;
2024-12-30 11:50:48 +08:00
2024-12-30 18:04:47 +08:00
switch (nt26k_ops->recv->cmd)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
case CMD_TYPE_SERVER_REPLY:
Handle_Server_Reply(nt26k_ops);
break;
case CMD_TYPE_INSTRUCTION_DOWN:
Handle_Instruction_Down(nt26k_ops);
break;
case CMD_TYPE_TIME_CALIBRATION:
Handle_Time_Calibration(nt26k_ops);
break;
default:
nt26k_ops->Resp(nt26k_ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, ops->recv->cmd, NT26K_DEFIENE_DATA, RESPONSE_CODE_PARSE_FAIL);
break;
2024-12-30 11:50:48 +08:00
}
}
2025-01-17 13:23:16 +08:00
void Analyze_Recv_Frame(struct at_device *device, struct Nt26k_Ops *ops)
2024-12-30 11:50:48 +08:00
{
rt_err_t ret = RT_EOK;
2025-01-17 13:23:16 +08:00
ret = Compare_HeaderToTail(ops);
2024-12-30 11:50:48 +08:00
if (ret == RT_EOK)
{
2025-01-17 13:23:16 +08:00
Handle_Cmd_Type(ops);
2024-12-30 11:50:48 +08:00
}
else
{
2025-01-17 13:23:16 +08:00
Handle_Error(ops, ret);
2024-12-30 11:50:48 +08:00
}
}
/*
120
*/
2025-01-17 13:23:16 +08:00
static void Nt26k_Send_Thread_Entry(void *param)
2024-12-30 11:50:48 +08:00
{
rt_err_t result = RT_EOK;
2024-12-30 18:04:47 +08:00
rt_uint32_t nt26k_recv_event;
2025-01-17 13:23:16 +08:00
LOG_D("nt26k thread entry\n");
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
struct Nt26k_Ops *ops = (struct Nt26k_Ops *)param;
2024-12-30 18:04:47 +08:00
struct at_device_nt26k *nt26k = &_dev;
2025-01-17 13:23:16 +08:00
struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, nt26k->device_name);
RT_ASSERT(device);
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
if (ops->init(ops, PROTOCOL_VERSION) != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k init failed\n");
2024-12-30 11:50:48 +08:00
}
else
{
2025-01-17 13:23:16 +08:00
LOG_D("nt26k init success\n");
rt_completion_wait(&nt26k_init_complate, RT_WAITING_FOREVER); // wait for nt26k init finish
Nt26k_Send_Event(kNt26kPowerOnEvent);
2024-12-30 11:50:48 +08:00
}
while (1)
{
2025-01-17 13:23:16 +08:00
result = rt_event_recv(&at_device_event,
Nt26k_Get_Event_Flag(kNt26kPowerOnEvent) |
Nt26k_Get_Event_Flag(kNt26kHeartbeatEvent) |
Nt26k_Get_Event_Flag(kNt26kSelfCheckEvent) |
Nt26k_Get_Event_Flag(kNt26kSilenceEvent) |
Nt26k_Get_Event_Flag(kNt26kExceptionEvent) |
Nt26k_Get_Event_Flag(kNt26kValveStatusEvent) |
Nt26k_Get_Event_Flag(kNt26kFanStatusEvent) |
Nt26k_Get_Event_Flag(kNt26kTempAnomalyEvent) |
Nt26k_Get_Event_Flag(kNt26kPowerOnEvent) |
Nt26k_Get_Event_Flag(kNt26kPowerDownEvent) |
Nt26k_Get_Event_Flag(kNt26kAlarmEvent) |
Nt26k_Get_Event_Flag(kNt26kAlarmRcyEvent) |
Nt26k_Get_Event_Flag(kNt26kFaultEvent) |
Nt26k_Get_Event_Flag(kNt26kFaultRcyEvent) |
Nt26k_Get_Event_Flag(kNt26kDeviceFailureEvent) |
Nt26k_Get_Event_Flag(kNt26kTimeCalibrationEvent),
RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
RT_WAITING_FOREVER, &nt26k_recv_event); // 这个事件一般是设备端发生了变化,发送到服务器时调用
2024-12-30 11:50:48 +08:00
if (result == RT_EOK)
{
2025-01-17 13:23:16 +08:00
if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kPowerOnEvent))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kPowerOnEvent, device, ops); // 当上电心跳包发送不成功时,其他事件不启动
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-09 15:29:36 +08:00
power_on_send_flag = 0;
2025-01-24 17:32:54 +08:00
rt_timer_start(nt26k_error_timer); // 启动重连定时器, 3min一次直到发送成功
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
2024-12-30 11:50:48 +08:00
}
else
{
rt_timer_start(nt26k_timer); // 当上电心跳包发送成功时, 开始心跳包周期发送
2025-01-17 13:23:16 +08:00
rt_timer_start(nt26k_upload_timer); // 周期修改时间更新
2025-01-09 15:29:36 +08:00
power_on_send_flag = 1;
2024-12-30 11:50:48 +08:00
}
}
2025-01-09 15:29:36 +08:00
if (power_on_send_flag)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kHeartbeatEvent))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kHeartbeatEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
2024-12-30 11:50:48 +08:00
}
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kTimeCalibrationEvent))
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
Time_Calibration(device);
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kAlarmEvent))
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kAlarmEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
if (SysControl.status == kAlarmEvent)
{
Nt26k_Send_Event(kNt26kAlarmEvent);
}
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
2024-12-30 11:50:48 +08:00
}
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kAlarmRcyEvent))
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kAlarmRcyEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
if (SysControl.status == kAlarmRcyEvent)
{
Nt26k_Send_Event(kNt26kAlarmRcyEvent);
}
2024-12-30 11:50:48 +08:00
}
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kFaultEvent))
2025-01-09 15:29:36 +08:00
{
result = Nt26k_Process_Events(kNt26kFaultEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
LOG_E("nt26k send data failed result = [%d]\n", result);
if (SysControl.status == kFaultEvent)
2024-12-30 11:50:48 +08:00
{
Nt26k_Send_Event(kNt26kFaultEvent);
2024-12-30 11:50:48 +08:00
}
}
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kFaultRcyEvent))
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kFaultRcyEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
if (SysControl.status == kFaultRcyEvent)
{
Nt26k_Send_Event(kNt26kFaultRcyEvent);
}
2024-12-30 11:50:48 +08:00
}
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kSelfCheckEvent))
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kSelfCheckEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
2024-12-30 11:50:48 +08:00
}
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kSilenceEvent))
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kSilenceEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
2024-12-30 11:50:48 +08:00
}
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kExceptionEvent))
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kExceptionEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
2024-12-30 11:50:48 +08:00
}
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kValveStatusEvent))
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kValveStatusEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
2024-12-30 11:50:48 +08:00
}
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kFanStatusEvent))
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kFanStatusEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
2024-12-30 11:50:48 +08:00
}
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kTempAnomalyEvent))
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kTempAnomalyEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
2024-12-30 11:50:48 +08:00
}
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kPowerDownEvent))
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
nt26k_event_initialized = RT_FALSE; // 当接收到掉电事件时,发送完成后删除事件,不再接收其他事件
result = Nt26k_Process_Events(kNt26kPowerDownEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
2024-12-30 11:50:48 +08:00
}
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
else if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kDeviceFailureEvent))
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
result = Nt26k_Process_Events(kNt26kDeviceFailureEvent, device, ops);
if (result != RT_EOK)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k send data failed result = [%d]\n", result);
2024-12-30 11:50:48 +08:00
}
}
}
}
}
}
2025-01-17 13:23:16 +08:00
static void Nt26k_Recv_Thread_Entry(void *parameter)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
struct Nt26k_Ops *ops = (struct Nt26k_Ops *)parameter;
2024-12-30 18:04:47 +08:00
struct at_device_nt26k *nt26k = &_dev;
2025-01-17 13:23:16 +08:00
struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, nt26k->device_name);
RT_ASSERT(device);
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
LOG_D("nt26k recv thread entry\n");
2024-12-30 11:50:48 +08:00
while (1)
{
2025-01-17 13:23:16 +08:00
rt_sem_take(nt26k_recv_sem, RT_WAITING_FOREVER); // 这个主要用来处理的数据
2024-12-31 17:48:22 +08:00
/*对数据帧进行分析,判断所处的是对服务器响应还是指令下发*/
2025-01-17 13:23:16 +08:00
Analyze_Recv_Frame(device, ops);
2024-12-30 11:50:48 +08:00
}
}
2025-01-17 13:23:16 +08:00
static void Nt26k_Life_Thread_Entry(void *parameter)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct at_device_nt26k *nt26k = &_dev;
2025-01-17 13:23:16 +08:00
struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, nt26k->device_name);
RT_ASSERT(device);
rt_err_t result = RT_EOK;
2025-01-17 10:41:37 +08:00
rt_uint32_t delay_n = 1;
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
LOG_D("nt26k_life_thread entry\n");
2024-12-30 11:50:48 +08:00
while (1)
{
2025-01-17 13:23:16 +08:00
result = rt_sem_take(nt26k_disconnect_sem, RT_WAITING_FOREVER);
if (result == RT_EOK)
2024-12-30 11:50:48 +08:00
{
2024-12-31 17:48:22 +08:00
if (!nt26k_conncet_tcp_flag)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("重连网络中...\n");
nt26k_connect_sever_flag = 0;
at_response_t resp = at_create_resp(64, 0, 5000);
2025-01-09 15:29:36 +08:00
if (resp == RT_NULL)
2024-12-31 17:48:22 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("No memory for response structure!");
at_delete_resp(resp);
result = -RT_ETIMEOUT;
2024-12-31 17:48:22 +08:00
}
2025-01-17 13:23:16 +08:00
if (device->class->device_ops->control(device, AT_DEVICE_CTRL_POWER_ON, RT_NULL) == RT_EOK)
2024-12-31 17:48:22 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_D("AT device power on success");
/* disable echo */
at_client_obj_wait_connect(device->client, 5000);
2025-01-17 13:23:16 +08:00
/*AT+QICFG="dataformat" 设置收发模式*/
if (at_obj_exec_cmd(device->client, resp, "AT+QICFG=\"dataformat\",%d,%d", AT_NSONMI_MODE_DEFAULT, AT_NSONMI_MODE_DEFAULT) != RT_EOK)
2025-01-09 15:29:36 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("AT+QICFG=\"dataformat\" error\n");
result = -RT_ETIMEOUT;
goto __exit;
}
/*设置显示模式*/
if (at_obj_exec_cmd(device->client, resp, "AT+QICFG=\"viewmode\",1") != RT_EOK)
{
LOG_E("AT+QICFG=\"viewmode\" error\n");
result = -RT_ETIMEOUT;
goto __exit;
}
/*设置保活信息*/
if (at_obj_exec_cmd(device->client, resp, "AT+QICFG=\"tcp/keepalive\",1,1000,100,10") != RT_EOK)
{
LOG_E("AT+QICFG=\"tcp/keepalive\" error\n");
result = -RT_ETIMEOUT;
goto __exit;
2025-01-09 15:29:36 +08:00
}
2025-01-17 13:23:16 +08:00
if (at_obj_exec_cmd(device->client, resp, "AT+QICFG=\"passiveclosed\",1") != RT_EOK)
{
LOG_E("AT+QICFG=\"passiveclosed\" error\n");
result = -RT_ETIMEOUT;
goto __exit;
}
if (at_obj_exec_cmd(device->client, resp, "AT+CGACT=1,1") != RT_EOK)
{
LOG_E("AT+CGACT=1,1 error\n");
result = -RT_ETIMEOUT;
goto __exit;
}
if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK)
{
LOG_D("重连网络成功\n");
nt26k_conncet_tcp_flag = RT_TRUE;
delay_n = 0;
nt26k_disconnect_retry_flag = 0;
}
else
{
2025-01-17 13:40:09 +08:00
device->class->device_ops->control(device, AT_DEVICE_RF_CLOSE, RT_NULL);
2025-01-17 13:23:16 +08:00
result = -RT_ETIMEOUT;
2025-01-23 16:29:51 +08:00
2025-01-17 13:23:16 +08:00
goto __exit;
}
at_delete_resp(resp);
2024-12-31 17:48:22 +08:00
}
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
}
else
{
delay_n = 0;
goto __exit;
}
__exit:
if (result != RT_EOK)
{
2025-01-22 10:43:57 +08:00
nt26k_disconnect_retry_flag = 1;
LOG_D("重连网络失败,等待%d s后重连\n", delay_n * 5);
2025-01-23 16:29:51 +08:00
2025-01-17 13:23:16 +08:00
rt_thread_mdelay(delay_n * 5000);
delay_n++;
if (delay_n >= 66) // 大于3小时的重连都不行则重启设备
2025-01-17 10:41:37 +08:00
{
2025-01-17 13:23:16 +08:00
Flash_Set_WorkDuration(work_duration);
2025-01-17 10:41:37 +08:00
delay_n = 0;
2025-01-17 13:23:16 +08:00
reboot();
2025-01-17 10:41:37 +08:00
}
2025-01-17 13:23:16 +08:00
rt_sem_release(nt26k_disconnect_sem);
2024-12-30 11:50:48 +08:00
}
}
}
// 定时器回调函数,当1分钟内没有数据交互时关闭tcp连接
2025-01-17 13:23:16 +08:00
static void Nt26k_Upload_Timer_Cb(void *parameter)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
Nt26k_Send_Event(kNt26kTimeCalibrationEvent); // 更新下时间
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
int BSP_Nt26k_Thread_Init(void)
2024-12-30 11:50:48 +08:00
{
rt_err_t ret;
2024-12-30 18:04:47 +08:00
Nt26k_Event_Init();
2025-01-24 17:32:54 +08:00
rt_uint32_t iot_upload_time = (uint32_t)Flash_Get_SysCfg(kIotUploadCycleId);
rt_uint32_t timeout = 0;
2025-01-23 16:29:51 +08:00
2025-01-18 11:33:04 +08:00
if (iot_upload_time > 24 * 60 * 60 * RT_TICK_PER_SECOND)
{
2025-01-18 11:33:04 +08:00
timeout = 24 * 60 * 60 * RT_TICK_PER_SECOND;
LOG_E("iot_upload_time > 24 * 60 * 60 * RT_TICK_PER_SECOND");
}
else
{
timeout = iot_upload_time * 60 * RT_TICK_PER_SECOND;
}
2025-01-23 16:29:51 +08:00
2025-01-17 13:23:16 +08:00
LOG_I("上报服务器周期:%d分钟", iot_upload_time);
nt26k_mutex = rt_mutex_create("nt26k_mutex", RT_IPC_FLAG_PRIO);
2024-12-30 18:04:47 +08:00
if (nt26k_mutex == RT_NULL)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k_mutex create failed");
2024-12-30 11:50:48 +08:00
}
2025-01-17 13:23:16 +08:00
nt26k_recv_sem = rt_sem_create("nt26k_recv", 0, RT_IPC_FLAG_PRIO);
2024-12-30 18:04:47 +08:00
if (nt26k_recv_sem == RT_NULL)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k_recv_sem create failed");
2024-12-30 11:50:48 +08:00
}
2025-01-22 13:33:38 +08:00
nt26k_recv_msg_sem = rt_sem_create("nt26k_recv_heart", 0, RT_IPC_FLAG_PRIO);
if (nt26k_recv_msg_sem == RT_NULL)
{
2025-01-22 13:33:38 +08:00
LOG_E("nt26k_recv_msg_sem create failed");
}
2025-01-17 13:23:16 +08:00
nt26k_disconnect_sem = rt_sem_create("nt26k_life", 0, RT_IPC_FLAG_PRIO);
2024-12-31 17:48:22 +08:00
if (nt26k_disconnect_sem == RT_NULL)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
LOG_E("nt26k_disconnect_sem create failed");
2024-12-30 11:50:48 +08:00
}
2025-01-18 11:33:04 +08:00
LOG_D("定时周期ticks = %d", timeout);
2024-12-30 11:50:48 +08:00
// 创建定时器
2025-01-17 13:23:16 +08:00
nt26k_timer = rt_timer_create("heartbeat",
Nt26k_Ht_Timer_Cb, // 回调函数
RT_NULL, // 参数
2025-01-20 18:55:21 +08:00
(rt_uint32_t)timeout, // 定时周期(单位:分钟)
2025-01-17 13:23:16 +08:00
RT_TIMER_FLAG_PERIODIC); // 周期性定时器
2024-12-30 18:04:47 +08:00
if (nt26k_timer == RT_NULL)
2024-12-30 11:50:48 +08:00
{
2025-01-17 13:23:16 +08:00
rt_kprintf("创建定时器失败\n");
2024-12-30 11:50:48 +08:00
return -1;
}
nt26k_error_timer = rt_timer_create("nt26k_error_timer",
Nt26k_Error_Timer_Cb,
RT_NULL,
3 * 60 * RT_TICK_PER_SECOND, // 3分钟
RT_TIMER_FLAG_PERIODIC);
nt26k_upload_timer = rt_timer_create("nt26k_upload_timer",
Nt26k_Upload_Timer_Cb,
RT_NULL,
24 * 60 * 60 * RT_TICK_PER_SECOND,
RT_TIMER_FLAG_PERIODIC);
2025-01-17 13:23:16 +08:00
ret = rt_thread_init(&nt26k_thread,
"nt26k_send_thread",
Nt26k_Send_Thread_Entry,
&nt26k_ops,
&nt26k_thread_stack[0],
sizeof(nt26k_thread_stack),
NT26K_THREAD_PRIORITY,
NT26K_THREAD_TICKS);
rt_thread_startup(&nt26k_thread);
ret = rt_thread_init(&nt26k_recv_thread,
"nt26k_recv_thread",
Nt26k_Recv_Thread_Entry,
&nt26k_ops,
&nt26k_recv_thread_stack[0],
sizeof(nt26k_recv_thread_stack),
NT26K_RECV_THREAD_PRIORITY,
NT26K_RECV_THREAD_TICKS);
rt_thread_startup(&nt26k_recv_thread);
ret = rt_thread_init(&nt26k_life_thread,
"nt26k_life_thread",
Nt26k_Life_Thread_Entry,
&nt26k_ops,
&nt26k_life_thread_stack[0],
sizeof(nt26k_life_thread_stack),
NT26K_LIFE_THREAD_PRIORITY,
NT26K_LIFE_THREAD_TICKS);
rt_thread_startup(&nt26k_life_thread);
2024-12-30 11:50:48 +08:00
return ret;
}
2025-01-09 15:29:36 +08:00
2024-12-30 18:04:47 +08:00
// INIT_APP_EXPORT(BSP_Nt26k_Thread_Init);
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
static int nt26k_device_register(void)
2024-12-30 11:50:48 +08:00
{
2024-12-30 18:04:47 +08:00
struct at_device_nt26k *nt26k = &_dev;
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
return at_device_register(&(nt26k->device),
nt26k->device_name,
nt26k->client_name,
AT_DEVICE_CLASS_NT26K,
(void *)nt26k);
2024-12-30 11:50:48 +08:00
}
2025-01-09 15:29:36 +08:00
2025-01-15 09:56:50 +08:00
INIT_COMPONENT_EXPORT(nt26k_device_register);
2024-12-30 11:50:48 +08:00
2025-01-17 13:23:16 +08:00
#endif // IOT_MODULE_SWITCH