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
ef8c2dff
Commit
ef8c2dff
authored
Jun 16, 2022
by
captainwong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
test c dll with direct macchine ok
parent
03661efb
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
192 additions
and
40 deletions
+192
-40
ademco.c
c/ademco.c
+160
-34
ademco.h
c/ademco.h
+30
-4
ademco.vcxproj
examples/ademco/ademco.vcxproj
+1
-1
ademco.vcxproj.filters
examples/ademco/ademco.vcxproj.filters
+1
-1
dllmain.c
examples/ademco/dllmain.c
+0
-0
No files found.
c/ademco.c
View file @
ef8c2dff
...
...
@@ -324,20 +324,10 @@ uint16_t ademcoCRC16(const uint8_t* buff, int len, uint16_t crc)
return
CRC
;
}
int
ademcoAppendDataSegment
(
uint8_t
*
packet
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
)
{
AdemcoDataSegment
dataSegment
;
dataSegment
.
ademcoId
=
ademcoId
;
dataSegment
.
ademcoEvent
=
ademcoEvent
;
dataSegment
.
gg
=
gg
;
dataSegment
.
zone
=
zone
;
return
ademcoAppendDataSegment2
(
packet
,
&
dataSegment
);
}
int
ademcoAppendDataSegment2
(
uint8_t
*
buff
,
const
AdemcoDataSegment
*
dataSegment
)
int
ademcoAppendDataSegment
(
uint8_t
*
buff
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
)
{
char
*
p
=
buff
;
if
(
dataSegment
->
ademcoEvent
==
EVENT_INVALID_EVENT
)
{
if
(
ademcoEvent
==
EVENT_INVALID_EVENT
)
{
*
p
++
=
'['
;
*
p
++
=
']'
;
return
ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN
;
...
...
@@ -345,40 +335,51 @@ int ademcoAppendDataSegment2(uint8_t* buff, const AdemcoDataSegment* dataSegment
*
p
++
=
'['
;
*
p
++
=
'#'
;
snprintf
(
p
,
6
+
1
,
"%06X"
,
dataSegment
->
ademcoId
%
ADEMCO_ID_SENTINEL
);
snprintf
(
p
,
6
+
1
,
"%06X"
,
ademcoId
%
ADEMCO_ID_SENTINEL
);
p
+=
6
;
*
p
++
=
'|'
;
snprintf
(
p
,
4
+
1
,
"%04d"
,
dataSegment
->
ademcoEvent
%
ADEMCO_EVENT_SENTINEL
);
snprintf
(
p
,
4
+
1
,
"%04d"
,
ademcoEvent
%
ADEMCO_EVENT_SENTINEL
);
p
+=
4
;
*
p
++
=
' '
;
if
(
dataSegment
->
gg
==
0xEE
)
{
if
(
gg
==
0xEE
)
{
*
p
++
=
'E'
;
*
p
++
=
'E'
;
}
else
if
(
dataSegment
->
gg
==
0xCC
)
{
}
else
if
(
gg
==
0xCC
)
{
*
p
++
=
'C'
;
*
p
++
=
'C'
;
}
else
{
*
p
++
=
((
dataSegment
->
gg
/
10
)
&
0x0F
)
+
'0'
;
*
p
++
=
((
dataSegment
->
gg
%
10
)
&
0x0F
)
+
'0'
;
*
p
++
=
((
gg
/
10
)
&
0x0F
)
+
'0'
;
*
p
++
=
((
gg
%
10
)
&
0x0F
)
+
'0'
;
}
*
p
++
=
' '
;
snprintf
(
p
,
3
+
1
,
"%03d"
,
dataSegment
->
zone
%
ADEMCO_ZONE_SENTINEL
);
snprintf
(
p
,
3
+
1
,
"%03d"
,
zone
%
ADEMCO_ZONE_SENTINEL
);
p
+=
3
;
*
p
++
=
']'
;
assert
(
p
-
buff
==
ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN
);
*
p
++
=
'\0'
;
// for debug convenience
return
ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN
;
}
}
int
ademcoAppendDataSegment2
(
AdemcoDataSegment
*
dataSegment
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
)
{
dataSegment
->
ademcoId
=
ademcoId
;
dataSegment
->
ademcoEvent
=
ademcoEvent
;
dataSegment
->
gg
=
gg
;
dataSegment
->
zone
=
zone
;
return
dataSegment
->
raw_len
=
ademcoAppendDataSegment
(
dataSegment
->
raw
,
ademcoId
,
ademcoEvent
,
gg
,
zone
);
}
AdemcoParseResult
ademcoParseDataSegment
(
const
uint8_t
*
packet
,
int
packet_len
,
AdemcoDataSegment
*
dataSegment
)
{
if
(
packet_len
==
ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN
&&
packet
[
0
]
==
'['
&&
packet
[
1
]
==
']'
)
{
...
...
@@ -515,28 +516,42 @@ int ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata)
}
}
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
const
uint8_t
*
content
,
int
len
)
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
,
const
uint8_t
*
content
,
int
len
)
{
uint8_t
transformed
[
ADEMCO_PACKET_XDATA_MAX_LEN
];
int
translen
=
len
;
if
(
xtr
==
AdemcoXDataTransform_as_is
)
{
memcpy
(
transformed
,
content
,
len
);
}
else
{
if
(
len
*
2
<
ADEMCO_PACKET_XDATA_MAX_LEN
)
{
translen
=
hbHexArrayToStr
((
char
*
)
transformed
,
content
,
len
);
}
else
{
return
ADEMCO_ERR
;
}
}
xdata
->
lenghFormat
=
xlf
;
if
(
xlf
==
TWO_HEX
&&
len
+
4
<
ADEMCO_PACKET_XDATA_MAX_LEN
)
{
if
(
xlf
==
TWO_HEX
&&
trans
len
+
4
<
ADEMCO_PACKET_XDATA_MAX_LEN
)
{
uint8_t
*
p
=
xdata
->
raw
;
*
p
++
=
'['
;
*
p
++
=
(
len
&
0xFFFF
)
>>
8
;
*
p
++
=
(
len
&
0xFFFF
)
&
0xFF
;
memcpy
(
p
,
content
,
len
);
p
+=
len
;
*
p
++
=
(
trans
len
&
0xFFFF
)
>>
8
;
*
p
++
=
(
trans
len
&
0xFFFF
)
&
0xFF
;
memcpy
(
p
,
transformed
,
trans
len
);
p
+=
trans
len
;
*
p
++
=
']'
;
xdata
->
raw_len
=
p
-
xdata
->
raw
;
return
ADEMCO_OK
;
}
else
if
(
xlf
==
FOUR_DECIMAL
&&
len
+
6
<
ADEMCO_PACKET_XDATA_MAX_LEN
)
{
}
else
if
(
xlf
==
FOUR_DECIMAL
&&
trans
len
+
6
<
ADEMCO_PACKET_XDATA_MAX_LEN
)
{
uint8_t
*
p
=
xdata
->
raw
;
*
p
++
=
'['
;
char
temp
[
5
];
sprintf
(
temp
,
"%04d"
,
len
&
0xFFFF
);
sprintf
(
temp
,
"%04d"
,
trans
len
&
0xFFFF
);
memcpy
(
p
,
temp
,
4
);
p
+=
4
;
memcpy
(
p
,
content
,
len
);
p
+=
len
;
memcpy
(
p
,
transformed
,
trans
len
);
p
+=
trans
len
;
*
p
++
=
']'
;
xdata
->
raw_len
=
p
-
xdata
->
raw
;
return
ADEMCO_OK
;
}
else
{
return
ADEMCO_ERR
;
...
...
@@ -700,6 +715,55 @@ int ademcoMakeHbPacket(uint8_t* dst_buff, int len, uint16_t seq, const char* acc
return
0
;
}
static
void
copyAcct2AdemcoPacket
(
AdemcoPacket
*
pkt
,
const
char
*
acct
)
{
int
len
=
strlen
(
acct
);
if
(
len
>
ADEMCO_PACKET_ACCT_MAX_LEN
)
{
len
=
ADEMCO_PACKET_ACCT_MAX_LEN
;
}
memcpy
(
pkt
->
acct
,
acct
,
len
);
pkt
->
acct
[
len
]
=
'\0'
;
}
int
ademcoMakeNullPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
pkt
->
data
.
ademcoId
=
ademcoId
;
return
pkt
->
raw_len
=
ademcoMakeNullPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
);
}
int
ademcoMakeAckPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
pkt
->
data
.
ademcoId
=
ademcoId
;
return
pkt
->
raw_len
=
ademcoMakeAckPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
);
}
int
ademcoMakeNakPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
pkt
->
data
.
ademcoId
=
ademcoId
;
return
pkt
->
raw_len
=
ademcoMakeNakPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
);
}
int
ademcoMakeHbPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
AdemcoXDataSegment
*
xdata
)
{
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
ademcoAppendDataSegment2
(
&
pkt
->
data
,
ademcoId
,
ademcoEvent
,
gg
,
zone
);
if
(
xdata
&&
xdata
->
raw_len
>
0
)
{
pkt
->
xdata
.
lenghFormat
=
xdata
->
lenghFormat
;
memcpy
(
pkt
->
xdata
.
raw
,
xdata
->
raw
,
xdata
->
raw_len
);
pkt
->
xdata
.
raw_len
=
xdata
->
raw_len
;
}
else
{
memset
(
&
pkt
->
xdata
,
0
,
sizeof
(
*
xdata
));
}
return
pkt
->
raw_len
=
ademcoMakeHbPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
,
ademcoEvent
,
gg
,
zone
,
xdata
);
}
AdemcoParseResult
ademcoPacketParse
(
const
uint8_t
*
buff
,
int
len
,
AdemcoPacket
*
pkt
,
int
*
cb_commited
)
{
if
(
len
<
9
)
{
return
RESULT_NOT_ENOUGH
;
}
...
...
@@ -714,7 +778,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
// crc
memcpy
(
temp
,
p
,
4
);
temp
[
4
]
=
'\0'
;
uint16_t
crc
=
strtoul
(
temp
,
NULL
,
16
);
uint16_t
crc
=
strtoul
(
temp
,
NULL
,
16
)
&
0xFFFF
;
p
+=
4
;
// len
...
...
@@ -757,7 +821,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
while
(
p
<
pcr
&&
*
p
!=
'R'
&&
*
p
!=
'L'
)
{
p
++
;
}
if
(
p
-
pseq
!=
4
||
(
*
p
!=
'R'
&&
*
p
!=
'L'
))
{
break
;
}
memcpy
(
temp
,
pseq
,
4
);
temp
[
4
]
=
'\0'
;
pkt
->
seq
=
strtoul
(
temp
,
NULL
,
10
);
pkt
->
seq
=
strtoul
(
temp
,
NULL
,
10
)
&
0xFFFF
;
if
(
pkt
->
seq
>=
10000
)
{
pkt
->
seq
=
0
;
}
// *rrcvr
...
...
@@ -845,7 +909,8 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
}
if
(
p
++
!=
pcr
)
{
break
;
}
*
cb_commited
=
p
-
buff
;
pkt
->
raw_len
=
*
cb_commited
=
p
-
buff
;
memcpy
(
pkt
->
raw
,
buff
,
pkt
->
raw_len
);
return
RESULT_OK
;
}
while
(
0
);
...
...
@@ -1585,7 +1650,7 @@ void hbComMakeRespA2_getMachineZones(HbComData* data, int count, AdemcoZone* zon
*
p
++
=
props
[
i
];
}
*
p
++
=
(
count
>
0
)
?
p1
:
HbComResp_A2_p1_nomore
;
data
->
len
=
++
p
-
data
;
data
->
len
=
++
p
-
data
->
data
;
hbSum
(
data
->
data
,
data
->
len
);
}
...
...
@@ -1650,7 +1715,7 @@ void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* data, HbComResp_AD_p1 p
}
}
*
p
++
=
(
count
>
0
)
?
p2
:
HbComResp_AD_p2_nomore
;
data
->
len
=
++
p
-
data
;
data
->
len
=
++
p
-
data
->
data
;
hbSum
(
data
->
data
,
data
->
len
);
}
...
...
@@ -1672,6 +1737,11 @@ void hbComMakeRespB1_get3SectionMachineStatus(HbComData* data, HbMachineStatus s
hbSum
(
data
->
data
,
data
->
len
);
}
void
hbComDataToAdemcoXData
(
const
HbComData
*
const
data
,
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
)
{
ademcoMakeXData
(
xdata
,
xlf
,
xtr
,
data
->
data
,
data
->
len
);
}
int
hbHiLoArrayToDecStr
(
char
*
str
,
const
uint8_t
*
arr
,
int
len
)
{
char
*
p
=
str
;
...
...
@@ -1718,4 +1788,60 @@ int hbDecStrToHiLoArray(uint8_t* arr, int len, const char* str)
return
len
;
}
static
uint8_t
hex2char
(
uint8_t
h
)
{
h
&=
0x0F
;
if
(
h
>
9
)
{
return
'A'
+
h
;
}
else
{
return
'0'
+
h
;
}
}
int
hbHexArrayToStr
(
char
*
str
,
const
uint8_t
*
arr
,
int
len
)
{
uint8_t
c
=
0
;
char
*
p
=
str
;
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
*
p
++
=
hex2char
((
arr
[
i
]
>>
4
)
&
0x0F
);
*
p
++
=
hex2char
(
arr
[
i
]
&
0x0F
);
}
return
p
-
str
;
}
static
uint8_t
char2hex
(
uint8_t
c
)
{
if
(
'0'
<=
c
&&
c
<=
'9'
)
{
return
c
-
'0'
;
}
else
if
(
'A'
<=
c
&&
c
<=
'F'
)
{
return
c
-
'A'
;
}
else
if
(
'a'
<=
c
&&
c
<=
'f'
)
{
return
c
-
'a'
;
}
else
{
return
0xFF
;
}
}
int
hbHexStrToArray
(
uint8_t
*
arr
,
const
char
*
str
,
uint8_t
padding
)
{
uint8_t
*
p
=
arr
;
uint8_t
hi
=
0
,
lo
=
0
;
int
slen
=
strlen
(
str
);
padding
&=
0x0F
;
for
(
int
i
=
0
;
i
<
slen
/
2
;
i
++
)
{
char
c
=
str
[
i
*
2
];
if
((
hi
=
char2hex
(
c
))
==
0xFF
)
{
return
0
;
}
if
(
i
*
2
+
1
<
slen
)
{
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 @
ef8c2dff
/*
/*
* Ademco library
* captainwong
* 2022-6-13 rewrited this C version
...
...
@@ -295,6 +295,11 @@ typedef enum AdemcoXDataLengthFormat {
FOUR_DECIMAL
,
// 四个decimal char 表示长度
}
AdemcoXDataLengthFormat
;
typedef
enum
AdemcoXDataTransform
{
AdemcoXDataTransform_as_is
,
// 原样打包
AdemcoXDataTransform_to_ascii
,
// 转为ascii打包,如 0xEB 0xBA 打包为 "EBBA"
}
AdemcoXDataTransform
;
typedef
struct
AdemcoXDataSegment
{
AdemcoXDataLengthFormat
lenghFormat
;
uint8_t
raw
[
ADEMCO_PACKET_XDATA_MAX_LEN
];
...
...
@@ -338,6 +343,9 @@ typedef struct AdemcoPacket {
AdemcoDataSegment
data
;
AdemcoXDataSegment
xdata
;
time_t
timestamp
;
uint8_t
raw
[
ADEMCO_PACKET_MAX_LEN
];
int
raw_len
;
}
AdemcoPacket
;
...
...
@@ -357,14 +365,14 @@ ADEMCO_EXPORT_SYMBOL const char* ademcoEventToString(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL
const
wchar_t
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
int
ademcoAppendDataSegment
(
uint8_t
*
packet
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
);
ADEMCO_EXPORT_SYMBOL
int
ademcoAppendDataSegment2
(
uint8_t
*
packet
,
const
AdemcoDataSegment
*
dataSegment
);
ADEMCO_EXPORT_SYMBOL
int
ademcoAppendDataSegment2
(
AdemcoDataSegment
*
dataSegment
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
);
ADEMCO_EXPORT_SYMBOL
AdemcoParseResult
ademcoParseDataSegment
(
const
uint8_t
*
packet
,
int
packet_len
,
AdemcoDataSegment
*
dataSegment
);
// return 0 for empty packet, CONGWIN_FE100_PACKET_LEN for non-empty packet
ADEMCO_EXPORT_SYMBOL
int
ademcoDataSegmentToCongwinFe100
(
uint8_t
*
fe100
,
const
AdemcoDataSegment
*
dataSegment
);
ADEMCO_EXPORT_SYMBOL
const
uint8_t
*
ademcoXDataGetValidContentAddr
(
const
AdemcoXDataSegment
*
xdata
);
ADEMCO_EXPORT_SYMBOL
int
ademcoXDataGetValidContentLen
(
const
AdemcoXDataSegment
*
xdata
);
// return ADEMCO_OK for success, return ADEMCO_ERR for len is too long
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
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
AdemcoPacketId
getAdemcoId
(
const
char
*
id
,
int
len
);
...
...
@@ -382,6 +390,13 @@ ADEMCO_EXPORT_SYMBOL int ademcoMakeNakPacket(uint8_t* buff, int len, uint16_t se
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeHbPacket
(
uint8_t
*
buff
,
int
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
AdemcoXDataSegment
*
xdata
);
// like upper funcs, store buff and len to pkt->raw, pkt->raw_len
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeNullPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeAckPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeNakPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeHbPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
AdemcoXDataSegment
*
xdata
);
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
);
...
...
@@ -790,6 +805,7 @@ ADEMCO_EXPORT_SYMBOL void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* da
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespAF_set3SectionMachineStatus
(
HbComData
*
data
,
HbCom_3sec_which
p1
,
HbCom_3sec_status
status
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespB1_get3SectionMachineStatus
(
HbComData
*
data
,
HbMachineStatus
statusMachine
,
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'字符停止,返回字符串长度
// 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101"
...
...
@@ -798,7 +814,17 @@ ADEMCO_EXPORT_SYMBOL int hbHiLoArrayToDecStr(char* str, const uint8_t* arr, int
// 示例:输入字符串 "18240888101", len=9, 则arr内容为 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff, return 9
// 输入字符串 "12345678901234567890", len=9, 则失败返回0
ADEMCO_EXPORT_SYMBOL
int
hbDecStrToHiLoArray
(
uint8_t
*
arr
,
int
len
,
const
char
*
str
);
// 将一串字节流转换为可打印形式
// 示例:输入 arr=[0xEB 0xBA 0x3F], len=3, 输出str = "EBBA3F"
// 返回str长度(len * 2)
ADEMCO_EXPORT_SYMBOL
int
hbHexArrayToStr
(
char
*
str
,
const
uint8_t
*
arr
,
int
len
);
// 将一串字符串(内容为'0'~'9', 'A'~'F')转为字节流,若strlen(str)为奇数,以padding补足arr, padding 应 <= 0x0F
// 若str内包含非hex字符串,返回0
// 示例:输入字符串str="EBBA3F", 输出arr = [0xEB, 0xBA, 0x3F],返回 strlen(str) / 2
// 示例:输入字符串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
);
#ifdef __cplusplus
}
...
...
examples/ademco/ademco.vcxproj
View file @
ef8c2dff
...
...
@@ -153,7 +153,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile
Include=
"..\..\c\ademco.c"
/>
<ClCompile
Include=
"dllmain.c
pp
"
/>
<ClCompile
Include=
"dllmain.c"
/>
</ItemGroup>
<ItemGroup>
<ClInclude
Include=
"..\..\c\ademco.h"
/>
...
...
examples/ademco/ademco.vcxproj.filters
View file @
ef8c2dff
...
...
@@ -15,7 +15,7 @@
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile
Include=
"dllmain.c
pp
"
>
<ClCompile
Include=
"dllmain.c"
>
<Filter>
Source Files
</Filter>
</ClCompile>
<ClCompile
Include=
"..\..\c\ademco.c"
>
...
...
examples/ademco/dllmain.c
pp
→
examples/ademco/dllmain.c
View file @
ef8c2dff
File moved
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