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
Jan 15, 2025
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
];
...
...
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