修改了4G的发送逻辑
This commit is contained in:
parent
11bd76d695
commit
d446e2a999
|
@ -36,6 +36,7 @@ encoding//rt-thread/components/drivers/include/ipc/ringbuffer.h=GBK
|
||||||
encoding//rt-thread/components/drivers/ipc/completion.c=GBK
|
encoding//rt-thread/components/drivers/ipc/completion.c=GBK
|
||||||
encoding//rt-thread/components/drivers/ipc/ringbuffer.c=GBK
|
encoding//rt-thread/components/drivers/ipc/ringbuffer.c=GBK
|
||||||
encoding//rt-thread/components/drivers/serial/serial.c=GBK
|
encoding//rt-thread/components/drivers/serial/serial.c=GBK
|
||||||
|
encoding//rt-thread/components/finsh/finsh.h=GBK
|
||||||
encoding//rt-thread/components/finsh/shell.c=GBK
|
encoding//rt-thread/components/finsh/shell.c=GBK
|
||||||
encoding//rt-thread/components/net/at/include/at.h=GBK
|
encoding//rt-thread/components/net/at/include/at.h=GBK
|
||||||
encoding//rt-thread/components/net/at/src/at_cli.c=GBK
|
encoding//rt-thread/components/net/at/src/at_cli.c=GBK
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "bsp_mq.h"
|
#include "bsp_mq.h"
|
||||||
#include "bsp_button.h"
|
#include "bsp_button.h"
|
||||||
#include "bsp_ml307.h"
|
#include "bsp_ml307.h"
|
||||||
|
#include "bsp_adc.h"
|
||||||
#include "bsp_vin_detection.h"
|
#include "bsp_vin_detection.h"
|
||||||
#include "user_sys.h"
|
#include "user_sys.h"
|
||||||
#include "bsp_bt.h"
|
#include "bsp_bt.h"
|
||||||
|
@ -440,6 +441,7 @@ int main(void)
|
||||||
LOG_E("电磁阀动作失败");
|
LOG_E("电磁阀动作失败");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
GAS_POWER_CLOSE;
|
||||||
LOG_D("Enter AnalogWatchdog Interrupt");
|
LOG_D("Enter AnalogWatchdog Interrupt");
|
||||||
// 等待30s,要是还没断电就重启
|
// 等待30s,要是还没断电就重启
|
||||||
for (uint8_t i = 0; i < 30; i++)
|
for (uint8_t i = 0; i < 30; i++)
|
||||||
|
|
|
@ -191,7 +191,7 @@ uint32_t ip_to_uint32(const char *ip_str)
|
||||||
return ip;
|
return ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *hex_array)
|
int Convert_To_Hex(const flash_sever_info *sever_info, uint8_t *hex_array)
|
||||||
{
|
{
|
||||||
// 将 IP 地址转换为字节数组
|
// 将 IP 地址转换为字节数组
|
||||||
uint32_t ip_addr = ip_to_uint32(sever_info->server_url);
|
uint32_t ip_addr = ip_to_uint32(sever_info->server_url);
|
||||||
|
|
|
@ -269,13 +269,11 @@ typedef struct __attribute__((packed))
|
||||||
rt_uint8_t nb_iccid[20]; // ICCID
|
rt_uint8_t nb_iccid[20]; // ICCID
|
||||||
} sys_config_info;
|
} sys_config_info;
|
||||||
|
|
||||||
struct flash_sever_info
|
typedef struct
|
||||||
{
|
{
|
||||||
char server_url[64];
|
char server_url[32];
|
||||||
char server_port[8];
|
char server_port[8];
|
||||||
};
|
}flash_sever_info;
|
||||||
|
|
||||||
extern struct flash_sever_info sever_info;
|
|
||||||
|
|
||||||
void Flash_Write_Record(TeRecord record);
|
void Flash_Write_Record(TeRecord record);
|
||||||
int Get_Iot_Imei(char *buf, rt_size_t len);
|
int Get_Iot_Imei(char *buf, rt_size_t len);
|
||||||
|
@ -317,7 +315,7 @@ int Flash_Get_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number);
|
||||||
rt_uint8_t Flash_Get_Valve_Num(void);
|
rt_uint8_t Flash_Get_Valve_Num(void);
|
||||||
int Flash_Set_Valve_Num(rt_uint8_t valve_num);
|
int Flash_Set_Valve_Num(rt_uint8_t valve_num);
|
||||||
int BSP_Flash_Write_Info(rt_uint8_t *buf, rt_size_t len);
|
int BSP_Flash_Write_Info(rt_uint8_t *buf, rt_size_t len);
|
||||||
int Flash_Get_Sever_Addr_Info(struct flash_sever_info *sever_info);
|
int Flash_Get_Sever_Addr_Info(flash_sever_info *sever_info);
|
||||||
int Flash_Set_Sever_Addr_Info(rt_uint8_t *data);
|
int Flash_Set_Sever_Addr_Info(rt_uint8_t *data);
|
||||||
rt_uint16_t Flash_Get_WorkDuration(void);
|
rt_uint16_t Flash_Get_WorkDuration(void);
|
||||||
int Flash_Set_WorkDuration(rt_uint16_t value);
|
int Flash_Set_WorkDuration(rt_uint16_t value);
|
||||||
|
|
|
@ -233,5 +233,5 @@ extern rt_sem_t ml307_recv_sem;
|
||||||
extern rt_uint8_t ml307_conncet_tcp_flag;
|
extern rt_uint8_t ml307_conncet_tcp_flag;
|
||||||
extern rt_uint8_t power_on_send_flag;
|
extern rt_uint8_t power_on_send_flag;
|
||||||
|
|
||||||
extern rt_sem_t ml307_life_sem;
|
extern rt_sem_t ml307_disconnect_sem;
|
||||||
void Ml307_Send_Event(Ml307Event event_type);
|
void Ml307_Send_Event(Ml307Event event_type);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author : stark1898y 1658608470@qq.com
|
* @Author : stark1898y 1658608470@qq.com
|
||||||
* @Date : 2024-09-04 13:33:49
|
* @Date : 2024-09-04 13:33:49
|
||||||
* @LastEditors: mbw && 1600520629@qq.com
|
* @LastEditors: mbw && 1600520629@qq.com
|
||||||
* @LastEditTime: 2025-01-02 17:41:28
|
* @LastEditTime: 2025-01-03 16:44:30
|
||||||
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\at_device_ml307.c
|
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\at_device_ml307.c
|
||||||
* @Description :
|
* @Description :
|
||||||
*
|
*
|
||||||
|
@ -51,7 +51,7 @@ ml307_sys_info ml307 = {0};
|
||||||
struct rt_completion ml307_init_complate;
|
struct rt_completion ml307_init_complate;
|
||||||
volatile rt_uint8_t socket_id = 0;
|
volatile rt_uint8_t socket_id = 0;
|
||||||
|
|
||||||
rt_sem_t ml307_connect_sem;
|
rt_sem_t ml307_connect_flag_sem;
|
||||||
|
|
||||||
static rt_bool_t ml307_get_power_state(struct at_device *device)
|
static rt_bool_t ml307_get_power_state(struct at_device *device)
|
||||||
{
|
{
|
||||||
|
@ -102,17 +102,22 @@ static rt_err_t ml307_power_off(struct at_device *device)
|
||||||
|
|
||||||
rt_err_t Ml307_Reset(struct at_device *device)
|
rt_err_t Ml307_Reset(struct at_device *device)
|
||||||
{
|
{
|
||||||
at_client_send("AT+MREBOOT\r\n", rt_strlen("AT+MREBOOT\r\n"));
|
rt_pin_write(ML307_RST_PIN, PIN_HIGH);
|
||||||
|
rt_thread_mdelay(500);
|
||||||
|
rt_pin_write(ML307_RST_PIN, PIN_LOW);
|
||||||
|
rt_sem_release(ml307_disconnect_sem);
|
||||||
|
// at_client_send("AT+MREBOOT\r\n", rt_strlen("AT+MREBOOT\r\n"));
|
||||||
|
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TEST_ENABLE
|
#ifdef TEST_ENABLE
|
||||||
void TEST_Ml307_Reset()
|
void TEST_Ml307_Reset(void)
|
||||||
{
|
{
|
||||||
Ml307_Reset(RT_NULL);
|
Ml307_Reset(RT_NULL);
|
||||||
}
|
}
|
||||||
MSH_CMD_EXPORT(TEST_Ml307_Reset, "test_ml307_reset");
|
MSH_CMD_EXPORT(TEST_Ml307_Reset, "test_ml307_reset");
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t size)
|
static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t size)
|
||||||
|
@ -187,12 +192,14 @@ static void urc_tcp_connect_state(struct at_client *client, const char *data, rt
|
||||||
case 571:
|
case 571:
|
||||||
LOG_D("PDP激活失败");
|
LOG_D("PDP激活失败");
|
||||||
ml307_conncet_tcp_flag = 0;
|
ml307_conncet_tcp_flag = 0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_D("连接失败");
|
LOG_D("连接失败");
|
||||||
ml307_conncet_tcp_flag = 0;
|
ml307_conncet_tcp_flag = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
rt_sem_release(ml307_connect_sem);
|
rt_sem_release(ml307_connect_flag_sem);//用于返回连接的标志量在连接函数中
|
||||||
|
rt_sem_release(ml307_disconnect_sem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,23 +215,19 @@ static void urc_tcp_disconnect(struct at_client *client, const char *data, rt_si
|
||||||
if (id == socket_id)
|
if (id == socket_id)
|
||||||
{
|
{
|
||||||
ml307_conncet_tcp_flag = 0;
|
ml307_conncet_tcp_flag = 0;
|
||||||
if (SysControl.status == kNormalDetectionEvents)
|
|
||||||
{
|
|
||||||
LED_G_NORMAL;
|
|
||||||
}
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
LOG_D("服务器断开连接");
|
LOG_D("服务器断开连接");
|
||||||
rt_sem_release(ml307_life_sem);
|
rt_sem_release(ml307_disconnect_sem);
|
||||||
break;
|
break;
|
||||||
case 2: // 连接异常
|
case 2: // 连接异常
|
||||||
LOG_D("连接异常");
|
LOG_D("连接异常");
|
||||||
rt_sem_release(ml307_life_sem);
|
rt_sem_release(ml307_disconnect_sem);
|
||||||
break;
|
break;
|
||||||
case 3: // PDP去激活
|
case 3: // PDP去激活
|
||||||
LOG_D("ml307 tcp server PDP deactivate");
|
LOG_D("ml307 tcp server PDP deactivate");
|
||||||
rt_sem_release(ml307_life_sem);
|
rt_sem_release(ml307_disconnect_sem);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -233,14 +236,21 @@ static void urc_tcp_disconnect(struct at_client *client, const char *data, rt_si
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void urc_sim_remove(struct at_client *client, const char *data, rt_size_t size)
|
||||||
|
{
|
||||||
|
LOG_D("SIM removed");
|
||||||
|
Send_Laser_Alarm_Event(kFaultEvent);
|
||||||
|
}
|
||||||
static const struct at_urc urc_table[] = {
|
static const struct at_urc urc_table[] = {
|
||||||
{"REBOOTING", "\r\n", urc_device_reset}, // 这个是软件复位时,
|
{"REBOOTING", "\r\n", urc_device_reset}, // 这个是软件复位时,
|
||||||
{"+MIPOPEN:", "\r\n", urc_tcp_connect_state},
|
{"+MIPOPEN:", "\r\n", urc_tcp_connect_state},
|
||||||
{"+MIPURC: \"disconn\"", "\r\n", urc_tcp_disconnect},
|
{"+MIPURC: \"disconn\"", "\r\n", urc_tcp_disconnect},
|
||||||
{"+MIPURC: \"rtcp\"", "\r\n", urc_tcp_recv},
|
{"+MIPURC: \"rtcp\"", "\r\n", urc_tcp_recv},
|
||||||
{"+MATREADY", "\r\n", urc_device_reset},
|
{"+MATREADY", "\r\n", urc_device_reset},
|
||||||
|
{"+CPIN: SIM REMOVED", "\r\n", urc_sim_remove},
|
||||||
};
|
};
|
||||||
static void show_resp_info(at_response_t resp)
|
|
||||||
|
void show_resp_info(at_response_t resp)
|
||||||
{
|
{
|
||||||
RT_ASSERT(resp);
|
RT_ASSERT(resp);
|
||||||
/* Print response line buffer */
|
/* Print response line buffer */
|
||||||
|
@ -275,7 +285,6 @@ int at_device_ml307_disconnect_tcp(struct at_device *device)
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
ml307_conncet_tcp_flag = 0;
|
ml307_conncet_tcp_flag = 0;
|
||||||
show_resp_info(resp);
|
|
||||||
at_delete_resp(resp);
|
at_delete_resp(resp);
|
||||||
}
|
}
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
|
@ -283,6 +292,7 @@ int at_device_ml307_disconnect_tcp(struct at_device *device)
|
||||||
|
|
||||||
static int at_device_ml307_connect_tcp(struct at_device *device)
|
static int at_device_ml307_connect_tcp(struct at_device *device)
|
||||||
{
|
{
|
||||||
|
flash_sever_info sever_info = {0};
|
||||||
rt_err_t ret = RT_ERROR;
|
rt_err_t ret = RT_ERROR;
|
||||||
ASSERT(device);
|
ASSERT(device);
|
||||||
rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
|
rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
|
||||||
|
@ -306,7 +316,7 @@ static int at_device_ml307_connect_tcp(struct at_device *device)
|
||||||
{
|
{
|
||||||
if (at_resp_get_line_by_kw(resp, "OK") != RT_NULL)
|
if (at_resp_get_line_by_kw(resp, "OK") != RT_NULL)
|
||||||
{
|
{
|
||||||
if (rt_sem_take(ml307_connect_sem, 10000) == RT_EOK)
|
if (rt_sem_take(ml307_connect_flag_sem, 10000) == RT_EOK)
|
||||||
{
|
{
|
||||||
if (ml307_conncet_tcp_flag)
|
if (ml307_conncet_tcp_flag)
|
||||||
{
|
{
|
||||||
|
@ -317,7 +327,6 @@ static int at_device_ml307_connect_tcp(struct at_device *device)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_E("ml307 connect to tcp server fail");
|
LOG_E("ml307 connect to tcp server fail");
|
||||||
at_device_ml307_disconnect_tcp(device);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -328,7 +337,9 @@ static int at_device_ml307_connect_tcp(struct at_device *device)
|
||||||
}
|
}
|
||||||
else if (at_resp_get_line_by_kw(resp, "+CME ERROR: 559") == RT_EOK)//SOCKET错误
|
else if (at_resp_get_line_by_kw(resp, "+CME ERROR: 559") == RT_EOK)//SOCKET错误
|
||||||
{
|
{
|
||||||
at_device_ml307_disconnect_tcp(device);
|
ml307_conncet_tcp_flag = 0;
|
||||||
|
rt_sem_release(ml307_disconnect_sem);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rt_thread_mdelay(60000);
|
rt_thread_mdelay(60000);
|
||||||
|
@ -340,12 +351,6 @@ static int at_device_ml307_connect_tcp(struct at_device *device)
|
||||||
int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
|
int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
|
||||||
{
|
{
|
||||||
#define ML307_SEND_RESP_TIME (5000)
|
#define ML307_SEND_RESP_TIME (5000)
|
||||||
|
|
||||||
if (ml307_conncet_tcp_flag)
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN / 4, 0, ML307_SEND_RESP_TIME);
|
at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN / 4, 0, ML307_SEND_RESP_TIME);
|
||||||
|
|
||||||
if (resp == RT_NULL)
|
if (resp == RT_NULL)
|
||||||
|
@ -354,8 +359,11 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
|
||||||
at_delete_resp(resp);
|
at_delete_resp(resp);
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
while (retry < max_retry_count)
|
/*设置包模式*/
|
||||||
|
if (at_obj_exec_cmd(device->client, resp, "AT+MIPCFG=\"encoding\",0,1,1") != RT_EOK)
|
||||||
{
|
{
|
||||||
|
return RT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, send_len, data) == RT_EOK)
|
if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, send_len, data) == RT_EOK)
|
||||||
{
|
{
|
||||||
|
@ -368,26 +376,11 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
|
||||||
at_delete_resp(resp);
|
at_delete_resp(resp);
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_E("send data error, retry %d times, socket_id: %d", retry + 1, socket_id);
|
|
||||||
retry++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
retry++;
|
|
||||||
rt_thread_mdelay(1000);
|
|
||||||
}
|
}
|
||||||
at_delete_resp(resp);
|
at_delete_resp(resp);
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_D("not connected tcp sever!");
|
|
||||||
return -RT_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ml307_check_link_status(struct at_device *device)
|
static int ml307_check_link_status(struct at_device *device)
|
||||||
{
|
{
|
||||||
|
@ -1226,7 +1219,6 @@ rt_err_t Ml307_Get_Signal_Info(struct at_device *device)
|
||||||
/* check signal strength */
|
/* check signal strength */
|
||||||
for (i = 0; i < RETRY; i++)
|
for (i = 0; i < RETRY; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (at_obj_exec_cmd(device->client, resp, "AT+CSQ") == RT_EOK)
|
if (at_obj_exec_cmd(device->client, resp, "AT+CSQ") == RT_EOK)
|
||||||
{
|
{
|
||||||
int signal_strength = 0, err_rate = 0;
|
int signal_strength = 0, err_rate = 0;
|
||||||
|
@ -1263,8 +1255,7 @@ rt_err_t Ml307_Get_Signal_Info(struct at_device *device)
|
||||||
{
|
{
|
||||||
if ((rsrp < 97) && (rsrp > 0))
|
if ((rsrp < 97) && (rsrp > 0))
|
||||||
{
|
{
|
||||||
LOG_D("%s device signal rsrp: %d",
|
LOG_D("%s device signal rsrp: %d", device->name, rsrp);
|
||||||
device->name, rsrp);
|
|
||||||
ml307.rsrp = rsrp;
|
ml307.rsrp = rsrp;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1277,53 +1268,6 @@ rt_err_t Ml307_Get_Signal_Info(struct at_device *device)
|
||||||
LOG_E("%s device signal data failed", device->name);
|
LOG_E("%s device signal data failed", device->name);
|
||||||
result = -RT_ERROR;
|
result = -RT_ERROR;
|
||||||
}
|
}
|
||||||
// /* get signal snr, pci */
|
|
||||||
// for (int i = 0; i < RETRY; i++)
|
|
||||||
// {
|
|
||||||
// if (at_obj_exec_cmd(device->client, resp, "AT+NUESTATS") == RT_EOK)
|
|
||||||
// {
|
|
||||||
// const char *key1 = "SNR:";
|
|
||||||
// const char *key2 = "PCI:";
|
|
||||||
// int pci = 0, snr = 0;
|
|
||||||
// // show_resp_info(resp);
|
|
||||||
|
|
||||||
// // 获取第 2 行的响应
|
|
||||||
// const char *line = at_resp_get_line(resp, 2);
|
|
||||||
|
|
||||||
// if (line != NULL)
|
|
||||||
// {
|
|
||||||
// snr = Extract_Value(line, key1);
|
|
||||||
// pci = Extract_Value(line, key2);
|
|
||||||
|
|
||||||
// if (snr != 0 && pci != 0)
|
|
||||||
// {
|
|
||||||
// ml307.pci = pci;
|
|
||||||
// ml307.snr = snr;
|
|
||||||
// LOG_D("pci:%d,snr:%d", ml307.pci, ml307.snr);
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// LOG_D("Extracted values are invalid: SNR=%d, PCI=%d", snr, pci);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// LOG_D("Failed to get line 2 from response");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// LOG_D("Failed to execute AT command");
|
|
||||||
// }
|
|
||||||
// rt_thread_mdelay(2000);
|
|
||||||
// }
|
|
||||||
// if (i == RETRY)
|
|
||||||
// {
|
|
||||||
// LOG_E("%s device signal data failed", device->name);
|
|
||||||
// result = -RT_ERROR;
|
|
||||||
// }
|
|
||||||
|
|
||||||
at_delete_resp(resp);
|
at_delete_resp(resp);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1373,7 +1317,7 @@ static int ml307_init(struct at_device *device)
|
||||||
LOG_E("add netdev(%s) failed.", ml307->device_name);
|
LOG_E("add netdev(%s) failed.", ml307->device_name);
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
ml307_connect_sem = rt_sem_create("ml307_connect_sem", 0, RT_IPC_FLAG_PRIO);
|
ml307_connect_flag_sem = rt_sem_create("ml307_connect_flag_sem", 0, RT_IPC_FLAG_PRIO);
|
||||||
/* initialize ml307 pin configuration */
|
/* initialize ml307 pin configuration */
|
||||||
if (ml307->pwr_en_pin != -1)
|
if (ml307->pwr_en_pin != -1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author: mbw
|
* @Author: mbw
|
||||||
* @Date: 2024-12-03 10:31:45
|
* @Date: 2024-12-03 10:31:45
|
||||||
* @LastEditors: mbw && 1600520629@qq.com
|
* @LastEditors: mbw && 1600520629@qq.com
|
||||||
* @LastEditTime: 2025-01-02 14:11:22
|
* @LastEditTime: 2025-01-03 14:57:36
|
||||||
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_bt.c
|
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_bt.c
|
||||||
* @Description:
|
* @Description:
|
||||||
*
|
*
|
||||||
|
@ -333,10 +333,6 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
|
||||||
LOG_I("接收到阀门注册响应:");
|
LOG_I("接收到阀门注册响应:");
|
||||||
LOG_HEX("bt_rx_data:", 16, data_buf, fram_len);
|
LOG_HEX("bt_rx_data:", 16, data_buf, fram_len);
|
||||||
|
|
||||||
Flash_Set_Mac_Addr(&data_buf[4], data[index + 3] - 1);
|
|
||||||
rt_uint8_t num = Flash_Get_Valve_Num();
|
|
||||||
Flash_Set_Valve_Num(num + 1);
|
|
||||||
|
|
||||||
rt_sem_release(&bt_reg_sem);
|
rt_sem_release(&bt_reg_sem);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -70,24 +70,20 @@ static void _CommonBtnEvtCb(void *arg)
|
||||||
if (Flash_Set_Mac_Addr(mac_addr, 1) != RESET)
|
if (Flash_Set_Mac_Addr(mac_addr, 1) != RESET)
|
||||||
{
|
{
|
||||||
LOG_E("本地阀门信息清空完成");
|
LOG_E("本地阀门信息清空完成");
|
||||||
|
Flash_Set_Valve_Num(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Bt_Valve_Handler(kValveCmdRemAll, RT_NULL, RT_NULL);
|
Bt_Valve_Handler(kValveCmdRemAll, RT_NULL, RT_NULL);
|
||||||
if (rt_sem_take(&bt_rem_sem, 10000) == RT_EOK) // 如果没刷掉数据,则黄灯会亮一秒,如果刷成功了,则红灯闪一下黄灯不会亮
|
if (rt_sem_take(&bt_rem_sem, 10000) == RT_EOK) // 如果没刷掉数据,则黄灯会亮一秒,如果刷成功了,则红灯闪一下黄灯不会亮
|
||||||
{
|
{
|
||||||
|
LED_OFF(g);
|
||||||
|
LED_OFF(r);
|
||||||
|
LED_OFF(y);
|
||||||
LED_ON(r);
|
LED_ON(r);
|
||||||
rt_thread_mdelay(100);
|
rt_thread_mdelay(100);
|
||||||
LED_OFF(r);
|
LED_OFF(r);
|
||||||
LOG_I("本地清除阀门信息成功");
|
LOG_I("本地清除阀门信息成功");
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_E("本地清除阀门信息错误");
|
|
||||||
LED_OFF(g);
|
|
||||||
LED_ON(y);
|
|
||||||
rt_thread_mdelay(100);
|
|
||||||
LED_OFF(y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#if 1 // 测试LED灯状态用,测试完成后关闭
|
#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))
|
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))
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
// 在此修改默认的服务器地址
|
// 在此修改默认的服务器地址
|
||||||
struct flash_sever_info sever_info =
|
flash_sever_info sever_info =
|
||||||
{
|
{
|
||||||
.server_url = "8.130.122.162",
|
.server_url = "8.130.122.162",
|
||||||
.server_port = "7153",
|
.server_port = "7153",
|
||||||
|
@ -30,7 +30,7 @@ rt_uint8_t sys_temp_alarm_threshold = 0x32;
|
||||||
rt_uint8_t sys_emagnetic_switch = 0x04; // 具备阀门功能
|
rt_uint8_t sys_emagnetic_switch = 0x04; // 具备阀门功能
|
||||||
rt_uint8_t sys_relay_switch = 0x04; // 具备继电器功能
|
rt_uint8_t sys_relay_switch = 0x04; // 具备继电器功能
|
||||||
|
|
||||||
extern int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *hex_array);
|
extern int Convert_To_Hex(const flash_sever_info *sever_info, uint8_t *hex_array);
|
||||||
#define GETATTR(info, id) ((id) == kHwVerId ? (&(info)->hw_ver) \
|
#define GETATTR(info, id) ((id) == kHwVerId ? (&(info)->hw_ver) \
|
||||||
: (id) == kSwVerId ? (&(info)->sw_ver) \
|
: (id) == kSwVerId ? (&(info)->sw_ver) \
|
||||||
: (id) == kAlarmLValueId ? (&(info)->alarm_l_value) \
|
: (id) == kAlarmLValueId ? (&(info)->alarm_l_value) \
|
||||||
|
@ -280,15 +280,17 @@ int Flash_Set_WorkDuration(rt_uint16_t value)
|
||||||
return Flash_Write_ConfigInfo(page_buf);
|
return Flash_Write_ConfigInfo(page_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Flash_Get_Sever_Addr_Info(struct flash_sever_info *sever_info)
|
int Flash_Get_Sever_Addr_Info(flash_sever_info *sever_info)
|
||||||
{
|
{
|
||||||
rt_uint8_t data[FLASH_SERVER_LEN];
|
rt_uint8_t data[FLASH_SERVER_LEN];
|
||||||
rt_memcpy(data, (rt_uint8_t *)FLASH_SERVER_ADDR_ADDR, FLASH_SERVER_LEN);
|
rt_memcpy(data, (rt_uint8_t *)FLASH_SERVER_ADDR_ADDR, FLASH_SERVER_LEN);
|
||||||
if (data == RT_NULL)
|
if (data == RT_NULL)
|
||||||
{
|
{
|
||||||
LOG_E("Flash_Get_Sever_Addr_Info failed");
|
LOG_E("Flash_Get_Sever_Addr_Info failed");
|
||||||
|
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
|
LOG_D("FLASH_SERVER_ADDR_ADDR = %X", FLASH_SERVER_ADDR_ADDR);
|
||||||
LOG_D("data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x", 0, data[0], 1, data[1], 2, data[2], 3, data[3], 4, data[4], 5, data[5]);
|
LOG_D("data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x", 0, data[0], 1, data[1], 2, data[2], 3, data[3], 4, data[4], 5, data[5]);
|
||||||
rt_snprintf(sever_info->server_url, sizeof(sever_info->server_url), "%d.%d.%d.%d",
|
rt_snprintf(sever_info->server_url, sizeof(sever_info->server_url), "%d.%d.%d.%d",
|
||||||
data[3], data[2], data[1], data[0]);
|
data[3], data[2], data[1], data[0]);
|
||||||
|
@ -311,6 +313,7 @@ int Flash_Set_Sever_Addr_Info(rt_uint8_t *data)
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_D("Flash_Set_Sever_Addr_Info in_page_offset = %d", in_page_offset);
|
||||||
Flash_ErasePage_ReadConfigInfo(page_buf);
|
Flash_ErasePage_ReadConfigInfo(page_buf);
|
||||||
//*将传入的数据写到flash地址中
|
//*将传入的数据写到flash地址中
|
||||||
for (size_t i = 0; i < FLASH_SERVER_LEN; i++)
|
for (size_t i = 0; i < FLASH_SERVER_LEN; i++)
|
||||||
|
@ -345,6 +348,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 page_buf[FLASH_PAGE_SIZE] = {0};
|
||||||
rt_uint8_t in_page_offset = ((FLASH_VALVE_1_MAC_ADDR_ADDR + (number - 1) * 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);
|
||||||
|
LOG_D("FLASH_VALVE_1_MAC_ADDR_ADDR = %X", FLASH_VALVE_1_MAC_ADDR_ADDR);
|
||||||
|
LOG_D("FLASH_VALVE_MAC_ADDR_LEN = %d", in_page_offset);
|
||||||
if (mac_addr == RT_NULL)
|
if (mac_addr == RT_NULL)
|
||||||
{
|
{
|
||||||
return -RT_ERROR;
|
return -RT_ERROR;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author: mbw
|
* @Author: mbw
|
||||||
* @Date: 2024-11-30 15:46:21
|
* @Date: 2024-11-30 15:46:21
|
||||||
* @LastEditors: mbw && 1600520629@qq.com
|
* @LastEditors: mbw && 1600520629@qq.com
|
||||||
* @LastEditTime: 2025-01-02 10:41:22
|
* @LastEditTime: 2025-01-03 16:53:49
|
||||||
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c
|
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c
|
||||||
* @Description:
|
* @Description:
|
||||||
*
|
*
|
||||||
|
@ -48,12 +48,11 @@ static struct rt_thread ml307_life_thread;
|
||||||
|
|
||||||
struct rt_event at_device_event;
|
struct rt_event at_device_event;
|
||||||
rt_sem_t ml307_recv_sem;
|
rt_sem_t ml307_recv_sem;
|
||||||
rt_sem_t ml307_life_sem;
|
rt_sem_t ml307_disconnect_sem;
|
||||||
static rt_timer_t ml307_timer; // 上报心跳
|
static rt_timer_t ml307_timer; // 上报心跳
|
||||||
static rt_timer_t ml307_upload_timer; // 更新本地时间定时器
|
static rt_timer_t ml307_upload_timer; // 更新本地时间定时器
|
||||||
static rt_timer_t ml307_power_error_timer; // 上电失败情况下启动定时器
|
static rt_timer_t ml307_power_error_timer; // 上电失败情况下启动定时器
|
||||||
|
|
||||||
|
|
||||||
rt_uint8_t ml307_conncet_tcp_flag;
|
rt_uint8_t ml307_conncet_tcp_flag;
|
||||||
Ml307EventIndex ml307_event_index;
|
Ml307EventIndex ml307_event_index;
|
||||||
|
|
||||||
|
@ -338,8 +337,6 @@ int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd,
|
||||||
|
|
||||||
rt_memset(ops->body, 0, sizeof(struct DataBody));
|
rt_memset(ops->body, 0, sizeof(struct DataBody));
|
||||||
rt_mutex_take(ml307_mutex, RT_WAITING_FOREVER);
|
rt_mutex_take(ml307_mutex, RT_WAITING_FOREVER);
|
||||||
if (ml307_conncet_tcp_flag)
|
|
||||||
{
|
|
||||||
ret = ml307_ops.update_data(ops, device_type, event_type);
|
ret = ml307_ops.update_data(ops, device_type, event_type);
|
||||||
if (ret == RT_EOK)
|
if (ret == RT_EOK)
|
||||||
{
|
{
|
||||||
|
@ -362,7 +359,6 @@ int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd,
|
||||||
ret = -ret;
|
ret = -ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
rt_mutex_release(ml307_mutex);
|
rt_mutex_release(ml307_mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -778,6 +774,9 @@ const Ml307EventInfo ml307_event_info[] = {
|
||||||
*/
|
*/
|
||||||
int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, void *param)
|
int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, void *param)
|
||||||
{
|
{
|
||||||
|
rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId);
|
||||||
|
LOG_D("max_retry_count:%d", max_retry_count);
|
||||||
|
|
||||||
struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param;
|
struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param;
|
||||||
const Ml307EventInfo *event = RT_NULL;
|
const Ml307EventInfo *event = RT_NULL;
|
||||||
|
|
||||||
|
@ -790,12 +789,14 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event) // 处理该事件
|
if (event) // 处理该事件
|
||||||
{
|
{
|
||||||
// 打印事件的名称
|
// 打印事件的名称
|
||||||
LOG_D("%s上报\n", event->event_name);
|
LOG_D("%s上报\n", event->event_name);
|
||||||
|
for (size_t i = 0; i < max_retry_count; i++)
|
||||||
|
{
|
||||||
|
if (ml307_conncet_tcp_flag)
|
||||||
|
{
|
||||||
// 如果事件有关联的发送函数,则调用该发送函数
|
// 如果事件有关联的发送函数,则调用该发送函数
|
||||||
if (event->send_func)
|
if (event->send_func)
|
||||||
{
|
{
|
||||||
|
@ -803,33 +804,21 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device,
|
||||||
if (result != RT_EOK)
|
if (result != RT_EOK)
|
||||||
{
|
{
|
||||||
LOG_E("ml307 send cmd failed\n");
|
LOG_E("ml307 send cmd failed\n");
|
||||||
Ml307_Reset(device); // 重启模组
|
}
|
||||||
|
else
|
||||||
|
return RT_EOK;// 函数执行完毕,返回0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_D("断网\n");
|
||||||
|
rt_sem_release(ml307_disconnect_sem);
|
||||||
|
}
|
||||||
rt_thread_mdelay(5000);
|
rt_thread_mdelay(5000);
|
||||||
if (ml307_conncet_tcp_flag != 1)
|
}
|
||||||
{
|
}
|
||||||
if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK) // 打开连接
|
|
||||||
{
|
|
||||||
result = event->send_func(device, ml307_ops);
|
|
||||||
if (result != RT_EOK)
|
|
||||||
{
|
|
||||||
LOG_E("ml307 send cmd after module reset failed\n");
|
|
||||||
|
|
||||||
Ml307_Reset(device);
|
return RT_ERROR;
|
||||||
rt_thread_mdelay(5000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_E("ml307 connect tcp failed\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return RT_EOK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 函数执行完毕,返回0
|
|
||||||
return RT_EOK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 比较帧头和帧尾
|
// 比较帧头和帧尾
|
||||||
|
@ -1149,6 +1138,7 @@ void Handle_Time_Calibration_Data(struct Ml307_Ops *ops)
|
||||||
// 下发修改服务器地址指令
|
// 下发修改服务器地址指令
|
||||||
void Handle_Sever_Addr_Set(struct Ml307_Ops *ops)
|
void Handle_Sever_Addr_Set(struct Ml307_Ops *ops)
|
||||||
{
|
{
|
||||||
|
flash_sever_info sever_info = {0};
|
||||||
rt_uint8_t data[6] = {0};
|
rt_uint8_t data[6] = {0};
|
||||||
char imei[16] = {0};
|
char imei[16] = {0};
|
||||||
char temp[32] = "0";
|
char temp[32] = "0";
|
||||||
|
@ -1180,7 +1170,7 @@ rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops)
|
||||||
Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN);
|
Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN);
|
||||||
String2Hex(temp, imei); // 将字符串转为十六进制字符串
|
String2Hex(temp, imei); // 将字符串转为十六进制字符串
|
||||||
|
|
||||||
if (cnt >= MAX_VALVE_NUM)
|
if (cnt >= 1)
|
||||||
{
|
{
|
||||||
LOG_E("阀门设备数量超过最大值\n");
|
LOG_E("阀门设备数量超过最大值\n");
|
||||||
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE);
|
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE);
|
||||||
|
@ -1190,6 +1180,12 @@ rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops)
|
||||||
if (cnt >= 0 && cnt < MAX_VALVE_NUM)
|
if (cnt >= 0 && cnt < MAX_VALVE_NUM)
|
||||||
{
|
{
|
||||||
rt_memcpy(data, (ops->recv->recv_data.res_data + 8), FLASH_VALVE_MAC_ADDR_LEN + 1);
|
rt_memcpy(data, (ops->recv->recv_data.res_data + 8), FLASH_VALVE_MAC_ADDR_LEN + 1);
|
||||||
|
if (data[0] > 1)
|
||||||
|
{
|
||||||
|
LOG_E("阀门设备数量超过最大值[1]\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_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
LOG_D("data[0] = %x data[1] = %x data[2] = %x data[3] = %x data[4] = %x, data[5] = %x data[6] = %x", data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
|
LOG_D("data[0] = %x data[1] = %x data[2] = %x data[3] = %x data[4] = %x, data[5] = %x data[6] = %x", data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
|
||||||
|
|
||||||
|
@ -1694,13 +1690,24 @@ static void Ml307_Life_Thread_Entry(void *parameter)
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
ret = rt_sem_take(ml307_life_sem, RT_WAITING_FOREVER);
|
ret = rt_sem_take(ml307_disconnect_sem, RT_WAITING_FOREVER);
|
||||||
if (ret == RT_EOK)
|
if (ret == RT_EOK)
|
||||||
{
|
{
|
||||||
if (ml307_conncet_tcp_flag != RT_TRUE)
|
if (ml307_conncet_tcp_flag != RT_TRUE)
|
||||||
{
|
{
|
||||||
device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL);
|
LOG_D("重连网络中...\n");
|
||||||
LOG_D("retry ml307 tcp connect\n ");
|
device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_DISCONN, RT_NULL); // 先关闭,再处理
|
||||||
|
if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK)
|
||||||
|
{
|
||||||
|
LOG_D("重连网络成功\n");
|
||||||
|
ml307_conncet_tcp_flag = RT_TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_D("重连网络失败\n");
|
||||||
|
rt_thread_mdelay(10000);
|
||||||
|
rt_sem_release(ml307_disconnect_sem);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1730,10 +1737,10 @@ int BSP_Ml307_Thread_Init(void)
|
||||||
LOG_E("ml307_recv_sem create failed");
|
LOG_E("ml307_recv_sem create failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
ml307_life_sem = rt_sem_create("ml307_life", 0, RT_IPC_FLAG_FIFO);
|
ml307_disconnect_sem = rt_sem_create("ml307_life", 0, RT_IPC_FLAG_FIFO);
|
||||||
if (ml307_life_sem == RT_NULL)
|
if (ml307_disconnect_sem == RT_NULL)
|
||||||
{
|
{
|
||||||
LOG_E("ml307_life_sem create failed");
|
LOG_E("ml307_disconnect_sem create failed");
|
||||||
}
|
}
|
||||||
// 创建定时器
|
// 创建定时器
|
||||||
ml307_timer = rt_timer_create("heartbeat",
|
ml307_timer = rt_timer_create("heartbeat",
|
||||||
|
|
Loading…
Reference in New Issue