Commit bd0995ff authored by captainwong's avatar captainwong

release 1.2.0

parent b1221fd5
# Ademco Change Log
## 1.2.0
- add config
- add `offset` for parse error
- refactor parser
## 1.1.0
- ADEMCO_PACKET_ACCT_MAX_LEN changed from 64 to 18
......
......@@ -226,7 +226,7 @@ const char* ademcoEventToString(AdemcoEvent ademcoEvent) {
}
}
#ifdef ADEMCO_ENABLE_CHINESE
#if ADEMCO_ENABLE_CHINESE
const char* ademcoEventToStringChinese(AdemcoEvent ademcoEvent) {
switch (ademcoEvent) {
#define XX(name, code, zh) \
......@@ -364,23 +364,25 @@ AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t pac
} else if (packet_len >= ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN &&
packet[0] == '[' &&
packet[packet_len - 1] == ']') { // [#000000|1400 00 000]
do {
const char* p = packet + 2;
size_t acct_len = packet_len - 15;
if (acct_len < 6) {
ADEMCO_FILL_PARSE_ERROR(err, "acct_len < 6");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - packet, "acct_len < 6");
return RESULT_ERROR;
} else if (acct_len > ADEMCO_PACKET_ACCT_MAX_LEN) {
ADEMCO_FILL_PARSE_ERROR(err, p - packet, "acct_len > ADEMCO_PACKET_ACCT_MAX_LEN");
return RESULT_ERROR;
}
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);
temp[acct_len] = '\0';
dataSegment->ademcoId = (AdemcoId)strtoul(temp, NULL, 16);
p += acct_len;
if (*p++ != '|') {
ADEMCO_FILL_PARSE_ERROR(err, "*p++ != '|'");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - packet, "*p++ != '|'");
return RESULT_ERROR;
}
strncpy(temp, (const char*)p, 4);
temp[4] = '\0';
......@@ -388,8 +390,8 @@ AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t pac
p += 4;
if (*p++ != ' ') {
ADEMCO_FILL_PARSE_ERROR(err, "*p++ != ' '");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - packet, "*p++ != ' '");
return RESULT_ERROR;
}
if (*p == 'E' && *(p + 1) == 'E') {
dataSegment->gg = 0xEE;
......@@ -401,22 +403,21 @@ AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t pac
p += 2;
if (*p++ != ' ') {
ADEMCO_FILL_PARSE_ERROR(err, "*p++ != ' '");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - packet, "*p++ != ' '");
return RESULT_ERROR;
}
strncpy(temp, (const char*)p, 3);
temp[3] = '\0';
dataSegment->zone = atoi(temp);
dataSegment->zone = (AdemcoZone)atoi(temp);
if (dataSegment->raw != packet) {
memcpy(dataSegment->raw, packet, packet_len);
}
dataSegment->raw_len = packet_len;
return RESULT_OK;
} while (0);
}
ADEMCO_FILL_PARSE_ERROR(err, "dig in source code for more info");
ADEMCO_FILL_PARSE_ERROR(err, 0, "dig in source code for more info");
return RESULT_ERROR;
}
......@@ -984,89 +985,107 @@ size_t ademcoMakeAdmPacket2(AdemcoPacket* pkt, uint16_t seq,
AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
AdemcoPacket* pkt, size_t* cb_commited,
AdemcoParseError* err) {
const char *p, *q, *pid, *pend, *pacct, *pdata;
uint16_t crc;
size_t len_needed;
if (len < 9) {
return RESULT_NOT_ENOUGH;
}
do {
const char* p = buff;
p = buff;
if (*p++ != ADEMCO_PACKET_PREFIX) {
ADEMCO_FILL_PARSE_ERROR(err, "*p++ != ADEMCO_PACKET_PREFIX");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "fixed prefix not found");
return RESULT_ERROR;
}
char temp[5];
// crc
memcpy(temp, p, 4);
temp[4] = '\0';
uint16_t crc = strtoul(temp, NULL, 16) & 0xFFFF;
p += 4;
crc = 0;
for (const char* q = p; p - q < 4; p++) {
uint8_t h = char2hex(*p);
if (h == 0xFF) {
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "crc contains non-hex characters");
return RESULT_ERROR;
}
crc = (crc << 4) | h;
}
// len
memcpy(temp, p, 4);
temp[4] = '\0';
pkt->len = strtoul(temp, NULL, 16);
p += 4;
size_t len_needed = 9 + pkt->len + 1;
if (len < len_needed)
pkt->len = 0;
for (const char* q = p; p - q < 4; p++) {
uint8_t h = char2hex(*p);
if (h == 0xFF) {
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "len contains non-hex characters");
return RESULT_ERROR;
}
pkt->len = (pkt->len << 4) | h;
}
len_needed = 9 + pkt->len + 1;
if (len < len_needed) {
return RESULT_NOT_ENOUGH;
if (len_needed >= ADEMCO_PACKET_MAX_LEN) {
} else if (len_needed >= ADEMCO_PACKET_MAX_LEN) {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "len_needed >= ADEMCO_PACKET_MAX_LEN");
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "len_needed >= ADEMCO_PACKET_MAX_LEN");
return RESULT_ERROR;
}
const char* pid = p;
const char* pcr = pid + pkt->len;
pid = p;
pend = pid + pkt->len;
if (pcr > buff + len || *pcr != ADEMCO_PACKET_SUFIX) {
if (pend > buff + len) {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "pcr > buff + len || *pcr != ADEMCO_PACKET_SUFIX");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "suffix out of range");
return RESULT_ERROR;
}
if (*pend != ADEMCO_PACKET_SUFIX) {
dline;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "suffix not found");
return RESULT_ERROR;
}
pkt->crc = ademcoCRC16(pid, pkt->len);
if (pkt->crc != crc) {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "pkt->crc != crc");
break;
ADEMCO_FILL_PARSE_ERROR(err, 1, "crc error");
return RESULT_ERROR;
}
// id
if (*pid != '\"') {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "*pid != '\"'");
break;
ADEMCO_FILL_PARSE_ERROR(err, pid - buff, "left \" of id not found");
return RESULT_ERROR;
}
p = pid + 1;
while (p < pcr && *p != '\"') {
while (p < pend && *p != '\"') {
p++;
}
if (p >= pcr || *p != '\"') {
if (p >= pend || *p != '\"') {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "p >= pcr || *p != '\"'");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "right \" of id not found");
return RESULT_ERROR;
}
pkt->id = getAdemcoPacketId((const char*)pid, ++p - pid);
if (pkt->id == AID_INVALID) {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "pkt->id == AID_INVALID");
break;
ADEMCO_FILL_PARSE_ERROR(err, pid - buff, "unknown ademco id");
return RESULT_ERROR;
}
// seq
const char* pseq = p;
while (p < pcr && *p != 'R' && *p != 'L') {
p++;
}
if (p - pseq != 4 || (*p != 'R' && *p != 'L')) {
pkt->seq = 0;
for (q = p; p - q < 4; p++) {
if ('0' <= *p && *p <= '9') {
pkt->seq = (pkt->seq * 10) + (*p - '0');
} else {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "p - pseq != 4 || (*p != 'R' && *p != 'L')");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "seq contains non-digit characters");
// some apps use FFFF, wtf
// return RESULT_ERROR;
}
}
memcpy(temp, pseq, 4);
temp[4] = '\0';
pkt->seq = strtoul(temp, NULL, 10) & 0xFFFF;
if (pkt->seq >= 10000) {
pkt->seq = 0;
}
......@@ -1074,100 +1093,102 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
// *rrcvr
if (*p == 'R') { // rrcvr exists
// const char* prcvr = p;
while (p < pcr && *p != 'L' && *p != '#') {
while (p < pend && *p != 'L' && *p != '#') {
p++;
}
if (p >= pcr || (*p != 'L' && *p != '#')) {
if (p >= pend || (*p != 'L' && *p != '#')) {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "p >= pcr || (*p != 'L' && *p != '#')");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "p >= pend || (*p != 'L' && *p != '#')");
return RESULT_ERROR;
}
// only check if format is correct, ignore it's content
} else if (*p == 'L') { // rrcvr not exits
// pass
} else {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "both LPREF and RRCVR not found");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "both LPREF and RRCVR not found");
return RESULT_ERROR;
}
// lpref
if (*p != 'L') {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "LPREF not found");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "LPREF not found");
return RESULT_ERROR;
}
while (p < pcr && *p != '#') {
while (p < pend && *p != '#') {
p++;
}
// only check if format is correct, ignore it's content
if (p >= pcr || *p != '#') {
if (p >= pend || *p != '#') {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "# not found");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "# not found");
return RESULT_ERROR;
}
// lpref passed
// #acct
const char* pacct = ++p;
while (p < pcr && *p != '[') {
pacct = ++p;
while (p - pacct < ADEMCO_PACKET_ACCT_MAX_LEN && *p != '[') {
if (!isxdigit(*p)) {
p = NULL;
dline;
ADEMCO_FILL_PARSE_ERROR(err, "acct contains non-hex characters");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "acct contains non-hex characters");
return RESULT_ERROR;
}
p++;
}
if (p == NULL ||
p >= pcr ||
*p != '[' ||
p - pacct >= ADEMCO_PACKET_ACCT_MAX_LEN) {
if (*p != '[') {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "data's [ not found");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "acct too long");
return RESULT_ERROR;
}
strncpy(pkt->acct, (const char*)pacct, p - pacct);
pkt->acct[p - pacct] = '\0';
// data
const char* pdata = p;
while (p < pcr && *p != ']') {
pdata = p;
if (*p != '[') {
dline;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "data's [ not found");
return RESULT_ERROR;
}
while (p < pend && *p != ']') {
p++;
}
if (p >= pcr || *p != ']') {
if (p >= pend || *p != ']') {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "data's ] not found");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "data's ] not found");
return RESULT_ERROR;
}
if (ademcoParseDataSegment(pdata, ++p - pdata, &pkt->data, err) != RESULT_OK) {
dline;
break;
return RESULT_ERROR;
}
// *xdata
if (*p == '[') { // xdata exists
const char* pxdata = p++;
AdemcoXDataLengthFormat xlf = FOUR_DECIMAL;
size_t valid_len;
size_t valid_len = 0;
for (int i = 0; i < 4; i++)
if (!isxdigit(*(uint8_t*)(p + i)))
xlf = TWO_HEX;
if (xlf == FOUR_DECIMAL) {
memcpy(temp, pxdata + 1, 4);
temp[4] = '\0';
valid_len = strtoul(temp, NULL, 16);
valid_len = (char2hex(*(pxdata + 1)) << 12) |
(char2hex(*(pxdata + 2)) << 8) |
(char2hex(*(pxdata + 3)) << 4) |
(char2hex(*(pxdata + 4)));
p += 4 + valid_len;
} else {
valid_len = (pxdata[1] << 8) | pxdata[2];
p += 2 + valid_len;
}
if (p >= pcr || *p != ']' || *(p + 1) != '_') {
if (p >= pend || *p != ']' || *(p + 1) != '_') {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "xdata's ] not found or next char is not _");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "xdata's ] not found or next char is not _");
return RESULT_ERROR;
}
pkt->xdata.lenghFormat = xlf;
pkt->xdata.raw_len = ++p - pxdata;
......@@ -1176,43 +1197,72 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
pkt->xdata.raw_len = 0;
}
// timestamp
if (pcr - p != ADEMCO_PACKET_TIMESTAMP_LEN) {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "timestamp length not correct");
// timestamp, _%02d:%02d:%02d,%02d-%02d-%04d
// only check lengh, if format is incorrect, use local time instead
if (pend - p == ADEMCO_PACKET_TIMESTAMP_LEN) {
struct tm tm;
do {
if (*p++ != '_') {
break;
}
{
struct tm tm;
int ret = sscanf((const char*)p, "_%02d:%02d:%02d,%02d-%02d-%04d",
&tm.tm_hour, &tm.tm_min, &tm.tm_sec,
&tm.tm_mon, &tm.tm_mday, &tm.tm_year);
if (ret != 6) {
// wont break
tm.tm_hour = char2hex(*p++);
tm.tm_hour = tm.tm_hour * 10 + char2hex(*p++);
if (*p++ != ':') {
break;
}
tm.tm_min = char2hex(*p++);
tm.tm_min = tm.tm_min * 10 + char2hex(*p++);
if (*p++ != ':') {
break;
}
tm.tm_sec = char2hex(*p++);
tm.tm_sec = tm.tm_sec * 10 + char2hex(*p++);
if (*p++ != ',') {
break;
}
tm.tm_mon = char2hex(*p++);
tm.tm_mon = tm.tm_mon * 10 + char2hex(*p++);
if (*p++ != '-') {
break;
}
tm.tm_mday = char2hex(*p++);
tm.tm_mday = tm.tm_mday * 10 + char2hex(*p++);
if (*p++ != '-') {
break;
}
tm.tm_year = char2hex(*p++);
tm.tm_year = tm.tm_year * 10 + char2hex(*p++);
tm.tm_year = tm.tm_year * 10 + char2hex(*p++);
tm.tm_year = tm.tm_year * 10 + char2hex(*p++);
} while (0);
tm.tm_year -= 1900;
tm.tm_mon--;
tm.tm_isdst = -1;
pkt->timestamp = mktime(&tm);
if (pkt->timestamp < 0) { // use local time instead
if (pkt->timestamp <= 0) { // use local time instead
pkt->timestamp = time(NULL);
}
p += ADEMCO_PACKET_TIMESTAMP_LEN;
} else {
dline;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "timestamp length not correct");
return RESULT_ERROR;
}
if (p++ != pcr) {
if (p++ != pend) {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "packet length not correct");
break;
ADEMCO_FILL_PARSE_ERROR(err, p - buff, "packet length not correct");
return RESULT_ERROR;
}
pkt->raw_len = *cb_commited = p - buff;
if (pkt->raw != buff)
memcpy(pkt->raw, buff, pkt->raw_len);
return RESULT_OK;
} while (0);
return RESULT_ERROR;
}
size_t ademcoHiLoArrayToDecStr(ademco_char_t* str, const uint8_t* arr, size_t len) {
......
......@@ -3,37 +3,16 @@
#pragma once
#ifdef ADEMCO_EXPORTS
#if defined __GNUC__
#define ADEMCO_EXPORT_SYMBOL __attribute__((visibility("default")))
#elif defined(_MSC_VER)
#define ADEMCO_EXPORT_SYMBOL __declspec(dllexport)
#else
#define ADEMCO_EXPORT_SYMBOL
#endif
#else // ADEMCO_EXPORTS
#define ADEMCO_EXPORT_SYMBOL
#endif
#include <stdint.h>
#include <time.h>
#include "ademco_config.h"
#include "ademco_version.h"
#ifdef __cplusplus
extern "C" {
#endif
#if defined(SWIGJAVA) || defined(SWIGCSHARP)
#define ademco_char_t uint8_t
#else
#define ademco_char_t char
#endif
#define ADEMCO_OK 0
#define ADEMCO_ERR -1
......@@ -52,7 +31,7 @@ typedef uint32_t AdemcoId;
typedef uint32_t AdemcoGG;
typedef uint32_t AdemcoZone;
//! 安定宝ID范围
// 安定宝ID范围
#define ADEMCO_ID_INVALID 0
#define ADEMCO_ID_MIN 1
#define ADEMCO_ID_MAX 999999 // 兼容性考虑,最大安定宝 ID 为 0x0F423F
......@@ -61,20 +40,20 @@ static inline int ademcoIsValidAdemcoId(AdemcoId ademcoId) {
return ADEMCO_ID_MIN <= ademcoId && ademcoId <= ADEMCO_ID_MAX;
}
//! 防区号为0时表示主机自身
// 防区号为0时表示主机自身
#define ADEMCO_ZONE_FOR_MACHINE_SELF 0
//! 主机防区号范围
// 主机防区号范围
#define ADEMCO_ZONE_MIN 1
//! 对任何主机类型,最大的防区号
// 对任何主机类型,最大的防区号
#define ADEMCO_ZONE_MAX 999
#define ADEMCO_ZONE_SENTINEL (ADEMCO_ZONE_MAX + 1)
//! 对任何主机类型,防区号是否合法(可以包含0防区)
// 对任何主机类型,防区号是否合法(可以包含0防区)
static inline int ademcoIsValidZone(AdemcoZone zone) {
return ADEMCO_ZONE_FOR_MACHINE_SELF <= zone && zone <= ADEMCO_ZONE_MAX;
}
//! 对任何主机类型,防区号是否合法(不可以包含0防区)
// 对任何主机类型,防区号是否合法(不可以包含0防区)
static inline int ademcoIsValidZoneStrict(AdemcoZone zone) {
return ADEMCO_ZONE_MIN <= zone && zone <= ADEMCO_ZONE_MAX;
}
......@@ -83,7 +62,7 @@ static inline int ademcoIsValidZoneStrict(AdemcoZone zone) {
#define ADEMCO_GG_MAX 99
#define ADEMCO_GG_SENTINEL 100
//! 信号强度范围 [0, 31]
// 信号强度范围 [0, 31]
#define ADEMCO_SIGNAL_STRENGTH_MIN 0
#define ADEMCO_SIGNAL_STRENGTH_MAX 31
......@@ -165,11 +144,11 @@ static inline int ademcoIsValidZoneStrict(AdemcoZone zone) {
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(SIM_IS_IOT_CARD, 1756, "物联卡") \
XX(SIM_IS_IOT_PLATFORM_CARD, 2756, "平台物联卡") \
XX(SIM_IS_NOT_IOT_CARD, 3756, "非物联卡") \
XX(WHAT_IS_YOUR_TYPE, 1798, "索要主机类型") \
XX(SIGNAL_STRENGTH_CHANGED, 1799, "主机信号强度变化,强度值编码后以 xdata 传输") \
XX(SIGNAL_STRENGTH_CHANGED, 1799, "信号强度") \
XX(OFFLINE, 1944, "主机断线") \
XX(ONLINE, 1946, "主机上线")
......@@ -180,9 +159,13 @@ typedef enum AdemcoEvent {
#define XX(name, code, zh) EVENT_##name = code,
// ----标准安定宝协议事件----
// 主机状态
ADEMCO_STATUS_EVENTS_MAP(XX)
// 防区报警
ADEMCO_ALARM_EVENTS_MAP(XX)
// 防区异常
ADEMCO_EXEPTION_EVENTS_MAP(XX)
// 防区异常恢复
ADEMCO_RESUME_EVENTS_MAP(XX)
// ---私有事件---------
......@@ -204,25 +187,18 @@ typedef enum AdemcoEventLevel {
// 安定宝协议解析结果
typedef enum AdemcoParseResult {
RESULT_OK, //! 解析到正确、完整的一包
RESULT_NOT_ENOUGH, //! 解析到正确、不完整的一包,需要缓存数据,下次继续处理
RESULT_ERROR, //! 解析到错误的数据,应当丢弃该数据包
RESULT_OK, // 解析到正确、完整的一包
RESULT_NOT_ENOUGH, // 解析到正确、不完整的一包,需要缓存数据,下次继续处理
RESULT_ERROR, // 解析到错误的数据,应当丢弃该数据包
} AdemcoParseResult;
// 安定宝协议解析错误信息
typedef struct AdemcoParseError {
int line;
int line; // line number in ademco.c
size_t offset; // error offset
const char* msg; // user do not free
} AdemcoParseError;
#define ADEMCO_FILL_PARSE_ERROR(err, msg_) \
do { \
if (err) { \
err->line = __LINE__; \
err->msg = (msg_); \
} \
} while (0);
// 安定宝协议data段
typedef struct AdemcoDataSegment {
ademco_char_t raw[ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN_MAX];
......@@ -282,6 +258,7 @@ typedef struct AdemcoPacket {
size_t len;
AdemcoPacketId id;
uint16_t seq;
// +1 for '\0'
char acct[ADEMCO_PACKET_ACCT_MAX_LEN + 1];
AdemcoDataSegment data;
AdemcoXDataSegment xdata;
......@@ -293,59 +270,76 @@ typedef struct AdemcoPacket {
//////////////////////// Functions ////////////////////////
ADEMCO_EXPORT_SYMBOL unsigned int ademcoVersion(void);
ADEMCO_EXPORT_SYMBOL const char* ademcoVersionString(void);
//! print as HEX
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 ademcoDecodeSignalStrength(uint8_t code);
ADEMCO_EXPORT_SYMBOL
unsigned int ademcoVersion(void);
ADEMCO_EXPORT_SYMBOL
const char* ademcoVersionString(void);
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 ademcoDecodeSignalStrength(uint8_t code);
//////////////////////// AdemcoEvent functions ////////////////////////
//! 是否合法主机账号
// 是否合法主机账号
ADEMCO_EXPORT_SYMBOL
int ademcoIsValidAccount(const char* acct);
//! 是否主机状态事件
// 是否主机状态事件
ADEMCO_EXPORT_SYMBOL
int ademcoIsMachineStatusEvent(AdemcoEvent ademcoEvent);
//! 是否主机类型事件
// 是否主机类型事件
ADEMCO_EXPORT_SYMBOL
int ademcoIsMachineTypeEvent(AdemcoEvent ademcoEvent);
//! 事件是否需要控制源
// 事件是否需要控制源
ADEMCO_EXPORT_SYMBOL
int ademcoIsEventNeedControlSource(AdemcoEvent ademcoEvent);
//! 获取安定宝事件级别
// 获取安定宝事件级别
ADEMCO_EXPORT_SYMBOL
AdemcoEventLevel ademcoGetEventLevel(AdemcoEvent ademcoEvent);
//! 获取异常恢复事件所对应的异常事件
// 获取异常恢复事件所对应的异常事件
ADEMCO_EXPORT_SYMBOL
AdemcoEvent ademcoGetExceptionEventByResumeEvent(AdemcoEvent resumeEvent);
ADEMCO_EXPORT_SYMBOL
const char* ademcoEventToString(AdemcoEvent ademcoEvent);
#ifdef ADEMCO_ENABLE_CHINESE
#if ADEMCO_ENABLE_CHINESE
ADEMCO_EXPORT_SYMBOL
const char* ademcoEventToStringChinese(AdemcoEvent ademcoEvent);
#endif
//////////////////////// AdemcoDataSegment functions ////////////////////////
//! make a `DATA` packet and store to `packet`, return length
ADEMCO_EXPORT_SYMBOL size_t ademcoAppendDataSegment(ademco_char_t* packet,
// make a `DATA` packet and store to `packet`, return length
ADEMCO_EXPORT_SYMBOL
size_t ademcoAppendDataSegment(ademco_char_t* packet,
const char* acct,
AdemcoId ademcoId,
AdemcoEvent ademcoEvent,
AdemcoGG gg,
AdemcoZone zone);
//! make a `DATA` packet and store to `dataSegment`, return length
ADEMCO_EXPORT_SYMBOL size_t ademcoAppendDataSegment2(AdemcoDataSegment* dataSegment,
// make a `DATA` packet and store to `dataSegment`, return length
ADEMCO_EXPORT_SYMBOL
size_t ademcoAppendDataSegment2(AdemcoDataSegment* dataSegment,
const char* acct,
AdemcoId ademcoId,
AdemcoEvent ademcoEvent,
AdemcoGG gg,
AdemcoZone zone);
//! parse `DATA` packet, if ok, `dataSegment`'s members will be useful
//! err can be NULL; caller should only check err on got RESULT_ERROR
// parse `DATA` packet, if ok, `dataSegment`'s members will be useful
// err can be NULL; caller should only check err on got RESULT_ERROR
ADEMCO_EXPORT_SYMBOL
AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet,
size_t packet_len,
......@@ -361,11 +355,12 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100,
//////////////////////// AdemcoXDataSegment functions ////////////////////////
// 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
ADEMCO_EXPORT_SYMBOL int ademcoXDataConvert(AdemcoXDataSegment* xdata,
AdemcoXDataLengthFormat xlf);
ADEMCO_EXPORT_SYMBOL
int ademcoXDataConvert(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf);
#ifndef SWIG
// get valid content address of xdata (except [len])
......@@ -378,16 +373,19 @@ 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)
ADEMCO_EXPORT_SYMBOL int ademcoXDataMemcmp(const AdemcoXDataSegment* xdata,
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
ADEMCO_EXPORT_SYMBOL size_t ademcoXDataCopy(AdemcoXDataSegment* dst,
ADEMCO_EXPORT_SYMBOL
size_t ademcoXDataCopy(AdemcoXDataSegment* dst,
const AdemcoXDataSegment* src);
// return ADEMCO_OK for success, return ADEMCO_ERR for len is too long
ADEMCO_EXPORT_SYMBOL int ademcoMakeXData(AdemcoXDataSegment* xdata,
ADEMCO_EXPORT_SYMBOL
int ademcoMakeXData(AdemcoXDataSegment* xdata,
AdemcoXDataLengthFormat xlf,
AdemcoXDataTransform xtr,
const ademco_char_t* content,
......@@ -395,14 +393,17 @@ ADEMCO_EXPORT_SYMBOL int ademcoMakeXData(AdemcoXDataSegment* xdata,
//////////////////////// AdemcoPacketId functions ////////////////////////
ADEMCO_EXPORT_SYMBOL int isAdemcoPacketId(const char* standard,
ADEMCO_EXPORT_SYMBOL
int isAdemcoPacketId(const char* standard,
const char* id,
size_t len);
ADEMCO_EXPORT_SYMBOL AdemcoPacketId getAdemcoPacketId(const char* id,
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);
/*
* ademcoMake*Packet functions
......@@ -410,45 +411,52 @@ ADEMCO_EXPORT_SYMBOL const char* ademcoPacketIdToString(AdemcoPacketId id);
* otherwise return 0
*/
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeEmptyDataPacket(ademco_char_t* dst_buff,
ADEMCO_EXPORT_SYMBOL
size_t ademcoMakeEmptyDataPacket(ademco_char_t* dst_buff,
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,
ADEMCO_EXPORT_SYMBOL
size_t ademcoMakeAdmEmptyDataPacket(ademco_char_t* dst_buff,
size_t len,
const char* id,
uint16_t seq,
const char* acct,
AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeNullPacket(ademco_char_t* buff,
ADEMCO_EXPORT_SYMBOL
size_t ademcoMakeNullPacket(ademco_char_t* buff,
size_t len,
uint16_t seq,
const char* acct,
AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeAdmNullPacket(ademco_char_t* buff,
ADEMCO_EXPORT_SYMBOL
size_t ademcoMakeAdmNullPacket(ademco_char_t* buff,
size_t len,
uint16_t seq,
const char* acct,
AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeAckPacket(ademco_char_t* buff,
ADEMCO_EXPORT_SYMBOL
size_t ademcoMakeAckPacket(ademco_char_t* buff,
size_t len,
uint16_t seq,
const char* acct,
AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeNakPacket(ademco_char_t* buff,
ADEMCO_EXPORT_SYMBOL
size_t ademcoMakeNakPacket(ademco_char_t* buff,
size_t len,
uint16_t seq,
const char* acct,
AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeHbPacket(ademco_char_t* buff,
ADEMCO_EXPORT_SYMBOL
size_t ademcoMakeHbPacket(ademco_char_t* buff,
size_t len,
uint16_t seq,
const char* acct,
......@@ -458,7 +466,8 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoMakeHbPacket(ademco_char_t* buff,
AdemcoZone zone,
const AdemcoXDataSegment* xdata);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeAdmPacket(ademco_char_t* buff,
ADEMCO_EXPORT_SYMBOL
size_t ademcoMakeAdmPacket(ademco_char_t* buff,
size_t len,
uint16_t seq,
const char* acct,
......@@ -469,22 +478,26 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoMakeAdmPacket(ademco_char_t* buff,
const AdemcoXDataSegment* xdata);
// 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);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeAckPacket2(AdemcoPacket* pkt,
ADEMCO_EXPORT_SYMBOL
size_t ademcoMakeAckPacket2(AdemcoPacket* pkt,
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);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeHbPacket2(AdemcoPacket* pkt,
ADEMCO_EXPORT_SYMBOL
size_t ademcoMakeHbPacket2(AdemcoPacket* pkt,
uint16_t seq,
const char* acct,
AdemcoId ademcoId,
......@@ -493,7 +506,8 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoMakeHbPacket2(AdemcoPacket* pkt,
AdemcoZone zone,
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,
......@@ -502,9 +516,10 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoMakeAdmPacket2(AdemcoPacket* pkt,
AdemcoZone zone,
const AdemcoXDataSegment* xdata);
//! 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
ADEMCO_EXPORT_SYMBOL AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff,
// 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
ADEMCO_EXPORT_SYMBOL
AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff,
size_t len,
AdemcoPacket* pkt,
size_t* cb_commited,
......@@ -521,8 +536,8 @@ ADEMCO_EXPORT_SYMBOL AdemcoParseResult ademcoPacketParse(const ademco_char_t* bu
* Xor constant to output CRC : 0x0000
* 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进制数字符串
// 每个字节的高四位和低四位若不大于9,将该四位表示的数字以10进制ascii码填入str,否则停止
......@@ -530,7 +545,8 @@ ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC16(const ademco_char_t* buff,
// 注意:函数不会在str末尾补 null terminator
// 调用者应确保str有足够空间,至少len的2倍,否则会崩溃
// 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101"
ADEMCO_EXPORT_SYMBOL size_t ademcoHiLoArrayToDecStr(ademco_char_t* str,
ADEMCO_EXPORT_SYMBOL
size_t ademcoHiLoArrayToDecStr(ademco_char_t* str,
const uint8_t* arr,
size_t len);
......@@ -542,7 +558,8 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoHiLoArrayToDecStr(ademco_char_t* str,
// 调用者应确保str有足够空间,至少len的2倍,否则会崩溃
// 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101"
// 示例:输入数组:0x24 0x94 0x94 0x4c 0x48 0x15 0xff,输出字符串"2494944C4815"
ADEMCO_EXPORT_SYMBOL size_t ademcoHiLoArrayToDecStr2(ademco_char_t* str,
ADEMCO_EXPORT_SYMBOL
size_t ademcoHiLoArrayToDecStr2(ademco_char_t* str,
const uint8_t* arr,
size_t len);
......@@ -558,7 +575,8 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoHiLoArrayToDecStr2(ademco_char_t* str,
// 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78
// return 9
// 示例:输入NULL,返回 9个 0xFF
ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray(uint8_t* arr,
ADEMCO_EXPORT_SYMBOL
size_t ademcoDecStrToHiLoArray(uint8_t* arr,
size_t len,
const char* str);
......@@ -574,7 +592,8 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray(uint8_t* arr,
// 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78
// return 9
// 示例:输入NULL,返回 9个 0xFF
ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray2(uint8_t* arr,
ADEMCO_EXPORT_SYMBOL
size_t ademcoDecStrToHiLoArray2(uint8_t* arr,
size_t len,
const char* str);
......@@ -584,7 +603,8 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray2(uint8_t* arr,
// 注意:函数不会在str末尾补 null terminator
// 示例:输入 arr=[0xEB 0xBA 0x3F], len=3, 则str = "EBBA3F",返回6
// 示例:输入 ary="123", len=3, 则str = "313233",返回6
ADEMCO_EXPORT_SYMBOL size_t ademcoHexArrayToStr(char* str,
ADEMCO_EXPORT_SYMBOL
size_t ademcoHexArrayToStr(char* str,
const uint8_t* arr,
size_t len);
......@@ -595,14 +615,16 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoHexArrayToStr(char* str,
// 示例:输入字符串str="EBBA3F", 输出arr = [0xEB, 0xBA, 0x3F],返回 3
// 示例:输入字符串str="ABC", padding = 0, 输出arr=[0xAB, 0xC0],返回2
// 示例:输入字符串str="ABC", padding = 0x0F, 输出arr=[0xAB, 0xCF],返回2
ADEMCO_EXPORT_SYMBOL size_t ademcoHexStrToArray(uint8_t* arr,
ADEMCO_EXPORT_SYMBOL
size_t ademcoHexStrToArray(uint8_t* arr,
const char* str,
uint8_t padding);
// 功能同ademcoHexStrToArray
// 若strlen(str) > len, str[len]及之后的内容将被舍弃以避免溢出
// 示例:输入字符串str="ABCDE", len = 4 padding = 0x0F, 输出arr=[0xAB, 0xCD], return 2
ADEMCO_EXPORT_SYMBOL size_t ademcoHexStrToArrayN(uint8_t* arr,
ADEMCO_EXPORT_SYMBOL
size_t ademcoHexStrToArrayN(uint8_t* arr,
const char* str,
size_t len, uint8_t padding);
......@@ -610,7 +632,8 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoHexStrToArrayN(uint8_t* arr,
// 即'0'~'9','a'~'f','A'~'F'之外的内容,以 padding 替换
// 示例:str="AB\xFFD", len=4, padding=0x0F, 则 arr=[ 0xAB, 0xFD ], return 2
// 网线主机 0d 00 命令,接警中心账号部分,有可能是这种
ADEMCO_EXPORT_SYMBOL size_t ademcoHexStrToArrayN_allow_non_hex_str(uint8_t* arr,
ADEMCO_EXPORT_SYMBOL
size_t ademcoHexStrToArrayN_allow_non_hex_str(uint8_t* arr,
const char* str,
size_t len,
uint8_t padding);
......
#ifndef __ADEMCO_CONFIG_H__
#define __ADEMCO_CONFIG_H__
#pragma once
#ifdef ADEMCO_EXPORTS
#if defined __GNUC__
#define ADEMCO_EXPORT_SYMBOL __attribute__((visibility("default")))
#elif defined(_MSC_VER)
#define ADEMCO_EXPORT_SYMBOL __declspec(dllexport)
#else
#define ADEMCO_EXPORT_SYMBOL
#endif
#else // ADEMCO_EXPORTS
#define ADEMCO_EXPORT_SYMBOL
#endif // ADEMCO_EXPORTS
#if defined(SWIGJAVA) || defined(SWIGCSHARP)
#define ademco_char_t uint8_t
#else
#define ademco_char_t char
#endif
#ifndef ADEMCO_ENABLE_CHINESE
#define ADEMCO_ENABLE_CHINESE 1
#endif
#ifndef ADEMCO_ENABLE_PARSE_ERROR
#define ADEMCO_ENABLE_PARSE_ERROR 1
#endif
#if ADEMCO_ENABLE_PARSE_ERROR
#define ADEMCO_FILL_PARSE_ERROR(err, offset_, msg_) \
do { \
if (err) { \
err->line = __LINE__; \
err->offset = (offset_); \
err->msg = (msg_); \
} \
} while (0);
#else
#define ADEMCO_FILL_PARSE_ERROR(err, offset_, msg_)
#endif // ADEMCO_ENABLE_PARSE_ERROR
#endif
......@@ -7,7 +7,7 @@
*/
#define ADEMCO_VERSION_MAJOR 1
#define ADEMCO_VERSION_MINOR 1
#define ADEMCO_VERSION_MINOR 2
#define ADEMCO_VERSION_PATCH 0
#define ADEMCO_VERSION_IS_RELEASE 1
#define ADEMCO_VERSION_SUFFIX ""
......
......@@ -62,15 +62,14 @@
* `1/3` 前缀,`1` 表示打开,`3` 表示关闭。如 `3400` 表示布防,`1400` 表示撤防。
* `E/R` 前缀,`E` 表示打开,`R` 表示关闭。如 `R400` 表示布防,`E400` 表示撤防。
* 报警时 `1/E` 前缀表示警情触发,`3/R` 表示警情恢复,如 `1387` 表示探测器受到强光干扰,`3387` 表示防区从光扰状态恢复。
### 主机状态
|事件码|含义|en|
|-----|----|--|
|3400|布防|ARM|
|1400|撤防|DISARM|
|1456|半布防|HALFARM|
|3456|半布防|HALFARM|
|1456|半布防|HALFARM_1456|
|1120|紧急报警|EMERGENCY|
### 防区报警
......@@ -83,93 +82,93 @@
|1121|胁迫|DURESS|
|1151|煤气|GAS|
|1113|水警|WATER|
|1137|防拆|TAMPER|
|1137|主机防拆|TAMPER|
|1383|防区防拆|ZONE_TAMPER|
|1570|旁路|BYPASS|
|3570|解除旁路|BYPASS_RESUME|
### 防区异常
|事件码|含义|en|
|-----|----|--|
|1301|主机AC掉电|AC BROKE|
|3301|主机AC恢复|AC RECOVER|
|1301|主机AC掉电|AC_BROKE|
|1302|低电|LOWBATTERY|
|3302|复电|BATATTERY_RECOVER|
|1311|坏电|BADBATTERY|
|3311|坏电恢复|BADBATTERY_RECOVER|
|1387|光扰|SOLARDISTURB|
|3387|光扰恢复|SOLARDISTURB_RECOVER|
|1381|失效|DISCONNECT|
|3381|恢复|RECONNECT|
|1384|防区电源故障|BATTERY_EXCEPTION|
|3384|防区电源故障恢复|BATTERY_EXCEPTION_RECOVER|
|1380|防区其他故障|OTHER_EXCEPTION|
|3380|防区其他故障恢复|OTHER_EXCEPTION_RECOVER|
|1393|失联|LOST|
|3393|恢复|LOST_RECOVER|
|3100|液晶主机清除异常指示|LCD CLEAR EXCEPTION|
|1384|电源故障|BATTERY_EXCEPTION|
|1380|其他故障|OTHER_EXCEPTION|
|3570|解除旁路|BYPASS_RESUME|
|3301|主机AC复电|AC_RECOVER|
|3302|低电恢复|BATTERY_RECOVER|
|3311|坏电恢复|BADBATTERY_RECOVER|
|3387|光扰恢复|SOLARDISTURB_RECOVER|
|3381|失效恢复|RECONNECT|
|3393|失联恢复|LOST_RECOVER|
|3384|电源故障恢复|BATTERY_EXCEPTION_RECOVER|
|3380|其他故障恢复|OTHER_EXCEPTION_RECOVER|
|3100|清除异常指示|CLEAR_EXCPTION|
### *恒博私有事件码*
|事件码|含义|en|
|-----|----|--|
|1485|485断开|485DIS|
|3485|485恢复|485CONN|
|1485|485断开|SERIAL485DIS|
|3485|485连接|SERIAL485CONN|
|1700|链路挂起|CONN_HANGUP|
|3700|链路恢复|CONN_RESUME|
|1701|撤防密码错误|DISARM_PWD_ERR|
|1702|分防区异常|SUB_SENSOR_EXCEPTION|
|3702|分防区恢复|SUB_SENSOR_RESUME|
|1703|分防区电源异常|SUB_POWER_EXCEPTION|
|3703|分防区电源恢复|SUB_POWER_RESUME|
|1702|分机探头异常|SUB_MACHINE_SENSOR_EXCEPTION|
|3702|分机探头恢复|SUB_MACHINE_SENSOR_RESUME|
|1703|分机电源异常|SUB_MACHINE_POWER_EXCEPTION|
|3703|分机电源恢复|SUB_MACHINE_POWER_RESUME|
|1704|串口透传|COM_PASSTHROUGH|
|2704|进入设置状态|ENTER_SET_MODE|
|3704|拒绝/停止设置|EXIT_SET_MODE|
|1705|查询|QUERY|
|3704|退出设置状态|EXIT_SET_MODE|
|1705|查询分机信息|QUERY_SUB_MACHINE|
|1706|写入主机信息|WRITE_TO_MACHINE|
|1707|我是网络模块|I_AM_NET_MODULE|
|1717|我是GPRS主机|I_AM_GPRS_MACHINE|
|1727|我是液晶主机|I_AM_LCD_MACHINE|
|1737|我是网线主机|I_AM_WIRE_MACHINE|
|1747|我是WiFi主机|I_AM_WIFI_MACHINE|
|1757|我是三区段主机|I_AM_3_SECTION_MACHINE|
|1767|我是物联卡主机|I_AM_IOT_MACHINE|
|1777|我是真彩主机|I_AM_TRUE_COLOR|
|1787|我是简化版物联卡主机|I_AM_GPRS_IOT|
|1797|我是GPRS主机能打电话|I_AM_GPRS_PHONE|
|1807|我是NB报警接收主机|I_AM_NB_MACHINE|
|1817|我是WiFi主机新版|I_AM_WIFI2_MACHINE|
|1709|手机用户SOS|SOS|
|1707|主机类型--网络模块|I_AM_NET_MODULE|
|1717|主机类型--GPRS主机|I_AM_GPRS|
|1727|主机类型--液晶主机|I_AM_LCD_MACHINE|
|1737|主机类型--网线主机|I_AM_WIRE_MACHINE|
|1747|主机类型--WiFi主机(停用)|I_AM_WIFI_MACHINE|
|1757|主机类型--三区段主机|I_AM_3_SECTION_MACHINE|
|1767|主机类型--物联卡主机|I_AM_IOT_MACHINE|
|1777|主机类型--真彩主机|I_AM_TRUE_COLOR|
|1787|主机类型--物联卡主机|I_AM_GPRS_IOT|
|1797|主机类型--GRPS主机带电话功能|I_AM_GPRS_PHONE|
|1807|主机类型--NB报警接收主机|I_AM_NB_MACHINE|
|1817|主机类型--WiFi主机(新版)|I_AM_WIFI2_MACHINE|
|1709|手机用户SOS|PHONE_USER_SOS|
|1711|手机用户消警|PHONE_USER_CANCLE_ALARM|
|1712|主机进入设置状态|ENTER_SETTING_MODE|
|3712|主机退出设置状态|EXIT_SETTING_MODE|
|1710|主机恢复出厂设置|RESTORE_FACTORY_SETTINGS|
|1710|主机恢复出厂设置|RESTORE_FACTORY_SETTINGS_710|
|1713|主机恢复出厂设置|RESTORE_FACTORY_SETTINGS|
|1756|SIM卡为物联卡|SIM card is IOT|
|2756|SIM卡为平台物联卡|SIM card is Platform IOT|
|3756|SIM卡为非物联卡|SIM card is not IOT|
|1756|物联卡|SIM_IS_IOT_CARD|
|2756|平台物联卡|SIM_IS_IOT_PLATFORM_CARD|
|3756|非物联卡|SIM_IS_NOT_IOT_CARD|
|1798|索要主机类型|WHAT_IS_YOUR_TYPE|
|1799|信号强度变化|SIGNAL_STRENGTH_CHANGED|
|1944|上线|EVENT_OFFLINE|
|1946|离线|EVENT_ONLINE|
|1799|信号强度|SIGNAL_STRENGTH_CHANGED|
|1944|主机断线|OFFLINE|
|1946|主机上线|ONLINE|
### *恒博主机类型对照表*
*SMS指主机自身是否可以拨打电话、发送短信,不是指通过阿里语音打电话*
|事件码类型|主机类型|布防|撤防|半布防|设置|信号强度|防区|有线防区|SMS|内核|网络|型号|
|---------|-------|----|----|-----|----|-------|----|-------|---|----|---|----|
|1707 我是网络模块|3 网络模块+工程主机|√|√|√|√| |1~999|1~8| |jjf|qfm|<ul><li>G250</li></ul>|
|1717 我是GPRS主机|4 GPRS主机|√|√| |√|√|1~99| |√|wzq|qfm|<ul><li>4040G</li><li>5050G</li><li>5050G-4G</li></ul>|
|1727 我是液晶主机|5 液晶主机|√|√|√|√|√|1~249| |√|jjf|qfm|<ul><li>BJQ560</li><li>BJQ560B</li></ul>|
|1737 我是网线主机|6 网线主机|√|√| |√| |1~99| | |wzq|qfm|<ul><li>4040R</li><li>5050R</li></ul>|
|1757 我是三区段主机|8 三区段主机|√|√| |√|√|1~191|61~68|√|jjf|qfm|<ul><li>G1000</li><li>G1000-4G</li></ul>|
|1767 我是物联卡主机|9 物联卡主机|√|√| |√|√|1~60| | |jjf|qfm|<ul><li>2050-4GW</li></ul>|
|1777 我是真彩主机|7 真彩主机|√|√| |√|√|1~68|1~8|√|jjf|qfm|<ul><li>G1000</li><li>G1000-4G</li></ul>|
|1787 我是简化版物联卡主机|2 简化的物联卡主机|√|√| |√|√|1~99| | |wzq|qfm|<ul><li>5050G-4GW</li></ul>|
|1797 我是GPRS主机能打电话|10 GPRS主机能打电话|√|√| |√|√|1~60| |√|jjf|qfm|<ul><li>2050</li></ul>|
|1807 我是NB报警接收主机|11 NB报警接收主机| | | |√|√|1~999| | |||<ul></ul>|
|1817 我是WiFi主机新版|12 WiFi主机新版|√|√| |√| |1~99| | |wzq|qfm|<ul></ul>|
|1707 主机类型--网络模块|网络模块主机|√|√|√|√| |1~999|1~8| |jjf|qfm|<ul><li>G250</li></ul>|
|1717 主机类型--GPRS主机|GPRS主机|√|√| |√|√|1~99| |√|wzq|qfm|<ul><li>4040G</li><li>5050G</li><li>5050G-4G</li></ul>|
|1727 主机类型--液晶主机|液晶主机|√|√|√|√|√|1~249| |√|jjf|qfm|<ul><li>BJQ560</li><li>BJQ560B</li></ul>|
|1737 主机类型--网线主机|网线主机|√|√| |√| |1~99| | |wzq|qfm|<ul><li>4040R</li><li>5050R</li></ul>|
|1757 主机类型--三区段主机|三区段主机|√|√| |√|√|1~191|61~68|√|jjf|qfm|<ul><li>G1000</li><li>G1000-4G</li></ul>|
|1767 主机类型--物联卡主机|物联卡主机|√|√| |√|√|1~60| | |jjf|qfm|<ul><li>2050-4GW</li></ul>|
|1777 主机类型--真彩主机|真彩主机|√|√| |√|√|1~68|1~8|√|jjf|qfm|<ul><li>G1000</li><li>G1000-4G</li></ul>|
|1787 主机类型--物联卡主机|简化物联卡主机|√|√| |√|√|1~99| | |wzq|qfm|<ul><li>5050G-4GW</li></ul>|
|1797 主机类型--GRPS主机带电话功能|GPRS主机可电话|√|√| |√|√|1~60| |√|jjf|qfm|<ul><li>2050</li></ul>|
|1807 主机类型--NB报警接收主机|NB报警接收主机| | | |√|√|1~999| | |||<ul></ul>|
|1817 主机类型--WiFi主机(新版)|WiFi主机新版|√|√| |√|√|1~99| | |wzq|qfm|<ul></ul>|
### *恒博主机型号示例图片*
......
......@@ -59,6 +59,12 @@ AdemcoEvent allEvents[] = {
#undef XX
};
HbZoneProperty allZoneProperties[] = {
#define XX(name, value, str) HZP_##name,
HB_ZONE_PROPERTY_MAP(XX)
#undef XX
};
void printEvents(const AdemcoEvent* events, size_t len)
{
printf("|事件码|含义|en|\n|-----|----|--|\n");
......@@ -85,7 +91,7 @@ const char* get_core_author(HbMachineType t)
case HMT_NETMOD:
case HMT_LCD:
case HMT_TRUE_COLOR:
case HMT_3_SECTION:
case HMT_THREE_SECTION:
case HMT_IOT:
case HMT_GPRS_PHONE:
return "jjf";
......@@ -104,7 +110,7 @@ const char* get_net_author(HbMachineType t)
case HMT_GPRS:
case HMT_LCD:
case HMT_TRUE_COLOR:
case HMT_3_SECTION:
case HMT_THREE_SECTION:
case HMT_IOT:
case HMT_GPRS_PHONE:
case HMT_WIFI2:
......@@ -125,7 +131,7 @@ std::vector<std::string> get_machine_brands(HbMachineType t)
case HMT_LCD: return { "BJQ560", "BJQ560B" };
case HMT_WIRED: return { "4040R", "5050R" };
case HMT_TRUE_COLOR:return { "G1000", "G1000-4G" };
case HMT_3_SECTION:return { "G1000", "G1000-4G" };
case HMT_THREE_SECTION:return { "G1000", "G1000-4G" };
case HMT_IOT: return { "2050-4GW" };
case HMT_GPRS_PHONE: return { "2050" };
//case hb::common::Nb: return { "" };
......@@ -247,19 +253,19 @@ void print_available_zone_props()
printf("* 防区属性是否支持失联报告\n\n");
printf("|");
for (auto zp : hbZoneProperties) {
for (auto zp : allZoneProperties) {
printf("|"); print_prop(zp);
}
printf("|\n");
printf("|----");
for (size_t i = 0; i < sizeof(hbZoneProperties) / sizeof(hbZoneProperties[0]); i++) {
for (size_t i = 0; i < sizeof(allZoneProperties) / sizeof(allZoneProperties[0]); i++) {
printf("|----");
}
printf("|\n");
printf("|失联支持");
for (auto zp : hbZoneProperties) {
for (auto zp : allZoneProperties) {
printf("|%s", print_bool(hbZonePropCanReportLost(zp)));
}
printf("|\n\n");
......@@ -267,14 +273,14 @@ void print_available_zone_props()
printf("* 主机类型与支持的防区属性对照表\n\n");
printf("|事件码|类型|型号");
for (auto zp : hbZoneProperties) {
for (auto zp : allZoneProperties) {
//printf("|"); print_prop(zp);
printf("|%02X", (int)zp);
}
printf("|\n");
printf("|----|----|----");
for (size_t i = 0; i < sizeof(hbZoneProperties) / sizeof(hbZoneProperties[0]); i++) {
for (size_t i = 0; i < sizeof(allZoneProperties) / sizeof(allZoneProperties[0]); i++) {
printf("|----");
}
printf("|\n");
......@@ -288,7 +294,7 @@ void print_available_zone_props()
print_machine_brands(t);
HbZoneProperty avail_props[12];
int count = hbGetAvailableZoneProperties(t, avail_props);
for (auto zp : hbZoneProperties) {
for (auto zp : allZoneProperties) {
printf("|%s", print_bool(zprop_is_contain(avail_props, count, zp)));
}
printf("|\n");
......
#include "hb_com.h"
#include <string.h>
int hbGetAvailableZoneProperties(HbMachineType type,
HbZoneProperty props[12]) {
HbZoneProperty props[HZP_COUNT]) {
switch (type) {
case HMT_WIFI:
break;
......@@ -10,94 +11,110 @@ int hbGetAvailableZoneProperties(HbMachineType type,
break;
case HMT_GPRS_IOT:
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,
HZP_BUGLAR,
HZP_EMERGENCY,
HZP_FIRE,
HZP_DURESS,
HZP_GAS,
HZP_WATER,
HZP_REMOTE_CONTROL,
};
memcpy(props, hzps, sizeof(hzps));
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,
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));
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,
HZP_REMOTE_CONTROL, HZP_BUGLAR_HALF, HZP_SHIELD,
HZP_DOOR_RING, HZP_BYPASS
};
HZP_DOOR_RING, HZP_BYPASS};
memcpy(props, hzps, sizeof(hzps));
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,
HZP_BUGLAR,
HZP_EMERGENCY,
HZP_FIRE,
HZP_DURESS,
HZP_GAS,
HZP_WATER,
HZP_REMOTE_CONTROL,
};
memcpy(props, hzps, sizeof(hzps));
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,
HZP_SHIELD, HZP_DOOR_RING, HZP_BYPASS
};
HZP_SHIELD, HZP_DOOR_RING, HZP_BYPASS};
memcpy(props, hzps, sizeof(hzps));
return sizeof(hzps) / sizeof(HbZoneProperty);
}
case HMT_3_SECTION:
{
case HMT_THREE_SECTION: {
HbZoneProperty hzps[] = {
HZP_BUGLAR, HZP_EMERGENCY, HZP_FIRE,
HZP_DURESS, HZP_GAS, HZP_WATER, HZP_REMOTE_CONTROL,
HZP_SHIELD, HZP_DOOR_RING, HZP_BYPASS
};
HZP_SHIELD, HZP_DOOR_RING, HZP_BYPASS};
memcpy(props, hzps, sizeof(hzps));
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,
HZP_SHIELD, HZP_DOOR_RING, HZP_BYPASS
};
HZP_SHIELD, HZP_DOOR_RING, HZP_BYPASS};
memcpy(props, hzps, sizeof(hzps));
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,
HZP_BUGLAR,
HZP_EMERGENCY,
HZP_FIRE,
HZP_DURESS,
HZP_GAS,
HZP_WATER,
HZP_REMOTE_CONTROL,
};
memcpy(props, hzps, sizeof(hzps));
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,
HZP_BUGLAR,
HZP_EMERGENCY,
HZP_FIRE,
HZP_DURESS,
HZP_GAS,
HZP_WATER,
HZP_DOOR_RING,
};
memcpy(props, hzps, sizeof(hzps));
return sizeof(hzps) / sizeof(HbZoneProperty);
}
default: return 0;
default:
return 0;
}
return 0;
}
......@@ -120,7 +137,7 @@ uint16_t hbZoneMax(HbMachineType type) {
case HMT_TRUE_COLOR:
return 68;
case HMT_3_SECTION:
case HMT_THREE_SECTION:
return 191;
case HMT_IOT:
......@@ -152,7 +169,7 @@ int hbMachineIsSelling(HbMachineType type) {
type == HMT_LCD ||
type == HMT_WIRED ||
type == HMT_TRUE_COLOR ||
type == HMT_3_SECTION ||
type == HMT_THREE_SECTION ||
type == HMT_GPRS_PHONE ||
type == HMT_NB ||
type == HMT_WIFI2;
......@@ -180,7 +197,7 @@ int hbMachineCanReportSignalStrength(HbMachineType type) {
type == HMT_IOT ||
type == HMT_LCD ||
type == HMT_TRUE_COLOR ||
type == HMT_3_SECTION ||
type == HMT_THREE_SECTION ||
type == HMT_GPRS_PHONE ||
type == HMT_NB ||
type == HMT_WIFI2;
......@@ -190,31 +207,39 @@ int hbMachineCanReportBySMS(HbMachineType type) {
return type == HMT_GPRS ||
type == HMT_LCD ||
type == HMT_TRUE_COLOR ||
type == HMT_3_SECTION ||
type == HMT_THREE_SECTION ||
type == HMT_GPRS_PHONE;
}
int hbMachineHasWiredZone(HbMachineType type) {
return type == HMT_NETMOD ||
type == HMT_TRUE_COLOR ||
type == HMT_3_SECTION;
type == HMT_THREE_SECTION;
}
AdemcoZone hbWiredZoneMin(HbMachineType type) {
switch (type) {
case HMT_NETMOD: return 1;
case HMT_TRUE_COLOR: return 1;
case HMT_3_SECTION: return 61;
default: return 0;
case HMT_NETMOD:
return 1;
case HMT_TRUE_COLOR:
return 1;
case HMT_THREE_SECTION:
return 61;
default:
return 0;
}
}
AdemcoZone hbWiredZoneMax(HbMachineType type) {
switch (type) {
case HMT_NETMOD: return 8;
case HMT_TRUE_COLOR: return 8;
case HMT_3_SECTION: return 68;
default: return 0;
case HMT_NETMOD:
return 8;
case HMT_TRUE_COLOR:
return 8;
case HMT_THREE_SECTION:
return 68;
default:
return 0;
}
}
......@@ -288,24 +313,28 @@ void hbMachineTimerFromGreenwich(HbMachineTimer* timer) {
AdemcoEvent hbMachineStatusToAdemcoEvent(HbMachineStatus status) {
switch (status) {
case HMS_ARM: return EVENT_ARM;
case HMS_DISARM: return EVENT_DISARM;
case HMS_HALF_ARM: return EVENT_HALFARM; // EVENT_HALFARM_1456
case HMS_SETTING: return EVENT_ENTER_SETTING_MODE; // EVENT_ENTER_SET_MODE
default: return EVENT_INVALID_EVENT;
#define XX(hms, ae) \
case hms: \
return ae;
HMS_EVENT_MAP(XX)
#undef XX
default:
return EVENT_INVALID_EVENT;
}
}
HbMachineStatus hbMachineStatusFromAdemcoEvent(AdemcoEvent ademcoEvent) {
switch (ademcoEvent) {
case EVENT_ARM:
return HMS_ARM;
case EVENT_DISARM:
return HMS_DISARM;
case EVENT_HALFARM:
#define XX(hms, ae) \
case ae: \
return hms;
HMS_EVENT_MAP(XX)
#undef XX
case EVENT_HALFARM_1456:
return HMS_HALF_ARM;
case EVENT_ENTER_SETTING_MODE:
case EVENT_ENTER_SET_MODE:
return HMS_SETTING;
default:
......@@ -315,154 +344,121 @@ HbMachineStatus hbMachineStatusFromAdemcoEvent(AdemcoEvent ademcoEvent) {
AdemcoEvent hbMachineTypeToAdemcoEvent(HbMachineType type) {
switch (type) {
case HMT_WIFI: return EVENT_I_AM_WIFI_MACHINE;
case HMT_GPRS_IOT: return EVENT_I_AM_GPRS_IOT;
case HMT_NETMOD: return EVENT_I_AM_NET_MODULE;
case HMT_GPRS: return EVENT_I_AM_GPRS;
case HMT_LCD: return EVENT_I_AM_LCD_MACHINE;
case HMT_WIRED: return EVENT_I_AM_WIRE_MACHINE;
case HMT_TRUE_COLOR: return EVENT_I_AM_TRUE_COLOR;
case HMT_3_SECTION: return EVENT_I_AM_3_SECTION_MACHINE;
case HMT_IOT: return EVENT_I_AM_IOT_MACHINE;
case HMT_GPRS_PHONE: return EVENT_I_AM_GPRS_PHONE;
case HMT_NB: return EVENT_I_AM_NB_MACHINE;
case HMT_WIFI2: return EVENT_I_AM_WIFI2_MACHINE;
default: return EVENT_INVALID_EVENT;
#define XX(hmt, ae) \
case hmt: \
return ae;
HMT_EVENT_MAP(XX)
#undef XX
default:
return EVENT_INVALID_EVENT;
}
}
HbMachineType hbMachineTypeFromAdemcoEvent(AdemcoEvent ademcoEvent) {
switch (ademcoEvent) {
case EVENT_I_AM_NET_MODULE: return HMT_NETMOD;
case EVENT_I_AM_GPRS: return HMT_GPRS;
case EVENT_I_AM_LCD_MACHINE: return HMT_LCD;
case EVENT_I_AM_WIRE_MACHINE: return HMT_WIRED;
case EVENT_I_AM_WIFI_MACHINE: return HMT_WIFI;
case EVENT_I_AM_3_SECTION_MACHINE: return HMT_3_SECTION;
case EVENT_I_AM_IOT_MACHINE: return HMT_IOT;
case EVENT_I_AM_TRUE_COLOR: return HMT_TRUE_COLOR;
case EVENT_I_AM_GPRS_IOT: return HMT_GPRS_IOT;
case EVENT_I_AM_GPRS_PHONE: return HMT_GPRS_PHONE;
case EVENT_I_AM_NB_MACHINE: return HMT_NB;
case EVENT_I_AM_WIFI2_MACHINE: return HMT_WIFI2;
default: return HMT_INVALID;
#define XX(hmt, ae) \
case ae: \
return hmt;
HMT_EVENT_MAP(XX)
#undef XX
default:
return HMT_INVALID;
}
}
AdemcoEvent hbZonePropertyToAdemcoEvent(HbZoneProperty zp) {
switch (zp) {
case HZP_BUGLAR:
case HZP_BUGLAR_HALF: return EVENT_BURGLAR;
case HZP_EMERGENCY: return EVENT_EMERGENCY;
case HZP_FIRE: return EVENT_FIRE;
case HZP_DURESS: return EVENT_DURESS;
case HZP_GAS: return EVENT_GAS;
case HZP_WATER: return EVENT_WATER;
case HZP_DOOR_RING: return EVENT_DOORRINGING;
default: return EVENT_INVALID_EVENT;
#define XX(hzp, ae) \
case hzp: \
return ae;
HZP_EVENT_MAP(XX)
#undef XX
default:
return EVENT_INVALID_EVENT;
}
}
const char* hbMachineStatusToString(HbMachineStatus status) {
switch (status) {
case HMS_ARM: return "Arm";
case HMS_HALF_ARM: return "Half-Arm";
case HMS_DISARM: return "Disarm";
case HMS_SETTING: return "Setting";
default: return "InvalidMachineStatus";
#define XX(name, value, str) \
case HMS_##name: \
return #name;
HB_MACHINE_STATUS_MAP(XX)
#undef XX
default:
return "InvalidMachineStatus";
}
}
const char* hbMachineTypeToString(HbMachineType type) {
switch (type) {
case HMT_WIFI: return "0 WiFi";
case HMT_CAMERA: return "1 Camera";
case HMT_GPRS_IOT: return "2 Gprs_IoT";
case HMT_NETMOD: return "3 NetMod";
case HMT_GPRS: return "4 GPRS";
case HMT_LCD: return "5 LCD";
case HMT_WIRED: return "6 Wired";
case HMT_TRUE_COLOR: return "7 TrueColor";
case HMT_3_SECTION: return "8 ThreeSection";
case HMT_IOT: return "9 IoT";
case HMT_GPRS_PHONE: return "10 Gprs_Phone";
case HMT_NB: return "11 Nb";
case HMT_WIFI2: return "12 WiFi2";
default: return "Unknown HbMachineType";
#define XX(name, value, str) \
case HMT_##name: \
return #name;
HB_MACHINE_TYPE_MAP(XX)
#undef XX
default:
return "Unknown HbMachineType";
}
}
const char* hbZonePropertyToString(HbZoneProperty zp) {
switch (zp) {
case HZP_BUGLAR: return "HZP_BUGLAR";
case HZP_EMERGENCY: return "HZP_EMERGENCY";
case HZP_FIRE: return "HZP_FIRE";
case HZP_DURESS: return "HZP_DURESS";
case HZP_GAS: return "HZP_GAS";
case HZP_WATER: return "HZP_WATER";
case HZP_SUB_MACHINE: return "HZP_SUB_MACHINE";
case HZP_REMOTE_CONTROL: return "HZP_REMOTE_CONTROL";
case HZP_BUGLAR_HALF: return "HZP_BUGLAR_HALF";
case HZP_SHIELD: return "HZP_SHIELD";
case HZP_DOOR_RING: return "HZP_DOOR_RING";
case HZP_RESERVED_0B: return "Reserved0B";
case HZP_RESERVED_0C: return "Reserved0C";
case HZP_RESERVED_0D: return "Reserved0D";
case HZP_RESERVED_0E: return "Reserved0E";
case HZP_BYPASS: return "HZP_BYPASS";
default: return "InvalidZoneProperty";
}
}
#ifdef ADEMCO_ENABLE_CHINESE
#define XX(name, value, str) \
case HZP_##name: \
return #name;
HB_ZONE_PROPERTY_MAP(XX)
#undef XX
default:
return "InvalidZoneProperty";
}
}
#if ADEMCO_ENABLE_CHINESE
const char* hbMachineStatusToStringChinese(HbMachineStatus status) {
switch (status) {
case HMS_ARM: return "布防";
case HMS_HALF_ARM: return "半布防";
case HMS_DISARM: return "撤防";
case HMS_SETTING: return "设置";
default: return "InvalidMachineStatus";
#define XX(name, value, str) \
case HMS_##name: \
return str;
HB_MACHINE_STATUS_MAP(XX)
#undef XX
default:
return "无效状态";
}
}
const char* hbMachineTypeToStringChinese(HbMachineType type) {
switch (type) {
case HMT_WIFI: return "0 WiFi主机";
case HMT_CAMERA: return "1 摄像头主机";
case HMT_GPRS_IOT: return "2 简化的物联卡主机";
case HMT_NETMOD: return "3 网络模块+工程主机";
case HMT_GPRS: return "4 GPRS主机";
case HMT_LCD: return "5 液晶主机";
case HMT_WIRED: return "6 网线主机";
case HMT_TRUE_COLOR: return "7 真彩主机";
case HMT_3_SECTION: return "8 三区段主机";
case HMT_IOT: return "9 物联卡主机";
case HMT_GPRS_PHONE: return "10 GPRS主机能打电话";
case HMT_NB: return "11 NB报警接收主机";
case HMT_WIFI2: return "12 WiFi主机新版";
default: return "未知主机";
#define XX(name, value, str) \
case HMT_##name: \
return str;
HB_MACHINE_TYPE_MAP(XX)
#undef XX
default:
return "未知机型";
}
}
const char* hbZonePropertyToStringChinese(HbZoneProperty zp) {
switch (zp) {
case HZP_BUGLAR: return "匪警全局";
case HZP_EMERGENCY: return "匪警紧急";
case HZP_FIRE: return "火警防区";
case HZP_DURESS: return "胁迫防区";
case HZP_GAS: return "燃气防区";
case HZP_WATER: return "淹水防区";
case HZP_SUB_MACHINE: return "分机";
case HZP_REMOTE_CONTROL: return "遥控器";
case HZP_BUGLAR_HALF: return "匪警半局";
case HZP_SHIELD: return "屏蔽防区";
case HZP_DOOR_RING: return "门铃防区";
case HZP_RESERVED_0B: return "保留";
case HZP_RESERVED_0C: return "保留";
case HZP_RESERVED_0D: return "保留";
case HZP_RESERVED_0E: return "保留";
case HZP_BYPASS: return "旁路防区";
default: return "无效属性";
#define XX(name, value, str) \
case HZP_##name: \
return str;
HB_ZONE_PROPERTY_MAP(XX)
#undef XX
default:
return "无效属性";
}
}
#endif
......@@ -503,52 +499,81 @@ HbComRequestType hbComParseRequest(const uint8_t* data,
size_t len,
HbComData* cd) {
do {
if (len < 5) { break; }
if (data[0] != 0xEB) { break; }
if (len < 5) {
break;
}
if (data[0] != 0xEB) {
break;
}
switch (data[1]) {
case 0xAB:
{
if (data[2] != 0x3F) { break; }
case 0xAB: {
if (data[2] != 0x3F) {
break;
}
switch (data[3]) {
case 0xA0: // EB AB 3F A0 75
{
if (len != HbComReq_A0_len) { break; }
if (memcmp(HbComReq_A0_data, data, len) != 0) { break; }
if (len != HbComReq_A0_len) {
break;
}
if (memcmp(HbComReq_A0_data, data, len) != 0) {
break;
}
copy_data_to_com;
return HbComReq_A0;
}
case 0xA1: // EB AB 3F A1 76
{
if (len != HbComReq_A1_len) { break; }
if (memcmp(HbComReq_A1_data, data, len) != 0) { break; }
if (len != HbComReq_A1_len) {
break;
}
if (memcmp(HbComReq_A1_data, data, len) != 0) {
break;
}
copy_data_to_com;
return HbComReq_A1;
}
case 0xA2: // EB AB 3F A2 77
{
if (len != HbComReq_A2_len) { break; }
if (memcmp(HbComReq_A2_data, data, len) != 0) { break; }
if (len != HbComReq_A2_len) {
break;
}
if (memcmp(HbComReq_A2_data, data, len) != 0) {
break;
}
copy_data_to_com;
return HbComReq_A2;
}
case 0xA5: // EB AB 3F A5 7A
{
if (len != HbComReq_A5_len) { break; }
if (memcmp(HbComReq_A5_data, data, len) != 0) { break; }
if (len != HbComReq_A5_len) {
break;
}
if (memcmp(HbComReq_A5_data, data, len) != 0) {
break;
}
copy_data_to_com;
return HbComReq_A5;
}
case 0xAC: // EB AB 3F AC 81
{
if (len != HbComReq_AC_len) { break; }
if (memcmp(HbComReq_AC_data, data, len) != 0) { break; }
if (len != HbComReq_AC_len) {
break;
}
if (memcmp(HbComReq_AC_data, data, len) != 0) {
break;
}
copy_data_to_com;
return HbComReq_AC;
}
case 0xAD: // EB AB 3F AD 82
{
if (len != HbComReq_AD_len) { break; }
if (memcmp(HbComReq_AD_data, data, len) != 0) { break; }
if (len != HbComReq_AD_len) {
break;
}
if (memcmp(HbComReq_AD_data, data, len) != 0) {
break;
}
copy_data_to_com;
return HbComReq_AD;
}
......@@ -557,9 +582,10 @@ HbComRequestType hbComParseRequest(const uint8_t* data,
}
break;
}
case 0xBA:
{
if (data[2] != 0x3F) { break; }
case 0xBA: {
if (data[2] != 0x3F) {
break;
}
if (len == HbComReq_READ_acct_len &&
memcmp(data, HbComReq_READ_acct_data, len) == 0) {
copy_data_to_com;
......@@ -567,9 +593,10 @@ HbComRequestType hbComParseRequest(const uint8_t* data,
}
break;
}
case 0xCB:
{
if (data[2] != 0x3F) { break; }
case 0xCB: {
if (data[2] != 0x3F) {
break;
}
if (data[3] == 0x09 &&
data[4] == 0xA3 &&
......@@ -631,24 +658,31 @@ HbComRequestType hbComParseRequest(const uint8_t* data,
HbComRequestType hbComParseXDataRequest(const AdemcoXDataSegment* xdata,
HbComData* cd) {
if (!xdata) { return HbComReq_Invalid; }
if (!xdata) {
return HbComReq_Invalid;
}
return hbComParseRequest(
(const uint8_t*)ademcoXDataGetValidContentAddr(xdata),
ademcoXDataGetValidContentLen(xdata),
cd
);
cd);
}
HbComResponseType hbComParseResponse(const uint8_t* data,
size_t len,
HbComData* cd) {
do {
if (len < 7) { break; } // 所有的 response ,长度最小为 7
if (data[0] != 0xEB || data[1] != 0xBA || data[2] != 0x3F) { break; }
if (len < 7) {
break;
} // 所有的 response ,长度最小为 7
if (data[0] != 0xEB || data[1] != 0xBA || data[2] != 0x3F) {
break;
}
switch (data[5]) {
case 0xA0: // EB BA 3F 07 P0 A0 P1 P2 P3 SUM
{
if (len != HbComResp_A0_len) { break; }
if (len != HbComResp_A0_len) {
break;
}
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComResp_A0;
......@@ -658,7 +692,9 @@ HbComResponseType hbComParseResponse(const uint8_t* data,
case 0xA2: // EB BA 3F PN P0 A2 [Z, P]xN P1 SUM
{
if (len != data[3]) { break; }
if (len != data[3]) {
break;
}
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComResp_A2;
......@@ -666,9 +702,10 @@ HbComResponseType hbComParseResponse(const uint8_t* data,
break;
}
case 0xA3:
{
if (len != HbComResp_A3_len) { break; }
case 0xA3: {
if (len != HbComResp_A3_len) {
break;
}
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComResp_A3;
......@@ -676,9 +713,10 @@ HbComResponseType hbComParseResponse(const uint8_t* data,
break;
}
case 0xA4:
{
if (len != HbComResp_A4_len) { break; }
case 0xA4: {
if (len != HbComResp_A4_len) {
break;
}
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComResp_A4;
......@@ -686,9 +724,10 @@ HbComResponseType hbComParseResponse(const uint8_t* data,
break;
}
case 0xA6:
{
if (len != HbComResp_A6_len) { break; }
case 0xA6: {
if (len != HbComResp_A6_len) {
break;
}
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComResp_A6;
......@@ -696,9 +735,10 @@ HbComResponseType hbComParseResponse(const uint8_t* data,
break;
}
case 0xA7:
{
if (len != HbComResp_A7_len) { break; }
case 0xA7: {
if (len != HbComResp_A7_len) {
break;
}
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComResp_A7;
......@@ -706,9 +746,10 @@ HbComResponseType hbComParseResponse(const uint8_t* data,
break;
}
case 0xA8:
{
if (len != HbComResp_A8_len) { break; }
case 0xA8: {
if (len != HbComResp_A8_len) {
break;
}
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComResp_A8;
......@@ -716,15 +757,15 @@ HbComResponseType hbComParseResponse(const uint8_t* data,
break;
}
case 0xA9:
{
case 0xA9: {
// TODO
break;
}
case 0xAB:
{
if (len != HbComResp_AB_len) { break; }
case 0xAB: {
if (len != HbComResp_AB_len) {
break;
}
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComResp_AB;
......@@ -734,7 +775,9 @@ HbComResponseType hbComParseResponse(const uint8_t* data,
case 0xAD: // EB BA 3F PN P0 AD P1 DATA P2 SUM
{
if (len != data[3]) { break; }
if (len != data[3]) {
break;
}
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComResp_AD;
......@@ -744,20 +787,20 @@ HbComResponseType hbComParseResponse(const uint8_t* data,
case 0xAF: // TODO
{
break;
}
case 0xB1: // EB BA 3F 08 P0 B1 P1 SUM
{
if (len != HbComResp_B1_len) { break; }
if (len != HbComResp_B1_len) {
break;
}
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComResp_B1;
}
break;
}
}
} while (0);
......@@ -780,12 +823,13 @@ HbComResponseType hbComParseResponse(const uint8_t* data,
HbComResponseType hbComParseXDataResponse(const AdemcoXDataSegment* xdata,
HbComData* cd) {
if (!xdata) { return HbComResp_Invalid; }
if (!xdata) {
return HbComResp_Invalid;
}
return hbComParseResponse(
(const uint8_t*)ademcoXDataGetValidContentAddr(xdata),
ademcoXDataGetValidContentLen(xdata),
cd
);
cd);
}
void hbComMakeReqA0_getMachineStatus(HbComData* data) {
......@@ -877,14 +921,14 @@ void hbComMakeReqWrite_acct(HbComData* data, const char* acct) {
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));
iter->i = 0;
if (com->len > HbComResp_A2_len_min) {
iter->total = (com->len - HbComResp_A2_len_min) / 2;
iter->p1 = (com->data[com->len - 2] == 0xFF) ?
HbComResp_A2_p1_nomore :
HbComResp_A2_p1_more;
iter->p1 = (com->data[com->len - 2] == 0xFF)
? HbComResp_A2_p1_nomore
: HbComResp_A2_p1_more;
} else {
iter->total = 0;
iter->p1 = HbComResp_A2_p1_nomore;
......@@ -916,7 +960,9 @@ void hbComMakeRespA2_getMachineZones(HbComData* data,
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);
data->data[3] = (HbComResp_A2_len_min + count * 2) & 0xFF;
uint8_t* p = data->data + 6;
......@@ -979,12 +1025,13 @@ void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* data,
size_t count,
AdemcoZone* zones,
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);
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;
uint8_t* p = data->data + 7;
for (size_t i = 0; i < count; i++) {
......
......@@ -9,94 +9,118 @@
extern "C" {
#endif
//! 三防区主机状态GG范围 1~3
// 三防区主机状态GG范围 1~3
#define HB_3SECTION_MACHINE_GG_MIN 1
#define HB_3SECTION_MACHINE_GG_MAX 3
//! 是否合法的三防区主机状态GG
// 是否合法的三防区主机状态GG
static inline int hbIsValid3SectionMachineGG(AdemcoGG gg) {
return HB_3SECTION_MACHINE_GG_MIN <= gg &&
gg <= HB_3SECTION_MACHINE_GG_MAX;
}
//! 主机状态
// 主机状态表
#define HB_MACHINE_STATUS_MAP(XX) \
XX(ARM, 0, "布防") \
XX(HALF_ARM, 1, "半布防") \
XX(DISARM, 2, "撤防") \
XX(SETTING, 3, "设置")
// 主机状态与安定宝事件码对照表
#define HMS_EVENT_MAP(XX) \
XX(HMS_ARM, EVENT_ARM) \
XX(HMS_HALF_ARM, EVENT_HALFARM) \
XX(HMS_DISARM, EVENT_DISARM) \
XX(HMS_SETTING, EVENT_ENTER_SETTING_MODE)
// 主机状态
typedef enum HbMachineStatus {
HMS_ARM, // 布防
HMS_HALF_ARM, // 半布防
HMS_DISARM, // 撤防
HMS_SETTING, // 设置
HMS_COUNT,
#define XX(name, value, str) HMS_##name = value,
HB_MACHINE_STATUS_MAP(XX)
#undef XX
// valid count
HMS_COUNT = 4,
// invalid
HMS_INVALID = -1,
} HbMachineStatus;
// 主机类型表
#define HB_MACHINE_TYPE_MAP(XX) \
XX(WIFI, 0, "WiFi主机") \
XX(CAMERA, 1, "网络摄像机") \
XX(GPRS_IOT, 2, "简化物联卡主机") \
XX(NETMOD, 3, "网络模块主机") \
XX(GPRS, 4, "GPRS主机") \
XX(LCD, 5, "液晶主机") \
XX(WIRED, 6, "网线主机") \
XX(TRUE_COLOR, 7, "真彩主机") \
XX(THREE_SECTION, 8, "三区段主机") \
XX(IOT, 9, "物联卡主机") \
XX(GPRS_PHONE, 10, "GPRS主机可电话") \
XX(NB, 11, "NB报警接收主机") \
XX(WIFI2, 12, "WiFi主机新版")
// 主机类型与安定宝事件码对照表
#define HMT_EVENT_MAP(XX) \
XX(HMT_WIFI, EVENT_I_AM_WIFI_MACHINE) \
XX(HMT_GPRS_IOT, EVENT_I_AM_GPRS_IOT) \
XX(HMT_NETMOD, EVENT_I_AM_NET_MODULE) \
XX(HMT_GPRS, EVENT_I_AM_GPRS) \
XX(HMT_LCD, EVENT_I_AM_LCD_MACHINE) \
XX(HMT_WIRED, EVENT_I_AM_WIRE_MACHINE) \
XX(HMT_TRUE_COLOR, EVENT_I_AM_TRUE_COLOR) \
XX(HMT_THREE_SECTION, EVENT_I_AM_3_SECTION_MACHINE) \
XX(HMT_IOT, EVENT_I_AM_IOT_MACHINE) \
XX(HMT_GPRS_PHONE, EVENT_I_AM_GPRS_PHONE) \
XX(HMT_NB, EVENT_I_AM_NB_MACHINE) \
XX(HMT_WIFI2, EVENT_I_AM_WIFI2_MACHINE)
// 主机类型
typedef enum HbMachineType {
//! 0 WiFi主机 (已停用)
HMT_WIFI,
//! 1 网络摄像机 (未启用)
HMT_CAMERA,
//! 2 简化的物联卡主机 [ HB-5050G-4GW ]
HMT_GPRS_IOT,
//! 3 网络模块主机 [ HB-G250 ]
HMT_NETMOD,
//! 4 改进型卧式主机 [ HB-4040G HB-5050G HB-5050-4G ]
HMT_GPRS,
//! 5 液晶主机 [ HB-BJQ560 HB-BJQ-560B ]
HMT_LCD,
//! 6 网线主机 [ HB-4040R HB-5050R ]
HMT_WIRED,
//! 7 真彩主机 [ HTZ-G1000 HTZ-G1000-4G ]
HMT_TRUE_COLOR,
//! 8 三区段主机 [ HTZ-G1000 HTZ-G1000-4G ]
HMT_3_SECTION,
//! 9 物联卡主机 [ HB-2050-4GW ]
HMT_IOT,
//! 10 GPRS主机可以打电话 [ HB-2050 ]
HMT_GPRS_PHONE,
//! 11 NB报警接收主机
HMT_NB,
//! 12 WiFi主机新版
HMT_WIFI2,
HMT_COUNT,
#define XX(name, value, str) HMT_##name = value,
HB_MACHINE_TYPE_MAP(XX)
#undef XX
// valid count
HMT_COUNT = 13,
// invalid
HMT_INVALID = -1,
} HbMachineType;
// 防区属性表
#define HB_ZONE_PROPERTY_MAP(XX) \
XX(BUGLAR, 0, "匪警全局") \
XX(EMERGENCY, 1, "匪警紧急") \
XX(FIRE, 2, "火警防区") \
XX(DURESS, 3, "胁迫防区") \
XX(GAS, 4, "燃气防区") \
XX(WATER, 5, "淹水防区") \
XX(SUB_MACHINE, 6, "分机") \
XX(REMOTE_CONTROL, 7, "遥控器") \
XX(BUGLAR_HALF, 8, "匪警半局") \
XX(SHIELD, 9, "屏蔽防区") \
XX(DOOR_RING, 0x0A, "门铃防区") \
XX(BYPASS, 0x0F, "旁路防区")
// 防区属性与安定宝事件码对照表
#define HZP_EVENT_MAP(XX) \
XX(HZP_BUGLAR, EVENT_BURGLAR) \
XX(HZP_BUGLAR_HALF, EVENT_BURGLAR) \
XX(HZP_EMERGENCY, EVENT_EMERGENCY) \
XX(HZP_FIRE, EVENT_FIRE) \
XX(HZP_DURESS, EVENT_DURESS) \
XX(HZP_GAS, EVENT_GAS) \
XX(HZP_WATER, EVENT_WATER) \
XX(HZP_DOOR_RING, EVENT_DOORRINGING)
// 防区属性
typedef enum HbZoneProperty {
//! 匪警全局
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_RESERVED_0B,
//! 保留
HZP_RESERVED_0C,
//! 保留
HZP_RESERVED_0D,
//! 保留
HZP_RESERVED_0E,
//! 旁路防区
//! 2019年9月2日16:01:58 适配金建峰真彩主机
HZP_BYPASS,
HZP_COUNT,
#define XX(name, value, str) HZP_##name = value,
HB_ZONE_PROPERTY_MAP(XX)
#undef XX
// valid count
#define HZP_COUNT 12
// invalid
HZP_INVALID = -1,
} HbZoneProperty;
......@@ -167,19 +191,19 @@ typedef enum HbComResponseType {
HbComResp_Invalid = -1,
} HbComResponseType;
//! 索要主机状态 EB AB 3F A0 75
// 索要主机状态 EB AB 3F A0 75
#define HbComReq_A0_len 5
#define HbComReq_A0_data "\xEB\xAB\x3F\xA0\x75"
//! 回应主机状态 EB BA 3F 07 P0 A0 P1 P2 P3 SUM
// 回应主机状态 EB BA 3F 07 P0 A0 P1 P2 P3 SUM
#define HbComResp_A0_len 9
#define HbComResp_A0_head "\xEB\xBA\x3F\x07\xCC\xA0"
//! 索要主机防区 EB AB 3F A1 76
// 索要主机防区 EB AB 3F A1 76
#define HbComReq_A1_len 5
#define HbComReq_A1_data "\xEB\xAB\x3F\xA1\x76"
//! 回应主机防区 EB BA 3F PN P0 A2 [Z, P]xN P1 SUM
// 回应主机防区 EB BA 3F PN P0 A2 [Z, P]xN P1 SUM
// 无防区数据时长度最小为8
#define HbComResp_A2_len_min 8
// 最多可以包含 20 个防区
......@@ -197,73 +221,73 @@ typedef struct HbComResp_A2_Iter {
HbComResp_A2_p1 p1;
} HbComResp_A2_Iter;
//! 索要更多主机防区 EB AB 3F A2 77
//! 仅应在收到ZoneResponse的param非0xFF时发送,以索要全部防区
// 索要更多主机防区 EB AB 3F A2 77
// 仅应在收到ZoneResponse的param非0xFF时发送,以索要全部防区
#define HbComReq_A2_len 5
#define HbComReq_A2_data "\xEB\xAB\x3F\xA2\x77"
//! 修改主机防区 EB CB 3F 09 A3 P1 P2 P3 SUM
// 修改主机防区 EB CB 3F 09 A3 P1 P2 P3 SUM
#define HbComReq_A3_len 9
#define HbComReq_A3_head "\xEB\xCB\x3F\x09\xA3"
typedef enum HbComReq_A3_p3 {
HbComReq_A3_p3_del = 0x00, //! 删除防区
HbComReq_A3_p3_learn = 0x01, //! 学码
HbComReq_A3_p3_stop = 0x02, //! 停止学码
HbComReq_A3_p3_modify = 0x03, //! 修改防区属性
HbComReq_A3_p3_del = 0x00, // 删除防区
HbComReq_A3_p3_learn = 0x01, // 学码
HbComReq_A3_p3_stop = 0x02, // 停止学码
HbComReq_A3_p3_modify = 0x03, // 修改防区属性
} HbComReq_A3_op;
//! 学码开始回应 EB BA 3F 07 P0 A3 5A
//! 因为学码时主机要等待外部无线信号(用户触发探测器),
//! 因此先回应A3表示已经开始学码,学码成功时回 ZoneOpResponse A4
// 学码开始回应 EB BA 3F 07 P0 A3 5A
// 因为学码时主机要等待外部无线信号(用户触发探测器),
// 因此先回应A3表示已经开始学码,学码成功时回 ZoneOpResponse A4
#define HbComResp_A3_len 7
#define HbComResp_A3_data "\xEB\xBA\x3F\x07\xCC\xA3\x5A"
//! 修改防区回应 EB BA 3F 0A P0 A4 P1 P2 P3 SUM
// 修改防区回应 EB BA 3F 0A P0 A4 P1 P2 P3 SUM
#define HbComResp_A4_len 10
#define HbComResp_A4_head "\xEB\xBA\x3F\x0A\xCC\xA4"
typedef enum HbComResp_A4_p3 {
HbComResp_A4_p3_fail = 0x00, //! 失败
HbComResp_A4_p3_ok = 0x01, //! 成功
HbComResp_A4_p3_dup = 0x02, //! 失败--重码
HbComResp_A4_p3_ne = 0x03, //! 失败--防区未对码 not exists
HbComResp_A4_p3_fail = 0x00, // 失败
HbComResp_A4_p3_ok = 0x01, // 成功
HbComResp_A4_p3_dup = 0x02, // 失败--重码
HbComResp_A4_p3_ne = 0x03, // 失败--防区未对码 not exists
} HbComResp_A4_p3;
//! 获取主机定时器
//! EB AB 3F A5 7A
// 获取主机定时器
// EB AB 3F A5 7A
#define HbComReq_A5_len 5
#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_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_head "\xEB\xCB\x3F\x0E\xA7"
#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_data "\xEB\xBA\x3F\x07\xCC\xA7\x5E"
//! 拒绝设置回应
//! EB BA 3F 07 P0 A8 SUM
//! 任何操作,主机如果认为非法,都可以用A8直接回复
// 拒绝设置回应
// EB BA 3F 07 P0 A8 SUM
// 任何操作,主机如果认为非法,都可以用A8直接回复
#define HbComResp_A8_len 7
#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_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_head "\xEB\xBA\x3F\x09\xCC\xAB"
typedef enum HbComResp_AB_p2 {
......@@ -272,18 +296,18 @@ typedef enum HbComResp_AB_p2 {
HbComResp_AB_p2_reject = 2, // 拒绝操作
} HbComResp_AB_p2;
//! 索要防区探头遗失/失联,第一次索要
//! EB AB 3F AC 81
// 索要防区探头遗失/失联,第一次索要
// EB AB 3F AC 81
#define HbComReq_AC_len 5
#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_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
#define HbComResp_AD_len_min 9
// 一包最多包含20个防区
......@@ -314,19 +338,19 @@ typedef enum HbCom_3sec_which {
HbCom_3sec_section3, // 区段3
} HbCom_3sec_which;
//! 三区段主机布撤防命令 EB CB 3F 08 AE P1 P2 SUM
// 三区段主机布撤防命令 EB CB 3F 08 AE P1 P2 SUM
#define HbComReq_AE_len 8
#define HbComReq_AE_head "\xEB\xCB\x3F\x08\xAE"
//! 三区段主机布撤防命令回应 EB BA 3F 08 P0 AF P1 P2 SUM
// 三区段主机布撤防命令回应 EB BA 3F 08 P0 AF P1 P2 SUM
#define HbComResp_AF_len 9
#define HbComResp_AF_head "\xEB\xBA\x3F\x08\xCC\xAF"
//! 三区段主机索要主机状态 EB CB 3F 06 B0 AB
// 三区段主机索要主机状态 EB CB 3F 06 B0 AB
#define HbComReq_B0_len 6
#define HbComReq_B0_data "\xEB\xCB\x3F\x06\xB0\xAB"
//! 三区段主机状态回应 EB BA 3F 08 P0 B1 P1 SUM
// 三区段主机状态回应 EB BA 3F 08 P0 B1 P1 SUM
#define HbComResp_B1_len 8
#define HbComResp_B1_head "\xEB\xBA\x3F\x08\xCC\xB1"
#define hbComResp_B1_status(d) \
......@@ -341,191 +365,293 @@ typedef enum HbCom_3sec_which {
#define hbComResp_B1_status3(d) \
((((d)[6]) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
//! 读取主机账号
// 读取主机账号
#define HbComReq_READ_acct_len 7
#define HbComReq_READ_acct_data "\xEB\xBA\x3F\x07\x00\x4C\x37"
//! 读取主机账号回应
// 读取主机账号回应
#define HbComResp_READ_acct_len 15
#define HbComResp_READ_acct_head "\xEB\xCB\x3F\x0F\x4C"
//! 写入主机账号
// 写入主机账号
#define HbComReq_WRITE_acct_len 15
#define HbComReq_WRITE_acct_head "\xEB\xCB\x3F\x0F\x4D"
//! 写入主机账号回应(与读取命令相同)
// 写入主机账号回应(与读取命令相同)
#define HbComResp_WRITE_acct_len HbComReq_READ_acct_len
#define HbComResp_WRITE_acct_data HbComReq_READ_acct_data
static const HbZoneProperty hbZoneProperties[12] = {
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,
};
// return available count
ADEMCO_EXPORT_SYMBOL int hbGetAvailableZoneProperties(HbMachineType type,
HbZoneProperty props[12]);
//! 最大防区号根据型号不同而不同
ADEMCO_EXPORT_SYMBOL uint16_t hbZoneMax(HbMachineType type);
//! 防区号是否合法(可以包含0防区)
ADEMCO_EXPORT_SYMBOL int hbIsValidZone(HbMachineType type, uint16_t zone);
//! 防区号是否合法(不可以可以包含0防区)
ADEMCO_EXPORT_SYMBOL int hbIsValidZoneStrict(HbMachineType type, uint16_t zone);
//! 主机是否已投产使用
ADEMCO_EXPORT_SYMBOL int hbMachineIsSelling(HbMachineType type);
//! 主机是否具有布防功能
ADEMCO_EXPORT_SYMBOL int hbMachineCanArm(HbMachineType type);
//! 主机是否具有撤防功能
ADEMCO_EXPORT_SYMBOL int hbMachineCanDisarm(HbMachineType type);
//! 主机是否可以进入设置状态
ADEMCO_EXPORT_SYMBOL int hbMachineCanEnterSettings(HbMachineType type);
//! 主机是否具有半布防功能
ADEMCO_EXPORT_SYMBOL int hbMachineCanHalfArm(HbMachineType type);
//! 主机是否可以报告信号强度
ADEMCO_EXPORT_SYMBOL int hbMachineCanReportSignalStrength(HbMachineType type);
//! 主机本身是否可以短信报警(不算通过服务如阿里语音等)
ADEMCO_EXPORT_SYMBOL int hbMachineCanReportBySMS(HbMachineType type);
//! 主机是否支持有线防区
ADEMCO_EXPORT_SYMBOL int hbMachineHasWiredZone(HbMachineType type);
//! 主机最小有线防区号
ADEMCO_EXPORT_SYMBOL AdemcoZone hbWiredZoneMin(HbMachineType type);
//! 主机最大有线防区号
ADEMCO_EXPORT_SYMBOL AdemcoZone hbWiredZoneMax(HbMachineType type);
//! 主机是否可以直接写入防区数据(无需对码)
ADEMCO_EXPORT_SYMBOL int hbMachineCanDirectlyWriteZone(HbMachineType type);
//! 主机是否可以挂载分机
ADEMCO_EXPORT_SYMBOL int hbMachineCanLinkSubMachine(HbMachineType type);
//! 根据防区属性判断是否支持失联报告
//! 失联报告是主机侧实现的跟防区属性没关系,但是人为限制了只有以下属性的才可以设置
ADEMCO_EXPORT_SYMBOL int hbZonePropCanReportLost(HbZoneProperty zp);
ADEMCO_EXPORT_SYMBOL void hbInitMachineTimer(HbMachineTimer* timer);
ADEMCO_EXPORT_SYMBOL int hbIsValidTimePoint(HbMachineTimePoint* tp);
ADEMCO_EXPORT_SYMBOL void hbTimePointToGreenwich(HbMachineTimePoint* tp);
ADEMCO_EXPORT_SYMBOL void hbTimePointFromGreenwich(HbMachineTimePoint* tp);
ADEMCO_EXPORT_SYMBOL int hbIsValidTimer(HbTimer* timer);
ADEMCO_EXPORT_SYMBOL int hbIsValidMachineTimer(HbMachineTimer* timer);
//! 传输的是格林威治时间
ADEMCO_EXPORT_SYMBOL void hbMachineTimerToGreenwich(HbMachineTimer* timer);
ADEMCO_EXPORT_SYMBOL void hbMachineTimerFromGreenwich(HbMachineTimer* timer);
ADEMCO_EXPORT_SYMBOL AdemcoEvent hbMachineStatusToAdemcoEvent(HbMachineStatus status);
ADEMCO_EXPORT_SYMBOL HbMachineStatus hbMachineStatusFromAdemcoEvent(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL AdemcoEvent hbMachineTypeToAdemcoEvent(HbMachineType type);
ADEMCO_EXPORT_SYMBOL HbMachineType hbMachineTypeFromAdemcoEvent(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL AdemcoEvent hbZonePropertyToAdemcoEvent(HbZoneProperty zp);
ADEMCO_EXPORT_SYMBOL const char* hbMachineStatusToString(HbMachineStatus status);
ADEMCO_EXPORT_SYMBOL const char* hbMachineTypeToString(HbMachineType type);
ADEMCO_EXPORT_SYMBOL const char* hbZonePropertyToString(HbZoneProperty zp);
#ifdef ADEMCO_ENABLE_CHINESE
ADEMCO_EXPORT_SYMBOL const char* hbMachineStatusToStringChinese(HbMachineStatus status);
ADEMCO_EXPORT_SYMBOL const char* hbMachineTypeToStringChinese(HbMachineType type);
ADEMCO_EXPORT_SYMBOL const char* hbZonePropertyToStringChinese(HbZoneProperty zp);
#endif
ADEMCO_EXPORT_SYMBOL const char* hbGetZoneFormatString(HbMachineType type);
ADEMCO_EXPORT_SYMBOL
int hbGetAvailableZoneProperties(HbMachineType type, HbZoneProperty props[HZP_COUNT]);
// 最大防区号根据型号不同而不同
ADEMCO_EXPORT_SYMBOL
uint16_t hbZoneMax(HbMachineType type);
// 防区号是否合法(可以包含0防区)
ADEMCO_EXPORT_SYMBOL
int hbIsValidZone(HbMachineType type, uint16_t zone);
// 防区号是否合法(不可以可以包含0防区)
ADEMCO_EXPORT_SYMBOL
int hbIsValidZoneStrict(HbMachineType type, uint16_t zone);
// 主机是否已投产使用
ADEMCO_EXPORT_SYMBOL
int hbMachineIsSelling(HbMachineType type);
// 主机是否具有布防功能
ADEMCO_EXPORT_SYMBOL
int hbMachineCanArm(HbMachineType type);
// 主机是否具有撤防功能
ADEMCO_EXPORT_SYMBOL
int hbMachineCanDisarm(HbMachineType type);
// 主机是否可以进入设置状态
ADEMCO_EXPORT_SYMBOL
int hbMachineCanEnterSettings(HbMachineType type);
// 主机是否具有半布防功能
ADEMCO_EXPORT_SYMBOL
int hbMachineCanHalfArm(HbMachineType type);
// 主机是否可以报告信号强度
ADEMCO_EXPORT_SYMBOL
int hbMachineCanReportSignalStrength(HbMachineType type);
// 主机本身是否可以短信报警(不算通过服务如阿里语音等)
ADEMCO_EXPORT_SYMBOL
int hbMachineCanReportBySMS(HbMachineType type);
// 主机是否支持有线防区
ADEMCO_EXPORT_SYMBOL
int hbMachineHasWiredZone(HbMachineType type);
// 主机最小有线防区号
ADEMCO_EXPORT_SYMBOL
AdemcoZone hbWiredZoneMin(HbMachineType type);
// 主机最大有线防区号
ADEMCO_EXPORT_SYMBOL
AdemcoZone hbWiredZoneMax(HbMachineType type);
// 主机是否可以直接写入防区数据(无需对码)
ADEMCO_EXPORT_SYMBOL
int hbMachineCanDirectlyWriteZone(HbMachineType type);
// 主机是否可以挂载分机
ADEMCO_EXPORT_SYMBOL
int hbMachineCanLinkSubMachine(HbMachineType type);
// 根据防区属性判断是否支持失联报告
// 失联报告是主机侧实现的跟防区属性没关系,但是人为限制了只有以下属性的才可以设置
ADEMCO_EXPORT_SYMBOL
int hbZonePropCanReportLost(HbZoneProperty zp);
ADEMCO_EXPORT_SYMBOL
void hbInitMachineTimer(HbMachineTimer* timer);
ADEMCO_EXPORT_SYMBOL
int hbIsValidTimePoint(HbMachineTimePoint* tp);
ADEMCO_EXPORT_SYMBOL
void hbTimePointToGreenwich(HbMachineTimePoint* tp);
ADEMCO_EXPORT_SYMBOL
void hbTimePointFromGreenwich(HbMachineTimePoint* tp);
ADEMCO_EXPORT_SYMBOL
int hbIsValidTimer(HbTimer* timer);
ADEMCO_EXPORT_SYMBOL
int hbIsValidMachineTimer(HbMachineTimer* timer);
// 传输的是格林威治时间
ADEMCO_EXPORT_SYMBOL
void hbMachineTimerToGreenwich(HbMachineTimer* timer);
ADEMCO_EXPORT_SYMBOL
void hbMachineTimerFromGreenwich(HbMachineTimer* timer);
ADEMCO_EXPORT_SYMBOL
AdemcoEvent hbMachineStatusToAdemcoEvent(HbMachineStatus status);
ADEMCO_EXPORT_SYMBOL
HbMachineStatus hbMachineStatusFromAdemcoEvent(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL
AdemcoEvent hbMachineTypeToAdemcoEvent(HbMachineType type);
ADEMCO_EXPORT_SYMBOL
HbMachineType hbMachineTypeFromAdemcoEvent(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL
AdemcoEvent hbZonePropertyToAdemcoEvent(HbZoneProperty zp);
ADEMCO_EXPORT_SYMBOL
const char* hbMachineStatusToString(HbMachineStatus status);
ADEMCO_EXPORT_SYMBOL
const char* hbMachineTypeToString(HbMachineType type);
ADEMCO_EXPORT_SYMBOL
const char* hbZonePropertyToString(HbZoneProperty zp);
#if ADEMCO_ENABLE_CHINESE
ADEMCO_EXPORT_SYMBOL
const char* hbMachineStatusToStringChinese(HbMachineStatus status);
ADEMCO_EXPORT_SYMBOL
const char* hbMachineTypeToStringChinese(HbMachineType type);
ADEMCO_EXPORT_SYMBOL
const char* hbZonePropertyToStringChinese(HbZoneProperty zp);
#endif // ADEMCO_ENABLE_CHINESE
ADEMCO_EXPORT_SYMBOL
const char* hbGetZoneFormatString(HbMachineType type);
// 累加校验,计算data[0] ~ data[len-2],校验和放在data[len-1]
ADEMCO_EXPORT_SYMBOL void hbSum(uint8_t* data, size_t len);
ADEMCO_EXPORT_SYMBOL
void hbSum(uint8_t* data, size_t len);
// 校验和是否正确, 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
HbComRequestType hbComParseXDataRequest(const AdemcoXDataSegment* xdata,
HbComData* cd);
HbComRequestType hbComParseXDataRequest(const AdemcoXDataSegment* xdata, 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);
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 hbComMakeReqA1_getMachineZones(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComMakeReqA2_getMoreMachineZones(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComMakeReqA3_modifyMachineZone(HbComData* data,
ADEMCO_EXPORT_SYMBOL
void hbComMakeReqA0_getMachineStatus(HbComData* data);
ADEMCO_EXPORT_SYMBOL
void hbComMakeReqA1_getMachineZones(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 hbComMakeReqA5_getMachineTimer(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComMakeReqA7_setMachineTimer(HbComData* data,
HbMachineTimer* timer);
ADEMCO_EXPORT_SYMBOL
void hbComMakeReqA5_getMachineTimer(HbComData* data);
ADEMCO_EXPORT_SYMBOL
void hbComMakeReqA7_setMachineTimer(HbComData* data, HbMachineTimer* timer);
// TODO
// 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 hbComMakeReqA9(HbComData* data, HbMachineStatus status, HbMachineType type);
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 hbComMakeReqAD_getMoreMachineZoneLostConfig(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComMakeReqAC_getMachineZoneLostConfig(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComMakeReqAD_getMoreMachineZoneLostConfig(HbComData* data);
// p2 must be HbCom_3sec_arm or HbCom_3sec_disarm
ADEMCO_EXPORT_SYMBOL void hbComMakeReqAE_set3SectionMachineStatus(HbComData* data,
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 hbComMakeReqRead_acct(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComMakeReqWrite_acct(HbComData* data, const char* acct);
ADEMCO_EXPORT_SYMBOL
void hbComMakeReqB0_get3SectionMachineStatus(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComResp_A2_Iter_init(HbComResp_A2_Iter* iter,
const HbComData* com);
ADEMCO_EXPORT_SYMBOL
void hbComMakeReqRead_acct(HbComData* data);
ADEMCO_EXPORT_SYMBOL HbComResp_A2_p1 hbComResp_A2_Iter_next(HbComResp_A2_Iter* iter,
ADEMCO_EXPORT_SYMBOL
void hbComMakeReqWrite_acct(HbComData* data, const char* acct);
ADEMCO_EXPORT_SYMBOL
void hbComResp_A2_Iter_init(HbComResp_A2_Iter* iter, 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,
ADEMCO_EXPORT_SYMBOL
void hbComMakeRespA0_getMachineStatus(HbComData* data,
HbMachineStatus status,
HbMachineType type);
// zones and props length is count
// if count is 0, p1 wil be set to HbComResp_A2_p1_nomore
ADEMCO_EXPORT_SYMBOL void hbComMakeRespA2_getMachineZones(HbComData* data,
ADEMCO_EXPORT_SYMBOL
void hbComMakeRespA2_getMachineZones(HbComData* data,
size_t count,
AdemcoZone* zones,
HbZoneProperty* props,
HbComResp_A2_p1 p1);
// 学码开始,等待探测器无线信号中
ADEMCO_EXPORT_SYMBOL void hbComMakeRespA3_waitingSignal(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComMakeRespA4_modifyMachineZone(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 hbComMakeRespA6_getMachineTimer(HbComData* data,
HbMachineTimer* timer);
ADEMCO_EXPORT_SYMBOL
void hbComMakeRespA6_getMachineTimer(HbComData* data, HbMachineTimer* timer);
ADEMCO_EXPORT_SYMBOL
void hbComMakeRespA7_setMachineTimer(HbComData* data);
ADEMCO_EXPORT_SYMBOL
void hbComMakeRespA8_reject(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComMakeRespA7_setMachineTimer(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComMakeRespA8_reject(HbComData* data);
// TODO
// ADEMCO_EXPORT_SYMBOL void hbComMakeRespA9_(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComMakeRespAB_modifyMachineZoneLostConfig(HbComData* data,
ADEMCO_EXPORT_SYMBOL
void hbComMakeRespAB_modifyMachineZoneLostConfig(HbComData* data,
AdemcoZone zone,
HbComResp_AB_p2 p2);
// 返回所有失联开的防区
ADEMCO_EXPORT_SYMBOL void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* data,
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 hbComMakeRespAF_set3SectionMachineStatus(HbComData* data,
ADEMCO_EXPORT_SYMBOL
void hbComMakeRespAF_set3SectionMachineStatus(HbComData* data,
HbCom_3sec_which p1,
HbCom_3sec_status status);
ADEMCO_EXPORT_SYMBOL void hbComMakeRespB1_get3SectionMachineStatus(HbComData* data,
ADEMCO_EXPORT_SYMBOL
void hbComMakeRespB1_get3SectionMachineStatus(HbComData* data,
HbMachineStatus statusMachine,
HbMachineStatus statusSec1,
HbMachineStatus statusSec2,
HbMachineStatus statusSec3);
ADEMCO_EXPORT_SYMBOL void hbComDataToAdemcoXData(const HbComData* const data,
ADEMCO_EXPORT_SYMBOL
void hbComDataToAdemcoXData(const HbComData* const data,
AdemcoXDataSegment* xdata,
AdemcoXDataLengthFormat xlf,
AdemcoXDataTransform xtr);
......
......@@ -3,4 +3,5 @@ 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.c ..\
xcopy /i /s /y G:\dev_libs\ademco\hb\ademco_version.h ..\
xcopy /i /s /y G:\dev_libs\ademco\hb\ademco_config.h ..\
xcopy /i /s /y G:\dev_libs\ademco\hb\CHANGELOG.md ..\
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