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
baeb04a5
Commit
baeb04a5
authored
2 months ago
by
captainwong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add switch demo
parent
8580363c
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
77 additions
and
0 deletions
+77
-0
server_demo.cpp
examples/server_demo/server_demo.cpp
+77
-0
No files found.
examples/server_demo/server_demo.cpp
View file @
baeb04a5
...
...
@@ -24,6 +24,7 @@
#include <mutex>
#include <thread>
#include <unordered_map>
#include <vector>
#include "../../ademco.h"
...
...
@@ -57,6 +58,72 @@ std::mutex mutex = {};
std
::
vector
<
ademco_event_t
>
evntsWaiting4Send
=
{};
char
pwd
[
1024
]
=
{};
// 开关量示例:在收到报警时上报报警,在一定时间后自动上报报警恢复,在撤防时上报报警恢复
constexpr
auto
DEDUP_GAP
=
3
;
// 3秒内重复报警事件不上报
constexpr
auto
SWITCH_TIMEOUT
=
10
;
// 10秒后自动上报3120报警恢复
typedef
struct
{
time_t
time
;
ademco_event_t
event
;
}
alarm_one_t
;
std
::
unordered_map
<
ademco_zone_t
,
alarm_one_t
>
switch_alarms
;
// 开关量报警缓存, zone -> alarm
const
ademco_event_t
switch_events
[]
=
{
// 仅处理这些报警事件,其他事件忽略
EVENT_BURGLAR
,
// ... 有需要自己改
};
void
switch_report
(
ademco_zone_t
zone
,
ademco_event_t
event
)
{
// 上报报警
// 这里自己实现上报逻辑
}
// 开关量处理函数,过滤重复报警事件
void
switch_filter
(
ademco_zone_t
zone
,
ademco_event_t
event
)
{
bool
should_handle
=
false
;
for
(
const
auto
&
e
:
switch_events
)
{
if
(
e
==
event
)
{
should_handle
=
true
;
break
;
}
}
if
(
!
should_handle
)
{
return
;
}
auto
now
=
time
(
nullptr
);
auto
it
=
switch_alarms
.
find
(
zone
);
if
(
it
==
switch_alarms
.
end
())
{
switch_alarms
[
zone
]
=
{
now
,
event
};
return
;
}
if
(
now
-
it
->
second
.
time
<
DEDUP_GAP
)
{
return
;
}
it
->
second
.
time
=
now
;
it
->
second
.
event
=
event
;
switch_report
(
zone
,
event
);
}
// 开关量清理函数,撤防时上报报警恢复
void
swithc_all_clear
()
{
for
(
auto
&
it
:
switch_alarms
)
{
switch_report
(
it
.
first
,
EVENT_BURGLAR_RECOVER
);
}
switch_alarms
.
clear
();
}
// 开关量超时处理函数,超时自动上报报警恢复
void
switch_check_timeout
()
{
auto
now
=
time
(
nullptr
);
for
(
auto
it
=
switch_alarms
.
begin
();
it
!=
switch_alarms
.
end
();)
{
if
(
now
-
it
->
second
.
time
>
SWITCH_TIMEOUT
)
{
switch_report
(
it
->
first
,
EVENT_BURGLAR_RECOVER
);
it
=
switch_alarms
.
erase
(
it
);
}
else
{
++
it
;
}
}
}
int
setNonBlocking
(
SOCKET
socket
)
{
u_long
lngMode
=
1
;
int
ret
=
ioctl
(
socket
,
FIONBIO
,
(
u_long
*
)
&
lngMode
);
...
...
@@ -188,6 +255,13 @@ int main(int argc, char** argv) {
break
;
}
// 开关量过滤
switch_filter
(
pkt
.
dat
.
zone
,
pkt
.
dat
.
ademco_event
);
// 撤防时上报报警恢复
if
(
pkt
.
dat
.
ademco_event
==
EVENT_DISARM
)
{
swithc_all_clear
();
}
break
;
}
...
...
@@ -280,6 +354,9 @@ int main(int argc, char** argv) {
do_accept
();
do_read
();
// 开关量检查超时
switch_check_timeout
();
if
(
clientSock
!=
INVALID_SOCKET
&&
!
evntsWaiting4Send
.
empty
())
{
std
::
lock_guard
<
std
::
mutex
>
lg
(
mutex
);
char
buf
[
1024
];
...
...
This diff is collapsed.
Click to expand it.
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