Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
W
wirerope
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
IOT
wirerope
Commits
d2b4ee17
Commit
d2b4ee17
authored
Jan 17, 2024
by
aohui.li
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加状态机、开启4G和以太网、开启以太网静态IP可配(v1.01)
parent
28d624b9
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1080 additions
and
435 deletions
+1080
-435
wit.c
components/Application/wit.c
+832
-350
wit.h
components/Application/wit.h
+67
-18
wit_config.h
components/config/wit_config.h
+5
-2
ts_iot01b.c
components/eth_parsing/ts_iot01b.c
+93
-4
ts_iot01b.h
components/eth_parsing/ts_iot01b.h
+24
-10
httputil.c
components/infa/APP/httputil.c
+6
-4
tcp_server.c
components/infa/APP/tcp_server.c
+35
-27
w5100s_conf.c
components/infa/eth/w5100s_conf.c
+6
-2
celluar_gpio.c
components/infa/generation/Celluar/celluar_gpio.c
+3
-3
celluar_usb.c
components/infa/generation/Celluar/celluar_usb.c
+1
-1
app_main.c
main/app_main.c
+6
-12
sdkconfig
sdkconfig
+2
-2
No files found.
components/Application/wit.c
View file @
d2b4ee17
...
...
@@ -36,17 +36,18 @@
#include "rtc.h"
#include "ram.h"
#if CONFIG_W5100S_SPI_ETHERNET > 0
#include "../infa/APP/httputil.h"
#include "w5100s.h"
#include "dhcp.h"
#include "loopback.h"
#include "wizchip_conf.h"
#include "w5100s_conf.h"
#include "eth.h"
#if CONFIG_W5100S_SPI_ETHERNET > 0
#include "eth.h"
#endif
#include "../infa/APP/tcp_server.h"
#include "../eth_parsing/ts_iot01b.h"
#endif
#if CONFIG_EC200S_USB_4G > 0
#include "celluar_comm.h"
#include "celluar.h"
...
...
@@ -72,17 +73,16 @@ struct beingConfigIOT{
.
Config_Id
=
0
};
unsigned
long
g_ts
[
IOTDEV_MAX_NUM
]
=
{
0
};
// 记录最新收到心跳时的时间
// unsigned long g_ts[EACH_GROUP_MAX_NUM] = {0};
// 记录最新收到心跳时的时间
QueueHandle_t
xMessageQueueHandle
=
NULL
;
unsigned
char
g_slaver_status
=
0
;
static
bool
g_bDataSend_TimerArr
=
false
;
static
bool
g_bErrorSend_TimerArr
=
false
;
bool
g_DataUpdateFlag
=
false
;
bool
g_bErrorUpdateFlag
=
false
;
extern
TimerHandle_t
xSensorTimer
;
extern
TimerHandle_t
xSensorDataFreshTimer
;
extern
TimerHandle_t
xSensorTimeoutTimer
;
SemaphoreHandle_t
xSemaphoreWaitResp
=
NULL
;
SemaphoreHandle_t
xSemaphoreDataResp
=
NULL
;
SemaphoreHandle_t
xSemaphoreStopResp
=
NULL
;
SemaphoreHandle_t
xSemaphoreConfigResp
=
NULL
;
/* Private macros ------------------------------------------------------------*/
// Task info
...
...
@@ -340,7 +340,9 @@ static TimerHandle_t g_xKeyTimer;
static
TimerHandle_t
g_xWorkTimer
;
static
TimerHandle_t
g_xPushTimer
;
static
TimerHandle_t
g_xDLICalTimer
;
static
TimerHandle_t
g_xDataSendTimer
;
TimerHandle_t
g_xDataSendTimer
[
WIREROPE_GROUP_MAX_NUM
];
TimerHandle_t
g_xFeatureTimer
=
NULL
;
bool
g_bFeatureTimerArr
;
static
TimerHandle_t
g_xErrorSendTimer
;
static
TimerHandle_t
g_xCfgUpTimer
;
static
TimerHandle_t
g_xSenConfigTimer
;
...
...
@@ -477,10 +479,8 @@ unsigned long *g_pulConfigNumberPointerList[] =
,
&
g_xWITConfig
.
ulSenParmInfoValue
#endif
#if CONFIG_W5100S_SPI_ETHERNET > 0
,
&
g_xWITConfig
.
ulEthNetInfoValue
#endif
};
static
const
char
*
const
g_pcImportantParameterName
[]
=
...
...
@@ -619,11 +619,17 @@ static unsigned int lastActiveFlag = 0;
#endif
// my_iot function
void
iot_Sensor_
Init
(
void
);
void
Message_Deal_Start_T
ask
(
void
);
void
iot_Sensor_
Clear
(
bool
all
);
void
message_deal_start_t
ask
(
void
);
void
tcp_server_task_start
(
void
);
bool
WIT_SendIOTData
(
void
);
bool
WIT_SendIOTError
(
void
);
// bool WIT_SendIOTData(void);
// bool WIT_MissingErrorSend(void);
bool
WIT_SendIOTData
(
unsigned
int
group
);
// bool WIT_MissingErrorSend(unsigned int group, unsigned int dev);
bool
WIT_MissingErrorSend
(
unsigned
int
group
);
void
vSensorHeartBeatTimerCallback
();
bool
WIT_SendGatewayFeature
(
void
);
bool
IOTConfigFunction
();
void
iot_Sensor_Print
(
void
);
...
...
@@ -681,16 +687,23 @@ void WIT_Init()
// Init mode and value
// 从内部flash读取配置并进行配置
WIT_ModeAndValueInit
();
//iot_Sensor_Print();
// for (int i = 0; i < IOTDEV_MAX_NUM; i++)
// {
// printf("my_IOTDev[%d] id_sn = %04x,%04x\n",i, g_xWITConfig.my_IOTDev[i].id, g_xWITConfig.my_IOTDev[i].sn);
// }
printf
(
"threshold = %ld
\n
"
,
g_xWITConfig
.
my_IOTThreshold
);
printf
(
"period = %ld
\n
"
,
g_xWITConfig
.
ulPeriod
);
g_xWITConfig
.
eGatewayMode
=
1
;
// Config check
if
(
g_xWITConfig
.
spdSel
>
3
)
{
g_xWITConfig
.
spdSel
=
3
;
}
iot_Sensor_Print
();
printf
(
"ulDataPeriod = %ld
\n
"
,
g_xWITConfig
.
ulDataPeriod
);
printf
(
"ulFeaturePeriod = %ld
\n
"
,
g_xWITConfig
.
ulFeaturePeriod
);
#if CONFIG_BLUETOOTH > 0
// if_sensor_config_init();
#endif
if_sensor_config_init
();
g_xWITConfig
.
eGatewayMode
=
1
;
// Config check
...
...
@@ -720,9 +733,12 @@ void WIT_Init()
// connect to server only in STA mode
WIT_MQTTConnect
();
vTaskDelay
(
pdMS_TO_TICKS
(
100
));
// 启动tcp server & 消息处理函数
tcp_server_task_start
();
vTaskDelay
(
pdMS_TO_TICKS
(
100
));
Message_Deal_Start_Task
();
message_deal_start_task
();
vTaskDelay
(
pdMS_TO_TICKS
(
100
));
// Check has fan monitor point
if
(
g_xWITConfig
.
spdSyncEnable
!=
0
)
...
...
@@ -1074,25 +1090,25 @@ void LearnThr(void)
}
// 如果学习完成变为正常模式
if
(
g_xWITConfig
.
usCurrentLearningCount
>=
g_xWITConfig
.
usTotalLearningCount
)
{
// 强制发送最后一组学习数据
g_bDLISend
=
true
;
// 切换为正常模式 时间周期修改
g_xWITConfig
.
eGatewayMode
=
GatewayMode_Normal
;
// 切换为正常模式上发周期
g_xWITConfig
.
ulPeriod
=
g_xWITConfig
.
ulFeaturePeriodCopy
;
g_xWITConfig
.
ulWavePeriod
=
g_xWITConfig
.
ulWavePeriodCopy
;
// 重启数据定时器
xTimerChangePeriod
(
g_xGatewayFeatureTimer
,
g_xWITConfig
.
ulPeriod
,
1000
);
xTimerChangePeriod
(
g_xSensorFeatureTimer
,
g_xWITConfig
.
ulPeriod
,
1000
);
xTimerChangePeriod
(
g_xAlarmTimer
,
g_xWITConfig
.
ulPeriod
,
1000
);
xTimerChangePeriod
(
g_xWaveTimer
,
g_xWITConfig
.
ulWavePeriod
,
1000
);
// 写入配置
xTimerStart
(
g_xCfgUpTimer
,
1000
);
}
//
if (g_xWITConfig.usCurrentLearningCount >= g_xWITConfig.usTotalLearningCount)
//
{
//
// 强制发送最后一组学习数据
//
g_bDLISend = true;
//
// 切换为正常模式 时间周期修改
//
g_xWITConfig.eGatewayMode = GatewayMode_Normal;
//
// 切换为正常模式上发周期
//
g_xWITConfig.ulPeriod = g_xWITConfig.ulFeaturePeriodCopy;
//
g_xWITConfig.ulWavePeriod = g_xWITConfig.ulWavePeriodCopy;
//
// 重启数据定时器
//
xTimerChangePeriod(g_xGatewayFeatureTimer, g_xWITConfig.ulPeriod, 1000);
//
xTimerChangePeriod(g_xSensorFeatureTimer, g_xWITConfig.ulPeriod, 1000);
//
xTimerChangePeriod(g_xAlarmTimer, g_xWITConfig.ulPeriod, 1000);
//
xTimerChangePeriod(g_xWaveTimer, g_xWITConfig.ulWavePeriod, 1000);
//
// 写入配置
//
xTimerStart(g_xCfgUpTimer, 1000);
//
}
}
void
WIT_Run
()
...
...
@@ -1125,30 +1141,38 @@ void WIT_Run()
}
//Send IOT Data
if
(
g_bDataSend_TimerArr
==
true
&&
g_DataUpdateFlag
==
true
)
// The threshold control is missing.
{
if
((
WIT_SendIOTData
()
==
true
)
&&
(
WIT_SendGatewayFeature
()
==
true
))
{
printf
(
"Data Send success
\n
"
);
g_DataUpdateFlag
=
false
;
g_bDataSend_TimerArr
=
false
;
}
else
{
// printf("Send fail\n");
}
}
//
if (g_bDataSend_TimerArr == true && g_DataUpdateFlag == true) // The threshold control is missing.
//
{
//
if ((WIT_SendIOTData() == true) && (WIT_SendGatewayFeature() == true))
//
{
//
printf("Data Send success\n");
//
g_DataUpdateFlag = false;
//
g_bDataSend_TimerArr = false;
//
}
//
else{
//
// printf("Send fail\n");
//
}
//
}
//Send Error Data
if
(
g_bErrorSend_TimerArr
==
true
&&
g_bErrorUpdateFlag
==
true
)
// if (g_bErrorSend_TimerArr == true && g_bErrorUpdateFlag == true)
// {
// if (WIT_MissingErrorSend() == true )
// {
// printf("Error Send success\n");
// g_bErrorSend_TimerArr = false;
// g_bErrorUpdateFlag = false;
// }
// else{
// printf("Send fail\n");
// }
// }
if
(
g_bFeatureTimerArr
==
TRUE
)
{
if
(
WIT_Send
IOTError
()
==
true
)
if
(
WIT_Send
GatewayFeature
()
==
true
)
{
printf
(
"Error Send success
\n
"
);
g_bErrorSend_TimerArr
=
false
;
g_bErrorUpdateFlag
=
false
;
}
else
{
printf
(
"Send fail
\n
"
);
g_bFeatureTimerArr
=
false
;
}
}
...
...
@@ -1481,10 +1505,10 @@ static void WIT_EventPollTask(void *pvParameter)
{
g_bUpdateConfigureArea
=
false
;
WIT_UpdateConfigureArea
();
#if CONFIG_W5100S_SPI_ETHERNET > 0
//
#if CONFIG_W5100S_SPI_ETHERNET > 0
if
(
get_pending_bit
())
esp_restart
();
#endif
//
#endif
}
if
(
g_bUpdateThresholdArea
==
true
)
...
...
@@ -1925,37 +1949,41 @@ static void WIT_ModeAndValueInit()
// strcpy(g_xWITConfig.cMQTTBroker, "112.17.107.240");
// strcpy(g_xWITConfig.cMQTTPort, "1883");
// bNeedUpdateConfigArea = true;
// strcpy(g_xWITConfig.cMQTTBroker, "www.witium.com.cn");
// strcpy(g_xWITConfig.cMQTTPort, "12883");
#if 0
// 测试平台
g_xWITConfig.ulSerialNumber = 20240108;
strcpy(g_xWITConfig.cMQTTBroker, "www.witium.com.cn");
strcpy(g_xWITConfig.cMQTTPort, "12883");
#else
// 正式平台
// g_xWITConfig.ulSerialNumber = 23122021;
strcpy
(
g_xWITConfig
.
cMQTTBroker
,
"116.62.127.242"
);
strcpy
(
g_xWITConfig
.
cMQTTPort
,
"1883"
);
#endif
// strcpy(g_xWITConfig.cMQTTBroker, "116.62.127.242");
// strcpy(g_xWITConfig.cMQTTPort, "1883");
// bNeedUpdateConfigArea = true;
// g_xWITConfig.ulPort = 345;
g_xWITConfig
.
ulSerialNumber
=
20240108
;
g_xWITConfig
.
ulPort
=
12883
;
g_xWITConfig
.
cTargetIP
[
0
]
=
222
;
g_xWITConfig
.
cTargetIP
[
1
]
=
71
;
g_xWITConfig
.
cTargetIP
[
2
]
=
96
;
g_xWITConfig
.
cTargetIP
[
3
]
=
91
;
// g_xWITConfig.my_IOTDev[0].addr = 1;
// g_xWITConfig.my_IOTDev[0].id = 0x003f;
// g_xWITConfig.my_IOTDev[0].sn = 0x0001;
// g_xWITConfig.my_IOTDev[0].bIsTimeout = false;
// g_xWITConfig.my_IOTDev[0].bIsUsed = true;
iot_Sensor_Init
();
// 清空传感器配置
// g_xWITConfig.ulPort = 12883;
// g_xWITConfig.cTargetIP[0] = 222;
// g_xWITConfig.cTargetIP[1] = 71;
// g_xWITConfig.cTargetIP[2] = 96;
// g_xWITConfig.cTargetIP[3] = 91;
// g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[0].addr = 1;
// g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[0].id = 0x003f;
// g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[0].sn = 0x0001;
// g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[0].bIsUsed = true;
iot_Sensor_Clear
(
false
);
// 清空传感器配置
// sprintf(g_xWITConfig.cAPName, "Witium-%08lu", g_xWITConfig.ulSerialNumber);
// bNeedUpdateConfigArea = true;
// sprintf(g_xWITConfig.cAPName, "Witium-%08lu", g_xWITConfig.ulSerialNumber);
for
(
int
i
=
0
;
i
<
WIT_SENSOR_GROUP_MAX_NUM
;
i
++
)
{
g_xWITConfig
.
xGroupTable
[
i
].
ulOperation
=
0
;
g_xWITConfig
.
xGroupTable
[
i
].
ulWavePushEnable
=
1
;
g_xWITConfig
.
xGroupTable
[
i
].
ulFeaPushEnable
=
1
;
}
// iot_Sensor_Print();
// WIT_UpdateConfigureArea();
// g_xWITConfig.ulConfigureValue = 0;
bNeedUpdateConfigArea
=
true
;
// Check ID and motor work time
// 1.Firstly check backup area
...
...
@@ -2006,7 +2034,8 @@ static void WIT_ModeAndValueInit()
g_xWITConfig
.
eOpMode
=
WIFI_FORCE_AP
;
#endif
g_xWITConfig
.
ulSerialNumber
=
ulSN
;
g_xWITConfig
.
ulPeriod
=
WIT_NORMAL_FEATURE_PERIOD
;
g_xWITConfig
.
ulFeaturePeriod
=
WIT_FEATURE_PERIOD
;
g_xWITConfig
.
ulDataPeriod
=
WIT_DATA_PERIOD
;
g_xWITConfig
.
bConfigUpdated
=
false
;
#if CONFIG_ESP32_WIFI > 0
strcpy
(
g_xWITConfig
.
xWIFI
.
cDHCP
,
"DHCP"
);
...
...
@@ -2101,8 +2130,8 @@ static void WIT_ModeAndValueInit()
if
(
g_xWITConfig
.
ulCopyValueInfo
!=
WIT_CONFIGURE_VALUE
)
{
g_xWITConfig
.
ulFeaturePeriodCopy
=
g_xWITConfig
.
ulPeriod
;
g_xWITConfig
.
ulWavePeriodCopy
=
g_xWITConfig
.
ulWavePeriod
;
//
g_xWITConfig.ulFeaturePeriodCopy = g_xWITConfig.ulPeriod;
//
g_xWITConfig.ulWavePeriodCopy = g_xWITConfig.ulWavePeriod;
g_xWITConfig
.
ulCopyValueInfo
=
WIT_CONFIGURE_VALUE
;
bNeedUpdateConfigArea
=
true
;
}
...
...
@@ -2139,7 +2168,6 @@ static void WIT_ModeAndValueInit()
bNeedUpdateConfigArea
=
true
;
}
#endif
#if CONFIG_W5100S_SPI_ETHERNET > 0
if
(
g_xWITConfig
.
ulEthNetInfoValue
!=
WIT_CONFIGURE_VALUE
)
{
g_xWITConfig
.
g_xConfigIp
.
mac
[
0
]
=
0x00
;
...
...
@@ -2152,7 +2180,7 @@ static void WIT_ModeAndValueInit()
g_xWITConfig
.
g_xConfigIp
.
ip
[
0
]
=
192
;
g_xWITConfig
.
g_xConfigIp
.
ip
[
1
]
=
168
;
g_xWITConfig
.
g_xConfigIp
.
ip
[
2
]
=
1
;
g_xWITConfig
.
g_xConfigIp
.
ip
[
3
]
=
1
0
0
;
g_xWITConfig
.
g_xConfigIp
.
ip
[
3
]
=
1
6
0
;
g_xWITConfig
.
g_xConfigIp
.
gw
[
0
]
=
192
;
g_xWITConfig
.
g_xConfigIp
.
gw
[
1
]
=
168
;
...
...
@@ -2173,7 +2201,7 @@ static void WIT_ModeAndValueInit()
bNeedUpdateConfigArea
=
true
;
}
set_wiz_NetInfo
(
&
g_xWITConfig
.
g_xConfigIp
);
#endif
#if USE_WIT_PLATFORM > 0 && CONFIG_ESP32_WIFI > 0
// 把之前辉度的机器更新成杰牌后前缀显示JCI
if
(
strstr
(
g_xWITConfig
.
cAPName
,
"Witium-"
)
!=
NULL
)
...
...
@@ -2190,9 +2218,8 @@ static void WIT_ModeAndValueInit()
bNeedUpdateConfigArea
=
true
;
}
#endif
#if CONFIG_W5100S_SPI_ETHERNET > 0
ETHERNET_Init
(
&
g_bModuleError
,
NULL
);
#endif
// 获取当前学习数量
g_xWITConfig
.
usCurrentLearningCount
=
WIT_GetFeatureMinLearnCount
();
WIT_PreTaskInit
();
...
...
@@ -2601,7 +2628,14 @@ static void WIT_MQTTConnectHandler(unsigned long ulMQTTID, bool bStatus)
}
bool
WIT_SendIOTData
(
void
)
float
FloatRetain
(
float
value
)
{
char
buf
[
32
]
=
{
0
};
sprintf
(
buf
,
"%.2f"
,
value
);
return
atof
(
buf
);;
}
bool
WIT_SendIOTData
(
unsigned
int
group
)
{
cJSON
*
pxRoot
=
NULL
;
cJSON
*
pxObj
=
NULL
;
...
...
@@ -2613,20 +2647,39 @@ bool WIT_SendIOTData(void)
pucSendBuffer
=
MQTT_SendBufferPointer
(
g_xWITMQTT
.
lHandle
);
ulBufferSize
=
MQTT_GetRestSendBufferSize
(
g_xWITMQTT
.
lHandle
);
pxRoot
=
cJSON_CreateArray
();
pxObj
=
cJSON_CreateObject
()
;
char
addr
[
8
]
;
char
cAddr
[
4
]
=
{
0
}
;
char
cOpDataName
[
ALIAS_MAX_NAME_LENGTH
]
=
{
0
}
;
unsigned
long
now_ts
=
RTC_InternalGetTimeStamp
();
int
alarmNum
=
0
;
char
cIDSN
[
16
]
=
{
0
};
char
cNameAvr
[
32
]
=
{
0
};
char
cNameMax
[
32
]
=
{
0
};
char
cNameAlm
[
32
]
=
{
0
};
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
pxObj
=
cJSON_CreateObject
();
if
(
pxObj
==
NULL
)
return
false
;
sprintf
(
cAddr
,
"%d"
,
group
+
1
);
cJSON_AddStringToObject
(
pxObj
,
"addr"
,
cAddr
);
cJSON_AddNumberToObject
(
pxObj
,
"ts"
,
now_ts
);
for
(
unsigned
short
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
==
true
&&
g_xWITConfig
.
my_IOTDev
[
i
].
bIsTimeout
==
false
)
if
(
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
bIsUsed
&&
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
bIsPlugIn
)
{
sprintf
(
addr
,
"%d"
,
i
+
1
);
cJSON_AddStringToObject
(
pxObj
,
"addr"
,
addr
);
cJSON_AddNumberToObject
(
pxObj
,
"iot1"
,
g_xWITConfig
.
my_IOTDev
[
i
].
rope_value
/
10
.
0
);
cJSON_AddNumberToObject
(
pxObj
,
"ts"
,
now_ts
);
strncpy
(
cOpDataName
,
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
alias
,
ALIAS_MAX_NAME_LENGTH
);
cJSON_AddNumberToObject
(
pxObj
,
cOpDataName
,
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
rope_value
/
10
.
0
);
snprintf
(
cNameAvr
,
sizeof
(
cNameAvr
),
"avrPwR%d"
,
i
+
1
);
snprintf
(
cNameMax
,
sizeof
(
cNameMax
),
"maxPwR%d"
,
i
+
1
);
snprintf
(
cNameAlm
,
sizeof
(
cNameAlm
),
"almwR%d"
,
i
+
1
);
cJSON_AddNumberToObject
(
pxObj
,
cNameAvr
,
calculateAverage
(
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
fifo_data
,
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
bIsFull
)
/
10
.
0
);
cJSON_AddNumberToObject
(
pxObj
,
cNameMax
,
maxDataWireRope
(
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
fifo_data
,
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
bIsFull
)
/
10
.
0
);
cJSON_AddNumberToObject
(
pxObj
,
cNameAlm
,
getAlarm
(
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
alarmRecord
,
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
bIsFull
));
}
}
cJSON_AddItemToArray
(
pxRoot
,
pxObj
);
bPackageStatus
=
cJSON_PrintPreallocated
(
pxRoot
,
(
char
*
)
pucSendBuffer
,
ulBufferSize
,
false
);
...
...
@@ -2643,8 +2696,9 @@ bool WIT_SendIOTData(void)
}
return
bStatus
;
}
bool
WIT_SendIOTError
(
void
)
#if 0
#else
bool
WIT_MissingErrorSend
(
unsigned
int
group
)
{
cJSON
*
pxRoot
=
NULL
;
cJSON
*
pxObj
=
NULL
;
...
...
@@ -2656,20 +2710,24 @@ bool WIT_SendIOTError(void)
pucSendBuffer
=
MQTT_SendBufferPointer
(
g_xWITMQTT
.
lHandle
);
ulBufferSize
=
MQTT_GetRestSendBufferSize
(
g_xWITMQTT
.
lHandle
);
pxRoot
=
cJSON_CreateArray
();
char
a
ddr
[
8
];
char
cA
ddr
[
8
];
unsigned
long
now_ts
=
RTC_InternalGetTimeStamp
();
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
pxObj
=
cJSON_CreateObject
();
if
(
pxObj
==
NULL
)
return
bStatus
;
sprintf
(
cAddr
,
"%d"
,
group
+
1
);
cJSON_AddStringToObject
(
pxObj
,
"addr"
,
cAddr
);
for
(
unsigned
short
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
==
true
&&
g_xWITConfig
.
my_IOTDev
[
i
].
bIsTimeout
==
true
)
if
(
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
bIsUsed
&&
(
FALSE
==
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
bIsPlugIn
)
)
{
pxObj
=
cJSON_CreateObject
();
sprintf
(
addr
,
"%d"
,
i
);
cJSON_AddStringToObject
(
pxObj
,
"addr"
,
addr
);
cJSON_AddNumberToObject
(
pxObj
,
"ts"
,
now_ts
);
cJSON_AddItemToArray
(
pxRoot
,
pxObj
);
cJSON_AddStringToObject
(
pxObj
,
"dev"
,
g_xWITConfig
.
g_wireRopeGroup
[
group
].
wireRopeDevs
[
i
].
alias
);
}
}
cJSON_AddNumberToObject
(
pxObj
,
"ts"
,
now_ts
);
cJSON_AddItemToArray
(
pxRoot
,
pxObj
);
bPackageStatus
=
cJSON_PrintPreallocated
(
pxRoot
,
(
char
*
)
pucSendBuffer
,
ulBufferSize
,
false
);
if
(
pxRoot
!=
NULL
)
...
...
@@ -2686,11 +2744,16 @@ bool WIT_SendIOTError(void)
return
bStatus
;
}
#endif
bool
WIT_SendGatewayFeature
(
void
)
{
cJSON
*
pxRoot
=
NULL
;
cJSON
*
pxObj
=
NULL
;
// cJSON *pxSenArr = NULL;
// cJSON *pxDevArr = NULL;
// cJSON *pxSenObj[WIREROPE_GROUP_MAX_NUM][EACH_GROUP_MAX_NUM];
unsigned
char
*
pucSendBuffer
=
NULL
;
unsigned
long
ulBufferSize
=
0
;
cJSON_bool
bPackageStatus
=
false
;
...
...
@@ -2706,7 +2769,8 @@ bool WIT_SendGatewayFeature(void)
cJSON_AddStringToObject
(
pxObj
,
"addr"
,
"0"
);
cJSON_AddNumberToObject
(
pxObj
,
"ts"
,
now_ts
);
cJSON_AddNumberToObject
(
pxObj
,
"period"
,
g_xWITConfig
.
ulPeriod
);
cJSON_AddNumberToObject
(
pxObj
,
"dPeriod"
,
g_xWITConfig
.
ulDataPeriod
);
cJSON_AddNumberToObject
(
pxObj
,
"fPeriod"
,
g_xWITConfig
.
ulFeaturePeriod
);
cJSON_AddNumberToObject
(
pxObj
,
"exist"
,
online_num
);
cJSON_AddNumberToObject
(
pxObj
,
"workTime"
,
worktime
);
cJSON_AddItemToArray
(
pxRoot
,
pxObj
);
...
...
@@ -3439,9 +3503,9 @@ static void WIT_TimerHandler(TimerHandle_t xTimer)
g_bDLISend
=
true
;
g_bDLICalculate
=
true
;
}
else
if
(
xTimer
==
g_x
DataSend
Timer
)
else
if
(
xTimer
==
g_x
Feature
Timer
)
{
g_bDataSend_
TimerArr
=
true
;
g_bFeature
TimerArr
=
true
;
}
else
if
(
xTimer
==
g_xErrorSendTimer
)
{
...
...
@@ -3507,6 +3571,14 @@ static void WIT_TimerHandler(TimerHandle_t xTimer)
}
}
}
for
(
unsigned
short
i
=
0
;
i
<
WIREROPE_GROUP_MAX_NUM
;
i
++
)
{
if
(
xTimer
==
g_xDataSendTimer
[
i
])
{
g_xWITConfig
.
g_wireRopeGroup
[
i
].
DataSendFlag
=
true
;
}
}
}
/**
...
...
@@ -3626,17 +3698,24 @@ static void WIT_GatewayConfigureHandler(MessageData *pxData)
DJSON
xSSObj
;
DJSON
xCfgArray
;
DJSON
xCfgObj
;
DJSON
xDevArray
;
DJSON
xGroupArray
;
DJSON
xSensorArray
;
DJSON
xDevObj
;
DJSON
xSensorObj
;
DJSON
xItem
;
unsigned
long
ulSSArraySize
=
0
;
unsigned
char
ucAddr
=
0
;
char
cAddr
[
8
]
=
{
0
};
char
cDev
[
16
]
=
{
0
};
uint8_t
dev_num
=
0
;
char
cDevIDSN
[
16
]
=
{
0
};
char
cSensorAlias
[
ALIAS_MAX_NAME_LENGTH
]
=
{
0
};
uint8_t
group_id
=
0
;
uint8_t
group_num
=
0
;
uint8_t
sensor_num
=
0
;
bool
bStatus
=
true
;
bool
bNeedUpdateFTimer
=
false
;
bool
bNeedUpdateFeatureTimer
=
false
;
bool
bNeedUpdateDataTimer
=
false
;
bool
bNeedUpdateCfg
=
false
;
xRoot
.
pcItemPointer
=
pxData
->
message
->
payload
;
...
...
@@ -3681,117 +3760,180 @@ static void WIT_GatewayConfigureHandler(MessageData *pxData)
xCfgObj
=
DJSON_GetArrayItem
(
&
xCfgArray
,
0
);
strncpy
(
g_xGatewayResponse
.
cAddr
,
cAddr
,
4
);
ucAddr
=
atoi
(
cAddr
);
if
(
ucAddr
<=
IOTDEV_MAX_NUM
)
{
Parameter
*
pxParm
;
Threshold
*
pxThr
;
// 网关配置
if
(
ucAddr
==
0
)
{
//
数据与特征
发送周期
xItem
=
DJSON_GetObjectItem
(
&
xCfgObj
,
"
p
eriod"
);
//
Data
发送周期
xItem
=
DJSON_GetObjectItem
(
&
xCfgObj
,
"
dP
eriod"
);
if
(
xItem
.
eItemType
==
DJSON_Number
)
{
unsigned
long
ulSetPeriod
;
ulSetPeriod
=
DJSON_GetValueInt
(
&
xItem
)
*
1000
;
// MS -> S
g_xWITConfig
.
ulPeriod
=
ulSetPeriod
;
g_xWITConfig
.
ulFeaturePeriodCopy
=
ulSetPeriod
;
bNeedUpdateFTimer
=
true
;
ulSetPeriod
=
DJSON_GetValueInt
(
&
xItem
)
*
1000
;
g_xWITConfig
.
ulDataPeriod
=
ulSetPeriod
;
bNeedUpdateDataTimer
=
true
;
bNeedUpdateCfg
=
true
;
}
// IOT阈值设定
xItem
=
DJSON_GetObjectItem
(
&
xCfgObj
,
"
threshol
d"
);
// Feature 发送周期
xItem
=
DJSON_GetObjectItem
(
&
xCfgObj
,
"
fPerio
d"
);
if
(
xItem
.
eItemType
==
DJSON_Number
)
{
unsigned
long
ulSet
Threshol
d
;
unsigned
long
ulSet
Perio
d
;
ulSetThreshold
=
DJSON_GetValueDouble
(
&
xItem
)
*
10
;
// 4% 下发 40,0x00 0x28
if
(
ulSetThreshold
>
1000
||
ulSetThreshold
<
0
)
ulSetPeriod
=
DJSON_GetValueInt
(
&
xItem
)
*
1000
;
g_xWITConfig
.
ulFeaturePeriod
=
ulSetPeriod
;
bNeedUpdateFeatureTimer
=
true
;
bNeedUpdateCfg
=
true
;
}
}
else
{
printf
(
"Set Threshold Error.
\n
"
);
bStatus
=
false
;
goto
judge_status
;
}
printf
(
"Threshold %ld
\n
"
,
ulSetThreshold
);
if
(
IOTConfigFunction
())
// 解析设备[id --- sn,id], 绑定设备
xGroupArray
=
DJSON_GetObjectItem
(
&
xCfgObj
,
"dev"
);
if
(
xGroupArray
.
eItemType
==
DJSON_Array
)
{
bStatus
=
true
;
printf
(
"IOTConfigFunction true
\n
"
);
group_num
=
DJSON_GetArraySize
(
&
xGroupArray
);
// 计算设备数量,以设备划分组
printf
(
"Gateway has Group %d
\n
"
,
group_num
);
if
(
group_num
>
WIREROPE_GROUP_MAX_NUM
||
0
==
group_num
)
{
bStatus
=
false
;
goto
judge_status
;
}
}
else
{
printf
(
"xSensorArray is not DJSON_Array
\n
"
);
bStatus
=
false
;
goto
judge_status
;
}
// g_beingConfigIOT.ConfigFlag = true;
g_xWITConfig
.
my_IOTThreshold
=
ulSetThreshold
;
bNeedUpdateCfg
=
true
;
iot_Sensor_Clear
(
true
);
for
(
int
j
=
0
;
j
<
group_num
;
j
++
)
{
xDevObj
=
DJSON_GetArrayItem
(
&
xGroupArray
,
j
);
if
(
xDevObj
.
eItemType
==
DJSON_Object
)
{
xItem
=
DJSON_GetObjectItem
(
&
xDevObj
,
"gId"
);
if
(
xItem
.
eItemType
==
DJSON_Number
)
{
group_id
=
DJSON_GetValueInt
(
&
xItem
);
}
else
{
printf
(
"gId is not DJSON_Number
\n
"
);
bStatus
=
false
;
goto
judge_status
;
}
printf
(
"gId=%d
\n
"
,
group_id
);
if
(
group_id
>
EACH_GROUP_MAX_NUM
||
group_id
<=
0
)
{
bStatus
=
false
;
goto
judge_status
;
}
// 解析设备[id --- sn,id]
xDevArray
=
DJSON_GetObjectItem
(
&
xCfgObj
,
"dev"
);
dev_num
=
DJSON_GetArraySize
(
&
xDevArray
);
// 计算设备数量
// printf("dev has %d\n", dev_num);
if
(
dev_num
>
IOTDEV_MAX_NUM
)
xSensorArray
=
DJSON_GetObjectItem
(
&
xDevObj
,
"sensors"
);
if
(
xSensorArray
.
eItemType
==
DJSON_Array
)
{
sensor_num
=
DJSON_GetArraySize
(
&
xSensorArray
);
printf
(
"group[%d] sensor_num = %d
\n
"
,
group_id
,
sensor_num
);
if
(
sensor_num
>
EACH_GROUP_MAX_NUM
||
0
==
sensor_num
)
{
dev_num
=
IOTDEV_MAX_NUM
;
printf
(
"dev_num over than IOTDEV_MAX_NUM
\n
"
);
bStatus
=
false
;
goto
judge_status
;
}
if
(
xDevArray
.
eItemType
==
DJSON_Array
)
}
else
{
for
(
int
i
=
0
;
i
<
dev_num
;
i
++
)
printf
(
"xSensorArray is not DJSON_Array
\n
"
);
bStatus
=
false
;
goto
judge_status
;
}
for
(
int
i
=
0
;
i
<
sensor_num
;
i
++
)
{
x
DevObj
=
DJSON_GetArrayItem
(
&
xDev
Array
,
i
);
if
(
xDev
Obj
.
eItemType
==
DJSON_Object
)
x
SensorObj
=
DJSON_GetArrayItem
(
&
xSensor
Array
,
i
);
if
(
xSensor
Obj
.
eItemType
==
DJSON_Object
)
{
xItem
=
DJSON_GetObjectItem
(
&
x
DevObj
,
"addr
"
);
xItem
=
DJSON_GetObjectItem
(
&
x
SensorObj
,
"id
"
);
if
(
xItem
.
eItemType
==
DJSON_String
)
{
DJSON_GetValueString
(
&
xItem
,
cAddr
,
sizeof
(
cAddr
));
g_xWITConfig
.
my_IOTDev
[
i
].
addr
=
atoi
(
cAddr
);
DJSON_GetValueString
(
&
xItem
,
cDevIDSN
,
sizeof
(
cDevIDSN
));
stringIdSnToShorts
(
cDevIDSN
,
&
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
id
,
&
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
sn
);
if
(
0
!=
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
id
||
0
!=
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
sn
)
{
printf
(
"ID: 0X%04X; SN: 0X%04X
\n
"
,
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
id
,
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
sn
);
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
addr
=
group_id
;
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
bIsUsed
=
true
;
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
bIsPlugIn
=
false
;
// 此处是否插入标志为false
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
rope_value
=
0
;
printf
(
"dev[%d] Configured
\n
"
,
i
);
}
else
{
printf
(
"Config ID/SN Fail
\n
"
);
bStatus
=
false
;
goto
judge_status
;
}
}
xItem
=
DJSON_GetObjectItem
(
&
x
DevObj
,
"id"
);
// 解析sn,id
xItem
=
DJSON_GetObjectItem
(
&
x
SensorObj
,
"alias"
);
if
(
xItem
.
eItemType
==
DJSON_String
)
{
DJSON_GetValueString
(
&
xItem
,
cDev
,
sizeof
(
cDev
));
stringIdSnToShorts
(
cDev
,
&
g_xWITConfig
.
my_IOTDev
[
i
].
id
,
&
g_xWITConfig
.
my_IOTDev
[
i
].
sn
);
if
(
0
==
g_xWITConfig
.
my_IOTDev
[
i
].
id
||
0
==
g_xWITConfig
.
my_IOTDev
[
i
].
sn
)
DJSON_GetValueString
(
&
xItem
,
cSensorAlias
,
ALIAS_MAX_NAME_LENGTH
);
snprintf
(
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
alias
,
sizeof
(
g_xWITConfig
.
g_wireRopeGroup
[
group_id
-
1
].
wireRopeDevs
[
i
].
alias
),
"%s"
,
cSensorAlias
);
}
}
else
{
printf
(
"Config id/sn Fail
\n
"
);
printf
(
"xSensorObj is not DJSON_String
\n
"
);
bStatus
=
false
;
goto
judge_status
;
}
printf
(
"ID: 0X%04X; SN: 0X%04X
\n
"
,
g_xWITConfig
.
my_IOTDev
[
i
].
id
,
g_xWITConfig
.
my_IOTDev
[
i
].
sn
);
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
=
true
;
g_xWITConfig
.
my_IOTDev
[
i
].
bIsTimeout
=
true
;
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
=
false
;
// 此处是否插入标志为false
g_xWITConfig
.
my_IOTDev
[
i
].
rope_value
=
0
;
printf
(
"dev[%d] Configured
\n
"
,
i
);
}
}
}
bNeedUpdateCfg
=
true
;
// 更新定时器
if
(
bNeedUpdateDataTimer
==
true
)
{
for
(
uint8_t
k
=
0
;
k
<
WIREROPE_GROUP_MAX_NUM
;
k
++
)
{
if
(
g_xDataSendTimer
[
k
]
!=
NULL
)
{
xTimerChangePeriod
(
g_xDataSendTimer
[
k
],
g_xWITConfig
.
ulDataPeriod
,
1000
);
}
else
{
bStatus
=
false
;
goto
judge_status
;
}
}
bNeedUpdateDataTimer
=
false
;
}
// 更新定时器
if
(
bNeedUpdateFTimer
==
true
)
if
(
bNeedUpdateFeatureTimer
==
true
)
{
xTimerChangePeriod
(
g_xDataSendTimer
,
g_xWITConfig
.
ulPeriod
,
1000
);
xTimerChangePeriod
(
xSensorDataFreshTimer
,
g_xWITConfig
.
ulPeriod
,
1000
);
printf
(
"xTimerChangePeriod g_xDataSendTimer %ld
\n
"
,
g_xWITConfig
.
ulPeriod
);
//g_xFeatureTimer
if
(
g_xFeatureTimer
!=
NULL
)
xTimerChangePeriod
(
g_xFeatureTimer
,
g_xWITConfig
.
ulFeaturePeriod
,
1000
);
bNeedUpdateFeatureTimer
=
false
;
}
// 更新数据 开始定时器
if
(
bNeedUpdateCfg
==
true
)
xTimerStart
(
g_xCfgUpTimer
,
1000
);
}
judge_status:
...
...
@@ -7309,6 +7451,7 @@ static unsigned char WIT_GetConfigureNumberCount(void)
static
void
WIT_PreTaskInit
(
void
)
{
int
i
;
char
cTimerName
[
64
]
=
{
0
};
// modbus init
// eMBInit(MB_Master, 0x1, WIT_MB_MASTER_PORT, WIT_MB_BAUDRATE, WIT_MB_PARITY);
// eMBEnable(WIT_MB_MASTER_PORT);
...
...
@@ -7326,10 +7469,25 @@ static void WIT_PreTaskInit(void)
g_xDLICalTimer
=
xTimerCreate
(
"DLI Timer"
,
WIT_DATA_LIST_RESTORE_TIME
,
pdTRUE
,
NULL
,
WIT_TimerHandler
);
if
(
g_xDLICalTimer
!=
NULL
)
xTimerStart
(
g_xDLICalTimer
,
1000
);
g_xDataSendTimer
=
xTimerCreate
(
"IOT DataSend Timer"
,
10000
,
pdTRUE
,
NULL
,
WIT_TimerHandler
);
if
(
g_xDataSendTimer
!=
NULL
)
xTimerStart
(
g_xDataSendTimer
,
5000
);
g_xErrorSendTimer
=
xTimerCreate
(
"IOT ErrorSend Timer"
,
10000
,
pdTRUE
,
NULL
,
WIT_TimerHandler
);
for
(
unsigned
short
i
=
0
;
i
<
WIREROPE_GROUP_MAX_NUM
;
i
++
)
{
snprintf
(
cTimerName
,
sizeof
(
cTimerName
),
"IOT[%d] DataSend Timer"
,
i
);
g_xDataSendTimer
[
i
]
=
xTimerCreate
(
cTimerName
,
g_xWITConfig
.
ulDataPeriod
,
pdTRUE
,
NULL
,
WIT_TimerHandler
);
if
(
g_xDataSendTimer
[
i
]
!=
NULL
)
{
xTimerStart
(
g_xDataSendTimer
[
i
],
5000
);
g_xWITConfig
.
g_wireRopeGroup
[
i
].
pxDataSendTimer
=
g_xDataSendTimer
[
i
];
}
}
g_xFeatureTimer
=
xTimerCreate
(
"FeatureUploadTimer"
,
g_xWITConfig
.
ulFeaturePeriod
,
pdTRUE
,
NULL
,
WIT_TimerHandler
);
if
(
g_xFeatureTimer
!=
NULL
)
xTimerStart
(
g_xFeatureTimer
,
1000
);
g_xErrorSendTimer
=
xTimerCreate
(
"IOT ErrorSend Timer"
,
g_xWITConfig
.
ulFeaturePeriod
,
pdTRUE
,
NULL
,
WIT_TimerHandler
);
xSensorTimeoutTimer
=
xTimerCreate
(
"xSTOTimer"
,
60000
,
pdTRUE
,
NULL
,
vSensorHeartBeatTimerCallback
);
if
(
g_xErrorSendTimer
!=
NULL
)
xTimerStart
(
g_xErrorSendTimer
,
5000
);
...
...
@@ -7345,9 +7503,9 @@ static void WIT_PreTaskInit(void)
g_xCheckInTimer
=
xTimerCreate
(
"CI Timer"
,
WIT_DATA_UPDATE_CHECKIN_TIME
,
pdFALSE
,
NULL
,
WIT_TimerHandler
);
if
(
g_xGatewayFeatureTimer
!=
NULL
)
xTimerStart
(
g_xGatewayFeatureTimer
,
1000
);
g_xSensorFeatureTimer
=
xTimerCreate
(
"SF Timer"
,
g_xWITConfig
.
ulPeriod
,
pdFALSE
,
NULL
,
WIT_TimerHandler
);
g_xSensorFeatureTimer
=
xTimerCreate
(
"SF Timer"
,
g_xWITConfig
.
ul
Feature
Period
,
pdFALSE
,
NULL
,
WIT_TimerHandler
);
g_xWaveTimer
=
xTimerCreate
(
"W Timer"
,
g_xWITConfig
.
ulWavePeriod
,
pdFALSE
,
NULL
,
WIT_TimerHandler
);
g_xAlarmTimer
=
xTimerCreate
(
"A Timer"
,
g_xWITConfig
.
ulPeriod
,
pdFALSE
,
NULL
,
WIT_TimerHandler
);
g_xAlarmTimer
=
xTimerCreate
(
"A Timer"
,
g_xWITConfig
.
ul
Feature
Period
,
pdFALSE
,
NULL
,
WIT_TimerHandler
);
// Create signal
for
(
i
=
0
;
i
<
WIT_MODBUS_PORT_COUNT
;
i
++
)
...
...
@@ -9129,7 +9287,7 @@ char *sent_mqtt_ip(void)
return
(
char
*
)
&
g_xWITConfig
.
cTargetIP
;
}
#if CONFIG_W5100S_SPI_ETHERNET > 0
//
#if CONFIG_W5100S_SPI_ETHERNET > 0
unsigned
long
get_status_dhcp
(
void
)
{
return
g_xWITConfig
.
g_xConfigIp
.
dhcp
;
...
...
@@ -9140,149 +9298,185 @@ wiz_NetInfo *get_gw_eth_info(void)
return
&
g_xWITConfig
.
g_xConfigIp
;
}
#endif
//
#endif
void
iot_Sensor_
Init
(
void
)
void
iot_Sensor_
Clear
(
bool
all
)
{
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
for
(
int
j
=
0
;
j
<
WIREROPE_GROUP_MAX_NUM
;
j
++
)
{
// g_xWITConfig.my_IOTDev[i].addr = 0;
// g_xWITConfig.my_IOTDev[i].id = 0;
// g_xWITConfig.my_IOTDev[i].sn = 0;
// g_xWITConfig.my_IOTDev[i].bIsUsed = false;
g_xWITConfig
.
my_IOTDev
[
i
].
bIsTimeout
=
true
;
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
=
false
;
g_xWITConfig
.
my_IOTDev
[
i
].
rope_value
=
0
;
g_xWITConfig
.
my_IOTDev
[
i
].
beingWaiting
=
false
;
g_xWITConfig
.
my_IOTDev
[
i
].
status
=
0
;
}
}
g_xWITConfig
.
g_wireRopeGroup
[
j
].
DataSendFlag
=
false
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
pxDataSendTimer
=
NULL
;
void
iot_Sensor_Print
(
void
)
{
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
printf
(
"my_IOTDev[%d].addr = %d
\n
"
,
i
,
g_xWITConfig
.
my_IOTDev
[
i
].
addr
);
printf
(
"my_IOTDev[%d].id = %d
\n
"
,
i
,
g_xWITConfig
.
my_IOTDev
[
i
].
id
);
printf
(
"my_IOTDev[%d].sn = %d
\n
"
,
i
,
g_xWITConfig
.
my_IOTDev
[
i
].
sn
);
printf
(
"my_IOTDev[%d].bIsTimeout = %d
\n
"
,
i
,
g_xWITConfig
.
my_IOTDev
[
i
].
bIsTimeout
);
printf
(
"my_IOTDev[%d].bIsUsed = %d
\n
"
,
i
,
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
);
printf
(
"my_IOTDev[%d].bIsPlugIn = %d
\n
"
,
i
,
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
);
printf
(
"my_IOTDev[%d].rope_value = %d
\n
"
,
i
,
g_xWITConfig
.
my_IOTDev
[
i
].
rope_value
);
printf
(
"my_IOTDev[%d].beingWaiting = %d
\n
"
,
i
,
g_xWITConfig
.
my_IOTDev
[
i
].
beingWaiting
);
printf
(
"my_IOTDev[%d].status = %d
\n
"
,
i
,
g_xWITConfig
.
my_IOTDev
[
i
].
status
);
if
(
all
)
{
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
addr
=
0
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
id
=
0
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
sn
=
0
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
alarmRecord
=
0
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsUsed
=
false
;
memset
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
alias
,
0
,
ALIAS_MAX_NAME_LENGTH
);
}
}
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
=
false
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingDataWaiting
=
false
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingStopWaiting
=
false
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingConfigWaiting
=
false
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
g_ts
=
0
;
// 修改:增加二值信号量,回复响应状态
void
vSensorDataFreshTimerCallback
()
{
xSemaphoreDataResp
=
xSemaphoreCreateBinary
();
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
{
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
&&
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
)
{
Get_SensorIOT_Data
(
g_xWITConfig
.
my_IOTDev
[
i
].
id
,
g_xWITConfig
.
my_IOTDev
[
i
].
sn
);
if
(
xSemaphoreDataResp
!=
NULL
&&
xSemaphoreTake
(
xSemaphoreDataResp
,
pdMS_TO_TICKS
(
500
))
==
pdTRUE
)
{
// printf("data resp success\n");
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
rope_value
=
0
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
level
=
LEVEL_UNKNOWN
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
IDEL
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
emergency
=
false
;
queueInitFifo
(
&
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
fifo_tail
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
fifo_data
,
&
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsFull
);
}
else
{
printf
(
"data resp fail, maybe timeout or be below the threshold
\n
"
);
}
}
vTaskDelay
(
pdMS_TO_TICKS
(
10
));
}
}
bool
IOTConfigFunction
()
void
iot_Sensor_Print
(
void
)
{
bool
status
=
true
;
// 创建二值信号量
xSemaphoreWaitResp
=
xSemaphoreCreateBinary
();
// 遍历每个传感器
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
for
(
int
j
=
0
;
j
<
WIREROPE_GROUP_MAX_NUM
;
j
++
)
{
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
&&
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
)
//配置阈值条件:传感器是否使用,传感器是否插上
printf
(
"-------------------G[%d]-----------------
\n
"
,
j
);
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
g_xWITConfig
.
my_IOTDev
[
i
].
beingWaiting
=
true
;
Set_Threshold
(
g_xWITConfig
.
my_IOTDev
[
i
].
id
,
g_xWITConfig
.
my_IOTDev
[
i
].
sn
,
g_xWITConfig
.
my_IOTThreshold
);
if
(
xSemaphoreWaitResp
!=
NULL
&&
xSemaphoreTake
(
xSemaphoreWaitResp
,
pdMS_TO_TICKS
(
500
))
==
pdTRUE
)
{
//printf("config success\n");
g_xWITConfig
.
my_IOTDev
[
i
].
beingWaiting
=
false
;
}
else
{
status
=
false
;
printf
(
"config threshold fail
\n
"
);
g_xWITConfig
.
my_IOTDev
[
i
].
beingWaiting
=
false
;
}
//定时器等待配置之后得到传感器响应
printf
(
"g_wireRopeGroup[%d].wireRopeDevs[%d].addr = %d
\n
"
,
j
,
i
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
addr
);
printf
(
"g_wireRopeGroup[%d].wireRopeDevs[%d].id = %d
\n
"
,
j
,
i
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
id
);
printf
(
"g_wireRopeGroup[%d].wireRopeDevs[%d].sn = %d
\n
"
,
j
,
i
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
sn
);
printf
(
"g_wireRopeGroup[%d].wireRopeDevs[%d].bIsUsed = %d
\n
"
,
j
,
i
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsUsed
);
printf
(
"g_wireRopeGroup[%d].wireRopeDevs[%d].bIsPlugIn = %d
\n
"
,
j
,
i
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
);
printf
(
"g_wireRopeGroup[%d].wireRopeDevs[%d].rope_value = %d
\n
"
,
j
,
i
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
rope_value
);
printf
(
"g_wireRopeGroup[%d].wireRopeDevs[%d].status_machine= %d
\n
"
,
j
,
i
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
);
}
vTaskDelay
(
pdMS_TO_TICKS
(
10
));
}
}
// 删除二值信号量
vSemaphoreDelete
(
xSemaphoreWaitResp
);
xSemaphoreWaitResp
=
NULL
;
return
status
;
}
// bool IOTConfigFunction()
// {
// bool status = true;
// // 创建二值信号量
// xSemaphoreWaitResp = xSemaphoreCreateBinary();
// // 遍历每个传感器
// for(int j = 0; j < WIREROPE_GROUP_MAX_NUM; j++)
// {
// for (int i = 0; i < EACH_GROUP_MAX_NUM; i++)
// {
// if (g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].bIsUsed && g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].bIsPlugIn) //配置阈值条件:传感器是否使用,传感器是否插上
// {
// g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].beingDataWaiting = true;
// // Set_Threshold(g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].id, g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].sn, g_xWITConfig.my_IOTThreshold);
// if (xSemaphoreWaitResp != NULL && xSemaphoreTake(xSemaphoreWaitResp, pdMS_TO_TICKS(500)) == pdTRUE) {
// //printf("config success\n");
// g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].beingDataWaiting = false;
// }
// else{
// status = false;
// printf("config threshold fail\n");
// g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].beingDataWaiting = false;
// }
// //定时器等待配置之后得到传感器响应
// }
// vTaskDelay(pdMS_TO_TICKS(10));
// }
// }
// // 删除二值信号量
// vSemaphoreDelete(xSemaphoreWaitResp);
// xSemaphoreWaitResp = NULL;
// return status;
// }
// 定时器回调函数, 用于检查心跳包是否超时
void
vSensorTimerCallback
()
void
vSensor
HeartBeat
TimerCallback
()
{
unsigned
long
last_ts
=
0
;
unsigned
long
now_ts
=
0
;
unsigned
long
diff_ts
=
0
;
// printf("TOT Enter\n");
// 遍历每个传感器
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
for
(
int
j
=
0
;
j
<
WIREROPE_GROUP_MAX_NUM
;
j
++
)
{
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
&&
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
)
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsUsed
&&
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
)
{
last_ts
=
g_ts
[
i
]
;
last_ts
=
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
g_ts
;
now_ts
=
xTaskGetTickCount
();
diff_ts
=
now_ts
-
last_ts
;
if
(
diff_ts
<
0
)
{
printf
(
"ticks[now:%ld][old:%ld]
\n
"
,
now_ts
,
last_ts
);
return
;
continue
;
}
// printf("my_IOTDev[%d] diff_ts[%ld]\n", i, diff_ts);
if
(
diff_ts
>
pdMS_TO_TICKS
(
70000
*
1
))
// 70s
{
// printf("Sensor[%d] is disconnected\n", i);
g_xWITConfig
.
my_IOTDev
[
i
].
bIsTimeout
=
true
;
// next send error to mqtt broker
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
)
// printf("g_wireRopeGroup[j].wireRopeDevs[%d] diff_ts[%ld]\n", i, diff_ts);
if
(
diff_ts
>
pdMS_TO_TICKS
(
65000
*
1
))
// 65 sec 检查是否超时
{
g_bErrorUpdateFlag
=
true
;
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
=
false
;
}
printf
(
"Sensor[%d] is disconnected
\n
"
,
i
)
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
=
FALSE
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
MISSING
;
}
else
{
// printf("Sensor[%d] is online\n", i);
printf
(
"Sensor[%d] is online
\n
"
,
i
);
}
}
}
vTaskDelay
(
pdMS_TO_TICKS
(
1
0
));
vTaskDelay
(
pdMS_TO_TICKS
(
1
));
}
}
LEVEL
get_level
(
unsigned
short
data
)
{
// data ---> [0,1000] ~ [0%,100%]
if
(
data
>=
0
&&
data
<=
70
)
{
return
LEVEL_0
;
}
else
if
(
data
>
70
&&
data
<=
120
)
{
return
LEVEL_1
;
}
else
if
(
data
>
120
&&
data
<=
170
)
{
return
LEVEL_2
;
}
else
if
(
data
>
170
)
{
return
LEVEL_3
;
}
else
{
return
LEVEL_UNKNOWN
;
}
}
void
Message_Deal_Function
(
void
)
{
unsigned
char
sensor_cmd
=
0
;
unsigned
char
sensor_work_status
=
99
;
unsigned
char
*
sensor_work_param
=
NULL
;
LEVEL
now_level
=
LEVEL_UNKNOWN
;
sIOT01B_Format
g_data_frame
;
Tcp_Message
tcp_message_deal
=
{
0
};
bool
ret
=
0
;
unsigned
long
_ts
=
0
;
xSensorTimer
=
xTimerCreate
(
"SensorTimer"
,
pdMS_TO_TICKS
(
1000
),
pdTRUE
,
NULL
,
vSensorTimerCallback
);
xSensorDataFreshTimer
=
xTimerCreate
(
"SensorDataFreshtimer"
,
pdMS_TO_TICKS
(
60000
*
3
),
pdTRUE
,
NULL
,
vSensorDataFreshTimerCallback
);
vTaskDelay
(
pdMS_TO_TICKS
(
1000
));
// 等待xSensorTimeoutTimer创建完成
// 确保xSensorTimeoutTimer定时器已经创建
while
(
xSensorTimeoutTimer
==
NULL
)
{
xSensorTimeoutTimer
=
xTimerCreate
(
"xSTOTimer"
,
10000
,
pdTRUE
,
NULL
,
vSensorHeartBeatTimerCallback
);
}
xTimerStart
(
xSensorTimeoutTimer
,
0
);
printf
(
"Message_Deal_Function start.
\n
"
);
xTimerStart
(
xSensorTimer
,
0
);
xTimerStart
(
xSensorDataFreshTimer
,
0
);
while
(
1
)
{
...
...
@@ -9294,8 +9488,9 @@ void Message_Deal_Function(void)
ret
=
data_frame_parsing
(
tcp_message_deal
.
message
,
tcp_message_deal
.
rec_len
,
&
g_data_frame
);
if
(
ret
==
true
)
{
g_slaver_status
=
g_data_frame
.
ucCmd
;
printf
(
"CMD = [0X%02X]
\n
"
,
g_slaver_status
);
sensor_cmd
=
g_data_frame
.
ucCmd
;
if
(
sensor_cmd
==
WIREROPE_CMD_WAIT_AWAKE
)
printf
(
"CMD = [0X%02X]
\n
"
,
sensor_cmd
);
}
else
{
...
...
@@ -9303,122 +9498,409 @@ void Message_Deal_Function(void)
continue
;
}
switch
(
g_slaver_status
)
switch
(
sensor_cmd
)
{
case
SLAVE_POWER_ON_CONTACK
:
case
WIREROPE_CMD_WAIT_AWAKE
:
// 上电检测信号
{
_ts
=
xTaskGetTickCount
();
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
for
(
int
j
=
0
;
j
<
WIREROPE_GROUP_MAX_NUM
;
j
++
)
{
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
&&
(
g_data_frame
.
ulDevID
==
g_xWITConfig
.
my_IOTDev
[
i
].
id
)
&&
(
g_data_frame
.
ulDevSN
==
g_xWITConfig
.
my_IOTDev
[
i
].
sn
))
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsUsed
&&
(
g_data_frame
.
ulDevID
==
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
id
)
&&
(
g_data_frame
.
ulDevSN
==
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
sn
))
{
ACK_0AH
(
g_data_frame
.
ulDevID
,
g_data_frame
.
ulDevSN
);
Start_Detect
(
g_data_frame
.
ulDevID
,
g_data_frame
.
ulDevSN
);
//printf("IOT[%d] POWER ON\n", i);
g_ts
[
i
]
=
_ts
;
// update time
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
=
true
;
// 第一次检测到设备上电,意味着设备已经接入网关
g_xWITConfig
.
my_IOTDev
[
i
].
bIsTimeout
=
false
;
printf
(
"G[%d]wireRope[%d] POWER ON
\n
"
,
j
,
i
);
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
g_ts
=
_ts
;
// 更新时间
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
=
TRUE
;
// 已经配置的传感器中,且已经超时的,这里意味着传感器断开之后,又重新连接网关
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
POWER_ON
;
}
}
}
break
;
}
case
SLAVE_ACK
:
case
WIREROPE_CMD_ACK_OR_NACK
:
// 传感器应答
{
_ts
=
xTaskGetTickCount
();
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
for
(
int
j
=
0
;
j
<
WIREROPE_GROUP_MAX_NUM
;
j
++
)
{
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
&&
g_data_frame
.
ulDevID
==
g_xWITConfig
.
my_IOTDev
[
i
].
id
&&
g_data_frame
.
ulDevSN
==
g_xWITConfig
.
my_IOTDev
[
i
].
sn
)
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
g_ts
[
i
]
=
_ts
;
// update time
printf
(
"SLAVE_ACK: %d
\n
"
,
*
g_data_frame
.
data
);
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
beingWaiting
&&
*
g_data_frame
.
data
==
1
)
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsUsed
&&
g_data_frame
.
ulDevID
==
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
id
&&
g_data_frame
.
ulDevSN
==
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
sn
)
{
if
(
xSemaphoreWaitResp
!=
NULL
)
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
g_ts
=
_ts
;
// update time
// printf("WIREROPE_CMD_ACK_OR_NACK Data = %d\n", *g_data_frame.data);
// if(g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].beingDataWaiting) //传感器回答响应
// {
// if(xSemaphoreDataResp != NULL)
// {
// if(*g_data_frame.data == 1)
// xSemaphoreGive(xSemaphoreDataResp);
// }
// g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].beingDataWaiting = false;
// }
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingStopWaiting
)
{
xSemaphoreGive
(
xSemaphoreWaitResp
);
Stop_Detect
(
g_data_frame
.
ulDevID
,
g_data_frame
.
ulDevSN
);
vTaskDelay
(
10
);
ACK_0AH
(
g_data_frame
.
ulDevID
,
g_data_frame
.
ulDevSN
);
Start_Detect
(
g_data_frame
.
ulDevID
,
g_data_frame
.
ulDevSN
);
// printf("Give Response\n");
if
(
xSemaphoreStopResp
!=
NULL
)
{
if
(
*
g_data_frame
.
data
==
1
)
xSemaphoreGive
(
xSemaphoreStopResp
);
}
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingStopWaiting
=
false
;
}
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingConfigWaiting
)
{
if
(
xSemaphoreConfigResp
!=
NULL
)
{
if
(
*
g_data_frame
.
data
==
1
)
xSemaphoreGive
(
xSemaphoreConfigResp
);
}
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingConfigWaiting
=
false
;
}
}
}
}
break
;
}
case
SLAVE
_HEARTBEAT
:
case
WIREROPE_CMD
_HEARTBEAT
:
{
_ts
=
xTaskGetTickCount
();
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
for
(
int
j
=
0
;
j
<
WIREROPE_GROUP_MAX_NUM
;
j
++
)
{
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
)
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
g_ts
[
i
]
=
_ts
;
// update time
printf
(
"HeartBeat... g_ts[%d] = %ld
\n
"
,
i
,
g_ts
[
i
]);
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsTimeout
==
true
||
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
==
false
)
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsUsed
)
{
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
=
true
;
// 已经配置的传感器中,且已经超时的,这里意味着传感器断开之后,又重新连接网关
g_xWITConfig
.
my_IOTDev
[
i
].
bIsTimeout
=
false
;
printf
(
"dev[%d] online again now.....
\n
"
,
i
);
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
g_ts
=
_ts
;
// update time
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
==
FALSE
)
{
printf
(
"heartbeat G[%d]S[%d]:Online
\n
"
,
j
,
i
);
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
=
true
;
// 已经配置的传感器中,且已经超时的,这里意味着传感器断开之后,又重新连接网关
}
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
DETECTING
;
}
}
}
break
;
}
case
SLAVE_LINE_DETECT_DATA
:
case
WIREROPE_CMD_DATA_PERCENT
:
{
_ts
=
xTaskGetTickCount
();
// save line
unsigned
short
data
=
0
;
IOT01B_Get_Collect_Data
(
&
g_data_frame
,
&
data
);
//printf("Get Data: %f%%\n", data / 10.0);
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
for
(
int
j
=
0
;
j
<
WIREROPE_GROUP_MAX_NUM
;
j
++
)
{
//printf("g_xWITConfig.my_IOTDev[%d].bIsUsed = %d\n", i, g_xWITConfig.my_IOTDev[i].bIsUsed);
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
&&
g_data_frame
.
ulDevID
==
g_xWITConfig
.
my_IOTDev
[
i
].
id
&&
g_data_frame
.
ulDevSN
==
g_xWITConfig
.
my_IOTDev
[
i
].
sn
)
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
// printf("g_xWITConfig.my_IOTDev[%d].bIsUsed = %d\n", i, g_xWITConfig.my_IOTDev[i].bIsUsed);
g_ts
[
i
]
=
_ts
;
// update time
g_xWITConfig
.
my_IOTDev
[
i
].
rope_value
=
data
;
// printf("g_xWITConfig.my_IOTDev[%d].rope_value = %d\n", i, g_xWITConfig.my_IOTDev[i].rope_value);
if
(
xSemaphoreDataResp
!=
NULL
)
if
((
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsUsed
)
&&
(
g_data_frame
.
ulDevID
==
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
id
)
&&
(
g_data_frame
.
ulDevSN
==
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
sn
))
{
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
g_ts
=
_ts
;
// update time
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
rope_value
=
data
;
// update data
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingDataWaiting
)
// 有等待的请求
{
if
(
xSemaphoreDataResp
!=
NULL
)
{
now_level
=
get_level
(
data
);
// printf("data = %d%%\n", data);
enqueueDataFifo
(
&
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
fifo_tail
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
fifo_data
,
data
,
&
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsFull
);
if
(
now_level
>
LEVEL_0
)
{
setAlarm
(
&
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
alarmRecord
);
}
// 判断Level变化
// printf("-------\n");
// printf("data:%d\n",data);
// printf("now: %d\n", now_level);
// printf("old: %d\n", g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].level);
if
((
now_level
>
LEVEL_0
)
&&
(
now_level
!=
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
level
)
&&
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
level
!=
LEVEL_UNKNOWN
))
{
printf
(
"G[%d]S[%d] Level变化, 紧急上发
\n
"
,
j
,
i
);
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
emergency
=
true
;
// g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].status_machine = PUSH;
// printf("G[%d]S[%d] :: %d\n",j, i, g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].status_machine);
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
pxDataSendTimer
!=
NULL
)
xTimerChangePeriod
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
pxDataSendTimer
,
g_xWITConfig
.
ulDataPeriod
,
1000
);
}
xSemaphoreGive
(
xSemaphoreDataResp
);
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingDataWaiting
=
false
;
// 更新Level
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
level
=
now_level
;
}
else
{
printf
(
"xNULLx
\n
"
);
}
}
else
// 已知传感器处于发送数据状态,如果此时没有bewaiting标志位,应停止其发送数据,将其状态机置为DETECTING,下一次将继续采集,同时重置物理状态(已插入),
{
if
(
FALSE
==
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
)
{
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
=
TRUE
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
DETECTING
;
Stop_Detect
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
id
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
sn
);
printf
(
"dateStream G[%d]S[%d]:Online
\n
"
,
j
,
i
);
}
}
// printf("g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[%d].rope_value = %d\n", i, g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].rope_value);
// g_DataUpdateFlag = true; // MQTT Upload Data
// Stop_Detect(g_data_frame.ulDevID, g_data_frame.ulDevSN);
}
g_DataUpdateFlag
=
true
;
// MQTT Upload Data
Stop_Detect
(
g_data_frame
.
ulDevID
,
g_data_frame
.
ulDevSN
);
}
}
break
;
}
case
WIREROPE_CMD_WORK_STATUS_MESSAGE
:
sensor_work_status
=
*
g_data_frame
.
data
;
if
(
sensor_work_status
<
0
||
sensor_work_status
>
3
)
{
printf
(
"sensor_work status exception"
);
}
else
if
(
sensor_work_status
==
NO_WORKING
||
sensor_work_status
==
WORKING
)
{
if
(
xSemaphoreWaitResp
!=
NULL
)
{
xSemaphoreGive
(
xSemaphoreWaitResp
);
printf
(
"WIREROPE_CMD_WORK_STATUS_MESSAGE Give xSemaphoreWaitResp
\n
"
);
}
else
{
printf
(
"WIREROPE_CMD_WORK_STATUS_MESSAGE xSemaphoreWaitResp NULL
\n
"
);
}
}
break
;
case
WIREROPE_CMD_WORK_PARAM
:
sensor_work_param
=
*
g_data_frame
.
data
;
printf
(
"g_data_frame uclen: %d
\n
"
,
g_data_frame
.
uclen
);
for
(
unsigned
short
i
=
0
;
i
<
g_data_frame
.
uclen
;
i
++
)
{
printf
(
"data[%d]= 0x%x
\n
"
,
i
,
*
(
g_data_frame
.
data
+
i
));
}
break
;
default:
break
;
}
//Set_Threshold(g_data_frame.ulDevID, g_data_frame.ulDevSN, 280); 设置门阈值
}
vTaskDelay
(
1
0
);
vTaskDelay
(
1
);
}
}
unsigned
long
getIotConnectNum
(
void
)
{
unsigned
long
ulExistNum
=
0
;
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
for
(
int
j
=
0
;
j
<
WIREROPE_GROUP_MAX_NUM
;
j
++
)
{
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
==
true
)
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
==
true
)
{
ulExistNum
++
;
}
}
}
return
ulExistNum
;
}
void
Sensor_Status_Machine
(
void
)
{
printf
(
"status machine starts...
\n
"
);
while
(
1
)
{
for
(
int
j
=
0
;
j
<
WIREROPE_GROUP_MAX_NUM
;
j
++
)
{
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
// if(i == 0 && j == 0)
// {
// printf("statusMachine:%d\n",g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].status_machine);
// }
switch
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
)
{
case
IDEL
:
{
// printf("G[%d]S[%d] IDEL\n", j, i);
vTaskDelay
(
10
);
;
// 什么都不做
break
;
}
case
POWER_ON
:
// PowerOn ---> CONFIG_THR
{
// 应答
xSemaphoreWaitResp
=
xSemaphoreCreateBinary
();
// printf("ack %04x:%04x\n",g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].id, g_xWITConfig.g_wireRopeGroup[j].wireRopeDevs[i].sn);
ACK_0AH
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
id
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
sn
);
InquireStatus
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
id
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
sn
);
if
(
xSemaphoreWaitResp
!=
NULL
&&
xSemaphoreTake
(
xSemaphoreWaitResp
,
pdMS_TO_TICKS
(
100
))
==
pdTRUE
)
{
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
=
TRUE
;
// 第一次检测到设备上电,意味着设备已经接入网关
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
CONFIG_THR
;
printf
(
"1 上电应答完成
\n
"
);
}
else
{
printf
(
"1 上电应答未完成
\n
"
);
}
vSemaphoreDelete
(
xSemaphoreWaitResp
);
xSemaphoreWaitResp
=
NULL
;
break
;
}
case
CONFIG_THR
:
{
// 发送配置门阈值,等待ACK,配置完成之后,传感器响应数据1表示成功,否则失败
xSemaphoreConfigResp
=
xSemaphoreCreateBinary
();
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingConfigWaiting
=
true
;
Set_Threshold
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
id
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
sn
,
1
);
// 强制配置阈值为1
if
(
xSemaphoreConfigResp
!=
NULL
&&
xSemaphoreTake
(
xSemaphoreConfigResp
,
pdMS_TO_TICKS
(
100
))
==
pdTRUE
)
{
printf
(
"2 配置阈值完成
\n
"
);
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
DETECTING
;
}
else
{
printf
(
"2 配置阈值未完成
\n
"
);
}
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingConfigWaiting
=
false
;
if
(
xSemaphoreConfigResp
!=
NULL
)
vSemaphoreDelete
(
xSemaphoreConfigResp
);
xSemaphoreConfigResp
=
NULL
;
break
;
}
case
DETECTING
:
{
xSemaphoreDataResp
=
xSemaphoreCreateBinary
();
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingDataWaiting
=
true
;
// 开启等待标志位
Start_Detect
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
id
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
sn
);
if
(
xSemaphoreDataResp
!=
NULL
&&
xSemaphoreTake
(
xSemaphoreDataResp
,
pdMS_TO_TICKS
(
200
))
==
pdTRUE
)
{
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
STOP
;
// printf("3 \n");
}
else
{
// printf("3 NULL\n");
}
// 无论采集与否,RESET变量
if
(
xSemaphoreDataResp
!=
NULL
)
{
vSemaphoreDelete
(
xSemaphoreDataResp
);
}
xSemaphoreDataResp
=
NULL
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingDataWaiting
=
false
;
break
;
}
case
STOP
:
{
xSemaphoreStopResp
=
xSemaphoreCreateBinary
();
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingStopWaiting
=
true
;
Stop_Detect
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
id
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
sn
);
if
(
xSemaphoreStopResp
!=
NULL
)
{
if
(
xSemaphoreTake
(
xSemaphoreStopResp
,
pdMS_TO_TICKS
(
200
))
==
pdTRUE
)
{
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
emergency
==
1
)
{
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
PUSH
;
}
else
{
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
DETECTING
;
}
// printf("4 \n");
}
else
{
printf
(
"4 停止工作未完成
\n
"
);
}
}
else
{
printf
(
"4 xSemaphoreStopResp NULL
\n
"
);
}
// 无论采集与否,RESET变量
if
(
xSemaphoreStopResp
!=
NULL
)
vSemaphoreDelete
(
xSemaphoreStopResp
);
xSemaphoreStopResp
=
NULL
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
beingStopWaiting
=
false
;
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
DataSendFlag
==
TRUE
&&
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsUsed
)
{
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
PUSH
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
DataSendFlag
=
false
;
}
break
;
}
case
PUSH
:
{
// Push
printf
(
"Push
\n
"
);
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
emergency
==
TRUE
)
{
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
emergency
=
false
;
}
if
(
WIT_SendIOTData
(
j
)
==
TRUE
)
{
printf
(
"PUSH %f
\n
"
,
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
rope_value
/
10
.
0
);
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
status_machine
=
DETECTING
;
}
else
{
printf
(
"Push Null
\n
"
);
vTaskDelay
(
10
);
}
break
;
}
case
MISSING
:
{
// Push Mqtt Message
if
(
g_bErrorSend_TimerArr
==
true
)
{
if
(
WIT_MissingErrorSend
(
j
)
==
true
)
{
g_bErrorSend_TimerArr
=
false
;
printf
(
"missing send fail
\n
"
);
}
else
{
g_bErrorSend_TimerArr
=
false
;
printf
(
"missing send fail
\n
"
);
}
}
break
;
}
default:
break
;
}
}
}
vTaskDelay
(
1
);
}
}
components/Application/wit.h
View file @
d2b4ee17
#ifndef WIT_H
#define WIT_H
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "freertos/queue.h"
#include "freertos/timers.h"
#include "wit_config.h"
#include "stdbool.h"
#if CONFIG_W5100S_SPI_ETHERNET > 0
#include "../Telecom/eth/W5100S/wizchip_conf.h"
#endif
#include "../Telecom/eth/W5100S/wizchip_conf.h"
#include "mb.h"
#include "ts_iot01b.h"
...
...
@@ -120,25 +123,73 @@ typedef struct {
#endif
typedef
enum
{
IDEL
=
0
,
// 空闲,必须第一位,防止清空flash之后,初始化错误
POWER_ON
=
1
,
// 上电应答
CONFIG_THR
=
2
,
// 配置阈值状态
DETECTING
=
3
,
// 检测获取数据工作
PUSH
=
4
,
// 正常上报MQTT
MISSING
=
5
,
// 失联
STOP
=
6
}
IOT_STATUS
;
typedef
enum
{
LEVEL_UNKNOWN
=
0
,
// 未知状态
LEVEL_0
,
// 轻度损耗
LEVEL_1
,
// 中度损伤
LEVEL_2
,
// 重度损伤
LEVEL_3
,
// 停止使用
}
LEVEL
;
typedef
enum
{
NO_WORKING
=
0
,
WORKING
,
SENSOR_FINE
,
SENSOR_ERROR
}
IOT_WORK_STATUS_RESP
;
#define ALIAS_MAX_NAME_LENGTH 8
//配置数据 (配置存储到内部FLASH --- 阈值与存储数据存储到外部FLASH)
typedef
struct
{
unsigned
short
addr
;
unsigned
short
id
;
unsigned
short
sn
;
bool
bIsTimeout
;
char
alias
[
ALIAS_MAX_NAME_LENGTH
];
bool
bIsUsed
;
bool
bIsPlugIn
;
unsigned
int
rope_value
;
bool
beingWaiting
;
unsigned
char
status
;
}
IOTDev
;
bool
beingDataWaiting
;
bool
beingStopWaiting
;
bool
beingConfigWaiting
;
unsigned
long
g_ts
;
unsigned
short
rope_value
;
LEVEL
level
;
bool
emergency
;
IOT_STATUS
status_machine
;
unsigned
short
fifo_tail
;
unsigned
short
fifo_data
[
FIFO_SIZE
];
bool
bIsFull
;
unsigned
long
alarmRecord
;
}
wireRopeDev
;
typedef
struct
{
wireRopeDev
wireRopeDevs
[
EACH_GROUP_MAX_NUM
];
TimerHandle_t
pxDataSendTimer
;
bool
DataSendFlag
;
}
wireRopeGroup
;
typedef
struct
{
char
cModuleName
[
WIT_MODULE_NAME_MAX_SIZE
];
//模块名称
unsigned
long
ulModuleNameValue
;
//检查模块名是否配置过
unsigned
long
ulPeriod
;
//发送周期
unsigned
long
ulDataPeriod
;
//发送周期
unsigned
long
ulFeaturePeriod
;
//发送周期
unsigned
long
ulConfigureValue
;
//检查以上内容是否配置过
unsigned
long
ulSerialNumber
;
//序列号
unsigned
long
ulPackageID
;
//包ID
...
...
@@ -181,12 +232,9 @@ typedef struct
sSenTable
xSenTable
[
WIT_SENSOR_MAX_CONNECT_NUM
*
WIT_SENSOR_GROUP_MAX_NUM
];
unsigned
long
ulBleBinSize
;
unsigned
long
ulSenParmInfoValue
;
#if CONFIG_W5100S_SPI_ETHERNET > 0
wiz_NetInfo
g_xConfigIp
;
unsigned
long
ulEthNetInfoValue
;
//检查以上信息是否配置过
#endif
IOTDev
my_IOTDev
[
IOTDEV_MAX_NUM
];
unsigned
long
my_IOTThreshold
;
wireRopeGroup
g_wireRopeGroup
[
WIREROPE_GROUP_MAX_NUM
];
#endif
}
WIT_Configure
;
...
...
@@ -254,11 +302,12 @@ bool WIT_GetMotorWork(unsigned char ucIndex);
unsigned
long
*
get_ulPort
(
void
);
char
*
sent_mqtt_ip
(
void
);
#endif
#if CONFIG_W5100S_SPI_ETHERNET > 0
//
#if CONFIG_W5100S_SPI_ETHERNET > 0
unsigned
long
get_status_dhcp
(
void
);
wiz_NetInfo
*
get_gw_eth_info
(
void
);
#endif
//
#endif
void
Message_Deal_Function
(
void
);
unsigned
long
getIotConnectNum
(
void
);
void
Sensor_Status_Machine
(
void
);
#endif
components/config/wit_config.h
View file @
d2b4ee17
...
...
@@ -11,8 +11,8 @@ extern "C"
#define TAG "Witium"
//软件版本号
#define WIT_VERSION "1.0
0
"
#define WIT_VERSION_HEX 0x010
0
#define WIT_VERSION "1.0
1
"
#define WIT_VERSION_HEX 0x010
1
//此宏直接在下载正式程序用
#define WIT_FIXED_MODULE_NAME 1
...
...
@@ -84,6 +84,9 @@ extern "C"
#define WIT_MAX_TIME (0xFFFFFED8) // MOTT上发最大时长
#define WIT_ALARM_COUNT_THRESHOLD 5 // 预警N次才上报预警
#define WIT_FEATURE_PERIOD (15 * 60 * 1000)
#define WIT_DATA_PERIOD (15 * 60 * 1000)
#ifdef __cplusplus
}
#endif
...
...
components/eth_parsing/ts_iot01b.c
View file @
d2b4ee17
...
...
@@ -100,7 +100,15 @@ bool ACK_0AH(unsigned short id, unsigned short sn)
unsigned
char
cmd
=
0x0A
;
unsigned
char
data_size
=
0x01
;
unsigned
char
data
[
1
]
=
{
0x01
};
printf
(
"Send 0x0A
\n
"
);
return
Response_Package
(
id
,
sn
,
cmd
,
data_size
,
data
);
}
//68 00 3F 00 01 68 0C 01 02 1F 16
bool
InquireStatus
(
unsigned
short
id
,
unsigned
short
sn
)
{
unsigned
char
cmd
=
0x0C
;
unsigned
char
data_size
=
0x01
;
unsigned
char
data
[
1
]
=
{
0x02
};
return
Response_Package
(
id
,
sn
,
cmd
,
data_size
,
data
);
}
...
...
@@ -109,7 +117,7 @@ bool Start_Detect(unsigned short id, unsigned short sn)
unsigned
char
cmd
=
0x04
;
unsigned
char
data_size
=
0x01
;
unsigned
char
data
[
1
]
=
{
0x00
};
printf
(
"Send Start_Detect
\n
"
);
//
printf("Send Start_Detect\n");
return
Response_Package
(
id
,
sn
,
cmd
,
data_size
,
data
);
}
...
...
@@ -123,7 +131,7 @@ bool Stop_Detect(unsigned short id, unsigned short sn)
unsigned
char
cmd
=
0x06
;
unsigned
char
data_size
=
0x01
;
unsigned
char
data
[
1
]
=
{
0x00
};
printf
(
"Send Stop_Detect
\n
"
);
//
printf("Send Stop_Detect\n");
return
Response_Package
(
id
,
sn
,
cmd
,
data_size
,
data
);
}
...
...
@@ -194,7 +202,7 @@ bool data_frame_parsing(unsigned char *buf, int len, sIOT01B_Format* data)
// basic check
if
(
data
->
ucHeader
!=
0x68
||
data
->
ucTail
!=
0x16
)
{
printf
(
"Header or Tail Error.
\n
"
);
// printf("Header[%2x] & Tail[%2x] Error.\n", data->ucHeader, data->ucTail
);
return
false
;
}
...
...
@@ -231,3 +239,84 @@ eIOT01B_Info IOT01B_Get_Collect_Data(sIOT01B_Format *df, unsigned short *value)
return
EIOT01B_OK
;
}
void
queueInitFifo
(
unsigned
short
*
fifo_tail
,
unsigned
short
fifo_data
[],
bool
*
isFull
)
{
(
*
fifo_tail
)
=
0
;
for
(
unsigned
short
i
=
0
;
i
<
FIFO_SIZE
;
i
++
)
{
fifo_data
[
i
]
=
0
;
}
(
*
isFull
)
=
false
;
}
unsigned
short
calculateAverage
(
unsigned
short
fifo_data
[],
bool
isFull
)
{
if
(
isFull
!=
true
)
return
0
;
unsigned
short
sum
=
0
;
for
(
int
i
=
0
;
i
<
FIFO_SIZE
;
i
++
)
{
sum
+=
fifo_data
[
i
];
}
printf
(
"sum: %d
\n
"
,
sum
);
return
sum
/
FIFO_SIZE
;
}
void
enqueueDataFifo
(
unsigned
short
*
fifo_tail
,
unsigned
short
*
fifo_data
,
int
data
,
bool
*
isFull
)
{
fifo_data
[(
*
fifo_tail
)]
=
data
;
(
*
fifo_tail
)
=
(
*
fifo_tail
)
+
1
;
if
((
*
fifo_tail
)
>=
FIFO_SIZE
)
{
(
*
fifo_tail
)
=
0
;
*
isFull
=
true
;
// printf("\n");
// for(int i = 0; i< FIFO_SIZE; i++)
// {
// printf("%d ", fifo_data[i]);
// }
// printf("\n");
}
}
unsigned
short
maxDataWireRope
(
unsigned
short
fifo_data
[],
bool
isFull
)
{
if
(
isFull
!=
true
)
return
0
;
int
max
=
0
;
for
(
int
i
=
0
;
i
<
FIFO_SIZE
;
i
++
)
{
if
(
fifo_data
[
i
]
>
max
)
{
max
=
fifo_data
[
i
];
}
}
return
max
;
}
int
getAlarm
(
int
alarmRecord
,
bool
isFull
)
{
if
(
isFull
!=
true
)
return
0
;
return
(
alarmRecord
);
}
void
setAlarm
(
unsigned
long
*
alarmRecord
)
{
if
((
*
alarmRecord
)
>=
999999
)
{
(
*
alarmRecord
)
=
999999
;
}
else
{
(
*
alarmRecord
)
++
;
}
}
components/eth_parsing/ts_iot01b.h
View file @
d2b4ee17
...
...
@@ -3,12 +3,15 @@
#include <stdint.h>
#include <stdbool.h>
// Slave Command
#define SLAVE_POWER_ON_CONTACK 0x01
#define SLAVE_ACK 0x03
#define SLAVE_HEARTBEAT 0x05
#define SLAVE_LINE_DETECT_DATA 0x07
#define SLAVE_RES_SYS_PARAMETER 0x09
#define WIREROPE_CMD_WAIT_AWAKE 0x01
#define WIREROPE_CMD_ACK_OR_NACK 0x03
#define WIREROPE_CMD_HEARTBEAT 0x05
#define WIREROPE_CMD_DATA_PERCENT 0x07
#define WIREROPE_CMD_SYSTEM_PARAM 0x09
#define WIREROPE_CMD_WORK_STATUS_MESSAGE 0x0B
#define WIREROPE_CMD_WORK_PARAM 0x0D
// Master Command
#define MASTER_ACK 0x0A
...
...
@@ -21,10 +24,14 @@
#define FRAME_TAIL 0x16
#define TCP_MESSAGE_MAX_LEN 256
#define TCP_MESSAGE_MAX_LEN 280
#define EACH_GROUP_MAX_NUM 4
#define WIREROPE_GROUP_MAX_NUM 2
#define IOTDEV_MAX_NUM 10
#define FIFO_SIZE 100
typedef
enum
{
EIOT01B_OK
=
0
,
...
...
@@ -65,12 +72,13 @@ eIOT01B_Info IOT01B_Set_Stop_Collect(unsigned long ulDevId);
eIOT01B_Info
IOT01B_Get_Collect_Data
(
sIOT01B_Format
*
df
,
unsigned
short
*
value
);
eIOT01B_Info
IOT01B_Data_Parsing
(
void
*
ulData
,
unsigned
short
usSize
);
void
Message_Deal_Start_T
ask
(
void
);
void
message_deal_start_t
ask
(
void
);
void
message_hex
(
unsigned
char
*
buf
,
unsigned
short
len
);
bool
Message_Send
(
uint8_t
*
smessage
,
int
len
);
bool
data_frame_parsing
(
unsigned
char
*
buf
,
int
len
,
sIOT01B_Format
*
data
);
eIOT01B_Info
IOT01B_Data_Parsing
(
void
*
ulData
,
unsigned
short
usSize
);
bool
ACK_0AH
(
unsigned
short
id
,
unsigned
short
sn
);
bool
InquireStatus
(
unsigned
short
id
,
unsigned
short
sn
);
bool
Set_Threshold
(
unsigned
short
id
,
unsigned
short
sn
,
unsigned
short
threshold
);
bool
Start_Detect
(
unsigned
short
id
,
unsigned
short
sn
);
bool
Stop_Detect
(
unsigned
short
id
,
unsigned
short
sn
);
...
...
@@ -78,6 +86,12 @@ void Get_SensorIOT_Data(unsigned short id, unsigned short sn);
void
IOT_SetConfig
();
// unsigned long getIotConnectNum(void);
void
queueInitFifo
(
unsigned
short
*
fifo_tail
,
unsigned
short
fifo_data
[],
bool
*
isFull
);
unsigned
short
calculateAverage
(
unsigned
short
fifo_data
[],
bool
isFull
)
;
unsigned
short
maxDataWireRope
(
unsigned
short
fifo_data
[],
bool
isFull
)
;
int
getAlarm
(
int
alarmRecord
,
bool
isFull
);
void
setAlarm
(
unsigned
long
*
alarmRecord
);
void
enqueueDataFifo
(
unsigned
short
*
fifo_tail
,
unsigned
short
*
fifo_data
,
int
data
,
bool
*
isFull
)
;
...
...
components/infa/APP/httputil.c
View file @
d2b4ee17
...
...
@@ -36,6 +36,8 @@ extern uint8 pub_buf[1024];
void
ReadData
(
void
);
static
void
make_basic_config_setting_json_callback
(
int8
*
buf
,
CONFIG_MSG
config_msg
)
{
sprintf
(
buf
,
"settingsCallback({
\"
ver
\"
:
\"
%X.%02X
\"
,\
...
...
@@ -224,9 +226,9 @@ void WriteData(CONFIG_MSG *config, uint16_t length)
wiz_NetInfo
*
eth_info
=
NULL
;
unsigned
long
*
value
=
NULL
;
char
*
mqtt_ip
=
NULL
;
#if CONFIG_W5100S_SPI_ETHERNET > 0
//
#if CONFIG_W5100S_SPI_ETHERNET > 0
eth_info
=
get_gw_eth_info
();
#endif
//
#endif
value
=
get_ulPort
();
mqtt_ip
=
sent_mqtt_ip
();
if
(
eth_info
==
NULL
||
value
==
NULL
||
mqtt_ip
==
NULL
)
...
...
@@ -268,9 +270,9 @@ void ReadData(void)
ConfigMsg
.
mqttport
[
0
]
=
*
value
%
256
;
ConfigMsg
.
mqttport
[
1
]
=
*
value
/
256
;
#if CONFIG_W5100S_SPI_ETHERNET > 0
//
#if CONFIG_W5100S_SPI_ETHERNET > 0
ConfigMsg
.
dhcpconfig
=
get_status_dhcp
();
#endif
//
#endif
ConfigMsg
.
dhcpconfig
-=
1
;
printf
(
"IP, GW and Subnet updated successfully in gWIZNETINFO.
\r\n
"
);
...
...
components/infa/APP/tcp_server.c
View file @
d2b4ee17
...
...
@@ -18,7 +18,9 @@
#include "socket.h"
#include "wizchip_conf.h"
#include "w5100s_conf.h"
#include "eth.h"
#if CONFIG_W5100S_SPI_ETHERNET > 0
#include "eth.h"
#endif
#include "ts_iot01b.h"
#include "freertos/FreeRTOS.h"
...
...
@@ -34,28 +36,24 @@ uint16 local_port = 11111; // 定义本地端口11111
uint8_t
g_IOTBuffer
[
200
];
Tcp_Message
g_Tcp_Message
;
extern
QueueHandle_t
xMessageQueueHandle
;
TimerHandle_t
xSensorTimer
=
NULL
;
TimerHandle_t
xSensorData
Fresh
Timer
=
NULL
;
TimerHandle_t
xSensorTime
outTime
r
=
NULL
;
TimerHandle_t
xSensorData
Update
Timer
=
NULL
;
TCP_STATUS
g_TcpServerStatus
=
TCP_SERVER_SOCKET_CLOSE
;
extern
TimerHandle_t
g_xDataSendTimer
[];
void
do_tcp_server
(
void
)
{
uint8_t
count
=
0
;
my_socket
(
2
,
Sn_MR_TCP
,
11111
,
0
);
uint8_t
ret
;
uint16
len
;
portBASE_TYPE
ret_pB
;
// my_socket(2, Sn_MR_TCP, 11111, 0);
while
(
1
)
{
uint16
len
=
0
;
uint8_t
ret
=
getSn_SR
(
SOCK_TCPS
);
count
++
;
if
(
count
==
500
)
{
count
=
0
;
printf
(
">>>>>getSn_SR %d
\n
"
,
ret
);
}
// printf(" getSn_SR %d\n",ret);
len
=
0
;
ret
=
getSn_SR
(
SOCK_TCPS
);
switch
(
ret
)
// 获取socket的状态
{
case
SOCK_CLOSED
:
// socket处于关闭状态
...
...
@@ -82,18 +80,24 @@ void do_tcp_server(void)
len
=
getSn_RX_RSR
(
SOCK_TCPS
);
// 定义len为已接收数据的长度
if
(
len
>
0
)
{
if
(
len
>
2
56
)
if
(
len
>
2
80
)
{
len
=
256
;
len
=
265
;
}
recv
(
SOCK_TCPS
,
g_Tcp_Message
.
message
,
len
);
// 接收来自Client的数据
g_Tcp_Message
.
rec_len
=
len
;
// 添加字符串结束符
// printf("sock receive len[%d]: %s\n", g_Tcp_Message.rec_len, g_Tcp_Message.message);
if
(
xMessageQueueHandle
!=
NULL
)
{
xQueueSend
(
xMessageQueueHandle
,
&
g_Tcp_Message
,
0
);
// disconnect(SOCK_TCPS); // 断开当前TCP连接
// close(SOCK_TCPS); // 关闭当前所使用socket
ret_pB
=
xQueueSend
(
xMessageQueueHandle
,
&
g_Tcp_Message
,
0
);
// 将数据发送到消息队列中
if
(
ret_pB
==
pdTRUE
)
{
// printf("xQSend OK\n");
}
else
printf
(
"xQSend Exx
\n
"
);
}
else
{
...
...
@@ -129,7 +133,7 @@ bool Message_Send(uint8_t *smessage, int len)
}
else
{
printf
(
"TCP SERVER DISCONNECT!!!
\n
TCP_SERVER_STATUS is [%d
]
\n
"
,
g_TcpServerStatus
);
// printf("No Client ESTABLISHED [%x
]\n", g_TcpServerStatus);
return
false
;
}
}
...
...
@@ -137,14 +141,18 @@ bool Message_Send(uint8_t *smessage, int len)
void
tcp_server_task_start
(
void
)
{
printf
(
"
tcp_server_task START
\n
"
);
printf
(
"
1 start
\n
"
);
xTaskCreate
(
do_tcp_server
,
"tcp_server_task"
,
2048
,
NULL
,
5
,
NULL
);
}
void
Message_Deal_Start_T
ask
(
void
)
void
message_deal_start_t
ask
(
void
)
{
printf
(
"Message_Deal_Task START
\n
"
);
xMessageQueueHandle
=
xQueueCreate
(
40
,
sizeof
(
Tcp_Message
));
xTaskCreate
(
Message_Deal_Function
,
"Message_Deal_Function"
,
8192
,
NULL
,
5
,
NULL
);
printf
(
"2 start
\n
"
);
while
(
xMessageQueueHandle
==
NULL
)
{
xMessageQueueHandle
=
xQueueCreate
(
100
,
sizeof
(
Tcp_Message
));
}
xTaskCreate
(
Sensor_Status_Machine
,
"StatusMachine"
,
5120
,
NULL
,
5
,
NULL
);
xTaskCreate
(
Message_Deal_Function
,
"MessageDealFunction"
,
10240
,
NULL
,
5
,
NULL
);
}
components/infa/eth/w5100s_conf.c
View file @
d2b4ee17
...
...
@@ -22,7 +22,9 @@
#include "driver/gpio.h"
#include "spi.h"
#include "esp_rom_gpio.h"
#include "eth.h"
#if CONFIG_W5100S_SPI_ETHERNET > 0
#include "eth.h"
#endif
#include "wit.h"
#include "freertos/FreeRTOS.h"
...
...
@@ -74,7 +76,9 @@ void ETHERNET_Init(bool *bModuleStatus, bool *bCableStatus)
vTaskDelay
(
2000
/
portTICK_PERIOD_MS
);
}
// hw_ping_init();
#if CONFIG_W5100S_SPI_ETHERNET > 0
if_eth_task_init
();
#endif
}
/**
...
...
components/infa/generation/Celluar/celluar_gpio.c
View file @
d2b4ee17
...
...
@@ -12,7 +12,7 @@
/* Private macros ------------------------------------------------------------*/
#define CELLUAR_POWER_KEY_PIN 1
#define CELLUAR_STATUS_PIN 38
#define POWER_KEY_PIN
46
#define POWER_KEY_PIN
3
#define CELLUAR_POWER_BASE_TIME 500 //500ms
...
...
@@ -26,8 +26,8 @@ void Celluar_ConfigureGPIO(void)
esp_rom_gpio_pad_select_gpio
(
CELLUAR_STATUS_PIN
);
gpio_set_direction
(
CELLUAR_STATUS_PIN
,
GPIO_MODE_INPUT
);
//
// POWER_KEY_PIN
//
esp_rom_gpio_pad_select_gpio(POWER_KEY_PIN); // 选择个GPIO
//
gpio_set_direction(POWER_KEY_PIN, GPIO_MODE_OUTPUT); // 把这个GPIO作为输出
esp_rom_gpio_pad_select_gpio
(
POWER_KEY_PIN
);
// 选择个GPIO
gpio_set_direction
(
POWER_KEY_PIN
,
GPIO_MODE_OUTPUT
);
// 把这个GPIO作为输出
gpio_set_level
(
POWER_KEY_PIN
,
1
);
// // EC20 PWR设置
...
...
components/infa/generation/Celluar/celluar_usb.c
View file @
d2b4ee17
...
...
@@ -98,7 +98,7 @@ void Celluar_ConfigureUSB(void (*pFuncIdleCallBack)(void), void (*pFuncRxneCallB
{
usbh_cdc_driver_install
(
&
config
);
/* Waiting for USB device connected */
usbh_cdc_wait_connect
(
portMAX_DELAY
);
usbh_cdc_wait_connect
(
5000
);
g_xUSBHandler
.
pFuncRxneHandler
=
pFuncRxneCallBack
;
g_xUSBHandler
.
pFuncIdleHandler
=
pFuncIdleCallBack
;
gUSBSemaphore
=
xSemaphoreCreateBinary
();
...
...
main/app_main.c
View file @
d2b4ee17
...
...
@@ -21,25 +21,22 @@
#include "freertos/queue.h"
#include "wit.h"
#if CONFIG_W5100S_SPI_ETHERNET > 0
#include "httputil.h"
#endif
#define MAIN_TASK_STK (configMINIMAL_STACK_SIZE * 10)
#define MAIN_TASK_PRIORITY (tskIDLE_PRIORITY + 3)
#if CONFIG_W5100S_SPI_ETHERNET > 0
#define HTTP_TASK_STK (configMINIMAL_STACK_SIZE * 20)
#define HTTP_TASK_PRIORITY (tskIDLE_PRIORITY + 2)
#endif
#define TWDT_TIMEOUT_S 3 // TWDT超时时间
#define TASK_RESET_PERIOD_S 2 // 任务重置周期时间
static
void
Main_Task
(
void
*
pvParameter
);
#if CONFIG_W5100S_SPI_ETHERNET > 0
static
void
Http_Task
(
void
*
pvParameter
);
#endif
static
void
Http_Task
(
void
*
pvParameter
);
static
int
bWITInitFin
=
0
;
...
...
@@ -48,9 +45,7 @@ void app_main(void)
int
rc
=
0
;
ESP_ERROR_CHECK
(
nvs_flash_init
());
xTaskCreate
(
Main_Task
,
"Main Task"
,
MAIN_TASK_STK
,
NULL
,
MAIN_TASK_PRIORITY
,
NULL
);
#if CONFIG_W5100S_SPI_ETHERNET > 0
rc
=
xTaskCreate
(
Http_Task
,
"Http Task"
,
HTTP_TASK_STK
,
NULL
,
HTTP_TASK_PRIORITY
,
NULL
);
#endif
printf
(
"rc is %d
\r\n
"
,
rc
);
}
...
...
@@ -68,11 +63,10 @@ static void Main_Task(void *pvParameter)
vTaskDelay
(
20
/
portTICK_PERIOD_MS
);
}
}
#if CONFIG_W5100S_SPI_ETHERNET > 0
static
void
Http_Task
(
void
*
pvParameter
)
{
//Init
// printf("Enter Http Task\n");
while
(
1
)
{
if
(
bWITInitFin
==
1
)
...
...
@@ -82,4 +76,4 @@ static void Http_Task(void *pvParameter)
vTaskDelay
(
1
/
portTICK_PERIOD_MS
);
}
}
#endif
sdkconfig
View file @
d2b4ee17
...
...
@@ -471,8 +471,8 @@ CONFIG_PARTITION_TABLE_MD5=y
# Witium Gateway Configure
#
# CONFIG_ESP32_WIFI is not set
# CONFIG_EC200S_USB_4G is not set
CONFIG_W5100S_SPI_ETHERNET=y
CONFIG_EC200S_USB_4G=y
# CONFIG_W5100S_SPI_ETHERNET is not set
# CONFIG_RS485_RTU is not set
CONFIG_BLUETOOTH=y
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment