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
* Ademco library
* captainwong
* captainwong
* 2022-6-13 rewrited this C version
* 2022-6-13 rewrited this C version
*/
*/
#include "ademco.h"
#include "ademco.h"
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#ifdef _DEBUG
#ifdef _DEBUG
#define dprintf printf
#define dprintf printf
...
@@ -22,6 +23,27 @@
...
@@ -22,6 +23,27 @@
dline; \
dline; \
dprintf
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
)
{
static
uint8_t
hex2char
(
uint8_t
h
)
{
h
&=
0x0F
;
h
&=
0x0F
;
if
(
h
>
9
)
if
(
h
>
9
)
...
@@ -107,18 +129,30 @@ int ademcoIsEventNeedControlSource(AdemcoEvent ademcoEvent) {
...
@@ -107,18 +129,30 @@ int ademcoIsEventNeedControlSource(AdemcoEvent ademcoEvent) {
AdemcoEvent
ademcoGetExceptionEventByResumeEvent
(
AdemcoEvent
resumeEvent
)
{
AdemcoEvent
ademcoGetExceptionEventByResumeEvent
(
AdemcoEvent
resumeEvent
)
{
switch
(
resumeEvent
)
{
switch
(
resumeEvent
)
{
case
EVENT_RECONNECT
:
return
EVENT_DISCONNECT
;
case
EVENT_RECONNECT
:
case
EVENT_LOST_RECOVER
:
return
EVENT_LOST
;
return
EVENT_DISCONNECT
;
case
EVENT_SERIAL485CONN
:
return
EVENT_SERIAL485DIS
;
case
EVENT_LOST_RECOVER
:
case
EVENT_SUB_MACHINE_SENSOR_RESUME
:
return
EVENT_SUB_MACHINE_SENSOR_EXCEPTION
;
return
EVENT_LOST
;
case
EVENT_SUB_MACHINE_POWER_RESUME
:
return
EVENT_SUB_MACHINE_POWER_EXCEPTION
;
case
EVENT_SERIAL485CONN
:
case
EVENT_BATTERY_RECOVER
:
return
EVENT_LOWBATTERY
;
return
EVENT_SERIAL485DIS
;
case
EVENT_BATTERY_EXCEPTION_RECOVER
:
return
EVENT_BATTERY_EXCEPTION
;
case
EVENT_SUB_MACHINE_SENSOR_RESUME
:
case
EVENT_OTHER_EXCEPTION_RECOVER
:
return
EVENT_OTHER_EXCEPTION
;
return
EVENT_SUB_MACHINE_SENSOR_EXCEPTION
;
case
EVENT_AC_RECOVER
:
return
EVENT_AC_BROKE
;
case
EVENT_SUB_MACHINE_POWER_RESUME
:
case
EVENT_SOLARDISTURB_RECOVER
:
return
EVENT_SOLARDISTURB
;
return
EVENT_SUB_MACHINE_POWER_EXCEPTION
;
case
EVENT_BADBATTERY_RECOVER
:
return
EVENT_BADBATTERY
;
case
EVENT_BATTERY_RECOVER
:
default:
return
EVENT_INVALID_EVENT
;
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) {
...
@@ -149,7 +183,7 @@ AdemcoEventLevel ademcoGetEventLevel(AdemcoEvent ademcoEvent) {
case
EVENT_SOLARDISTURB
:
case
EVENT_SOLARDISTURB
:
case
EVENT_DISCONNECT
:
case
EVENT_DISCONNECT
:
case
EVENT_LOST
:
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_SENSOR_EXCEPTION
:
case
EVENT_SUB_MACHINE_POWER_EXCEPTION
:
case
EVENT_SUB_MACHINE_POWER_EXCEPTION
:
case
EVENT_BATTERY_EXCEPTION
:
case
EVENT_BATTERY_EXCEPTION
:
...
@@ -174,160 +208,42 @@ AdemcoEventLevel ademcoGetEventLevel(AdemcoEvent ademcoEvent) {
...
@@ -174,160 +208,42 @@ AdemcoEventLevel ademcoGetEventLevel(AdemcoEvent ademcoEvent) {
const
char
*
ademcoEventToString
(
AdemcoEvent
ademcoEvent
)
{
const
char
*
ademcoEventToString
(
AdemcoEvent
ademcoEvent
)
{
switch
(
ademcoEvent
)
{
switch
(
ademcoEvent
)
{
case
EVENT_ARM
:
return
"ARM"
;
#define XX(name, code, zh) \
case
EVENT_BURGLAR
:
return
"BURGLAR"
;
case EVENT_##name: \
case
EVENT_DISARM
:
return
"DISARM"
;
return #name;
case
EVENT_DURESS
:
return
"DURESS"
;
case
EVENT_EMERGENCY
:
return
"EMERGENCY"
;
// ----标准安定宝协议事件----
case
EVENT_FIRE
:
return
"FIRE"
;
ADEMCO_STATUS_EVENTS_MAP
(
XX
)
case
EVENT_GAS
:
return
"GAS"
;
ADEMCO_ALARM_EVENTS_MAP
(
XX
)
case
EVENT_HALFARM
:
case
EVENT_HALFARM_1456
:
return
"HALFARM"
;
ADEMCO_EXEPTION_EVENTS_MAP
(
XX
)
case
EVENT_TAMPER
:
return
"TAMPER"
;
ADEMCO_RESUME_EVENTS_MAP
(
XX
)
case
EVENT_ZONE_TAMPER
:
return
"ZONE_TAMPER"
;
case
EVENT_BYPASS
:
return
"BYPASS"
;
// ---私有事件---------
case
EVENT_BYPASS_RESUME
:
return
"BYPASS_RESUME"
;
ADEMCO_HB_EVENTS_MAP
(
XX
)
#undef XX
case
EVENT_WATER
:
return
"WATER"
;
default:
case
EVENT_AC_BROKE
:
return
"AC BROKE"
;
return
"Undefined AdemcoEvent"
;
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"
;
}
}
}
}
#ifdef ADEMCO_ENABLE_CHINESE
#ifdef ADEMCO_ENABLE_CHINESE
const
char
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
)
{
const
char
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
)
{
switch
(
ademcoEvent
)
{
switch
(
ademcoEvent
)
{
case
EVENT_ARM
:
return
"布防"
;
#define XX(name, code, zh) \
case
EVENT_BURGLAR
:
return
"盗警"
;
case EVENT_##name: \
case
EVENT_DISARM
:
return
"撤防"
;
return zh;
case
EVENT_DURESS
:
return
"胁迫"
;
case
EVENT_EMERGENCY
:
return
"紧急报警"
;
// ----标准安定宝协议事件----
ADEMCO_STATUS_EVENTS_MAP
(
XX
)
case
EVENT_FIRE
:
return
"火警"
;
ADEMCO_ALARM_EVENTS_MAP
(
XX
)
case
EVENT_GAS
:
return
"煤气"
;
ADEMCO_EXEPTION_EVENTS_MAP
(
XX
)
case
EVENT_HALFARM
:
case
EVENT_HALFARM_1456
:
return
"半布防"
;
ADEMCO_RESUME_EVENTS_MAP
(
XX
)
case
EVENT_TAMPER
:
return
"防拆"
;
case
EVENT_ZONE_TAMPER
:
return
"防区防拆"
;
// ---私有事件---------
case
EVENT_WATER
:
return
"水警"
;
ADEMCO_HB_EVENTS_MAP
(
XX
)
case
EVENT_BYPASS
:
return
"旁路"
;
#undef XX
case
EVENT_BYPASS_RESUME
:
return
"解除旁路"
;
default:
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
"未定义的安定宝事件"
;
}
}
}
}
#endif
#endif
...
@@ -418,7 +334,7 @@ size_t ademcoAppendDataSegment(ademco_char_t* buff, const char* acct, AdemcoId a
...
@@ -418,7 +334,7 @@ size_t ademcoAppendDataSegment(ademco_char_t* buff, const char* acct, AdemcoId a
*
p
++
=
']'
;
*
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
*
p
=
'\0'
;
// for debug convenience
...
@@ -437,7 +353,6 @@ size_t ademcoAppendDataSegment2(AdemcoDataSegment* dataSegment, const char* acct
...
@@ -437,7 +353,6 @@ size_t ademcoAppendDataSegment2(AdemcoDataSegment* dataSegment, const char* acct
ademcoEvent
,
gg
,
zone
);
ademcoEvent
,
gg
,
zone
);
}
}
AdemcoParseResult
ademcoParseDataSegment
(
const
ademco_char_t
*
packet
,
size_t
packet_len
,
AdemcoParseResult
ademcoParseDataSegment
(
const
ademco_char_t
*
packet
,
size_t
packet_len
,
AdemcoDataSegment
*
dataSegment
,
AdemcoParseError
*
err
)
{
AdemcoDataSegment
*
dataSegment
,
AdemcoParseError
*
err
)
{
if
(
packet_len
==
ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN
&&
if
(
packet_len
==
ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN
&&
...
@@ -457,7 +372,7 @@ AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t pac
...
@@ -457,7 +372,7 @@ AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t pac
break
;
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
);
strncpy
(
temp
,
(
const
char
*
)
p
,
acct_len
);
temp
[
acct_len
]
=
'\0'
;
temp
[
acct_len
]
=
'\0'
;
dataSegment
->
ademcoId
=
(
AdemcoId
)
strtoul
(
temp
,
NULL
,
16
);
dataSegment
->
ademcoId
=
(
AdemcoId
)
strtoul
(
temp
,
NULL
,
16
);
...
@@ -505,7 +420,8 @@ AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t pac
...
@@ -505,7 +420,8 @@ AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t pac
return
RESULT_ERROR
;
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
(
dataSegment
->
raw_len
==
ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN
)
{
if
(
fe100_len
<
2
)
return
0
;
if
(
fe100_len
<
2
)
return
0
;
fe100
[
0
]
=
'\n'
;
fe100
[
0
]
=
'\n'
;
...
@@ -522,7 +438,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
...
@@ -522,7 +438,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
*
p
++
=
'0'
;
*
p
++
=
'0'
;
*
p
++
=
' '
;
*
p
++
=
' '
;
snprintf
(
p
,
fe100_len
-
(
p
-
fe100
),
"%08d"
,
dataSegment
->
ademcoId
%
100000000
);
snprintf
(
p
,
fe100_len
-
(
p
-
fe100
),
"%08d"
,
dataSegment
->
ademcoId
%
100000000
);
p
+=
8
;
p
+=
8
;
*
p
++
=
' '
;
// 18
*
p
++
=
' '
;
// 18
...
@@ -546,7 +465,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
...
@@ -546,7 +465,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
*
p
++
=
'B'
;
*
p
++
=
'B'
;
*
p
++
=
'0'
;
*
p
++
=
'0'
;
}
else
{
}
else
{
snprintf
(
p
,
fe100_len
-
(
p
-
fe100
),
"%03d"
,
dataSegment
->
ademcoEvent
%
1000
);
snprintf
(
p
,
fe100_len
-
(
p
-
fe100
),
"%03d"
,
dataSegment
->
ademcoEvent
%
1000
);
p
+=
3
;
p
+=
3
;
}
}
...
@@ -560,7 +482,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
...
@@ -560,7 +482,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
else
else
*
p
++
=
'C'
;
// zone event
*
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
+=
3
;
*
p
++
=
' '
;
*
p
++
=
' '
;
...
@@ -571,12 +496,17 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
...
@@ -571,12 +496,17 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
}
}
void
ademcoXDataInit
(
AdemcoXDataSegment
*
xdata
)
{
void
ademcoXDataInit
(
AdemcoXDataSegment
*
xdata
)
{
memset
(
xdata
,
0
,
sizeof
*
xdata
);
memset
(
xdata
,
0
,
sizeof
*
xdata
);
}
}
int
ademcoXDataConvert
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
)
{
int
ademcoXDataConvert
(
AdemcoXDataSegment
*
xdata
,
if
(
!
xdata
)
{
return
ADEMCO_ERR
;
}
AdemcoXDataLengthFormat
xlf
)
{
if
(
xdata
->
lenghFormat
==
xlf
)
{
return
ADEMCO_OK
;
}
if
(
!
xdata
)
{
return
ADEMCO_ERR
;
}
if
(
xdata
->
lenghFormat
==
xlf
)
{
return
ADEMCO_OK
;
}
size_t
len
=
ademcoXDataGetValidContentLen
(
xdata
);
size_t
len
=
ademcoXDataGetValidContentLen
(
xdata
);
char
raw
[
ADEMCO_PACKET_XDATA_MAX_LEN
];
char
raw
[
ADEMCO_PACKET_XDATA_MAX_LEN
];
...
@@ -585,11 +515,17 @@ int ademcoXDataConvert(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf) {
...
@@ -585,11 +515,17 @@ int ademcoXDataConvert(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf) {
if
(
len
+
6
>
ADEMCO_PACKET_XDATA_MAX_LEN
)
if
(
len
+
6
>
ADEMCO_PACKET_XDATA_MAX_LEN
)
return
ADEMCO_ERR
;
return
ADEMCO_ERR
;
xdata
->
raw
[
5
+
ademcoXDataGetValidContentLen
(
xdata
)]
=
'\0'
;
xdata
->
raw
[
5
+
ademcoXDataGetValidContentLen
(
xdata
)]
=
'\0'
;
len
=
ademcoHexStrToArray
((
uint8_t
*
)
raw
,
ademcoXDataGetValidContentAddr
(
xdata
),
0x0F
);
len
=
ademcoHexStrToArray
((
uint8_t
*
)
raw
,
ademcoMakeXData
(
xdata
,
TWO_HEX
,
AdemcoXDataTransform_as_is
,
raw
,
len
);
ademcoXDataGetValidContentAddr
(
xdata
),
0x0F
);
ademcoMakeXData
(
xdata
,
TWO_HEX
,
AdemcoXDataTransform_as_is
,
raw
,
len
);
}
else
{
}
else
{
memcpy
(
raw
,
ademcoXDataGetValidContentAddr
(
xdata
),
len
);
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
;
return
ADEMCO_OK
;
}
}
...
@@ -606,7 +542,8 @@ const char* ademcoXDataGetValidContentAddr(const AdemcoXDataSegment* xdata) {
...
@@ -606,7 +542,8 @@ const char* ademcoXDataGetValidContentAddr(const AdemcoXDataSegment* xdata) {
return
NULL
;
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
;
if
(
ademcoXDataGetValidContentLen
(
xdata
)
!=
buf_len
)
return
0
;
const
void
*
p
=
ademcoXDataGetValidContentAddr
(
xdata
);
const
void
*
p
=
ademcoXDataGetValidContentAddr
(
xdata
);
if
(
!
p
)
return
0
;
if
(
!
p
)
return
0
;
...
@@ -622,7 +559,8 @@ size_t ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata) {
...
@@ -622,7 +559,8 @@ size_t ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata) {
return
0
;
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
)
{
if
(
dst
&&
src
&&
src
->
raw_len
>
0
)
{
memcpy
(
dst
,
src
,
sizeof
(
AdemcoXDataSegment
));
memcpy
(
dst
,
src
,
sizeof
(
AdemcoXDataSegment
));
return
src
->
raw_len
;
return
src
->
raw_len
;
...
@@ -630,8 +568,10 @@ size_t ademcoXDataCopy(AdemcoXDataSegment* dst, const AdemcoXDataSegment* src) {
...
@@ -630,8 +568,10 @@ size_t ademcoXDataCopy(AdemcoXDataSegment* dst, const AdemcoXDataSegment* src) {
return
0
;
return
0
;
}
}
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataTransform
xtr
,
const
ademco_char_t
*
content
,
size_t
len
)
{
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
,
const
ademco_char_t
*
content
,
size_t
len
)
{
char
transformed
[
ADEMCO_PACKET_XDATA_MAX_LEN
];
char
transformed
[
ADEMCO_PACKET_XDATA_MAX_LEN
];
size_t
translen
;
size_t
translen
;
len
&=
0xFFFF
;
len
&=
0xFFFF
;
...
@@ -640,12 +580,14 @@ int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf,
...
@@ -640,12 +580,14 @@ int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf,
if
(
xtr
==
AdemcoXDataTransform_as_is
)
if
(
xtr
==
AdemcoXDataTransform_as_is
)
memcpy
(
transformed
,
content
,
len
);
memcpy
(
transformed
,
content
,
len
);
else
if
(
len
*
2
<
ADEMCO_PACKET_XDATA_MAX_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
else
return
ADEMCO_ERR
;
return
ADEMCO_ERR
;
xdata
->
lenghFormat
=
xlf
;
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
;
ademco_char_t
*
p
=
xdata
->
raw
;
*
p
++
=
'['
;
*
p
++
=
'['
;
*
p
++
=
(
translen
&
0xFFFF
)
>>
8
;
*
p
++
=
(
translen
&
0xFFFF
)
>>
8
;
...
@@ -655,7 +597,8 @@ int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf,
...
@@ -655,7 +597,8 @@ int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf,
*
p
++
=
']'
;
*
p
++
=
']'
;
xdata
->
raw_len
=
p
-
xdata
->
raw
;
xdata
->
raw_len
=
p
-
xdata
->
raw
;
return
ADEMCO_OK
;
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
;
ademco_char_t
*
p
=
xdata
->
raw
;
*
p
++
=
'['
;
*
p
++
=
'['
;
char
temp
[
5
];
char
temp
[
5
];
...
@@ -768,7 +711,6 @@ size_t ademcoMakeEmptyDataPacket(ademco_char_t* dst_buff, size_t len,
...
@@ -768,7 +711,6 @@ size_t ademcoMakeEmptyDataPacket(ademco_char_t* dst_buff, size_t len,
return
0
;
return
0
;
}
}
size_t
ademcoMakeAdmEmptyDataPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
size_t
ademcoMakeAdmEmptyDataPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
const
char
*
acct
,
AdemcoId
ademcoId
)
{
...
@@ -819,24 +761,43 @@ size_t ademcoMakeAdmEmptyDataPacket(ademco_char_t* dst_buff, size_t len,
...
@@ -819,24 +761,43 @@ size_t ademcoMakeAdmEmptyDataPacket(ademco_char_t* dst_buff, size_t len,
return
0
;
return
0
;
}
}
size_t
ademcoMakeNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
)
{
size_t
ademcoMakeNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
return
ademcoMakeEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_NULL
,
seq
,
acct
,
ademcoId
);
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
)
{
size_t
ademcoMakeAdmNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
return
ademcoMakeAdmEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_NULL
,
seq
,
acct
,
ademcoId
);
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
)
{
size_t
ademcoMakeAckPacket
(
ademco_char_t
*
buff
,
size_t
len
,
return
ademcoMakeEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_ACK
,
seq
,
acct
,
ademcoId
);
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
)
{
size_t
ademcoMakeNakPacket
(
ademco_char_t
*
buff
,
size_t
len
,
return
ademcoMakeEmptyDataPacket
(
buff
,
len
,
ADEMCO_PACKET_ID_NAK
,
seq
,
acct
,
ademcoId
);
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
,
size_t
ademcoMakeHbPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
char
buff
[
ADEMCO_PACKET_MAX_LEN
];
char
buff
[
ADEMCO_PACKET_MAX_LEN
];
char
*
p
=
buff
;
char
*
p
=
buff
;
char
*
pcrc
=
buff
+
1
;
char
*
pcrc
=
buff
+
1
;
...
@@ -887,8 +848,10 @@ size_t ademcoMakeHbPacket(ademco_char_t* dst_buff, size_t len, uint16_t seq, con
...
@@ -887,8 +848,10 @@ size_t ademcoMakeHbPacket(ademco_char_t* dst_buff, size_t len, uint16_t seq, con
return
0
;
return
0
;
}
}
size_t
ademcoMakeAdmPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
size_t
ademcoMakeAdmPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
char
buff
[
ADEMCO_PACKET_MAX_LEN
];
char
buff
[
ADEMCO_PACKET_MAX_LEN
];
char
*
p
=
buff
;
char
*
p
=
buff
;
char
*
pcrc
=
buff
+
1
;
char
*
pcrc
=
buff
+
1
;
...
@@ -950,32 +913,40 @@ static void copyAcct2AdemcoPacket(AdemcoPacket* pkt, const char* acct) {
...
@@ -950,32 +913,40 @@ static void copyAcct2AdemcoPacket(AdemcoPacket* pkt, const char* acct) {
pkt
->
acct
[
0
]
=
'\0'
;
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
;
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
copyAcct2AdemcoPacket
(
pkt
,
acct
);
pkt
->
data
.
ademcoId
=
ademcoId
;
pkt
->
data
.
ademcoId
=
ademcoId
;
pkt
->
id
=
AID_NULL
;
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
;
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
copyAcct2AdemcoPacket
(
pkt
,
acct
);
pkt
->
data
.
ademcoId
=
ademcoId
;
pkt
->
data
.
ademcoId
=
ademcoId
;
pkt
->
id
=
AID_ACK
;
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
;
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
copyAcct2AdemcoPacket
(
pkt
,
acct
);
pkt
->
data
.
ademcoId
=
ademcoId
;
pkt
->
data
.
ademcoId
=
ademcoId
;
pkt
->
id
=
AID_NAK
;
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
,
size_t
ademcoMakeHbPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
pkt
->
seq
=
seq
;
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
copyAcct2AdemcoPacket
(
pkt
,
acct
);
ademcoAppendDataSegment2
(
&
pkt
->
data
,
acct
,
ademcoId
,
ademcoEvent
,
gg
,
zone
);
ademcoAppendDataSegment2
(
&
pkt
->
data
,
acct
,
ademcoId
,
ademcoEvent
,
gg
,
zone
);
...
@@ -987,11 +958,14 @@ size_t ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, Ad
...
@@ -987,11 +958,14 @@ size_t ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, Ad
memset
(
&
pkt
->
xdata
,
0
,
sizeof
(
*
xdata
));
memset
(
&
pkt
->
xdata
,
0
,
sizeof
(
*
xdata
));
pkt
->
id
=
AID_HB
;
pkt
->
id
=
AID_HB
;
return
pkt
->
raw_len
=
ademcoMakeHbPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
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
,
size_t
ademcoMakeAdmPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
)
{
pkt
->
seq
=
seq
;
pkt
->
seq
=
seq
;
copyAcct2AdemcoPacket
(
pkt
,
acct
);
copyAcct2AdemcoPacket
(
pkt
,
acct
);
ademcoAppendDataSegment2
(
&
pkt
->
data
,
acct
,
ademcoId
,
ademcoEvent
,
gg
,
zone
);
ademcoAppendDataSegment2
(
&
pkt
->
data
,
acct
,
ademcoId
,
ademcoEvent
,
gg
,
zone
);
...
@@ -1003,13 +977,16 @@ size_t ademcoMakeAdmPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, A
...
@@ -1003,13 +977,16 @@ size_t ademcoMakeAdmPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, A
memset
(
&
pkt
->
xdata
,
0
,
sizeof
(
*
xdata
));
memset
(
&
pkt
->
xdata
,
0
,
sizeof
(
*
xdata
));
pkt
->
id
=
AID_ADM_CID
;
pkt
->
id
=
AID_ADM_CID
;
return
pkt
->
raw_len
=
ademcoMakeAdmPacket
(
pkt
->
raw
,
sizeof
(
pkt
->
raw
),
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
,
AdemcoParseResult
ademcoPacketParse
(
const
ademco_char_t
*
buff
,
size_t
len
,
AdemcoPacket
*
pkt
,
size_t
*
cb_commited
,
AdemcoPacket
*
pkt
,
size_t
*
cb_commited
,
AdemcoParseError
*
err
)
{
AdemcoParseError
*
err
)
{
if
(
len
<
9
)
{
return
RESULT_NOT_ENOUGH
;
}
if
(
len
<
9
)
{
return
RESULT_NOT_ENOUGH
;
}
do
{
do
{
const
char
*
p
=
buff
;
const
char
*
p
=
buff
;
if
(
*
p
++
!=
ADEMCO_PACKET_PREFIX
)
{
if
(
*
p
++
!=
ADEMCO_PACKET_PREFIX
)
{
...
@@ -1062,7 +1039,9 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
...
@@ -1062,7 +1039,9 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
break
;
break
;
}
}
p
=
pid
+
1
;
p
=
pid
+
1
;
while
(
p
<
pcr
&&
*
p
!=
'\"'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
'\"'
)
{
p
++
;
}
if
(
p
>=
pcr
||
*
p
!=
'\"'
)
{
if
(
p
>=
pcr
||
*
p
!=
'\"'
)
{
dline
;
dline
;
ADEMCO_FILL_PARSE_ERROR
(
err
,
"p >= pcr || *p != '
\"
'"
);
ADEMCO_FILL_PARSE_ERROR
(
err
,
"p >= pcr || *p != '
\"
'"
);
...
@@ -1077,20 +1056,27 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
...
@@ -1077,20 +1056,27 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
// seq
// seq
const
char
*
pseq
=
p
;
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'
))
{
if
(
p
-
pseq
!=
4
||
(
*
p
!=
'R'
&&
*
p
!=
'L'
))
{
dline
;
dline
;
ADEMCO_FILL_PARSE_ERROR
(
err
,
"p - pseq != 4 || (*p != 'R' && *p != 'L')"
);
ADEMCO_FILL_PARSE_ERROR
(
err
,
"p - pseq != 4 || (*p != 'R' && *p != 'L')"
);
break
;
break
;
}
}
memcpy
(
temp
,
pseq
,
4
);
temp
[
4
]
=
'\0'
;
memcpy
(
temp
,
pseq
,
4
);
temp
[
4
]
=
'\0'
;
pkt
->
seq
=
strtoul
(
temp
,
NULL
,
10
)
&
0xFFFF
;
pkt
->
seq
=
strtoul
(
temp
,
NULL
,
10
)
&
0xFFFF
;
if
(
pkt
->
seq
>=
10000
)
{
pkt
->
seq
=
0
;
}
if
(
pkt
->
seq
>=
10000
)
{
pkt
->
seq
=
0
;
}
// *rrcvr
// *rrcvr
if
(
*
p
==
'R'
)
{
// rrcvr exists
if
(
*
p
==
'R'
)
{
// rrcvr exists
//const char* prcvr = p;
// const char* prcvr = p;
while
(
p
<
pcr
&&
*
p
!=
'L'
&&
*
p
!=
'#'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
'L'
&&
*
p
!=
'#'
)
{
p
++
;
}
if
(
p
>=
pcr
||
(
*
p
!=
'L'
&&
*
p
!=
'#'
))
{
if
(
p
>=
pcr
||
(
*
p
!=
'L'
&&
*
p
!=
'#'
))
{
dline
;
dline
;
ADEMCO_FILL_PARSE_ERROR
(
err
,
"p >= pcr || (*p != 'L' && *p != '#')"
);
ADEMCO_FILL_PARSE_ERROR
(
err
,
"p >= pcr || (*p != 'L' && *p != '#')"
);
...
@@ -1111,7 +1097,9 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
...
@@ -1111,7 +1097,9 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
ADEMCO_FILL_PARSE_ERROR
(
err
,
"LPREF not found"
);
ADEMCO_FILL_PARSE_ERROR
(
err
,
"LPREF not found"
);
break
;
break
;
}
}
while
(
p
<
pcr
&&
*
p
!=
'#'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
'#'
)
{
p
++
;
}
// only check if format is correct, ignore it's content
// only check if format is correct, ignore it's content
if
(
p
>=
pcr
||
*
p
!=
'#'
)
{
if
(
p
>=
pcr
||
*
p
!=
'#'
)
{
dline
;
dline
;
...
@@ -1144,13 +1132,18 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
...
@@ -1144,13 +1132,18 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
// data
// data
const
char
*
pdata
=
p
;
const
char
*
pdata
=
p
;
while
(
p
<
pcr
&&
*
p
!=
']'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
']'
)
{
p
++
;
}
if
(
p
>=
pcr
||
*
p
!=
']'
)
{
if
(
p
>=
pcr
||
*
p
!=
']'
)
{
dline
;
dline
;
ADEMCO_FILL_PARSE_ERROR
(
err
,
"data's ] not found"
);
ADEMCO_FILL_PARSE_ERROR
(
err
,
"data's ] not found"
);
break
;
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
// *xdata
if
(
*
p
==
'['
)
{
// xdata exists
if
(
*
p
==
'['
)
{
// xdata exists
...
@@ -1162,7 +1155,8 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
...
@@ -1162,7 +1155,8 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
xlf
=
TWO_HEX
;
xlf
=
TWO_HEX
;
if
(
xlf
==
FOUR_DECIMAL
)
{
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
);
valid_len
=
strtoul
(
temp
,
NULL
,
16
);
p
+=
4
+
valid_len
;
p
+=
4
+
valid_len
;
}
else
{
}
else
{
...
@@ -1225,10 +1219,14 @@ size_t ademcoHiLoArrayToDecStr(ademco_char_t* str, const uint8_t* arr, size_t le
...
@@ -1225,10 +1219,14 @@ size_t ademcoHiLoArrayToDecStr(ademco_char_t* str, const uint8_t* arr, size_t le
char
*
p
=
str
;
char
*
p
=
str
;
for
(
size_t
i
=
0
;
i
<
len
;
i
++
)
{
for
(
size_t
i
=
0
;
i
<
len
;
i
++
)
{
char
c
=
(
arr
[
i
]
>>
4
)
&
0x0F
;
char
c
=
(
arr
[
i
]
>>
4
)
&
0x0F
;
if
(
c
>
9
)
{
return
p
-
str
;
}
if
(
c
>
9
)
{
return
p
-
str
;
}
*
p
++
=
c
+
'0'
;
*
p
++
=
c
+
'0'
;
c
=
(
arr
[
i
]
&
0x0F
);
c
=
(
arr
[
i
]
&
0x0F
);
if
(
c
>
9
)
{
return
p
-
str
;
}
if
(
c
>
9
)
{
return
p
-
str
;
}
*
p
++
=
c
+
'0'
;
*
p
++
=
c
+
'0'
;
}
}
return
p
-
str
;
return
p
-
str
;
...
@@ -1319,7 +1317,6 @@ size_t ademcoDecStrToHiLoArray2(uint8_t* arr, size_t len, const char* str) {
...
@@ -1319,7 +1317,6 @@ size_t ademcoDecStrToHiLoArray2(uint8_t* arr, size_t len, const char* str) {
return
len
;
return
len
;
}
}
size_t
ademcoHexArrayToStr
(
char
*
str
,
const
uint8_t
*
arr
,
size_t
len
)
{
size_t
ademcoHexArrayToStr
(
char
*
str
,
const
uint8_t
*
arr
,
size_t
len
)
{
char
*
p
=
str
;
char
*
p
=
str
;
for
(
size_t
i
=
0
;
i
<
len
;
i
++
)
{
for
(
size_t
i
=
0
;
i
<
len
;
i
++
)
{
...
@@ -1349,7 +1346,8 @@ size_t ademcoHexStrToArray(uint8_t* arr, const char* str, uint8_t padding) {
...
@@ -1349,7 +1346,8 @@ size_t ademcoHexStrToArray(uint8_t* arr, const char* str, uint8_t padding) {
return
p
-
arr
;
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
*
p
=
arr
;
uint8_t
hi
=
0
,
lo
=
0
;
uint8_t
hi
=
0
,
lo
=
0
;
padding
&=
0x0F
;
padding
&=
0x0F
;
...
@@ -1368,7 +1366,10 @@ size_t ademcoHexStrToArrayN(uint8_t* arr, const char* str, size_t len, uint8_t p
...
@@ -1368,7 +1366,10 @@ size_t ademcoHexStrToArrayN(uint8_t* arr, const char* str, size_t len, uint8_t p
return
p
-
arr
;
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
*
p
=
arr
;
uint8_t
hi
=
0
,
lo
=
0
;
uint8_t
hi
=
0
,
lo
=
0
;
padding
&=
0x0F
;
padding
&=
0x0F
;
...
...
ademco.h
View file @
80489de5
/*
* Ademco library
* captainwong
* 2022-6-13 rewrited this C version
*/
#ifndef __ADEMCO_H__
#ifndef __ADEMCO_H__
#define __ADEMCO_H__
#define __ADEMCO_H__
...
@@ -28,6 +22,8 @@
...
@@ -28,6 +22,8 @@
#include <stdint.h>
#include <stdint.h>
#include <time.h>
#include <time.h>
#include "ademco_version.h"
#ifdef __cplusplus
#ifdef __cplusplus
extern
"C"
{
extern
"C"
{
#endif
#endif
...
@@ -90,188 +86,112 @@ static inline int ademcoIsValidZoneStrict(AdemcoZone zone) {
...
@@ -90,188 +86,112 @@ static inline int ademcoIsValidZoneStrict(AdemcoZone zone) {
#define ADEMCO_SIGNAL_STRENGTH_MIN 0
#define ADEMCO_SIGNAL_STRENGTH_MIN 0
#define ADEMCO_SIGNAL_STRENGTH_MAX 31
#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
// Ademco events
typedef
enum
AdemcoEvent
{
typedef
enum
AdemcoEvent
{
EVENT_INVALID_EVENT
=
0
,
EVENT_INVALID_EVENT
=
0
,
// -------------------标准安定宝协议事件--------------------------------
#define XX(name, code, zh) EVENT_##name = code,
// 主机或分机状态报告
EVENT_ARM
=
3400
,
// 布防
// ----标准安定宝协议事件----
EVENT_DISARM
=
1400
,
// 撤防
ADEMCO_STATUS_EVENTS_MAP
(
XX
)
EVENT_HALFARM_1456
=
1456
,
// 半布防
ADEMCO_ALARM_EVENTS_MAP
(
XX
)
EVENT_HALFARM
=
3456
,
// 半布防
ADEMCO_EXEPTION_EVENTS_MAP
(
XX
)
EVENT_EMERGENCY
=
1120
,
// 紧急报警
ADEMCO_RESUME_EVENTS_MAP
(
XX
)
// 防区报警
// ---私有事件---------
EVENT_BURGLAR
=
1130
,
// 盗警
ADEMCO_HB_EVENTS_MAP
(
XX
)
EVENT_DOORRINGING
=
1134
,
// 门铃
#undef XX
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 ADEMCO_EVENT_SENTINEL 10000
#define ADEMCO_EVENT_SENTINEL 10000
}
AdemcoEvent
;
}
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
{
typedef
enum
AdemcoEventLevel
{
EVENT_LEVEL_NULL
,
EVENT_LEVEL_NULL
,
...
@@ -372,6 +292,8 @@ typedef struct AdemcoPacket {
...
@@ -372,6 +292,8 @@ typedef struct AdemcoPacket {
//////////////////////// Functions ////////////////////////
//////////////////////// Functions ////////////////////////
ADEMCO_EXPORT_SYMBOL
unsigned
int
ademcoVersion
(
void
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoVersionString
(
void
);
//! print as HEX
//! print as HEX
ADEMCO_EXPORT_SYMBOL
void
ademcoPrint
(
const
ademco_char_t
*
buff
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
void
ademcoPrint
(
const
ademco_char_t
*
buff
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
uint8_t
ademcoEncodeSignalStrength
(
uint8_t
strength
);
ADEMCO_EXPORT_SYMBOL
uint8_t
ademcoEncodeSignalStrength
(
uint8_t
strength
);
...
@@ -379,20 +301,28 @@ ADEMCO_EXPORT_SYMBOL uint8_t ademcoDecodeSignalStrength(uint8_t code);
...
@@ -379,20 +301,28 @@ ADEMCO_EXPORT_SYMBOL uint8_t ademcoDecodeSignalStrength(uint8_t code);
//////////////////////// AdemcoEvent functions ////////////////////////
//////////////////////// 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
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoEventToString
(
AdemcoEvent
ademcoEvent
);
AdemcoEvent
ademcoGetExceptionEventByResumeEvent
(
AdemcoEvent
resumeEvent
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoEventToString
(
AdemcoEvent
ademcoEvent
);
#ifdef ADEMCO_ENABLE_CHINESE
#ifdef ADEMCO_ENABLE_CHINESE
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoEventToStringChinese
(
AdemcoEvent
ademcoEvent
);
#endif
#endif
//////////////////////// AdemcoDataSegment functions ////////////////////////
//////////////////////// AdemcoDataSegment functions ////////////////////////
...
@@ -415,39 +345,62 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoAppendDataSegment2(AdemcoDataSegment* dataSegm
...
@@ -415,39 +345,62 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoAppendDataSegment2(AdemcoDataSegment* dataSegm
//! parse `DATA` packet, if ok, `dataSegment`'s members will be useful
//! parse `DATA` packet, if ok, `dataSegment`'s members will be useful
//! err can be NULL; caller should only check err on got RESULT_ERROR
//! 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
,
size_t
packet_len
,
AdemcoDataSegment
*
dataSegment
,
AdemcoDataSegment
*
dataSegment
,
AdemcoParseError
*
err
);
AdemcoParseError
*
err
);
// return 0 for empty packet, CONGWIN_FE100_PACKET_LEN for success
// 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
);
const
AdemcoDataSegment
*
dataSegment
);
//////////////////////// AdemcoXDataSegment functions ////////////////////////
//////////////////////// AdemcoXDataSegment functions ////////////////////////
// init a empty xdata
// init a empty xdata
ADEMCO_EXPORT_SYMBOL
void
ademcoXDataInit
(
AdemcoXDataSegment
*
xdata
);
ADEMCO_EXPORT_SYMBOL
void
ademcoXDataInit
(
AdemcoXDataSegment
*
xdata
);
// return ADEMCO_OK for success, ADEMCO_ERR for failed
// 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
#ifndef SWIG
// get valid content address of xdata (except [len])
// 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
#endif
// get valid content length of xdata (except [len])
// 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)
// 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
// 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
// return ADEMCO_OK for success, return ADEMCO_ERR for len is too long
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
ADEMCO_EXPORT_SYMBOL
int
ademcoMakeXData
(
AdemcoXDataSegment
*
xdata
,
AdemcoXDataTransform
xtr
,
const
ademco_char_t
*
content
,
size_t
len
);
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
,
const
ademco_char_t
*
content
,
size_t
len
);
//////////////////////// AdemcoPacketId functions ////////////////////////
//////////////////////// AdemcoPacketId functions ////////////////////////
ADEMCO_EXPORT_SYMBOL
int
isAdemcoPacketId
(
const
char
*
standard
,
const
char
*
id
,
size_t
len
);
ADEMCO_EXPORT_SYMBOL
int
isAdemcoPacketId
(
const
char
*
standard
,
ADEMCO_EXPORT_SYMBOL
AdemcoPacketId
getAdemcoPacketId
(
const
char
*
id
,
size_t
len
);
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
);
ADEMCO_EXPORT_SYMBOL
const
char
*
ademcoPacketIdToString
(
AdemcoPacketId
id
);
/*
/*
...
@@ -456,58 +409,104 @@ ADEMCO_EXPORT_SYMBOL const char* ademcoPacketIdToString(AdemcoPacketId id);
...
@@ -456,58 +409,104 @@ ADEMCO_EXPORT_SYMBOL const char* ademcoPacketIdToString(AdemcoPacketId id);
* otherwise return 0
* otherwise return 0
*/
*/
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeEmptyDataPacket
(
ademco_char_t
*
dst_buff
,
size_t
len
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeEmptyDataPacket
(
ademco_char_t
*
dst_buff
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
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
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmEmptyDataPacket
(
ademco_char_t
*
dst_buff
,
const
char
*
id
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
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
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeNullPacket
(
ademco_char_t
*
buff
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmNullPacket
(
ademco_char_t
*
buff
,
size_t
len
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmNullPacket
(
ademco_char_t
*
buff
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAckPacket
(
ademco_char_t
*
buff
,
size_t
len
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAckPacket
(
ademco_char_t
*
buff
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeNakPacket
(
ademco_char_t
*
buff
,
size_t
len
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeNakPacket
(
ademco_char_t
*
buff
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
size_t
len
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeHbPacket
(
ademco_char_t
*
buff
,
size_t
len
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeHbPacket
(
ademco_char_t
*
buff
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
size_t
len
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
);
const
AdemcoXDataSegment
*
xdata
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmPacket
(
ademco_char_t
*
buff
,
size_t
len
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmPacket
(
ademco_char_t
*
buff
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
size_t
len
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
);
const
AdemcoXDataSegment
*
xdata
);
// like upper funcs, store buff and len to pkt->raw, pkt->raw_len
// like upper funcs, store buff and len to pkt->raw, pkt->raw_len
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeNullPacket2
(
AdemcoPacket
*
pkt
,
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
,
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
,
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
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeHbPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
uint16_t
seq
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
);
const
AdemcoXDataSegment
*
xdata
);
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmPacket2
(
AdemcoPacket
*
pkt
,
ADEMCO_EXPORT_SYMBOL
size_t
ademcoMakeAdmPacket2
(
AdemcoPacket
*
pkt
,
uint16_t
seq
,
const
char
*
acct
,
AdemcoId
ademcoId
,
uint16_t
seq
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
char
*
acct
,
AdemcoId
ademcoId
,
AdemcoEvent
ademcoEvent
,
AdemcoGG
gg
,
AdemcoZone
zone
,
const
AdemcoXDataSegment
*
xdata
);
const
AdemcoXDataSegment
*
xdata
);
//! parse a ademco packet, if everything is OK, cb_commited is the packet length
//! 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
//! 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
,
ADEMCO_EXPORT_SYMBOL
AdemcoParseResult
ademcoPacketParse
(
const
ademco_char_t
*
buff
,
AdemcoPacket
*
pkt
,
size_t
*
cb_commited
,
size_t
len
,
AdemcoPacket
*
pkt
,
size_t
*
cb_commited
,
AdemcoParseError
*
err
);
AdemcoParseError
*
err
);
/* CRC16 implementation according to ARC
/* CRC16 implementation according to ARC
...
@@ -521,7 +520,8 @@ ADEMCO_EXPORT_SYMBOL AdemcoParseResult ademcoPacketParse(const ademco_char_t* bu
...
@@ -521,7 +520,8 @@ ADEMCO_EXPORT_SYMBOL AdemcoParseResult ademcoPacketParse(const ademco_char_t* bu
* Xor constant to output CRC : 0x0000
* Xor constant to output CRC : 0x0000
* Output for "123456789" : 0xBB3D
* 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进制数字符串
// 将一串以高低字节表示的十六进制数组转换为10进制数字符串
// 每个字节的高四位和低四位若不大于9,将该四位表示的数字以10进制ascii码填入str,否则停止
// 每个字节的高四位和低四位若不大于9,将该四位表示的数字以10进制ascii码填入str,否则停止
...
@@ -529,7 +529,9 @@ ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC16(const ademco_char_t* buff, size_t len)
...
@@ -529,7 +529,9 @@ ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC16(const ademco_char_t* buff, size_t len)
// 注意:函数不会在str末尾补 null terminator
// 注意:函数不会在str末尾补 null terminator
// 调用者应确保str有足够空间,至少len的2倍,否则会崩溃
// 调用者应确保str有足够空间,至少len的2倍,否则会崩溃
// 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101"
// 示例:输入数组: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,否则:
// 每个字节的高四位和低四位若不大于9,将该四位表示的数字以10进制ascii码填入str,否则:
...
@@ -539,27 +541,41 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoHiLoArrayToDecStr(ademco_char_t* str, const ui
...
@@ -539,27 +541,41 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoHiLoArrayToDecStr(ademco_char_t* str, const ui
// 调用者应确保str有足够空间,至少len的2倍,否则会崩溃
// 调用者应确保str有足够空间,至少len的2倍,否则会崩溃
// 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101"
// 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101"
// 示例:输入数组:0x24 0x94 0x94 0x4c 0x48 0x15 0xff,输出字符串"2494944C4815"
// 示例:输入数组: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进制数字符串转为高低字节表示的数组,节省空间
// 将一个10进制数字符串转为高低字节表示的数组,节省空间
// str应只包含'0'~'9',否则失败返回0
// str应只包含'0'~'9',否则失败返回0
// str长度若大于len * 2,str[len]及之后的内容将被舍弃以避免溢出
// str长度若大于len * 2,str[len]及之后的内容将被舍弃以避免溢出
// 转换后的长度若不满len,则以0xF补满。
// 转换后的长度若不满len,则以0xF补满。
// 示例:输入字符串"123ABC",返回0
// 示例:输入字符串"123ABC",返回0
// 示例:输入字符串 "18240888101", len=9, 则arr内容为 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff, return 9
// 示例:输入字符串 "18240888101", len=9, 则arr内容为
// 示例:输入字符串 "12345678901234567890", len=9, 则arr内容为 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78, return 9
// 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
// 示例:输入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进制数字符串转为高低字节表示的数组,节省空间
// 将一个16进制数字符串转为高低字节表示的数组,节省空间
// str应只包含'0'~'9', 'A'~'F', 'a'~'f',否则失败返回0
// str应只包含'0'~'9', 'A'~'F', 'a'~'f',否则失败返回0
// str长度若大于len * 2,str[len]及之后的内容将被舍弃以避免溢出
// str长度若大于len * 2,str[len]及之后的内容将被舍弃以避免溢出
// 转换后的长度若不满len,则以0xF补满。
// 转换后的长度若不满len,则以0xF补满。
// 示例:输入字符串"123ABC",len=6, 则 arr 内容为 0x12 0x3a 0xbc 0xff 0xff 0xff
// 示例:输入字符串"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
// 示例:输入字符串 "18240888101", len=9, 则arr内容为
// 示例:输入字符串 "12345678901234567890", len=9, 则arr内容为 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78, return 9
// 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
// 示例:输入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)
// 返回str长度(len * 2)
...
@@ -567,7 +583,9 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray2(uint8_t* arr, size_t len, c
...
@@ -567,7 +583,9 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray2(uint8_t* arr, size_t len, c
// 注意:函数不会在str末尾补 null terminator
// 注意:函数不会在str末尾补 null terminator
// 示例:输入 arr=[0xEB 0xBA 0x3F], len=3, 则str = "EBBA3F",返回6
// 示例:输入 arr=[0xEB 0xBA 0x3F], len=3, 则str = "EBBA3F",返回6
// 示例:输入 ary="123", len=3, 则str = "313233",返回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')转为字节流
// 将一串字符串(内容为'0'~'9', 'A'~'F', 'a' ~'f')转为字节流
// 若strlen(str)为奇数,以padding补足arr, padding 应 <= 0x0F
// 若strlen(str)为奇数,以padding补足arr, padding 应 <= 0x0F
...
@@ -576,17 +594,25 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoHexArrayToStr(char* str, const uint8_t* arr, s
...
@@ -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="EBBA3F", 输出arr = [0xEB, 0xBA, 0x3F],返回 3
// 示例:输入字符串str="ABC", padding = 0, 输出arr=[0xAB, 0xC0],返回2
// 示例:输入字符串str="ABC", padding = 0, 输出arr=[0xAB, 0xC0],返回2
// 示例:输入字符串str="ABC", padding = 0x0F, 输出arr=[0xAB, 0xCF],返回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
// 功能同ademcoHexStrToArray
// 若strlen(str) > len, str[len]及之后的内容将被舍弃以避免溢出
// 若strlen(str) > len, str[len]及之后的内容将被舍弃以避免溢出
// 示例:输入字符串str="ABCDE", len = 4 padding = 0x0F, 输出arr=[0xAB, 0xCD], return 2
// 示例:输入字符串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
// 示例:str="AB\xFFD", len=4, padding=0x0F, 则 arr=[ 0xAB, 0xFD ], return 2
// 网线主机 0d 00 命令,接警中心账号部分,有可能是这种
// 网线主机 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
#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) {
...
@@ -25,109 +25,38 @@ const char* print_bool(bool b) {
}
}
AdemcoEvent
statusEvents
[]
=
{
AdemcoEvent
statusEvents
[]
=
{
#define XX(name, code, zh) EVENT_##name,
// 主机或分机状态报告
ADEMCO_STATUS_EVENTS_MAP
(
XX
)
EVENT_ARM
,
#undef XX
EVENT_DISARM
,
EVENT_HALFARM_1456
,
EVENT_HALFARM
,
EVENT_EMERGENCY
,
};
};
AdemcoEvent
alarmEvents
[]
=
{
AdemcoEvent
alarmEvents
[]
=
{
#define XX(name, code, zh) EVENT_##name,
// 防区报警
ADEMCO_ALARM_EVENTS_MAP
(
XX
)
EVENT_BURGLAR
,
#undef XX
EVENT_DOORRINGING
,
EVENT_FIRE
,
EVENT_DURESS
,
EVENT_GAS
,
EVENT_WATER
,
EVENT_TAMPER
,
EVENT_ZONE_TAMPER
,
EVENT_BYPASS
,
EVENT_BYPASS_RESUME
,
};
};
AdemcoEvent
excepEvents
[]
=
{
AdemcoEvent
excepEvents
[]
=
{
#define XX(name, code, zh) EVENT_##name,
// 防区异常
ADEMCO_EXEPTION_EVENTS_MAP
(
XX
)
EVENT_AC_BROKE
,
ADEMCO_RESUME_EVENTS_MAP
(
XX
)
EVENT_AC_RECOVER
,
#undef XX
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
,
};
};
AdemcoEvent
privateEvents
[]
=
{
AdemcoEvent
privateEvents
[]
=
{
#define XX(name, code, zh) EVENT_##name,
ADEMCO_HB_EVENTS_MAP
(
XX
)
#undef XX
};
// ------------------私有事件-----------------------------------------
AdemcoEvent
allEvents
[]
=
{
EVENT_SERIAL485DIS
,
#define XX(name, code, zh) EVENT_##name,
EVENT_SERIAL485CONN
,
ADEMCO_STATUS_EVENTS_MAP
(
XX
)
ADEMCO_ALARM_EVENTS_MAP
(
XX
)
EVENT_CONN_HANGUP
,
ADEMCO_EXEPTION_EVENTS_MAP
(
XX
)
EVENT_CONN_RESUME
,
ADEMCO_RESUME_EVENTS_MAP
(
XX
)
ADEMCO_HB_EVENTS_MAP
(
XX
)
EVENT_DISARM_PWD_ERR
,
#undef XX
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
,
};
};
void
printEvents
(
const
AdemcoEvent
*
events
,
size_t
len
)
void
printEvents
(
const
AdemcoEvent
*
events
,
size_t
len
)
...
@@ -239,7 +168,7 @@ void print_machineTypes()
...
@@ -239,7 +168,7 @@ void print_machineTypes()
printf
(
"|事件码类型|主机类型|布防|撤防|半布防|设置|信号强度|防区|有线防区|SMS|内核|网络|型号|
\n
"
printf
(
"|事件码类型|主机类型|布防|撤防|半布防|设置|信号强度|防区|有线防区|SMS|内核|网络|型号|
\n
"
"|---------|-------|----|----|-----|----|-------|----|-------|---|----|---|----|
\n
"
);
"|---------|-------|----|----|-----|----|-------|----|-------|---|----|---|----|
\n
"
);
for
(
auto
e
:
Ademco
Events
)
{
for
(
auto
e
:
all
Events
)
{
if
(
ademcoIsMachineTypeEvent
(
e
))
{
if
(
ademcoIsMachineTypeEvent
(
e
))
{
auto
t
=
hbMachineTypeFromAdemcoEvent
(
e
);
auto
t
=
hbMachineTypeFromAdemcoEvent
(
e
);
if
(
!
hbMachineIsSelling
(
t
))
continue
;
if
(
!
hbMachineIsSelling
(
t
))
continue
;
...
@@ -275,7 +204,7 @@ void print_imgs()
...
@@ -275,7 +204,7 @@ void print_imgs()
"|---|--------|
\n
"
);
"|---|--------|
\n
"
);
std
::
map
<
std
::
string
,
std
::
string
>
imgs
;
std
::
map
<
std
::
string
,
std
::
string
>
imgs
;
for
(
auto
e
:
Ademco
Events
)
{
for
(
auto
e
:
all
Events
)
{
if
(
ademcoIsMachineTypeEvent
(
e
))
{
if
(
ademcoIsMachineTypeEvent
(
e
))
{
auto
t
=
hbMachineTypeFromAdemcoEvent
(
e
);
auto
t
=
hbMachineTypeFromAdemcoEvent
(
e
);
if
(
!
hbMachineIsSelling
(
t
))
continue
;
if
(
!
hbMachineIsSelling
(
t
))
continue
;
...
@@ -350,8 +279,7 @@ void print_available_zone_props()
...
@@ -350,8 +279,7 @@ void print_available_zone_props()
}
}
printf
(
"|
\n
"
);
printf
(
"|
\n
"
);
for
(
auto
e
:
allEvents
)
{
for
(
auto
e
:
AdemcoEvents
)
{
if
(
ademcoIsMachineTypeEvent
(
e
))
{
if
(
ademcoIsMachineTypeEvent
(
e
))
{
auto
t
=
hbMachineTypeFromAdemcoEvent
(
e
);
auto
t
=
hbMachineTypeFromAdemcoEvent
(
e
);
if
(
!
hbMachineIsSelling
(
t
))
continue
;
if
(
!
hbMachineIsSelling
(
t
))
continue
;
...
...
hb_com.c
View file @
80489de5
#include "hb_com.h"
#include "hb_com.h"
#include <string.h>
#include <string.h>
int
hbGetAvailableZoneProperties
(
HbMachineType
type
,
HbZoneProperty
props
[
12
])
{
int
hbGetAvailableZoneProperties
(
HbMachineType
type
,
HbZoneProperty
props
[
12
])
{
switch
(
type
)
{
switch
(
type
)
{
case
HMT_WIFI
:
case
HMT_WIFI
:
break
;
break
;
...
@@ -11,60 +12,88 @@ int hbGetAvailableZoneProperties(HbMachineType type, HbZoneProperty props[12]) {
...
@@ -11,60 +12,88 @@ int hbGetAvailableZoneProperties(HbMachineType type, HbZoneProperty props[12]) {
case
HMT_GPRS
:
case
HMT_GPRS
:
case
HMT_WIFI2
:
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
));
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_NETMOD
:
case
HMT_NETMOD
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_SUB_MACHINE
,
HbZoneProperty
hzps
[]
=
{
HZP_REMOTE_CONTROL
,
HZP_BUGLAR_HALF
,
HZP_SHIELD
,
HZP_DOOR_RING
,
};
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
));
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_LCD
:
case
HMT_LCD
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_SUB_MACHINE
,
HbZoneProperty
hzps
[]
=
{
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
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_WIRED
:
case
HMT_WIRED
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_TRUE_COLOR
:
case
HMT_TRUE_COLOR
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
HbZoneProperty
hzps
[]
=
{
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
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
));
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_3_SECTION
:
case
HMT_3_SECTION
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
HbZoneProperty
hzps
[]
=
{
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
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
));
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_IOT
:
case
HMT_IOT
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
HbZoneProperty
hzps
[]
=
{
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
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
));
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_GPRS_PHONE
:
case
HMT_GPRS_PHONE
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_REMOTE_CONTROL
,
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
case
HMT_NB
:
case
HMT_NB
:
{
{
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_DOOR_RING
,
};
HbZoneProperty
hzps
[]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_DOOR_RING
,
};
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
memcpy
(
props
,
hzps
,
sizeof
(
hzps
));
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
return
sizeof
(
hzps
)
/
sizeof
(
HbZoneProperty
);
}
}
...
@@ -107,7 +136,8 @@ uint16_t hbZoneMax(HbMachineType type) {
...
@@ -107,7 +136,8 @@ uint16_t hbZoneMax(HbMachineType type) {
}
}
int
hbIsValidZone
(
HbMachineType
type
,
uint16_t
zone
)
{
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
)
{
int
hbIsValidZoneStrict
(
HbMachineType
type
,
uint16_t
zone
)
{
...
@@ -215,8 +245,9 @@ void hbInitMachineTimer(HbMachineTimer* timer) {
...
@@ -215,8 +245,9 @@ void hbInitMachineTimer(HbMachineTimer* timer) {
}
}
int
hbIsValidTimePoint
(
HbMachineTimePoint
*
tp
)
{
int
hbIsValidTimePoint
(
HbMachineTimePoint
*
tp
)
{
return
tp
&&
0
<=
tp
->
hour
&&
tp
->
hour
<
24
&&
return
tp
&&
0
<=
tp
->
minute
&&
tp
->
minute
<
60
;
tp
->
hour
<
24
&&
tp
->
minute
<
60
;
}
}
void
hbTimePointToGreenwich
(
HbMachineTimePoint
*
tp
)
{
void
hbTimePointToGreenwich
(
HbMachineTimePoint
*
tp
)
{
...
@@ -230,11 +261,15 @@ void hbTimePointFromGreenwich(HbMachineTimePoint* tp) {
...
@@ -230,11 +261,15 @@ void hbTimePointFromGreenwich(HbMachineTimePoint* tp) {
}
}
int
hbIsValidTimer
(
HbTimer
*
timer
)
{
int
hbIsValidTimer
(
HbTimer
*
timer
)
{
return
timer
&&
hbIsValidTimePoint
(
&
timer
->
armAt
)
&&
hbIsValidTimePoint
(
&
timer
->
disarmAt
);
return
timer
&&
hbIsValidTimePoint
(
&
timer
->
armAt
)
&&
hbIsValidTimePoint
(
&
timer
->
disarmAt
);
}
}
int
hbIsValidMachineTimer
(
HbMachineTimer
*
timer
)
{
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
)
{
void
hbMachineTimerToGreenwich
(
HbMachineTimer
*
timer
)
{
...
@@ -464,7 +499,9 @@ int hbCheckSum(const uint8_t* data, size_t len) {
...
@@ -464,7 +499,9 @@ int hbCheckSum(const uint8_t* data, size_t len) {
memcpy(cd->data, data, len & 0xFF); \
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
{
do
{
if
(
len
<
5
)
{
break
;
}
if
(
len
<
5
)
{
break
;
}
if
(
data
[
0
]
!=
0xEB
)
{
break
;
}
if
(
data
[
0
]
!=
0xEB
)
{
break
;
}
...
@@ -536,7 +573,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
...
@@ -536,7 +573,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
if
(
data
[
3
]
==
0x09
&&
if
(
data
[
3
]
==
0x09
&&
data
[
4
]
==
0xA3
&&
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
))
{
if
(
hbCheckSum
(
data
,
len
))
{
copy_data_to_com
;
copy_data_to_com
;
return
HbComReq_A3
;
return
HbComReq_A3
;
...
@@ -550,7 +588,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
...
@@ -550,7 +588,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
}
}
}
else
if
(
data
[
3
]
==
0x0E
&&
}
else
if
(
data
[
3
]
==
0x0E
&&
data
[
4
]
==
0xA7
&&
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
))
{
if
(
hbCheckSum
(
data
,
len
))
{
copy_data_to_com
;
copy_data_to_com
;
return
HbComReq_A7
;
return
HbComReq_A7
;
...
@@ -564,7 +603,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
...
@@ -564,7 +603,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
else
if
(
data
[
3
]
==
0x08
&&
else
if
(
data
[
3
]
==
0x08
&&
data
[
4
]
==
0xAA
&&
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
))
{
if
(
hbCheckSum
(
data
,
len
))
{
copy_data_to_com
;
copy_data_to_com
;
return
HbComReq_AA
;
return
HbComReq_AA
;
...
@@ -578,7 +618,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
...
@@ -578,7 +618,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
else
if
(
data
[
3
]
==
0x06
&&
data
[
4
]
==
0xB0
&&
else
if
(
data
[
3
]
==
0x06
&&
data
[
4
]
==
0xB0
&&
len
==
HbComReq_B0_len
&&
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
;
copy_data_to_com
;
return
HbComReq_B0
;
return
HbComReq_B0
;
}
}
...
@@ -588,14 +629,19 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
...
@@ -588,14 +629,19 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
return
HbComReq_Invalid
;
return
HbComReq_Invalid
;
}
}
ADEMCO_EXPORT_SYMBOL
HbComRequestType
hbComParseXDataRequest
(
const
AdemcoXDataSegment
*
xdata
,
HbComRequestType
hbComParseXDataRequest
(
const
AdemcoXDataSegment
*
xdata
,
HbComData
*
cd
)
{
HbComData
*
cd
)
{
if
(
!
xdata
)
{
return
HbComReq_Invalid
;
}
if
(
!
xdata
)
{
return
HbComReq_Invalid
;
}
return
hbComParseRequest
((
const
uint8_t
*
)
ademcoXDataGetValidContentAddr
(
xdata
),
return
hbComParseRequest
(
ademcoXDataGetValidContentLen
(
xdata
),
cd
);
(
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
{
do
{
if
(
len
<
7
)
{
break
;
}
// 所有的 response ,长度最小为 7
if
(
len
<
7
)
{
break
;
}
// 所有的 response ,长度最小为 7
if
(
data
[
0
]
!=
0xEB
||
data
[
1
]
!=
0xBA
||
data
[
2
]
!=
0x3F
)
{
break
;
}
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*
...
@@ -720,8 +766,11 @@ HbComResponseType hbComParseResponse(const uint8_t* data, size_t len, HbComData*
HbComResponseType
hbComParseXDataResponse
(
const
AdemcoXDataSegment
*
xdata
,
HbComResponseType
hbComParseXDataResponse
(
const
AdemcoXDataSegment
*
xdata
,
HbComData
*
cd
)
{
HbComData
*
cd
)
{
if
(
!
xdata
)
{
return
HbComResp_Invalid
;
}
if
(
!
xdata
)
{
return
HbComResp_Invalid
;
}
return
hbComParseResponse
((
const
uint8_t
*
)
ademcoXDataGetValidContentAddr
(
xdata
),
return
hbComParseResponse
(
ademcoXDataGetValidContentLen
(
xdata
),
cd
);
(
const
uint8_t
*
)
ademcoXDataGetValidContentAddr
(
xdata
),
ademcoXDataGetValidContentLen
(
xdata
),
cd
);
}
}
void
hbComMakeReqA0_getMachineStatus
(
HbComData
*
data
)
{
void
hbComMakeReqA0_getMachineStatus
(
HbComData
*
data
)
{
...
@@ -739,8 +788,10 @@ void hbComMakeReqA2_getMoreMachineZones(HbComData* data) {
...
@@ -739,8 +788,10 @@ void hbComMakeReqA2_getMoreMachineZones(HbComData* data) {
data
->
len
=
HbComReq_A2_len
;
data
->
len
=
HbComReq_A2_len
;
}
}
void
hbComMakeReqA3_modifyMachineZone
(
HbComData
*
data
,
uint8_t
zone
,
void
hbComMakeReqA3_modifyMachineZone
(
HbComData
*
data
,
HbZoneProperty
prop
,
HbComReq_A3_op
op
)
{
uint8_t
zone
,
HbZoneProperty
prop
,
HbComReq_A3_op
op
)
{
memcpy
(
data
->
data
,
HbComReq_A3_head
,
5
);
memcpy
(
data
->
data
,
HbComReq_A3_head
,
5
);
data
->
data
[
5
]
=
zone
;
data
->
data
[
5
]
=
zone
;
data
->
data
[
6
]
=
prop
;
data
->
data
[
6
]
=
prop
;
...
@@ -754,14 +805,17 @@ void hbComMakeReqA5_getMachineTimer(HbComData* data) {
...
@@ -754,14 +805,17 @@ void hbComMakeReqA5_getMachineTimer(HbComData* data) {
data
->
len
=
HbComReq_A5_len
;
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
,
HbComReq_A7_head
,
5
);
memcpy
(
data
->
data
+
5
,
timer
,
sizeof
(
*
timer
));
memcpy
(
data
->
data
+
5
,
timer
,
sizeof
(
*
timer
));
data
->
len
=
HbComReq_A7_len
;
data
->
len
=
HbComReq_A7_len
;
hbSum
(
data
->
data
,
data
->
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
);
memcpy
(
data
->
data
,
HbComReq_AA_head
,
5
);
data
->
data
[
5
]
=
zone
;
data
->
data
[
5
]
=
zone
;
data
->
data
[
6
]
=
!!
on
;
data
->
data
[
6
]
=
!!
on
;
...
@@ -779,7 +833,8 @@ void hbComMakeReqAD_getMoreMachineZoneLostConfig(HbComData* data) {
...
@@ -779,7 +833,8 @@ void hbComMakeReqAD_getMoreMachineZoneLostConfig(HbComData* data) {
data
->
len
=
HbComReq_AD_len
;
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
)
{
HbCom_3sec_status
status
)
{
memcpy
(
data
->
data
,
HbComReq_AE_head
,
5
);
memcpy
(
data
->
data
,
HbComReq_AE_head
,
5
);
data
->
data
[
5
]
=
p1
;
data
->
data
[
5
]
=
p1
;
...
@@ -805,7 +860,8 @@ void hbComMakeReqWR_acct(HbComData* data, const char* acct) {
...
@@ -805,7 +860,8 @@ void hbComMakeReqWR_acct(HbComData* data, const char* acct) {
hbSum
(
data
->
data
,
data
->
len
);
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
;
if
(
!
iter
||
!
com
)
return
;
memcpy
(
&
iter
->
com
,
com
,
sizeof
(
HbComData
));
memcpy
(
&
iter
->
com
,
com
,
sizeof
(
HbComData
));
iter
->
i
=
0
;
iter
->
i
=
0
;
...
@@ -820,7 +876,8 @@ void hbComResp_A2_Iter_init(HbComResp_A2_Iter* iter, const HbComData* com) {
...
@@ -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
)
if
(
iter
->
i
==
iter
->
total
)
return
HbComResp_A2_p1_nomore
;
return
HbComResp_A2_p1_nomore
;
zp
->
zone
=
iter
->
com
.
data
[
6
+
iter
->
i
*
2
];
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
...
@@ -829,7 +886,8 @@ HbComResp_A2_p1 hbComResp_A2_Iter_next(HbComResp_A2_Iter* iter, HbZoneAndPropert
return
HbComResp_A2_p1_more
;
return
HbComResp_A2_p1_more
;
}
}
void
hbComMakeRespA0_getMachineStatus
(
HbComData
*
data
,
HbMachineStatus
status
,
void
hbComMakeRespA0_getMachineStatus
(
HbComData
*
data
,
HbMachineStatus
status
,
HbMachineType
type
)
{
HbMachineType
type
)
{
memcpy
(
data
->
data
,
HbComResp_A0_head
,
6
);
memcpy
(
data
->
data
,
HbComResp_A0_head
,
6
);
data
->
data
[
6
]
=
status
;
data
->
data
[
6
]
=
status
;
...
@@ -838,8 +896,11 @@ void hbComMakeRespA0_getMachineStatus(HbComData* data, HbMachineStatus status,
...
@@ -838,8 +896,11 @@ void hbComMakeRespA0_getMachineStatus(HbComData* data, HbMachineStatus status,
hbSum
(
data
->
data
,
data
->
len
);
hbSum
(
data
->
data
,
data
->
len
);
}
}
void
hbComMakeRespA2_getMachineZones
(
HbComData
*
data
,
size_t
count
,
AdemcoZone
*
zones
,
void
hbComMakeRespA2_getMachineZones
(
HbComData
*
data
,
HbZoneProperty
*
props
,
HbComResp_A2_p1
p1
)
{
size_t
count
,
AdemcoZone
*
zones
,
HbZoneProperty
*
props
,
HbComResp_A2_p1
p1
)
{
if
(
count
>
HbComResp_A2_max_zone
)
{
return
;
}
if
(
count
>
HbComResp_A2_max_zone
)
{
return
;
}
memcpy
(
data
->
data
,
HbComResp_A2_head
,
6
);
memcpy
(
data
->
data
,
HbComResp_A2_head
,
6
);
data
->
data
[
3
]
=
(
HbComResp_A2_len_min
+
count
*
2
)
&
0xFF
;
data
->
data
[
3
]
=
(
HbComResp_A2_len_min
+
count
*
2
)
&
0xFF
;
...
@@ -858,8 +919,10 @@ void hbComMakeRespA3_waitingSignal(HbComData* data) {
...
@@ -858,8 +919,10 @@ void hbComMakeRespA3_waitingSignal(HbComData* data) {
data
->
len
=
HbComResp_A3_len
;
data
->
len
=
HbComResp_A3_len
;
}
}
void
hbComMakeRespA4_modifyMachineZone
(
HbComData
*
data
,
AdemcoZone
zone
,
void
hbComMakeRespA4_modifyMachineZone
(
HbComData
*
data
,
HbZoneProperty
prop
,
HbComResp_A4_p3
p3
)
{
AdemcoZone
zone
,
HbZoneProperty
prop
,
HbComResp_A4_p3
p3
)
{
memcpy
(
data
->
data
,
HbComResp_A4_head
,
6
);
memcpy
(
data
->
data
,
HbComResp_A4_head
,
6
);
data
->
data
[
6
]
=
zone
&
0xFF
;
data
->
data
[
6
]
=
zone
&
0xFF
;
data
->
data
[
7
]
=
prop
;
data
->
data
[
7
]
=
prop
;
...
@@ -868,7 +931,8 @@ void hbComMakeRespA4_modifyMachineZone(HbComData* data, AdemcoZone zone,
...
@@ -868,7 +931,8 @@ void hbComMakeRespA4_modifyMachineZone(HbComData* data, AdemcoZone zone,
hbSum
(
data
->
data
,
data
->
len
);
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
,
HbComResp_A6_head
,
6
);
memcpy
(
data
->
data
+
6
,
timer
->
data
,
sizeof
(
*
timer
));
memcpy
(
data
->
data
+
6
,
timer
->
data
,
sizeof
(
*
timer
));
data
->
len
=
HbComResp_A6_len
;
data
->
len
=
HbComResp_A6_len
;
...
@@ -885,7 +949,8 @@ void hbComMakeRespA8_reject(HbComData* data) {
...
@@ -885,7 +949,8 @@ void hbComMakeRespA8_reject(HbComData* data) {
data
->
len
=
HbComResp_A8_len
;
data
->
len
=
HbComResp_A8_len
;
}
}
void
hbComMakeRespAB_modifyMachineZoneLostConfig
(
HbComData
*
data
,
AdemcoZone
zone
,
void
hbComMakeRespAB_modifyMachineZoneLostConfig
(
HbComData
*
data
,
AdemcoZone
zone
,
HbComResp_AB_p2
p2
)
{
HbComResp_AB_p2
p2
)
{
memcpy
(
data
->
data
,
HbComResp_AB_head
,
6
);
memcpy
(
data
->
data
,
HbComResp_AB_head
,
6
);
data
->
data
[
6
]
=
zone
&
0xFF
;
data
->
data
[
6
]
=
zone
&
0xFF
;
...
@@ -894,12 +959,17 @@ void hbComMakeRespAB_modifyMachineZoneLostConfig(HbComData* data, AdemcoZone zon
...
@@ -894,12 +959,17 @@ void hbComMakeRespAB_modifyMachineZoneLostConfig(HbComData* data, AdemcoZone zon
hbSum
(
data
->
data
,
data
->
len
);
hbSum
(
data
->
data
,
data
->
len
);
}
}
void
hbComMakeRespAD_getMachineZoneLostConfig
(
HbComData
*
data
,
HbComResp_AD_p1
p1
,
void
hbComMakeRespAD_getMachineZoneLostConfig
(
HbComData
*
data
,
size_t
count
,
AdemcoZone
*
zones
,
HbComResp_AD_p1
p1
,
size_t
count
,
AdemcoZone
*
zones
,
HbComResp_AD_p2
p2
)
{
HbComResp_AD_p2
p2
)
{
if
(
count
>
HbComResp_AD_max_zone
)
{
return
;
}
if
(
count
>
HbComResp_AD_max_zone
)
{
return
;
}
memcpy
(
data
->
data
,
HbComResp_AD_head
,
6
);
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
;
data
->
data
[
6
]
=
p1
;
uint8_t
*
p
=
data
->
data
+
7
;
uint8_t
*
p
=
data
->
data
+
7
;
for
(
size_t
i
=
0
;
i
<
count
;
i
++
)
{
for
(
size_t
i
=
0
;
i
<
count
;
i
++
)
{
...
@@ -915,7 +985,8 @@ void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* data, HbComResp_AD_p1 p
...
@@ -915,7 +985,8 @@ void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* data, HbComResp_AD_p1 p
hbSum
(
data
->
data
,
data
->
len
);
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
)
{
HbCom_3sec_status
status
)
{
memcpy
(
data
->
data
,
HbComResp_AF_head
,
6
);
memcpy
(
data
->
data
,
HbComResp_AF_head
,
6
);
data
->
data
[
6
]
=
p1
;
data
->
data
[
6
]
=
p1
;
...
@@ -930,12 +1001,17 @@ void hbComMakeRespB1_get3SectionMachineStatus(HbComData* data,
...
@@ -930,12 +1001,17 @@ void hbComMakeRespB1_get3SectionMachineStatus(HbComData* data,
HbMachineStatus
statusSec2
,
HbMachineStatus
statusSec2
,
HbMachineStatus
statusSec3
)
{
HbMachineStatus
statusSec3
)
{
memcpy
(
data
->
data
,
HbComResp_B1_head
,
6
);
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
;
data
->
len
=
HbComResp_B1_len
;
hbSum
(
data
->
data
,
data
->
len
);
hbSum
(
data
->
data
,
data
->
len
);
}
}
void
hbComDataToAdemcoXData
(
const
HbComData
*
const
data
,
AdemcoXDataSegment
*
xdata
,
void
hbComDataToAdemcoXData
(
const
HbComData
*
const
data
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
)
{
AdemcoXDataSegment
*
xdata
,
AdemcoXDataLengthFormat
xlf
,
AdemcoXDataTransform
xtr
)
{
ademcoMakeXData
(
xdata
,
xlf
,
xtr
,
(
const
char
*
)
data
->
data
,
data
->
len
);
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__
#ifndef __HB_COM_H__
#define __HB_COM_H__
#define __HB_COM_H__
...
@@ -21,7 +15,8 @@ extern "C" {
...
@@ -21,7 +15,8 @@ extern "C" {
//! 是否合法的三防区主机状态GG
//! 是否合法的三防区主机状态GG
static
inline
int
hbIsValid3SectionMachineGG
(
AdemcoGG
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 {
...
@@ -232,33 +227,41 @@ typedef enum HbComResp_A4_p3 {
HbComResp_A4_p3_ne
=
0x03
,
//! 失败--防区未对码 not exists
HbComResp_A4_p3_ne
=
0x03
,
//! 失败--防区未对码 not exists
}
HbComResp_A4_p3
;
}
HbComResp_A4_p3
;
//! 获取主机定时器 EB AB 3F A5 7A
//! 获取主机定时器
//! EB AB 3F A5 7A
#define HbComReq_A5_len 5
#define HbComReq_A5_len 5
#define HbComReq_A5_data "\xEB\xAB\x3F\xA5\x7A"
#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_len 15
#define HbComResp_A6_head "\xEB\xBA\x3F\x0F\xCC\xA6"
#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_len 14
#define HbComReq_A7_head "\xEB\xCB\x3F\x0E\xA7"
#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_len 7
#define HbComResp_A7_data "\xEB\xBA\x3F\x07\xCC\xA7\x5E"
#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直接回复
//! 任何操作,主机如果认为非法,都可以用A8直接回复
#define HbComResp_A8_len 7
#define HbComResp_A8_len 7
#define HbComResp_A8_data "\xEB\xBA\x3F\x07\xCC\xA8\x5F"
#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_len 8
#define HbComReq_AA_head "\xEB\xAB\x3F\x08\xAA"
#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_len 9
#define HbComResp_AB_head "\xEB\xBA\x3F\x09\xCC\xAB"
#define HbComResp_AB_head "\xEB\xBA\x3F\x09\xCC\xAB"
typedef
enum
HbComResp_AB_p2
{
typedef
enum
HbComResp_AB_p2
{
...
@@ -267,21 +270,26 @@ typedef enum HbComResp_AB_p2 {
...
@@ -267,21 +270,26 @@ typedef enum HbComResp_AB_p2 {
HbComResp_AB_p2_reject
=
2
,
// 拒绝操作
HbComResp_AB_p2_reject
=
2
,
// 拒绝操作
}
HbComResp_AB_p2
;
}
HbComResp_AB_p2
;
//! 索要防区探头遗失/失联 第一次索要 EB AB 3F AC 81
//! 索要防区探头遗失/失联,第一次索要
//! EB AB 3F AC 81
#define HbComReq_AC_len 5
#define HbComReq_AC_len 5
#define HbComReq_AC_data "\xEB\xAB\x3F\xAC\x81"
#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_len 5
#define HbComReq_AD_data "\xEB\xAB\x3F\xAD\x82"
#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
// 无防区失联数据时一包长度最小为9
#define HbComResp_AD_len_min 9
#define HbComResp_AD_len_min 9
// 一包最多包含20个防区
// 一包最多包含20个防区
#define HbComResp_AD_max_zone 20
#define HbComResp_AD_max_zone 20
// 一包最多有 9 + 20 *2 = 49 个字节
// 一包最多有 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
{
typedef
enum
HbComResp_AD_p1
{
HbComResp_AD_p1_single
=
0xF0
,
// 防区号以单字节表示
HbComResp_AD_p1_single
=
0xF0
,
// 防区号以单字节表示
HbComResp_AD_p1_double
=
0xF1
,
// 防区号以双字节表示
HbComResp_AD_p1_double
=
0xF1
,
// 防区号以双字节表示
...
@@ -319,10 +327,17 @@ typedef enum HbCom_3sec_which {
...
@@ -319,10 +327,17 @@ typedef enum HbCom_3sec_which {
//! 三区段主机状态回应 EB BA 3F 08 P0 B1 P1 SUM
//! 三区段主机状态回应 EB BA 3F 08 P0 B1 P1 SUM
#define HbComResp_B1_len 8
#define HbComResp_B1_len 8
#define HbComResp_B1_head "\xEB\xBA\x3F\x08\xCC\xB1"
#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_status(d) \
#define hbComResp_B1_status1(d) ((((d)[6] >> 4) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
((((d)[6] >> 6) & 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_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
#define HbComReq_RD_acct_len 7
...
@@ -341,11 +356,14 @@ typedef enum HbCom_3sec_which {
...
@@ -341,11 +356,14 @@ typedef enum HbCom_3sec_which {
#define HbComResp_WR_acct_head HbComReq_WR_acct_head
#define HbComResp_WR_acct_head HbComReq_WR_acct_head
static
const
HbZoneProperty
hbZoneProperties
[
12
]
=
{
static
const
HbZoneProperty
hbZoneProperties
[
12
]
=
{
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_GAS
,
HZP_WATER
,
HZP_SUB_MACHINE
,
HZP_BUGLAR
,
HZP_EMERGENCY
,
HZP_FIRE
,
HZP_DURESS
,
HZP_REMOTE_CONTROL
,
HZP_BUGLAR_HALF
,
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
};
HZP_GAS
,
HZP_WATER
,
HZP_SUB_MACHINE
,
HZP_REMOTE_CONTROL
,
HZP_BUGLAR_HALF
,
HZP_SHIELD
,
HZP_DOOR_RING
,
HZP_BYPASS
,
};
// return available count
// 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
);
ADEMCO_EXPORT_SYMBOL
uint16_t
hbZoneMax
(
HbMachineType
type
);
...
@@ -409,56 +427,106 @@ ADEMCO_EXPORT_SYMBOL void hbSum(uint8_t* data, size_t len);
...
@@ -409,56 +427,106 @@ ADEMCO_EXPORT_SYMBOL void hbSum(uint8_t* data, size_t len);
// 校验和是否正确, return 0 for incorrect, otherwise correct
// 校验和是否正确, return 0 for incorrect, otherwise correct
ADEMCO_EXPORT_SYMBOL
int
hbCheckSum
(
const
uint8_t
*
data
,
size_t
len
);
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
ADEMCO_EXPORT_SYMBOL
HbComRequestType
hbComParseXDataRequest
(
const
AdemcoXDataSegment
*
xdata
,
HbComData
*
cd
);
HbComRequestType
hbComParseRequest
(
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
hbComParseResponse
(
const
uint8_t
*
buff
,
size_t
len
,
HbComData
*
cd
);
ADEMCO_EXPORT_SYMBOL
// parse COM response and return response type. If cd is non-NULL, valid data will be copied to cd
HbComRequestType
hbComParseXDataRequest
(
const
AdemcoXDataSegment
*
xdata
,
ADEMCO_EXPORT_SYMBOL
HbComResponseType
hbComParseXDataResponse
(
const
AdemcoXDataSegment
*
xdata
,
HbComData
*
cd
);
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
hbComMakeReqA0_getMachineStatus
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqA1_getMachineZones
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqA1_getMachineZones
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqA2_getMoreMachineZones
(
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
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
// TODO
// ADEMCO_EXPORT_SYMBOL void hbComMakeReqA9(HbComData* data, HbMachineStatus status, HbMachineType type);
// 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
hbComMakeReqAC_getMachineZoneLostConfig
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqAD_getMoreMachineZoneLostConfig
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqAD_getMoreMachineZoneLostConfig
(
HbComData
*
data
);
// p2 must be HbCom_3sec_arm or HbCom_3sec_disarm
// 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
hbComMakeReqB0_get3SectionMachineStatus
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeReqRD_acct
(
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
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
void
hbComResp_A2_Iter_init
(
HbComResp_A2_Iter
*
iter
,
ADEMCO_EXPORT_SYMBOL
HbComResp_A2_p1
hbComResp_A2_Iter_next
(
HbComResp_A2_Iter
*
iter
,
HbZoneAndProperty
*
zp
);
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
// zones and props length is count
// if count is 0, p1 wil be set to HbComResp_A2_p1_nomore
// if count is 0, p1 wil be set to HbComResp_A2_p1_nomore
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA2_getMachineZones
(
HbComData
*
data
,
size_t
count
,
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA2_getMachineZones
(
HbComData
*
data
,
AdemcoZone
*
zones
,
HbZoneProperty
*
props
,
HbComResp_A2_p1
p1
);
size_t
count
,
AdemcoZone
*
zones
,
HbZoneProperty
*
props
,
HbComResp_A2_p1
p1
);
// 学码开始,等待探测器无线信号中
// 学码开始,等待探测器无线信号中
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA3_waitingSignal
(
HbComData
*
data
);
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
hbComMakeRespA4_modifyMachineZone
(
HbComData
*
data
,
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA6_getMachineTimer
(
HbComData
*
data
,
HbMachineTimer
*
timer
);
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
hbComMakeRespA7_setMachineTimer
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA8_reject
(
HbComData
*
data
);
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespA8_reject
(
HbComData
*
data
);
// TODO
// TODO
// ADEMCO_EXPORT_SYMBOL void hbComMakeRespA9_(HbComData* data);
// 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
hbComMakeRespAD_getMachineZoneLostConfig
(
HbComData
*
data
,
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespAF_set3SectionMachineStatus
(
HbComData
*
data
,
HbCom_3sec_which
p1
,
HbCom_3sec_status
status
);
HbComResp_AD_p1
p1
,
ADEMCO_EXPORT_SYMBOL
void
hbComMakeRespB1_get3SectionMachineStatus
(
HbComData
*
data
,
HbMachineStatus
statusMachine
,
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
statusSec1
,
HbMachineStatus
statusSec2
,
HbMachineStatus
statusSec2
,
HbMachineStatus
statusSec3
);
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
#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 ..\
...
@@ -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\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.h ..\
xcopy /i /s /y G:\dev_libs\ademco\hb\hb_com.c ..\
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
...
@@ -18,6 +18,14 @@ export MACOS_TARGET=jack@JackMacBook-Pro.local
export
MACOS_PROJECT_PATH
=
/Users/jack/projects/ademco_hb
export
MACOS_PROJECT_PATH
=
/Users/jack/projects/ademco_hb
export
MACOS_JAVA_HOME
=
/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home
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
rm
-rf
dist
mkdir
-p
dist
mkdir
-p
dist
...
@@ -44,3 +52,8 @@ mkdir -p dist
...
@@ -44,3 +52,8 @@ mkdir -p dist
# mac-node
# mac-node
./mk_macos_node.sh
./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
#!/bin/bash
# win-node
CURRENT_DIR
=
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
;
pwd
-P
)
./clean.sh
cd
$CURRENT_DIR
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/
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