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
Hide 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,31 +1141,39 @@ 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
;
g_bFeatureTimerArr
=
false
;
}
else
{
printf
(
"Send fail
\n
"
);
}
}
}
...
...
@@ -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");
// strcpy(g_xWITConfig.cMQTTBroker, "116.62.127.242");
#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
ulSetThreshold
;
unsigned
long
ulSetPeriod
;
ulSetPeriod
=
DJSON_GetValueInt
(
&
xItem
)
*
1000
;
g_xWITConfig
.
ulFeaturePeriod
=
ulSetPeriod
;
bNeedUpdateFeatureTimer
=
true
;
bNeedUpdateCfg
=
true
;
}
}
else
{
bStatus
=
false
;
goto
judge_status
;
}
// 解析设备[id --- sn,id], 绑定设备
xGroupArray
=
DJSON_GetObjectItem
(
&
xCfgObj
,
"dev"
);
if
(
xGroupArray
.
eItemType
==
DJSON_Array
)
{
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
;
}
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
;
}
ulSetThreshold
=
DJSON_GetValueDouble
(
&
xItem
)
*
10
;
// 4% 下发 40,0x00 0x28
if
(
ulSetThreshold
>
1000
||
ulSetThreshold
<
0
)
printf
(
"gId=%d
\n
"
,
group_id
);
if
(
group_id
>
EACH_GROUP_MAX_NUM
||
group_id
<=
0
)
{
printf
(
"Set Threshold Error.
\n
"
);
bStatus
=
false
;
goto
judge_status
;
}
printf
(
"Threshold %ld
\n
"
,
ulSetThreshold
);
if
(
IOTConfigFunction
())
xSensorArray
=
DJSON_GetObjectItem
(
&
xDevObj
,
"sensors"
);
if
(
xSensorArray
.
eItemType
==
DJSON_Array
)
{
bStatus
=
true
;
printf
(
"IOTConfigFunction true
\n
"
);
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
)
{
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
;
}
// 解析设备[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
)
{
dev_num
=
IOTDEV_MAX_NUM
;
printf
(
"dev_num over than IOTDEV_MAX_NUM
\n
"
);
bStatus
=
false
;
goto
judge_status
;
}
if
(
xDevArray
.
eItemType
==
DJSON_Array
)
{
for
(
int
i
=
0
;
i
<
dev_num
;
i
++
)
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
);
}
xItem
=
DJSON_GetObjectItem
(
&
xDevObj
,
"id"
);
// 解析sn,id
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
,
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
(
"Config id/sn Fail
\n
"
);
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
;
}
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
);
}
xItem
=
DJSON_GetObjectItem
(
&
xSensorObj
,
"alias"
);
if
(
xItem
.
eItemType
==
DJSON_String
)
{
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
(
"xSensorObj is not DJSON_String
\n
"
);
bStatus
=
false
;
goto
judge_status
;
}
}
}
}
bNeedUpdateCfg
=
true
;
// 更新定时器
if
(
bNeedUpdate
F
Timer
==
true
)
if
(
bNeedUpdate
Data
Timer
==
true
)
{
xTimerChangePeriod
(
g_xDataSendTimer
,
g_xWITConfig
.
ulPeriod
,
1000
);
xTimerChangePeriod
(
xSensorDataFreshTimer
,
g_xWITConfig
.
ulPeriod
,
1000
);
printf
(
"xTimerChangePeriod g_xDataSendTimer %ld
\n
"
,
g_xWITConfig
.
ulPeriod
);
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
(
bNeedUpdateFeatureTimer
==
true
)
{
//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
void
iot_Sensor_Init
(
void
)
{
for
(
int
i
=
0
;
i
<
IOTDEV_MAX_NUM
;
i
++
)
{
// 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
;
}
}
void
iot_Sensor_Print
(
void
)
{
for
(
int
i
=
0
;
i
<
IOTDEV_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
);
}
}
// #endif
// 修改:增加二值信号量,回复响应状态
void
vSensorDataFreshTimerCallback
()
void
iot_Sensor_Clear
(
bool
all
)
{
xSemaphoreDataResp
=
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
)
g_xWITConfig
.
g_wireRopeGroup
[
j
].
DataSendFlag
=
false
;
g_xWITConfig
.
g_wireRopeGroup
[
j
].
pxDataSendTimer
=
NULL
;
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
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
)
if
(
all
)
{
// printf("data resp success\n");
}
else
{
printf
(
"data resp fail, maybe timeout or be below the threshold
\n
"
);
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
;
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
);
}
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
++
)
{
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsUsed
&&
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
)
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
last_ts
=
g_ts
[
i
];
now_ts
=
xTaskGetTickCount
();
diff_ts
=
now_ts
-
last_ts
;
if
(
diff_ts
<
0
)
if
(
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsUsed
&&
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
bIsPlugIn
)
{
printf
(
"ticks[now:%ld][old:%ld]
\n
"
,
now_ts
,
last_ts
);
return
;
}
// 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
)
last_ts
=
g_xWITConfig
.
g_wireRopeGroup
[
j
].
wireRopeDevs
[
i
].
g_ts
;
now_ts
=
xTaskGetTickCount
();
diff_ts
=
now_ts
-
last_ts
;
if
(
diff_ts
<
0
)
{
g_bErrorUpdateFlag
=
true
;
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
=
false
;
printf
(
"ticks[now:%ld][old:%ld]
\n
"
,
now_ts
,
last_ts
);
continue
;
}
// printf("g_wireRopeGroup[j].wireRopeDevs[%d] diff_ts[%ld]\n", i, diff_ts);
if
(
diff_ts
>
pdMS_TO_TICKS
(
65000
*
1
))
// 65 sec 检查是否超时
{
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
);
}
}
else
{
// 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
;
vTaskDelay
(
pdMS_TO_TICKS
(
1000
));
// 等待xSensorTimeoutTimer创建完成
xSensorTimer
=
xTimerCreate
(
"SensorTimer"
,
pdMS_TO_TICKS
(
1000
),
pdTRUE
,
NULL
,
vSensorTimerCallback
);
xSensorDataFreshTimer
=
xTimerCreate
(
"SensorDataFreshtimer"
,
pdMS_TO_TICKS
(
60000
*
3
),
pdTRUE
,
NULL
,
vSensorDataFreshTimerCallback
);
// 确保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
++
)
{
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
++
)
{
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
;
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
))
{
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
)
{
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
)
{
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
(
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
))
{
xSemaphoreGive
(
xSemaphoreDataResp
);
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
++
)
{
if
(
g_xWITConfig
.
my_IOTDev
[
i
].
bIsPlugIn
==
true
)
for
(
int
i
=
0
;
i
<
EACH_GROUP_MAX_NUM
;
i
++
)
{
ulExistNum
++
;
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
;
unsigned
short
id
;
unsigned
short
sn
;
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
;
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,16 +3,19 @@
#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
#define MASTER_START_DETECT 0x04
#define MASTER_ACK
0x0A
#define MASTER_START_DETECT
0x04
// Frame Define
...
...
@@ -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_eth_task_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