2024-05-31
This commit is contained in:
1 parent
f8591b8b99
commit
4a963bd78c
25 files changed
+2846
-119
No files matched your search
@@ -12,6 +12,7 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "mqtt-board.h"
|
||||
#include "relay-board.h"
|
||||
#include "data.h"
|
||||
uint32_t os_timer_count = 1;
|
||||
|
||||
@@ -38,7 +39,7 @@ static rt_timer_t locktimer;
|
||||
static void locktimerouter (void* parameter)
|
||||
{
|
||||
// todo 关闭定时器
|
||||
HAL_GPIO_WritePin (LOCK_GPIO_Port, LOCK_Pin, GPIO_PIN_RESET);
|
||||
MX_Relay_Push(RELAYDoor,RELAY_DISC);
|
||||
}
|
||||
|
||||
static void thread_entry (void *parameter)
|
||||
@@ -68,6 +69,7 @@ static void thread_entry (void *parameter)
|
||||
//gCommEvents = rt_event_create ("gCommEvents", RT_IPC_FLAG_FIFO) ;
|
||||
|
||||
locktimer = rt_timer_create ("locktimer", locktimerouter, RT_NULL, 1000, RT_TIMER_FLAG_ONE_SHOT); // 异常检测定时器
|
||||
RtcThreadStart ();
|
||||
SluiceThreadStart(); // 闸门控制线程
|
||||
U4851ThreadStart(); // 4851采集线程
|
||||
U4852ThreadStart(); // 4852采集线程
|
||||
@@ -89,7 +91,7 @@ static void thread_entry (void *parameter)
|
||||
if (RT_EOK == rt_event_recv (gCtrlEvents, EVENT_CTRL_SET_UNLOCK, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 2000, RT_NULL)) // 数据接受失败,上报异常状态
|
||||
{
|
||||
// todo: 打开继电器,开启定时器
|
||||
HAL_GPIO_WritePin (LOCK_GPIO_Port, LOCK_Pin, GPIO_PIN_SET);
|
||||
MX_Relay_Push(RELAYDoor,RELAY_CONN);
|
||||
rt_timer_start (locktimer);
|
||||
}
|
||||
}
|
||||
|
||||
+12
-5
@@ -64,10 +64,14 @@
|
||||
#define CFG_THREAD_PRIORITY 13 // 优先级
|
||||
#define CFG_THREAD_TIMESLICE 5
|
||||
|
||||
// UI线程
|
||||
// 升级
|
||||
#define UPGRADE_THREAD_PRIORITY 12 // 优先级
|
||||
#define UPGRADE_THREAD_TIMESLICE 5
|
||||
|
||||
// RTC
|
||||
#define RTC_THREAD_PRIORITY 11 // 优先级
|
||||
#define RTC_THREAD_TIMESLICE 5
|
||||
|
||||
int ThreadNewOsApp (void);
|
||||
|
||||
void SluiceThreadStart (void);
|
||||
@@ -84,6 +88,7 @@ void CAT1ThreadStart (void);
|
||||
void ZS001ThreadStart (void);
|
||||
void MJEth1ThreadStart (void);
|
||||
void UpgradeThreadStart (void);
|
||||
void RtcThreadStart (void);
|
||||
|
||||
#define EVENT_CTRL_SET_OPT_SLU (1U<< 0) // 发送开度控制到提闸线程
|
||||
#define EVENT_CTRL_SET_STP_SLU (1U<< 1) // 发送停止控制到提闸线程
|
||||
@@ -118,6 +123,7 @@ void UpgradeThreadStart (void);
|
||||
#define EVENT_TRIG_COMM_RX (1U << 6) // MQTT 接受到数据
|
||||
#define EVENT_TRIG_COMM_RST (1U << 7) // MQTT 发送数据
|
||||
#define EVENT_TRIG_UPGRADE_RX (1U << 8) // MQTT 接受到数据
|
||||
#define EVENT_TRIG_NETMODE_TX2 (1U << 9) // 通过网络模块向通道2发送数据
|
||||
|
||||
|
||||
#define MAIL_COMM_HEART 0
|
||||
@@ -127,6 +133,7 @@ void UpgradeThreadStart (void);
|
||||
#define MAIL_COMM_UPACK 4 // 提闸的ACK
|
||||
#define MAIL_COMM_SLACK 5 // 其他的ACK
|
||||
#define MAIL_COMM_READPARA 6 // 读取参数
|
||||
#define MAIL_COMM_ACK 7 // 读取参数
|
||||
|
||||
#define MAIL_SLUICE_OPT 0
|
||||
#define MAIL_SLUICE_STP 1
|
||||
@@ -134,10 +141,10 @@ void UpgradeThreadStart (void);
|
||||
#define MAIL_SLUICE_SDW 3
|
||||
|
||||
|
||||
#define MAIL_CT_OPT 0
|
||||
#define MAIL_CT_SUP 1
|
||||
#define MAIL_CT_SDW 2
|
||||
#define MAIL_CT_STP 3
|
||||
#define MAIL_CT_OPT 0 // 执行
|
||||
#define MAIL_CT_SUP 1 // 上升
|
||||
#define MAIL_CT_SDW 2 // 下降
|
||||
#define MAIL_CT_STP 3 // 停止
|
||||
|
||||
#define MAIL_VIEW_LOGIN 1 // 登录成功 需要跳转页面
|
||||
#define MAIL_VIEW_FLUSH 2 // 刷新界面显示
|
||||
|
||||
+46
-6
@@ -3,6 +3,17 @@
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************
|
||||
* 版本信息
|
||||
******************************************/
|
||||
volatile const char _makeData[] = __DATE__; //12字节,编译日期
|
||||
volatile const char _makeTime[] = __TIME__; //9字节
|
||||
volatile const char cBootv[] = "Ver3.0.0"; //获取时添加上面两个时间信息,最大长度64字节
|
||||
char _versionTemp[64];
|
||||
|
||||
|
||||
|
||||
const StrIndex_t cDownDataType[] =
|
||||
{
|
||||
{"run", DownRun},
|
||||
@@ -14,7 +25,8 @@ const StrIndex_t cDownDataType[] =
|
||||
{"update", DownUpdate},
|
||||
{"reboot", DownReboot},
|
||||
{"config", DownConfig},
|
||||
{"read",DownRead}
|
||||
{"read", DownRead},
|
||||
{"fact", DownFact}
|
||||
};
|
||||
|
||||
|
||||
@@ -24,9 +36,10 @@ const StrIndex_t cSiteType[] =
|
||||
{"sluice", SiteSluice},
|
||||
{"flow", SiteFlow},
|
||||
{"press", SiteSee},
|
||||
{"auto",SiteColl} ,
|
||||
{"auto", SiteColl}, // 自动化采集站
|
||||
{"trans", SiteServer},
|
||||
{"level",SiteLevel}
|
||||
{"level", SiteLevel},
|
||||
{"skew", SiteSkew} //测斜仪
|
||||
};
|
||||
|
||||
|
||||
@@ -36,8 +49,12 @@ const StrIndex_t cMotorType[] =
|
||||
{"qh100", MT_QH_V100},
|
||||
{"qh200", MT_QH_V200},
|
||||
{"zs100", MT_ZS_V100},
|
||||
{"dy100",MT_DY_V100} ,
|
||||
{"kg100",MT_KG_V100}
|
||||
{"jz200", MT_JZ_V200}, // 金志 4-20 ma
|
||||
{"dy100", MT_DY_V100}, // 大禹锥型阀
|
||||
{"kg100", MT_KG_V100}, // 开关量模块
|
||||
{"kr100", MT_KR_V100}, // 闸位计
|
||||
{"asca3", MT_ASC_A3}, // A3 驱动器
|
||||
{"ascws", MT_ASC_WS}, // A3 驱动器
|
||||
};
|
||||
|
||||
const StrIndex_t c4851Type[] =
|
||||
@@ -45,8 +62,11 @@ const StrIndex_t c4851Type[] =
|
||||
{"mg1000", ST_MG_1000},
|
||||
{"qh100", ST_QH_V100},
|
||||
{"qh200", ST_QH_V200},
|
||||
{"zs100", ST_ZS_V100}, // 中盛4-20ma
|
||||
{"dy100", ST_DY_V100},
|
||||
{"kg100", ST_KG_V100},
|
||||
{"at100", ST_AT_V100},
|
||||
{"kr100", ST_KR_V100},
|
||||
};
|
||||
|
||||
const StrIndex_t cU485Type[] =
|
||||
@@ -54,6 +74,7 @@ const StrIndex_t cU485Type[] =
|
||||
{"modbus", 0}
|
||||
};
|
||||
|
||||
// 485 2 通道
|
||||
const StrIndex_t c4852Type[] =
|
||||
{
|
||||
{"rds600", ST_RDS_600},
|
||||
@@ -61,7 +82,8 @@ const StrIndex_t c4852Type[] =
|
||||
{"ht100", ST_HT_V100},
|
||||
{"zkjszk", ST_ZK_JSZK},
|
||||
{"djx100", ST_DJX_100},
|
||||
{"rds300",ST_RDS_300}
|
||||
{"rds300", ST_RDS_300},
|
||||
{"mi600", ST_MI_600} // 测斜仪
|
||||
};
|
||||
|
||||
|
||||
@@ -98,7 +120,14 @@ const ParShallInfo_t ParShallTale[] =
|
||||
|
||||
SluiceData_t SluiceData[SLUICE_COUTN];
|
||||
WaterData_t WaterData[WATER_COUTN];
|
||||
|
||||
InclinometerData_t IncData[6]; // 测斜仪数据
|
||||
|
||||
SysData_t SysData;
|
||||
SOFTRTC_t g_SoftRtc =
|
||||
{
|
||||
23, 10, 1, 0, 0, 0
|
||||
};
|
||||
|
||||
uint32_t g_ifconfig = 0;
|
||||
uint32_t g_ifupdate = 0;
|
||||
@@ -186,6 +215,17 @@ int cSiteType2Index(char * str)
|
||||
|
||||
|
||||
|
||||
/**********************************************
|
||||
获取boot版本信息
|
||||
**********************************************/
|
||||
void *GetVersion (void)
|
||||
{
|
||||
int i = rt_sprintf (_versionTemp, "%s-%s %s", cBootv, _makeData, _makeTime);
|
||||
_versionTemp[i] = 0;
|
||||
return (void*) _versionTemp;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+38
-2
@@ -3,13 +3,20 @@
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
|
||||
#define SLUICE_COUTN 1// 当前处理几口闸
|
||||
#define WATER_COUTN 6// 当前接入n个流量计
|
||||
|
||||
#define SUBTOPIC_COUNT 1 // 订阅topic 数量
|
||||
#define SLUCIE_EXEC_COUNT 20// 闸门异常时间
|
||||
|
||||
|
||||
#define VERSION "V2.0.1"
|
||||
#define VERSION "KRH-1.0.16"
|
||||
// #define AI_AOVERSION "KRH-1.0.16"
|
||||
//AIAO
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -78,10 +85,28 @@ typedef struct SysData_t
|
||||
int fileSize; // 文件大小
|
||||
} SysData_t;
|
||||
|
||||
typedef struct SOFTRTC_t
|
||||
{
|
||||
uint8_t year;
|
||||
uint8_t month;
|
||||
uint8_t day;
|
||||
uint8_t hour;
|
||||
uint8_t minutes;
|
||||
uint8_t second;
|
||||
} SOFTRTC_t;
|
||||
|
||||
|
||||
|
||||
|
||||
// 水量参数
|
||||
typedef struct InclinometerData_t
|
||||
{
|
||||
uint8_t dir; // 方向
|
||||
uint32_t data;// 数据
|
||||
} InclinometerData_t;
|
||||
|
||||
|
||||
// 测斜数据
|
||||
typedef struct WaterData_t
|
||||
{
|
||||
int64_t ttWater; // 累计流量 单位 m3
|
||||
@@ -90,6 +115,7 @@ typedef struct WaterData_t
|
||||
int32_t thisSpeed; // 流速
|
||||
int32_t thisPress; // 压力
|
||||
int32_t thisTemp; // 温度
|
||||
int retry ; // 重试次数
|
||||
} WaterData_t;
|
||||
|
||||
|
||||
@@ -111,6 +137,8 @@ typedef enum MotorType_t
|
||||
MT_DY_V100, // 大禹锥型阀
|
||||
MT_KG_V100, // 开关量模块
|
||||
MT_KR_V100, // 徐州正天闸位计
|
||||
MT_ASC_A3, // A3驱动器
|
||||
MT_ASC_WS, // 金昌无刷电机
|
||||
} MotorType_t;
|
||||
|
||||
typedef enum S4851Type_t
|
||||
@@ -118,6 +146,7 @@ typedef enum S4851Type_t
|
||||
ST_MG_1000, // 米格1000
|
||||
ST_QH_V100, // 强华 1.0 版本
|
||||
ST_QH_V200, // 强华 2.0 版本
|
||||
ST_ZS_V100, // 中盛4-20ma
|
||||
ST_AT_V100, // 奥图编码器
|
||||
ST_DY_V100, // 大禹锥形阀
|
||||
ST_KG_V100, // 开关量模块
|
||||
@@ -132,6 +161,7 @@ typedef enum S4852Type_t
|
||||
ST_ZK_JSZK, // 精水中科多普勒
|
||||
ST_DJX_100, // 丁家峡闸门 读取开度
|
||||
ST_RDS_300, // 雷达流量计
|
||||
ST_MI_600, // 鹦鸽嘴测斜仪
|
||||
} S4852Type_t;
|
||||
|
||||
|
||||
@@ -151,7 +181,8 @@ typedef enum SiteType_t
|
||||
SiteSee, // 渗流渗压站
|
||||
SiteColl, // 采集站
|
||||
SiteServer, // 串口服务器
|
||||
SiteLevel // 水位站
|
||||
SiteLevel, // 水位站
|
||||
SiteSkew // 测斜仪
|
||||
} SiteType_t;
|
||||
|
||||
|
||||
@@ -167,6 +198,7 @@ typedef enum DownDataType_t
|
||||
DownReboot = 7, // 重启
|
||||
DownConfig = 8, // 修改参数
|
||||
DownRead = 9, // 读取参数
|
||||
DownFact = 10, // 读取参数
|
||||
} DownDataType_t;
|
||||
|
||||
|
||||
@@ -185,9 +217,11 @@ typedef struct TypeIndexMail_t
|
||||
|
||||
extern SluiceData_t SluiceData[SLUICE_COUTN];
|
||||
extern WaterData_t WaterData[WATER_COUTN];
|
||||
extern InclinometerData_t IncData[6];
|
||||
extern SysData_t SysData;
|
||||
extern const WaterLeveInfo_t LeveInfo;
|
||||
extern const ParShallInfo_t ParShallTale[];
|
||||
extern SOFTRTC_t g_SoftRtc;
|
||||
|
||||
|
||||
int cMotorGetType (char * str);
|
||||
@@ -208,6 +242,8 @@ int cDownType2Index(char * str);
|
||||
int cSiteType2Index (char * str);
|
||||
|
||||
|
||||
void *GetVersion (void);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
+9
-8
@@ -1,39 +1,40 @@
|
||||
#include "main.h"
|
||||
#include "di-board.h"
|
||||
|
||||
|
||||
int DiReadChann (int chann)
|
||||
DIState_t MX_Din_Pull (int chann)
|
||||
{
|
||||
int ret = -1;
|
||||
DIState_t ret;
|
||||
switch (chann)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
ret = HAL_GPIO_ReadPin (DI1_GPIO_Port, DI1_Pin);
|
||||
ret = (DIState_t) HAL_GPIO_ReadPin (DI1_GPIO_Port, DI1_Pin);
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
ret = HAL_GPIO_ReadPin (DI2_GPIO_Port, DI2_Pin);
|
||||
ret = (DIState_t) HAL_GPIO_ReadPin (DI2_GPIO_Port, DI2_Pin);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
ret = HAL_GPIO_ReadPin (DI3_GPIO_Port, DI4_Pin);
|
||||
ret = (DIState_t) HAL_GPIO_ReadPin (DI3_GPIO_Port, DI3_Pin);
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
ret = HAL_GPIO_ReadPin (DI4_GPIO_Port, DI4_Pin);
|
||||
ret = (DIState_t) HAL_GPIO_ReadPin (DI4_GPIO_Port, DI4_Pin);
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
ret = HAL_GPIO_ReadPin (DI5_GPIO_Port, DI5_Pin);
|
||||
ret = (DIState_t) HAL_GPIO_ReadPin (DI5_GPIO_Port, DI5_Pin);
|
||||
break;
|
||||
}
|
||||
case 6:
|
||||
{
|
||||
ret = HAL_GPIO_ReadPin (DI6_GPIO_Port, DI6_Pin);
|
||||
ret = (DIState_t) HAL_GPIO_ReadPin (DI6_GPIO_Port, DI6_Pin);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+7
-1
@@ -1,8 +1,14 @@
|
||||
#ifndef _DI_BOARD_H
|
||||
#define _DI_BOARD_H
|
||||
|
||||
typedef enum DIState_t
|
||||
{
|
||||
DI_HIGH = 1,
|
||||
DI_LOW = 0
|
||||
} DIState_t;
|
||||
|
||||
void DiInit (void);
|
||||
int DiReadChann (int chann);
|
||||
DIState_t MX_Din_Pull (int chann);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -278,6 +278,26 @@ CAT1RST:
|
||||
rt_kprintf ("NET:+CME:ERROR QIRD\r\n");
|
||||
goto CAT1RST;
|
||||
}
|
||||
// // 通过通道2上报数据
|
||||
// if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_TX2, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) // 需要发送数据
|
||||
// {
|
||||
// if (g_cat1Drv.txbuff != NULL)
|
||||
// {
|
||||
// rt_sprintf (at_cmd, "AT+QISEND=0,%d\r\n", g_cat1Drv.tx_size);
|
||||
// rt_thread_mdelay (10);
|
||||
// if (cat1_sendcmd_and_responce (1000, at_cmd, strlen (at_cmd), ">", NULL) != RetSucc)
|
||||
// {
|
||||
// rt_kprintf ("NET:+CME:ERROR QISEND\r\n");
|
||||
// goto CAT1RST;
|
||||
// }
|
||||
// if (cat1_sendcmd_and_responce (3000, g_cat1Drv.txbuff, g_cat1Drv.tx_size, "SEND OK", NULL) != RetSucc)
|
||||
// {
|
||||
// rt_kprintf ("NET:+CME:ERROR QPUSH\r\n");
|
||||
// goto CAT1RST;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
rt_thread_mdelay (3000);
|
||||
}
|
||||
@@ -292,6 +312,14 @@ void cat1_service_tx (char * buff, int size)
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_TX1) ;
|
||||
}
|
||||
|
||||
// 通过网络通道2发送数据
|
||||
void cat1_service2_tx (char * buff, int size)
|
||||
{
|
||||
rt_memcpy (g_cat1Drv.txbuff, buff, size);
|
||||
g_cat1Drv.tx_size = size;
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_TX2) ;
|
||||
}
|
||||
|
||||
|
||||
void CAT1ThreadStart (void)
|
||||
{
|
||||
|
||||
@@ -26,15 +26,15 @@ int Json5MinFlowDataPacket (uint8_t * buffer)
|
||||
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "pver", cJSON_CreateString (PROTO_VER)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "iccid", cJSON_CreateString (SysData.iccid)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "ver", cJSON_CreateString (VERSION)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "ver", cJSON_CreateString (GetVersion())); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "vol", cJSON_CreateNumber (12.3)); // 表示电池电压
|
||||
cJSON_AddItemToObject (root, "temp", cJSON_CreateNumber (32.5)); // 表示流量计
|
||||
p = ef_get_env ("net_drv");
|
||||
cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString (p)); // 表示流量计
|
||||
p = ef_get_env ("iap_app_filename");
|
||||
//uint32_t max_open = atoi (p);
|
||||
cJSON_AddItemToObject (root, "filename", cJSON_CreateString (p)); // 表示电池电压
|
||||
cJSON_AddItemToObject (root, "chancnt", cJSON_CreateNumber (1)); // 表示电池电压
|
||||
p = ef_get_env ("chancnt");
|
||||
cJSON_AddItemToObject (root, "chancnt", cJSON_CreateString (p)); // 表示电池电压
|
||||
//cJSON_AddItemToObject (root, "chancnt", cJSON_CreateNumber (1)); // 表示电池电压
|
||||
// 瞬时流速
|
||||
for (int i = 0; i < 6; i++)
|
||||
@@ -63,7 +63,7 @@ int Json5MinFlowDataPacket (uint8_t * buffer)
|
||||
// 当前水位
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
dbl[i] = WaterData[i].thisLevel;
|
||||
dbl[i] = (double)WaterData[i].thisLevel/100;
|
||||
}
|
||||
cJSON * ArrNumLeve = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thisLeve", ArrNumLeve);
|
||||
@@ -83,6 +83,22 @@ int Json5MinFlowDataPacket (uint8_t * buffer)
|
||||
cJSON * ArrNumTemp = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thistemp", ArrNumTemp);
|
||||
|
||||
// 当前测斜方向
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
dbl[i] = IncData[i].dir;
|
||||
}
|
||||
cJSON * ArrNumIncDir = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thisincdir", ArrNumIncDir);
|
||||
|
||||
// 当前测斜数据
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
dbl[i] = IncData[i].data;
|
||||
}
|
||||
cJSON * ArrNumIncData = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thisincdata", ArrNumIncData);
|
||||
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
|
||||
@@ -7,9 +7,13 @@
|
||||
#include <stdlib.h>
|
||||
#include "data.h"
|
||||
#include "os-app.h"
|
||||
#include "main.h"
|
||||
|
||||
char config_list[16][32] = {NULL};
|
||||
int config_list_size = 0;
|
||||
// 用于远程出厂设置时保留配置
|
||||
char backdevice_id[12] = {0};
|
||||
char backnetdrv[12] = {0};
|
||||
|
||||
|
||||
|
||||
@@ -66,6 +70,7 @@ void JsonUnPacket (int index, char *buff)
|
||||
UpgradeThreadStart();
|
||||
break;
|
||||
case DownReboot :
|
||||
HAL_NVIC_SystemReset();
|
||||
break;
|
||||
case DownConfig: // 设置参数
|
||||
// 读取参数列表
|
||||
@@ -80,6 +85,9 @@ void JsonUnPacket (int index, char *buff)
|
||||
ef_set_env (key, value);
|
||||
}
|
||||
}
|
||||
mail.Type = MAIL_COMM_ACK;
|
||||
mail.index = index + 1; // 0通道用来升级的通道
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
break;
|
||||
case DownRead: // 读取参数
|
||||
list = cJSON_GetObjectItem (root, "list");
|
||||
@@ -94,6 +102,18 @@ void JsonUnPacket (int index, char *buff)
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
// 读取参数列表
|
||||
break;
|
||||
case DownFact:
|
||||
p = ef_get_env("device_id");
|
||||
rt_sprintf(backdevice_id,"%s",p);
|
||||
p = ef_get_env("net_drv") ;
|
||||
rt_sprintf(backnetdrv,"%s",p);
|
||||
ef_env_set_default();
|
||||
ef_set_env("device_id",backdevice_id) ;
|
||||
ef_set_env("net_drv",backnetdrv) ;
|
||||
mail.Type = MAIL_COMM_ACK;
|
||||
mail.index = index + 1; // 0通道用来升级的通道
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -172,6 +172,7 @@ int PacketSluiceUp (int k, char * tx_data)
|
||||
tx_data[tx_size++] = 0x01;
|
||||
// // 闸门开度
|
||||
intk.data = SluiceData[k].gopen * 10;
|
||||
rt_kprintf("gopen:%d\r\n");
|
||||
tx_data[tx_size++] = intk.byte[3];
|
||||
tx_data[tx_size++] = intk.byte[2];
|
||||
tx_data[tx_size++] = intk.byte[1];
|
||||
|
||||
+31
-42
@@ -1,54 +1,43 @@
|
||||
#include "relay-board.h"
|
||||
#include "main.h"
|
||||
|
||||
|
||||
|
||||
RelayInfo_t RelayInfo =
|
||||
|
||||
void MX_Relay_Push (RelayIndex_t index, RelayState_t ste)
|
||||
{
|
||||
{GPIOB, GPIO_PIN_8, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_VERY_HIGH, NULL}, //PB5
|
||||
{GPIOB, GPIO_PIN_9, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_VERY_HIGH, NULL}, //PB5
|
||||
};
|
||||
/********************************************
|
||||
函数名称:UartInfoInit
|
||||
输入参数:串口句柄
|
||||
输出参数:NULL
|
||||
功能描述:初始化一个串口
|
||||
********************************************/
|
||||
void RelayInfoInit (void)
|
||||
if (ste == RELAY_CONN)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStruct;
|
||||
|
||||
GPIO_InitStruct.Mode = RelayInfo.Relay1.mode;
|
||||
GPIO_InitStruct.Pull = RelayInfo.Relay1.Pull;
|
||||
GPIO_InitStruct.Speed = RelayInfo.Relay1.Speed;
|
||||
|
||||
GPIO_InitStruct.Pin = RelayInfo.Relay1.pin;
|
||||
HAL_GPIO_Init (RelayInfo.Relay1.GPIOx, &GPIO_InitStruct);
|
||||
HAL_GPIO_WritePin (RelayInfo.Relay1.GPIOx, RelayInfo.Relay1.pin, GPIO_PIN_RESET);
|
||||
|
||||
|
||||
GPIO_InitStruct.Mode = RelayInfo.Relay2.mode;
|
||||
GPIO_InitStruct.Pull = RelayInfo.Relay2.Pull;
|
||||
GPIO_InitStruct.Speed = RelayInfo.Relay2.Speed;
|
||||
|
||||
GPIO_InitStruct.Pin = RelayInfo.Relay2.pin;
|
||||
HAL_GPIO_Init (RelayInfo.Relay2.GPIOx, &GPIO_InitStruct);
|
||||
HAL_GPIO_WritePin (RelayInfo.Relay2.GPIOx, RelayInfo.Relay2.pin, GPIO_PIN_RESET);
|
||||
switch (index)
|
||||
{
|
||||
case RELAY1:
|
||||
HAL_GPIO_WritePin (RELAY1_GPIO_Port, RELAY1_Pin, GPIO_PIN_SET);
|
||||
break;
|
||||
case RELAY2:
|
||||
HAL_GPIO_WritePin (RELAY2_GPIO_Port, RELAY2_Pin, GPIO_PIN_SET);
|
||||
break;
|
||||
case RELAYDoor:
|
||||
HAL_GPIO_WritePin (LOCK_GPIO_Port, LOCK_Pin, GPIO_PIN_SET);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
void RelayOpenDoor (void)
|
||||
{
|
||||
HAL_GPIO_WritePin (RelayInfo.Relay1.GPIOx, RelayInfo.Relay1.pin, GPIO_PIN_SET);
|
||||
}
|
||||
void RelayCloseDoor (void)
|
||||
else
|
||||
{
|
||||
HAL_GPIO_WritePin (RelayInfo.Relay1.GPIOx, RelayInfo.Relay1.pin, GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
|
||||
void RelayOpenK2 (void)
|
||||
switch (index)
|
||||
{
|
||||
HAL_GPIO_WritePin (RelayInfo.Relay2.GPIOx, RelayInfo.Relay2.pin, GPIO_PIN_SET);
|
||||
case RELAY1:
|
||||
HAL_GPIO_WritePin (RELAY1_GPIO_Port, RELAY1_Pin, GPIO_PIN_RESET);
|
||||
break;
|
||||
case RELAY2:
|
||||
HAL_GPIO_WritePin (RELAY2_GPIO_Port, RELAY2_Pin, GPIO_PIN_RESET);
|
||||
break;
|
||||
case RELAYDoor:
|
||||
HAL_GPIO_WritePin (LOCK_GPIO_Port, LOCK_Pin, GPIO_PIN_RESET);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
void RelayCloseK2 (void)
|
||||
{
|
||||
HAL_GPIO_WritePin (RelayInfo.Relay2.GPIOx, RelayInfo.Relay2.pin, GPIO_PIN_RESET);
|
||||
}
|
||||
+14
-16
@@ -1,25 +1,23 @@
|
||||
#ifndef _RELAY_BOARD_H
|
||||
#define _RELAY_BOARD_H
|
||||
#include "stm32l0xx_hal.h"
|
||||
#include "stgpio.h"
|
||||
|
||||
typedef struct RelayInfo_t
|
||||
|
||||
|
||||
|
||||
typedef enum RelayState_t
|
||||
{
|
||||
// GpioInfo_t Tx;
|
||||
// GpioInfo_t Rx;
|
||||
|
||||
GpioInfo_t Relay1; // 用于控制485的收发
|
||||
GpioInfo_t Relay2; // 用于控制485的收发
|
||||
|
||||
} RelayInfo_t;
|
||||
|
||||
void RelayInfoInit (void);
|
||||
void RelayOpenDoor (void);
|
||||
void RelayCloseDoor (void);
|
||||
void RelayOpenK2 (void);
|
||||
void RelayCloseK2 (void);
|
||||
RELAY_CONN = 1,
|
||||
RELAY_DISC = 0
|
||||
} RelayState_t;
|
||||
|
||||
typedef enum RelayIndex_t
|
||||
{
|
||||
RELAY1 = 0,
|
||||
RELAY2 = 1,
|
||||
RELAYDoor = 2
|
||||
} RelayIndex_t;
|
||||
|
||||
void MX_Relay_Push (RelayIndex_t index, RelayState_t ste);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -179,6 +179,8 @@ INIT:
|
||||
break;
|
||||
case SiteFlow:
|
||||
case SiteSee:
|
||||
case SiteLevel:
|
||||
case SiteSkew:
|
||||
gMqttDrv.tx_size = Json5MinFlowDataPacket ( (uint8_t *) gMqttDrv.txbuff);
|
||||
break;
|
||||
case SiteColl:
|
||||
|
||||
@@ -97,17 +97,17 @@
|
||||
<yPos>-1</yPos>
|
||||
</MaxPosition>
|
||||
<NormalPosition>
|
||||
<Top>337</Top>
|
||||
<Left>2503</Left>
|
||||
<Right>3943</Right>
|
||||
<Bottom>1096</Bottom>
|
||||
<Top>306</Top>
|
||||
<Left>2035</Left>
|
||||
<Right>3475</Right>
|
||||
<Bottom>1065</Bottom>
|
||||
</NormalPosition>
|
||||
</WindowPosition>
|
||||
<MDIClientArea>
|
||||
<RegID>0</RegID>
|
||||
<MDITabState>
|
||||
<Len>1394</Len>
|
||||
<Data>010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000001000000090000000400000001000000834A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C636F6D706F6E656E74735C6465766963655C6465766963652E6300000000086465766963652E6300000000C5D4F200FFFFFFFF554A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C52542D5468726561645C7274636F6E6669672E68000000000A7274636F6E6669672E6800000000FFDC7800FFFFFFFF8C4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C6273705C5F74656D706C6174655C637562656D785F636F6E6669675C626F6172642E630000000007626F6172642E6300000000BECEA100FFFFFFFF754A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C447269766572735C53544D3332473078785F48414C5F4472697665725C496E635C73746D3332673078785F68616C5F6465662E68000000001373746D3332673078785F68616C5F6465662E6800000000F0A0A100FFFFFFFF504A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C6D61696E2E6300000000066D61696E2E6300000000BCA8E100FFFFFFFF5E4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D444B2D41524D5C737461727475705F73746D33326730623178782E730000000015737461727475705F73746D33326730623178782E73000000009CC1B600FFFFFFFF794A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C636F6D706F6E656E74732E63000000000C636F6D706F6E656E74732E6300000000F7B88600FFFFFFFF734A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C69646C652E63000000000669646C652E6300000000D9ADC200FFFFFFFF514A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C75736172742E63000000000775736172742E6300000000A5C2D700FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000C808000066000000000F0000D8020000</Data>
|
||||
<Data>010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000001000000090000000400000001000000834A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C636F6D706F6E656E74735C6465766963655C6465766963652E6300000000086465766963652E6300000000C5D4F200FFFFFFFF554A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C52542D5468726561645C7274636F6E6669672E68000000000A7274636F6E6669672E6800000000FFDC7800FFFFFFFF8C4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C6273705C5F74656D706C6174655C637562656D785F636F6E6669675C626F6172642E630000000007626F6172642E6300000000BECEA100FFFFFFFF754A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C447269766572735C53544D3332473078785F48414C5F4472697665725C496E635C73746D3332673078785F68616C5F6465662E68000000001373746D3332673078785F68616C5F6465662E6800000000F0A0A100FFFFFFFF504A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C6D61696E2E6300000000066D61696E2E6300000000BCA8E100FFFFFFFF5E4A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D444B2D41524D5C737461727475705F73746D33326730623178782E730000000015737461727475705F73746D33326730623178782E73000000009CC1B600FFFFFFFF794A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C636F6D706F6E656E74732E63000000000C636F6D706F6E656E74732E6300000000F7B88600FFFFFFFF734A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C4D6964646C6577617265735C54686972645F50617274795C5265616C5468726561645F52544F535C7372635C69646C652E63000000000669646C652E6300000000D9ADC200FFFFFFFF514A3A5C6164645F62795F7A68616E6770656E675C50726F6A6563745C534C554943455C536C756963655C474230564554785C67306231766574782D626F6172645C436F72655C5372635C75736172742E63000000000775736172742E6300000000A5C2D700FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000C808000066000000000F0000D0020000</Data>
|
||||
</MDITabState>
|
||||
</MDIClientArea>
|
||||
<ViewEx>
|
||||
@@ -146,7 +146,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>030000006600000041010000A8020000</Data>
|
||||
<Data>030000006600000041010000A0020000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -166,7 +166,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>030000006600000041010000A8020000</Data>
|
||||
<Data>030000006600000041010000A0020000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -446,7 +446,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>030000006600000041010000A8020000</Data>
|
||||
<Data>030000006600000041010000A0020000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -466,7 +466,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>030000006600000041010000A8020000</Data>
|
||||
<Data>030000006600000041010000A0020000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -486,7 +486,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>03000000DC0200007D070000CD030000</Data>
|
||||
<Data>03000000D40200007D070000C5030000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -526,7 +526,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>03000000DC0200007D070000CD030000</Data>
|
||||
<Data>03000000D40200007D070000C5030000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -1146,7 +1146,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>030000006600000041010000A8020000</Data>
|
||||
<Data>030000006600000041010000A0020000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -1166,7 +1166,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>03000000DC0200007D070000CD030000</Data>
|
||||
<Data>03000000D40200007D070000C5030000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -1186,7 +1186,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>03000000DC0200007D070000CD030000</Data>
|
||||
<Data>03000000D40200007D070000C5030000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -1246,7 +1246,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>03000000DC0200007D070000CD030000</Data>
|
||||
<Data>03000000D40200007D070000C5030000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -1266,7 +1266,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>03000000DC0200007D070000CD030000</Data>
|
||||
<Data>03000000D40200007D070000C5030000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -1726,7 +1726,7 @@
|
||||
<RecentRowIndex>0</RecentRowIndex>
|
||||
<RectRecentDocked>
|
||||
<Len>16</Len>
|
||||
<Data>00000000E603000080070000F9030000</Data>
|
||||
<Data>00000000DE03000080070000F1030000</Data>
|
||||
</RectRecentDocked>
|
||||
<RectRecentFloat>
|
||||
<Len>16</Len>
|
||||
@@ -1795,14 +1795,14 @@
|
||||
</Window>
|
||||
<DockMan>
|
||||
<Len>3312</Len>
|
||||
<Data>000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DF00000090050000E3000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000007408000066000000100D0000F6000000F40000004F00000090050000DF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000029020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000200C000066000000100D000040020000A00400004F000000900500002902000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF440100004F00000048010000C102000001000000020000100400000001000000C7FEFFFF3C060000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000008007000066000000C4080000D8020000000000004F00000044010000C10200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000015020000900500001902000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000008007000030020000100D0000D4020000000000001902000090050000BD02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000Line truncated
|
||||
<Data>000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DF00000090050000E3000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000007408000066000000100D0000F6000000F40000004F00000090050000DF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000029020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000200C000066000000100D000040020000A00400004F000000900500002902000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF440100004F00000048010000B902000001000000020000100400000001000000C7FEFFFF3C060000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000008007000066000000C4080000D0020000000000004F00000044010000B90200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000015020000900500001902000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000008007000030020000100D0000D4020000000000001902000090050000BD02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000Line truncated
|
||||
</DockMan>
|
||||
<ToolBar>
|
||||
<RegID>59392</RegID>
|
||||
<Name>File</Name>
|
||||
<Buttons>
|
||||
<Len>2878</Len>
|
||||
<Data>00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000A4465766963654C696E6B960000000000000013000A4465766963654C696E6B096C696E6B54696D657204D0C4CCF80A6754436F6D6D4D61696C0D50616B63657454696D657255700F4D41494C5F534C554943455F4F50540C75343835325F7468726561641445465F454E565F5553494E475F574C5F4D4F44450F534655445F44454255475F4D4F44450557617465720F6F6E6C696E655F6961705F7461736B0D6961705F66696C655F73697A650B6961705F66696C656E616D074949435F53434C1065665F65726173655F62616B5F6170701172745F656E7465725F637269746963616C0C4D585F554152545F496E6974164F535F4941505F5448524541445F5052494F524954590A675F6966636F6E66696700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E730000000000000000000000000100000001000000000Line truncated
|
||||
<Len>2873</Len>
|
||||
<Data>00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE8030000000000000000000000000000000000000000000000010000000100000096000000020020500000000007436865636B52549600000000000000140007436865636B525401420B4669785F52616D2E4B76320B4669785F52616D2E4B7630074669785F52616D0646697852616D0B57617465725F77726974651373765F656570726F6D5F6F7065726174696F6E1943756D756C61746976655F57617465725F4261636B776172640C4170704D6F64654465627567165343422D3E56544F52203D20464C4153485F4241534510434F4C4C454354494F4E5F54494D45520C464C4F575F53554D5F4D415804393939390973343835327479706504594731390B4D41494C5F43545F4F50540B736C756963655F6F70656E10555345525F4A534F4E5F5041434B45540E5061636B657455705265676973740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E7300000000000000000000000001000000010000000000000000000Line truncated
|
||||
</Buttons>
|
||||
<OriginalItems>
|
||||
<Len>1423</Len>
|
||||
@@ -3638,9 +3638,9 @@
|
||||
</Doc>
|
||||
<Doc>
|
||||
<Name>../Core/Src/main.c</Name>
|
||||
<ColumnNumber>25</ColumnNumber>
|
||||
<TopLine>199</TopLine>
|
||||
<CurrentLine>207</CurrentLine>
|
||||
<ColumnNumber>1</ColumnNumber>
|
||||
<TopLine>178</TopLine>
|
||||
<CurrentLine>190</CurrentLine>
|
||||
<Folding>1</Folding>
|
||||
<ContractedFolders></ContractedFolders>
|
||||
<PaneID>0</PaneID>
|
||||
@@ -3674,7 +3674,7 @@
|
||||
</Doc>
|
||||
<Doc>
|
||||
<Name>../Core/Src/usart.c</Name>
|
||||
<ColumnNumber>4</ColumnNumber>
|
||||
<ColumnNumber>22</ColumnNumber>
|
||||
<TopLine>97</TopLine>
|
||||
<CurrentLine>98</CurrentLine>
|
||||
<Folding>1</Folding>
|
||||
|
||||
@@ -0,0 +1,609 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2012-10-27 heyuanjie87 first version.
|
||||
* 2013-05-17 aozima initial alarm event & mutex in system init.
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
|
||||
#define RT_RTC_YEARS_MAX 137
|
||||
#define RT_ALARM_DELAY 2
|
||||
#define RT_ALARM_STATE_INITED 0x02
|
||||
#define RT_ALARM_STATE_START 0x01
|
||||
#define RT_ALARM_STATE_STOP 0x00
|
||||
|
||||
#if (defined(RT_USING_RTC) && defined(RT_USING_ALARM))
|
||||
static struct rt_alarm_container _container;
|
||||
|
||||
rt_inline rt_uint32_t alarm_mkdaysec(struct tm *time)
|
||||
{
|
||||
rt_uint32_t sec;
|
||||
|
||||
sec = time->tm_sec;
|
||||
sec += time->tm_min * 60;
|
||||
sec += time->tm_hour * 3600;
|
||||
|
||||
return (sec);
|
||||
}
|
||||
|
||||
static rt_err_t alarm_set(struct rt_alarm *alarm)
|
||||
{
|
||||
rt_device_t device;
|
||||
struct rt_rtc_wkalarm wkalarm;
|
||||
rt_err_t ret;
|
||||
|
||||
device = rt_device_find("rtc");
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return (RT_ERROR);
|
||||
}
|
||||
if (alarm->flag & RT_ALARM_STATE_START)
|
||||
wkalarm.enable = RT_TRUE;
|
||||
else
|
||||
wkalarm.enable = RT_FALSE;
|
||||
|
||||
wkalarm.tm_sec = alarm->wktime.tm_sec;
|
||||
wkalarm.tm_min = alarm->wktime.tm_min;
|
||||
wkalarm.tm_hour = alarm->wktime.tm_hour;
|
||||
|
||||
ret = rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_ALARM, &wkalarm);
|
||||
if ((ret == RT_EOK) && wkalarm.enable)
|
||||
{
|
||||
ret = rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_ALARM, &wkalarm);
|
||||
if (ret == RT_EOK)
|
||||
{
|
||||
/*
|
||||
some RTC device like RX8025,it's alarms precision is 1 minute.
|
||||
in this case,low level RTC driver should set wkalarm->tm_sec to 0.
|
||||
*/
|
||||
alarm->wktime.tm_sec = wkalarm.tm_sec;
|
||||
alarm->wktime.tm_min = wkalarm.tm_min;
|
||||
alarm->wktime.tm_hour = wkalarm.tm_hour;
|
||||
}
|
||||
}
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static void alarm_wakeup(struct rt_alarm *alarm, struct tm *now)
|
||||
{
|
||||
rt_uint32_t sec_alarm, sec_now;
|
||||
rt_bool_t wakeup = RT_FALSE;
|
||||
time_t timestamp;
|
||||
|
||||
sec_alarm = alarm_mkdaysec(&alarm->wktime);
|
||||
sec_now = alarm_mkdaysec(now);
|
||||
|
||||
if (alarm->flag & RT_ALARM_STATE_START)
|
||||
{
|
||||
switch (alarm->flag & 0xFF00)
|
||||
{
|
||||
case RT_ALARM_ONESHOT:
|
||||
{
|
||||
sec_alarm = mktime(&alarm->wktime);
|
||||
sec_now = mktime(now);
|
||||
if (((sec_now - sec_alarm) <= RT_ALARM_DELAY) && (sec_now >= sec_alarm))
|
||||
{
|
||||
/* stop alarm */
|
||||
alarm->flag &= ~RT_ALARM_STATE_START;
|
||||
alarm_set(alarm);
|
||||
wakeup = RT_TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RT_ALARM_DAILY:
|
||||
{
|
||||
if (((sec_now - sec_alarm) <= RT_ALARM_DELAY) && (sec_now >= sec_alarm))
|
||||
wakeup = RT_TRUE;
|
||||
}
|
||||
break;
|
||||
case RT_ALARM_WEEKLY:
|
||||
{
|
||||
/* alarm at wday */
|
||||
sec_alarm += alarm->wktime.tm_wday * 24 * 3600;
|
||||
sec_now += now->tm_wday * 24 * 3600;
|
||||
|
||||
if (((sec_now - sec_alarm) <= RT_ALARM_DELAY) && (sec_now >= sec_alarm))
|
||||
wakeup = RT_TRUE;
|
||||
}
|
||||
break;
|
||||
case RT_ALARM_MONTHLY:
|
||||
{
|
||||
/* monthly someday generate alarm signals */
|
||||
if (alarm->wktime.tm_mday == now->tm_mday)
|
||||
{
|
||||
if ((sec_now - sec_alarm) <= RT_ALARM_DELAY)
|
||||
wakeup = RT_TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RT_ALARM_YAERLY:
|
||||
{
|
||||
if ((alarm->wktime.tm_mday == now->tm_mday) && \
|
||||
(alarm->wktime.tm_mon == now->tm_mon))
|
||||
{
|
||||
if ((sec_now - sec_alarm) <= RT_ALARM_DELAY)
|
||||
wakeup = RT_TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if ((wakeup == RT_TRUE) && (alarm->callback != RT_NULL))
|
||||
{
|
||||
timestamp = time(RT_NULL);
|
||||
alarm->callback(alarm, timestamp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void alarm_update(rt_uint32_t event)
|
||||
{
|
||||
struct rt_alarm *alm_prev = RT_NULL, *alm_next = RT_NULL;
|
||||
struct rt_alarm *alarm;
|
||||
rt_int32_t sec_now, sec_alarm, sec_tmp;
|
||||
rt_int32_t sec_next = 24 * 3600, sec_prev = 0;
|
||||
time_t timestamp;
|
||||
struct tm now;
|
||||
rt_list_t *next;
|
||||
|
||||
rt_mutex_take(&_container.mutex, RT_WAITING_FOREVER);
|
||||
if (!rt_list_isempty(&_container.head))
|
||||
{
|
||||
/* get time of now */
|
||||
timestamp = time(RT_NULL);
|
||||
localtime_r(×tamp, &now);
|
||||
|
||||
for (next = _container.head.next; next != &_container.head; next = next->next)
|
||||
{
|
||||
alarm = rt_list_entry(next, struct rt_alarm, list);
|
||||
/* check the overtime alarm */
|
||||
alarm_wakeup(alarm, &now);
|
||||
}
|
||||
|
||||
timestamp = time(RT_NULL);
|
||||
localtime_r(×tamp, &now);
|
||||
sec_now = alarm_mkdaysec(&now);
|
||||
|
||||
for (next = _container.head.next; next != &_container.head; next = next->next)
|
||||
{
|
||||
alarm = rt_list_entry(next, struct rt_alarm, list);
|
||||
/* calculate seconds from 00:00:00 */
|
||||
sec_alarm = alarm_mkdaysec(&alarm->wktime);
|
||||
|
||||
if ((alarm->flag & RT_ALARM_STATE_START) && (alarm != _container.current))
|
||||
{
|
||||
sec_tmp = sec_alarm - sec_now;
|
||||
if (sec_tmp > 0)
|
||||
{
|
||||
/* find alarm after now(now to 23:59:59) and the most recent */
|
||||
if (sec_tmp < sec_next)
|
||||
{
|
||||
sec_next = sec_tmp;
|
||||
alm_next = alarm;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* find alarm before now(00:00:00 to now) and furthest from now */
|
||||
if (sec_tmp < sec_prev)
|
||||
{
|
||||
sec_prev = sec_tmp;
|
||||
alm_prev = alarm;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* enable the alarm after now first */
|
||||
if (sec_next < 24 * 3600)
|
||||
{
|
||||
if (alarm_set(alm_next) == RT_EOK)
|
||||
_container.current = alm_next;
|
||||
}
|
||||
else if (sec_prev < 0)
|
||||
{
|
||||
/* enable the alarm before now */
|
||||
if (alarm_set(alm_prev) == RT_EOK)
|
||||
_container.current = alm_prev;
|
||||
}
|
||||
}
|
||||
rt_mutex_release(&_container.mutex);
|
||||
}
|
||||
|
||||
static rt_uint32_t days_of_year_month(int tm_year, int tm_mon)
|
||||
{
|
||||
rt_uint32_t ret, year;
|
||||
|
||||
year = tm_year + 1900;
|
||||
if (tm_mon == 1)
|
||||
{
|
||||
ret = 28 + ((!(year % 4) && (year % 100)) || !(year % 400));
|
||||
}
|
||||
else if (((tm_mon <= 6) && (tm_mon % 2 == 0)) || ((tm_mon > 6) && (tm_mon % 2 == 1)))
|
||||
{
|
||||
ret = 31;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = 30;
|
||||
}
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static rt_bool_t is_valid_date(struct tm *date)
|
||||
{
|
||||
if ((date->tm_year < 0) || (date->tm_year > RT_RTC_YEARS_MAX))
|
||||
{
|
||||
return (RT_FALSE);
|
||||
}
|
||||
|
||||
if ((date->tm_mon < 0) || (date->tm_mon > 11))
|
||||
{
|
||||
return (RT_FALSE);
|
||||
}
|
||||
|
||||
if ((date->tm_mday < 1) || \
|
||||
(date->tm_mday > days_of_year_month(date->tm_year, date->tm_mon)))
|
||||
{
|
||||
return (RT_FALSE);
|
||||
}
|
||||
|
||||
return (RT_TRUE);
|
||||
}
|
||||
|
||||
static rt_err_t alarm_setup(rt_alarm_t alarm, struct tm *wktime)
|
||||
{
|
||||
rt_err_t ret = RT_ERROR;
|
||||
time_t timestamp;
|
||||
struct tm *setup, now;
|
||||
|
||||
setup = &alarm->wktime;
|
||||
*setup = *wktime;
|
||||
timestamp = time(RT_NULL);
|
||||
localtime_r(×tamp, &now);
|
||||
|
||||
/* if these are a "don't care" value,we set them to now*/
|
||||
if ((setup->tm_sec > 59) || (setup->tm_sec < 0))
|
||||
setup->tm_sec = now.tm_sec;
|
||||
if ((setup->tm_min > 59) || (setup->tm_min < 0))
|
||||
setup->tm_min = now.tm_min;
|
||||
if ((setup->tm_hour > 23) || (setup->tm_hour < 0))
|
||||
setup->tm_hour = now.tm_hour;
|
||||
|
||||
switch (alarm->flag & 0xFF00)
|
||||
{
|
||||
case RT_ALARM_DAILY:
|
||||
{
|
||||
/* do nothing but needed */
|
||||
}
|
||||
break;
|
||||
case RT_ALARM_ONESHOT:
|
||||
{
|
||||
/* if these are "don't care" value we set them to now */
|
||||
if (setup->tm_year == RT_ALARM_TM_NOW)
|
||||
setup->tm_year = now.tm_year;
|
||||
if (setup->tm_mon == RT_ALARM_TM_NOW)
|
||||
setup->tm_mon = now.tm_mon;
|
||||
if (setup->tm_mday == RT_ALARM_TM_NOW)
|
||||
setup->tm_mday = now.tm_mday;
|
||||
/* make sure the setup is valid */
|
||||
if (!is_valid_date(setup))
|
||||
goto _exit;
|
||||
}
|
||||
break;
|
||||
case RT_ALARM_WEEKLY:
|
||||
{
|
||||
/* if tm_wday is a "don't care" value we set it to now */
|
||||
if ((setup->tm_wday < 0) || (setup->tm_wday > 6))
|
||||
setup->tm_wday = now.tm_wday;
|
||||
}
|
||||
break;
|
||||
case RT_ALARM_MONTHLY:
|
||||
{
|
||||
/* if tm_mday is a "don't care" value we set it to now */
|
||||
if ((setup->tm_mday < 1) || (setup->tm_mday > 31))
|
||||
setup->tm_mday = now.tm_mday;
|
||||
}
|
||||
break;
|
||||
case RT_ALARM_YAERLY:
|
||||
{
|
||||
/* if tm_mon is a "don't care" value we set it to now */
|
||||
if ((setup->tm_mon < 0) || (setup->tm_mon > 11))
|
||||
setup->tm_mon = now.tm_mon;
|
||||
|
||||
if (setup->tm_mon == 1)
|
||||
{
|
||||
/* tm_mon is February */
|
||||
|
||||
/* tm_mday should be 1~29.otherwise,it's a "don't care" value */
|
||||
if ((setup->tm_mday < 1) || (setup->tm_mday > 29))
|
||||
setup->tm_mday = now.tm_mday;
|
||||
}
|
||||
else if (((setup->tm_mon <= 6) && (setup->tm_mon % 2 == 0)) || \
|
||||
((setup->tm_mon > 6) && (setup->tm_mon % 2 == 1)))
|
||||
{
|
||||
/* Jan,Mar,May,Jul,Aug,Oct,Dec */
|
||||
|
||||
/* tm_mday should be 1~31.otherwise,it's a "don't care" value */
|
||||
if ((setup->tm_mday < 1) || (setup->tm_mday > 31))
|
||||
setup->tm_mday = now.tm_mday;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* tm_mday should be 1~30.otherwise,it's a "don't care" value */
|
||||
if ((setup->tm_mday < 1) || (setup->tm_mday > 30))
|
||||
setup->tm_mday = now.tm_mday;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
goto _exit;
|
||||
}
|
||||
}
|
||||
|
||||
if ((setup->tm_hour == 23) && (setup->tm_min == 59) && (setup->tm_sec == 59))
|
||||
{
|
||||
/*
|
||||
for insurance purposes, we will generate an alarm
|
||||
signal two seconds ahead of.
|
||||
*/
|
||||
setup->tm_sec = 60 - RT_ALARM_DELAY;
|
||||
}
|
||||
/* set initialized state */
|
||||
alarm->flag |= RT_ALARM_STATE_INITED;
|
||||
ret = RT_EOK;
|
||||
|
||||
_exit:
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/** \brief send a rtc alarm event
|
||||
*
|
||||
* \param dev pointer to RTC device(currently unused,you can ignore it)
|
||||
* \param event RTC event(currently unused)
|
||||
* \return none
|
||||
*/
|
||||
void rt_alarm_update(rt_device_t dev, rt_uint32_t event)
|
||||
{
|
||||
rt_event_send(&_container.event, 1);
|
||||
}
|
||||
|
||||
/** \brief modify the alarm setup
|
||||
*
|
||||
* \param alarm pointer to alarm
|
||||
* \param cmd control command
|
||||
* \param arg argument
|
||||
*/
|
||||
rt_err_t rt_alarm_control(rt_alarm_t alarm, int cmd, void *arg)
|
||||
{
|
||||
rt_err_t ret = RT_ERROR;
|
||||
|
||||
RT_ASSERT(alarm != RT_NULL);
|
||||
|
||||
rt_mutex_take(&_container.mutex, RT_WAITING_FOREVER);
|
||||
switch (cmd)
|
||||
{
|
||||
case RT_ALARM_CTRL_MODIFY:
|
||||
{
|
||||
struct rt_alarm_setup *setup;
|
||||
|
||||
RT_ASSERT(arg != RT_NULL);
|
||||
setup = arg;
|
||||
rt_alarm_stop(alarm);
|
||||
alarm->flag = setup->flag & 0xFF00;
|
||||
alarm->wktime = setup->wktime;
|
||||
ret = alarm_setup(alarm, &alarm->wktime);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
rt_mutex_release(&_container.mutex);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/** \brief start an alarm
|
||||
*
|
||||
* \param alarm pointer to alarm
|
||||
* \return RT_EOK
|
||||
*/
|
||||
rt_err_t rt_alarm_start(rt_alarm_t alarm)
|
||||
{
|
||||
rt_int32_t sec_now, sec_old, sec_new;
|
||||
rt_err_t ret = RT_ERROR;
|
||||
time_t timestamp;
|
||||
struct tm now;
|
||||
|
||||
if (alarm == RT_NULL)
|
||||
return (ret);
|
||||
rt_mutex_take(&_container.mutex, RT_WAITING_FOREVER);
|
||||
if (!(alarm->flag & RT_ALARM_STATE_INITED))
|
||||
{
|
||||
if (alarm_setup(alarm, &alarm->wktime) != RT_EOK)
|
||||
goto _exit;
|
||||
}
|
||||
if ((alarm->flag & 0x01) == RT_ALARM_STATE_STOP)
|
||||
{
|
||||
timestamp = time(RT_NULL);
|
||||
localtime_r(×tamp, &now);
|
||||
|
||||
alarm->flag |= RT_ALARM_STATE_START;
|
||||
/* set alarm */
|
||||
if (_container.current == RT_NULL)
|
||||
{
|
||||
ret = alarm_set(alarm);
|
||||
}
|
||||
else
|
||||
{
|
||||
sec_now = alarm_mkdaysec(&now);
|
||||
sec_old = alarm_mkdaysec(&_container.current->wktime);
|
||||
sec_new = alarm_mkdaysec(&alarm->wktime);
|
||||
|
||||
if ((sec_new < sec_old) && (sec_new > sec_now))
|
||||
{
|
||||
ret = alarm_set(alarm);
|
||||
}
|
||||
else if ((sec_new > sec_now) && (sec_old < sec_now))
|
||||
{
|
||||
ret = alarm_set(alarm);
|
||||
}
|
||||
else if ((sec_new < sec_old) && (sec_old < sec_now))
|
||||
{
|
||||
ret = alarm_set(alarm);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = RT_EOK;
|
||||
goto _exit;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret == RT_EOK)
|
||||
{
|
||||
_container.current = alarm;
|
||||
}
|
||||
}
|
||||
|
||||
_exit:
|
||||
rt_mutex_release(&_container.mutex);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/** \brief stop an alarm
|
||||
*
|
||||
* \param alarm pointer to alarm
|
||||
* \return RT_EOK
|
||||
*/
|
||||
rt_err_t rt_alarm_stop(rt_alarm_t alarm)
|
||||
{
|
||||
rt_err_t ret = RT_ERROR;
|
||||
|
||||
if (alarm == RT_NULL)
|
||||
return (ret);
|
||||
rt_mutex_take(&_container.mutex, RT_WAITING_FOREVER);
|
||||
if (!(alarm->flag & RT_ALARM_STATE_START))
|
||||
goto _exit;
|
||||
/* stop alarm */
|
||||
alarm->flag &= ~RT_ALARM_STATE_START;
|
||||
|
||||
if (_container.current == alarm)
|
||||
{
|
||||
ret = alarm_set(alarm);
|
||||
_container.current = RT_NULL;
|
||||
}
|
||||
|
||||
if (ret == RT_EOK)
|
||||
alarm_update(0);
|
||||
|
||||
_exit:
|
||||
rt_mutex_release(&_container.mutex);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/** \brief delete an alarm
|
||||
*
|
||||
* \param alarm pointer to alarm
|
||||
* \return RT_EOK
|
||||
*/
|
||||
rt_err_t rt_alarm_delete(rt_alarm_t alarm)
|
||||
{
|
||||
rt_err_t ret = RT_ERROR;
|
||||
|
||||
if (alarm == RT_NULL)
|
||||
return (ret);
|
||||
rt_mutex_take(&_container.mutex, RT_WAITING_FOREVER);
|
||||
/* stop the alarm */
|
||||
alarm->flag &= ~RT_ALARM_STATE_START;
|
||||
if (_container.current == alarm)
|
||||
{
|
||||
ret = alarm_set(alarm);
|
||||
_container.current = RT_NULL;
|
||||
/* set new alarm if necessary */
|
||||
alarm_update(0);
|
||||
}
|
||||
rt_list_remove(&alarm->list);
|
||||
rt_free(alarm);
|
||||
|
||||
rt_mutex_release(&_container.mutex);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/** \brief create an alarm
|
||||
*
|
||||
* \param flag set alarm mode e.g: RT_ALARM_DAILY
|
||||
* \param setup pointer to setup infomation
|
||||
*/
|
||||
rt_alarm_t rt_alarm_create(rt_alarm_callback_t callback, struct rt_alarm_setup *setup)
|
||||
{
|
||||
struct rt_alarm *alarm;
|
||||
|
||||
if (setup == RT_NULL)
|
||||
return (RT_NULL);
|
||||
alarm = rt_malloc(sizeof(struct rt_alarm));
|
||||
if (alarm == RT_NULL)
|
||||
return (RT_NULL);
|
||||
rt_list_init(&alarm->list);
|
||||
|
||||
alarm->wktime = setup->wktime;
|
||||
alarm->flag = setup->flag & 0xFF00;
|
||||
alarm->callback = callback;
|
||||
rt_mutex_take(&_container.mutex, RT_WAITING_FOREVER);
|
||||
rt_list_insert_after(&_container.head, &alarm->list);
|
||||
rt_mutex_release(&_container.mutex);
|
||||
|
||||
return (alarm);
|
||||
}
|
||||
|
||||
/** \brief rtc alarm service thread entry
|
||||
*
|
||||
*/
|
||||
static void rt_alarmsvc_thread_init(void *param)
|
||||
{
|
||||
rt_uint32_t recv;
|
||||
|
||||
_container.current = RT_NULL;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (rt_event_recv(&_container.event, 0xFFFF,
|
||||
RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
|
||||
RT_WAITING_FOREVER, &recv) == RT_EOK)
|
||||
{
|
||||
alarm_update(recv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** \brief initialize alarm service system
|
||||
*
|
||||
* \param none
|
||||
* \return none
|
||||
*/
|
||||
void rt_alarm_system_init(void)
|
||||
{
|
||||
rt_thread_t tid;
|
||||
|
||||
rt_list_init(&_container.head);
|
||||
rt_event_init(&_container.event, "alarmsvc", RT_IPC_FLAG_FIFO);
|
||||
rt_mutex_init(&_container.mutex, "alarmsvc", RT_IPC_FLAG_FIFO);
|
||||
|
||||
tid = rt_thread_create("alarmsvc",
|
||||
rt_alarmsvc_thread_init, RT_NULL,
|
||||
512, 8, 1);
|
||||
if (tid != RT_NULL)
|
||||
rt_thread_startup(tid);
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,254 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2012-01-29 aozima first version.
|
||||
* 2012-04-12 aozima optimization: find rtc device only first.
|
||||
* 2012-04-16 aozima add scheduler lock for set_date and set_time.
|
||||
* 2018-02-16 armink add auto sync time by NTP
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
#include <rtthread.h>
|
||||
|
||||
#ifdef RT_USING_RTC
|
||||
|
||||
/* Using NTP auto sync RTC time */
|
||||
#ifdef RTC_SYNC_USING_NTP
|
||||
/* NTP first sync delay time for network connect, unit: second */
|
||||
#ifndef RTC_NTP_FIRST_SYNC_DELAY
|
||||
#define RTC_NTP_FIRST_SYNC_DELAY (30)
|
||||
#endif
|
||||
/* NTP sync period, unit: second */
|
||||
#ifndef RTC_NTP_SYNC_PERIOD
|
||||
#define RTC_NTP_SYNC_PERIOD (1L*60L*60L)
|
||||
#endif
|
||||
#endif /* RTC_SYNC_USING_NTP */
|
||||
|
||||
/**
|
||||
* Set system date(time not modify).
|
||||
*
|
||||
* @param rt_uint32_t year e.g: 2012.
|
||||
* @param rt_uint32_t month e.g: 12 (1~12).
|
||||
* @param rt_uint32_t day e.g: 31.
|
||||
*
|
||||
* @return rt_err_t if set success, return RT_EOK.
|
||||
*
|
||||
*/
|
||||
rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
|
||||
{
|
||||
time_t now;
|
||||
struct tm *p_tm;
|
||||
struct tm tm_new;
|
||||
rt_device_t device;
|
||||
rt_err_t ret = -RT_ERROR;
|
||||
|
||||
/* get current time */
|
||||
now = time(RT_NULL);
|
||||
|
||||
/* lock scheduler. */
|
||||
rt_enter_critical();
|
||||
/* converts calendar time time into local time. */
|
||||
p_tm = localtime(&now);
|
||||
/* copy the statically located variable */
|
||||
memcpy(&tm_new, p_tm, sizeof(struct tm));
|
||||
/* unlock scheduler. */
|
||||
rt_exit_critical();
|
||||
|
||||
/* update date. */
|
||||
tm_new.tm_year = year - 1900;
|
||||
tm_new.tm_mon = month - 1; /* tm_mon: 0~11 */
|
||||
tm_new.tm_mday = day;
|
||||
|
||||
/* converts the local time in time to calendar time. */
|
||||
now = mktime(&tm_new);
|
||||
|
||||
device = rt_device_find("rtc");
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
/* update to RTC device. */
|
||||
ret = rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set system time(date not modify).
|
||||
*
|
||||
* @param rt_uint32_t hour e.g: 0~23.
|
||||
* @param rt_uint32_t minute e.g: 0~59.
|
||||
* @param rt_uint32_t second e.g: 0~59.
|
||||
*
|
||||
* @return rt_err_t if set success, return RT_EOK.
|
||||
*
|
||||
*/
|
||||
rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)
|
||||
{
|
||||
time_t now;
|
||||
struct tm *p_tm;
|
||||
struct tm tm_new;
|
||||
rt_device_t device;
|
||||
rt_err_t ret = -RT_ERROR;
|
||||
|
||||
/* get current time */
|
||||
now = time(RT_NULL);
|
||||
|
||||
/* lock scheduler. */
|
||||
rt_enter_critical();
|
||||
/* converts calendar time time into local time. */
|
||||
p_tm = localtime(&now);
|
||||
/* copy the statically located variable */
|
||||
memcpy(&tm_new, p_tm, sizeof(struct tm));
|
||||
/* unlock scheduler. */
|
||||
rt_exit_critical();
|
||||
|
||||
/* update time. */
|
||||
tm_new.tm_hour = hour;
|
||||
tm_new.tm_min = minute;
|
||||
tm_new.tm_sec = second;
|
||||
|
||||
/* converts the local time in time to calendar time. */
|
||||
now = mktime(&tm_new);
|
||||
|
||||
device = rt_device_find("rtc");
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
/* update to RTC device. */
|
||||
ret = rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef RTC_SYNC_USING_NTP
|
||||
static void ntp_sync_thread_enrty(void *param)
|
||||
{
|
||||
extern time_t ntp_sync_to_rtc(const char *host_name);
|
||||
/* first sync delay for network connect */
|
||||
rt_thread_delay(RTC_NTP_FIRST_SYNC_DELAY * RT_TICK_PER_SECOND);
|
||||
|
||||
while (1)
|
||||
{
|
||||
ntp_sync_to_rtc(NULL);
|
||||
rt_thread_delay(RTC_NTP_SYNC_PERIOD * RT_TICK_PER_SECOND);
|
||||
}
|
||||
}
|
||||
|
||||
int rt_rtc_ntp_sync_init(void)
|
||||
{
|
||||
static rt_bool_t init_ok = RT_FALSE;
|
||||
rt_thread_t thread;
|
||||
|
||||
if (init_ok)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
thread = rt_thread_create("ntp_sync", ntp_sync_thread_enrty, RT_NULL, 1536, 26, 2);
|
||||
if (thread)
|
||||
{
|
||||
rt_thread_startup(thread);
|
||||
}
|
||||
else
|
||||
{
|
||||
return -RT_ENOMEM;
|
||||
}
|
||||
|
||||
init_ok = RT_TRUE;
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
INIT_COMPONENT_EXPORT(rt_rtc_ntp_sync_init);
|
||||
#endif /* RTC_SYNC_USING_NTP */
|
||||
|
||||
#ifdef RT_USING_FINSH
|
||||
#include <finsh.h>
|
||||
#include <rtdevice.h>
|
||||
|
||||
void list_date(void)
|
||||
{
|
||||
time_t now;
|
||||
|
||||
now = time(RT_NULL);
|
||||
rt_kprintf("%s\n", ctime(&now));
|
||||
}
|
||||
FINSH_FUNCTION_EXPORT(list_date, show date and time.)
|
||||
|
||||
FINSH_FUNCTION_EXPORT(set_date, set date. e.g: set_date(2010,2,28))
|
||||
FINSH_FUNCTION_EXPORT(set_time, set time. e.g: set_time(23,59,59))
|
||||
|
||||
#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH)
|
||||
static void date(uint8_t argc, char **argv)
|
||||
{
|
||||
if (argc == 1)
|
||||
{
|
||||
time_t now;
|
||||
/* output current time */
|
||||
now = time(RT_NULL);
|
||||
rt_kprintf("%s", ctime(&now));
|
||||
}
|
||||
else if (argc >= 7)
|
||||
{
|
||||
/* set time and date */
|
||||
uint16_t year;
|
||||
uint8_t month, day, hour, min, sec;
|
||||
year = atoi(argv[1]);
|
||||
month = atoi(argv[2]);
|
||||
day = atoi(argv[3]);
|
||||
hour = atoi(argv[4]);
|
||||
min = atoi(argv[5]);
|
||||
sec = atoi(argv[6]);
|
||||
if (year > 2099 || year < 2000)
|
||||
{
|
||||
rt_kprintf("year is out of range [2000-2099]\n");
|
||||
return;
|
||||
}
|
||||
if (month == 0 || month > 12)
|
||||
{
|
||||
rt_kprintf("month is out of range [1-12]\n");
|
||||
return;
|
||||
}
|
||||
if (day == 0 || day > 31)
|
||||
{
|
||||
rt_kprintf("day is out of range [1-31]\n");
|
||||
return;
|
||||
}
|
||||
if (hour > 23)
|
||||
{
|
||||
rt_kprintf("hour is out of range [0-23]\n");
|
||||
return;
|
||||
}
|
||||
if (min > 59)
|
||||
{
|
||||
rt_kprintf("minute is out of range [0-59]\n");
|
||||
return;
|
||||
}
|
||||
if (sec > 59)
|
||||
{
|
||||
rt_kprintf("second is out of range [0-59]\n");
|
||||
return;
|
||||
}
|
||||
set_time(hour, min, sec);
|
||||
set_date(year, month, day);
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("please input: date [year month day hour min sec] or date\n");
|
||||
rt_kprintf("e.g: date 2018 01 01 23 59 59 or date\n");
|
||||
}
|
||||
}
|
||||
MSH_CMD_EXPORT(date, get date and time or set [year month day hour min sec]);
|
||||
#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */
|
||||
|
||||
#endif /* RT_USING_FINSH */
|
||||
|
||||
#endif /* RT_USING_RTC */
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2012-10-10 aozima first version.
|
||||
*/
|
||||
|
||||
#ifndef __RTC_H__
|
||||
#define __RTC_H__
|
||||
|
||||
rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day);
|
||||
rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second);
|
||||
|
||||
int rt_soft_rtc_init(void);
|
||||
int rt_rtc_ntp_sync_init(void);
|
||||
|
||||
#endif /* __RTC_H__ */
|
||||
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-01-30 armink the first version
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
#include <rtthread.h>
|
||||
|
||||
#include <drivers/rtc.h>
|
||||
|
||||
#ifdef RT_USING_SOFT_RTC
|
||||
|
||||
/* 2018-01-30 14:44:50 = RTC_TIME_INIT(2018, 1, 30, 14, 44, 50) */
|
||||
#define RTC_TIME_INIT(year, month, day, hour, minute, second) \
|
||||
{.tm_year = year - 1900, .tm_mon = month - 1, .tm_mday = day, .tm_hour = hour, .tm_min = minute, .tm_sec = second}
|
||||
|
||||
#ifndef SOFT_RTC_TIME_DEFAULT
|
||||
#define SOFT_RTC_TIME_DEFAULT RTC_TIME_INIT(2018, 1, 1, 0, 0 ,0)
|
||||
#endif
|
||||
|
||||
static struct rt_device soft_rtc_dev;
|
||||
static rt_tick_t init_tick;
|
||||
static time_t init_time;
|
||||
|
||||
static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args)
|
||||
{
|
||||
time_t *time;
|
||||
struct tm time_temp;
|
||||
|
||||
RT_ASSERT(dev != RT_NULL);
|
||||
memset(&time_temp, 0, sizeof(struct tm));
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case RT_DEVICE_CTRL_RTC_GET_TIME:
|
||||
time = (time_t *) args;
|
||||
*time = init_time + (rt_tick_get() - init_tick) / RT_TICK_PER_SECOND;
|
||||
break;
|
||||
|
||||
case RT_DEVICE_CTRL_RTC_SET_TIME:
|
||||
{
|
||||
time = (time_t *) args;
|
||||
init_time = *time - (rt_tick_get() - init_tick) / RT_TICK_PER_SECOND;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
#ifdef RT_USING_DEVICE_OPS
|
||||
const static struct rt_device_ops soft_rtc_ops =
|
||||
{
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
soft_rtc_control
|
||||
};
|
||||
#endif
|
||||
|
||||
int rt_soft_rtc_init(void)
|
||||
{
|
||||
static rt_bool_t init_ok = RT_FALSE;
|
||||
struct tm time_new = SOFT_RTC_TIME_DEFAULT;
|
||||
|
||||
if (init_ok)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
/* make sure only one 'rtc' device */
|
||||
RT_ASSERT(!rt_device_find("rtc"));
|
||||
|
||||
init_tick = rt_tick_get();
|
||||
init_time = mktime(&time_new);
|
||||
|
||||
soft_rtc_dev.type = RT_Device_Class_RTC;
|
||||
|
||||
/* register rtc device */
|
||||
#ifdef RT_USING_DEVICE_OPS
|
||||
soft_rtc_dev.ops = &soft_rtc_ops;
|
||||
#else
|
||||
soft_rtc_dev.init = RT_NULL;
|
||||
soft_rtc_dev.open = RT_NULL;
|
||||
soft_rtc_dev.close = RT_NULL;
|
||||
soft_rtc_dev.read = RT_NULL;
|
||||
soft_rtc_dev.write = RT_NULL;
|
||||
soft_rtc_dev.control = soft_rtc_control;
|
||||
#endif
|
||||
|
||||
/* no private */
|
||||
soft_rtc_dev.user_data = RT_NULL;
|
||||
|
||||
rt_device_register(&soft_rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR);
|
||||
|
||||
init_ok = RT_TRUE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
INIT_DEVICE_EXPORT(rt_soft_rtc_init);
|
||||
|
||||
#endif /* RT_USING_SOFT_RTC */
|
||||
+1
-1
Submodule Project/g0b1vetx-sluice updated: 38d2e6b239...2c9ad35632.
@@ -21,6 +21,15 @@ uint32_t Bytes2Int (char * data)
|
||||
return I.data;
|
||||
}
|
||||
|
||||
int16_t Bytes2Int16 (char * data)
|
||||
{
|
||||
Int16Tobyte int16_byte;
|
||||
int16_byte.byte[0] = data[1];
|
||||
int16_byte.byte[1] = data[0];
|
||||
return int16_byte.value;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// -----------------------------------------------------------------
|
||||
// 函数功能: hex字符串转byte数组
|
||||
|
||||
@@ -15,6 +15,11 @@ typedef union
|
||||
} Float;
|
||||
|
||||
|
||||
typedef union{
|
||||
int16_t value;
|
||||
char byte[2];
|
||||
}Int16Tobyte;
|
||||
|
||||
float Bytes2Float (char * data);
|
||||
uint32_t Bytes2Int (char * data);
|
||||
int hexstr_to_hexbyte (char *src, char *obj, uint16_t length);
|
||||
@@ -23,6 +28,8 @@ uint32_t byte_to_Inverse(char * data);
|
||||
// 754 תfloat
|
||||
float float_to_iee754 (float ff1,char * data);
|
||||
|
||||
int16_t Bytes2Int16 (char * data);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef cJSON_Utils__h
|
||||
#define cJSON_Utils__h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include "cJSON.h"
|
||||
|
||||
/* Implement RFC6901 (https://tools.ietf.org/html/rfc6901) JSON Pointer spec. */
|
||||
CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *pointer);
|
||||
CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointerCaseSensitive(cJSON * const object, const char *pointer);
|
||||
|
||||
/* Implement RFC6902 (https://tools.ietf.org/html/rfc6902) JSON Patch spec. */
|
||||
/* NOTE: This modifies objects in 'from' and 'to' by sorting the elements by their key */
|
||||
CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatches(cJSON * const from, cJSON * const to);
|
||||
CJSON_PUBLIC(cJSON *) cJSONUtils_GeneratePatchesCaseSensitive(cJSON * const from, cJSON * const to);
|
||||
/* Utility for generating patch array entries. */
|
||||
CJSON_PUBLIC(void) cJSONUtils_AddPatchToArray(cJSON * const array, const char * const operation, const char * const path, const cJSON * const value);
|
||||
/* Returns 0 for success. */
|
||||
CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * const patches);
|
||||
CJSON_PUBLIC(int) cJSONUtils_ApplyPatchesCaseSensitive(cJSON * const object, const cJSON * const patches);
|
||||
|
||||
/*
|
||||
// Note that ApplyPatches is NOT atomic on failure. To implement an atomic ApplyPatches, use:
|
||||
//int cJSONUtils_AtomicApplyPatches(cJSON **object, cJSON *patches)
|
||||
//{
|
||||
// cJSON *modme = cJSON_Duplicate(*object, 1);
|
||||
// int error = cJSONUtils_ApplyPatches(modme, patches);
|
||||
// if (!error)
|
||||
// {
|
||||
// cJSON_Delete(*object);
|
||||
// *object = modme;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// cJSON_Delete(modme);
|
||||
// }
|
||||
//
|
||||
// return error;
|
||||
//}
|
||||
// Code not added to library since this strategy is a LOT slower.
|
||||
*/
|
||||
|
||||
/* Implement RFC7386 (https://tools.ietf.org/html/rfc7396) JSON Merge Patch spec. */
|
||||
/* target will be modified by patch. return value is new ptr for target. */
|
||||
CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch);
|
||||
CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatchCaseSensitive(cJSON *target, const cJSON * const patch);
|
||||
/* generates a patch to move from -> to */
|
||||
/* NOTE: This modifies objects in 'from' and 'to' by sorting the elements by their key */
|
||||
CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON * const from, cJSON * const to);
|
||||
CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatchCaseSensitive(cJSON * const from, cJSON * const to);
|
||||
|
||||
/* Given a root object and a target object, construct a pointer from one to the other. */
|
||||
CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const object, const cJSON * const target);
|
||||
|
||||
/* Sorts the members of the object into alphabetical order. */
|
||||
CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object);
|
||||
CJSON_PUBLIC(void) cJSONUtils_SortObjectCaseSensitive(cJSON * const object);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -34,12 +34,12 @@
|
||||
|
||||
#ifdef EF_USING_ENV
|
||||
/* Auto update ENV to latest default when current ENV version number is changed. */
|
||||
/* #define EF_ENV_AUTO_UPDATE */
|
||||
#define EF_ENV_AUTO_UPDATE
|
||||
/**
|
||||
* ENV version number defined by user.
|
||||
* Please change it when your firmware add a new ENV to default_env_set.
|
||||
*/
|
||||
#define EF_ENV_VER_NUM 0 /* @note you must define it for a value, such as 0 */
|
||||
#define EF_ENV_VER_NUM 3 /* @note you must define it for a value, such as 0 */
|
||||
|
||||
/* MCU Endian Configuration, default is Little Endian Order. */
|
||||
/* #define EF_BIG_ENDIAN */
|
||||
|
||||
@@ -43,7 +43,7 @@ static const ef_env default_env_set[] = {
|
||||
{"boot_times", "0"},
|
||||
{"jump_boot_time", "10"}, // BOOT 等待时间 10s
|
||||
// 基础参数设置
|
||||
{"device_id", "0000000003"},
|
||||
{"device_id", "7322070012"},
|
||||
{"app_id", "220000"}, // 业务ID
|
||||
{"user_pass", "123456"},
|
||||
{"sys_pass", "898909"},
|
||||
@@ -51,7 +51,7 @@ static const ef_env default_env_set[] = {
|
||||
{"mqtt_pass", "admin"},
|
||||
{"mqtt_addr", "mqtt.zyjzjs.cn"},
|
||||
{"mqtt_port", "1883"},
|
||||
{"mqtt_topic", "sluice"}, //订阅topic
|
||||
{"mqtt_topic", "syksk"}, //订阅topic
|
||||
|
||||
{"net_drv", "dtu"}, // mqtt dtu ec200 eth
|
||||
{"eth2_chann", "0"}, //以太网通道2 支持modbus
|
||||
@@ -82,9 +82,9 @@ static const ef_env default_env_set[] = {
|
||||
{"pwm4", "0"}, // PWM4功能
|
||||
|
||||
// 闸门参数设置
|
||||
{"max_open", "1400"}, // 最大开度
|
||||
{"max_ecode", "31241"}, // 编码器最大编码
|
||||
{"min_ecode", "32828"}, // 编码器最小编码
|
||||
{"max_open", "1600"}, // 最大开度
|
||||
{"max_ecode", "25712"}, // 编码器最大编码
|
||||
{"min_ecode", "31770"}, // 编码器最小编码
|
||||
{"exec_time", "50"}, // 异常检测时间 单位100ms 50 就是 5s
|
||||
|
||||
// 闸门参数设置
|
||||
@@ -98,7 +98,11 @@ static const ef_env default_env_set[] = {
|
||||
{"site_type", "sluice"}, // 0,闸门站,1,流量站,2,渗流渗压站,3,自动化采集站,4,串口服务器
|
||||
{"level","[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]"},
|
||||
{"flow", "[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]"},
|
||||
{"wsid","[128,2,3,4,5,6]"},
|
||||
{"wsid","[1,2,3,4,5,6]"},
|
||||
{"sl427ip","116.176.77.72"},
|
||||
{"sl427port","6200"},
|
||||
{"sl427code","0000000002"},
|
||||
|
||||
// 水位流量关系表 配置10 个点
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user