网络自适应
This commit is contained in:
1 parent
a589e89e33
commit
0f40dd8b17
68 files changed
+7062
-2678
No files matched your search
+19
-99
@@ -1,5 +1,6 @@
|
||||
#include "data.h"
|
||||
#include <rtthread.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
|
||||
|
||||
@@ -9,28 +10,19 @@
|
||||
******************************************/
|
||||
volatile const char _makeData[] = __DATE__; //12字节,编译日期
|
||||
volatile const char _makeTime[] = __TIME__; //9字节
|
||||
volatile const char cBootv[] = "Ver3.0.0"; //获取时添加上面两个时间信息,最大长度64字节
|
||||
//第一个字节环境变量修改时增加序号 第二个字节
|
||||
volatile const char cBootv[] = "Ver5.0.11"; //
|
||||
char _versionTemp[64];
|
||||
int g_cat1_log_enable = 0 ;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
const StrIndex_t cDownDataType[] =
|
||||
{
|
||||
{"run", DownRun},
|
||||
{"stop", DownStop},
|
||||
{"open", DownOpen},
|
||||
{"close", DownClose},
|
||||
{"reg_ans", DownRegistAns},
|
||||
{"heart_ans", DownHeartAns},
|
||||
{"update", DownUpdate},
|
||||
{"reboot", DownReboot},
|
||||
{"config", DownConfig},
|
||||
{"read", DownRead},
|
||||
{"fact", DownFact}
|
||||
=======
|
||||
const StrIndex_t cDownDataType[] =
|
||||
{
|
||||
|
||||
{"run",DownRun} ,
|
||||
{"stop",DownStop} ,
|
||||
{"open",DownOpen} ,
|
||||
@@ -42,22 +34,13 @@ const StrIndex_t cDownDataType[] =
|
||||
{"config",DownConfig},
|
||||
{"read",DownRead} ,
|
||||
{"fact",DownFact}
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
const StrIndex_t cSiteType[] =
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
{"sluice", SiteSluice},
|
||||
{"flow", SiteFlow},
|
||||
{"press", SiteSee},
|
||||
{"auto", SiteColl}, // 自动化采集站
|
||||
{"trans", SiteServer},
|
||||
{"level", SiteLevel},
|
||||
{"skew", SiteSkew} //测斜仪
|
||||
=======
|
||||
{"sluice",SiteSluice} ,
|
||||
{"flow",SiteFlow} ,
|
||||
{"press",SiteSee} ,
|
||||
@@ -65,25 +48,17 @@ const StrIndex_t cSiteType[] =
|
||||
{"trans",SiteServer} ,
|
||||
{"level",SiteLevel},
|
||||
{"skew",SiteSkew} //测斜仪
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
};
|
||||
|
||||
|
||||
const StrIndex_t cMotorType[] =
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
{"mg1000", MT_MG_1000},
|
||||
{"qh100", MT_QH_V100},
|
||||
{"qh200", MT_QH_V200},
|
||||
{"zs100", MT_ZS_V100},
|
||||
{"jz200", MT_JZ_V200}, // 金志 4-20 ma
|
||||
=======
|
||||
|
||||
{"mg1000",MT_MG_1000} ,
|
||||
{"qh100", MT_QH_V100} ,
|
||||
{"qh200", MT_QH_V200} ,
|
||||
{"zs100", MT_ZS_V100} ,
|
||||
{"jz200", MT_JZ_V200} , // 金志 4-20 ma
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
{"dy100", MT_DY_V100}, // 大禹锥型阀
|
||||
{"kg100", MT_KG_V100}, // 开关量模块
|
||||
{"kr100", MT_KR_V100}, // 闸位计
|
||||
@@ -93,7 +68,7 @@ const StrIndex_t cMotorType[] =
|
||||
|
||||
const StrIndex_t c4851Type[] =
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
|
||||
{"mg1000", ST_MG_1000},
|
||||
{"qh100", ST_QH_V100},
|
||||
{"qh200", ST_QH_V200},
|
||||
@@ -102,14 +77,7 @@ const StrIndex_t c4851Type[] =
|
||||
{"kg100", ST_KG_V100},
|
||||
{"at100", ST_AT_V100},
|
||||
{"kr100", ST_KR_V100},
|
||||
=======
|
||||
{"mg1000",ST_MG_1000} ,
|
||||
{"qh100",ST_QH_V100} ,
|
||||
{"qh200",ST_QH_V200} ,
|
||||
{"dy100",ST_DY_V100} ,
|
||||
{"kg100",ST_KG_V100} ,
|
||||
{"at100",ST_AT_V100} ,
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
};
|
||||
|
||||
const StrIndex_t cU485Type[] =
|
||||
@@ -118,7 +86,7 @@ const StrIndex_t cU485Type[] =
|
||||
};
|
||||
|
||||
// 485 2 通道
|
||||
<<<<<<< HEAD
|
||||
|
||||
const StrIndex_t c4852Type[] =
|
||||
{
|
||||
{"rds600", ST_RDS_600},
|
||||
@@ -127,49 +95,12 @@ const StrIndex_t c4852Type[] =
|
||||
{"zkjszk", ST_ZK_JSZK},
|
||||
{"djx100", ST_DJX_100},
|
||||
{"rds300", ST_RDS_300},
|
||||
{"mi600", ST_MI_600} // 测斜仪
|
||||
=======
|
||||
const StrIndex_t c4852Type[] =
|
||||
{
|
||||
{"rds600",ST_RDS_600} ,
|
||||
{"tds300",ST_TDS_300} ,
|
||||
{"ht100",ST_HT_V100} ,
|
||||
{"zkjszk",ST_ZK_JSZK},
|
||||
{"djx100",ST_DJX_100},
|
||||
{"rds300",ST_RDS_300},
|
||||
{"mi600",ST_MI_600} // 测斜仪
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
{"mi600", ST_MI_600}, // 测斜仪
|
||||
{"ht200", ST_HT_V200} // 华天压力计
|
||||
};
|
||||
|
||||
|
||||
const ParShallInfo_t ParShallTale[] =
|
||||
{
|
||||
{.w = 0, .c = 0, .m = 0},
|
||||
{.w = 0.152, .c = 0.381, .m = 1.58 , .minLeve = 0.03, .maxLeve = 0.45, .minFlow = 1.5 / 1000, .maxFlow = 100 / 1000},
|
||||
{.w = 0.25, .c = 0.561, .m = 1.513 , .minLeve = 0.03, .maxLeve = 0.60, .minFlow = 3.0 / 1000, .maxFlow = 250 / 1000},
|
||||
{.w = 0.30, .c = 0.679, .m = 1.521 , .minLeve = 0.03, .maxLeve = 0.75, .minFlow = 3.5 / 1000, .maxFlow = 400 / 1000},
|
||||
{.w = 0.45, .c = 1.038, .m = 1.537 , .minLeve = 0.03, .maxLeve = 0.75, .minFlow = 4.5 / 1000, .maxFlow = 630 / 1000},
|
||||
{.w = 0.60, .c = 1.403, .m = 1.548 , .minLeve = 0.05, .maxLeve = 0.75, .minFlow = 12.5 / 1000, .maxFlow = 850 / 1000},
|
||||
{.w = 0.75, .c = 1.772, .m = 1.557 , .minLeve = 0.06, .maxLeve = 0.75, .minFlow = 25.0 / 1000, .maxFlow = 1100 / 1000},
|
||||
{.w = 0.90, .c = 2.147, .m = 1.565 , .minLeve = 0.06, .maxLeve = 0.75, .minFlow = 30.0 / 1000, .maxFlow = 1250 / 1000},
|
||||
{.w = 1.00, .c = 2.397, .m = 1.569 , .minLeve = 0.06, .maxLeve = 0.80, .minFlow = 30.0 / 1000, .maxFlow = 1500 / 1000},
|
||||
{.w = 1.20, .c = 2.904, .m = 1.577 , .minLeve = 0.06, .maxLeve = 0.80, .minFlow = 35.0 / 1000, .maxFlow = 2000 / 1000},
|
||||
{.w = 1.50, .c = 3.668, .m = 1.586 , .minLeve = 0.06, .maxLeve = 0.80, .minFlow = 45.0 / 1000, .maxFlow = 2500 / 1000},
|
||||
{.w = 1.80, .c = 4.440, .m = 1.593 , .minLeve = 0.08, .maxLeve = 0.80, .minFlow = 80.0 / 1000, .maxFlow = 3000 / 1000},
|
||||
{.w = 2.10, .c = 5.222, .m = 1.599 , .minLeve = 0.08, .maxLeve = 0.80, .minFlow = 95.0 / 1000, .maxFlow = 3600 / 1000},
|
||||
{.w = 2.40, .c = 6.004, .m = 1.605 , .minLeve = 0.08, .maxLeve = 0.80, .minFlow = 100.0 / 1000, .maxFlow = 4000 / 1000},
|
||||
|
||||
{.w = 3.05, .c = 7.463, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.07, .minFlow = 0.16, .maxFlow = 8.28},
|
||||
{.w = 3.66, .c = 8.859, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.37, .minFlow = 0.19, .maxFlow = 14.68},
|
||||
{.w = 4.57, .c = 10.96, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.67, .minFlow = 0.23, .maxFlow = 25.04},
|
||||
{.w = 6.10, .c = 14.45, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.31, .maxFlow = 37.97},
|
||||
|
||||
{.w = 7.62, .c = 17.94, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.38, .maxFlow = 47.16},
|
||||
{.w = 9.14, .c = 21.44, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.46, .maxFlow = 56.33},
|
||||
{.w = 12.19, .c = 28.43, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.60, .maxFlow = 74.70},
|
||||
{.w = 15.24, .c = 35.41, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.75, .maxFlow = 93.04},
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
@@ -179,14 +110,11 @@ WaterData_t WaterData[WATER_COUTN];
|
||||
InclinometerData_t IncData[6]; // 测斜仪数据
|
||||
|
||||
SysData_t SysData;
|
||||
<<<<<<< HEAD
|
||||
|
||||
SOFTRTC_t g_SoftRtc =
|
||||
{
|
||||
23, 10, 1, 0, 0, 0
|
||||
=======
|
||||
SOFTRTC_t g_SoftRtc = {
|
||||
23,10,1,0,0,0
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
};
|
||||
|
||||
uint32_t g_ifconfig = 0;
|
||||
@@ -208,10 +136,8 @@ int cMotorGetType (char * str)
|
||||
|
||||
int c4851GetType (char * str)
|
||||
{
|
||||
rt_kprintf ("485 option count:%d\r\n", sizeof (c4851Type) / sizeof (StrIndex_t)) ;
|
||||
for (int i = 0; i < sizeof (c4851Type) / sizeof (StrIndex_t); i++)
|
||||
{
|
||||
rt_kprintf ("%s,%s\r\n", str, c4851Type[i].str) ;
|
||||
if (rt_memcmp (str, c4851Type[i].str, rt_strlen (str)) == 0)
|
||||
{
|
||||
return c4851Type[i].index;
|
||||
@@ -278,19 +204,13 @@ int cSiteType2Index (char * str)
|
||||
/**********************************************
|
||||
获取boot版本信息
|
||||
**********************************************/
|
||||
<<<<<<< HEAD
|
||||
void *GetVersion (void)
|
||||
{
|
||||
int i = rt_sprintf (_versionTemp, "%s-%s %s", cBootv, _makeData, _makeTime);
|
||||
_versionTemp[i] = 0;
|
||||
return (void*) _versionTemp;
|
||||
=======
|
||||
|
||||
void *GetVersion(void)
|
||||
{
|
||||
int i = rt_sprintf(_versionTemp,"%s-%s %s",cBootv, _makeData, _makeTime);
|
||||
_versionTemp[i] = 0;
|
||||
return (void*)_versionTemp;
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
+29
-29
@@ -1,13 +1,26 @@
|
||||
#ifndef _DATA_H
|
||||
#define _DATA_H
|
||||
#include <stdint.h>
|
||||
#include "user_config.h"
|
||||
|
||||
|
||||
#ifdef USER_MINLE_CHAN2
|
||||
|
||||
|
||||
#define SLUICE_COUTN 1// 当前处理几口闸
|
||||
#define SUBTOPIC_COUNT 2 // 订阅topic 数量
|
||||
|
||||
#else
|
||||
|
||||
#define SLUICE_COUTN 1// 当前处理几口闸
|
||||
#define SUBTOPIC_COUNT 1 // 订阅topic 数量
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#define WATER_COUTN 6// 当前接入n个流量计
|
||||
|
||||
#define SUBTOPIC_COUNT 1 // 订阅topic 数量
|
||||
|
||||
#define SLUCIE_EXEC_COUNT 20// 闸门异常时间
|
||||
|
||||
|
||||
@@ -25,6 +38,7 @@
|
||||
|
||||
extern uint32_t g_ifconfig;
|
||||
extern uint32_t g_ifupdate;
|
||||
extern int g_cat1_log_enable ;
|
||||
|
||||
typedef struct StrIndex_t
|
||||
{
|
||||
@@ -70,6 +84,8 @@ typedef struct SluiceData_t
|
||||
int32_t rload; // 右荷重 单位 kg
|
||||
int32_t ecode; // 编码器原始数据
|
||||
int32_t currt; // 设备电流
|
||||
int32_t error; // 错误编码
|
||||
int32_t state; // 状态
|
||||
} SluiceData_t;
|
||||
|
||||
|
||||
@@ -86,6 +102,7 @@ typedef struct SysData_t
|
||||
int scram; // 急停被按下
|
||||
char fileName[64]; // 文件名
|
||||
int fileSize; // 文件大小
|
||||
|
||||
} SysData_t;
|
||||
|
||||
typedef struct SOFTRTC_t
|
||||
@@ -96,11 +113,9 @@ typedef struct SOFTRTC_t
|
||||
uint8_t hour;
|
||||
uint8_t minutes;
|
||||
uint8_t second;
|
||||
<<<<<<< HEAD
|
||||
} SOFTRTC_t;
|
||||
=======
|
||||
|
||||
}SOFTRTC_t;
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -122,11 +137,9 @@ typedef struct WaterData_t
|
||||
int32_t thisSpeed; // 流速
|
||||
int32_t thisPress; // 压力
|
||||
int32_t thisTemp; // 温度
|
||||
<<<<<<< HEAD
|
||||
|
||||
int retry ; // 重试次数
|
||||
=======
|
||||
int retry ; // 重试次数
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
} WaterData_t;
|
||||
|
||||
|
||||
@@ -173,6 +186,7 @@ typedef enum S4852Type_t
|
||||
ST_DJX_100, // 丁家峡闸门 读取开度
|
||||
ST_RDS_300, // 雷达流量计
|
||||
ST_MI_600, // 鹦鸽嘴测斜仪
|
||||
ST_HT_V200, // 华天压力计
|
||||
} S4852Type_t;
|
||||
|
||||
|
||||
@@ -194,11 +208,9 @@ typedef enum SiteType_t
|
||||
SiteServer, // 串口服务器
|
||||
SiteLevel, // 水位站
|
||||
SiteSkew // 测斜仪
|
||||
<<<<<<< HEAD
|
||||
|
||||
} SiteType_t;
|
||||
=======
|
||||
}SiteType_t;
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
|
||||
|
||||
typedef enum DownDataType_t
|
||||
@@ -214,11 +226,8 @@ typedef enum DownDataType_t
|
||||
DownConfig = 8, // 修改参数
|
||||
DownRead = 9, // 读取参数
|
||||
DownFact = 10, // 读取参数
|
||||
<<<<<<< HEAD
|
||||
} DownDataType_t;
|
||||
=======
|
||||
}DownDataType_t;
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -236,19 +245,13 @@ typedef struct TypeIndexMail_t
|
||||
|
||||
extern SluiceData_t SluiceData[SLUICE_COUTN];
|
||||
extern WaterData_t WaterData[WATER_COUTN];
|
||||
<<<<<<< HEAD
|
||||
|
||||
extern InclinometerData_t IncData[6];
|
||||
extern SysData_t SysData;
|
||||
extern const WaterLeveInfo_t LeveInfo;
|
||||
extern const ParShallInfo_t ParShallTale[];
|
||||
extern SOFTRTC_t g_SoftRtc;
|
||||
=======
|
||||
extern InclinometerData_t IncData[6];
|
||||
extern SysData_t SysData;
|
||||
extern const WaterLeveInfo_t LeveInfo;
|
||||
extern const ParShallInfo_t ParShallTale[];
|
||||
extern SOFTRTC_t g_SoftRtc;
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
|
||||
|
||||
int cMotorGetType (char * str);
|
||||
@@ -269,11 +272,8 @@ int cDownType2Index (char * str);
|
||||
int cSiteType2Index (char * str);
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
void *GetVersion (void);
|
||||
=======
|
||||
void *GetVersion(void);
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
+10
-20
@@ -14,38 +14,30 @@ DIState_t MX_Din_Pull (int chann)
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
|
||||
ret = (DIState_t) HAL_GPIO_ReadPin (DI2_GPIO_Port, DI2_Pin);
|
||||
=======
|
||||
ret = (DIState_t)HAL_GPIO_ReadPin (DI2_GPIO_Port, DI2_Pin);
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
break;
|
||||
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
|
||||
ret = (DIState_t) HAL_GPIO_ReadPin (DI3_GPIO_Port, DI3_Pin);
|
||||
=======
|
||||
ret = (DIState_t)HAL_GPIO_ReadPin (DI3_GPIO_Port, DI3_Pin);
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
break;
|
||||
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
|
||||
ret = (DIState_t) HAL_GPIO_ReadPin (DI4_GPIO_Port, DI4_Pin);
|
||||
=======
|
||||
ret = (DIState_t)HAL_GPIO_ReadPin (DI4_GPIO_Port, DI4_Pin);
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
break;
|
||||
break;
|
||||
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
|
||||
ret = (DIState_t) HAL_GPIO_ReadPin (DI5_GPIO_Port, DI5_Pin);
|
||||
=======
|
||||
ret = (DIState_t)HAL_GPIO_ReadPin (DI5_GPIO_Port, DI5_Pin);
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
break;
|
||||
}
|
||||
case 6:
|
||||
@@ -55,6 +47,4 @@ DIState_t MX_Din_Pull (int chann)
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+1
-4
@@ -5,11 +5,8 @@ typedef enum DIState_t
|
||||
{
|
||||
DI_HIGH = 1,
|
||||
DI_LOW = 0
|
||||
<<<<<<< HEAD
|
||||
} DIState_t;
|
||||
=======
|
||||
|
||||
}DIState_t;
|
||||
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
|
||||
|
||||
void DiInit (void);
|
||||
DIState_t MX_Din_Pull (int chann);
|
||||
|
||||
+2
-1
@@ -3,4 +3,5 @@
|
||||
|
||||
void MX_Dout_Push (int index, int pwm);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+58
-27
@@ -14,7 +14,7 @@
|
||||
|
||||
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "CAT1"
|
||||
#define LOG_TAG "cat1"
|
||||
#endif
|
||||
#include <elog.h>
|
||||
|
||||
@@ -26,15 +26,19 @@ static char tcprxbbuff[1200];
|
||||
static char tcptxbbuff[1200];
|
||||
|
||||
|
||||
netDrv_t g_cat1Drv =
|
||||
|
||||
|
||||
|
||||
netDrvInfo_t g_cat1Drv =
|
||||
{
|
||||
0, // 信号值
|
||||
"", // iccid
|
||||
Init, // 状态
|
||||
tcprxbbuff, // 接受缓存
|
||||
0, // 接受数据长度
|
||||
tcptxbbuff, // 发送数据缓存
|
||||
0, // 发送数据长度
|
||||
.Csq = 0, // 信号值
|
||||
.Iccid = "", // iccid
|
||||
.State = Init, // 状态
|
||||
.rxbuff = tcprxbbuff, // 接受缓存
|
||||
.rx_size = 0, // 接受数据长度
|
||||
.txbuff = tcptxbbuff, // 发送数据缓存
|
||||
.tx_size = 0,
|
||||
.IsEnable = 1, // 发送数据长度
|
||||
|
||||
};
|
||||
|
||||
@@ -48,7 +52,7 @@ static void ec200_resp_csq_callback (char * data, uint16_t length)
|
||||
p = strstr (data, "+CSQ:");
|
||||
p = p + 6;
|
||||
g_cat1Drv.Csq = atoi (p);
|
||||
rt_kprintf ("CSQ: <<< <%d>\r\n", g_cat1Drv.Csq);
|
||||
log_i ("CSQ: <<< <%d>", g_cat1Drv.Csq);
|
||||
}
|
||||
|
||||
// 校准时间程序
|
||||
@@ -75,7 +79,7 @@ static void ec200_resp_qlts_callback (char * data, uint16_t length)
|
||||
p = p + 3; // p
|
||||
k[5] = atoi (p); // 秒
|
||||
k[5] = (k[5] + (k[5] / 10) * 6) ;
|
||||
rt_kprintf ("20%02x-%02x-%02x %02x:%02x:%02x\r\n", k[0], k[1], k[2], k[3], k[4], k[5]);
|
||||
log_i ("DateTime:20%02x-%02x-%02x %02x:%02x:%02x", k[0], k[1], k[2], k[3], k[4], k[5]);
|
||||
|
||||
}
|
||||
|
||||
@@ -87,7 +91,7 @@ static void ec200_resp_iccid_callback (char * data, uint16_t length)
|
||||
p = p + 8;
|
||||
rt_memset (SysData.iccid, 0, 32);
|
||||
rt_memcpy (SysData.iccid, p, 20);
|
||||
rt_kprintf ("ICCID: <<< <%d> [%s]\r\n", length, SysData.iccid);
|
||||
log_i ("ICCID: [%s]", SysData.iccid);
|
||||
}
|
||||
|
||||
static void ec200_resp_qird_callback (char * data, uint16_t length)
|
||||
@@ -115,6 +119,9 @@ static void ec200_resp_qird_callback (char * data, uint16_t length)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// type 0 无需打包 1 需要重新打包
|
||||
const struct
|
||||
{
|
||||
@@ -158,14 +165,20 @@ static CommRet_T cat1_sendcmd_and_responce (int time, char * tx, int size, char
|
||||
{
|
||||
MX_UART_Clear (&g_GSMDrv);
|
||||
MX_UART_PutBuffer (&g_GSMDrv, tx, size);
|
||||
//rt_kprintf ("%.*s", size, tx) ;
|
||||
if (g_cat1_log_enable == 1)
|
||||
{
|
||||
elog_hexdump ("cat1tx", 16, tx, size);
|
||||
}
|
||||
//timeout = cat1list[i].waitms;
|
||||
int timeout = time;
|
||||
while (timeout--)
|
||||
{
|
||||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_GSM_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
|
||||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_GSM_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 3, RT_NULL))
|
||||
{
|
||||
//rt_kprintf ("[%.*s]", g_GSMDrv.rx_size, g_GSMDrv.rx_buffer) ;
|
||||
if (g_cat1_log_enable == 1)
|
||||
{
|
||||
elog_hexdump ("cat1rx", 16, g_GSMDrv.rx_buffer, g_GSMDrv.rx_size) ;
|
||||
}
|
||||
if (NULL != rt_strstr ( (char *) g_GSMDrv.rx_buffer, ack))
|
||||
{
|
||||
if (call != NULL)
|
||||
@@ -176,7 +189,7 @@ static CommRet_T cat1_sendcmd_and_responce (int time, char * tx, int size, char
|
||||
}
|
||||
MX_UART_Clear (&g_GSMDrv);
|
||||
}
|
||||
rt_thread_mdelay (1);
|
||||
//rt_thread_mdelay (3);
|
||||
}
|
||||
return RetErr; // 超时
|
||||
}
|
||||
@@ -200,15 +213,22 @@ static void thread_entry (void * argument)
|
||||
rt_sprintf (at_cmd, "AT+QIOPEN=1,0,\"TCP\",\"%s\",%d,0,0\r", ipaddr, ipport);
|
||||
g_GSMDrv.rxdone = cat1_rx_done;
|
||||
g_GSMDrv.BaudRate = 115200;
|
||||
MX_UART_Init (&g_GSMDrv);
|
||||
// 启动4G 模块电源
|
||||
// 拉高4G 模块复位
|
||||
while (1)
|
||||
{
|
||||
CAT1RST:
|
||||
HAL_GPIO_WritePin (GSM_PW_GPIO_Port, GSM_PW_Pin, GPIO_PIN_RESET); // 关闭4G 模块电源
|
||||
// 初始化串口,打开模块电源
|
||||
g_cat1Drv.State = Init;
|
||||
MX_UART_Init (&g_GSMDrv);
|
||||
HAL_GPIO_WritePin (GSM_PW_GPIO_Port, GSM_PW_Pin, GPIO_PIN_RESET); // 关闭4G 模块电源
|
||||
if (g_cat1Drv.IsEnable == false)
|
||||
{
|
||||
rt_thread_delay (3000);
|
||||
goto CAT1RST;
|
||||
}
|
||||
//MX_UART_Init (&g_GSMDrv);
|
||||
|
||||
rt_thread_mdelay (3000);
|
||||
HAL_GPIO_WritePin (GSM_PW_GPIO_Port, GSM_PW_Pin, GPIO_PIN_SET); // 开启4G
|
||||
rt_thread_mdelay (100);
|
||||
@@ -216,7 +236,8 @@ CAT1RST:
|
||||
HAL_GPIO_WritePin (GSM_RST_GPIO_Port, GSM_RST_Pin, GPIO_PIN_RESET);
|
||||
rt_thread_mdelay (100);
|
||||
HAL_GPIO_WritePin (GSM_RST_GPIO_Port, GSM_RST_Pin, GPIO_PIN_SET);
|
||||
rt_thread_mdelay (8000);
|
||||
rt_thread_mdelay (10000);
|
||||
log_d ("cat.1 init complete");
|
||||
for (int i = 0; i < MAXSETP; i++)
|
||||
{
|
||||
retry = cat1list[i].retry;
|
||||
@@ -231,22 +252,27 @@ CAT1RST:
|
||||
retry--;
|
||||
if (retry <= 0)
|
||||
{
|
||||
rt_kprintf ("Join Faild%d \r\n", i);
|
||||
log_i ("Join Faild");
|
||||
goto CAT1RST;
|
||||
}
|
||||
}
|
||||
// 关机
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_CAT1_SHUT, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) // 需要发
|
||||
{
|
||||
goto CAT1RST;
|
||||
}
|
||||
}
|
||||
}
|
||||
rt_kprintf ("Join Success \r\n");
|
||||
log_i ("Join Success ");
|
||||
rt_sprintf (at_cmd, "AT+QIOPEN=1,0,\"TCP\",\"%s\",%d,0,0\r", ipaddr, ipport);
|
||||
if (cat1_sendcmd_and_responce (15000, at_cmd, strlen (at_cmd), "+QIOPEN: 0,0", NULL) == RetSucc)
|
||||
{
|
||||
g_cat1Drv.State = Conn;
|
||||
rt_kprintf ("Net is ready \r\n");
|
||||
log_i ("connected %s:%d success", ipaddr, ipport);
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf ("Net is Error \r\n");
|
||||
log_i ("connected server error");
|
||||
goto CAT1RST;
|
||||
}
|
||||
|
||||
@@ -261,12 +287,12 @@ CAT1RST:
|
||||
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");
|
||||
log_i ("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");
|
||||
log_i ("NET:+CME:ERROR QPUSH\r\n");
|
||||
goto CAT1RST;
|
||||
}
|
||||
}
|
||||
@@ -275,7 +301,12 @@ CAT1RST:
|
||||
rt_thread_mdelay (300);
|
||||
if (cat1_sendcmd_and_responce (1000, "AT+QIRD=0,1500\r\n", strlen ("AT+QIRD=0,1500\r\n"), "+QIRD:", ec200_resp_qird_callback) != RetSucc)
|
||||
{
|
||||
rt_kprintf ("NET:+CME:ERROR QIRD\r\n");
|
||||
log_i ("NET:+CME:ERROR QIRD\r\n");
|
||||
goto CAT1RST;
|
||||
}
|
||||
// 关机
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_CAT1_SHUT, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) // 需要发
|
||||
{
|
||||
goto CAT1RST;
|
||||
}
|
||||
// // 通过通道2上报数据
|
||||
@@ -297,7 +328,7 @@ CAT1RST:
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
rt_thread_mdelay (3000);
|
||||
}
|
||||
|
||||
+24
-25
@@ -28,23 +28,24 @@ static char tx_buffer[512];
|
||||
static char rx_buffer[512];
|
||||
|
||||
|
||||
// static int isenable = 0;
|
||||
|
||||
netDrv_t g_dtuDrv =
|
||||
|
||||
netDrvInfo_t g_dtuDrv =
|
||||
{
|
||||
0, // 信号值
|
||||
"", // iccid
|
||||
Init, // 状态
|
||||
tx_buffer, // 接受缓存
|
||||
0, // 接受数据长度
|
||||
rx_buffer, // 发送数据缓存
|
||||
0, // 发送数据长度
|
||||
.Csq = 0, // 信号值
|
||||
.Iccid = "", // iccid
|
||||
.State = Init, // 状态
|
||||
.txbuff = tx_buffer, // 接受缓存
|
||||
.rx_size = 0, // 接受数据长度
|
||||
.rxbuff = rx_buffer, // 发送数据缓存
|
||||
.IsEnable = 0, // 发送数据长度
|
||||
};
|
||||
|
||||
|
||||
static void net_data_rxdone (void)
|
||||
{
|
||||
rt_event_send (gUartEvents, EVENT_UART_ETH1_RX);
|
||||
//rt_kprintf("net_data_rxdone\r\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -52,13 +53,19 @@ static void thread_entry (void * argument)
|
||||
{
|
||||
rt_kprintf ("%s was start!\r\n", __FILE__);
|
||||
g_ETH1Drv.rxdone = net_data_rxdone;
|
||||
// MX_UART_Init(&g_ETH1Drv);
|
||||
MX_UART_Init (&g_ETH1Drv);
|
||||
while (1)
|
||||
{
|
||||
MODE_RST:
|
||||
g_dtuDrv.State = Init;
|
||||
MX_UART_Init (&g_ETH1Drv);
|
||||
HAL_GPIO_WritePin (ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_RESET);
|
||||
g_dtuDrv.State = Init;
|
||||
if (g_dtuDrv.IsEnable == 0)
|
||||
{
|
||||
rt_thread_delay (3000);
|
||||
goto MODE_RST;
|
||||
}
|
||||
//MX_UART_Init (&g_ETH1Drv);
|
||||
// HAL_GPIO_WritePin (ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_RESET);
|
||||
rt_thread_mdelay (1000);
|
||||
HAL_GPIO_WritePin (ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_SET);
|
||||
rt_thread_mdelay (1000);
|
||||
@@ -70,24 +77,12 @@ MODE_RST:
|
||||
// 准备要上报数据
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_TX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) //
|
||||
{
|
||||
//rt_kprintf("MODE_RST\r\n");
|
||||
MX_UART_PutBuffer (&g_ETH1Drv, g_dtuDrv.txbuff, g_dtuDrv.tx_size);
|
||||
// rt_kprintf("tx\r\n");
|
||||
// for(int i =0; i <g_dtuDrv.tx_size;i++ )
|
||||
// {
|
||||
// rt_kprintf("%02X ",g_dtuDrv.txbuff[i]);
|
||||
// }
|
||||
// rt_kprintf("\r\n");
|
||||
|
||||
}
|
||||
// 接受到数据
|
||||
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_ETH1_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
|
||||
{
|
||||
// rt_kprintf ("ETH1Rx:%d\r\n", g_ETH1Drv.rx_size);
|
||||
// for (int i = 0; i < g_ETH1Drv.rx_size; i++)
|
||||
// {
|
||||
// rt_kprintf ("%02X ", g_ETH1Drv.rx_buffer[i]);
|
||||
// }
|
||||
// rt_kprintf ("\r\n");
|
||||
rt_memcpy (g_dtuDrv.rxbuff, g_ETH1Drv.rx_buffer, g_ETH1Drv.rx_size);
|
||||
g_dtuDrv.rx_size = g_ETH1Drv.rx_size;
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_RX1) ;
|
||||
@@ -97,6 +92,10 @@ MODE_RST:
|
||||
{
|
||||
goto MODE_RST;
|
||||
}
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_ETH_SHUT, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
|
||||
{
|
||||
goto MODE_RST;
|
||||
}
|
||||
rt_thread_delay (100);
|
||||
// 读取IO 状态
|
||||
}
|
||||
|
||||
+188
-74
@@ -1,26 +1,63 @@
|
||||
#include "jsonpacket.h"
|
||||
|
||||
#include "cjson.h"
|
||||
#include <string.h>
|
||||
#include <rtthread.h>
|
||||
#include "data.h"
|
||||
#include "jsonpacket.h"
|
||||
#include <easyflash.h>
|
||||
#include <stdlib.h>
|
||||
#include "netdrv.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#define PROTO_VER "FF_V3.0"
|
||||
|
||||
extern char config_list[16][32];
|
||||
extern int config_list_size;
|
||||
static char number_str[32];
|
||||
|
||||
|
||||
void * GetNumber (double k, int s)
|
||||
{
|
||||
//static char buff[32] = {0};
|
||||
rt_memset (number_str, 0, 32);
|
||||
switch (s)
|
||||
{
|
||||
case 0:
|
||||
sprintf (number_str, "%f", k);
|
||||
break;
|
||||
case 1:
|
||||
sprintf (number_str, "%.1f", k);
|
||||
break;
|
||||
case 2:
|
||||
sprintf (number_str, "%.2f", k);
|
||||
break;
|
||||
case 3:
|
||||
sprintf (number_str, "%.3f", k);
|
||||
break;
|
||||
case 4:
|
||||
sprintf (number_str, "%.4f", k);
|
||||
break;
|
||||
case 5:
|
||||
sprintf (number_str, "%.5f", k);
|
||||
break;
|
||||
case 6:
|
||||
sprintf (number_str, "%.6f", k);
|
||||
break;
|
||||
}
|
||||
return (void*) number_str;
|
||||
}
|
||||
|
||||
|
||||
// 5 分钟流量站数据上报
|
||||
int Json5MinFlowDataPacket (uint8_t * buffer)
|
||||
{
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
char *json, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL , *result = NULL;
|
||||
double dbl[6] = {3.14, 3.12, 3.33, 3.20, 3.12, 3.20};
|
||||
int length;
|
||||
char * p;
|
||||
root = cJSON_CreateObject();
|
||||
result = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("stand")); // 功能码
|
||||
p = ef_get_env ("site_type");
|
||||
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
|
||||
@@ -42,7 +79,7 @@ int Json5MinFlowDataPacket (uint8_t * buffer)
|
||||
dbl[i] = WaterData[i].thisSpeed;
|
||||
}
|
||||
cJSON * ArrNumSpeed = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thisspeed", ArrNumSpeed);
|
||||
cJSON_AddItemToObject (result, "thisspeed", ArrNumSpeed);
|
||||
|
||||
// 瞬时流量
|
||||
for (int i = 0; i < 6; i++)
|
||||
@@ -50,7 +87,7 @@ int Json5MinFlowDataPacket (uint8_t * buffer)
|
||||
dbl[i] = WaterData[i].thisFlow;
|
||||
}
|
||||
cJSON * ArrNumFlow = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thisflow", ArrNumFlow);
|
||||
cJSON_AddItemToObject (result, "thisflow", ArrNumFlow);
|
||||
|
||||
// 累计流量
|
||||
for (int i = 0; i < 6; i++)
|
||||
@@ -58,22 +95,22 @@ int Json5MinFlowDataPacket (uint8_t * buffer)
|
||||
dbl[i] = WaterData[i].ttWater;
|
||||
}
|
||||
cJSON * ArrNumTtflow = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "ttflow", ArrNumTtflow);
|
||||
cJSON_AddItemToObject (result, "ttflow", ArrNumTtflow);
|
||||
|
||||
// 当前水位
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
dbl[i] = (double)WaterData[i].thisLevel/100;
|
||||
dbl[i] = (double) WaterData[i].thisLevel / 100;
|
||||
}
|
||||
cJSON * ArrNumLeve = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thisLeve", ArrNumLeve);
|
||||
cJSON_AddItemToObject (result, "thisLeve", ArrNumLeve);
|
||||
// 当前压力
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
dbl[i] = WaterData[i].thisPress;
|
||||
}
|
||||
cJSON * ArrNumPress = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thispress", ArrNumPress);
|
||||
cJSON_AddItemToObject (result, "thispress", ArrNumPress);
|
||||
|
||||
// 当前温度
|
||||
for (int i = 0; i < 6; i++)
|
||||
@@ -81,136 +118,155 @@ int Json5MinFlowDataPacket (uint8_t * buffer)
|
||||
dbl[i] = WaterData[i].ttWater;
|
||||
}
|
||||
cJSON * ArrNumTemp = cJSON_CreateDoubleArray (dbl, 6);
|
||||
cJSON_AddItemToObject (root, "thistemp", ArrNumTemp);
|
||||
|
||||
cJSON_AddItemToObject (result, "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);
|
||||
|
||||
cJSON_AddItemToObject (result, "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);
|
||||
|
||||
cJSON_AddItemToObject (result, "thisincdata", ArrNumIncData);
|
||||
cJSON_AddItemToObject (root, "result", result);
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
cJSON_free (result);
|
||||
json = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, json);
|
||||
cJSON_free (json);
|
||||
cJSON_Delete (root);
|
||||
length = rt_strlen (packMsg);
|
||||
return length;
|
||||
}
|
||||
// 5分钟闸门站数据上报
|
||||
int JsonRegistDataPacket (uint8_t * buffer)
|
||||
{
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
char * p;
|
||||
int length;
|
||||
root = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("regist")); // 功能码
|
||||
p = ef_get_env ("site_type");
|
||||
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)); // 表示流量计
|
||||
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)); // 表示电池电压
|
||||
//// 闸门站注册包上报
|
||||
//int JsonRegistDataPacket (uint8_t * buffer)
|
||||
//{
|
||||
// char *result, * packMsg = (char *) buffer;
|
||||
// cJSON *root = NULL;
|
||||
// char * p;
|
||||
// int length;
|
||||
// root = cJSON_CreateObject();
|
||||
// cJSON_AddItemToObject (root, "func", cJSON_CreateString ("regist")); // 功能码
|
||||
// p = ef_get_env ("site_type");
|
||||
// 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)); // 表示流量计
|
||||
// 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)); // 表示电池电压
|
||||
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
cJSON_free (result);
|
||||
cJSON_Delete (root);
|
||||
length = rt_strlen (packMsg);
|
||||
return length;
|
||||
}
|
||||
// //---------------------------------------------以下不准修改
|
||||
// result = cJSON_PrintUnformatted (root);
|
||||
// strcpy (packMsg, result);
|
||||
// cJSON_free (result);
|
||||
// cJSON_Delete (root);
|
||||
// length = rt_strlen (packMsg);
|
||||
// return length;
|
||||
//}
|
||||
|
||||
|
||||
// 5分钟闸门站数据上报
|
||||
// 一、均匀时段报(上行)
|
||||
int Json5MinSluiceDataPacket (uint8_t * buffer)
|
||||
{
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
char *json, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL, *result = NULL;
|
||||
char * p;
|
||||
int length;
|
||||
root = cJSON_CreateObject();
|
||||
result = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("stand")); // 功能码
|
||||
p = ef_get_env ("site_type");
|
||||
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)); // 表示流量计
|
||||
p = ef_get_env ("net_drv");
|
||||
cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString (p)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "ver", cJSON_CreateString (GetVersion())); // 表示流量计
|
||||
//p = ef_get_env ("net_drv");
|
||||
if (g_net_drv == Cat1) //
|
||||
{
|
||||
cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString ("gsm")); // 表示流量计
|
||||
}
|
||||
else
|
||||
{
|
||||
cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString ("eth")); // 表示流量计
|
||||
}
|
||||
p = ef_get_env ("iap_app_filename");
|
||||
//uint32_t max_open = atoi (p);
|
||||
cJSON_AddItemToObject (root, "filename", cJSON_CreateString (p)); // 表示电池电压
|
||||
|
||||
// 添加闸门相关数据
|
||||
// 闸门当前开度
|
||||
cJSON_AddItemToObject (root, "thisopen", cJSON_CreateNumber (SluiceData[0].gopen)); // 表示电池电压
|
||||
cJSON_AddItemToObject (result, "thisopen", cJSON_CreateNumber (SluiceData[0].gopen)); // 表示电池电压
|
||||
// 闸门最大开度
|
||||
p = ef_get_env ("max_open");
|
||||
uint32_t max_open = atoi (p);
|
||||
cJSON_AddItemToObject (root, "maxopen", cJSON_CreateNumber (max_open));
|
||||
cJSON_AddItemToObject (result, "maxopen", cJSON_CreateNumber (max_open));
|
||||
// 闸门A路荷重
|
||||
cJSON_AddItemToObject (root, "aload", cJSON_CreateNumber (SluiceData[0].lload));
|
||||
cJSON_AddItemToObject (result, "aload", cJSON_CreateNumber (SluiceData[0].lload));
|
||||
// 闸门B路荷重
|
||||
cJSON_AddItemToObject (root, "bload", cJSON_CreateNumber (SluiceData[0].rload));
|
||||
cJSON_AddItemToObject (result, "bload", cJSON_CreateNumber (SluiceData[0].rload));
|
||||
// 闸前水位
|
||||
cJSON_AddItemToObject (root, "thisleve", cJSON_CreateNumber (WaterData[0].thisLevel));
|
||||
cJSON_AddItemToObject (result, "thisleve", cJSON_CreateString (GetNumber ( (float) WaterData[0].thisLevel / 100, 2)));
|
||||
// 闸门瞬时流速
|
||||
cJSON_AddItemToObject (root, "thisspeed", cJSON_CreateNumber (WaterData[0].thisSpeed));
|
||||
cJSON_AddItemToObject (result, "thisspeed", cJSON_CreateString (GetNumber ( (float) WaterData[0].thisSpeed / 100, 2)));
|
||||
// 闸门累计流量
|
||||
cJSON_AddItemToObject (root, "thisflow", cJSON_CreateNumber (WaterData[0].thisFlow));
|
||||
cJSON_AddItemToObject (result, "thisflow", cJSON_CreateString (GetNumber ( (float) WaterData[0].thisFlow / 100, 2)));
|
||||
// 闸门瞬时流量
|
||||
cJSON_AddItemToObject (root, "ttflow", cJSON_CreateNumber (WaterData[0].ttWater));
|
||||
cJSON_AddItemToObject (result, "ttflow", cJSON_CreateString (GetNumber ( (float) WaterData[0].ttWater / 100, 2)));
|
||||
// 闸门启动电流
|
||||
cJSON_AddItemToObject (root, "current", cJSON_CreateNumber (SluiceData[0].currt));
|
||||
cJSON_AddItemToObject (result, "current", cJSON_CreateNumber (SluiceData[0].currt));
|
||||
// 闸门编码器最大值
|
||||
p = ef_get_env ("max_ecode");
|
||||
uint32_t max_code = atoi (p);
|
||||
|
||||
cJSON_AddItemToObject (root, "maxecode", cJSON_CreateNumber (max_code));
|
||||
cJSON_AddItemToObject (result, "maxecode", cJSON_CreateNumber (max_code));
|
||||
p = ef_get_env ("min_ecode");
|
||||
uint32_t min_code = atoi (p);
|
||||
// 闸门编码器最小值
|
||||
cJSON_AddItemToObject (root, "minecode", cJSON_CreateNumber (min_code));
|
||||
cJSON_AddItemToObject (result, "minecode", cJSON_CreateNumber (min_code));
|
||||
cJSON_AddItemToObject (root, "result", result);
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
cJSON_free (result);
|
||||
json = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, json);
|
||||
cJSON_free (json);
|
||||
//cJSON_Delete (result);
|
||||
cJSON_Delete (root);
|
||||
|
||||
length = rt_strlen (packMsg);
|
||||
return length;
|
||||
}
|
||||
|
||||
// 心跳包,需要应答
|
||||
// 二、心跳数据上报(上行)
|
||||
int JsonHeartDatapacket (uint8_t * buffer)
|
||||
{
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
int length;
|
||||
char *p;
|
||||
int state[4];
|
||||
root = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("heart")); // 功能码
|
||||
p = ef_get_env ("site_type");
|
||||
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "ecdState", cJSON_CreateNumber (SysData.ecdState)); // 编码器状态
|
||||
cJSON_AddItemToObject (root, "flowState", cJSON_CreateNumber (SysData.flowState)); // 流量计状态
|
||||
cJSON_AddItemToObject (root, "ldState", cJSON_CreateNumber (SysData.ldState)); // 荷重仪状态
|
||||
cJSON_AddItemToObject (root, "scram", cJSON_CreateNumber (SysData.scram)); // 荷重仪状态
|
||||
state[0] = SluiceData[0].error;
|
||||
state[1] = SluiceData[0].state;
|
||||
state[2] = 0;
|
||||
state[3] = 0;
|
||||
cJSON * ArrNumPress = cJSON_CreateIntArray (state, 4);
|
||||
cJSON_AddItemToObject (root, "state", ArrNumPress);
|
||||
|
||||
//cJSON_AddItemToObject (root, "state", cJSON_CreateNumber (SysData.ecdState)); // 编码器状态
|
||||
// cJSON_AddItemToObject (root, "flowState", cJSON_CreateNumber (SysData.flowState)); // 流量计状态
|
||||
// cJSON_AddItemToObject (root, "ldState", cJSON_CreateNumber (SysData.ldState)); // 荷重仪状态
|
||||
// cJSON_AddItemToObject (root, "scram", cJSON_CreateNumber (SysData.scram)); // 荷重仪状态
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
@@ -220,8 +276,48 @@ int JsonHeartDatapacket (uint8_t * buffer)
|
||||
return length;
|
||||
}
|
||||
|
||||
// 四、下行命令应答(上行)
|
||||
|
||||
int JsonConfigReadDataPacket(uint8_t* buffer)
|
||||
int JsonAckDownload (uint8_t* buffer, DownDataType_t dn)
|
||||
{
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
int length;
|
||||
char *p;
|
||||
root = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("ack")); // 功能码
|
||||
switch (dn)
|
||||
{
|
||||
case DownUpdate:
|
||||
cJSON_AddItemToObject (root, "type", cJSON_CreateString ("update")); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "state", cJSON_CreateString ("ok")); // 表示流量计
|
||||
break;
|
||||
case DownConfig:
|
||||
cJSON_AddItemToObject (root, "type", cJSON_CreateString ("config")); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "state", cJSON_CreateString ("ok")); // 表示流量计
|
||||
break;
|
||||
case DownRun:
|
||||
cJSON_AddItemToObject (root, "type", cJSON_CreateString ("run")); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "state", cJSON_CreateString ("ok")); // 表示流量计
|
||||
break;
|
||||
case DownFact:
|
||||
cJSON_AddItemToObject (root, "type", cJSON_CreateString ("fact")); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "state", cJSON_CreateString ("ok")); // 表示流量计
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
cJSON_free (result);
|
||||
cJSON_Delete (root);
|
||||
length = rt_strlen (packMsg);
|
||||
return length;
|
||||
}
|
||||
|
||||
// 十一、读取参数应答(上行)
|
||||
int JsonConfigReadDataPacket (uint8_t* buffer)
|
||||
{
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
@@ -232,7 +328,7 @@ int JsonConfigReadDataPacket(uint8_t* buffer)
|
||||
p = ef_get_env ("site_type");
|
||||
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
|
||||
|
||||
for (int i =0 ;i < config_list_size;i++)
|
||||
for (int i = 0 ; i < config_list_size; i++)
|
||||
{
|
||||
p = ef_get_env (config_list[i]);
|
||||
cJSON_AddItemToObject (root, config_list[i], cJSON_CreateString (p)); // 表示流量计
|
||||
@@ -246,8 +342,26 @@ int JsonConfigReadDataPacket(uint8_t* buffer)
|
||||
return length;
|
||||
}
|
||||
|
||||
int JsonAckSuccPacket(char * buffer)
|
||||
|
||||
|
||||
// 十四 、设备预警(上行)
|
||||
// shangbao
|
||||
int JsonWarning (char * buffer, char * type, int k)
|
||||
{
|
||||
rt_sprintf(buffer,"{\"state\":\"ok\"}");
|
||||
char *result, * packMsg = (char *) buffer;
|
||||
cJSON *root = NULL;
|
||||
int length;
|
||||
char *p;
|
||||
root = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("warn")); // 功能码
|
||||
cJSON_AddItemToObject (root, "type", cJSON_CreateString ("load")); // 表示流量计
|
||||
cJSON_AddItemToObject (root, "data", cJSON_CreateNumber (k)); // 表示流量计
|
||||
//---------------------------------------------以下不准修改
|
||||
result = cJSON_PrintUnformatted (root);
|
||||
strcpy (packMsg, result);
|
||||
cJSON_free (result);
|
||||
cJSON_Delete (root);
|
||||
length = rt_strlen (packMsg);
|
||||
return length;
|
||||
}
|
||||
|
||||
@@ -3,16 +3,52 @@
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
// 5 分钟数据上报
|
||||
|
||||
////typedef enum AckType_t
|
||||
////{
|
||||
//// AckUpdate = 0,
|
||||
//// AckRun = 0,
|
||||
////}
|
||||
|
||||
|
||||
//// 5 分钟数据上报
|
||||
//int Json5MinFlowDataPacket (uint8_t * buffer);
|
||||
|
||||
//// 注册包数据 需要应答
|
||||
//int JsonRegistDataPacket (uint8_t * buffer);
|
||||
//// 心跳包,需要应答
|
||||
//int JsonHeartDatapacket (uint8_t * buffer);
|
||||
|
||||
//int Json5MinSluiceDataPacket (uint8_t * buffer);
|
||||
|
||||
//int JsonConfigReadDataPacket (uint8_t* buffer);
|
||||
|
||||
//int JsonAckSuccPacket (char * buffer,char * type,int k);
|
||||
|
||||
|
||||
|
||||
|
||||
// 5 分钟流量站数据上报
|
||||
int Json5MinFlowDataPacket (uint8_t * buffer);
|
||||
|
||||
// 注册包数据 需要应答
|
||||
int JsonRegistDataPacket (uint8_t * buffer);
|
||||
// 心跳包,需要应答
|
||||
int JsonHeartDatapacket (uint8_t * buffer);
|
||||
|
||||
// 一、均匀时段报(上行)
|
||||
int Json5MinSluiceDataPacket (uint8_t * buffer);
|
||||
|
||||
int JsonConfigReadDataPacket(uint8_t* buffer);
|
||||
int JsonAckSuccPacket(char * buffer);
|
||||
// 二、心跳数据上报(上行)
|
||||
int JsonHeartDatapacket (uint8_t * buffer);
|
||||
|
||||
// 四、下行命令应答(上行)
|
||||
|
||||
int JsonAckDownload (uint8_t* buffer, DownDataType_t dn);
|
||||
|
||||
// 十一、读取参数应答(上行)
|
||||
int JsonConfigReadDataPacket (uint8_t* buffer);
|
||||
|
||||
|
||||
// 十四 、设备预警(上行)
|
||||
// shangbao
|
||||
int JsonWarning (char * buffer, char * type, int k);
|
||||
|
||||
|
||||
#endif
|
||||
+43
-34
@@ -1,3 +1,4 @@
|
||||
#include "data.h"
|
||||
#include "jsonunpack.h"
|
||||
#include "cjson.h"
|
||||
#include <string.h>
|
||||
@@ -5,10 +6,17 @@
|
||||
#include "data.h"
|
||||
#include <easyflash.h>
|
||||
#include <stdlib.h>
|
||||
#include "data.h"
|
||||
|
||||
#include "os-app.h"
|
||||
#include "main.h"
|
||||
|
||||
|
||||
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "json"
|
||||
#endif
|
||||
#include <elog.h>
|
||||
|
||||
char config_list[16][32] = {NULL};
|
||||
int config_list_size = 0;
|
||||
// 用于远程出厂设置时保留配置
|
||||
@@ -25,29 +33,21 @@ void JsonUnPacket (int index, char *buff)
|
||||
root = cJSON_Parse (packMsg);
|
||||
DownDataType_t type = (DownDataType_t) 0;
|
||||
char * p, *key, *value;
|
||||
int list_size;
|
||||
int list_size, data;
|
||||
TypeIndexMail_t mail;
|
||||
p = cJSON_GetStringValue (cJSON_GetObjectItem (root, "type"));
|
||||
type = (DownDataType_t) cDownType2Index (p);
|
||||
rt_kprintf("down :%s<%d>\r\n",p,type);
|
||||
log_i ("down :%s<%d>\r\n", p, type);
|
||||
switch (type)
|
||||
{
|
||||
case DownRun : // 开度提闸
|
||||
|
||||
// rt_kprintf ("open:%u mm/10\r\n", datak);
|
||||
|
||||
// //SluiceData[gMqttDrv.rx_index].opt = 1; // 执行操作闸门
|
||||
// SluiceData[gMqttDrv.rx_index - 1].sopen = datak / 10;
|
||||
// mail.Type = MAIL_SLUICE_OPT;
|
||||
// mail.index = gMqttDrv.rx_index - 1;
|
||||
// rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
|
||||
|
||||
// // 回复应答
|
||||
// mail.Type = MAIL_COMM_SLACK;
|
||||
// mail.index = gMqttDrv.rx_index;
|
||||
// rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
data = cJSON_GetNumberValue (cJSON_GetObjectItem (root, "data"));
|
||||
SluiceData[0].sopen = data; // 执行操作闸门
|
||||
OsSendMail (gSluiceMail, MAIL_SLUICE_OPT, 0); // 操作0号闸门
|
||||
OsSendMail (gTCommMail, MAIL_COMM_SLACK, 0); // 操作0号闸门
|
||||
break;
|
||||
case DownStop :
|
||||
OsSendMail (gSluiceMail, MAIL_SLUICE_STP, 0);
|
||||
break;
|
||||
case DownOpen :
|
||||
break;
|
||||
@@ -58,21 +58,26 @@ void JsonUnPacket (int index, char *buff)
|
||||
case DownHeartAns :
|
||||
break;
|
||||
case DownUpdate :
|
||||
if (index != 0)
|
||||
break;
|
||||
rt_memset (SysData.fileName, 0, 32);
|
||||
p = cJSON_GetStringValue (cJSON_GetObjectItem (root, "file"));
|
||||
rt_sprintf (SysData.fileName, "%s", p) ;
|
||||
// 启动升级线程
|
||||
// 回复应答
|
||||
mail.Type = MAIL_COMM_UPACK;
|
||||
mail.index = index + 1; // 0通道用来升级的通道
|
||||
OsSendMail (gTCommMail, MAIL_COMM_UPACK, index + 1); // 操作0号闸门
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
rt_thread_mdelay (2000); // 等待2s 进入升级线程
|
||||
UpgradeThreadStart();
|
||||
break;
|
||||
case DownReboot :
|
||||
if (index != 0)
|
||||
break;
|
||||
HAL_NVIC_SystemReset();
|
||||
break;
|
||||
case DownConfig: // 设置参数
|
||||
if (index != 0)
|
||||
break;
|
||||
// 读取参数列表
|
||||
list = cJSON_GetObjectItem (root, "list");
|
||||
list_size = cJSON_GetArraySize (list);
|
||||
@@ -85,34 +90,38 @@ 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));
|
||||
OsSendMail (gTCommMail, MAIL_COMM_WRACK, index + 1); // 操作0号闸门
|
||||
// mail.Type = MAIL_COMM_ACK;
|
||||
// mail.index = index + 1; // 0通道用来升级的通道
|
||||
// rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
break;
|
||||
case DownRead: // 读取参数
|
||||
if (index != 0)
|
||||
break;
|
||||
list = cJSON_GetObjectItem (root, "list");
|
||||
config_list_size = cJSON_GetArraySize (list);
|
||||
for (int i = 0; i < config_list_size; i++)
|
||||
{
|
||||
key = cJSON_GetStringValue (cJSON_GetArrayItem (list, i));
|
||||
rt_sprintf(config_list[i],"%s",key);
|
||||
rt_sprintf (config_list[i], "%s", key);
|
||||
}
|
||||
mail.Type = MAIL_COMM_READPARA;
|
||||
mail.index = index + 1; // 0通道用来升级的通道
|
||||
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
|
||||
OsSendMail (gTCommMail, MAIL_COMM_READPARA, index + 1); // 操作0号闸门
|
||||
// mail.Type = MAIL_COMM_READPARA;
|
||||
// mail.index = index + 1; // 0通道用来升级的通道
|
||||
// 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);
|
||||
if (index != 0)
|
||||
break;
|
||||
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));
|
||||
ef_set_env ("device_id", backdevice_id) ;
|
||||
ef_set_env ("net_drv", backnetdrv) ;
|
||||
OsSendMail (gTCommMail, MAIL_COMM_FACACK, index + 1); // 操作0号闸门
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
+48
-28
@@ -79,19 +79,23 @@ char client_id_str[64] = {NULL};
|
||||
static char device_id[32] = {NULL}; // 设备编码
|
||||
static char user_topic[32] = {NULL}; // topic
|
||||
|
||||
static char mqtt_user[32] = {NULL}; // 设备编码
|
||||
static char mqtt_pass[32] = {NULL}; // topic
|
||||
|
||||
static void net_data_rxdone (void)
|
||||
{
|
||||
rt_event_send (gUartEvents, EVENT_UART_ETH1_RX);
|
||||
}
|
||||
|
||||
static int timerout_timer = 0;
|
||||
static int MQTT_timerout_timer = 0;
|
||||
static void timerouter (void * parameter)
|
||||
{
|
||||
timerout_timer ++;
|
||||
if (timerout_timer > 90) // 超过90s 没有收到数据,重启网络
|
||||
MQTT_timerout_timer ++;
|
||||
if (MQTT_timerout_timer > 90) // 超过90s 没有收到数据,重启网络
|
||||
{
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_MQTT_RST);
|
||||
timerout_timer = 0;
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_MQTT_RST);//WXY 此处加切换网络
|
||||
netdrv_switch();
|
||||
MQTT_timerout_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +105,7 @@ static void thread_entry (void * argument)
|
||||
|
||||
int count = 0;
|
||||
// 初始化串口驱动
|
||||
rt_kprintf ("%s was start!\r\n", __FILE__);
|
||||
log_i ("mqtt was start!");
|
||||
timer = rt_timer_create ("timer", timerouter, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC); // 异常检测定时器
|
||||
// 读取配置文件
|
||||
char * p = ef_get_env ("device_id");
|
||||
@@ -109,22 +113,29 @@ static void thread_entry (void * argument)
|
||||
p = ef_get_env ("mqtt_topic");
|
||||
rt_memcpy (user_topic, p, strlen (p));
|
||||
|
||||
int id = rand() % 1000;
|
||||
//int id = rand() % 1000;
|
||||
rt_sprintf (client_id_str, "GID_SLUICE_V2_220000%s", device_id) ;
|
||||
rt_kprintf ("clinet:%s\r\n", client_id_str);
|
||||
log_i ("client_id:%s", client_id_str);
|
||||
connectData.clientID.cstring = client_id_str;
|
||||
connectData.keepAliveInterval = 120;
|
||||
connectData.cleansession = 1;
|
||||
connectData.username.cstring = "admin";
|
||||
connectData.password.cstring = "admin";
|
||||
|
||||
p = ef_get_env ("mqtt_user");
|
||||
rt_memcpy (mqtt_user, p, strlen (p));
|
||||
|
||||
p = ef_get_env ("mqtt_pass");
|
||||
rt_memcpy (mqtt_pass, p, strlen (p));
|
||||
|
||||
connectData.username.cstring = mqtt_user;
|
||||
connectData.password.cstring = mqtt_pass;
|
||||
rt_sprintf (sub_topic_str[0], "device/%s/tx/220000%s", "update", device_id);
|
||||
rt_sprintf (pub_topic_str[0], "device/%s/rx/220000%s", "update", device_id);
|
||||
// 读取设备编码
|
||||
rt_sprintf (sub_topic_str[1], "device/%s/tx/220000%s", user_topic, device_id);
|
||||
rt_sprintf (pub_topic_str[1], "device/%s/rx/220000%s", user_topic, device_id);
|
||||
#if (SUBTOPIC_COUNT > 1)
|
||||
rt_sprintf (sub_topic_str[2], "device/%s/tx/2200002308170002", user_topic);
|
||||
rt_sprintf (pub_topic_str[2], "device/%s/rx/2200002308170002", user_topic);
|
||||
rt_sprintf (sub_topic_str[2], "device/%s/tx/220000%s", "minle",device_id);
|
||||
rt_sprintf (pub_topic_str[2], "device/%s/rx/220000%s", "minle",device_id);
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < SUBTOPIC_COUNT + 1; i++)
|
||||
@@ -137,18 +148,20 @@ static void thread_entry (void * argument)
|
||||
while (1)
|
||||
{
|
||||
MQTTINIT:
|
||||
if (g_netDrv->State != Conn)
|
||||
|
||||
if (g_netDrv->State != Conn) // 等待网络模块注册成功
|
||||
{
|
||||
//rt_kprintf ("mqtt tcp-connected fail\r\n");
|
||||
rt_thread_delay (1000); // 延迟3s 等待模块连接TCP 服务成功
|
||||
goto MQTTINIT;
|
||||
}
|
||||
// 链接MQTT 服务器
|
||||
rt_kprintf ("mqtt connected\r\n");
|
||||
log_i ("connect to mqtt server");
|
||||
mqtt_buflen = MQTTSerialize_connect (mqtt_buffer, MQTT_BUFF_LENGTH, &connectData);
|
||||
netdrv_service_tx (mqtt_buffer, mqtt_buflen);
|
||||
if (RT_EOK != rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_RX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 10000, RT_NULL))
|
||||
{
|
||||
netdrv_reset();// 切换到mqtt 驱动
|
||||
goto MQTTINIT;
|
||||
}
|
||||
rt_thread_mdelay (10);
|
||||
@@ -157,26 +170,31 @@ MQTTINIT:
|
||||
unsigned char sessionPresent, connack_rc;
|
||||
if (MQTTDeserialize_connack (&sessionPresent, &connack_rc, mqtt_buffer, MQTT_BUFF_LENGTH) != 1 || connack_rc != 0)
|
||||
{
|
||||
rt_kprintf ("Unable to connect, return code %d\n", connack_rc);
|
||||
log_i ("Unable to connect, return code %d\n", connack_rc);
|
||||
rt_thread_delay (3000);
|
||||
netdrv_clear();
|
||||
netdrv_reset();// 切换到mqtt 驱动
|
||||
goto MQTTINIT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf ("mqtt error");
|
||||
log_i ("mqtt error");
|
||||
netdrv_clear();
|
||||
rt_thread_mdelay (3000);
|
||||
// netdrv_switch();// 切换到mqtt 驱动
|
||||
goto MQTTINIT;
|
||||
}
|
||||
netdrv_clear();
|
||||
rt_kprintf ("connect to mqtt successful\n");
|
||||
log_i ("connect to mqtt successful");
|
||||
// 订阅topic
|
||||
mqtt_buflen = MQTTSerialize_subscribe (mqtt_buffer, MQTT_BUFF_LENGTH, 0, message_id++, SUBTOPIC_COUNT + 1, subtopic, qos);
|
||||
netdrv_service_tx (mqtt_buffer, mqtt_buflen);
|
||||
if (RT_EOK != rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_RX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 10000, RT_NULL))
|
||||
{
|
||||
netdrv_clear();
|
||||
netdrv_reset();// 切换到mqtt 驱动
|
||||
rt_thread_mdelay (3000);
|
||||
goto MQTTINIT;
|
||||
}
|
||||
if (MQTTPacket_read (mqtt_buffer, MQTT_BUFF_LENGTH, netdrv_getdata) == SUBACK) /* wait for suback */
|
||||
@@ -187,8 +205,10 @@ MQTTINIT:
|
||||
MQTTDeserialize_suback (&submsgid, 1, &subcount, &granted_qos, mqtt_buffer, MQTT_BUFF_LENGTH);
|
||||
if (granted_qos != 0)
|
||||
{
|
||||
rt_kprintf ("granted qos != 0, %d\n", granted_qos);
|
||||
log_i ("granted qos != 0, %d\n", granted_qos);
|
||||
netdrv_clear();
|
||||
netdrv_reset();// 切换到mqtt 驱动
|
||||
rt_thread_mdelay (3000);
|
||||
goto MQTTINIT;
|
||||
}
|
||||
}
|
||||
@@ -197,11 +217,12 @@ MQTTINIT:
|
||||
rt_kprintf ("sub topic faild\r\n");
|
||||
rt_thread_delay (1000);
|
||||
netdrv_clear();
|
||||
netdrv_reset();
|
||||
goto MQTTINIT;
|
||||
}
|
||||
netdrv_clear();
|
||||
|
||||
rt_kprintf ("subtopic topic %s\r\n", subtopic[0].cstring);
|
||||
log_i ("subtopic topic [%s]", subtopic[1].cstring);
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_MQTT_SUB);
|
||||
netdrv_clear();
|
||||
rt_thread_delay (500);
|
||||
@@ -226,16 +247,14 @@ MQTTINIT:
|
||||
&payload_in, &payloadlen_in, mqtt_buffer, MQTT_BUFF_LENGTH);
|
||||
rt_memcpy (gMqttDrv.rxbuff, payload_in, payloadlen_in) ;
|
||||
gMqttDrv.rx_size = payloadlen_in;
|
||||
//rt_memcpy(gMqttDrv.topic,receivedTopic.lenstring.data,receivedTopic.lenstring.len);
|
||||
|
||||
|
||||
for (int var = 0; var < SUBTOPIC_COUNT + 1; ++var)
|
||||
{
|
||||
if (rt_memcmp (subtopic[var].cstring, receivedTopic.lenstring.data, receivedTopic.lenstring.len) == 0)
|
||||
{
|
||||
gMqttDrv.rx_index = var;
|
||||
rt_kprintf ("recv from :%d,%*.s\r\n", gMqttDrv.rx_index, receivedTopic.lenstring.len, receivedTopic.lenstring.data);
|
||||
break;
|
||||
log_i ("recv from :%d", gMqttDrv.rx_index);
|
||||
// break;
|
||||
}
|
||||
}
|
||||
if (gMqttDrv.rx_index == 0) // 0 通道为升级通道
|
||||
@@ -246,7 +265,7 @@ MQTTINIT:
|
||||
{
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_COMM_RX);
|
||||
}
|
||||
timerout_timer = 0;
|
||||
MQTT_timerout_timer = 0;
|
||||
}
|
||||
netdrv_clear();
|
||||
}
|
||||
@@ -258,7 +277,8 @@ MQTTINIT:
|
||||
}
|
||||
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_MQTT_RST, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
|
||||
{
|
||||
rt_kprintf ("mqtt conn lost\r\n");
|
||||
log_i ("mqtt conn lost by timeout");
|
||||
//netdrv_switch();// 切换到mqtt 驱动
|
||||
netdrv_reset();
|
||||
State = DISC;
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_COMM_RST);
|
||||
@@ -267,7 +287,8 @@ MQTTINIT:
|
||||
// 网络链接丢失
|
||||
if (g_netDrv->State != Conn)
|
||||
{
|
||||
rt_kprintf ("mqtt conn lost\r\n");
|
||||
log_i ("mqtt conn lost by network\r\n");
|
||||
//netdrv_switch();// 切换到mqtt 驱动
|
||||
netdrv_reset();
|
||||
State = DISC;
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_COMM_RST);
|
||||
@@ -283,7 +304,6 @@ MQTTINIT:
|
||||
|
||||
void MQTT_SendData (void)
|
||||
{
|
||||
|
||||
// topic_index = index;
|
||||
//// rt_memcpy(mqtt_payload,data,size);
|
||||
//// mqtt_payload_size = size ;
|
||||
@@ -313,7 +333,7 @@ void MQTTThreadStart (void)
|
||||
|
||||
void shell_mqtt_time (void)
|
||||
{
|
||||
rt_kprintf ("lost_timer:%u\r\n", timerout_timer) ;
|
||||
rt_kprintf ("lost_timer:%u\r\n", MQTT_timerout_timer) ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+142
-68
@@ -9,80 +9,116 @@
|
||||
#include "netdrv.h"
|
||||
#include "dtu-board.h"
|
||||
|
||||
extern netDrv_t g_cat1Drv;
|
||||
extern netDrv_t g_MJEth1Drv;
|
||||
extern netDrv_t g_dtuDrv;
|
||||
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "netdrv"
|
||||
#endif
|
||||
#include <elog.h>
|
||||
|
||||
extern netDrvInfo_t g_cat1Drv;
|
||||
extern netDrvInfo_t g_MJEth1Drv;
|
||||
extern netDrvInfo_t g_dtuDrv;
|
||||
|
||||
|
||||
netDrv_t * g_netDrv;
|
||||
netDrvInfo_t * g_netDrv;
|
||||
|
||||
|
||||
|
||||
static int mysock = 0;
|
||||
static int offset = 0;
|
||||
netDrv_t g_net_drv = Cat1;// 0选择4G 上网 1:选择eth上网
|
||||
|
||||
|
||||
|
||||
|
||||
// 使用4G 模块上网
|
||||
static void netdrv_openCat1 (void)
|
||||
{
|
||||
g_dtuDrv.IsEnable = 0; // 打开4G
|
||||
g_cat1Drv.IsEnable = 1;
|
||||
g_netDrv = &g_cat1Drv; // 0 选择 dtu 上网
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_ETH_SHUT) ;
|
||||
}
|
||||
// 使用Eth 模块上网
|
||||
static void netdrv_openDtu (void)
|
||||
{
|
||||
g_dtuDrv.IsEnable = 1; // 打开4G
|
||||
g_cat1Drv.IsEnable = 0;
|
||||
g_netDrv = &g_dtuDrv; // 0 选择 dtu 上网
|
||||
// 通知4g模块关机
|
||||
rt_event_send (gTrigEvents, EVENT_TRIG_CAT1_SHUT) ;
|
||||
|
||||
}
|
||||
|
||||
void netdrv_init (void)
|
||||
{
|
||||
char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
{
|
||||
g_netDrv = &g_dtuDrv;
|
||||
DTUThreadStart();
|
||||
}
|
||||
else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
{
|
||||
g_netDrv = &g_cat1Drv;
|
||||
|
||||
CAT1ThreadStart();
|
||||
if (g_net_drv == Dtu) // 4G 模块
|
||||
{
|
||||
netdrv_openDtu();
|
||||
}
|
||||
// else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
// {
|
||||
// g_netDrv = &g_MJEth1Drv;
|
||||
// MJEth1ThreadStart();
|
||||
// }
|
||||
else
|
||||
{
|
||||
|
||||
netdrv_openCat1();
|
||||
}
|
||||
DTUThreadStart(); // 启动线程
|
||||
CAT1ThreadStart(); // 启动线程
|
||||
}
|
||||
|
||||
|
||||
void netdrv_service_tx (uint8_t * data, int length)
|
||||
{
|
||||
char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
|
||||
if (g_net_drv == Dtu)
|
||||
{
|
||||
dtu_service_tx ( (char *) data, length);
|
||||
}
|
||||
else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
else
|
||||
{
|
||||
cat1_service_tx ( (char *) data, length);
|
||||
}
|
||||
else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
{
|
||||
}
|
||||
|
||||
// 切换网络驱动
|
||||
void netdrv_switch (void)
|
||||
{
|
||||
if (g_net_drv == Dtu)
|
||||
{
|
||||
log_i ("net work drv switch to cat1");
|
||||
netdrv_openCat1();
|
||||
g_net_drv = Cat1 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
log_i ("net work drv switch to dtu");
|
||||
netdrv_openDtu();
|
||||
g_net_drv = Dtu ;
|
||||
}
|
||||
}
|
||||
|
||||
void netdrv_reset (void)
|
||||
{
|
||||
char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
// char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
// if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
// {
|
||||
// dtu_netreset();
|
||||
// }
|
||||
// else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
// {
|
||||
// //cat1_service_tx ( (char *) data, length);
|
||||
// }
|
||||
// else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
// {
|
||||
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
|
||||
// }
|
||||
|
||||
if (g_net_drv == Dtu)
|
||||
{
|
||||
dtu_netreset();
|
||||
}
|
||||
else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
{
|
||||
//cat1_service_tx ( (char *) data, length);
|
||||
}
|
||||
else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -94,9 +130,47 @@ void netdrv_reset (void)
|
||||
int netdrv_getdata (unsigned char* buf, int count)
|
||||
{
|
||||
int tsize = 0;
|
||||
char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
// char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
// if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
// {
|
||||
// if (offset + count > g_netDrv->rx_size)
|
||||
// {
|
||||
// tsize = g_netDrv->rx_size - offset;
|
||||
// rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// tsize = count;
|
||||
// rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
// }
|
||||
|
||||
// }
|
||||
// else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
// {
|
||||
// if (offset + count > g_netDrv->rx_size)
|
||||
// {
|
||||
// tsize = g_netDrv->rx_size - offset;
|
||||
// rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// tsize = count;
|
||||
// rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
// }
|
||||
// }
|
||||
// else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
// {
|
||||
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
|
||||
// }
|
||||
|
||||
|
||||
if (g_net_drv == Dtu)
|
||||
{
|
||||
//dtu_netreset();
|
||||
if (offset + count > g_netDrv->rx_size)
|
||||
{
|
||||
tsize = g_netDrv->rx_size - offset;
|
||||
@@ -107,28 +181,19 @@ int netdrv_getdata (unsigned char* buf, int count)
|
||||
tsize = count;
|
||||
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
}
|
||||
|
||||
}
|
||||
else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
{
|
||||
if (offset + count > g_netDrv->rx_size)
|
||||
{
|
||||
tsize = g_netDrv->rx_size - offset;
|
||||
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
}
|
||||
else
|
||||
{
|
||||
tsize = count;
|
||||
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
}
|
||||
}
|
||||
else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if (offset + count > g_netDrv->rx_size)
|
||||
{
|
||||
tsize = g_netDrv->rx_size - offset;
|
||||
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
}
|
||||
else
|
||||
{
|
||||
tsize = count;
|
||||
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
|
||||
}
|
||||
}
|
||||
offset += count;
|
||||
return tsize;
|
||||
@@ -138,19 +203,28 @@ int netdrv_getdata (unsigned char* buf, int count)
|
||||
int netdrv_clear (void)
|
||||
{
|
||||
|
||||
char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
// char * drv = ef_get_env ("net_drv"); // 读取网络类型
|
||||
// if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
|
||||
// {
|
||||
// MX_UART_Clear (&g_ETH1Drv);
|
||||
|
||||
// }
|
||||
// else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
// {
|
||||
// //rt_memcpy(buf, &g_cat1Drv.rxbuff[offset], count);
|
||||
// }
|
||||
// else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
// {
|
||||
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
|
||||
// }
|
||||
|
||||
if (g_net_drv == Dtu)
|
||||
{
|
||||
MX_UART_Clear (&g_ETH1Drv);
|
||||
|
||||
}
|
||||
else if (rt_memcmp ("ec200", drv, 4) == 0)
|
||||
{
|
||||
//rt_memcpy(buf, &g_cat1Drv.rxbuff[offset], count);
|
||||
}
|
||||
else if (rt_memcmp ("eth", drv, 3) == 0)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+19
-8
@@ -10,7 +10,13 @@ typedef enum netDrvState_t
|
||||
Idle // 空闲
|
||||
} netDrvState_t;
|
||||
|
||||
typedef struct netDrv_t
|
||||
typedef enum netDrv_t
|
||||
{
|
||||
Dtu = 0,
|
||||
Cat1 = 1
|
||||
} netDrv_t;
|
||||
|
||||
typedef struct netDrvInfo_t
|
||||
{
|
||||
int Csq;
|
||||
char Iccid[20];
|
||||
@@ -19,7 +25,10 @@ typedef struct netDrv_t
|
||||
int rx_size; // 接受到的tcp 数据缓存
|
||||
char * txbuff; // 发送的TCP 数据缓存
|
||||
int tx_size;
|
||||
} netDrv_t;
|
||||
int IsEnable;
|
||||
} netDrvInfo_t;
|
||||
|
||||
|
||||
|
||||
|
||||
typedef enum CommRet_T
|
||||
@@ -28,14 +37,16 @@ typedef enum CommRet_T
|
||||
RetErr
|
||||
} CommRet_T;
|
||||
|
||||
extern netDrv_t * g_netDrv;;
|
||||
extern netDrvInfo_t * g_netDrv;
|
||||
extern netDrv_t g_net_drv ;// 0选择4G 上网 1:选择eth上网
|
||||
|
||||
|
||||
void netdrv_service_tx (uint8_t * data, int length);
|
||||
int netdrv_getdata (uint8_t* buf, int count);
|
||||
int netdrv_clear (void);
|
||||
void netdrv_init (void);
|
||||
void netdrv_reset (void); // 网络链接失败,通知驱动重新启动网络模块
|
||||
extern void netdrv_service_tx (uint8_t * data, int length);
|
||||
extern int netdrv_getdata (uint8_t* buf, int count);
|
||||
extern int netdrv_clear (void);
|
||||
extern void netdrv_init (void);
|
||||
extern void netdrv_reset (void); // 网络链接失败,通知驱动重新启动网络模块
|
||||
extern void netdrv_switch (void);
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,82 @@
|
||||
#include <stdint.h>
|
||||
#include "aes.h"
|
||||
#include <rtthread.h>
|
||||
|
||||
/*!
|
||||
* AES computation context variable
|
||||
*/
|
||||
static aes_context AesContext;
|
||||
/*!
|
||||
* Encryption aBlock and sBlock
|
||||
*/
|
||||
static uint8_t aBlock[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
static uint8_t sBlock[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
|
||||
void LoRaMacPayloadEncrypt (const uint8_t *buffer, uint16_t size, const uint8_t *key, uint8_t *encBuffer)
|
||||
{
|
||||
uint16_t i;
|
||||
uint8_t bufferIndex = 0;
|
||||
uint16_t ctr = 1;
|
||||
|
||||
rt_memset (AesContext.ksch, '\0', 240);
|
||||
aes_set_key (key, 16, &AesContext);
|
||||
|
||||
// aBlock[5] = dir;
|
||||
|
||||
// aBlock[6] = ( address ) & 0xFF;
|
||||
// aBlock[7] = ( address >> 8 ) & 0xFF;
|
||||
// aBlock[8] = ( address >> 16 ) & 0xFF;
|
||||
// aBlock[9] = ( address >> 24 ) & 0xFF;
|
||||
|
||||
// aBlock[10] = ( sequenceCounter ) & 0xFF;
|
||||
// aBlock[11] = ( sequenceCounter >> 8 ) & 0xFF;
|
||||
// aBlock[12] = ( sequenceCounter >> 16 ) & 0xFF;
|
||||
// aBlock[13] = ( sequenceCounter >> 24 ) & 0xFF;
|
||||
|
||||
while (size >= 16)
|
||||
{
|
||||
aBlock[15] = ( (ctr) & 0xFF);
|
||||
ctr++;
|
||||
aes_encrypt (aBlock, sBlock, &AesContext);
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
encBuffer[bufferIndex + i] = buffer[bufferIndex + i] ^ sBlock[i];
|
||||
}
|
||||
size -= 16;
|
||||
bufferIndex += 16;
|
||||
}
|
||||
|
||||
if (size > 0)
|
||||
{
|
||||
aBlock[15] = ( (ctr) & 0xFF);
|
||||
aes_encrypt (aBlock, sBlock, &AesContext);
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
encBuffer[bufferIndex + i] = buffer[bufferIndex + i] ^ sBlock[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LoRaMacPayloadDecrypt (const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint8_t *decBuffer)
|
||||
{
|
||||
LoRaMacPayloadEncrypt (buffer, size, key, decBuffer);
|
||||
}
|
||||
|
||||
|
||||
void netWorkAesInit (void)
|
||||
{
|
||||
char data[128] = {"8989098989098989"}, data1[128];
|
||||
char key[] = {"8989098989890989"};
|
||||
aes_set_key (key, 16, &AesContext);
|
||||
LoRaMacPayloadEncrypt (data, 16, key, data1) ;
|
||||
for (int i = 0; i < 32; i++)
|
||||
{
|
||||
rt_kprintf ("%02x", data1[i]);
|
||||
}
|
||||
rt_kprintf ("\r\n");
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
#ifndef _NEETWORK_CRYPTO_H
|
||||
#define _NEETWORK_CRYPTO_H
|
||||
|
||||
void netWorkAesInit (void);
|
||||
|
||||
|
||||
#endif
|
||||
+14
-7
@@ -10,6 +10,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
static int g_syn_number = 0;
|
||||
|
||||
|
||||
@@ -35,7 +36,6 @@ int PacketHeader (uint8_t func, char * data, int length, char * txbuff)
|
||||
txbuff[tx_size++] = 0x00;
|
||||
txbuff[tx_size++] = length;// 长度
|
||||
txbuff[tx_size++] = _651_STX;
|
||||
//dbg_printf ("sizeof (_651_U_Header_t):%d\r\n", tx_size);
|
||||
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
@@ -99,6 +99,14 @@ int PakcetTimerUp (int k, char * tx_data)
|
||||
|
||||
tx_data[tx_size++] = 0xFF; // 要素1 闸前水位
|
||||
tx_data[tx_size++] = 0x39; // 要素1 闸前水位
|
||||
#ifdef USER_UNREAL_DATA // 使用虚拟数据上报
|
||||
WaterData[0].thisSpeed = rand() % 36 / 10;
|
||||
WaterData[0].thisFlow = rand() % 36 / 10;
|
||||
WaterData[0].ttWater = 32567;
|
||||
SluiceData[0].gopen = 835;
|
||||
SluiceData[0].lload = 250;
|
||||
WaterData[0].thisLevel = rand() % 36 / 10;
|
||||
#endif
|
||||
|
||||
intk.data = WaterData[0].thisSpeed * 100;
|
||||
tx_data[tx_size++] = intk.byte[3];
|
||||
@@ -117,13 +125,13 @@ int PakcetTimerUp (int k, char * tx_data)
|
||||
tx_data[tx_size++] = intk.byte[2];
|
||||
tx_data[tx_size++] = intk.byte[1];
|
||||
tx_data[tx_size++] = intk.byte[0];
|
||||
intk.data = SluiceData[k].gopen * 10;
|
||||
intk.data = SluiceData[0].gopen * 10;
|
||||
tx_data[tx_size++] = intk.byte[3];
|
||||
tx_data[tx_size++] = intk.byte[2];
|
||||
tx_data[tx_size++] = intk.byte[1];
|
||||
tx_data[tx_size++] = intk.byte[0];
|
||||
|
||||
intk.data = (SluiceData[k].lload + SluiceData[k].rload) * 10;
|
||||
intk.data = (SluiceData[0].lload + SluiceData[0].rload) * 10;
|
||||
tx_data[tx_size++] = intk.byte[3];
|
||||
tx_data[tx_size++] = intk.byte[2];
|
||||
tx_data[tx_size++] = intk.byte[1];
|
||||
@@ -137,14 +145,14 @@ int PakcetTimerUp (int k, char * tx_data)
|
||||
tx_data[tx_size++] = intk.byte[0];
|
||||
|
||||
// 要素7 电池电压
|
||||
intk.data = 0 * 100;
|
||||
intk.data = 12.3 * 100;
|
||||
tx_data[tx_size++] = intk.byte[3];
|
||||
tx_data[tx_size++] = intk.byte[2];
|
||||
tx_data[tx_size++] = intk.byte[1];
|
||||
tx_data[tx_size++] = intk.byte[0];
|
||||
|
||||
// 要素8 机箱温度
|
||||
intk.data = 0 * 100;
|
||||
intk.data = 25.6 * 100;
|
||||
tx_data[tx_size++] = intk.byte[3];
|
||||
tx_data[tx_size++] = intk.byte[2];
|
||||
tx_data[tx_size++] = intk.byte[1];
|
||||
@@ -171,8 +179,7 @@ int PacketSluiceUp (int k, char * tx_data)
|
||||
tx_data[tx_size++] = 0x01;
|
||||
tx_data[tx_size++] = 0x01;
|
||||
// // 闸门开度
|
||||
intk.data = SluiceData[k].gopen * 10;
|
||||
rt_kprintf("gopen:%d\r\n");
|
||||
intk.data = SluiceData[0].gopen * 10;
|
||||
tx_data[tx_size++] = intk.byte[3];
|
||||
tx_data[tx_size++] = intk.byte[2];
|
||||
tx_data[tx_size++] = intk.byte[1];
|
||||
|
||||
+191
-37
@@ -1,6 +1,10 @@
|
||||
#include "usart-board.h"
|
||||
#include "usart.h"
|
||||
|
||||
#include <rtthread.h>
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "uart"
|
||||
#endif
|
||||
#include <elog.h>
|
||||
|
||||
#define UART_LPUART1_BUFF_SIZE 256 // 4853
|
||||
#define UART_LPUART2_BUFF_SIZE 2400 // gsm
|
||||
@@ -23,6 +27,11 @@ static char s_uart5_buff[UART_UART5_BUFF_SIZE];
|
||||
static char s_uart6_buff[UART_UART6_BUFF_SIZE];
|
||||
|
||||
|
||||
#define RXBUFFERSIZE 2400
|
||||
uint8_t aDmaLp2RxBuffer[RXBUFFERSIZE];
|
||||
uint8_t aDmaU4RxBuffer [RXBUFFERSIZE];
|
||||
|
||||
|
||||
extern UART_HandleTypeDef hlpuart1;
|
||||
extern UART_HandleTypeDef hlpuart2;
|
||||
extern UART_HandleTypeDef huart1;
|
||||
@@ -208,6 +217,7 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
Error_Handler();
|
||||
}
|
||||
__HAL_UART_ENABLE_IT (&hlpuart1, UART_IT_RXNE);
|
||||
__HAL_UART_ENABLE_IT (&hlpuart1, UART_IT_ORE);
|
||||
break;
|
||||
}
|
||||
case G0_LPUART2 : // GSM
|
||||
@@ -238,7 +248,16 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
__HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_RXNE);
|
||||
|
||||
//__HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_RXNE);
|
||||
__HAL_UART_ENABLE_IT(&hlpuart2, UART_IT_IDLE);
|
||||
__HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_ORE);
|
||||
// __HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_NE);
|
||||
// __HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_FE);
|
||||
if (HAL_UART_Receive_DMA (&hlpuart2, (uint8_t *) aDmaLp2RxBuffer, RXBUFFERSIZE) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
break;
|
||||
case G0_UART1 : // 4853
|
||||
huart1.Instance = USART1;
|
||||
@@ -300,6 +319,7 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
}
|
||||
// 使能串口接受中断,用于接受数据
|
||||
__HAL_UART_ENABLE_IT (&huart2, UART_IT_RXNE);
|
||||
__HAL_UART_ENABLE_IT (&huart2, UART_IT_ORE);
|
||||
break;
|
||||
case G0_UART3: // 4852
|
||||
huart3.Instance = USART3;
|
||||
@@ -329,6 +349,7 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
__HAL_UART_ENABLE_IT (&huart3, UART_IT_ORE);
|
||||
__HAL_UART_ENABLE_IT (&huart3, UART_IT_RXNE);
|
||||
break;
|
||||
case G0_UART4: // ETH1
|
||||
@@ -348,7 +369,13 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN USART4_Init 2 */
|
||||
__HAL_UART_ENABLE_IT (&huart4, UART_IT_RXNE);
|
||||
//__HAL_UART_ENABLE_IT (&huart4, UART_IT_RXNE);
|
||||
__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
|
||||
__HAL_UART_ENABLE_IT (&huart4, UART_IT_ORE);
|
||||
if (HAL_UART_Receive_DMA (&huart4, (uint8_t *) aDmaU4RxBuffer, RXBUFFERSIZE) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
break;
|
||||
case G0_UART5: // 4851
|
||||
huart5.Instance = USART5;
|
||||
@@ -367,6 +394,7 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN USART5_Init 2 */
|
||||
__HAL_UART_ENABLE_IT (&huart5, UART_IT_ORE);
|
||||
__HAL_UART_ENABLE_IT (&huart5, UART_IT_RXNE);
|
||||
break;
|
||||
case G0_UART6: // View
|
||||
@@ -386,6 +414,7 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
Error_Handler();
|
||||
}
|
||||
__HAL_UART_ENABLE_IT (&huart6, UART_IT_RXNE);
|
||||
__HAL_UART_ENABLE_IT (&huart6, UART_IT_ORE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -393,22 +422,34 @@ void MX_UART_Init (UartDrv_t *drv)
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MX_UART_IRQHandle (void)
|
||||
void MX_UART2_LPUART2_IRQHandle (void)
|
||||
{
|
||||
uint8_t ret;
|
||||
if (USART3->ISR & (1 << 5)) // 串口2
|
||||
// if (LPUART2->ISR & USART_ISR_RXNE_RXFNE)
|
||||
// {
|
||||
//
|
||||
// ret = LPUART2->RDR;
|
||||
// if (g_GSMDrv.rx_buffer != NULL)
|
||||
// {
|
||||
// g_GSMDrv.rx_buffer[g_GSMDrv.rx_size++] = ret;
|
||||
// g_GSMDrv.rx_timer = 30; // 30ms
|
||||
// if (g_GSMDrv.rx_size > UART_LPUART2_BUFF_SIZE)
|
||||
// g_GSMDrv.rx_size = 0;
|
||||
// }
|
||||
// } debug
|
||||
|
||||
if (LPUART2->ISR & USART_ISR_ORE)
|
||||
{
|
||||
ret = USART3->RDR;
|
||||
if (g_U4852Drv.rx_buffer != NULL)
|
||||
{
|
||||
g_U4852Drv.rx_buffer[g_U4852Drv.rx_size++] = ret;
|
||||
g_U4852Drv.rx_timer = 30; // 30ms
|
||||
if (g_U4852Drv.rx_size > UART_UART3_BUFF_SIZE)
|
||||
g_U4852Drv.rx_size = 0;
|
||||
}
|
||||
// rt_kprintf("ore:l2\r\n");
|
||||
__HAL_UART_CLEAR_FLAG(&hlpuart2, UART_CLEAR_OREF);
|
||||
}
|
||||
if (USART2->ISR & (1 << 5)) // 串口2
|
||||
if (USART2->ISR & USART_ISR_ORE)
|
||||
{
|
||||
//rt_kprintf("ore:2\r\n");
|
||||
__HAL_UART_CLEAR_FLAG(&huart2, UART_CLEAR_OREF);
|
||||
}
|
||||
|
||||
if (USART2->ISR & USART_ISR_RXNE_RXFNE) // 串口2
|
||||
{
|
||||
ret = USART2->RDR;
|
||||
if (g_DebugDrv.rx_buffer != NULL)
|
||||
@@ -419,18 +460,87 @@ void MX_UART_IRQHandle (void)
|
||||
g_DebugDrv.rx_size = 0;
|
||||
}
|
||||
}
|
||||
if (USART4->ISR & (1 << 5))
|
||||
}
|
||||
|
||||
// 串口空闲终端处理函数
|
||||
void MX_UART2_LPUART2_IDLE_IRQHandle(void)
|
||||
{
|
||||
uint16_t ret;
|
||||
|
||||
if (LPUART2->ISR & USART_ISR_IDLE) // 串口空闲中断
|
||||
{
|
||||
ret = USART4->RDR;
|
||||
if (g_ETH1Drv.rx_buffer != NULL)
|
||||
ret = UART_LPUART2_BUFF_SIZE - __HAL_DMA_GET_COUNTER(hlpuart2.hdmarx); // 接收到数据的长度
|
||||
if (ret > 0)
|
||||
{
|
||||
g_ETH1Drv.rx_buffer[g_ETH1Drv.rx_size++] = ret;
|
||||
g_ETH1Drv.rx_timer = 30; // 30ms
|
||||
if (g_ETH1Drv.rx_size > UART_UART4_BUFF_SIZE)
|
||||
g_ETH1Drv.rx_size = 0;
|
||||
rt_memcpy(g_GSMDrv.rx_buffer,aDmaLp2RxBuffer,ret);
|
||||
g_GSMDrv.rx_size = ret;
|
||||
//g_GSMDrv.rxdone();
|
||||
}
|
||||
else
|
||||
{
|
||||
g_GSMDrv.rx_size = 0;
|
||||
}
|
||||
g_GSMDrv.rxdone();
|
||||
__HAL_UART_CLEAR_FLAG(&hlpuart2, UART_CLEAR_IDLEF);
|
||||
// 处理DMA 数据
|
||||
}
|
||||
// 处理DMA 数据
|
||||
}
|
||||
|
||||
void MX_UART_IDLE_IRQHandle(void)
|
||||
{
|
||||
uint16_t ret;
|
||||
|
||||
if (USART4->ISR & USART_ISR_IDLE) // 串口空闲中断
|
||||
{
|
||||
|
||||
ret = UART_UART4_BUFF_SIZE - __HAL_DMA_GET_COUNTER(huart4.hdmarx); // 接收到数据的长度
|
||||
//log_i("MX_UART_IDLE_IRQHandle:%d",ret);
|
||||
if (ret > 0)
|
||||
{
|
||||
rt_memcpy(g_ETH1Drv.rx_buffer,aDmaU4RxBuffer,ret);
|
||||
g_ETH1Drv.rx_size = ret;
|
||||
//g_ETH1Drv.rxdone();
|
||||
}
|
||||
else
|
||||
{
|
||||
g_ETH1Drv.rx_size = 0;
|
||||
}
|
||||
g_ETH1Drv.rxdone();
|
||||
__HAL_UART_CLEAR_FLAG(&huart4, UART_CLEAR_IDLEF);
|
||||
// 处理DMA 数据
|
||||
}
|
||||
// 处理DMA 数据
|
||||
}
|
||||
|
||||
|
||||
void MX_UART_IRQHandle (void)
|
||||
{
|
||||
uint8_t ret;
|
||||
|
||||
if (USART3->ISR & USART_ISR_RXNE_RXFNE) // 串口2
|
||||
{
|
||||
ret = USART3->RDR;
|
||||
if (g_U4852Drv.rx_buffer != NULL)
|
||||
{
|
||||
g_U4852Drv.rx_buffer[g_U4852Drv.rx_size++] = ret;
|
||||
g_U4852Drv.rx_timer = 30; // 30ms
|
||||
if (g_U4852Drv.rx_size > UART_UART3_BUFF_SIZE)
|
||||
g_U4852Drv.rx_size = 0;
|
||||
}
|
||||
}
|
||||
if (USART5->ISR & (1 << 5))
|
||||
// if (USART4->ISR & USART_ISR_RXNE_RXFNE)
|
||||
// {
|
||||
// ret = USART4->RDR;
|
||||
// if (g_ETH1Drv.rx_buffer != NULL)
|
||||
// {
|
||||
// g_ETH1Drv.rx_buffer[g_ETH1Drv.rx_size++] = ret;
|
||||
// g_ETH1Drv.rx_timer = 30; // 30ms
|
||||
// if (g_ETH1Drv.rx_size > UART_UART4_BUFF_SIZE)
|
||||
// g_ETH1Drv.rx_size = 0;
|
||||
// }
|
||||
// }
|
||||
if (USART5->ISR & USART_ISR_RXNE_RXFNE)
|
||||
{
|
||||
ret = USART5->RDR;
|
||||
if (g_U4851Drv.rx_buffer != NULL)
|
||||
@@ -441,9 +551,10 @@ void MX_UART_IRQHandle (void)
|
||||
g_U4851Drv.rx_size = 0;
|
||||
}
|
||||
}
|
||||
if (USART6->ISR & (1 << 5))
|
||||
if (USART6->ISR & USART_ISR_RXNE_RXFNE)
|
||||
{
|
||||
ret = USART6->RDR;
|
||||
|
||||
if (g_ViewDrv.rx_buffer != NULL)
|
||||
{
|
||||
g_ViewDrv.rx_buffer[g_ViewDrv.rx_size++] = ret;
|
||||
@@ -452,8 +563,9 @@ void MX_UART_IRQHandle (void)
|
||||
g_ViewDrv.rx_size = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (LPUART1->ISR & (1 << 5))
|
||||
if (LPUART1->ISR & USART_ISR_RXNE_RXFNE)
|
||||
{
|
||||
ret = LPUART1->RDR;
|
||||
if (g_ETH2Drv.rx_buffer != NULL)
|
||||
@@ -464,25 +576,64 @@ void MX_UART_IRQHandle (void)
|
||||
g_ETH2Drv.rx_size = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (LPUART2->ISR & (1 << 5))
|
||||
if (USART3->ISR & USART_ISR_ORE)
|
||||
{
|
||||
ret = LPUART2->RDR;
|
||||
if (g_GSMDrv.rx_buffer != NULL)
|
||||
{
|
||||
g_GSMDrv.rx_buffer[g_GSMDrv.rx_size++] = ret;
|
||||
g_GSMDrv.rx_timer = 30; // 30ms
|
||||
if (g_GSMDrv.rx_size > UART_LPUART2_BUFF_SIZE)
|
||||
g_GSMDrv.rx_size = 0;
|
||||
}
|
||||
//rt_kprintf("ore:3\r\n");
|
||||
__HAL_UART_CLEAR_FLAG(&huart3, UART_CLEAR_OREF);
|
||||
}
|
||||
if (USART4->ISR & USART_ISR_ORE)
|
||||
{
|
||||
//rt_kprintf("ore:4\r\n");
|
||||
__HAL_UART_CLEAR_FLAG(&huart4, UART_CLEAR_OREF);
|
||||
}
|
||||
if (USART6->ISR & USART_ISR_ORE)
|
||||
{
|
||||
//rt_kprintf("ore:6\r\n");
|
||||
__HAL_UART_CLEAR_FLAG(&huart6, UART_CLEAR_OREF);
|
||||
}
|
||||
if (USART5->ISR & USART_ISR_ORE)
|
||||
{
|
||||
//rt_kprintf("ore:5\r\n");
|
||||
__HAL_UART_CLEAR_FLAG(&huart5, UART_CLEAR_OREF);
|
||||
}
|
||||
if (LPUART1->ISR & USART_ISR_ORE)
|
||||
{
|
||||
//rt_kprintf("ore:l1\r\n");
|
||||
__HAL_UART_CLEAR_FLAG(&hlpuart1, UART_CLEAR_OREF);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void MX_UART_Clear (UartDrv_t * drv)
|
||||
{
|
||||
drv->rx_size = 0;
|
||||
drv->rx_timer = 0;
|
||||
if (drv->Id == G0_LPUART2)
|
||||
{
|
||||
if (HAL_UART_AbortReceive(&hlpuart2) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
if (HAL_UART_Receive_DMA (&hlpuart2, (uint8_t *) aDmaLp2RxBuffer, RXBUFFERSIZE) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
}
|
||||
else if (drv->Id == G0_UART4)
|
||||
{
|
||||
if (HAL_UART_AbortReceive(&huart4) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
if (HAL_UART_Receive_DMA (&huart4, (uint8_t *) aDmaU4RxBuffer, RXBUFFERSIZE) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
}
|
||||
else {
|
||||
drv->rx_size = 0;
|
||||
drv->rx_timer = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void MX_UART_PutChar (UartDrv_t * drv, char ch)
|
||||
@@ -518,6 +669,9 @@ void MX_UART_PutChar (UartDrv_t * drv, char ch)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void MX_UART_PutBuffer (UartDrv_t * drv, char *buff, int size)
|
||||
{
|
||||
for (int i = 0; i < size; i++)
|
||||
|
||||
Reference in new issue
Block a user