Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
A
ademco_hb
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
captainwong
ademco_hb
Commits
86ccd9a5
Commit
86ccd9a5
authored
Jun 20, 2022
by
captainwong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tested
parent
ef8c2dff
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
187 additions
and
152 deletions
+187
-152
ademco.c
c/ademco.c
+152
-136
ademco.h
c/ademco.h
+35
-16
No files found.
c/ademco.c
View file @
86ccd9a5
...
...
@@ -193,83 +193,83 @@ const char* ademcoEventToString(AdemcoEvent ademcoEvent)
}
}
const
wchar_t
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
)
const
char
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
)
{
switch
(
ademcoEvent
)
{
case
EVENT_ARM
:
return
L
"布防"
;
case
EVENT_BURGLAR
:
return
L
"盗警"
;
case
EVENT_DISARM
:
return
L
"撤防"
;
case
EVENT_DURESS
:
return
L
"胁迫"
;
case
EVENT_EMERGENCY
:
return
L
"紧急报警"
;
case
EVENT_FIRE
:
return
L
"火警"
;
case
EVENT_GAS
:
return
L
"煤气"
;
case
EVENT_HALFARM
:
case
EVENT_HALFARM_1456
:
return
L
"半布防"
;
case
EVENT_TAMPER
:
return
L
"防拆"
;
case
EVENT_ZONE_TAMPER
:
return
L
"防区防拆"
;
case
EVENT_WATER
:
return
L
"水警"
;
case
EVENT_BYPASS
:
return
L
"旁路"
;
case
EVENT_BYPASS_RESUME
:
return
L
"解除旁路"
;
case
EVENT_AC_BROKE
:
return
L
"主机AC掉电"
;
case
EVENT_AC_RECOVER
:
return
L
"主机AC恢复"
;
case
EVENT_LOWBATTERY
:
return
L
"低电"
;
case
EVENT_BATTERY_RECOVER
:
return
L
"复电"
;
case
EVENT_BADBATTERY
:
return
L
"坏电"
;
case
EVENT_BADBATTERY_RECOVER
:
return
L
"坏电恢复"
;
case
EVENT_SOLARDISTURB
:
return
L
"光扰"
;
case
EVENT_SOLARDISTURB_RECOVER
:
return
L
"光扰恢复"
;
case
EVENT_DISCONNECT
:
return
L
"失效"
;
case
EVENT_RECONNECT
:
return
L
"恢复"
;
case
EVENT_LOST
:
return
L
"失联"
;
case
EVENT_LOST_RECOVER
:
return
L
"恢复"
;
case
EVENT_3100
:
return
L
"液晶主机清除异常指示"
;
case
EVENT_BATTERY_EXCEPTION
:
return
L
"防区电源故障"
;
case
EVENT_BATTERY_EXCEPTION_RECOVER
:
return
L
"防区电源故障恢复"
;
case
EVENT_OTHER_EXCEPTION
:
return
L
"防区其他故障"
;
case
EVENT_OTHER_EXCEPTION_RECOVER
:
return
L
"防区其他故障恢复"
;
case
EVENT_SERIAL485DIS
:
return
L
"485断开"
;
case
EVENT_SERIAL485CONN
:
return
L
"485恢复"
;
case
EVENT_DOORRINGING
:
return
L
"门铃"
;
case
EVENT_CONN_HANGUP
:
return
L
"链路挂起"
;
case
EVENT_CONN_RESUME
:
return
L
"链路恢复"
;
case
EVENT_DISARM_PWD_ERR
:
return
L
"撤防密码错误"
;
case
EVENT_SUB_MACHINE_SENSOR_EXCEPTION
:
return
L
"分防区异常"
;
case
EVENT_SUB_MACHINE_SENSOR_RESUME
:
return
L
"分防区恢复"
;
case
EVENT_SUB_MACHINE_POWER_EXCEPTION
:
return
L
"分防区电源异常"
;
case
EVENT_SUB_MACHINE_POWER_RESUME
:
return
L
"分防区电源恢复"
;
case
EVENT_COM_PASSTHROUGH
:
return
L
"串口透传"
;
case
EVENT_ENTER_SET_MODE
:
return
L
"进入设置状态"
;
case
EVENT_EXIT_SET_MODE
:
return
L
"拒绝/停止设置"
;
case
EVENT_QUERY_SUB_MACHINE
:
return
L
"查询"
;
case
EVENT_WRITE_TO_MACHINE
:
return
L
"写入主机信息"
;
case
EVENT_I_AM_NET_MODULE
:
return
L
"我是网络模块"
;
case
EVENT_PHONE_USER_SOS
:
return
L
"手机用户SOS"
;
case
EVENT_PHONE_USER_CANCLE_ALARM
:
return
L
"手机用户消警"
;
case
EVENT_I_AM_GPRS
:
return
L
"我是GPRS主机"
;
case
EVENT_I_AM_LCD_MACHINE
:
return
L
"我是液晶主机"
;
case
EVENT_I_AM_WIRE_MACHINE
:
return
L
"我是网线主机"
;
case
EVENT_I_AM_WIFI_MACHINE
:
return
L
"我是WiFi主机"
;
case
EVENT_I_AM_3_SECTION_MACHINE
:
return
L
"我是三区段主机"
;
case
EVENT_I_AM_IOT_MACHINE
:
return
L
"我是物联卡主机"
;
case
EVENT_I_AM_TRUE_COLOR
:
return
L
"我是真彩主机"
;
case
EVENT_I_AM_GPRS_IOT
:
return
L
"我是简化版物联卡主机"
;
case
EVENT_I_AM_GPRS_PHONE
:
return
L
"我是GPRS主机能打电话"
;
case
EVENT_I_AM_NB_MACHINE
:
return
L
"我是NB报警接收主机"
;
case
EVENT_SIM_IS_IOT_CARD
:
return
L
"SIM卡为物联卡"
;
case
EVENT_SIM_IS_IOT_PLATFORM_CARD
:
return
L
"SIM卡为平台物联卡"
;
case
EVENT_SIM_IS_NOT_IOT_CARD
:
return
L
"SIM卡为非物联卡"
;
case
EVENT_ENTER_SETTING_MODE
:
return
L
"主机进入设置状态"
;
case
EVENT_EXIT_SETTING_MODE
:
return
L
"主机退出设置状态"
;
case
EVENT_ARM
:
return
"布防"
;
case
EVENT_BURGLAR
:
return
"盗警"
;
case
EVENT_DISARM
:
return
"撤防"
;
case
EVENT_DURESS
:
return
"胁迫"
;
case
EVENT_EMERGENCY
:
return
"紧急报警"
;
case
EVENT_FIRE
:
return
"火警"
;
case
EVENT_GAS
:
return
"煤气"
;
case
EVENT_HALFARM
:
case
EVENT_HALFARM_1456
:
return
"半布防"
;
case
EVENT_TAMPER
:
return
"防拆"
;
case
EVENT_ZONE_TAMPER
:
return
"防区防拆"
;
case
EVENT_WATER
:
return
"水警"
;
case
EVENT_BYPASS
:
return
"旁路"
;
case
EVENT_BYPASS_RESUME
:
return
"解除旁路"
;
case
EVENT_AC_BROKE
:
return
"主机AC掉电"
;
case
EVENT_AC_RECOVER
:
return
"主机AC恢复"
;
case
EVENT_LOWBATTERY
:
return
"低电"
;
case
EVENT_BATTERY_RECOVER
:
return
"复电"
;
case
EVENT_BADBATTERY
:
return
"坏电"
;
case
EVENT_BADBATTERY_RECOVER
:
return
"坏电恢复"
;
case
EVENT_SOLARDISTURB
:
return
"光扰"
;
case
EVENT_SOLARDISTURB_RECOVER
:
return
"光扰恢复"
;
case
EVENT_DISCONNECT
:
return
"失效"
;
case
EVENT_RECONNECT
:
return
"恢复"
;
case
EVENT_LOST
:
return
"失联"
;
case
EVENT_LOST_RECOVER
:
return
"恢复"
;
case
EVENT_3100
:
return
"液晶主机清除异常指示"
;
case
EVENT_BATTERY_EXCEPTION
:
return
"防区电源故障"
;
case
EVENT_BATTERY_EXCEPTION_RECOVER
:
return
"防区电源故障恢复"
;
case
EVENT_OTHER_EXCEPTION
:
return
"防区其他故障"
;
case
EVENT_OTHER_EXCEPTION_RECOVER
:
return
"防区其他故障恢复"
;
case
EVENT_SERIAL485DIS
:
return
"485断开"
;
case
EVENT_SERIAL485CONN
:
return
"485恢复"
;
case
EVENT_DOORRINGING
:
return
"门铃"
;
case
EVENT_CONN_HANGUP
:
return
"链路挂起"
;
case
EVENT_CONN_RESUME
:
return
"链路恢复"
;
case
EVENT_DISARM_PWD_ERR
:
return
"撤防密码错误"
;
case
EVENT_SUB_MACHINE_SENSOR_EXCEPTION
:
return
"分防区异常"
;
case
EVENT_SUB_MACHINE_SENSOR_RESUME
:
return
"分防区恢复"
;
case
EVENT_SUB_MACHINE_POWER_EXCEPTION
:
return
"分防区电源异常"
;
case
EVENT_SUB_MACHINE_POWER_RESUME
:
return
"分防区电源恢复"
;
case
EVENT_COM_PASSTHROUGH
:
return
"串口透传"
;
case
EVENT_ENTER_SET_MODE
:
return
"进入设置状态"
;
case
EVENT_EXIT_SET_MODE
:
return
"拒绝/停止设置"
;
case
EVENT_QUERY_SUB_MACHINE
:
return
"查询"
;
case
EVENT_WRITE_TO_MACHINE
:
return
"写入主机信息"
;
case
EVENT_I_AM_NET_MODULE
:
return
"我是网络模块"
;
case
EVENT_PHONE_USER_SOS
:
return
"手机用户SOS"
;
case
EVENT_PHONE_USER_CANCLE_ALARM
:
return
"手机用户消警"
;
case
EVENT_I_AM_GPRS
:
return
"我是GPRS主机"
;
case
EVENT_I_AM_LCD_MACHINE
:
return
"我是液晶主机"
;
case
EVENT_I_AM_WIRE_MACHINE
:
return
"我是网线主机"
;
case
EVENT_I_AM_WIFI_MACHINE
:
return
"我是WiFi主机"
;
case
EVENT_I_AM_3_SECTION_MACHINE
:
return
"我是三区段主机"
;
case
EVENT_I_AM_IOT_MACHINE
:
return
"我是物联卡主机"
;
case
EVENT_I_AM_TRUE_COLOR
:
return
"我是真彩主机"
;
case
EVENT_I_AM_GPRS_IOT
:
return
"我是简化版物联卡主机"
;
case
EVENT_I_AM_GPRS_PHONE
:
return
"我是GPRS主机能打电话"
;
case
EVENT_I_AM_NB_MACHINE
:
return
"我是NB报警接收主机"
;
case
EVENT_SIM_IS_IOT_CARD
:
return
"SIM卡为物联卡"
;
case
EVENT_SIM_IS_IOT_PLATFORM_CARD
:
return
"SIM卡为平台物联卡"
;
case
EVENT_SIM_IS_NOT_IOT_CARD
:
return
"SIM卡为非物联卡"
;
case
EVENT_ENTER_SETTING_MODE
:
return
"主机进入设置状态"
;
case
EVENT_EXIT_SETTING_MODE
:
return
"主机退出设置状态"
;
case
EVENT_RESTORE_FACTORY_SETTINGS_710
:
case
EVENT_RESTORE_FACTORY_SETTINGS
:
return
L
"主机恢复出厂设置"
;
case
EVENT_WHAT_IS_YOUR_TYPE
:
return
L
"索要主机类型"
;
case
EVENT_SIGNAL_STRENGTH_CHANGED
:
return
L
"信号强度变化"
;
case
EVENT_OFFLINE
:
return
L
"上线"
;
case
EVENT_ONLINE
:
return
L
"离线"
;
default:
return
L
"未定义的安定宝事件"
;
case
EVENT_RESTORE_FACTORY_SETTINGS
:
return
"主机恢复出厂设置"
;
case
EVENT_WHAT_IS_YOUR_TYPE
:
return
"索要主机类型"
;
case
EVENT_SIGNAL_STRENGTH_CHANGED
:
return
"信号强度变化"
;
case
EVENT_OFFLINE
:
return
"上线"
;
case
EVENT_ONLINE
:
return
"离线"
;
default:
return
"未定义的安定宝事件"
;
}
}
...
...
@@ -326,7 +326,7 @@ uint16_t ademcoCRC16(const uint8_t* buff, int len, uint16_t crc)
int
ademcoAppendDataSegment
(
uint8_t
*
buff
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
)
{
char
*
p
=
buff
;
uint8_t
*
p
=
buff
;
if
(
ademcoEvent
==
EVENT_INVALID_EVENT
)
{
*
p
++
=
'['
;
*
p
++
=
']'
;
...
...
@@ -422,7 +422,9 @@ AdemcoParseResult ademcoParseDataSegment(const uint8_t* packet, int packet_len,
temp
[
3
]
=
'\0'
;
dataSegment
->
zone
=
atoi
(
temp
);
memcpy
(
dataSegment
->
raw
,
packet
,
packet_len
);
if
(
dataSegment
->
raw
!=
packet
)
{
memcpy
(
dataSegment
->
raw
,
packet
,
packet_len
);
}
dataSegment
->
raw_len
=
packet_len
;
return
RESULT_OK
;
}
while
(
0
);
...
...
@@ -488,7 +490,7 @@ int ademcoDataSegmentToCongwinFe100(uint8_t* fe100, const AdemcoDataSegment* dat
p
+=
3
;
*
p
++
=
' '
;
*
p
++
=
'\
n
'
;
*
p
++
=
'\
r
'
;
return
p
-
(
char
*
)
fe100
;
}
return
0
;
...
...
@@ -589,14 +591,14 @@ static void getNowTimestamp(char* buff)
{
time_t
now
=
time
(
NULL
);
struct
tm
*
tm
=
localtime
(
&
now
);
snprintf
(
buff
,
ADEMCO_PACKET_TIMESTAMP_LEN
+
1
,
"_%02d:%02d:%02d,%02d-%02d-%04d"
,
snprintf
(
buff
,
ADEMCO_PACKET_TIMESTAMP_LEN
+
1
,
"_%02d:%02d:%02d,%02d-%02d-%04d"
,
tm
->
tm_hour
,
tm
->
tm_min
,
tm
->
tm_sec
,
tm
->
tm_mon
+
1
,
tm
->
tm_mday
,
tm
->
tm_year
+
1900
);
}
static
int
ademcoMakeEmptyDataPacket
(
uint8_t
*
dst_buff
,
int
len
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
int
ademcoMakeEmptyDataPacket
(
uint8_t
*
dst_buff
,
int
len
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
char
buff
[
ADEMCO_PACKET_MAX_LEN
];
uint8_t
buff
[
ADEMCO_PACKET_MAX_LEN
];
uint8_t
*
p
=
buff
;
uint8_t
*
pcrc
=
buff
+
1
;
uint8_t
*
plen
=
buff
+
5
;
...
...
@@ -635,14 +637,13 @@ static int ademcoMakeEmptyDataPacket(uint8_t* dst_buff, int len, const char* id,
snprintf
(
temp
,
5
,
"%04X"
,
crc
);
memcpy
(
pcrc
,
temp
,
4
);
if
(
dst_buff
==
NULL
||
len
<
packet_len
)
{
return
packet_len
;
}
else
if
(
dst_buff
!=
NULL
&&
len
>=
packet_len
)
{
if
(
dst_buff
!=
NULL
&&
len
>
packet_len
)
{
memcpy
(
dst_buff
,
buff
,
packet_len
);
dst_buff
[
packet_len
]
=
'\0'
;
// for debug convenience
return
packet_len
;
}
else
{
return
0
;
}
return
0
;
}
int
ademcoMakeNullPacket
(
uint8_t
*
buff
,
int
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
...
...
@@ -705,9 +706,7 @@ int ademcoMakeHbPacket(uint8_t* dst_buff, int len, uint16_t seq, const char* acc
snprintf
(
temp
,
5
,
"%04X"
,
crc
);
memcpy
(
pcrc
,
temp
,
4
);
if
(
dst_buff
==
NULL
||
len
<
packet_len
)
{
return
packet_len
;
}
else
if
(
dst_buff
!=
NULL
&&
len
>=
packet_len
)
{
if
(
dst_buff
!=
NULL
&&
len
>
packet_len
)
{
memcpy
(
dst_buff
,
buff
,
packet_len
);
dst_buff
[
packet_len
]
=
'\0'
;
// for debug convenience
return
packet_len
;
...
...
@@ -881,7 +880,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
if
(
p
>=
pcr
||
*
p
!=
']'
||
*
(
p
+
1
)
!=
'_'
)
{
break
;
}
pkt
->
xdata
.
lenghFormat
=
xlf
;
pkt
->
xdata
.
raw_len
=
++
p
-
pxdata
;
pkt
->
xdata
.
raw_len
=
++
p
-
pxdata
;
memcpy
(
pkt
->
xdata
.
raw
,
pxdata
,
pkt
->
xdata
.
raw_len
);
}
else
{
pkt
->
xdata
.
raw_len
=
0
;
...
...
@@ -910,7 +909,9 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
if
(
p
++
!=
pcr
)
{
break
;
}
pkt
->
raw_len
=
*
cb_commited
=
p
-
buff
;
memcpy
(
pkt
->
raw
,
buff
,
pkt
->
raw_len
);
if
(
pkt
->
raw
!=
buff
)
{
memcpy
(
pkt
->
raw
,
buff
,
pkt
->
raw_len
);
}
return
RESULT_OK
;
}
while
(
0
);
...
...
@@ -1253,22 +1254,22 @@ const char* hbMachineTypeToString(HbMachineType type)
}
}
const
wchar_t
*
hbMachineTypeToStringChinese
(
HbMachineType
type
)
const
char
*
hbMachineTypeToStringChinese
(
HbMachineType
type
)
{
switch
(
type
)
{
case
HMT_WIFI
:
return
L
"0 WiFi主机"
;
case
HMT_CAMERA
:
return
L
"1 摄像头主机"
;
case
HMT_GPRS_IOT
:
return
L
"2 简化的物联卡主机"
;
case
HMT_NETMOD
:
return
L
"3 网络模块+工程主机"
;
case
HMT_GPRS
:
return
L
"4 GPRS主机"
;
case
HMT_LCD
:
return
L
"5 液晶主机"
;
case
HMT_WIRED
:
return
L
"6 网线主机"
;
case
HMT_TRUE_COLOR
:
return
L
"7 真彩主机"
;
case
HMT_3_SECTION
:
return
L
"8 三区段主机"
;
case
HMT_IOT
:
return
L
"9 物联卡主机"
;
case
HMT_GPRS_PHONE
:
return
L
"10 GPRS主机能打电话"
;
case
HMT_NB
:
return
L
"11 NB报警接收主机"
;
default:
return
L
"未知主机"
;
case
HMT_WIFI
:
return
"0 WiFi主机"
;
case
HMT_CAMERA
:
return
"1 摄像头主机"
;
case
HMT_GPRS_IOT
:
return
"2 简化的物联卡主机"
;
case
HMT_NETMOD
:
return
"3 网络模块+工程主机"
;
case
HMT_GPRS
:
return
"4 GPRS主机"
;
case
HMT_LCD
:
return
"5 液晶主机"
;
case
HMT_WIRED
:
return
"6 网线主机"
;
case
HMT_TRUE_COLOR
:
return
"7 真彩主机"
;
case
HMT_3_SECTION
:
return
"8 三区段主机"
;
case
HMT_IOT
:
return
"9 物联卡主机"
;
case
HMT_GPRS_PHONE
:
return
"10 GPRS主机能打电话"
;
case
HMT_NB
:
return
"11 NB报警接收主机"
;
default:
return
"未知主机"
;
}
}
...
...
@@ -1282,7 +1283,7 @@ const char* hbZonePropertyToString(HbZoneProperty zp)
case
HZP_GAS
:
return
"HZP_GAS"
;
case
HZP_WATER
:
return
"HZP_WATER"
;
case
HZP_SUB_MACHINE
:
return
"HZP_SUB_MACHINE"
;
case
HZP_REMOTE_CONTROL
:
return
"HZP_REMOTE_CONTRO
L
"
;
case
HZP_REMOTE_CONTROL
:
return
"HZP_REMOTE_CONTRO"
;
case
HZP_BUGLAR_HALF
:
return
"HZP_BUGLAR_HALF"
;
case
HZP_SHIELD
:
return
"HZP_SHIELD"
;
case
HZP_DOOR_RING
:
return
"HZP_DOOR_RING"
;
...
...
@@ -1295,26 +1296,26 @@ const char* hbZonePropertyToString(HbZoneProperty zp)
}
}
const
wchar_t
*
hbZonePropertyToStringChinese
(
HbZoneProperty
zp
)
const
char
*
hbZonePropertyToStringChinese
(
HbZoneProperty
zp
)
{
switch
(
zp
)
{
case
HZP_BUGLAR
:
return
L
"匪警全局"
;
case
HZP_EMERGENCY
:
return
L
"匪警紧急"
;
case
HZP_FIRE
:
return
L
"火警防区"
;
case
HZP_DURESS
:
return
L
"胁迫防区"
;
case
HZP_GAS
:
return
L
"燃气防区"
;
case
HZP_WATER
:
return
L
"淹水防区"
;
case
HZP_SUB_MACHINE
:
return
L
"分机"
;
case
HZP_REMOTE_CONTROL
:
return
L
"遥控器"
;
case
HZP_BUGLAR_HALF
:
return
L
"匪警半局"
;
case
HZP_SHIELD
:
return
L
"屏蔽防区"
;
case
HZP_DOOR_RING
:
return
L
"门铃防区"
;
case
HZP_RESERVED_0B
:
return
L
"保留"
;
case
HZP_RESERVED_0C
:
return
L
"保留"
;
case
HZP_RESERVED_0D
:
return
L
"保留"
;
case
HZP_RESERVED_0E
:
return
L
"保留"
;
case
HZP_BYPASS
:
return
L
"旁路防区"
;
default:
return
L
"无效属性"
;
case
HZP_BUGLAR
:
return
"匪警全局"
;
case
HZP_EMERGENCY
:
return
"匪警紧急"
;
case
HZP_FIRE
:
return
"火警防区"
;
case
HZP_DURESS
:
return
"胁迫防区"
;
case
HZP_GAS
:
return
"燃气防区"
;
case
HZP_WATER
:
return
"淹水防区"
;
case
HZP_SUB_MACHINE
:
return
"分机"
;
case
HZP_REMOTE_CONTROL
:
return
"遥控器"
;
case
HZP_BUGLAR_HALF
:
return
"匪警半局"
;
case
HZP_SHIELD
:
return
"屏蔽防区"
;
case
HZP_DOOR_RING
:
return
"门铃防区"
;
case
HZP_RESERVED_0B
:
return
"保留"
;
case
HZP_RESERVED_0C
:
return
"保留"
;
case
HZP_RESERVED_0D
:
return
"保留"
;
case
HZP_RESERVED_0E
:
return
"保留"
;
case
HZP_BYPASS
:
return
"旁路防区"
;
default:
return
"无效属性"
;
}
}
...
...
@@ -1326,14 +1327,6 @@ const char* hbGetZoneFormatString(HbMachineType type)
else
{
return
"%d"
;
}
}
const
wchar_t
*
hbGetZoneFormatStringW
(
HbMachineType
type
)
{
uint16_t
zone
=
hbZoneMax
(
type
);
if
(
10
<
zone
&&
zone
<
100
)
{
return
L"%02d"
;
}
else
if
(
zone
<
1000
)
{
return
L"%03d"
;
}
else
{
return
L"%d"
;
}
}
void
hbSum
(
uint8_t
*
data
,
int
len
)
{
uint8_t
sum
=
0
;
...
...
@@ -1748,10 +1741,10 @@ int hbHiLoArrayToDecStr(char* str, const uint8_t* arr, int len)
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
char
c
=
(
arr
[
i
]
>>
4
)
&
0x0F
;
if
(
c
>
9
)
{
return
p
-
str
;
}
*
p
++
=
c
;
*
p
++
=
c
+
'0'
;
c
=
(
arr
[
i
]
&
0x0F
);
if
(
c
>
9
)
{
return
p
-
str
;
}
*
p
++
=
c
;
*
p
++
=
c
+
'0'
;
}
return
p
-
str
;
}
...
...
@@ -1761,7 +1754,7 @@ int hbDecStrToHiLoArray(uint8_t* arr, int len, const char* str)
uint8_t
*
p
=
arr
;
int
slen
=
strlen
(
str
);
if
(
slen
>
len
*
2
)
{
return
0
;
slen
=
len
*
2
;
}
for
(
int
i
=
0
;
i
<
slen
;
i
+=
2
)
{
char
hi
=
str
[
i
];
...
...
@@ -1791,7 +1784,7 @@ int hbDecStrToHiLoArray(uint8_t* arr, int len, const char* str)
static
uint8_t
hex2char
(
uint8_t
h
)
{
h
&=
0x0F
;
if
(
h
>
9
)
{
return
'A'
+
h
;
return
'A'
+
h
-
10
;
}
else
{
return
'0'
+
h
;
}
...
...
@@ -1812,9 +1805,9 @@ static uint8_t char2hex(uint8_t c) {
if
(
'0'
<=
c
&&
c
<=
'9'
)
{
return
c
-
'0'
;
}
else
if
(
'A'
<=
c
&&
c
<=
'F'
)
{
return
c
-
'A'
;
return
c
-
'A'
+
10
;
}
else
if
(
'a'
<=
c
&&
c
<=
'f'
)
{
return
c
-
'a'
;
return
c
-
'a'
+
10
;
}
else
{
return
0xFF
;
}
...
...
@@ -1844,4 +1837,27 @@ int hbHexStrToArray(uint8_t* arr, const char* str, uint8_t padding)
return
p
-
arr
;
}
int
hbHexStrToArrayN
(
uint8_t
*
arr
,
const
char
*
str
,
int
len
,
uint8_t
padding
)
{
uint8_t
*
p
=
arr
;
uint8_t
hi
=
0
,
lo
=
0
;
padding
&=
0x0F
;
for
(
int
i
=
0
;
i
<
len
/
2
;
i
++
)
{
char
c
=
str
[
i
*
2
];
if
((
hi
=
char2hex
(
c
))
==
0xFF
)
{
return
0
;
}
if
(
i
*
2
+
1
<
len
)
{
c
=
str
[
i
*
2
+
1
];
if
((
lo
=
char2hex
(
c
))
==
0xFF
)
{
return
0
;
}
}
else
{
lo
=
padding
;
}
*
p
++
=
((
hi
<<
4
)
&
0xF0
)
|
(
lo
&
0x0F
);
}
return
p
-
arr
;
}
c/ademco.h
View file @
86ccd9a5
...
...
@@ -43,10 +43,10 @@ extern "C" {
#define ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN 2 // 空data段[]长度
#define ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN 21 // 非空data段长度,acct长度6
#define ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN_MAX 64 // 非空data段长度,acct长度未知
#define ADEMCO_PACKET_MAX_LEN
1024
#define ADEMCO_PACKET_MAX_LEN
512
#define CONGWIN_FE100_PACKET_LEN 31 // 丛文FE100协议长度
#define ADEMCO_PACKET_TIMESTAMP_LEN 20
#define ADEMCO_PACKET_XDATA_MAX_LEN
256
#define ADEMCO_PACKET_XDATA_MAX_LEN
128
// Prototypes
typedef
uint32_t
AdemcoId
;
...
...
@@ -362,7 +362,7 @@ ADEMCO_EXPORT_SYMBOL AdemcoEventLevel ademcoGetEventLevel(AdemcoEvent ademcoEven
//! 获取异常恢复事件所对应的异常事件
ADEMCO_EXPORT_SYMBOL
AdemcoEvent
ademcoGetExceptionEventByResumeEvent
(
AdemcoEvent
resumeEvent
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoEventToString
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
const
wchar_t
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
int
ademcoAppendDataSegment
(
uint8_t
*
packet
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
);
ADEMCO_EXPORT_SYMBOL
int
ademcoAppendDataSegment2
(
AdemcoDataSegment
*
dataSegment
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
);
...
...
@@ -379,11 +379,11 @@ ADEMCO_EXPORT_SYMBOL AdemcoPacketId getAdemcoId(const char* id, int len);
/*
* ademcoMake*Packet functions
* call with buff = NULL or len < length needed, will return length needed.
* if buff != NULL and len >= length needed, return length needed and copy data to buff
* otherwise return 0 for fail
* if buff != NULL and len >= length needed, return length used and copy data to buff
* otherwise return 0
*/
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeEmptyDataPacket
(
uint8_t
*
dst_buff
,
int
len
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeNullPacket
(
uint8_t
*
buff
,
int
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeAckPacket
(
uint8_t
*
buff
,
int
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeNakPacket
(
uint8_t
*
buff
,
int
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
...
...
@@ -756,11 +756,10 @@ ADEMCO_EXPORT_SYMBOL AdemcoEvent hbMachineTypeToAdemcoEvent(HbMachineType type);
ADEMCO_EXPORT_SYMBOL
HbMachineType
hbMachineTypeFromAdemcoEvent
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
AdemcoEvent
hbZonePropertyToAdemcoEvent
(
HbZoneProperty
zp
);
ADEMCO_EXPORT_SYMBOL
const
char
*
hbMachineTypeToString
(
HbMachineType
type
);
ADEMCO_EXPORT_SYMBOL
const
wchar_t
*
hbMachineTypeToStringChinese
(
HbMachineType
type
);
ADEMCO_EXPORT_SYMBOL
const
char
*
hbMachineTypeToStringChinese
(
HbMachineType
type
);
ADEMCO_EXPORT_SYMBOL
const
char
*
hbZonePropertyToString
(
HbZoneProperty
zp
);
ADEMCO_EXPORT_SYMBOL
const
wchar_t
*
hbZonePropertyToStringChinese
(
HbZoneProperty
zp
);
ADEMCO_EXPORT_SYMBOL
const
char
*
hbZonePropertyToStringChinese
(
HbZoneProperty
zp
);
ADEMCO_EXPORT_SYMBOL
const
char
*
hbGetZoneFormatString
(
HbMachineType
type
);
ADEMCO_EXPORT_SYMBOL
const
wchar_t
*
hbGetZoneFormatStringW
(
HbMachineType
type
);
// 累加校验,计算data[0] ~ data[len-2],校验和放在data[len-1]
ADEMCO_EXPORT_SYMBOL
void
hbSum
(
uint8_t
*
data
,
int
len
);
...
...
@@ -807,25 +806,45 @@ ADEMCO_EXPORT_SYMBOL void hbComMakeRespB1_get3SectionMachineStatus(HbComData* da
HbMachineStatus
statusSec1
,
HbMachineStatus
statusSec2
,
HbMachineStatus
statusSec3
);
ADEMCO_EXPORT_SYMBOL
void
hbComDataToAdemcoXData
(
const
HbComData
*
const
data
,
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
);
// 将一串以高低字节表示的十六进制数组转换为10进制数字符串,遇0xf或非'0'~'9'字符停止,返回字符串长度
// 将一串以高低字节表示的十六进制数组转换为10进制数字符串
// 每个字节的高四位和低四位若不大于9,将该四位表示的数字以10进制ascii码填入str,否则停止
// 返回字符串长度
// 注意:函数不会在str末尾补 null terminator
// 调用者应确保str有足够空间,至少len的2倍,否则会崩溃
// 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101"
ADEMCO_EXPORT_SYMBOL
int
hbHiLoArrayToDecStr
(
char
*
str
,
const
uint8_t
*
arr
,
int
len
);
// 将一个10进制数字符串转为高低字节表示的数组,节省空间,转换后的长度若不满len,则以0xF补满。str长度不能大于len * 2
// 将一个10进制数字符串转为高低字节表示的数组,节省空间
// str应只包含'0'~'9',否则失败返回0
// str长度若大于len * 2,str[len*]及之后的内容将被舍弃以避免溢出
// 转换后的长度若不满len,则以0xF补满。
// 示例:输入字符串"123ABC",返回0
// 示例:输入字符串 "18240888101", len=9, 则arr内容为 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff, return 9
//
输入字符串 "12345678901234567890", len=9, 则失败返回0
//
示例:输入字符串 "12345678901234567890", len=9, 则arr内容为 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff, return 9
ADEMCO_EXPORT_SYMBOL
int
hbDecStrToHiLoArray
(
uint8_t
*
arr
,
int
len
,
const
char
*
str
);
// 将一串字节流转换为可打印形式
// 示例:输入 arr=[0xEB 0xBA 0x3F], len=3, 输出str = "EBBA3F"
// 返回str长度(len * 2)
// 调用者应确保str有足够的容量,至少len*2
// 注意:函数不会在str末尾补 null terminator
// 示例:输入 arr=[0xEB 0xBA 0x3F], len=3, 则str = "EBBA3F",返回6
// 示例:输入 ary="123", len=3, 则str = "313233",返回6
ADEMCO_EXPORT_SYMBOL
int
hbHexArrayToStr
(
char
*
str
,
const
uint8_t
*
arr
,
int
len
);
// 将一串字符串(内容为'0'~'9', 'A'~'F')转为字节流,若strlen(str)为奇数,以padding补足arr, padding 应 <= 0x0F
// 将一串字符串(内容为'0'~'9', 'A'~'F', 'a' ~'f')转为字节流
// 若strlen(str)为奇数,以padding补足arr, padding 应 <= 0x0F
// 若str内包含非hex字符串,返回0
// 示例:输入字符串str="EBBA3F", 输出arr = [0xEB, 0xBA, 0x3F],返回 strlen(str) / 2
// 调用者应确保arr有足够的容量,至少strlen(str)*2
// 示例:输入字符串str="EBBA3F", 输出arr = [0xEB, 0xBA, 0x3F],返回 3
// 示例:输入字符串str="ABC", padding = 0, 输出arr=[0xAB, 0xC0],返回2
// 示例:输入字符串str="ABC", padding = 0x0F, 输出arr=[0xAB, 0xCF],返回2
// caller should make sure arr has enough space (strlen(str) / 2) to store result
ADEMCO_EXPORT_SYMBOL
int
hbHexStrToArray
(
uint8_t
*
arr
,
const
char
*
str
,
uint8_t
padding
);
// 功能同hbHexStrToArray
// 若strlen(str) > len, str[len]及之后的内容将被舍弃以避免溢出
// 示例:输入字符串str="ABCDE", len = 2 padding = 0x0F, 输出arr=[0xAB, 0xCD], return 2
ADEMCO_EXPORT_SYMBOL
int
hbHexStrToArrayN
(
uint8_t
*
arr
,
const
char
*
str
,
int
len
,
uint8_t
padding
);
#ifdef __cplusplus
}
#endif
...
...
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