Commit 158dd30f authored by captainwong's avatar captainwong

fix

parent b1dfcec1
...@@ -17,9 +17,6 @@ constexpr int TIMES = 100000; ...@@ -17,9 +17,6 @@ constexpr int TIMES = 100000;
char data[TIMES * 256]; char data[TIMES * 256];
static constexpr size_t MaxAdemcoId = 999999;
static constexpr size_t AdemcoIdSentinel = MaxAdemcoId + 1;
void ademcoPacketBench() void ademcoPacketBench()
{ {
printf("\nademcoPacketBench...\n"); printf("\nademcoPacketBench...\n");
......
...@@ -66,7 +66,7 @@ struct Session { ...@@ -66,7 +66,7 @@ struct Session {
event* timer = nullptr; event* timer = nullptr;
int id = 0; int id = 0;
std::string acct = {}; std::string acct = {};
size_t ademco_id = 0; AdemcoId ademco_id = 0;
uint16_t seq = 0; uint16_t seq = 0;
AdemcoPacket packet = {}; AdemcoPacket packet = {};
...@@ -97,7 +97,7 @@ void handle_ademco_msg(Session* session, bufferevent* bev) ...@@ -97,7 +97,7 @@ void handle_ademco_msg(Session* session, bufferevent* bev)
{ {
auto output = bufferevent_get_output(bev); auto output = bufferevent_get_output(bev);
switch (session->packet.id_.eid_) { switch (session->packet.id_.eid_) {
case AdemcoId::id_ack: case AdemcoMsgId::id_ack:
if (session->packet.seq_.value_ == session->seq) { if (session->packet.seq_.value_ == session->seq) {
if (++session->seq == 10000) { if (++session->seq == 10000) {
session->seq = 1; session->seq = 1;
......
...@@ -32,7 +32,7 @@ void test() ...@@ -32,7 +32,7 @@ void test()
EXPECT_EQ(cb_commited, strlen(raw)); EXPECT_EQ(cb_commited, strlen(raw));
EXPECT_EQ(ap.crc_.value_, 0xC5C3); EXPECT_EQ(ap.crc_.value_, 0xC5C3);
EXPECT_EQ(ap.len_.value_, 0x0053); EXPECT_EQ(ap.len_.value_, 0x0053);
EXPECT_EQ(ap.id_.eid_, AdemcoId::Enum::id_hb); EXPECT_EQ(ap.id_.eid_, AdemcoMsgId::Enum::id_hb);
EXPECT_EQ(ap.seq_.value_, 0); // 0 is not a valid seq, but... EXPECT_EQ(ap.seq_.value_, 0); // 0 is not a valid seq, but...
EXPECT_TRUE(strncmp("R000000", ap.rrcvr_.data_.data(), 7) == 0); EXPECT_TRUE(strncmp("R000000", ap.rrcvr_.data_.data(), 7) == 0);
EXPECT_TRUE(strncmp("L000000", ap.lpref_.data_.data(), 7) == 0); EXPECT_TRUE(strncmp("L000000", ap.lpref_.data_.data(), 7) == 0);
...@@ -64,11 +64,11 @@ void handle_network_data(const char* data_from_network) ...@@ -64,11 +64,11 @@ void handle_network_data(const char* data_from_network)
{ {
printf("parse ok:\n%s\n", ap.toString().data()); printf("parse ok:\n%s\n", ap.toString().data());
switch (ap.id_.eid_) { switch (ap.id_.eid_) {
case AdemcoId::id_ack: case AdemcoMsgId::id_ack:
// success // success
break; break;
case AdemcoId::id_hb: // event report case AdemcoMsgId::id_hb: // event report
// reply ack // reply ack
{ {
char ack[1024]; char ack[1024];
...@@ -107,8 +107,6 @@ int main() ...@@ -107,8 +107,6 @@ int main()
handle_network_data(data_from_network); handle_network_data(data_from_network);
handle_network_data("\n593F0034\"ACK\"0209R123ABCL456DEF#000001[]_09:00:00,04-18-2020\r"); handle_network_data("\n593F0034\"ACK\"0209R123ABCL456DEF#000001[]_09:00:00,04-18-2020\r");
char buff[1024]; char buff[1024];
AdemcoPacket ap; AdemcoPacket ap;
...@@ -118,8 +116,8 @@ int main() ...@@ -118,8 +116,8 @@ int main()
ap.make_ack(buff, sizeof(buff), 1, "861234567890", 123321); ap.make_ack(buff, sizeof(buff), 1, "861234567890", 123321);
handle_network_data(buff); handle_network_data(buff);
size_t ademco_id = 123456; // 主机标识 AdemcoId ademco_id = 123456; // 主机标识
size_t zone = 123; // 防区标识 AdemcoZone zone = 123; // 防区标识
auto evnt = EVENT_FIRE; // 事件码 auto evnt = EVENT_FIRE; // 事件码
ap.make_hb(buff, sizeof(buff), 1, nullptr, ademco_id, 0, evnt, zone); ap.make_hb(buff, sizeof(buff), 1, nullptr, ademco_id, 0, evnt, zone);
handle_network_data(buff); handle_network_data(buff);
......
...@@ -54,7 +54,7 @@ struct Buffer ...@@ -54,7 +54,7 @@ struct Buffer
SOCKET clientSock = INVALID_SOCKET; SOCKET clientSock = INVALID_SOCKET;
Buffer clientBuffer = {}; Buffer clientBuffer = {};
std::string clientAcct = {}; std::string clientAcct = {};
size_t clientAdemcoId = 0; AdemcoId clientAdemcoId = 0;
std::mutex mutex = {}; std::mutex mutex = {};
std::vector<ADEMCO_EVENT> evntsWaiting4Send = {}; std::vector<ADEMCO_EVENT> evntsWaiting4Send = {};
...@@ -151,11 +151,11 @@ int main(int argc, char** argv) ...@@ -151,11 +151,11 @@ int main(int argc, char** argv)
//printf("id=%s\n", ap.id_.data()); //printf("id=%s\n", ap.id_.data());
printf("C:%s\n", ap.toString().data()); printf("C:%s\n", ap.toString().data());
switch (ap.id_.eid_) { switch (ap.id_.eid_) {
case AdemcoId::id_ack: case AdemcoMsgId::id_ack:
// success // success
break; break;
case AdemcoId::id_null: // reply ack case AdemcoMsgId::id_null: // reply ack
{ {
char ack[1024]; char ack[1024];
auto len = ap.make_ack(ack, sizeof(ack), ap.seq_.value_, ap.acct_.acct(), ap.ademcoData_.ademco_id_); auto len = ap.make_ack(ack, sizeof(ack), ap.seq_.value_, ap.acct_.acct(), ap.ademcoData_.ademco_id_);
...@@ -164,8 +164,8 @@ int main(int argc, char** argv) ...@@ -164,8 +164,8 @@ int main(int argc, char** argv)
break; break;
} }
case AdemcoId::id_hb: // event report case AdemcoMsgId::id_hb: // event report
case AdemcoId::id_admcid: case AdemcoMsgId::id_admcid:
{ {
clientAcct = ap.acct_.acct(); clientAcct = ap.acct_.acct();
clientAdemcoId = ap.ademcoData_.ademco_id_; clientAdemcoId = ap.ademcoData_.ademco_id_;
......
...@@ -104,6 +104,8 @@ enum ADEMCO_EVENT : uint32_t { ...@@ -104,6 +104,8 @@ enum ADEMCO_EVENT : uint32_t {
EVENT_WHAT_IS_YOUR_TYPE = 1798, // 索要主机类型 EVENT_WHAT_IS_YOUR_TYPE = 1798, // 索要主机类型
EVENT_SIGNAL_STRENGTH_CHANGED = 1799, // 主机信号强度变化 EVENT_SIGNAL_STRENGTH_CHANGED = 1799, // 主机信号强度变化
AdemcoEventSentinel = 10000,
// -------------------接警中心内部使用事件------------------------------ // -------------------接警中心内部使用事件------------------------------
EVENT_PRIVATE_EVENT_BASE = 0x00010000, EVENT_PRIVATE_EVENT_BASE = 0x00010000,
EVENT_CLEARMSG, // 清除报警信息 EVENT_CLEARMSG, // 清除报警信息
......
This diff is collapsed.
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#include <string> #include <string>
#include <type_traits> #include <type_traits>
#include <iterator> #include <iterator>
#include "ademco_detail.h" #include "ademco_packet.h"
namespace hb namespace hb
{ {
...@@ -145,10 +145,6 @@ static constexpr MachineType AllMachineTypes[MachineTypeCount] = { ...@@ -145,10 +145,6 @@ static constexpr MachineType AllMachineTypes[MachineTypeCount] = {
IoT, IoT,
}; };
//! 防区号为0时表示主机自身
static constexpr uint16_t Zone4MachineSelf = 0;
//! 主机防区号范围
static constexpr uint16_t ZoneMin = 1;
//! 最大防区号根据型号不同而不同 //! 最大防区号根据型号不同而不同
static uint16_t zoneMax(MachineType type) { static uint16_t zoneMax(MachineType type) {
switch (type) { switch (type) {
...@@ -177,27 +173,15 @@ static uint16_t zoneMax(MachineType type) { ...@@ -177,27 +173,15 @@ static uint16_t zoneMax(MachineType type) {
break; break;
} }
} }
//! 对任何主机类型,最大的防区数量
static constexpr uint16_t MaxZoneCount = 1000;
//! 对任何主机类型,防区号是否合法(可以包含0防区)
static bool isValidZone(uint16_t zone) {
return Zone4MachineSelf <= zone && zone < MaxZoneCount;
}
//! 对任何主机类型,防区号是否合法(不可以包含0防区)
static bool isValidZoneStrict(uint16_t zone) {
return ZoneMin <= zone && zone < MaxZoneCount;
}
//! 防区号是否合法(可以包含0防区) //! 防区号是否合法(可以包含0防区)
static bool isValidZone(MachineType type, uint16_t zone) { static bool isValidZone(MachineType type, uint16_t zone) {
return Zone4MachineSelf <= zone && zone <= zoneMax(type); return ademco::Zone4MachineSelf <= zone && zone <= zoneMax(type);
} }
//! 防区号是否合法(不可以可以包含0防区) //! 防区号是否合法(不可以可以包含0防区)
static bool isValidZoneStrict(MachineType type, uint16_t zone) { static bool isValidZoneStrict(MachineType type, uint16_t zone) {
return ZoneMin <= zone && zone <= zoneMax(type); return ademco::ZoneMin <= zone && zone <= zoneMax(type);
} }
//! 主机是否具有半布防功能 //! 主机是否具有半布防功能
...@@ -1776,20 +1760,15 @@ struct WirelessAddress { ...@@ -1776,20 +1760,15 @@ struct WirelessAddress {
}; };
//! 防区号为0时表示主机(或分主机)自身
static constexpr uint16_t Zone4MachineSelf = 0;
//! 主机防区号范围1~999
static constexpr uint16_t ZoneMin = 1;
static constexpr uint16_t ZoneMax = 999;
//! 主机有线防区范围1~7 //! 主机有线防区范围1~7
static constexpr uint16_t ZoneMinWired = ZoneMin; constexpr ademco::AdemcoZone ZoneMinWired = 1;
static constexpr uint16_t ZoneMaxWired = 8; constexpr ademco::AdemcoZone ZoneMaxWired = 8;
//! 主机无线防区最小值 //! 主机无线防区最小值
static constexpr uint16_t ZoneMinWireless = ZoneMaxWired + 1; constexpr ademco::AdemcoZone ZoneMinWireless = 9;
static constexpr uint16_t ZoneMaxWireless = ZoneMax; constexpr ademco::AdemcoZone ZoneMaxWireless = 999;
//! 分主机防区号范围1~99 //! 分主机防区号范围1~99
static constexpr uint16_t ZoneMinSubMachine = 1; constexpr ademco::AdemcoZone ZoneMinSubMachine = 1;
static constexpr uint16_t ZoneMaxSubMachine = 99; constexpr ademco::AdemcoZone ZoneMaxSubMachine = 99;
//! 以2个字节表示的防区号 //! 以2个字节表示的防区号
...@@ -1841,9 +1820,9 @@ struct ZoneInfo { ...@@ -1841,9 +1820,9 @@ struct ZoneInfo {
//! 所有防区信息 //! 所有防区信息
struct AllZoneInfo { struct AllZoneInfo {
//! use extra 1 space, for convenience to use zone as index //! use extra 1 space, for convenience to use zone as index
ZoneInfo zones[ZoneMax + 1] = {}; ZoneInfo zones[ademco::ZoneSentinel] = {};
AllZoneInfo() { for (uint16_t i = 0; i <= ZoneMax; i++) { zones[i].zone = i; } } AllZoneInfo() { for (uint16_t i = 0; i < ademco::ZoneSentinel; i++) { zones[i].zone = i; } }
bool isUniqueAddr(WirelessAddress addr) const { bool isUniqueAddr(WirelessAddress addr) const {
for (const auto& z : zones) { if (z.addr == addr)return false; } for (const auto& z : zones) { if (z.addr == addr)return false; }
...@@ -1906,7 +1885,7 @@ struct Query { ...@@ -1906,7 +1885,7 @@ struct Query {
void setZone(ZoneAsTwoChar zone) { data[3] = zone.hi; data[4] = zone.lo; } void setZone(ZoneAsTwoChar zone) { data[3] = zone.hi; data[4] = zone.lo; }
static Query queryMachineStatus() { static Query queryMachineStatus() {
return queryZoneStatus(Zone4MachineSelf); return queryZoneStatus(ademco::Zone4MachineSelf);
} }
static Query queryZoneStatus(uint16_t zone) { static Query queryZoneStatus(uint16_t zone) {
...@@ -1918,7 +1897,7 @@ struct Query { ...@@ -1918,7 +1897,7 @@ struct Query {
} }
static Query querySubMachineStatus() { static Query querySubMachineStatus() {
return queryZoneStatusOfSubMachine(Zone4MachineSelf); return queryZoneStatusOfSubMachine(ademco::Zone4MachineSelf);
} }
static Query queryZoneStatusOfSubMachine(Char zone) { static Query queryZoneStatusOfSubMachine(Char zone) {
......
...@@ -5,13 +5,6 @@ ...@@ -5,13 +5,6 @@
namespace hb namespace hb
{ {
//! 安定宝ID范围
static constexpr size_t MinAdemcoId = 1;
static constexpr size_t MaxAdemcoId = 999999; // 兼容性考虑,最大安定宝 ID 为 0x0F423F
static constexpr size_t AdemcoIdSentinel = MaxAdemcoId + 1;
static constexpr bool isValidAdemcoId(size_t ademcoId) { return MinAdemcoId <= ademcoId && ademcoId <= MaxAdemcoId; }
/******** 结合 hb 与 ademco ******/ /******** 结合 hb 与 ademco ******/
//! 从事件码推出主机类型 //! 从事件码推出主机类型
...@@ -23,6 +16,7 @@ static common::MachineType machineTypeFromAdemcoEvent(ademco::ADEMCO_EVENT e) { ...@@ -23,6 +16,7 @@ static common::MachineType machineTypeFromAdemcoEvent(ademco::ADEMCO_EVENT e) {
case ademco::EVENT_I_AM_WIRE_MACHINE: return common::MachineType::Wired; case ademco::EVENT_I_AM_WIRE_MACHINE: return common::MachineType::Wired;
case ademco::EVENT_I_AM_WIFI_MACHINE: return common::MachineType::WiFi; case ademco::EVENT_I_AM_WIFI_MACHINE: return common::MachineType::WiFi;
case ademco::EVENT_I_AM_3_SECTION_MACHINE: return common::MachineType::ThreeSection; case ademco::EVENT_I_AM_3_SECTION_MACHINE: return common::MachineType::ThreeSection;
case ademco::EVENT_I_AM_IOT_MACHINE: return common::MachineType::IoT;
default: return common::MachineType::InvalidMachineType; default: return common::MachineType::InvalidMachineType;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment