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
a3a5c39f
Commit
a3a5c39f
authored
Jun 22, 2022
by
captainwong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
86ccd9a5
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
62 additions
and
23 deletions
+62
-23
ademco.c
c/ademco.c
+52
-19
ademco.h
c/ademco.h
+10
-4
No files found.
c/ademco.c
View file @
a3a5c39f
...
@@ -273,7 +273,7 @@ const char* ademcoEventToStringChinese(AdemcoEvent ademcoEvent)
...
@@ -273,7 +273,7 @@ const char* ademcoEventToStringChinese(AdemcoEvent ademcoEvent)
}
}
}
}
uint16_t
ademcoCRC8
(
char
c
,
uint16_t
crc
)
uint16_t
ademcoCRC8
(
uint8_t
c
,
uint16_t
crc
)
{
{
static
const
uint16_t
crcTable
[]
=
{
static
const
uint16_t
crcTable
[]
=
{
/* DEFINE THE FIRST ORDER POLYINOMIAL TABLE */
/* DEFINE THE FIRST ORDER POLYINOMIAL TABLE */
...
@@ -560,14 +560,12 @@ int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf, Adem
...
@@ -560,14 +560,12 @@ int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf, Adem
}
}
}
}
int
isAdemcoId
(
const
char
*
standard
,
const
char
*
id
,
int
len
)
int
isAdemco
Packet
Id
(
const
char
*
standard
,
const
char
*
id
,
int
len
)
{
{
return
strncmp
(
standard
,
id
,
strlen
(
standard
))
==
0
;
return
strncmp
(
standard
,
id
,
strlen
(
standard
))
==
0
;
}
}
AdemcoPacketId
getAdemcoId
(
const
char
*
id
,
int
len
)
static
const
char
*
const
ids
[
AID_COUNT
]
=
{
{
static
const
char
*
const
ids
[
AID_COUNT
]
=
{
ADEMCO_PACKET_ID_NULL
,
ADEMCO_PACKET_ID_NULL
,
ADEMCO_PACKET_ID_ACK
,
ADEMCO_PACKET_ID_ACK
,
ADEMCO_PACKET_ID_NAK
,
ADEMCO_PACKET_ID_NAK
,
...
@@ -576,10 +574,12 @@ AdemcoPacketId getAdemcoId(const char* id, int len)
...
@@ -576,10 +574,12 @@ AdemcoPacketId getAdemcoId(const char* id, int len)
ADEMCO_PACKET_ID_ADM_CID
,
ADEMCO_PACKET_ID_ADM_CID
,
ADEMCO_PACKET_ID_MOD_REG
,
ADEMCO_PACKET_ID_MOD_REG
,
ADEMCO_PACKET_ID_REG_RSP
,
ADEMCO_PACKET_ID_REG_RSP
,
};
};
AdemcoPacketId
getAdemcoPacketId
(
const
char
*
id
,
int
len
)
{
for
(
int
i
=
0
;
i
<
AID_COUNT
;
i
++
)
{
for
(
int
i
=
0
;
i
<
AID_COUNT
;
i
++
)
{
if
(
isAdemcoId
(
ids
[
i
],
id
,
len
))
{
if
(
isAdemco
Packet
Id
(
ids
[
i
],
id
,
len
))
{
return
(
AdemcoPacketId
)(
i
);
return
(
AdemcoPacketId
)(
i
);
}
}
}
}
...
@@ -587,6 +587,15 @@ AdemcoPacketId getAdemcoId(const char* id, int len)
...
@@ -587,6 +587,15 @@ AdemcoPacketId getAdemcoId(const char* id, int len)
return
AID_INVALID
;
return
AID_INVALID
;
}
}
const
char
*
admecoPacketIdToString
(
AdemcoPacketId
id
)
{
if
(
0
<=
id
&&
id
<
AID_COUNT
)
{
return
ids
[
id
];
}
else
{
return
""
;
}
}
static
void
getNowTimestamp
(
char
*
buff
)
static
void
getNowTimestamp
(
char
*
buff
)
{
{
time_t
now
=
time
(
NULL
);
time_t
now
=
time
(
NULL
);
...
@@ -812,7 +821,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
...
@@ -812,7 +821,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
p
=
pid
+
1
;
p
=
pid
+
1
;
while
(
p
<
pcr
&&
*
p
!=
'\"'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
'\"'
)
{
p
++
;
}
if
(
p
>=
pcr
||
*
p
!=
'\"'
)
{
break
;
}
if
(
p
>=
pcr
||
*
p
!=
'\"'
)
{
break
;
}
pkt
->
id
=
getAdemcoId
((
const
char
*
)
pid
,
++
p
-
pid
);
pkt
->
id
=
getAdemco
Packet
Id
((
const
char
*
)
pid
,
++
p
-
pid
);
if
(
pkt
->
id
==
AID_INVALID
)
{
break
;
}
if
(
pkt
->
id
==
AID_INVALID
)
{
break
;
}
// seq
// seq
...
@@ -929,57 +938,58 @@ int hbGetAvailableZoneProperties(HbMachineType type, HbZoneProperty props[12])
...
@@ -929,57 +938,58 @@ int hbGetAvailableZoneProperties(HbMachineType type, HbZoneProperty props[12])
case
HMT_GPRS
:
case
HMT_GPRS
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
)
);
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_NETMOD
:
case
HMT_NETMOD
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_SUB_MACHINE
,
HZP_REMOTE_CONTROL
,
HZP_BUGLAR_HALF
,
HZP_SHIELD
,
HZP_DOOR_RING
,
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_SUB_MACHINE
,
HZP_REMOTE_CONTROL
,
HZP_BUGLAR_HALF
,
HZP_SHIELD
,
HZP_DOOR_RING
,
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
)
);
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_LCD
:
case
HMT_LCD
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_SUB_MACHINE
,
HZP_REMOTE_CONTROL
,
HZP_BUGLAR_HALF
,
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_SUB_MACHINE
,
HZP_REMOTE_CONTROL
,
HZP_BUGLAR_HALF
,
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
)
);
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_WIRED
:
case
HMT_WIRED
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
)
);
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_TRUE_COLOR
:
case
HMT_TRUE_COLOR
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
)
);
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_3_SECTION
:
case
HMT_3_SECTION
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
)
);
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_IOT
:
case
HMT_IOT
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
)
);
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_GPRS_PHONE
:
case
HMT_GPRS_PHONE
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
)
);
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_NB
:
case
HMT_NB
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_DOOR_RING
,
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_DOOR_RING
,
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
)
);
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
default:
return
0
;
}
}
return
0
;
return
0
;
}
}
...
@@ -1102,8 +1112,8 @@ AdemcoZone hbWiredZoneMin(HbMachineType type)
...
@@ -1102,8 +1112,8 @@ AdemcoZone hbWiredZoneMin(HbMachineType type)
case
HMT_NETMOD
:
return
1
;
case
HMT_NETMOD
:
return
1
;
case
HMT_TRUE_COLOR
:
return
1
;
case
HMT_TRUE_COLOR
:
return
1
;
case
HMT_3_SECTION
:
return
61
;
case
HMT_3_SECTION
:
return
61
;
default:
return
0
;
}
}
return
0
;
}
}
AdemcoZone
hbWiredZoneMax
(
HbMachineType
type
)
AdemcoZone
hbWiredZoneMax
(
HbMachineType
type
)
...
@@ -1112,8 +1122,8 @@ AdemcoZone hbWiredZoneMax(HbMachineType type)
...
@@ -1112,8 +1122,8 @@ AdemcoZone hbWiredZoneMax(HbMachineType type)
case
HMT_NETMOD
:
return
8
;
case
HMT_NETMOD
:
return
8
;
case
HMT_TRUE_COLOR
:
return
8
;
case
HMT_TRUE_COLOR
:
return
8
;
case
HMT_3_SECTION
:
return
68
;
case
HMT_3_SECTION
:
return
68
;
default:
return
0
;
}
}
return
0
;
}
}
int
hbMachineCanDirectlyWriteZone
(
HbMachineType
type
)
int
hbMachineCanDirectlyWriteZone
(
HbMachineType
type
)
...
@@ -1860,4 +1870,27 @@ int hbHexStrToArrayN(uint8_t* arr, const char* str, int len, uint8_t padding)
...
@@ -1860,4 +1870,27 @@ int hbHexStrToArrayN(uint8_t* arr, const char* str, int len, uint8_t padding)
return
p
-
arr
;
return
p
-
arr
;
}
}
int
hbHexStrToArrayN_allow_non_hex_str
(
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
)
{
hi
=
padding
;
}
if
(
i
*
2
+
1
<
len
)
{
c
=
str
[
i
*
2
+
1
];
if
((
lo
=
char2hex
(
c
))
==
0xFF
)
{
lo
=
padding
;
}
}
else
{
lo
=
padding
;
}
*
p
++
=
((
hi
<<
4
)
&
0xF0
)
|
(
lo
&
0x0F
);
}
return
p
-
arr
;
}
c/ademco.h
View file @
a3a5c39f
...
@@ -374,8 +374,9 @@ ADEMCO_EXPORT_SYMBOL int ademcoXDataGetValidContentLen(const AdemcoXDataSegment*
...
@@ -374,8 +374,9 @@ ADEMCO_EXPORT_SYMBOL int ademcoXDataGetValidContentLen(const AdemcoXDataSegment*
// return ADEMCO_OK for success, return ADEMCO_ERR for len is too long
// return ADEMCO_OK for success, return ADEMCO_ERR for len is too long
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
,
const
uint8_t
*
content
,
int
len
);
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
,
const
uint8_t
*
content
,
int
len
);
ADEMCO_EXPORT_SYMBOL
int
isAdemcoId
(
const
char
*
standard
,
const
char
*
id
,
int
len
);
ADEMCO_EXPORT_SYMBOL
int
isAdemcoPacketId
(
const
char
*
standard
,
const
char
*
id
,
int
len
);
ADEMCO_EXPORT_SYMBOL
AdemcoPacketId
getAdemcoId
(
const
char
*
id
,
int
len
);
ADEMCO_EXPORT_SYMBOL
AdemcoPacketId
getAdemcoPacketId
(
const
char
*
id
,
int
len
);
ADEMCO_EXPORT_SYMBOL
const
char
*
admecoPacketIdToString
(
AdemcoPacketId
id
);
/*
/*
* ademcoMake*Packet functions
* ademcoMake*Packet functions
...
@@ -399,7 +400,7 @@ ADEMCO_EXPORT_SYMBOL int ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq, co
...
@@ -399,7 +400,7 @@ ADEMCO_EXPORT_SYMBOL int ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq, co
ADEMCO_EXPORT_SYMBOL
AdemcoParseResult
ademcoPacketParse
(
const
uint8_t
*
buff
,
int
len
,
AdemcoPacket
*
pkt
,
int
*
cb_commited
);
ADEMCO_EXPORT_SYMBOL
AdemcoParseResult
ademcoPacketParse
(
const
uint8_t
*
buff
,
int
len
,
AdemcoPacket
*
pkt
,
int
*
cb_commited
);
ADEMCO_EXPORT_SYMBOL
uint16_t
ademcoCRC8
(
char
c
,
uint16_t
crc
);
ADEMCO_EXPORT_SYMBOL
uint16_t
ademcoCRC8
(
uint8_t
c
,
uint16_t
crc
);
ADEMCO_EXPORT_SYMBOL
uint16_t
ademcoCRC16
(
const
uint8_t
*
buff
,
int
len
,
uint16_t
crc
);
ADEMCO_EXPORT_SYMBOL
uint16_t
ademcoCRC16
(
const
uint8_t
*
buff
,
int
len
,
uint16_t
crc
);
...
@@ -842,9 +843,14 @@ ADEMCO_EXPORT_SYMBOL int hbHexStrToArray(uint8_t* arr, const char* str, uint8_t
...
@@ -842,9 +843,14 @@ ADEMCO_EXPORT_SYMBOL int hbHexStrToArray(uint8_t* arr, const char* str, uint8_t
// 功能同hbHexStrToArray
// 功能同hbHexStrToArray
// 若strlen(str) > len, str[len]及之后的内容将被舍弃以避免溢出
// 若strlen(str) > len, str[len]及之后的内容将被舍弃以避免溢出
// 示例:输入字符串str="ABCDE", len =
2
padding = 0x0F, 输出arr=[0xAB, 0xCD], return 2
// 示例:输入字符串str="ABCDE", len =
4
padding = 0x0F, 输出arr=[0xAB, 0xCD], return 2
ADEMCO_EXPORT_SYMBOL
int
hbHexStrToArrayN
(
uint8_t
*
arr
,
const
char
*
str
,
int
len
,
uint8_t
padding
);
ADEMCO_EXPORT_SYMBOL
int
hbHexStrToArrayN
(
uint8_t
*
arr
,
const
char
*
str
,
int
len
,
uint8_t
padding
);
// 同hbHexStrToArrayN,但允许str包含非hex字符,即'0'~'9','a'~'f','A'~'F'之外的内容,以 padding 替换
// 示例:str="AB\xFFD", len=4, padding=0x0F, 则arr=[ 0xAB, 0xFD ], return 2
// 网线主机 0d 00 命令,接警中心账号部分,有可能是这种
ADEMCO_EXPORT_SYMBOL
int
hbHexStrToArrayN_allow_non_hex_str
(
uint8_t
*
arr
,
const
char
*
str
,
int
len
,
uint8_t
padding
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
#endif
#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