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
80489de5
Commit
80489de5
authored
Nov 20, 2023
by
captainwong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ademco version 1.0.0
parent
685b679d
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1748 additions
and
1624 deletions
+1748
-1624
ademco.c
ademco.c
+1152
-1151
ademco.h
ademco.h
+276
-250
ademco_version.h
ademco_version.h
+19
-0
gen_event_md.cpp
examples/gen_event_md/gen_event_md.cpp
+25
-97
hb_com.c
hb_com.c
+131
-55
hb_com.h
hb_com.h
+121
-53
copy_from_hb.bat
tools/copy_from_hb.bat
+5
-4
mkrelease.sh
tools/mkrelease.sh
+14
-1
test.sh
tools/test.sh
+5
-13
No files found.
ademco.c
View file @
80489de5
/*
* Ademco library
* captainwong
* 2022-6-13 rewrited this C version
*/
* Ademco library
* captainwong
* 2022-6-13 rewrited this C version
*/
#include "ademco.h"
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#ifdef _DEBUG
#define dprintf printf
...
...
@@ -22,6 +23,27 @@
dline; \
dprintf
#define ADEMCO_STRINGIFY(v) ADEMCO_STRINGIFY_HELPER(v)
#define ADEMCO_STRINGIFY_HELPER(v) #v
#define ADEMCO_VERSION_STRING_BASE ADEMCO_STRINGIFY(ADEMCO_VERSION_MAJOR) "." \
ADEMCO_STRINGIFY(ADEMCO_VERSION_MINOR) "." \
ADEMCO_STRINGIFY(ADEMCO_VERSION_PATCH)
#if ADEMCO_VERSION_IS_RELEASE
# define ADEMCO_VERSION_STRING ADEMCO_VERSION_STRING_BASE
#else
# define ADEMCO_VERSION_STRING ADEMCO_VERSION_STRING_BASE "-" ADEMCO_VERSION_SUFFIX
#endif
unsigned
int
ademcoVersion
(
void
)
{
return
ADEMCO_VERSION_HEX
;
}
const
char
*
ademcoVersionString
(
void
)
{
return
ADEMCO_VERSION_STRING
;
}
static
uint8_t
hex2char
(
uint8_t
h
)
{
h
&=
0x0F
;
if
(
h
>
9
)
...
...
@@ -107,18 +129,30 @@ int ademcoIsEventNeedControlSource(AdemcoEvent ademcoEvent) {
AdemcoEvent
ademcoGetExceptionEventByResumeEvent
(
AdemcoEvent
resumeEvent
)
{
switch
(
resumeEvent
)
{
case
EVENT_RECONNECT
:
return
EVENT_DISCONNECT
;
case
EVENT_LOST_RECOVER
:
return
EVENT_LOST
;
case
EVENT_SERIAL485CONN
:
return
EVENT_SERIAL485DIS
;
case
EVENT_SUB_MACHINE_SENSOR_RESUME
:
return
EVENT_SUB_MACHINE_SENSOR_EXCEPTION
;
case
EVENT_SUB_MACHINE_POWER_RESUME
:
return
EVENT_SUB_MACHINE_POWER_EXCEPTION
;
case
EVENT_BATTERY_RECOVER
:
return
EVENT_LOWBATTERY
;
case
EVENT_BATTERY_EXCEPTION_RECOVER
:
return
EVENT_BATTERY_EXCEPTION
;
case
EVENT_OTHER_EXCEPTION_RECOVER
:
return
EVENT_OTHER_EXCEPTION
;
case
EVENT_AC_RECOVER
:
return
EVENT_AC_BROKE
;
case
EVENT_SOLARDISTURB_RECOVER
:
return
EVENT_SOLARDISTURB
;
case
EVENT_BADBATTERY_RECOVER
:
return
EVENT_BADBATTERY
;
default:
return
EVENT_INVALID_EVENT
;
case
EVENT_RECONNECT
:
return
EVENT_DISCONNECT
;
case
EVENT_LOST_RECOVER
:
return
EVENT_LOST
;
case
EVENT_SERIAL485CONN
:
return
EVENT_SERIAL485DIS
;
case
EVENT_SUB_MACHINE_SENSOR_RESUME
:
return
EVENT_SUB_MACHINE_SENSOR_EXCEPTION
;
case
EVENT_SUB_MACHINE_POWER_RESUME
:
return
EVENT_SUB_MACHINE_POWER_EXCEPTION
;
case
EVENT_BATTERY_RECOVER
:
return
EVENT_LOWBATTERY
;
case
EVENT_BATTERY_EXCEPTION_RECOVER
:
return
EVENT_BATTERY_EXCEPTION
;
case
EVENT_OTHER_EXCEPTION_RECOVER
:
return
EVENT_OTHER_EXCEPTION
;
case
EVENT_AC_RECOVER
:
return
EVENT_AC_BROKE
;
case
EVENT_SOLARDISTURB_RECOVER
:
return
EVENT_SOLARDISTURB
;
case
EVENT_BADBATTERY_RECOVER
:
return
EVENT_BADBATTERY
;
default:
return
EVENT_INVALID_EVENT
;
}
}
...
...
@@ -149,7 +183,7 @@ AdemcoEventLevel ademcoGetEventLevel(AdemcoEvent ademcoEvent) {
case
EVENT_SOLARDISTURB
:
case
EVENT_DISCONNECT
:
case
EVENT_LOST
:
//
case EVENT_DOORRINGING: //case EVENT_CONN_HANGUP: //case EVENT_CONN_RESUME:
//
case EVENT_DOORRINGING: //case EVENT_CONN_HANGUP: //case EVENT_CONN_RESUME:
case
EVENT_SUB_MACHINE_SENSOR_EXCEPTION
:
case
EVENT_SUB_MACHINE_POWER_EXCEPTION
:
case
EVENT_BATTERY_EXCEPTION
:
...
...
@@ -174,160 +208,42 @@ AdemcoEventLevel ademcoGetEventLevel(AdemcoEvent ademcoEvent) {
const
char
*
ademcoEventToString
(
AdemcoEvent
ademcoEvent
)
{
switch
(
ademcoEvent
)
{
case
EVENT_ARM
:
return
"ARM"
;
case
EVENT_BURGLAR
:
return
"BURGLAR"
;
case
EVENT_DISARM
:
return
"DISARM"
;
case
EVENT_DURESS
:
return
"DURESS"
;
case
EVENT_EMERGENCY
:
return
"EMERGENCY"
;
case
EVENT_FIRE
:
return
"FIRE"
;
case
EVENT_GAS
:
return
"GAS"
;
case
EVENT_HALFARM
:
case
EVENT_HALFARM_1456
:
return
"HALFARM"
;
case
EVENT_TAMPER
:
return
"TAMPER"
;
case
EVENT_ZONE_TAMPER
:
return
"ZONE_TAMPER"
;
case
EVENT_BYPASS
:
return
"BYPASS"
;
case
EVENT_BYPASS_RESUME
:
return
"BYPASS_RESUME"
;
case
EVENT_WATER
:
return
"WATER"
;
case
EVENT_AC_BROKE
:
return
"AC BROKE"
;
case
EVENT_AC_RECOVER
:
return
"AC RECOVER"
;
case
EVENT_LOWBATTERY
:
return
"LOWBATTERY"
;
case
EVENT_BATTERY_RECOVER
:
return
"BATATTERY_RECOVER"
;
case
EVENT_BADBATTERY
:
return
"BADBATTERY"
;
case
EVENT_BADBATTERY_RECOVER
:
return
"BADBATTERY_RECOVER"
;
case
EVENT_SOLARDISTURB
:
return
"SOLARDISTURB"
;
case
EVENT_SOLARDISTURB_RECOVER
:
return
"SOLARDISTURB_RECOVER"
;
case
EVENT_DISCONNECT
:
return
"DISCONNECT"
;
case
EVENT_RECONNECT
:
return
"RECONNECT"
;
case
EVENT_LOST
:
return
"LOST"
;
case
EVENT_LOST_RECOVER
:
return
"LOST_RECOVER"
;
case
EVENT_3100
:
return
"LCD CLEAR EXCEPTION"
;
case
EVENT_BATTERY_EXCEPTION
:
return
"BATTERY_EXCEPTION"
;
case
EVENT_BATTERY_EXCEPTION_RECOVER
:
return
"BATTERY_EXCEPTION_RECOVER"
;
case
EVENT_OTHER_EXCEPTION
:
return
"OTHER_EXCEPTION"
;
case
EVENT_OTHER_EXCEPTION_RECOVER
:
return
"OTHER_EXCEPTION_RECOVER"
;
case
EVENT_SERIAL485DIS
:
return
"485DIS"
;
case
EVENT_SERIAL485CONN
:
return
"485CONN"
;
case
EVENT_DOORRINGING
:
return
"DOORRINGING"
;
case
EVENT_CONN_HANGUP
:
return
"CONN_HANGUP"
;
case
EVENT_CONN_RESUME
:
return
"CONN_RESUME"
;
case
EVENT_DISARM_PWD_ERR
:
return
"DISARM_PWD_ERR"
;
case
EVENT_SUB_MACHINE_SENSOR_EXCEPTION
:
return
"SUB_SENSOR_EXCEPTION"
;
case
EVENT_SUB_MACHINE_SENSOR_RESUME
:
return
"SUB_SENSOR_RESUME"
;
case
EVENT_SUB_MACHINE_POWER_EXCEPTION
:
return
"SUB_POWER_EXCEPTION"
;
case
EVENT_SUB_MACHINE_POWER_RESUME
:
return
"SUB_POWER_RESUME"
;
case
EVENT_COM_PASSTHROUGH
:
return
"COM_PASSTHROUGH"
;
case
EVENT_ENTER_SET_MODE
:
return
"ENTER_SET_MODE"
;
case
EVENT_EXIT_SET_MODE
:
return
"EXIT_SET_MODE"
;
case
EVENT_QUERY_SUB_MACHINE
:
return
"QUERY"
;
case
EVENT_WRITE_TO_MACHINE
:
return
"WRITE_TO_MACHINE"
;
case
EVENT_I_AM_NET_MODULE
:
return
"I_AM_NET_MODULE"
;
case
EVENT_PHONE_USER_SOS
:
return
"SOS"
;
case
EVENT_PHONE_USER_CANCLE_ALARM
:
return
"PHONE_USER_CANCLE_ALARM"
;
case
EVENT_I_AM_GPRS
:
return
"I_AM_GPRS_MACHINE"
;
case
EVENT_I_AM_LCD_MACHINE
:
return
"I_AM_LCD_MACHINE"
;
case
EVENT_I_AM_WIRE_MACHINE
:
return
"I_AM_WIRE_MACHINE"
;
case
EVENT_I_AM_WIFI_MACHINE
:
return
"I_AM_WIFI_MACHINE"
;
case
EVENT_I_AM_3_SECTION_MACHINE
:
return
"I_AM_3_SECTION_MACHINE"
;
case
EVENT_I_AM_IOT_MACHINE
:
return
"I_AM_IOT_MACHINE"
;
case
EVENT_I_AM_TRUE_COLOR
:
return
"I_AM_TRUE_COLOR"
;
case
EVENT_I_AM_GPRS_IOT
:
return
"I_AM_GPRS_IOT"
;
case
EVENT_I_AM_GPRS_PHONE
:
return
"I_AM_GPRS_PHONE"
;
case
EVENT_I_AM_NB_MACHINE
:
return
"I_AM_NB_MACHINE"
;
case
EVENT_I_AM_WIFI2_MACHINE
:
return
"I_AM_WIFI2_MACHINE"
;
case
EVENT_SIM_IS_IOT_CARD
:
return
"SIM card is IOT"
;
case
EVENT_SIM_IS_IOT_PLATFORM_CARD
:
return
"SIM card is Platform IOT"
;
case
EVENT_SIM_IS_NOT_IOT_CARD
:
return
"SIM card is not IOT"
;
case
EVENT_ENTER_SETTING_MODE
:
return
"ENTER_SETTING_MODE"
;
case
EVENT_EXIT_SETTING_MODE
:
return
"EXIT_SETTING_MODE"
;
case
EVENT_RESTORE_FACTORY_SETTINGS_710
:
case
EVENT_RESTORE_FACTORY_SETTINGS
:
return
"RESTORE_FACTORY_SETTINGS"
;
case
EVENT_WHAT_IS_YOUR_TYPE
:
return
"WHAT_IS_YOUR_TYPE"
;
case
EVENT_SIGNAL_STRENGTH_CHANGED
:
return
"SIGNAL_STRENGTH_CHANGED"
;
case
EVENT_OFFLINE
:
return
"EVENT_OFFLINE"
;
case
EVENT_ONLINE
:
return
"EVENT_ONLINE"
;
default:
return
"Undefined AdemcoEvent"
;
#define XX(name, code, zh) \
case EVENT_##name: \
return #name;
// ----标准安定宝协议事件----
ADEMCO_STATUS_EVENTS_MAP
(
XX
)
ADEMCO_ALARM_EVENTS_MAP
(
XX
)
ADEMCO_EXEPTION_EVENTS_MAP
(
XX
)
ADEMCO_RESUME_EVENTS_MAP
(
XX
)
// ---私有事件---------
ADEMCO_HB_EVENTS_MAP
(
XX
)
#undef XX
default:
return
"Undefined AdemcoEvent"
;
}
}
#ifdef ADEMCO_ENABLE_CHINESE
const
char
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
)
{
switch
(
ademcoEvent
)
{
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_I_AM_WIFI2_MACHINE
:
return
"我是WiFi主机新版"
;
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
"主机恢复出厂设置"
;
case
EVENT_WHAT_IS_YOUR_TYPE
:
return
"索要主机类型"
;
case
EVENT_SIGNAL_STRENGTH_CHANGED
:
return
"信号强度变化"
;
case
EVENT_OFFLINE
:
return
"上线"
;
case
EVENT_ONLINE
:
return
"离线"
;
default:
return
"未定义的安定宝事件"
;
#define XX(name, code, zh) \
case EVENT_##name: \
return zh;
// ----标准安定宝协议事件----
ADEMCO_STATUS_EVENTS_MAP
(
XX
)
ADEMCO_ALARM_EVENTS_MAP
(
XX
)
ADEMCO_EXEPTION_EVENTS_MAP
(
XX
)
ADEMCO_RESUME_EVENTS_MAP
(
XX
)
// ---私有事件---------
ADEMCO_HB_EVENTS_MAP
(
XX
)
#undef XX
default:
return
"未定义的安定宝事件"
;
}
}
#endif
...
...
@@ -418,7 +334,7 @@ size_t ademcoAppendDataSegment(ademco_char_t* buff, const char* acct, AdemcoId a
*
p
++
=
']'
;
//
assert(p - (char*)buff == ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN);
//
assert(p - (char*)buff == ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN);
*
p
=
'\0'
;
// for debug convenience
...
...
@@ -437,7 +353,6 @@ size_t ademcoAppendDataSegment2(AdemcoDataSegment* dataSegment, const char* acct
ademcoEvent
,
gg
,
zone
);
}
AdemcoParseResult
ademcoParseDataSegment
(
const
ademco_char_t
*
packet
,
size_t
packet_len
,
AdemcoDataSegment
*
dataSegment
,
AdemcoParseError
*
err
)
{
if
(
packet_len
==
ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN
&&
...
...
@@ -457,7 +372,7 @@ AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t pac
break
;
}
char
temp
[
ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN_MAX
]
=
{
0
};
char
temp
[
ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN_MAX
]
=
{
0
};
strncpy
(
temp
,
(
const
char
*
)
p
,
acct_len
);
temp
[
acct_len
]
=
'\0'
;
dataSegment
->
ademcoId
=
(
AdemcoId
)
strtoul
(
temp
,
NULL
,
16
);
...
...
@@ -505,7 +420,8 @@ AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t pac
return
RESULT_ERROR
;
}
size_t
ademcoDataSegmentToCongwinFe100
(
ademco_char_t
*
fe100
,
size_t
fe100_len
,
const
AdemcoDataSegment
*
dataSegment
)
{
size_t
ademcoDataSegmentToCongwinFe100
(
ademco_char_t
*
fe100
,
size_t
fe100_len
,
const
AdemcoDataSegment
*
dataSegment
)
{
if
(
dataSegment
->
raw_len
==
ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN
)
{
if
(
fe100_len
<
2
)
return
0
;
fe100
[
0
]
=
'\n'
;
...
...
@@ -522,7 +438,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
*
p
++
=
'0'
;
*
p
++
=
' '
;
snprintf
(
p
,
fe100_len
-
(
p
-
fe100
),
"%08d"
,
dataSegment
->
ademcoId
%
100000000
);
snprintf
(
p
,
fe100_len
-
(
p
-
fe100
),
"%08d"
,
dataSegment
->
ademcoId
%
100000000
);
p
+=
8
;
*
p
++
=
' '
;
// 18
...
...
@@ -546,7 +465,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
*
p
++
=
'B'
;
*
p
++
=
'0'
;
}
else
{
snprintf
(
p
,
fe100_len
-
(
p
-
fe100
),
"%03d"
,
dataSegment
->
ademcoEvent
%
1000
);
snprintf
(
p
,
fe100_len
-
(
p
-
fe100
),
"%03d"
,
dataSegment
->
ademcoEvent
%
1000
);
p
+=
3
;
}
...
...
@@ -560,7 +482,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
else
*
p
++
=
'C'
;
// zone event
snprintf
(
p
,
fe100_len
-
(
p
-
fe100
),
"%03d"
,
dataSegment
->
zone
%
1000
);
snprintf
(
p
,
fe100_len
-
(
p
-
fe100
),
"%03d"
,
dataSegment
->
zone
%
1000
);
p
+=
3
;
*
p
++
=
' '
;
...
...
@@ -571,12 +496,17 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
}
void
ademcoXDataInit
(
AdemcoXDataSegment
*
xdata
)
{
memset
(
xdata
,
0
,
sizeof
*
xdata
);
memset
(
xdata
,
0
,
sizeof
*
xdata
);
}
int
ademcoXDataConvert
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
)
{
if
(
!
xdata
)
{
return
ADEMCO_ERR
;
}
if
(
xdata
->
lenghFormat
==
xlf
)
{
return
ADEMCO_OK
;
}
int
ademcoXDataConvert
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
)
{
if
(
!
xdata
)
{
return
ADEMCO_ERR
;
}
if
(
xdata
->
lenghFormat
==
xlf
)
{
return
ADEMCO_OK
;
}
size_t
len
=
ademcoXDataGetValidContentLen
(
xdata
);
char
raw
[
ADEMCO_PACKET_XDATA_MAX_LEN
];
...
...
@@ -585,11 +515,17 @@ int ademcoXDataConvert(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf) {
if
(
len
+
6
>
ADEMCO_PACKET_XDATA_MAX_LEN
)
return
ADEMCO_ERR
;
xdata
->
raw
[
5
+
ademcoXDataGetValidContentLen
(
xdata
)]
=
'\0'
;
len
=
ademcoHexStrToArray
((
uint8_t
*
)
raw
,
ademcoXDataGetValidContentAddr
(
xdata
),
0x0F
);
ademcoMakeXData
(
xdata
,
TWO_HEX
,
AdemcoXDataTransform_as_is
,
raw
,
len
);
len
=
ademcoHexStrToArray
((
uint8_t
*
)
raw
,
ademcoXDataGetValidContentAddr
(
xdata
),
0x0F
);
ademcoMakeXData
(
xdata
,
TWO_HEX
,
AdemcoXDataTransform_as_is
,
raw
,
len
);
}
else
{
memcpy
(
raw
,
ademcoXDataGetValidContentAddr
(
xdata
),
len
);
ademcoMakeXData
(
xdata
,
FOUR_DECIMAL
,
AdemcoXDataTransform_to_ascii
,
raw
,
len
);
ademcoMakeXData
(
xdata
,
FOUR_DECIMAL
,
AdemcoXDataTransform_to_ascii
,
raw
,
len
);
}
return
ADEMCO_OK
;
}
...
...
@@ -606,7 +542,8 @@ const char* ademcoXDataGetValidContentAddr(const AdemcoXDataSegment* xdata) {
return
NULL
;
}
int
ademcoXDataMemcmp
(
const
AdemcoXDataSegment
*
xdata
,
const
void
*
buf
,
size_t
buf_len
)
{
int
ademcoXDataMemcmp
(
const
AdemcoXDataSegment
*
xdata
,
const
void
*
buf
,
size_t
buf_len
)
{
if
(
ademcoXDataGetValidContentLen
(
xdata
)
!=
buf_len
)
return
0
;
const
void
*
p
=
ademcoXDataGetValidContentAddr
(
xdata
);
if
(
!
p
)
return
0
;
...
...
@@ -622,7 +559,8 @@ size_t ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata) {
return
0
;
}
size_t
ademcoXDataCopy
(
AdemcoXDataSegment
*
dst
,
const
AdemcoXDataSegment
*
src
)
{
size_t
ademcoXDataCopy
(
AdemcoXDataSegment
*
dst
,
const
AdemcoXDataSegment
*
src
)
{
if
(
dst
&&
src
&&
src
->
raw_len
>
0
)
{
memcpy
(
dst
,
src
,
sizeof
(
AdemcoXDataSegment
));
return
src
->
raw_len
;
...
...
@@ -630,8 +568,10 @@ size_t ademcoXDataCopy(AdemcoXDataSegment* dst, const AdemcoXDataSegment* src) {
return
0
;
}
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
,
const
ademco_char_t
*
content
,
size_t
len
)
{
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
,
const
ademco_char_t
*
content
,
size_t
len
)
{
char
transformed
[
ADEMCO_PACKET_XDATA_MAX_LEN
];
size_t
translen
;
len
&=
0xFFFF
;
...
...
@@ -640,12 +580,14 @@ int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf,
if
(
xtr
==
AdemcoXDataTransform_as_is
)
memcpy
(
transformed
,
content
,
len
);
else
if
(
len
*
2
<
ADEMCO_PACKET_XDATA_MAX_LEN
)
translen
=
ademcoHexArrayToStr
(
transformed
,
(
const
uint8_t
*
)
content
,
len
)
&
0xFFFF
;
translen
=
ademcoHexArrayToStr
(
transformed
,
(
const
uint8_t
*
)
content
,
len
)
&
0xFFFF
;
else
return
ADEMCO_ERR
;
xdata
->
lenghFormat
=
xlf
;
if
(
xlf
==
TWO_HEX
&&
translen
+
4
<
ADEMCO_PACKET_XDATA_MAX_LEN
)
{
if
(
xlf
==
TWO_HEX
&&
translen
+
4
<
ADEMCO_PACKET_XDATA_MAX_LEN
)
{
ademco_char_t
*
p
=
xdata
->
raw
;
*
p
++
=
'['
;
*
p
++
=
(
translen
&
0xFFFF
)
>>
8
;
...
...
@@ -655,7 +597,8 @@ int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf,
*
p
++
=
']'
;
xdata
->
raw_len
=
p
-
xdata
->
raw
;
return
ADEMCO_OK
;
}
else
if
(
xlf
==
FOUR_DECIMAL
&&
translen
+
6
<
ADEMCO_PACKET_XDATA_MAX_LEN
)
{
}
else
if
(
xlf
==
FOUR_DECIMAL
&&
translen
+
6
<
ADEMCO_PACKET_XDATA_MAX_LEN
)
{
ademco_char_t
*
p
=
xdata
->
raw
;
*
p
++
=
'['
;
char
temp
[
5
];
...
...
@@ -768,7 +711,6 @@ size_t ademcoMakeEmptyDataPacket(ademco_char_t* dst_buff, size_t len,
return
0
;
}
size_t
ademcoMakeAdmEmptyDataPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
...
...
@@ -819,24 +761,43 @@ size_t ademcoMakeAdmEmptyDataPacket(ademco_char_t* dst_buff, size_t len,
return
0
;
}
size_t
ademcoMakeNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
return
ademcoMakeEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_NULL
,
seq
,
acct
,
ademcoId
);
size_t
ademcoMakeNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
return
ademcoMakeEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_NULL
,
seq
,
acct
,
ademcoId
);
}
size_t
ademcoMakeAdmNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
return
ademcoMakeAdmEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_NULL
,
seq
,
acct
,
ademcoId
);
size_t
ademcoMakeAdmNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
return
ademcoMakeAdmEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_NULL
,
seq
,
acct
,
ademcoId
);
}
size_t
ademcoMakeAckPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
return
ademcoMakeEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_ACK
,
seq
,
acct
,
ademcoId
);
size_t
ademcoMakeAckPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
return
ademcoMakeEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_ACK
,
seq
,
acct
,
ademcoId
);
}
size_t
ademcoMakeNakPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
return
ademcoMakeEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_NAK
,
seq
,
acct
,
ademcoId
);
size_t
ademcoMakeNakPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
return
ademcoMakeEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_NAK
,
seq
,
acct
,
ademcoId
);
}
size_t
ademcoMakeHbPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
size_t
ademcoMakeHbPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
char
buff
[
ADEMCO_PACKET_MAX_LEN
];
char
*
p
=
buff
;
char
*
pcrc
=
buff
+
1
;
...
...
@@ -887,8 +848,10 @@ size_t ademcoMakeHbPacket(ademco_char_t* dst_buff, size_t len, uint16_t seq, con
return
0
;
}
size_t
ademcoMakeAdmPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
size_t
ademcoMakeAdmPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
char
buff
[
ADEMCO_PACKET_MAX_LEN
];
char
*
p
=
buff
;
char
*
pcrc
=
buff
+
1
;
...
...
@@ -950,32 +913,40 @@ static void copyAcct2AdemcoPacket(AdemcoPacket* pkt, const char* acct) {
pkt
->
acct
[
0
]
=
'\0'
;
}
size_t
ademcoMakeNullPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
size_t
ademcoMakeNullPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
pkt
->
data
.
ademcoId
=
ademcoId
;
pkt
->
id
=
AID_NULL
;
return
pkt
->
raw_len
=
ademcoMakeNullPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
);
return
pkt
->
raw_len
=
ademcoMakeNullPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
);
}
size_t
ademcoMakeAckPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
size_t
ademcoMakeAckPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
pkt
->
data
.
ademcoId
=
ademcoId
;
pkt
->
id
=
AID_ACK
;
return
pkt
->
raw_len
=
ademcoMakeAckPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
);
return
pkt
->
raw_len
=
ademcoMakeAckPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
);
}
size_t
ademcoMakeNakPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
size_t
ademcoMakeNakPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
pkt
->
data
.
ademcoId
=
ademcoId
;
pkt
->
id
=
AID_NAK
;
return
pkt
->
raw_len
=
ademcoMakeNakPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
);
return
pkt
->
raw_len
=
ademcoMakeNakPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
);
}
size_t
ademcoMakeHbPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
size_t
ademcoMakeHbPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
ademcoAppendDataSegment2
(
&
pkt
->
data
,
acct
,
ademcoId
,
ademcoEvent
,
gg
,
zone
);
...
...
@@ -987,11 +958,14 @@ size_t ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, Ad
memset
(
&
pkt
->
xdata
,
0
,
sizeof
(
*
xdata
));
pkt
->
id
=
AID_HB
;
return
pkt
->
raw_len
=
ademcoMakeHbPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
,
ademcoEvent
,
gg
,
zone
,
xdata
);
seq
,
acct
,
ademcoId
,
ademcoEvent
,
gg
,
zone
,
xdata
);
}
size_t
ademcoMakeAdmPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
size_t
ademcoMakeAdmPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
ademcoAppendDataSegment2
(
&
pkt
->
data
,
acct
,
ademcoId
,
ademcoEvent
,
gg
,
zone
);
...
...
@@ -1003,13 +977,16 @@ size_t ademcoMakeAdmPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, A
memset
(
&
pkt
->
xdata
,
0
,
sizeof
(
*
xdata
));
pkt
->
id
=
AID_ADM_CID
;
return
pkt
->
raw_len
=
ademcoMakeAdmPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
seq
,
acct
,
ademcoId
,
ademcoEvent
,
gg
,
zone
,
xdata
);
seq
,
acct
,
ademcoId
,
ademcoEvent
,
gg
,
zone
,
xdata
);
}
AdemcoParseResult
ademcoPacketParse
(
const
ademco_char_t
*
buff
,
size_t
len
,
AdemcoPacket
*
pkt
,
size_t
*
cb_commited
,
AdemcoParseError
*
err
)
{
if
(
len
<
9
)
{
return
RESULT_NOT_ENOUGH
;
}
if
(
len
<
9
)
{
return
RESULT_NOT_ENOUGH
;
}
do
{
const
char
*
p
=
buff
;
if
(
*
p
++
!=
ADEMCO_PACKET_PREFIX
)
{
...
...
@@ -1062,7 +1039,9 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
break
;
}
p
=
pid
+
1
;
while
(
p
<
pcr
&&
*
p
!=
'\"'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
'\"'
)
{
p
++
;
}
if
(
p
>=
pcr
||
*
p
!=
'\"'
)
{
dline
;
ADEMCO_FILL_PARSE_ERROR
(
err
,
"p >= pcr || *p != '
\"
'"
);
...
...
@@ -1077,20 +1056,27 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
// seq
const
char
*
pseq
=
p
;
while
(
p
<
pcr
&&
*
p
!=
'R'
&&
*
p
!=
'L'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
'R'
&&
*
p
!=
'L'
)
{
p
++
;
}
if
(
p
-
pseq
!=
4
||
(
*
p
!=
'R'
&&
*
p
!=
'L'
))
{
dline
;
ADEMCO_FILL_PARSE_ERROR
(
err
,
"p - pseq != 4 || (*p != 'R' && *p != 'L')"
);
break
;
}
memcpy
(
temp
,
pseq
,
4
);
temp
[
4
]
=
'\0'
;
memcpy
(
temp
,
pseq
,
4
);
temp
[
4
]
=
'\0'
;
pkt
->
seq
=
strtoul
(
temp
,
NULL
,
10
)
&
0xFFFF
;
if
(
pkt
->
seq
>=
10000
)
{
pkt
->
seq
=
0
;
}
if
(
pkt
->
seq
>=
10000
)
{
pkt
->
seq
=
0
;
}
// *rrcvr
if
(
*
p
==
'R'
)
{
// rrcvr exists
//const char* prcvr = p;
while
(
p
<
pcr
&&
*
p
!=
'L'
&&
*
p
!=
'#'
)
{
p
++
;
}
// const char* prcvr = p;
while
(
p
<
pcr
&&
*
p
!=
'L'
&&
*
p
!=
'#'
)
{
p
++
;
}
if
(
p
>=
pcr
||
(
*
p
!=
'L'
&&
*
p
!=
'#'
))
{
dline
;
ADEMCO_FILL_PARSE_ERROR
(
err
,
"p >= pcr || (*p != 'L' && *p != '#')"
);
...
...
@@ -1111,7 +1097,9 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
ADEMCO_FILL_PARSE_ERROR
(
err
,
"LPREF not found"
);
break
;
}
while
(
p
<
pcr
&&
*
p
!=
'#'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
'#'
)
{
p
++
;
}
// only check if format is correct, ignore it's content
if
(
p
>=
pcr
||
*
p
!=
'#'
)
{
dline
;
...
...
@@ -1144,13 +1132,18 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
// data
const
char
*
pdata
=
p
;
while
(
p
<
pcr
&&
*
p
!=
']'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
']'
)
{
p
++
;
}
if
(
p
>=
pcr
||
*
p
!=
']'
)
{
dline
;
ADEMCO_FILL_PARSE_ERROR
(
err
,
"data's ] not found"
);
break
;
}
if
(
ademcoParseDataSegment
(
pdata
,
++
p
-
pdata
,
&
pkt
->
data
,
err
)
!=
RESULT_OK
)
{
dline
;
break
;
}
if
(
ademcoParseDataSegment
(
pdata
,
++
p
-
pdata
,
&
pkt
->
data
,
err
)
!=
RESULT_OK
)
{
dline
;
break
;
}
// *xdata
if
(
*
p
==
'['
)
{
// xdata exists
...
...
@@ -1162,7 +1155,8 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
xlf
=
TWO_HEX
;
if
(
xlf
==
FOUR_DECIMAL
)
{
memcpy
(
temp
,
pxdata
+
1
,
4
);
temp
[
4
]
=
'\0'
;
memcpy
(
temp
,
pxdata
+
1
,
4
);
temp
[
4
]
=
'\0'
;
valid_len
=
strtoul
(
temp
,
NULL
,
16
);
p
+=
4
+
valid_len
;
}
else
{
...
...
@@ -1225,10 +1219,14 @@ size_t ademcoHiLoArrayToDecStr(ademco_char_t* str, const uint8_t* arr, size_t le
char
*
p
=
str
;
for
(
size_t
i
=
0
;
i
<
len
;
i
++
)
{
char
c
=
(
arr
[
i
]
>>
4
)
&
0x0F
;
if
(
c
>
9
)
{
return
p
-
str
;
}
if
(
c
>
9
)
{
return
p
-
str
;
}
*
p
++
=
c
+
'0'
;
c
=
(
arr
[
i
]
&
0x0F
);
if
(
c
>
9
)
{
return
p
-
str
;
}
if
(
c
>
9
)
{
return
p
-
str
;
}
*
p
++
=
c
+
'0'
;
}
return
p
-
str
;
...
...
@@ -1319,7 +1317,6 @@ size_t ademcoDecStrToHiLoArray2(uint8_t* arr, size_t len, const char* str) {
return
len
;
}
size_t
ademcoHexArrayToStr
(
char
*
str
,
const
uint8_t
*
arr
,
size_t
len
)
{
char
*
p
=
str
;
for
(
size_t
i
=
0
;
i
<
len
;
i
++
)
{
...
...
@@ -1349,7 +1346,8 @@ size_t ademcoHexStrToArray(uint8_t* arr, const char* str, uint8_t padding) {
return
p
-
arr
;
}
size_t
ademcoHexStrToArrayN
(
uint8_t
*
arr
,
const
char
*
str
,
size_t
len
,
uint8_t
padding
)
{
size_t
ademcoHexStrToArrayN
(
uint8_t
*
arr
,
const
char
*
str
,
size_t
len
,
uint8_t
padding
)
{
uint8_t
*
p
=
arr
;
uint8_t
hi
=
0
,
lo
=
0
;
padding
&=
0x0F
;
...
...
@@ -1368,7 +1366,10 @@ size_t ademcoHexStrToArrayN(uint8_t* arr, const char* str, size_t len, uint8_t p
return
p
-
arr
;
}
size_t
ademcoHexStrToArrayN_allow_non_hex_str
(
uint8_t
*
arr
,
const
char
*
str
,
size_t
len
,
uint8_t
padding
)
{
size_t
ademcoHexStrToArrayN_allow_non_hex_str
(
uint8_t
*
arr
,
const
char
*
str
,
size_t
len
,
uint8_t
padding
)
{
uint8_t
*
p
=
arr
;
uint8_t
hi
=
0
,
lo
=
0
;
padding
&=
0x0F
;
...
...
ademco.h
View file @
80489de5
/*
* Ademco library
* captainwong
* 2022-6-13 rewrited this C version
*/
#ifndef __ADEMCO_H__
#define __ADEMCO_H__
...
...
@@ -28,6 +22,8 @@
#include <stdint.h>
#include <time.h>
#include "ademco_version.h"
#ifdef __cplusplus
extern
"C"
{
#endif
...
...
@@ -90,188 +86,112 @@ static inline int ademcoIsValidZoneStrict(AdemcoZone zone) {
#define ADEMCO_SIGNAL_STRENGTH_MIN 0
#define ADEMCO_SIGNAL_STRENGTH_MAX 31
// 主机或分机状态报告
#define ADEMCO_STATUS_EVENTS_MAP(XX) \
XX(ARM, 3400, "布防") \
XX(DISARM, 1400, "撤防") \
XX(HALFARM, 3456, "半布防") \
XX(HALFARM_1456, 1456, "半布防") \
XX(EMERGENCY, 1120, "紧急报警")
// 防区报警
#define ADEMCO_ALARM_EVENTS_MAP(XX) \
XX(BURGLAR, 1130, "盗警") \
XX(DOORRINGING, 1134, "门铃") \
XX(FIRE, 1110, "火警") \
XX(DURESS, 1121, "胁迫") \
XX(GAS, 1151, "煤气") \
XX(WATER, 1113, "水警") \
XX(TAMPER, 1137, "主机防拆") \
XX(ZONE_TAMPER, 1383, "防区防拆") \
XX(BYPASS, 1570, "旁路")
// 防区异常
#define ADEMCO_EXEPTION_EVENTS_MAP(XX) \
XX(AC_BROKE, 1301, "主机AC掉电") \
XX(LOWBATTERY, 1302, "低电") \
XX(BADBATTERY, 1311, "坏电") \
XX(SOLARDISTURB, 1387, "光扰") \
XX(DISCONNECT, 1381, "失效") \
XX(LOST, 1393, "失联") \
XX(BATTERY_EXCEPTION, 1384, "电源故障") \
XX(OTHER_EXCEPTION, 1380, "其他故障")
// 防区异常恢复
#define ADEMCO_RESUME_EVENTS_MAP(XX) \
XX(BYPASS_RESUME, 3570, "解除旁路") \
XX(AC_RECOVER, 3301, "主机AC复电") \
XX(BATTERY_RECOVER, 3302, "低电恢复") \
XX(BADBATTERY_RECOVER, 3311, "坏电恢复") \
XX(SOLARDISTURB_RECOVER, 3387, "光扰恢复") \
XX(RECONNECT, 3381, "失效恢复") \
XX(LOST_RECOVER, 3393, "失联恢复") \
XX(BATTERY_EXCEPTION_RECOVER, 3384, "电源故障恢复") \
XX(OTHER_EXCEPTION_RECOVER, 3380, "其他故障恢复") \
XX(CLEAR_EXCPTION, 3100, "清除异常指示")
// 恒博自定义安定宝事件码
#define ADEMCO_HB_EVENTS_MAP(XX) \
XX(SERIAL485DIS, 1485, "485断开") \
XX(SERIAL485CONN, 3485, "485连接") \
XX(CONN_HANGUP, 1700, "链路挂起") \
XX(CONN_RESUME, 3700, "链路恢复") \
XX(DISARM_PWD_ERR, 1701, "撤防密码错误") \
XX(SUB_MACHINE_SENSOR_EXCEPTION, 1702, "分机探头异常") \
XX(SUB_MACHINE_SENSOR_RESUME, 3702, "分机探头恢复") \
XX(SUB_MACHINE_POWER_EXCEPTION, 1703, "分机电源异常") \
XX(SUB_MACHINE_POWER_RESUME, 3703, "分机电源恢复") \
XX(COM_PASSTHROUGH, 1704, "串口透传") \
XX(ENTER_SET_MODE, 2704, "进入设置状态") \
XX(EXIT_SET_MODE, 3704, "退出设置状态") \
XX(QUERY_SUB_MACHINE, 1705, "查询分机信息") \
XX(WRITE_TO_MACHINE, 1706, "写入主机信息") \
XX(I_AM_NET_MODULE, 1707, "主机类型--网络模块") \
XX(I_AM_GPRS, 1717, "主机类型--GPRS主机") \
XX(I_AM_LCD_MACHINE, 1727, "主机类型--液晶主机") \
XX(I_AM_WIRE_MACHINE, 1737, "主机类型--网线主机") \
XX(I_AM_WIFI_MACHINE, 1747, "主机类型--WiFi主机(停用)") \
XX(I_AM_3_SECTION_MACHINE, 1757, "主机类型--三区段主机") \
XX(I_AM_IOT_MACHINE, 1767, "主机类型--物联卡主机") \
XX(I_AM_TRUE_COLOR, 1777, "主机类型--真彩主机") \
XX(I_AM_GPRS_IOT, 1787, "主机类型--物联卡主机") \
XX(I_AM_GPRS_PHONE, 1797, "主机类型--GRPS主机带电话功能") \
XX(I_AM_NB_MACHINE, 1807, "主机类型--NB报警接收主机") \
XX(I_AM_WIFI2_MACHINE, 1817, "主机类型--WiFi主机(新版)") \
XX(PHONE_USER_SOS, 1709, "手机用户SOS") \
XX(PHONE_USER_CANCLE_ALARM, 1711, "手机用户消警") \
XX(ENTER_SETTING_MODE, 1712, "主机进入设置状态") \
XX(EXIT_SETTING_MODE, 3712, "主机退出设置状态") \
XX(RESTORE_FACTORY_SETTINGS_710, 1710, "主机恢复出厂设置") \
XX(RESTORE_FACTORY_SETTINGS, 1713, "主机恢复出厂设置") \
XX(SIM_IS_IOT_CARD, 1756, "主机SIM卡为物联卡,禁用主机侧电话设置") \
XX(SIM_IS_IOT_PLATFORM_CARD, 2756, "主机SIM卡为平台物联卡,禁用主机侧电话设置") \
XX(SIM_IS_NOT_IOT_CARD, 3756, "主机SIM卡为非物联卡,启用主机侧电话设置") \
XX(WHAT_IS_YOUR_TYPE, 1798, "索要主机类型") \
XX(SIGNAL_STRENGTH_CHANGED, 1799, "主机信号强度变化,强度值编码后以 xdata 传输") \
XX(OFFLINE, 1944, "主机断线") \
XX(ONLINE, 1946, "主机上线")
// Ademco events
typedef
enum
AdemcoEvent
{
EVENT_INVALID_EVENT
=
0
,
// -------------------标准安定宝协议事件--------------------------------
// 主机或分机状态报告
EVENT_ARM
=
3400
,
// 布防
EVENT_DISARM
=
1400
,
// 撤防
EVENT_HALFARM_1456
=
1456
,
// 半布防
EVENT_HALFARM
=
3456
,
// 半布防
EVENT_EMERGENCY
=
1120
,
// 紧急报警
// 防区报警
EVENT_BURGLAR
=
1130
,
// 盗警
EVENT_DOORRINGING
=
1134
,
// 门铃
EVENT_FIRE
=
1110
,
// 火警
EVENT_DURESS
=
1121
,
// 胁迫
EVENT_GAS
=
1151
,
// 煤气
EVENT_WATER
=
1113
,
// 水警
EVENT_TAMPER
=
1137
,
// 主机防拆
EVENT_ZONE_TAMPER
=
1383
,
// 防区防拆
EVENT_BYPASS
=
1570
,
// 旁路
EVENT_BYPASS_RESUME
=
3570
,
// 解除旁路
// 防区异常
EVENT_AC_BROKE
=
1301
,
// 主机AC掉电
EVENT_AC_RECOVER
=
3301
,
// 主机AC复电
EVENT_LOWBATTERY
=
1302
,
// 低电
EVENT_BATTERY_RECOVER
=
3302
,
// 复电
EVENT_BADBATTERY
=
1311
,
// 坏电
EVENT_BADBATTERY_RECOVER
=
3311
,
// 坏电恢复
EVENT_SOLARDISTURB
=
1387
,
// 光扰
EVENT_SOLARDISTURB_RECOVER
=
3387
,
// 光扰恢复
EVENT_DISCONNECT
=
1381
,
// 失效
EVENT_RECONNECT
=
3381
,
// 恢复
EVENT_BATTERY_EXCEPTION
=
1384
,
// 电源故障
EVENT_BATTERY_EXCEPTION_RECOVER
=
3384
,
// 电源故障恢复
EVENT_OTHER_EXCEPTION
=
1380
,
// 其他故障
EVENT_OTHER_EXCEPTION_RECOVER
=
3380
,
// 其他故障恢复
EVENT_LOST
=
1393
,
// 失联
EVENT_LOST_RECOVER
=
3393
,
// 失联恢复
// 标准事件,但不做处理
EVENT_3100
=
3100
,
// 液晶主机清除异常指示
// ------------------私有事件-----------------------------------------
EVENT_SERIAL485DIS
=
1485
,
// 网络模块与主机485串口连接断开
EVENT_SERIAL485CONN
=
3485
,
// 网络模块与主机485串口连接恢复
EVENT_CONN_HANGUP
=
1700
,
// 链路挂起
EVENT_CONN_RESUME
=
3700
,
// 链路恢复
EVENT_DISARM_PWD_ERR
=
1701
,
// 撤防密码错误
EVENT_SUB_MACHINE_SENSOR_EXCEPTION
=
1702
,
// 分机探头异常
EVENT_SUB_MACHINE_SENSOR_RESUME
=
3702
,
// 分机探头恢复
EVENT_SUB_MACHINE_POWER_EXCEPTION
=
1703
,
// 分机电源异常
EVENT_SUB_MACHINE_POWER_RESUME
=
3703
,
// 分机电源恢复
EVENT_COM_PASSTHROUGH
=
1704
,
// 串口透传
EVENT_ENTER_SET_MODE
=
2704
,
// 进入设置状态
EVENT_EXIT_SET_MODE
=
3704
,
// 接警中心发送,为停止索要;报警主机发送,为拒绝索要
EVENT_QUERY_SUB_MACHINE
=
1705
,
// 查询分机信息
EVENT_WRITE_TO_MACHINE
=
1706
,
// 写入主机信息
EVENT_I_AM_NET_MODULE
=
1707
,
// 主机类型--网络模块
EVENT_I_AM_GPRS
=
1717
,
// 主机类型--GPRS主机
EVENT_I_AM_LCD_MACHINE
=
1727
,
// 主机类型--液晶主机
EVENT_I_AM_WIRE_MACHINE
=
1737
,
// 主机类型--网线主机
EVENT_I_AM_WIFI_MACHINE
=
1747
,
// 主机类型--WiFi主机(停用)
EVENT_I_AM_3_SECTION_MACHINE
=
1757
,
// 主机类型--三区段主机
EVENT_I_AM_IOT_MACHINE
=
1767
,
// 主机类型--物联卡主机
EVENT_I_AM_TRUE_COLOR
=
1777
,
// 主机类型--真彩主机
EVENT_I_AM_GPRS_IOT
=
1787
,
// 主机类型--物联卡主机
EVENT_I_AM_GPRS_PHONE
=
1797
,
// 主机类型--GRPS主机带电话功能
EVENT_I_AM_NB_MACHINE
=
1807
,
// 主机类型--NB报警接收主机
EVENT_I_AM_WIFI2_MACHINE
=
1817
,
// 主机类型--WiFi主机(新版)
EVENT_PHONE_USER_SOS
=
1709
,
// 手机用户SOS
EVENT_PHONE_USER_CANCLE_ALARM
=
1711
,
// 手机用户消警
EVENT_ENTER_SETTING_MODE
=
1712
,
// 主机进入设置状态
EVENT_EXIT_SETTING_MODE
=
3712
,
// 主机退出设置状态
EVENT_RESTORE_FACTORY_SETTINGS_710
=
1710
,
// 主机恢复出厂设置
EVENT_RESTORE_FACTORY_SETTINGS
=
1713
,
// 主机恢复出厂设置
// 此处电话设置仅为主机自身支持的电话设置,与阿里语音无关
EVENT_SIM_IS_IOT_CARD
=
1756
,
// 主机SIM卡为物联卡,禁用主机侧电话设置
EVENT_SIM_IS_IOT_PLATFORM_CARD
=
2756
,
// 主机SIM卡为平台物联卡,禁用主机侧电话设置
EVENT_SIM_IS_NOT_IOT_CARD
=
3756
,
// 主机SIM卡为非物联卡,启用主机侧电话设置
EVENT_WHAT_IS_YOUR_TYPE
=
1798
,
// 索要主机类型
EVENT_SIGNAL_STRENGTH_CHANGED
=
1799
,
// 主机信号强度变化,强度值编码后以 xdata 传输
// 2021年1月24日17:06:55修改,对标丛文3B0 3B2
EVENT_OFFLINE
=
1944
,
// 主机断线
EVENT_ONLINE
=
1946
,
// 主机上线
#define XX(name, code, zh) EVENT_##name = code,
// ----标准安定宝协议事件----
ADEMCO_STATUS_EVENTS_MAP
(
XX
)
ADEMCO_ALARM_EVENTS_MAP
(
XX
)
ADEMCO_EXEPTION_EVENTS_MAP
(
XX
)
ADEMCO_RESUME_EVENTS_MAP
(
XX
)
// ---私有事件---------
ADEMCO_HB_EVENTS_MAP
(
XX
)
#undef XX
#define ADEMCO_EVENT_SENTINEL 10000
}
AdemcoEvent
;
static
const
AdemcoEvent
AdemcoEvents
[]
=
{
EVENT_ARM
,
EVENT_DISARM
,
EVENT_HALFARM
,
EVENT_EMERGENCY
,
EVENT_BURGLAR
,
EVENT_DOORRINGING
,
EVENT_FIRE
,
EVENT_DURESS
,
EVENT_GAS
,
EVENT_WATER
,
EVENT_TAMPER
,
EVENT_ZONE_TAMPER
,
EVENT_BYPASS
,
EVENT_BYPASS_RESUME
,
EVENT_AC_BROKE
,
EVENT_AC_RECOVER
,
EVENT_LOWBATTERY
,
EVENT_BATTERY_RECOVER
,
EVENT_BADBATTERY
,
EVENT_BADBATTERY_RECOVER
,
EVENT_SOLARDISTURB
,
EVENT_SOLARDISTURB_RECOVER
,
EVENT_DISCONNECT
,
EVENT_RECONNECT
,
EVENT_LOST
,
EVENT_LOST_RECOVER
,
EVENT_3100
,
EVENT_BATTERY_EXCEPTION
,
EVENT_BATTERY_EXCEPTION_RECOVER
,
EVENT_OTHER_EXCEPTION
,
EVENT_OTHER_EXCEPTION_RECOVER
,
EVENT_SERIAL485DIS
,
EVENT_SERIAL485CONN
,
EVENT_CONN_HANGUP
,
EVENT_CONN_RESUME
,
EVENT_DISARM_PWD_ERR
,
EVENT_SUB_MACHINE_SENSOR_EXCEPTION
,
EVENT_SUB_MACHINE_SENSOR_RESUME
,
EVENT_SUB_MACHINE_POWER_EXCEPTION
,
EVENT_SUB_MACHINE_POWER_RESUME
,
EVENT_COM_PASSTHROUGH
,
EVENT_ENTER_SET_MODE
,
EVENT_EXIT_SET_MODE
,
EVENT_QUERY_SUB_MACHINE
,
EVENT_WRITE_TO_MACHINE
,
EVENT_I_AM_NET_MODULE
,
EVENT_I_AM_GPRS
,
EVENT_I_AM_LCD_MACHINE
,
EVENT_I_AM_WIRE_MACHINE
,
EVENT_I_AM_WIFI_MACHINE
,
EVENT_I_AM_3_SECTION_MACHINE
,
EVENT_I_AM_IOT_MACHINE
,
EVENT_I_AM_TRUE_COLOR
,
EVENT_I_AM_GPRS_IOT
,
EVENT_I_AM_GPRS_PHONE
,
EVENT_I_AM_NB_MACHINE
,
EVENT_I_AM_WIFI2_MACHINE
,
EVENT_SIM_IS_IOT_CARD
,
EVENT_SIM_IS_IOT_PLATFORM_CARD
,
EVENT_SIM_IS_NOT_IOT_CARD
,
EVENT_PHONE_USER_SOS
,
EVENT_PHONE_USER_CANCLE_ALARM
,
EVENT_ENTER_SETTING_MODE
,
EVENT_EXIT_SETTING_MODE
,
EVENT_RESTORE_FACTORY_SETTINGS
,
EVENT_WHAT_IS_YOUR_TYPE
,
EVENT_SIGNAL_STRENGTH_CHANGED
,
};
// 安定宝事件级别
typedef
enum
AdemcoEventLevel
{
EVENT_LEVEL_NULL
,
...
...
@@ -372,6 +292,8 @@ typedef struct AdemcoPacket {
//////////////////////// Functions ////////////////////////
ADEMCO_EXPORT_SYMBOL
unsigned
int
ademcoVersion
(
void
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoVersionString
(
void
);
//! print as HEX
ADEMCO_EXPORT_SYMBOL
void
ademcoPrint
(
const
ademco_char_t
*
buff
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
uint8_t
ademcoEncodeSignalStrength
(
uint8_t
strength
);
...
...
@@ -379,20 +301,28 @@ ADEMCO_EXPORT_SYMBOL uint8_t ademcoDecodeSignalStrength(uint8_t code);
//////////////////////// AdemcoEvent functions ////////////////////////
//! 是否合法主机账号
ADEMCO_EXPORT_SYMBOL
int
ademcoIsValidAccount
(
const
char
*
acct
);
ADEMCO_EXPORT_SYMBOL
int
ademcoIsValidAccount
(
const
char
*
acct
);
//! 是否主机状态事件
ADEMCO_EXPORT_SYMBOL
int
ademcoIsMachineStatusEvent
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
int
ademcoIsMachineStatusEvent
(
AdemcoEvent
ademcoEvent
);
//! 是否主机类型事件
ADEMCO_EXPORT_SYMBOL
int
ademcoIsMachineTypeEvent
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
int
ademcoIsMachineTypeEvent
(
AdemcoEvent
ademcoEvent
);
//! 事件是否需要控制源
ADEMCO_EXPORT_SYMBOL
int
ademcoIsEventNeedControlSource
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
int
ademcoIsEventNeedControlSource
(
AdemcoEvent
ademcoEvent
);
//! 获取安定宝事件级别
ADEMCO_EXPORT_SYMBOL
AdemcoEventLevel
ademcoGetEventLevel
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
AdemcoEventLevel
ademcoGetEventLevel
(
AdemcoEvent
ademcoEvent
);
//! 获取异常恢复事件所对应的异常事件
ADEMCO_EXPORT_SYMBOL
AdemcoEvent
ademcoGetExceptionEventByResumeEvent
(
AdemcoEvent
resumeEvent
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoEventToString
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
AdemcoEvent
ademcoGetExceptionEventByResumeEvent
(
AdemcoEvent
resumeEvent
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoEventToString
(
AdemcoEvent
ademcoEvent
);
#ifdef ADEMCO_ENABLE_CHINESE
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
);
#endif
//////////////////////// AdemcoDataSegment functions ////////////////////////
...
...
@@ -415,39 +345,62 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoAppendDataSegment2(AdemcoDataSegment* dataSegm
//! parse `DATA` packet, if ok, `dataSegment`'s members will be useful
//! err can be NULL; caller should only check err on got RESULT_ERROR
ADEMCO_EXPORT_SYMBOL
AdemcoParseResult
ademcoParseDataSegment
(
const
ademco_char_t
*
packet
,
ADEMCO_EXPORT_SYMBOL
AdemcoParseResult
ademcoParseDataSegment
(
const
ademco_char_t
*
packet
,
size_t
packet_len
,
AdemcoDataSegment
*
dataSegment
,
AdemcoParseError
*
err
);
// return 0 for empty packet, CONGWIN_FE100_PACKET_LEN for success
ADEMCO_EXPORT_SYMBOL
size_t
ademcoDataSegmentToCongwinFe100
(
ademco_char_t
*
fe100
,
size_t
fe100_len
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoDataSegmentToCongwinFe100
(
ademco_char_t
*
fe100
,
size_t
fe100_len
,
const
AdemcoDataSegment
*
dataSegment
);
//////////////////////// AdemcoXDataSegment functions ////////////////////////
// init a empty xdata
ADEMCO_EXPORT_SYMBOL
void
ademcoXDataInit
(
AdemcoXDataSegment
*
xdata
);
// return ADEMCO_OK for success, ADEMCO_ERR for failed
ADEMCO_EXPORT_SYMBOL
int
ademcoXDataConvert
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
);
ADEMCO_EXPORT_SYMBOL
int
ademcoXDataConvert
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
);
#ifndef SWIG
// get valid content address of xdata (except [len])
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoXDataGetValidContentAddr
(
const
AdemcoXDataSegment
*
xdata
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoXDataGetValidContentAddr
(
const
AdemcoXDataSegment
*
xdata
);
#endif
// get valid content length of xdata (except [len])
ADEMCO_EXPORT_SYMBOL
size_t
ademcoXDataGetValidContentLen
(
const
AdemcoXDataSegment
*
xdata
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoXDataGetValidContentLen
(
const
AdemcoXDataSegment
*
xdata
);
// return 0 if xdata's valid content is exactly the same as [buf, buf+buf_len)
ADEMCO_EXPORT_SYMBOL
int
ademcoXDataMemcmp
(
const
AdemcoXDataSegment
*
xdata
,
const
void
*
buf
,
size_t
buf_len
);
ADEMCO_EXPORT_SYMBOL
int
ademcoXDataMemcmp
(
const
AdemcoXDataSegment
*
xdata
,
const
void
*
buf
,
size_t
buf_len
);
// copy xdata content from src to dst, return copied length = src.raw_len
ADEMCO_EXPORT_SYMBOL
size_t
ademcoXDataCopy
(
AdemcoXDataSegment
*
dst
,
const
AdemcoXDataSegment
*
src
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoXDataCopy
(
AdemcoXDataSegment
*
dst
,
const
AdemcoXDataSegment
*
src
);
// 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
ademco_char_t
*
content
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
,
const
ademco_char_t
*
content
,
size_t
len
);
//////////////////////// AdemcoPacketId functions ////////////////////////
ADEMCO_EXPORT_SYMBOL
int
isAdemcoPacketId
(
const
char
*
standard
,
const
char
*
id
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
AdemcoPacketId
getAdemcoPacketId
(
const
char
*
id
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
int
isAdemcoPacketId
(
const
char
*
standard
,
const
char
*
id
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
AdemcoPacketId
getAdemcoPacketId
(
const
char
*
id
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoPacketIdToString
(
AdemcoPacketId
id
);
/*
...
...
@@ -456,58 +409,104 @@ ADEMCO_EXPORT_SYMBOL const char* ademcoPacketIdToString(AdemcoPacketId id);
* otherwise return 0
*/
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeEmptyDataPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeEmptyDataPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmEmptyDataPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmEmptyDataPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAckPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAckPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeNakPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeNakPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeHbPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeHbPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
);
// like upper funcs, store buff and len to pkt->raw, pkt->raw_len
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeNullPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAckPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeNakPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeHbPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
);
//! parse a ademco packet, if everything is OK, cb_commited is the packet length
//! err can be NULL; caller should only check err on got RESULT_ERROR
ADEMCO_EXPORT_SYMBOL
AdemcoParseResult
ademcoPacketParse
(
const
ademco_char_t
*
buff
,
size_t
len
,
AdemcoPacket
*
pkt
,
size_t
*
cb_commited
,
ADEMCO_EXPORT_SYMBOL
AdemcoParseResult
ademcoPacketParse
(
const
ademco_char_t
*
buff
,
size_t
len
,
AdemcoPacket
*
pkt
,
size_t
*
cb_commited
,
AdemcoParseError
*
err
);
/* CRC16 implementation according to ARC
...
...
@@ -521,7 +520,8 @@ ADEMCO_EXPORT_SYMBOL AdemcoParseResult ademcoPacketParse(const ademco_char_t* bu
* Xor constant to output CRC : 0x0000
* Output for "123456789" : 0xBB3D
*/
ADEMCO_EXPORT_SYMBOL
uint16_t
ademcoCRC16
(
const
ademco_char_t
*
buff
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
uint16_t
ademcoCRC16
(
const
ademco_char_t
*
buff
,
size_t
len
);
// 将一串以高低字节表示的十六进制数组转换为10进制数字符串
// 每个字节的高四位和低四位若不大于9,将该四位表示的数字以10进制ascii码填入str,否则停止
...
...
@@ -529,7 +529,9 @@ ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC16(const ademco_char_t* buff, size_t len)
// 注意:函数不会在str末尾补 null terminator
// 调用者应确保str有足够空间,至少len的2倍,否则会崩溃
// 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101"
ADEMCO_EXPORT_SYMBOL
size_t
ademcoHiLoArrayToDecStr
(
ademco_char_t
*
str
,
const
uint8_t
*
arr
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoHiLoArrayToDecStr
(
ademco_char_t
*
str
,
const
uint8_t
*
arr
,
size_t
len
);
// 将一串以高低字节表示的十六进制数组转换为字符串
// 每个字节的高四位和低四位若不大于9,将该四位表示的数字以10进制ascii码填入str,否则:
...
...
@@ -539,27 +541,41 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoHiLoArrayToDecStr(ademco_char_t* str, const ui
// 调用者应确保str有足够空间,至少len的2倍,否则会崩溃
// 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101"
// 示例:输入数组:0x24 0x94 0x94 0x4c 0x48 0x15 0xff,输出字符串"2494944C4815"
ADEMCO_EXPORT_SYMBOL
size_t
ademcoHiLoArrayToDecStr2
(
ademco_char_t
*
str
,
const
uint8_t
*
arr
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoHiLoArrayToDecStr2
(
ademco_char_t
*
str
,
const
uint8_t
*
arr
,
size_t
len
);
// 将一个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, 则arr内容为 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78, return 9
// 示例:输入字符串 "18240888101", len=9, 则arr内容为
// 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff
// return 9
// 示例:输入字符串 "12345678901234567890", len=9, 则arr内容为
// 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78
// return 9
// 示例:输入NULL,返回 9个 0xFF
ADEMCO_EXPORT_SYMBOL
size_t
ademcoDecStrToHiLoArray
(
uint8_t
*
arr
,
size_t
len
,
const
char
*
str
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoDecStrToHiLoArray
(
uint8_t
*
arr
,
size_t
len
,
const
char
*
str
);
// 将一个16进制数字符串转为高低字节表示的数组,节省空间
// str应只包含'0'~'9', 'A'~'F', 'a'~'f',否则失败返回0
// str长度若大于len * 2,str[len]及之后的内容将被舍弃以避免溢出
// 转换后的长度若不满len,则以0xF补满。
// 示例:输入字符串"123ABC",len=6, 则 arr 内容为 0x12 0x3a 0xbc 0xff 0xff 0xff
// 示例:输入字符串 "18240888101", len=9, 则arr内容为 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff, return 9
// 示例:输入字符串 "12345678901234567890", len=9, 则arr内容为 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78, return 9
// 示例:输入字符串 "18240888101", len=9, 则arr内容为
// 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff
// return 9
// 示例:输入字符串 "12345678901234567890", len=9, 则arr内容为
// 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78
// return 9
// 示例:输入NULL,返回 9个 0xFF
ADEMCO_EXPORT_SYMBOL
size_t
ademcoDecStrToHiLoArray2
(
uint8_t
*
arr
,
size_t
len
,
const
char
*
str
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoDecStrToHiLoArray2
(
uint8_t
*
arr
,
size_t
len
,
const
char
*
str
);
// 将一串字节流转换为可打印形式
// 返回str长度(len * 2)
...
...
@@ -567,7 +583,9 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray2(uint8_t* arr, size_t len, c
// 注意:函数不会在str末尾补 null terminator
// 示例:输入 arr=[0xEB 0xBA 0x3F], len=3, 则str = "EBBA3F",返回6
// 示例:输入 ary="123", len=3, 则str = "313233",返回6
ADEMCO_EXPORT_SYMBOL
size_t
ademcoHexArrayToStr
(
char
*
str
,
const
uint8_t
*
arr
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoHexArrayToStr
(
char
*
str
,
const
uint8_t
*
arr
,
size_t
len
);
// 将一串字符串(内容为'0'~'9', 'A'~'F', 'a' ~'f')转为字节流
// 若strlen(str)为奇数,以padding补足arr, padding 应 <= 0x0F
...
...
@@ -576,17 +594,25 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoHexArrayToStr(char* str, const uint8_t* arr, s
// 示例:输入字符串str="EBBA3F", 输出arr = [0xEB, 0xBA, 0x3F],返回 3
// 示例:输入字符串str="ABC", padding = 0, 输出arr=[0xAB, 0xC0],返回2
// 示例:输入字符串str="ABC", padding = 0x0F, 输出arr=[0xAB, 0xCF],返回2
ADEMCO_EXPORT_SYMBOL
size_t
ademcoHexStrToArray
(
uint8_t
*
arr
,
const
char
*
str
,
uint8_t
padding
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoHexStrToArray
(
uint8_t
*
arr
,
const
char
*
str
,
uint8_t
padding
);
// 功能同ademcoHexStrToArray
// 若strlen(str) > len, str[len]及之后的内容将被舍弃以避免溢出
// 示例:输入字符串str="ABCDE", len = 4 padding = 0x0F, 输出arr=[0xAB, 0xCD], return 2
ADEMCO_EXPORT_SYMBOL
size_t
ademcoHexStrToArrayN
(
uint8_t
*
arr
,
const
char
*
str
,
size_t
len
,
uint8_t
padding
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoHexStrToArrayN
(
uint8_t
*
arr
,
const
char
*
str
,
size_t
len
,
uint8_t
padding
);
// 同ademcoHexStrToArrayN,但允许str包含非hex字符,即'0'~'9','a'~'f','A'~'F'之外的内容,以 padding 替换
// 同ademcoHexStrToArrayN,但允许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
size_t
ademcoHexStrToArrayN_allow_non_hex_str
(
uint8_t
*
arr
,
const
char
*
str
,
size_t
len
,
uint8_t
padding
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoHexStrToArrayN_allow_non_hex_str
(
uint8_t
*
arr
,
const
char
*
str
,
size_t
len
,
uint8_t
padding
);
#ifdef __cplusplus
}
...
...
ademco_version.h
0 → 100644
View file @
80489de5
#ifndef __ADEMCO_VERSION_H__
#define __ADEMCO_VERSION_H__
/*
* Versions with the same major number are ABI stable. API is allowed to
* evolve between minor releases, but only in a backwards compatible way.
*/
#define ADEMCO_VERSION_MAJOR 1
#define ADEMCO_VERSION_MINOR 0
#define ADEMCO_VERSION_PATCH 0
#define ADEMCO_VERSION_IS_RELEASE 1
#define ADEMCO_VERSION_SUFFIX ""
#define ADEMCO_VERSION_HEX ((ADEMCO_VERSION_MAJOR << 16) | \
(
ADEMCO_VERSION_MINOR
<<
8
)
|
\
(
ADEMCO_VERSION_PATCH
))
#endif
/* __ADEMCO_VERSION_H__ */
examples/gen_event_md/gen_event_md.cpp
View file @
80489de5
...
...
@@ -25,109 +25,38 @@ const char* print_bool(bool b) {
}
AdemcoEvent
statusEvents
[]
=
{
// 主机或分机状态报告
EVENT_ARM
,
EVENT_DISARM
,
EVENT_HALFARM_1456
,
EVENT_HALFARM
,
EVENT_EMERGENCY
,
#define XX(name, code, zh) EVENT_##name,
ADEMCO_STATUS_EVENTS_MAP
(
XX
)
#undef XX
};
AdemcoEvent
alarmEvents
[]
=
{
// 防区报警
EVENT_BURGLAR
,
EVENT_DOORRINGING
,
EVENT_FIRE
,
EVENT_DURESS
,
EVENT_GAS
,
EVENT_WATER
,
EVENT_TAMPER
,
EVENT_ZONE_TAMPER
,
EVENT_BYPASS
,
EVENT_BYPASS_RESUME
,
#define XX(name, code, zh) EVENT_##name,
ADEMCO_ALARM_EVENTS_MAP
(
XX
)
#undef XX
};
AdemcoEvent
excepEvents
[]
=
{
// 防区异常
EVENT_AC_BROKE
,
EVENT_AC_RECOVER
,
EVENT_LOWBATTERY
,
EVENT_BATTERY_RECOVER
,
EVENT_BADBATTERY
,
EVENT_BADBATTERY_RECOVER
,
EVENT_SOLARDISTURB
,
EVENT_SOLARDISTURB_RECOVER
,
EVENT_DISCONNECT
,
EVENT_RECONNECT
,
EVENT_BATTERY_EXCEPTION
,
EVENT_BATTERY_EXCEPTION_RECOVER
,
EVENT_OTHER_EXCEPTION
,
EVENT_OTHER_EXCEPTION_RECOVER
,
EVENT_LOST
,
EVENT_LOST_RECOVER
,
// 标准事件,但不做处理
EVENT_3100
,
#define XX(name, code, zh) EVENT_##name,
ADEMCO_EXEPTION_EVENTS_MAP
(
XX
)
ADEMCO_RESUME_EVENTS_MAP
(
XX
)
#undef XX
};
AdemcoEvent
privateEvents
[]
=
{
#define XX(name, code, zh) EVENT_##name,
ADEMCO_HB_EVENTS_MAP
(
XX
)
#undef XX
};
// ------------------私有事件-----------------------------------------
EVENT_SERIAL485DIS
,
EVENT_SERIAL485CONN
,
EVENT_CONN_HANGUP
,
EVENT_CONN_RESUME
,
EVENT_DISARM_PWD_ERR
,
EVENT_SUB_MACHINE_SENSOR_EXCEPTION
,
EVENT_SUB_MACHINE_SENSOR_RESUME
,
EVENT_SUB_MACHINE_POWER_EXCEPTION
,
EVENT_SUB_MACHINE_POWER_RESUME
,
EVENT_COM_PASSTHROUGH
,
EVENT_ENTER_SET_MODE
,
EVENT_EXIT_SET_MODE
,
EVENT_QUERY_SUB_MACHINE
,
EVENT_WRITE_TO_MACHINE
,
EVENT_I_AM_NET_MODULE
,
EVENT_I_AM_GPRS
,
EVENT_I_AM_LCD_MACHINE
,
EVENT_I_AM_WIRE_MACHINE
,
EVENT_I_AM_WIFI_MACHINE
,
EVENT_I_AM_3_SECTION_MACHINE
,
EVENT_I_AM_IOT_MACHINE
,
EVENT_I_AM_TRUE_COLOR
,
EVENT_I_AM_GPRS_IOT
,
EVENT_I_AM_GPRS_PHONE
,
EVENT_I_AM_NB_MACHINE
,
EVENT_I_AM_WIFI2_MACHINE
,
EVENT_PHONE_USER_SOS
,
EVENT_PHONE_USER_CANCLE_ALARM
,
EVENT_ENTER_SETTING_MODE
,
EVENT_EXIT_SETTING_MODE
,
EVENT_RESTORE_FACTORY_SETTINGS_710
,
EVENT_RESTORE_FACTORY_SETTINGS
,
EVENT_SIM_IS_IOT_CARD
,
EVENT_SIM_IS_IOT_PLATFORM_CARD
,
EVENT_SIM_IS_NOT_IOT_CARD
,
EVENT_WHAT_IS_YOUR_TYPE
,
EVENT_SIGNAL_STRENGTH_CHANGED
,
EVENT_OFFLINE
,
EVENT_ONLINE
,
AdemcoEvent
allEvents
[]
=
{
#define XX(name, code, zh) EVENT_##name,
ADEMCO_STATUS_EVENTS_MAP
(
XX
)
ADEMCO_ALARM_EVENTS_MAP
(
XX
)
ADEMCO_EXEPTION_EVENTS_MAP
(
XX
)
ADEMCO_RESUME_EVENTS_MAP
(
XX
)
ADEMCO_HB_EVENTS_MAP
(
XX
)
#undef XX
};
void
printEvents
(
const
AdemcoEvent
*
events
,
size_t
len
)
...
...
@@ -239,7 +168,7 @@ void print_machineTypes()
printf
(
"|事件码类型|主机类型|布防|撤防|半布防|设置|信号强度|防区|有线防区|SMS|内核|网络|型号|
\n
"
"|---------|-------|----|----|-----|----|-------|----|-------|---|----|---|----|
\n
"
);
for
(
auto
e
:
Ademco
Events
)
{
for
(
auto
e
:
all
Events
)
{
if
(
ademcoIsMachineTypeEvent
(
e
))
{
auto
t
=
hbMachineTypeFromAdemcoEvent
(
e
);
if
(
!
hbMachineIsSelling
(
t
))
continue
;
...
...
@@ -275,7 +204,7 @@ void print_imgs()
"|---|--------|
\n
"
);
std
::
map
<
std
::
string
,
std
::
string
>
imgs
;
for
(
auto
e
:
Ademco
Events
)
{
for
(
auto
e
:
all
Events
)
{
if
(
ademcoIsMachineTypeEvent
(
e
))
{
auto
t
=
hbMachineTypeFromAdemcoEvent
(
e
);
if
(
!
hbMachineIsSelling
(
t
))
continue
;
...
...
@@ -350,8 +279,7 @@ void print_available_zone_props()
}
printf
(
"|
\n
"
);
for
(
auto
e
:
AdemcoEvents
)
{
for
(
auto
e
:
allEvents
)
{
if
(
ademcoIsMachineTypeEvent
(
e
))
{
auto
t
=
hbMachineTypeFromAdemcoEvent
(
e
);
if
(
!
hbMachineIsSelling
(
t
))
continue
;
...
...
hb_com.c
View file @
80489de5
#include "hb_com.h"
#include <string.h>
int
hbGetAvailableZoneProperties
(
HbMachineType
type
,
HbZoneProperty
props
[
12
])
{
int
hbGetAvailableZoneProperties
(
HbMachineType
type
,
HbZoneProperty
props
[
12
])
{
switch
(
type
)
{
case
HMT_WIFI
:
break
;
...
...
@@ -11,60 +12,88 @@ int hbGetAvailableZoneProperties(HbMachineType type, HbZoneProperty props[12]) {
case
HMT_GPRS
:
case
HMT_WIFI2
:
{
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
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
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
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
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
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
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
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
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
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
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
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
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
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
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
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
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
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
...
...
@@ -107,7 +136,8 @@ uint16_t hbZoneMax(HbMachineType type) {
}
int
hbIsValidZone
(
HbMachineType
type
,
uint16_t
zone
)
{
return
ADEMCO_ZONE_FOR_MACHINE_SELF
<=
zone
&&
zone
<=
hbZoneMax
(
type
);
return
ADEMCO_ZONE_FOR_MACHINE_SELF
<=
zone
&&
zone
<=
hbZoneMax
(
type
);
}
int
hbIsValidZoneStrict
(
HbMachineType
type
,
uint16_t
zone
)
{
...
...
@@ -215,8 +245,9 @@ void hbInitMachineTimer(HbMachineTimer* timer) {
}
int
hbIsValidTimePoint
(
HbMachineTimePoint
*
tp
)
{
return
tp
&&
0
<=
tp
->
hour
&&
tp
->
hour
<
24
&&
0
<=
tp
->
minute
&&
tp
->
minute
<
60
;
return
tp
&&
tp
->
hour
<
24
&&
tp
->
minute
<
60
;
}
void
hbTimePointToGreenwich
(
HbMachineTimePoint
*
tp
)
{
...
...
@@ -230,11 +261,15 @@ void hbTimePointFromGreenwich(HbMachineTimePoint* tp) {
}
int
hbIsValidTimer
(
HbTimer
*
timer
)
{
return
timer
&&
hbIsValidTimePoint
(
&
timer
->
armAt
)
&&
hbIsValidTimePoint
(
&
timer
->
disarmAt
);
return
timer
&&
hbIsValidTimePoint
(
&
timer
->
armAt
)
&&
hbIsValidTimePoint
(
&
timer
->
disarmAt
);
}
int
hbIsValidMachineTimer
(
HbMachineTimer
*
timer
)
{
return
timer
&&
hbIsValidTimer
(
&
timer
->
timer
[
0
])
&&
hbIsValidTimer
(
&
timer
->
timer
[
1
]);
return
timer
&&
hbIsValidTimer
(
&
timer
->
timer
[
0
])
&&
hbIsValidTimer
(
&
timer
->
timer
[
1
]);
}
void
hbMachineTimerToGreenwich
(
HbMachineTimer
*
timer
)
{
...
...
@@ -464,7 +499,9 @@ int hbCheckSum(const uint8_t* data, size_t len) {
memcpy(cd->data, data, len & 0xFF); \
}
HbComRequestType
hbComParseRequest
(
const
uint8_t
*
data
,
size_t
len
,
HbComData
*
cd
)
{
HbComRequestType
hbComParseRequest
(
const
uint8_t
*
data
,
size_t
len
,
HbComData
*
cd
)
{
do
{
if
(
len
<
5
)
{
break
;
}
if
(
data
[
0
]
!=
0xEB
)
{
break
;
}
...
...
@@ -536,7 +573,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
if
(
data
[
3
]
==
0x09
&&
data
[
4
]
==
0xA3
&&
len
==
HbComReq_A3_len
)
{
// EB CB 3F 09 A3 P1 P2 P3 SUM
len
==
HbComReq_A3_len
)
{
// EB CB 3F 09 A3 P1 P2 P3 SUM
if
(
hbCheckSum
(
data
,
len
))
{
copy_data_to_com
;
return
HbComReq_A3
;
...
...
@@ -550,7 +588,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
}
}
else
if
(
data
[
3
]
==
0x0E
&&
data
[
4
]
==
0xA7
&&
len
==
HbComReq_A7_len
)
{
// EB CB 3F 0E A7 H1 M1 H2 M2 H3 M3 H4 M4 SUM
len
==
HbComReq_A7_len
)
{
// EB CB 3F 0E A7 H1 M1 H2 M2 H3 M3 H4 M4 SUM
if
(
hbCheckSum
(
data
,
len
))
{
copy_data_to_com
;
return
HbComReq_A7
;
...
...
@@ -564,7 +603,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
else
if
(
data
[
3
]
==
0x08
&&
data
[
4
]
==
0xAA
&&
len
==
HbComReq_AA_len
)
{
// EB CB 3F 08 AA P1 P2 SUM
len
==
HbComReq_AA_len
)
{
// EB CB 3F 08 AA P1 P2 SUM
if
(
hbCheckSum
(
data
,
len
))
{
copy_data_to_com
;
return
HbComReq_AA
;
...
...
@@ -578,7 +618,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
else
if
(
data
[
3
]
==
0x06
&&
data
[
4
]
==
0xB0
&&
len
==
HbComReq_B0_len
&&
memcmp
(
HbComReq_B0_data
,
data
,
len
)
==
0
)
{
// EB CB 3F 06 B0 AB
memcmp
(
HbComReq_B0_data
,
data
,
len
)
==
0
)
{
// EB CB 3F 06 B0 AB
copy_data_to_com
;
return
HbComReq_B0
;
}
...
...
@@ -588,14 +629,19 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
return
HbComReq_Invalid
;
}
ADEMCO_EXPORT_SYMBOL
HbComRequestType
hbComParseXDataRequest
(
const
AdemcoXDataSegment
*
xdata
,
HbComRequestType
hbComParseXDataRequest
(
const
AdemcoXDataSegment
*
xdata
,
HbComData
*
cd
)
{
if
(
!
xdata
)
{
return
HbComReq_Invalid
;
}
return
hbComParseRequest
((
const
uint8_t
*
)
ademcoXDataGetValidContentAddr
(
xdata
),
ademcoXDataGetValidContentLen
(
xdata
),
cd
);
return
hbComParseRequest
(
(
const
uint8_t
*
)
ademcoXDataGetValidContentAddr
(
xdata
),
ademcoXDataGetValidContentLen
(
xdata
),
cd
);
}
HbComResponseType
hbComParseResponse
(
const
uint8_t
*
data
,
size_t
len
,
HbComData
*
cd
)
{
HbComResponseType
hbComParseResponse
(
const
uint8_t
*
data
,
size_t
len
,
HbComData
*
cd
)
{
do
{
if
(
len
<
7
)
{
break
;
}
// 所有的 response ,长度最小为 7
if
(
data
[
0
]
!=
0xEB
||
data
[
1
]
!=
0xBA
||
data
[
2
]
!=
0x3F
)
{
break
;
}
...
...
@@ -720,8 +766,11 @@ HbComResponseType hbComParseResponse(const uint8_t* data, size_t len, HbComData*
HbComResponseType
hbComParseXDataResponse
(
const
AdemcoXDataSegment
*
xdata
,
HbComData
*
cd
)
{
if
(
!
xdata
)
{
return
HbComResp_Invalid
;
}
return
hbComParseResponse
((
const
uint8_t
*
)
ademcoXDataGetValidContentAddr
(
xdata
),
ademcoXDataGetValidContentLen
(
xdata
),
cd
);
return
hbComParseResponse
(
(
const
uint8_t
*
)
ademcoXDataGetValidContentAddr
(
xdata
),
ademcoXDataGetValidContentLen
(
xdata
),
cd
);
}
void
hbComMakeReqA0_getMachineStatus
(
HbComData
*
data
)
{
...
...
@@ -739,8 +788,10 @@ void hbComMakeReqA2_getMoreMachineZones(HbComData* data) {
data
->
len
=
HbComReq_A2_len
;
}
void
hbComMakeReqA3_modifyMachineZone
(
HbComData
*
data
,
uint8_t
zone
,
HbZoneProperty
prop
,
HbComReq_A3_op
op
)
{
void
hbComMakeReqA3_modifyMachineZone
(
HbComData
*
data
,
uint8_t
zone
,
HbZoneProperty
prop
,
HbComReq_A3_op
op
)
{
memcpy
(
data
->
data
,
HbComReq_A3_head
,
5
);
data
->
data
[
5
]
=
zone
;
data
->
data
[
6
]
=
prop
;
...
...
@@ -754,14 +805,17 @@ void hbComMakeReqA5_getMachineTimer(HbComData* data) {
data
->
len
=
HbComReq_A5_len
;
}
void
hbComMakeReqA7_setMachineTimer
(
HbComData
*
data
,
HbMachineTimer
*
timer
)
{
void
hbComMakeReqA7_setMachineTimer
(
HbComData
*
data
,
HbMachineTimer
*
timer
)
{
memcpy
(
data
->
data
,
HbComReq_A7_head
,
5
);
memcpy
(
data
->
data
+
5
,
timer
,
sizeof
(
*
timer
));
data
->
len
=
HbComReq_A7_len
;
hbSum
(
data
->
data
,
data
->
len
);
}
void
hbComMakeReqAA_modifyMachineZoneLostConfig
(
HbComData
*
data
,
uint8_t
zone
,
int
on
)
{
void
hbComMakeReqAA_modifyMachineZoneLostConfig
(
HbComData
*
data
,
uint8_t
zone
,
int
on
)
{
memcpy
(
data
->
data
,
HbComReq_AA_head
,
5
);
data
->
data
[
5
]
=
zone
;
data
->
data
[
6
]
=
!!
on
;
...
...
@@ -779,7 +833,8 @@ void hbComMakeReqAD_getMoreMachineZoneLostConfig(HbComData* data) {
data
->
len
=
HbComReq_AD_len
;
}
void
hbComMakeReqAE_set3SectionMachineStatus
(
HbComData
*
data
,
HbCom_3sec_which
p1
,
void
hbComMakeReqAE_set3SectionMachineStatus
(
HbComData
*
data
,
HbCom_3sec_which
p1
,
HbCom_3sec_status
status
)
{
memcpy
(
data
->
data
,
HbComReq_AE_head
,
5
);
data
->
data
[
5
]
=
p1
;
...
...
@@ -805,7 +860,8 @@ void hbComMakeReqWR_acct(HbComData* data, const char* acct) {
hbSum
(
data
->
data
,
data
->
len
);
}
void
hbComResp_A2_Iter_init
(
HbComResp_A2_Iter
*
iter
,
const
HbComData
*
com
)
{
void
hbComResp_A2_Iter_init
(
HbComResp_A2_Iter
*
iter
,
const
HbComData
*
com
)
{
if
(
!
iter
||
!
com
)
return
;
memcpy
(
&
iter
->
com
,
com
,
sizeof
(
HbComData
));
iter
->
i
=
0
;
...
...
@@ -820,7 +876,8 @@ void hbComResp_A2_Iter_init(HbComResp_A2_Iter* iter, const HbComData* com) {
}
}
HbComResp_A2_p1
hbComResp_A2_Iter_next
(
HbComResp_A2_Iter
*
iter
,
HbZoneAndProperty
*
zp
)
{
HbComResp_A2_p1
hbComResp_A2_Iter_next
(
HbComResp_A2_Iter
*
iter
,
HbZoneAndProperty
*
zp
)
{
if
(
iter
->
i
==
iter
->
total
)
return
HbComResp_A2_p1_nomore
;
zp
->
zone
=
iter
->
com
.
data
[
6
+
iter
->
i
*
2
];
...
...
@@ -829,7 +886,8 @@ HbComResp_A2_p1 hbComResp_A2_Iter_next(HbComResp_A2_Iter* iter, HbZoneAndPropert
return
HbComResp_A2_p1_more
;
}
void
hbComMakeRespA0_getMachineStatus
(
HbComData
*
data
,
HbMachineStatus
status
,
void
hbComMakeRespA0_getMachineStatus
(
HbComData
*
data
,
HbMachineStatus
status
,
HbMachineType
type
)
{
memcpy
(
data
->
data
,
HbComResp_A0_head
,
6
);
data
->
data
[
6
]
=
status
;
...
...
@@ -838,8 +896,11 @@ void hbComMakeRespA0_getMachineStatus(HbComData* data, HbMachineStatus status,
hbSum
(
data
->
data
,
data
->
len
);
}
void
hbComMakeRespA2_getMachineZones
(
HbComData
*
data
,
size_t
count
,
AdemcoZone
*
zones
,
HbZoneProperty
*
props
,
HbComResp_A2_p1
p1
)
{
void
hbComMakeRespA2_getMachineZones
(
HbComData
*
data
,
size_t
count
,
AdemcoZone
*
zones
,
HbZoneProperty
*
props
,
HbComResp_A2_p1
p1
)
{
if
(
count
>
HbComResp_A2_max_zone
)
{
return
;
}
memcpy
(
data
->
data
,
HbComResp_A2_head
,
6
);
data
->
data
[
3
]
=
(
HbComResp_A2_len_min
+
count
*
2
)
&
0xFF
;
...
...
@@ -858,8 +919,10 @@ void hbComMakeRespA3_waitingSignal(HbComData* data) {
data
->
len
=
HbComResp_A3_len
;
}
void
hbComMakeRespA4_modifyMachineZone
(
HbComData
*
data
,
AdemcoZone
zone
,
HbZoneProperty
prop
,
HbComResp_A4_p3
p3
)
{
void
hbComMakeRespA4_modifyMachineZone
(
HbComData
*
data
,
AdemcoZone
zone
,
HbZoneProperty
prop
,
HbComResp_A4_p3
p3
)
{
memcpy
(
data
->
data
,
HbComResp_A4_head
,
6
);
data
->
data
[
6
]
=
zone
&
0xFF
;
data
->
data
[
7
]
=
prop
;
...
...
@@ -868,7 +931,8 @@ void hbComMakeRespA4_modifyMachineZone(HbComData* data, AdemcoZone zone,
hbSum
(
data
->
data
,
data
->
len
);
}
void
hbComMakeRespA6_getMachineTimer
(
HbComData
*
data
,
HbMachineTimer
*
timer
)
{
void
hbComMakeRespA6_getMachineTimer
(
HbComData
*
data
,
HbMachineTimer
*
timer
)
{
memcpy
(
data
->
data
,
HbComResp_A6_head
,
6
);
memcpy
(
data
->
data
+
6
,
timer
->
data
,
sizeof
(
*
timer
));
data
->
len
=
HbComResp_A6_len
;
...
...
@@ -885,7 +949,8 @@ void hbComMakeRespA8_reject(HbComData* data) {
data
->
len
=
HbComResp_A8_len
;
}
void
hbComMakeRespAB_modifyMachineZoneLostConfig
(
HbComData
*
data
,
AdemcoZone
zone
,
void
hbComMakeRespAB_modifyMachineZoneLostConfig
(
HbComData
*
data
,
AdemcoZone
zone
,
HbComResp_AB_p2
p2
)
{
memcpy
(
data
->
data
,
HbComResp_AB_head
,
6
);
data
->
data
[
6
]
=
zone
&
0xFF
;
...
...
@@ -894,12 +959,17 @@ void hbComMakeRespAB_modifyMachineZoneLostConfig(HbComData* data, AdemcoZone zon
hbSum
(
data
->
data
,
data
->
len
);
}
void
hbComMakeRespAD_getMachineZoneLostConfig
(
HbComData
*
data
,
HbComResp_AD_p1
p1
,
size_t
count
,
AdemcoZone
*
zones
,
void
hbComMakeRespAD_getMachineZoneLostConfig
(
HbComData
*
data
,
HbComResp_AD_p1
p1
,
size_t
count
,
AdemcoZone
*
zones
,
HbComResp_AD_p2
p2
)
{
if
(
count
>
HbComResp_AD_max_zone
)
{
return
;
}
memcpy
(
data
->
data
,
HbComResp_AD_head
,
6
);
data
->
data
[
3
]
=
(
HbComResp_AD_len_min
+
(
p1
==
HbComResp_AD_p1_single
?
count
:
count
*
2
))
&
0xFF
;
data
->
data
[
3
]
=
(
HbComResp_AD_len_min
+
(
p1
==
HbComResp_AD_p1_single
?
count
:
count
*
2
)
)
&
0xFF
;
data
->
data
[
6
]
=
p1
;
uint8_t
*
p
=
data
->
data
+
7
;
for
(
size_t
i
=
0
;
i
<
count
;
i
++
)
{
...
...
@@ -915,7 +985,8 @@ void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* data, HbComResp_AD_p1 p
hbSum
(
data
->
data
,
data
->
len
);
}
void
hbComMakeRespAF_set3SectionMachineStatus
(
HbComData
*
data
,
HbCom_3sec_which
p1
,
void
hbComMakeRespAF_set3SectionMachineStatus
(
HbComData
*
data
,
HbCom_3sec_which
p1
,
HbCom_3sec_status
status
)
{
memcpy
(
data
->
data
,
HbComResp_AF_head
,
6
);
data
->
data
[
6
]
=
p1
;
...
...
@@ -930,12 +1001,17 @@ void hbComMakeRespB1_get3SectionMachineStatus(HbComData* data,
HbMachineStatus
statusSec2
,
HbMachineStatus
statusSec3
)
{
memcpy
(
data
->
data
,
HbComResp_B1_head
,
6
);
data
->
data
[
6
]
=
(
statusMachine
<<
6
)
|
(
statusSec1
<<
4
)
|
(
statusSec2
<<
2
)
|
(
statusSec3
);
data
->
data
[
6
]
=
(
statusMachine
<<
6
)
|
(
statusSec1
<<
4
)
|
(
statusSec2
<<
2
)
|
(
statusSec3
);
data
->
len
=
HbComResp_B1_len
;
hbSum
(
data
->
data
,
data
->
len
);
}
void
hbComDataToAdemcoXData
(
const
HbComData
*
const
data
,
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
)
{
void
hbComDataToAdemcoXData
(
const
HbComData
*
const
data
,
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
)
{
ademcoMakeXData
(
xdata
,
xlf
,
xtr
,
(
const
char
*
)
data
->
data
,
data
->
len
);
}
hb_com.h
View file @
80489de5
/*
* Hengbo COM library
* captainwong
* 2022-8-12 rewrited this C version
*/
#ifndef __HB_COM_H__
#define __HB_COM_H__
...
...
@@ -21,7 +15,8 @@ extern "C" {
//! 是否合法的三防区主机状态GG
static
inline
int
hbIsValid3SectionMachineGG
(
AdemcoGG
gg
)
{
return
HB_3SECTION_MACHINE_GG_MIN
<=
gg
&&
gg
<=
HB_3SECTION_MACHINE_GG_MAX
;
return
HB_3SECTION_MACHINE_GG_MIN
<=
gg
&&
gg
<=
HB_3SECTION_MACHINE_GG_MAX
;
}
//! 主机状态
...
...
@@ -232,33 +227,41 @@ typedef enum HbComResp_A4_p3 {
HbComResp_A4_p3_ne
=
0x03
,
//! 失败--防区未对码 not exists
}
HbComResp_A4_p3
;
//! 获取主机定时器 EB AB 3F A5 7A
//! 获取主机定时器
//! EB AB 3F A5 7A
#define HbComReq_A5_len 5
#define HbComReq_A5_data "\xEB\xAB\x3F\xA5\x7A"
//! 获取主机定时器回应 EB BA 3F 0F P0 A6 H1 M1 H2 M2 H3 M3 H4 M4 SUM
//! 获取主机定时器回应
//! EB BA 3F 0F P0 A6 H1 M1 H2 M2 H3 M3 H4 M4 SUM
#define HbComResp_A6_len 15
#define HbComResp_A6_head "\xEB\xBA\x3F\x0F\xCC\xA6"
//! 设置主机定时器 EB CB 3F 0E A7 H1 M1 H2 M2 H3 M3 H4 M4 SUM
//! 设置主机定时器
//! EB CB 3F 0E A7 H1 M1 H2 M2 H3 M3 H4 M4 SUM
#define HbComReq_A7_len 14
#define HbComReq_A7_head "\xEB\xCB\x3F\x0E\xA7"
#define hbComResq_A7_to_timer(a7, timer) memcpy((timer)->data, (a7) + 5, 8);
#define hbComResq_A7_to_timer(a7, timer) \
memcpy((timer)->data, (a7) + 5, 8);
//! 设置主机定时器回应 EB BA 3F 07 P0 A7 SUM
//! 设置主机定时器回应
//! EB BA 3F 07 P0 A7 SUM
#define HbComResp_A7_len 7
#define HbComResp_A7_data "\xEB\xBA\x3F\x07\xCC\xA7\x5E"
//! 拒绝设置回应 EB BA 3F 07 P0 A8 SUM
//! 拒绝设置回应
//! EB BA 3F 07 P0 A8 SUM
//! 任何操作,主机如果认为非法,都可以用A8直接回复
#define HbComResp_A8_len 7
#define HbComResp_A8_data "\xEB\xBA\x3F\x07\xCC\xA8\x5F"
//! 修改防区探头遗失/失联 EB CB 3F 08 AA P1 P2 SUM
//! 修改防区探头遗失/失联
//! EB CB 3F 08 AA P1 P2 SUM
#define HbComReq_AA_len 8
#define HbComReq_AA_head "\xEB\xAB\x3F\x08\xAA"
//! 修改防区探头遗失/失联回应 EB BA 3F 09 P0 AB P1 P2 SUM
//! 修改防区探头遗失/失联回应
//! EB BA 3F 09 P0 AB P1 P2 SUM
#define HbComResp_AB_len 9
#define HbComResp_AB_head "\xEB\xBA\x3F\x09\xCC\xAB"
typedef
enum
HbComResp_AB_p2
{
...
...
@@ -267,21 +270,26 @@ typedef enum HbComResp_AB_p2 {
HbComResp_AB_p2_reject
=
2
,
// 拒绝操作
}
HbComResp_AB_p2
;
//! 索要防区探头遗失/失联 第一次索要 EB AB 3F AC 81
//! 索要防区探头遗失/失联,第一次索要
//! EB AB 3F AC 81
#define HbComReq_AC_len 5
#define HbComReq_AC_data "\xEB\xAB\x3F\xAC\x81"
//! 索要防区探头遗失/失联 索要更多 EB AB 3F AD 82
//! 索要防区探头遗失/失联,索要更多
//! EB AB 3F AD 82
#define HbComReq_AD_len 5
#define HbComReq_AD_data "\xEB\xAB\x3F\xAD\x82"
//! 索要防区探头遗失/失联回应 EB BA 3F PN P0 AD P1 DATA P2 SUM
//! 索要防区探头遗失/失联回应
//! EB BA 3F PN P0 AD P1 DATA P2 SUM
// 无防区失联数据时一包长度最小为9
#define HbComResp_AD_len_min 9
// 一包最多包含20个防区
#define HbComResp_AD_max_zone 20
// 一包最多有 9 + 20 *2 = 49 个字节
#define HbComResp_AD_len_max (HbComResp_AD_len_min + HbComResp_AD_max_zone * 2)
#define HbComResp_AD_len_max \
(HbComResp_AD_len_min + HbComResp_AD_max_zone * 2)
typedef
enum
HbComResp_AD_p1
{
HbComResp_AD_p1_single
=
0xF0
,
// 防区号以单字节表示
HbComResp_AD_p1_double
=
0xF1
,
// 防区号以双字节表示
...
...
@@ -319,10 +327,17 @@ typedef enum HbCom_3sec_which {
//! 三区段主机状态回应 EB BA 3F 08 P0 B1 P1 SUM
#define HbComResp_B1_len 8
#define HbComResp_B1_head "\xEB\xBA\x3F\x08\xCC\xB1"
#define hbComResp_B1_status(d) ((((d)[6] >> 6) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status1(d) ((((d)[6] >> 4) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status2(d) ((((d)[6] >> 2) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status3(d) ((((d)[6]) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status(d) \
((((d)[6] >> 6) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status1(d) \
((((d)[6] >> 4) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status2(d) \
((((d)[6] >> 2) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status3(d) \
((((d)[6]) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
//! 读取主机账号
#define HbComReq_RD_acct_len 7
...
...
@@ -341,11 +356,14 @@ typedef enum HbCom_3sec_which {
#define HbComResp_WR_acct_head HbComReq_WR_acct_head
static
const
HbZoneProperty
hbZoneProperties
[
12
]
=
{
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
};
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
,
};
// return available count
ADEMCO_EXPORT_SYMBOL
int
hbGetAvailableZoneProperties
(
HbMachineType
type
,
HbZoneProperty
props
[
12
]);
ADEMCO_EXPORT_SYMBOL
int
hbGetAvailableZoneProperties
(
HbMachineType
type
,
HbZoneProperty
props
[
12
]);
//! 最大防区号根据型号不同而不同
ADEMCO_EXPORT_SYMBOL
uint16_t
hbZoneMax
(
HbMachineType
type
);
...
...
@@ -409,56 +427,106 @@ ADEMCO_EXPORT_SYMBOL void hbSum(uint8_t* data, size_t len);
// 校验和是否正确, return 0 for incorrect, otherwise correct
ADEMCO_EXPORT_SYMBOL
int
hbCheckSum
(
const
uint8_t
*
data
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
HbComRequestType
hbComParseRequest
(
const
uint8_t
*
buff
,
size_t
len
,
HbComData
*
cd
);
ADEMCO_EXPORT_SYMBOL
HbComRequestType
hbComParseXDataRequest
(
const
AdemcoXDataSegment
*
xdata
,
HbComData
*
cd
);
// parse COM response and return response type. If cd is non-NULL, valid data will be copied to cd
ADEMCO_EXPORT_SYMBOL
HbComResponseType
hbComParseResponse
(
const
uint8_t
*
buff
,
size_t
len
,
HbComData
*
cd
);
// parse COM response and return response type. If cd is non-NULL, valid data will be copied to cd
ADEMCO_EXPORT_SYMBOL
HbComResponseType
hbComParseXDataResponse
(
const
AdemcoXDataSegment
*
xdata
,
HbComData
*
cd
);
ADEMCO_EXPORT_SYMBOL
HbComRequestType
hbComParseRequest
(
const
uint8_t
*
buff
,
size_t
len
,
HbComData
*
cd
);
ADEMCO_EXPORT_SYMBOL
HbComRequestType
hbComParseXDataRequest
(
const
AdemcoXDataSegment
*
xdata
,
HbComData
*
cd
);
// parse COM response and return response type.
// If cd is non-NULL, valid data will be copied to cd
ADEMCO_EXPORT_SYMBOL
HbComResponseType
hbComParseResponse
(
const
uint8_t
*
buff
,
size_t
len
,
HbComData
*
cd
);
// parse COM response and return response type.
// If cd is non-NULL, valid data will be copied to cd
ADEMCO_EXPORT_SYMBOL
HbComResponseType
hbComParseXDataResponse
(
const
AdemcoXDataSegment
*
xdata
,
HbComData
*
cd
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqA0_getMachineStatus
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqA1_getMachineZones
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqA2_getMoreMachineZones
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqA3_modifyMachineZone
(
HbComData
*
data
,
uint8_t
zone
,
HbZoneProperty
prop
,
HbComReq_A3_op
op
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqA3_modifyMachineZone
(
HbComData
*
data
,
uint8_t
zone
,
HbZoneProperty
prop
,
HbComReq_A3_op
op
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqA5_getMachineTimer
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqA7_setMachineTimer
(
HbComData
*
data
,
HbMachineTimer
*
timer
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqA7_setMachineTimer
(
HbComData
*
data
,
HbMachineTimer
*
timer
);
// TODO
// ADEMCO_EXPORT_SYMBOL void hbComMakeReqA9(HbComData* data, HbMachineStatus status, HbMachineType type);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqAA_modifyMachineZoneLostConfig
(
HbComData
*
data
,
uint8_t
zone
,
int
on
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqAA_modifyMachineZoneLostConfig
(
HbComData
*
data
,
uint8_t
zone
,
int
on
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqAC_getMachineZoneLostConfig
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqAD_getMoreMachineZoneLostConfig
(
HbComData
*
data
);
// p2 must be HbCom_3sec_arm or HbCom_3sec_disarm
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqAE_set3SectionMachineStatus
(
HbComData
*
data
,
HbCom_3sec_which
p1
,
HbCom_3sec_status
status
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqAE_set3SectionMachineStatus
(
HbComData
*
data
,
HbCom_3sec_which
p1
,
HbCom_3sec_status
status
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqB0_get3SectionMachineStatus
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqRD_acct
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqWR_acct
(
HbComData
*
data
,
const
char
*
acct
);
ADEMCO_EXPORT_SYMBOL
void
hbComResp_A2_Iter_init
(
HbComResp_A2_Iter
*
iter
,
const
HbComData
*
com
);
ADEMCO_EXPORT_SYMBOL
HbComResp_A2_p1
hbComResp_A2_Iter_next
(
HbComResp_A2_Iter
*
iter
,
HbZoneAndProperty
*
zp
);
ADEMCO_EXPORT_SYMBOL
void
hbComResp_A2_Iter_init
(
HbComResp_A2_Iter
*
iter
,
const
HbComData
*
com
);
ADEMCO_EXPORT_SYMBOL
HbComResp_A2_p1
hbComResp_A2_Iter_next
(
HbComResp_A2_Iter
*
iter
,
HbZoneAndProperty
*
zp
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA0_getMachineStatus
(
HbComData
*
data
,
HbMachineStatus
status
,
HbMachineType
type
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA0_getMachineStatus
(
HbComData
*
data
,
HbMachineStatus
status
,
HbMachineType
type
);
// zones and props length is count
// if count is 0, p1 wil be set to HbComResp_A2_p1_nomore
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA2_getMachineZones
(
HbComData
*
data
,
size_t
count
,
AdemcoZone
*
zones
,
HbZoneProperty
*
props
,
HbComResp_A2_p1
p1
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA2_getMachineZones
(
HbComData
*
data
,
size_t
count
,
AdemcoZone
*
zones
,
HbZoneProperty
*
props
,
HbComResp_A2_p1
p1
);
// 学码开始,等待探测器无线信号中
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA3_waitingSignal
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA4_modifyMachineZone
(
HbComData
*
data
,
AdemcoZone
zone
,
HbZoneProperty
prop
,
HbComResp_A4_p3
p3
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA6_getMachineTimer
(
HbComData
*
data
,
HbMachineTimer
*
timer
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA4_modifyMachineZone
(
HbComData
*
data
,
AdemcoZone
zone
,
HbZoneProperty
prop
,
HbComResp_A4_p3
p3
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA6_getMachineTimer
(
HbComData
*
data
,
HbMachineTimer
*
timer
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA7_setMachineTimer
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA8_reject
(
HbComData
*
data
);
// TODO
// ADEMCO_EXPORT_SYMBOL void hbComMakeRespA9_(HbComData* data);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespAB_modifyMachineZoneLostConfig
(
HbComData
*
data
,
AdemcoZone
zone
,
HbComResp_AB_p2
p2
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespAB_modifyMachineZoneLostConfig
(
HbComData
*
data
,
AdemcoZone
zone
,
HbComResp_AB_p2
p2
);
// 返回所有失联开的防区
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespAD_getMachineZoneLostConfig
(
HbComData
*
data
,
HbComResp_AD_p1
p1
,
size_t
count
,
AdemcoZone
*
zones
,
HbComResp_AD_p2
p2
);
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
,
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespAD_getMachineZoneLostConfig
(
HbComData
*
data
,
HbComResp_AD_p1
p1
,
size_t
count
,
AdemcoZone
*
zones
,
HbComResp_AD_p2
p2
);
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
);
ADEMCO_EXPORT_SYMBOL
void
hbComDataToAdemcoXData
(
const
HbComData
*
const
data
,
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
);
#ifdef __cplusplus
}
...
...
tools/copy_from_hb.bat
View file @
80489de5
...
...
@@ -2,3 +2,4 @@ xcopy /i /s /y G:\dev_libs\ademco\hb\ademco.h ..\
xcopy /i /s /y G:\dev_libs\ademco\hb\ademco.c ..\
xcopy /i /s /y G:\dev_libs\ademco\hb\hb_com.h ..\
xcopy /i /s /y G:\dev_libs\ademco\hb\hb_com.c ..\
xcopy /i /s /y G:\dev_libs\ademco\hb\ademco_version.h ..\
tools/mkrelease.sh
View file @
80489de5
...
...
@@ -18,6 +18,14 @@ export MACOS_TARGET=jack@JackMacBook-Pro.local
export
MACOS_PROJECT_PATH
=
/Users/jack/projects/ademco_hb
export
MACOS_JAVA_HOME
=
/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home
major
=
`
cat
../ademco_version.h |
grep
ADEMCO_VERSION_MAJOR |
head
-n1
|
awk
'{print $3}'
`
minor
=
`
cat
../ademco_version.h |
grep
ADEMCO_VERSION_MINOR |
head
-n1
|
awk
'{print $3}'
`
patch
=
`
cat
../ademco_version.h |
grep
ADEMCO_VERSION_PATCH |
head
-n1
|
awk
'{print $3}'
`
version
=
$major
.
$minor
.
$patch
echo
"version:
$version
"
rm
-rf
dist
mkdir
-p
dist
...
...
@@ -44,3 +52,8 @@ mkdir -p dist
# mac-node
./mk_macos_node.sh
mv
dist ademco_hb-
$version
tar
-zcvf
ademco_hb-
$version
.tar.gz ademco_hb-
$version
zip
-r
ademco_hb-
$version
.zip ademco_hb-
$version
rm
-rf
ademco_hb-
$version
tools/test.sh
View file @
80489de5
#!/bin/bash
# win-node
./clean.sh
mkdir
-p
win_node
./win_node.bat
cp
-r
../swig/build/ win_node/
cp
../swig/nodejs-demo.js win_node/
rm
-f
win_node.zip
cd
win_node
zip
-r
../win_node.zip
.
*
cd
..
rm
-rf
win_node/
CURRENT_DIR
=
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
;
pwd
-P
)
cd
$CURRENT_DIR
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