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
257b586d
Commit
257b586d
authored
Jul 29, 2020
by
captainwong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add event for HTZ-G100 1757
parent
fcbc9da3
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
67 additions
and
153 deletions
+67
-153
ademco_event.h
include/ademco_event.h
+17
-147
ademco_packet.h
include/ademco_packet.h
+50
-6
No files found.
include/ademco_event.h
View file @
257b586d
...
...
@@ -88,6 +88,7 @@ enum ADEMCO_EVENT : uint32_t {
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_PHONE_USER_SOS
=
1709
,
// 手机用户SOS
EVENT_PHONE_USER_CANCLE_ALARM
=
1711
,
// 手机用户消警
...
...
@@ -174,6 +175,7 @@ static constexpr ADEMCO_EVENT AdemcoEvents[] = {
EVENT_I_AM_LCD_MACHINE
,
EVENT_I_AM_WIRE_MACHINE
,
EVENT_I_AM_WIFI_MACHINE
,
EVENT_I_AM_3_SECTION_MACHINE
,
EVENT_SIM_IS_IOT_CARD
,
EVENT_SIM_IS_NOT_IOT_CARD
,
...
...
@@ -190,9 +192,7 @@ static constexpr ADEMCO_EVENT AdemcoEvents[] = {
inline
std
::
string
ademcoEventToStringEnglish
(
ADEMCO_EVENT
ademco_event
,
bool
with_event_number
=
true
)
{
auto
n_to_s
=
[
&
with_event_number
](
uint32_t
n
)
->
std
::
string
{
if
(
with_event_number
)
{
return
std
::
to_string
(
n
)
+
"--"
;
}
if
(
with_event_number
)
{
return
std
::
to_string
(
n
)
+
"--"
;
}
return
std
::
string
();
};
...
...
@@ -245,10 +245,11 @@ inline std::string ademcoEventToStringEnglish(ADEMCO_EVENT ademco_event, bool wi
case
EVENT_I_AM_NET_MODULE
:
return
n_to_s
(
ademco_event
)
+
"I_AM_NET_MODULE"
;
break
;
case
EVENT_PHONE_USER_SOS
:
return
n_to_s
(
ademco_event
)
+
"SOS"
;
break
;
case
EVENT_PHONE_USER_CANCLE_ALARM
:
return
n_to_s
(
ademco_event
)
+
"PHONE_USER_CANCLE_ALARM"
;
break
;
case
EVENT_I_AM_GPRS
:
return
n_to_s
(
ademco_event
)
+
"
EVENT_I_AM_GPRS
"
;
break
;
case
EVENT_I_AM_GPRS
:
return
n_to_s
(
ademco_event
)
+
"
I_AM_GPRS_MACHINE
"
;
break
;
case
EVENT_I_AM_LCD_MACHINE
:
return
n_to_s
(
ademco_event
)
+
"I_AM_LCD_MACHINE"
;
break
;
case
EVENT_I_AM_WIRE_MACHINE
:
return
n_to_s
(
ademco_event
)
+
"I_AM_WIRE_MACHINE"
;
break
;
case
EVENT_I_AM_WIFI_MACHINE
:
return
n_to_s
(
ademco_event
)
+
"I_AM_WIFI_MACHINE"
;
break
;
case
EVENT_I_AM_3_SECTION_MACHINE
:
return
n_to_s
(
ademco_event
)
+
"I_AM_3_SECTION_MACHINE"
;
break
;
case
EVENT_SIM_IS_IOT_CARD
:
return
n_to_s
(
ademco_event
)
+
"SIM card is IOT"
;
break
;
case
EVENT_SIM_IS_NOT_IOT_CARD
:
return
n_to_s
(
ademco_event
)
+
"SIM card is not IOT"
;
break
;
case
EVENT_ENTER_SETTING_MODE
:
return
n_to_s
(
ademco_event
)
+
"ENTER_SETTING_MODE"
;
break
;
...
...
@@ -325,6 +326,7 @@ inline const std::wstring ademcoEventToStringChinese(ADEMCO_EVENT ademco_event,
case
EVENT_I_AM_LCD_MACHINE
:
return
n_to_s
(
ademco_event
)
+
L"我是液晶主机"
;
break
;
case
EVENT_I_AM_WIRE_MACHINE
:
return
n_to_s
(
ademco_event
)
+
L"我是网线主机"
;
break
;
case
EVENT_I_AM_WIFI_MACHINE
:
return
n_to_s
(
ademco_event
)
+
L"我是WiFi主机"
;
break
;
case
EVENT_I_AM_3_SECTION_MACHINE
:
return
n_to_s
(
ademco_event
)
+
L"我是三区段主机"
;
break
;
case
EVENT_SIM_IS_IOT_CARD
:
return
n_to_s
(
ademco_event
)
+
L"SIM卡为物联卡"
;
break
;
case
EVENT_SIM_IS_NOT_IOT_CARD
:
return
n_to_s
(
ademco_event
)
+
L"SIM卡为非物联卡"
;
break
;
case
EVENT_ENTER_SETTING_MODE
:
return
n_to_s
(
ademco_event
)
+
L"主机进入设置状态"
;
break
;
...
...
@@ -346,6 +348,17 @@ static inline bool isStatusEvent(ADEMCO_EVENT ademco_event)
||
ademco_event
==
EVENT_DISARM
;
}
//! 是否主机类型事件
static
inline
bool
isMachineTypeEvent
(
ADEMCO_EVENT
ademco_event
)
{
return
ademco_event
==
EVENT_I_AM_NET_MODULE
||
ademco_event
==
EVENT_I_AM_GPRS
||
ademco_event
==
EVENT_I_AM_LCD_MACHINE
||
ademco_event
==
EVENT_I_AM_WIRE_MACHINE
||
ademco_event
==
EVENT_I_AM_WIFI_MACHINE
||
ademco_event
==
EVENT_I_AM_3_SECTION_MACHINE
;
}
// 安定宝事件级别
enum
EventLevel
{
...
...
@@ -356,29 +369,6 @@ enum EventLevel
EVENT_LEVEL_ALARM
,
// 红色报警
};
#if !defined(__GNUG__) && defined(_AFX)
inline
COLORREF
GetEventLevelColor
(
EventLevel
level
)
{
switch
(
level
)
{
case
ademco
:
:
EVENT_LEVEL_NULL
:
return
RGB
(
0
,
187
,
94
);
// 绿色
break
;
case
ademco
:
:
EVENT_LEVEL_EXCEPTION_RESUME
:
return
RGB
(
224
,
224
,
12
);
// 黄色
break
;
case
ademco
:
:
EVENT_LEVEL_EXCEPTION
:
return
RGB
(
0xFF
,
0x80
,
0x00
);
// 橙色
break
;
case
ademco
:
:
EVENT_LEVEL_ALARM
:
return
RGB
(
0xFF
,
0x18
,
0x18
);
// 红色
break
;
default:
return
RGB
(
255
,
255
,
255
);
// 白色
break
;
}
}
#endif // !defined(__GNUG__) && defined(_AFX)
// 获取安定宝事件级别
inline
EventLevel
GetEventLevel
(
ADEMCO_EVENT
ademco_event
)
{
...
...
@@ -444,125 +434,5 @@ inline ADEMCO_EVENT getExceptionEventByResumeEvent(ADEMCO_EVENT resume_event)
}
}
//! 安定宝事件源
enum
EventSource
{
ES_UNKNOWN
,
ES_TCP_CLIENT
,
// 从客户端接收的事件 (如直连型网络模块、GPRS主机等)
ES_TCP_SERVER1
,
// 从1号中转服务器接收的事件
ES_TCP_SERVER2
,
// 从2号中转服务器接收的事件
ES_SMS
,
// 接警中心短信模块收到的事件
};
//! 安定宝事件源字符串
static
inline
const
char
*
eventSourceString
(
EventSource
es
)
{
switch
(
es
)
{
case
EventSource
:
:
ES_TCP_CLIENT
:
return
"ES_TCP_CLIENT"
;
break
;
case
EventSource
:
:
ES_TCP_SERVER1
:
return
"ES_TCP_SERVER1"
;
break
;
case
EventSource
:
:
ES_TCP_SERVER2
:
return
"ES_TCP_SERVER2"
;
break
;
case
EventSource
:
:
ES_SMS
:
return
"ES_SMS"
;
break
;
case
EventSource
:
:
ES_UNKNOWN
:
default:
return
"ES_UNKNOWN"
;
break
;
}
}
//! 安定宝事件 xdata 段
struct
XData
{
enum
class
LengthFormat
{
TWO_HEX
,
FOUR_DECIMAL
,
};
LengthFormat
lengthFormat_
=
LengthFormat
::
TWO_HEX
;
//! 刨去[ len ]后,真实有效数据的长度,用来程序调用
std
::
vector
<
char
>
data_
=
{};
//! 包含 [ len ... ] 的全部数据长度,可以用来网络发送
std
::
vector
<
char
>
rawData_
=
{};
XData
()
{}
size_t
size
()
const
{
return
data_
.
size
();
}
size_t
rawSize
()
const
{
return
rawData_
.
size
();
}
bool
operator
==
(
const
XData
&
rhs
)
const
{
return
lengthFormat_
==
rhs
.
lengthFormat_
&&
data_
==
rhs
.
data_
;
}
};
typedef
std
::
shared_ptr
<
XData
>
XDataPtr
;
inline
bool
operator
==
(
const
XDataPtr
&
lhs
,
const
XDataPtr
&
rhs
)
{
if
(
lhs
&&
rhs
)
{
return
*
lhs
==
*
rhs
;
}
else
if
(
!
lhs
&&
!
rhs
)
{
return
true
;
}
else
{
return
false
;
}
}
//! 安定宝事件
struct
AdemcoEvent
{
EventSource
eventSource_
=
ES_UNKNOWN
;
// 来源
ADEMCO_EVENT
event_
=
EVENT_INVALID_EVENT
;
// 事件码
uint32_t
zone_
=
0
;
// 防区号
uint8_t
gg_
=
0
;
// 分防区号
time_t
timestamp_
=
0
;
// 时间戳
time_t
recv_time_
=
0
;
// 接收时间
XDataPtr
xdata_
=
{};
// 附加信息
AdemcoEvent
()
{}
AdemcoEvent
(
EventSource
source
,
ADEMCO_EVENT
ademco_event
,
uint32_t
zone
,
uint8_t
gg
,
time_t
timestamp
=
0
,
time_t
recv_time
=
0
,
const
XDataPtr
&
xdata
=
{})
:
eventSource_
(
source
),
event_
(
ademco_event
),
zone_
(
zone
),
gg_
(
gg
),
timestamp_
(
timestamp
),
recv_time_
(
recv_time
),
xdata_
(
xdata
)
{}
AdemcoEvent
(
const
AdemcoEvent
&
rhs
)
:
eventSource_
(
rhs
.
eventSource_
),
event_
(
rhs
.
event_
),
zone_
(
rhs
.
zone_
),
gg_
(
rhs
.
gg_
),
timestamp_
(
rhs
.
timestamp_
),
recv_time_
(
rhs
.
recv_time_
),
xdata_
(
rhs
.
xdata_
)
{}
~
AdemcoEvent
()
{}
AdemcoEvent
&
operator
=
(
const
AdemcoEvent
&
rhs
)
{
eventSource_
=
rhs
.
eventSource_
;
event_
=
rhs
.
event_
;
zone_
=
rhs
.
zone_
;
gg_
=
rhs
.
gg_
;
timestamp_
=
rhs
.
timestamp_
;
recv_time_
=
rhs
.
recv_time_
;
xdata_
=
rhs
.
xdata_
;
return
*
this
;
}
bool
operator
==
(
const
AdemcoEvent
&
rhs
)
{
return
(
event_
==
rhs
.
event_
)
&&
(
zone_
==
rhs
.
zone_
)
&&
(
gg_
==
rhs
.
gg_
)
&&
(
xdata_
==
rhs
.
xdata_
);
}
};
typedef
std
::
shared_ptr
<
AdemcoEvent
>
AdemcoEventPtr
;
}
// namespace ademco
include/ademco_packet.h
View file @
257b586d
...
...
@@ -50,7 +50,7 @@ struct AdemcoData
return
str
;
}
void
assignAde
m
coId
(
size_t
ademco_id
)
{
void
assignAdecoId
(
size_t
ademco_id
)
{
char
aid
[
7
]
=
{
0
};
snprintf
(
aid
,
sizeof
(
aid
),
"%06X"
,
static_cast
<
int
>
(
ademco_id
%
1000000
));
std
::
copy
(
aid
,
aid
+
6
,
std
::
back_inserter
(
data_
));
...
...
@@ -94,7 +94,7 @@ struct AdemcoData
data_
.
reserve
(
21
);
// [#000000|1400 00 000]
data_
.
push_back
(
'['
);
data_
.
push_back
(
'#'
);
assignAde
m
coId
(
ademco_id
);
assignAdecoId
(
ademco_id
);
data_
.
push_back
(
'|'
);
assignAdemcoEvent
(
ademco_event
);
data_
.
push_back
(
' '
);
...
...
@@ -286,6 +286,45 @@ struct CongwinFe100Packet
}
};
// CongwinFe100Packet
//! 安定宝事件 xdata 段
struct
XData
{
enum
class
LengthFormat
{
TWO_HEX
,
FOUR_DECIMAL
,
};
LengthFormat
lengthFormat_
=
LengthFormat
::
TWO_HEX
;
//! 刨去[ len ]后,真实有效数据的长度,用来程序调用
std
::
vector
<
char
>
data_
=
{};
//! 包含 [ len ... ] 的全部数据长度,可以用来网络发送
std
::
vector
<
char
>
rawData_
=
{};
XData
()
{}
size_t
size
()
const
{
return
data_
.
size
();
}
size_t
rawSize
()
const
{
return
rawData_
.
size
();
}
bool
operator
==
(
const
XData
&
rhs
)
const
{
return
lengthFormat_
==
rhs
.
lengthFormat_
&&
data_
==
rhs
.
data_
;
}
};
typedef
std
::
shared_ptr
<
XData
>
XDataPtr
;
inline
bool
operator
==
(
const
XDataPtr
&
lhs
,
const
XDataPtr
&
rhs
)
{
if
(
lhs
&&
rhs
)
{
return
*
lhs
==
*
rhs
;
}
else
if
(
!
lhs
&&
!
rhs
)
{
return
true
;
}
else
{
return
false
;
}
}
//! 生成xdata
static
XDataPtr
makeXData
(
const
std
::
vector
<
char
>&
payload
,
XData
::
LengthFormat
lengthFormat
=
XData
::
LengthFormat
::
TWO_HEX
)
{
...
...
@@ -665,7 +704,7 @@ public:
void
setAcct
(
size_t
acct
)
{
data_
.
resize
(
8
);
data_
[
0
]
=
'#'
;
snprintf
(
&
data_
[
1
],
7
,
"%06
X
"
,
static_cast
<
int
>
(
acct
%
1000000
));
snprintf
(
&
data_
[
1
],
7
,
"%06
d
"
,
static_cast
<
int
>
(
acct
%
1000000
));
}
void
setAcct
(
const
std
::
string
&
acct
)
{
...
...
@@ -721,14 +760,14 @@ struct AdemcoPacket
char
*
len_pos
=
pos
;
pos
+=
4
;
char
*
id_pos
=
pos
;
memcpy
(
id_pos
,
id_
.
data
(),
id_
.
size
());
pos
+=
id_
.
size
();
memcpy
(
id_pos
,
id_
.
data
(),
id_
.
size
());
pos
+=
id_
.
size
();
memcpy
(
pos
,
seq_
.
data_
,
seq_
.
length
);
pos
+=
seq_
.
length
;
memcpy
(
pos
,
&
rrcvr_
.
data_
[
0
],
rrcvr_
.
size
());
pos
+=
rrcvr_
.
size
();
memcpy
(
pos
,
&
lpref_
.
data_
[
0
],
lpref_
.
size
());
pos
+=
lpref_
.
size
();
memcpy
(
pos
,
acct_
.
data
(),
acct_
.
size
());
pos
+=
acct_
.
size
();
memcpy
(
pos
,
&
ademcoData_
.
data_
[
0
],
ademcoData_
.
size
());
pos
+=
ademcoData_
.
size
();
if
(
xdata_
)
{
memcpy
(
pos
,
&
xdata_
->
rawData_
[
0
],
xdata_
->
rawSize
());
memcpy
(
pos
,
&
xdata_
->
rawData_
[
0
],
xdata_
->
rawSize
());
pos
+=
xdata_
->
rawSize
();
}
memcpy
(
pos
,
timestamp_
.
data_
,
timestamp_
.
length
);
pos
+=
timestamp_
.
length
;
...
...
@@ -872,7 +911,12 @@ struct AdemcoPacket
seq_
=
seq
;
rrcvr_
.
setDefault
();
lpref_
.
setDefault
();
acct
?
acct_
.
setAcct
(
acct
)
:
acct_
.
setAcct
(
ademco_id
);
ademcoData_
.
make
(
ademco_id
,
gg
,
evnt
,
zone
);
if
(
acct
&&
ademco_id
==
0
)
{
ademcoData_
.
make
(
acct
,
gg
,
evnt
,
zone
);
}
else
{
ademcoData_
.
make
(
ademco_id
,
gg
,
evnt
,
zone
);
}
xdata_
=
xdata
;
timestamp_
.
make
();
size_t
length
=
calcLength
();
...
...
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