Commit 80489de5 authored by captainwong's avatar captainwong

ademco version 1.0.0

parent 685b679d
/*
* Ademco library
* captainwong
* 2022-6-13 rewrited this C version
*/
* Ademco library
* captainwong
* 2022-6-13 rewrited this C version
*/
#include "ademco.h"
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#ifdef _DEBUG
#define dprintf printf
......@@ -22,6 +23,27 @@
dline; \
dprintf
#define ADEMCO_STRINGIFY(v) ADEMCO_STRINGIFY_HELPER(v)
#define ADEMCO_STRINGIFY_HELPER(v) #v
#define ADEMCO_VERSION_STRING_BASE ADEMCO_STRINGIFY(ADEMCO_VERSION_MAJOR) "." \
ADEMCO_STRINGIFY(ADEMCO_VERSION_MINOR) "." \
ADEMCO_STRINGIFY(ADEMCO_VERSION_PATCH)
#if ADEMCO_VERSION_IS_RELEASE
# define ADEMCO_VERSION_STRING ADEMCO_VERSION_STRING_BASE
#else
# define ADEMCO_VERSION_STRING ADEMCO_VERSION_STRING_BASE "-" ADEMCO_VERSION_SUFFIX
#endif
unsigned int ademcoVersion(void) {
return ADEMCO_VERSION_HEX;
}
const char* ademcoVersionString(void) {
return ADEMCO_VERSION_STRING;
}
static uint8_t hex2char(uint8_t h) {
h &= 0x0F;
if (h > 9)
......@@ -107,18 +129,30 @@ int ademcoIsEventNeedControlSource(AdemcoEvent ademcoEvent) {
AdemcoEvent ademcoGetExceptionEventByResumeEvent(AdemcoEvent resumeEvent) {
switch (resumeEvent) {
case EVENT_RECONNECT: return EVENT_DISCONNECT;
case EVENT_LOST_RECOVER: return EVENT_LOST;
case EVENT_SERIAL485CONN: return EVENT_SERIAL485DIS;
case EVENT_SUB_MACHINE_SENSOR_RESUME: return EVENT_SUB_MACHINE_SENSOR_EXCEPTION;
case EVENT_SUB_MACHINE_POWER_RESUME: return EVENT_SUB_MACHINE_POWER_EXCEPTION;
case EVENT_BATTERY_RECOVER: return EVENT_LOWBATTERY;
case EVENT_BATTERY_EXCEPTION_RECOVER: return EVENT_BATTERY_EXCEPTION;
case EVENT_OTHER_EXCEPTION_RECOVER: return EVENT_OTHER_EXCEPTION;
case EVENT_AC_RECOVER: return EVENT_AC_BROKE;
case EVENT_SOLARDISTURB_RECOVER: return EVENT_SOLARDISTURB;
case EVENT_BADBATTERY_RECOVER: return EVENT_BADBATTERY;
default: return EVENT_INVALID_EVENT;
case EVENT_RECONNECT:
return EVENT_DISCONNECT;
case EVENT_LOST_RECOVER:
return EVENT_LOST;
case EVENT_SERIAL485CONN:
return EVENT_SERIAL485DIS;
case EVENT_SUB_MACHINE_SENSOR_RESUME:
return EVENT_SUB_MACHINE_SENSOR_EXCEPTION;
case EVENT_SUB_MACHINE_POWER_RESUME:
return EVENT_SUB_MACHINE_POWER_EXCEPTION;
case EVENT_BATTERY_RECOVER:
return EVENT_LOWBATTERY;
case EVENT_BATTERY_EXCEPTION_RECOVER:
return EVENT_BATTERY_EXCEPTION;
case EVENT_OTHER_EXCEPTION_RECOVER:
return EVENT_OTHER_EXCEPTION;
case EVENT_AC_RECOVER:
return EVENT_AC_BROKE;
case EVENT_SOLARDISTURB_RECOVER:
return EVENT_SOLARDISTURB;
case EVENT_BADBATTERY_RECOVER:
return EVENT_BADBATTERY;
default:
return EVENT_INVALID_EVENT;
}
}
......@@ -149,7 +183,7 @@ AdemcoEventLevel ademcoGetEventLevel(AdemcoEvent ademcoEvent) {
case EVENT_SOLARDISTURB:
case EVENT_DISCONNECT:
case EVENT_LOST:
//case EVENT_DOORRINGING: //case EVENT_CONN_HANGUP: //case EVENT_CONN_RESUME:
// case EVENT_DOORRINGING: //case EVENT_CONN_HANGUP: //case EVENT_CONN_RESUME:
case EVENT_SUB_MACHINE_SENSOR_EXCEPTION:
case EVENT_SUB_MACHINE_POWER_EXCEPTION:
case EVENT_BATTERY_EXCEPTION:
......@@ -174,160 +208,42 @@ AdemcoEventLevel ademcoGetEventLevel(AdemcoEvent ademcoEvent) {
const char* ademcoEventToString(AdemcoEvent ademcoEvent) {
switch (ademcoEvent) {
case EVENT_ARM: return "ARM";
case EVENT_BURGLAR: return "BURGLAR";
case EVENT_DISARM: return "DISARM";
case EVENT_DURESS: return "DURESS";
case EVENT_EMERGENCY: return "EMERGENCY";
case EVENT_FIRE: return "FIRE";
case EVENT_GAS: return "GAS";
case EVENT_HALFARM: case EVENT_HALFARM_1456: return "HALFARM";
case EVENT_TAMPER: return "TAMPER";
case EVENT_ZONE_TAMPER: return "ZONE_TAMPER";
case EVENT_BYPASS: return "BYPASS";
case EVENT_BYPASS_RESUME: return "BYPASS_RESUME";
case EVENT_WATER: return "WATER";
case EVENT_AC_BROKE: return "AC BROKE";
case EVENT_AC_RECOVER: return "AC RECOVER";
case EVENT_LOWBATTERY: return "LOWBATTERY";
case EVENT_BATTERY_RECOVER: return "BATATTERY_RECOVER";
case EVENT_BADBATTERY: return "BADBATTERY";
case EVENT_BADBATTERY_RECOVER: return "BADBATTERY_RECOVER";
case EVENT_SOLARDISTURB: return "SOLARDISTURB";
case EVENT_SOLARDISTURB_RECOVER: return "SOLARDISTURB_RECOVER";
case EVENT_DISCONNECT: return "DISCONNECT";
case EVENT_RECONNECT: return "RECONNECT";
case EVENT_LOST: return "LOST";
case EVENT_LOST_RECOVER: return "LOST_RECOVER";
case EVENT_3100: return "LCD CLEAR EXCEPTION";
case EVENT_BATTERY_EXCEPTION: return "BATTERY_EXCEPTION";
case EVENT_BATTERY_EXCEPTION_RECOVER: return "BATTERY_EXCEPTION_RECOVER";
case EVENT_OTHER_EXCEPTION: return "OTHER_EXCEPTION";
case EVENT_OTHER_EXCEPTION_RECOVER: return "OTHER_EXCEPTION_RECOVER";
case EVENT_SERIAL485DIS: return "485DIS";
case EVENT_SERIAL485CONN: return "485CONN";
case EVENT_DOORRINGING: return "DOORRINGING";
case EVENT_CONN_HANGUP: return "CONN_HANGUP";
case EVENT_CONN_RESUME: return "CONN_RESUME";
case EVENT_DISARM_PWD_ERR: return "DISARM_PWD_ERR";
case EVENT_SUB_MACHINE_SENSOR_EXCEPTION: return "SUB_SENSOR_EXCEPTION";
case EVENT_SUB_MACHINE_SENSOR_RESUME: return "SUB_SENSOR_RESUME";
case EVENT_SUB_MACHINE_POWER_EXCEPTION: return "SUB_POWER_EXCEPTION";
case EVENT_SUB_MACHINE_POWER_RESUME: return "SUB_POWER_RESUME";
case EVENT_COM_PASSTHROUGH: return "COM_PASSTHROUGH";
case EVENT_ENTER_SET_MODE: return "ENTER_SET_MODE";
case EVENT_EXIT_SET_MODE: return "EXIT_SET_MODE";
case EVENT_QUERY_SUB_MACHINE: return "QUERY";
case EVENT_WRITE_TO_MACHINE: return "WRITE_TO_MACHINE";
case EVENT_I_AM_NET_MODULE: return "I_AM_NET_MODULE";
case EVENT_PHONE_USER_SOS: return "SOS";
case EVENT_PHONE_USER_CANCLE_ALARM: return "PHONE_USER_CANCLE_ALARM";
case EVENT_I_AM_GPRS: return "I_AM_GPRS_MACHINE";
case EVENT_I_AM_LCD_MACHINE: return "I_AM_LCD_MACHINE";
case EVENT_I_AM_WIRE_MACHINE: return "I_AM_WIRE_MACHINE";
case EVENT_I_AM_WIFI_MACHINE: return "I_AM_WIFI_MACHINE";
case EVENT_I_AM_3_SECTION_MACHINE: return "I_AM_3_SECTION_MACHINE";
case EVENT_I_AM_IOT_MACHINE: return "I_AM_IOT_MACHINE";
case EVENT_I_AM_TRUE_COLOR: return "I_AM_TRUE_COLOR";
case EVENT_I_AM_GPRS_IOT: return "I_AM_GPRS_IOT";
case EVENT_I_AM_GPRS_PHONE: return "I_AM_GPRS_PHONE";
case EVENT_I_AM_NB_MACHINE: return "I_AM_NB_MACHINE";
case EVENT_I_AM_WIFI2_MACHINE: return "I_AM_WIFI2_MACHINE";
case EVENT_SIM_IS_IOT_CARD: return "SIM card is IOT";
case EVENT_SIM_IS_IOT_PLATFORM_CARD: return "SIM card is Platform IOT";
case EVENT_SIM_IS_NOT_IOT_CARD: return "SIM card is not IOT";
case EVENT_ENTER_SETTING_MODE: return "ENTER_SETTING_MODE";
case EVENT_EXIT_SETTING_MODE: return "EXIT_SETTING_MODE";
case EVENT_RESTORE_FACTORY_SETTINGS_710:
case EVENT_RESTORE_FACTORY_SETTINGS: return "RESTORE_FACTORY_SETTINGS";
case EVENT_WHAT_IS_YOUR_TYPE: return "WHAT_IS_YOUR_TYPE";
case EVENT_SIGNAL_STRENGTH_CHANGED: return "SIGNAL_STRENGTH_CHANGED";
case EVENT_OFFLINE: return "EVENT_OFFLINE";
case EVENT_ONLINE: return "EVENT_ONLINE";
default: return "Undefined AdemcoEvent";
#define XX(name, code, zh) \
case EVENT_##name: \
return #name;
// ----标准安定宝协议事件----
ADEMCO_STATUS_EVENTS_MAP(XX)
ADEMCO_ALARM_EVENTS_MAP(XX)
ADEMCO_EXEPTION_EVENTS_MAP(XX)
ADEMCO_RESUME_EVENTS_MAP(XX)
// ---私有事件---------
ADEMCO_HB_EVENTS_MAP(XX)
#undef XX
default:
return "Undefined AdemcoEvent";
}
}
#ifdef ADEMCO_ENABLE_CHINESE
const char* ademcoEventToStringChinese(AdemcoEvent ademcoEvent) {
switch (ademcoEvent) {
case EVENT_ARM: return "布防";
case EVENT_BURGLAR: return "盗警";
case EVENT_DISARM: return "撤防";
case EVENT_DURESS: return "胁迫";
case EVENT_EMERGENCY: return "紧急报警";
case EVENT_FIRE: return "火警";
case EVENT_GAS: return "煤气";
case EVENT_HALFARM: case EVENT_HALFARM_1456: return "半布防";
case EVENT_TAMPER: return "防拆";
case EVENT_ZONE_TAMPER: return "防区防拆";
case EVENT_WATER: return "水警";
case EVENT_BYPASS: return "旁路";
case EVENT_BYPASS_RESUME: return "解除旁路";
case EVENT_AC_BROKE: return "主机AC掉电";
case EVENT_AC_RECOVER: return "主机AC恢复";
case EVENT_LOWBATTERY: return "低电";
case EVENT_BATTERY_RECOVER: return "复电";
case EVENT_BADBATTERY: return "坏电";
case EVENT_BADBATTERY_RECOVER: return "坏电恢复";
case EVENT_SOLARDISTURB: return "光扰";
case EVENT_SOLARDISTURB_RECOVER: return "光扰恢复";
case EVENT_DISCONNECT: return "失效";
case EVENT_RECONNECT: return "恢复";
case EVENT_LOST: return "失联";
case EVENT_LOST_RECOVER: return "恢复";
case EVENT_3100: return "液晶主机清除异常指示";
case EVENT_BATTERY_EXCEPTION: return "防区电源故障";
case EVENT_BATTERY_EXCEPTION_RECOVER: return "防区电源故障恢复";
case EVENT_OTHER_EXCEPTION: return "防区其他故障";
case EVENT_OTHER_EXCEPTION_RECOVER: return "防区其他故障恢复";
case EVENT_SERIAL485DIS: return "485断开";
case EVENT_SERIAL485CONN: return "485恢复";
case EVENT_DOORRINGING: return "门铃";
case EVENT_CONN_HANGUP: return "链路挂起";
case EVENT_CONN_RESUME: return "链路恢复";
case EVENT_DISARM_PWD_ERR: return "撤防密码错误";
case EVENT_SUB_MACHINE_SENSOR_EXCEPTION: return "分防区异常";
case EVENT_SUB_MACHINE_SENSOR_RESUME: return "分防区恢复";
case EVENT_SUB_MACHINE_POWER_EXCEPTION: return "分防区电源异常";
case EVENT_SUB_MACHINE_POWER_RESUME: return "分防区电源恢复";
case EVENT_COM_PASSTHROUGH: return "串口透传";
case EVENT_ENTER_SET_MODE: return "进入设置状态";
case EVENT_EXIT_SET_MODE: return "拒绝/停止设置";
case EVENT_QUERY_SUB_MACHINE: return "查询";
case EVENT_WRITE_TO_MACHINE: return "写入主机信息";
case EVENT_I_AM_NET_MODULE: return "我是网络模块";
case EVENT_PHONE_USER_SOS: return "手机用户SOS";
case EVENT_PHONE_USER_CANCLE_ALARM: return "手机用户消警";
case EVENT_I_AM_GPRS: return "我是GPRS主机";
case EVENT_I_AM_LCD_MACHINE: return "我是液晶主机";
case EVENT_I_AM_WIRE_MACHINE: return "我是网线主机";
case EVENT_I_AM_WIFI_MACHINE: return "我是WiFi主机";
case EVENT_I_AM_3_SECTION_MACHINE: return "我是三区段主机";
case EVENT_I_AM_IOT_MACHINE: return "我是物联卡主机";
case EVENT_I_AM_TRUE_COLOR: return "我是真彩主机";
case EVENT_I_AM_GPRS_IOT: return "我是简化版物联卡主机";
case EVENT_I_AM_GPRS_PHONE: return "我是GPRS主机能打电话";
case EVENT_I_AM_NB_MACHINE: return "我是NB报警接收主机";
case EVENT_I_AM_WIFI2_MACHINE: return "我是WiFi主机新版";
case EVENT_SIM_IS_IOT_CARD: return "SIM卡为物联卡";
case EVENT_SIM_IS_IOT_PLATFORM_CARD: return "SIM卡为平台物联卡";
case EVENT_SIM_IS_NOT_IOT_CARD: return "SIM卡为非物联卡";
case EVENT_ENTER_SETTING_MODE: return "主机进入设置状态";
case EVENT_EXIT_SETTING_MODE: return "主机退出设置状态";
case EVENT_RESTORE_FACTORY_SETTINGS_710:
case EVENT_RESTORE_FACTORY_SETTINGS: return "主机恢复出厂设置";
case EVENT_WHAT_IS_YOUR_TYPE: return "索要主机类型";
case EVENT_SIGNAL_STRENGTH_CHANGED: return "信号强度变化";
case EVENT_OFFLINE: return "上线";
case EVENT_ONLINE: return "离线";
default: return "未定义的安定宝事件";
#define XX(name, code, zh) \
case EVENT_##name: \
return zh;
// ----标准安定宝协议事件----
ADEMCO_STATUS_EVENTS_MAP(XX)
ADEMCO_ALARM_EVENTS_MAP(XX)
ADEMCO_EXEPTION_EVENTS_MAP(XX)
ADEMCO_RESUME_EVENTS_MAP(XX)
// ---私有事件---------
ADEMCO_HB_EVENTS_MAP(XX)
#undef XX
default:
return "未定义的安定宝事件";
}
}
#endif
......@@ -418,7 +334,7 @@ size_t ademcoAppendDataSegment(ademco_char_t* buff, const char* acct, AdemcoId a
*p++ = ']';
//assert(p - (char*)buff == ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN);
// assert(p - (char*)buff == ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN);
*p = '\0'; // for debug convenience
......@@ -437,7 +353,6 @@ size_t ademcoAppendDataSegment2(AdemcoDataSegment* dataSegment, const char* acct
ademcoEvent, gg, zone);
}
AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t packet_len,
AdemcoDataSegment* dataSegment, AdemcoParseError* err) {
if (packet_len == ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN &&
......@@ -457,7 +372,7 @@ AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t pac
break;
}
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);
......@@ -505,7 +420,8 @@ AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet, size_t pac
return RESULT_ERROR;
}
size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, const AdemcoDataSegment* dataSegment) {
size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len,
const AdemcoDataSegment* dataSegment) {
if (dataSegment->raw_len == ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN) {
if (fe100_len < 2) return 0;
fe100[0] = '\n';
......@@ -522,7 +438,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
*p++ = '0';
*p++ = ' ';
snprintf(p, fe100_len - (p - fe100), "%08d", dataSegment->ademcoId % 100000000);
snprintf(p,
fe100_len - (p - fe100),
"%08d",
dataSegment->ademcoId % 100000000);
p += 8;
*p++ = ' '; // 18
......@@ -546,7 +465,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
*p++ = 'B';
*p++ = '0';
} else {
snprintf(p, fe100_len - (p - fe100), "%03d", dataSegment->ademcoEvent % 1000);
snprintf(p,
fe100_len - (p - fe100),
"%03d",
dataSegment->ademcoEvent % 1000);
p += 3;
}
......@@ -560,7 +482,10 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
else
*p++ = 'C'; // zone event
snprintf(p, fe100_len - (p - fe100), "%03d", dataSegment->zone % 1000);
snprintf(p,
fe100_len - (p - fe100),
"%03d",
dataSegment->zone % 1000);
p += 3;
*p++ = ' ';
......@@ -571,12 +496,17 @@ size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len, c
}
void ademcoXDataInit(AdemcoXDataSegment* xdata) {
memset(xdata, 0, sizeof * xdata);
memset(xdata, 0, sizeof *xdata);
}
int ademcoXDataConvert(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf) {
if (!xdata) { return ADEMCO_ERR; }
if (xdata->lenghFormat == xlf) { return ADEMCO_OK; }
int ademcoXDataConvert(AdemcoXDataSegment* xdata,
AdemcoXDataLengthFormat xlf) {
if (!xdata) {
return ADEMCO_ERR;
}
if (xdata->lenghFormat == xlf) {
return ADEMCO_OK;
}
size_t len = ademcoXDataGetValidContentLen(xdata);
char raw[ADEMCO_PACKET_XDATA_MAX_LEN];
......@@ -585,11 +515,17 @@ int ademcoXDataConvert(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf) {
if (len + 6 > ADEMCO_PACKET_XDATA_MAX_LEN)
return ADEMCO_ERR;
xdata->raw[5 + ademcoXDataGetValidContentLen(xdata)] = '\0';
len = ademcoHexStrToArray((uint8_t*)raw, ademcoXDataGetValidContentAddr(xdata), 0x0F);
ademcoMakeXData(xdata, TWO_HEX, AdemcoXDataTransform_as_is, raw, len);
len = ademcoHexStrToArray((uint8_t*)raw,
ademcoXDataGetValidContentAddr(xdata),
0x0F);
ademcoMakeXData(xdata, TWO_HEX,
AdemcoXDataTransform_as_is,
raw, len);
} else {
memcpy(raw, ademcoXDataGetValidContentAddr(xdata), len);
ademcoMakeXData(xdata, FOUR_DECIMAL, AdemcoXDataTransform_to_ascii, raw, len);
ademcoMakeXData(xdata, FOUR_DECIMAL,
AdemcoXDataTransform_to_ascii,
raw, len);
}
return ADEMCO_OK;
}
......@@ -606,7 +542,8 @@ const char* ademcoXDataGetValidContentAddr(const AdemcoXDataSegment* xdata) {
return NULL;
}
int ademcoXDataMemcmp(const AdemcoXDataSegment* xdata, const void* buf, size_t buf_len) {
int ademcoXDataMemcmp(const AdemcoXDataSegment* xdata,
const void* buf, size_t buf_len) {
if (ademcoXDataGetValidContentLen(xdata) != buf_len) return 0;
const void* p = ademcoXDataGetValidContentAddr(xdata);
if (!p) return 0;
......@@ -622,7 +559,8 @@ size_t ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata) {
return 0;
}
size_t ademcoXDataCopy(AdemcoXDataSegment* dst, const AdemcoXDataSegment* src) {
size_t ademcoXDataCopy(AdemcoXDataSegment* dst,
const AdemcoXDataSegment* src) {
if (dst && src && src->raw_len > 0) {
memcpy(dst, src, sizeof(AdemcoXDataSegment));
return src->raw_len;
......@@ -630,8 +568,10 @@ size_t ademcoXDataCopy(AdemcoXDataSegment* dst, const AdemcoXDataSegment* src) {
return 0;
}
int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf,
AdemcoXDataTransform xtr, const ademco_char_t* content, size_t len) {
int ademcoMakeXData(AdemcoXDataSegment* xdata,
AdemcoXDataLengthFormat xlf,
AdemcoXDataTransform xtr,
const ademco_char_t* content, size_t len) {
char transformed[ADEMCO_PACKET_XDATA_MAX_LEN];
size_t translen;
len &= 0xFFFF;
......@@ -640,12 +580,14 @@ int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf,
if (xtr == AdemcoXDataTransform_as_is)
memcpy(transformed, content, len);
else if (len * 2 < ADEMCO_PACKET_XDATA_MAX_LEN)
translen = ademcoHexArrayToStr(transformed, (const uint8_t*)content, len) & 0xFFFF;
translen = ademcoHexArrayToStr(transformed,
(const uint8_t*)content, len) & 0xFFFF;
else
return ADEMCO_ERR;
xdata->lenghFormat = xlf;
if (xlf == TWO_HEX && translen + 4 < ADEMCO_PACKET_XDATA_MAX_LEN) {
if (xlf == TWO_HEX &&
translen + 4 < ADEMCO_PACKET_XDATA_MAX_LEN) {
ademco_char_t* p = xdata->raw;
*p++ = '[';
*p++ = (translen & 0xFFFF) >> 8;
......@@ -655,7 +597,8 @@ int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf,
*p++ = ']';
xdata->raw_len = p - xdata->raw;
return ADEMCO_OK;
} else if (xlf == FOUR_DECIMAL && translen + 6 < ADEMCO_PACKET_XDATA_MAX_LEN) {
} else if (xlf == FOUR_DECIMAL &&
translen + 6 < ADEMCO_PACKET_XDATA_MAX_LEN) {
ademco_char_t* p = xdata->raw;
*p++ = '[';
char temp[5];
......@@ -768,7 +711,6 @@ size_t ademcoMakeEmptyDataPacket(ademco_char_t* dst_buff, size_t len,
return 0;
}
size_t ademcoMakeAdmEmptyDataPacket(ademco_char_t* dst_buff, size_t len,
const char* id, uint16_t seq,
const char* acct, AdemcoId ademcoId) {
......@@ -819,24 +761,43 @@ size_t ademcoMakeAdmEmptyDataPacket(ademco_char_t* dst_buff, size_t len,
return 0;
}
size_t ademcoMakeNullPacket(ademco_char_t* buff, size_t len, uint16_t seq, const char* acct, AdemcoId ademcoId) {
return ademcoMakeEmptyDataPacket(buff, len, ADEMCO_PACKET_ID_NULL, seq, acct, ademcoId);
size_t ademcoMakeNullPacket(ademco_char_t* buff, size_t len,
uint16_t seq, const char* acct,
AdemcoId ademcoId) {
return ademcoMakeEmptyDataPacket(buff, len,
ADEMCO_PACKET_ID_NULL,
seq, acct, ademcoId);
}
size_t ademcoMakeAdmNullPacket(ademco_char_t* buff, size_t len, uint16_t seq, const char* acct, AdemcoId ademcoId) {
return ademcoMakeAdmEmptyDataPacket(buff, len, ADEMCO_PACKET_ID_NULL, seq, acct, ademcoId);
size_t ademcoMakeAdmNullPacket(ademco_char_t* buff, size_t len,
uint16_t seq, const char* acct,
AdemcoId ademcoId) {
return ademcoMakeAdmEmptyDataPacket(buff, len,
ADEMCO_PACKET_ID_NULL,
seq, acct, ademcoId);
}
size_t ademcoMakeAckPacket(ademco_char_t* buff, size_t len, uint16_t seq, const char* acct, AdemcoId ademcoId) {
return ademcoMakeEmptyDataPacket(buff, len, ADEMCO_PACKET_ID_ACK, seq, acct, ademcoId);
size_t ademcoMakeAckPacket(ademco_char_t* buff, size_t len,
uint16_t seq, const char* acct,
AdemcoId ademcoId) {
return ademcoMakeEmptyDataPacket(buff, len,
ADEMCO_PACKET_ID_ACK,
seq, acct, ademcoId);
}
size_t ademcoMakeNakPacket(ademco_char_t* buff, size_t len, uint16_t seq, const char* acct, AdemcoId ademcoId) {
return ademcoMakeEmptyDataPacket(buff, len, ADEMCO_PACKET_ID_NAK, seq, acct, ademcoId);
size_t ademcoMakeNakPacket(ademco_char_t* buff, size_t len,
uint16_t seq, const char* acct,
AdemcoId ademcoId) {
return ademcoMakeEmptyDataPacket(buff, len,
ADEMCO_PACKET_ID_NAK,
seq, acct, ademcoId);
}
size_t ademcoMakeHbPacket(ademco_char_t* dst_buff, size_t len, uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone, const AdemcoXDataSegment* xdata) {
size_t ademcoMakeHbPacket(ademco_char_t* dst_buff, size_t len,
uint16_t seq, const char* acct,
AdemcoId ademcoId, AdemcoEvent ademcoEvent,
AdemcoGG gg, AdemcoZone zone,
const AdemcoXDataSegment* xdata) {
char buff[ADEMCO_PACKET_MAX_LEN];
char* p = buff;
char* pcrc = buff + 1;
......@@ -887,8 +848,10 @@ size_t ademcoMakeHbPacket(ademco_char_t* dst_buff, size_t len, uint16_t seq, con
return 0;
}
size_t ademcoMakeAdmPacket(ademco_char_t* dst_buff, size_t len, uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone, const AdemcoXDataSegment* xdata) {
size_t ademcoMakeAdmPacket(ademco_char_t* dst_buff, size_t len,
uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone,
const AdemcoXDataSegment* xdata) {
char buff[ADEMCO_PACKET_MAX_LEN];
char* p = buff;
char* pcrc = buff + 1;
......@@ -950,32 +913,40 @@ static void copyAcct2AdemcoPacket(AdemcoPacket* pkt, const char* acct) {
pkt->acct[0] = '\0';
}
size_t ademcoMakeNullPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId) {
size_t ademcoMakeNullPacket2(AdemcoPacket* pkt, uint16_t seq,
const char* acct, AdemcoId ademcoId) {
pkt->seq = seq;
copyAcct2AdemcoPacket(pkt, acct);
pkt->data.ademcoId = ademcoId;
pkt->id = AID_NULL;
return pkt->raw_len = ademcoMakeNullPacket(pkt->raw, sizeof(pkt->raw), seq, acct, ademcoId);
return pkt->raw_len = ademcoMakeNullPacket(pkt->raw, sizeof(pkt->raw),
seq, acct, ademcoId);
}
size_t ademcoMakeAckPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId) {
size_t ademcoMakeAckPacket2(AdemcoPacket* pkt, uint16_t seq,
const char* acct, AdemcoId ademcoId) {
pkt->seq = seq;
copyAcct2AdemcoPacket(pkt, acct);
pkt->data.ademcoId = ademcoId;
pkt->id = AID_ACK;
return pkt->raw_len = ademcoMakeAckPacket(pkt->raw, sizeof(pkt->raw), seq, acct, ademcoId);
return pkt->raw_len = ademcoMakeAckPacket(pkt->raw, sizeof(pkt->raw),
seq, acct, ademcoId);
}
size_t ademcoMakeNakPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId) {
size_t ademcoMakeNakPacket2(AdemcoPacket* pkt, uint16_t seq,
const char* acct, AdemcoId ademcoId) {
pkt->seq = seq;
copyAcct2AdemcoPacket(pkt, acct);
pkt->data.ademcoId = ademcoId;
pkt->id = AID_NAK;
return pkt->raw_len = ademcoMakeNakPacket(pkt->raw, sizeof(pkt->raw), seq, acct, ademcoId);
return pkt->raw_len = ademcoMakeNakPacket(pkt->raw, sizeof(pkt->raw),
seq, acct, ademcoId);
}
size_t ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone, const AdemcoXDataSegment* xdata) {
size_t ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq,
const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone,
const AdemcoXDataSegment* xdata) {
pkt->seq = seq;
copyAcct2AdemcoPacket(pkt, acct);
ademcoAppendDataSegment2(&pkt->data, acct, ademcoId, ademcoEvent, gg, zone);
......@@ -987,11 +958,14 @@ size_t ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, Ad
memset(&pkt->xdata, 0, sizeof(*xdata));
pkt->id = AID_HB;
return pkt->raw_len = ademcoMakeHbPacket(pkt->raw, sizeof(pkt->raw),
seq, acct, ademcoId, ademcoEvent, gg, zone, xdata);
seq, acct, ademcoId, ademcoEvent,
gg, zone, xdata);
}
size_t ademcoMakeAdmPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone, const AdemcoXDataSegment* xdata) {
size_t ademcoMakeAdmPacket2(AdemcoPacket* pkt, uint16_t seq,
const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone,
const AdemcoXDataSegment* xdata) {
pkt->seq = seq;
copyAcct2AdemcoPacket(pkt, acct);
ademcoAppendDataSegment2(&pkt->data, acct, ademcoId, ademcoEvent, gg, zone);
......@@ -1003,13 +977,16 @@ size_t ademcoMakeAdmPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, A
memset(&pkt->xdata, 0, sizeof(*xdata));
pkt->id = AID_ADM_CID;
return pkt->raw_len = ademcoMakeAdmPacket(pkt->raw, sizeof(pkt->raw),
seq, acct, ademcoId, ademcoEvent, gg, zone, xdata);
seq, acct, ademcoId, ademcoEvent,
gg, zone, xdata);
}
AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
AdemcoPacket* pkt, size_t* cb_commited,
AdemcoParseError* err) {
if (len < 9) { return RESULT_NOT_ENOUGH; }
if (len < 9) {
return RESULT_NOT_ENOUGH;
}
do {
const char* p = buff;
if (*p++ != ADEMCO_PACKET_PREFIX) {
......@@ -1062,7 +1039,9 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
break;
}
p = pid + 1;
while (p < pcr && *p != '\"') { p++; }
while (p < pcr && *p != '\"') {
p++;
}
if (p >= pcr || *p != '\"') {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "p >= pcr || *p != '\"'");
......@@ -1077,20 +1056,27 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
// seq
const char* pseq = p;
while (p < pcr && *p != 'R' && *p != 'L') { p++; }
while (p < pcr && *p != 'R' && *p != 'L') {
p++;
}
if (p - pseq != 4 || (*p != 'R' && *p != 'L')) {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "p - pseq != 4 || (*p != 'R' && *p != 'L')");
break;
}
memcpy(temp, pseq, 4); temp[4] = '\0';
memcpy(temp, pseq, 4);
temp[4] = '\0';
pkt->seq = strtoul(temp, NULL, 10) & 0xFFFF;
if (pkt->seq >= 10000) { pkt->seq = 0; }
if (pkt->seq >= 10000) {
pkt->seq = 0;
}
// *rrcvr
if (*p == 'R') { // rrcvr exists
//const char* prcvr = p;
while (p < pcr && *p != 'L' && *p != '#') { p++; }
// const char* prcvr = p;
while (p < pcr && *p != 'L' && *p != '#') {
p++;
}
if (p >= pcr || (*p != 'L' && *p != '#')) {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "p >= pcr || (*p != 'L' && *p != '#')");
......@@ -1111,7 +1097,9 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
ADEMCO_FILL_PARSE_ERROR(err, "LPREF not found");
break;
}
while (p < pcr && *p != '#') { p++; }
while (p < pcr && *p != '#') {
p++;
}
// only check if format is correct, ignore it's content
if (p >= pcr || *p != '#') {
dline;
......@@ -1144,13 +1132,18 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
// data
const char* pdata = p;
while (p < pcr && *p != ']') { p++; }
while (p < pcr && *p != ']') {
p++;
}
if (p >= pcr || *p != ']') {
dline;
ADEMCO_FILL_PARSE_ERROR(err, "data's ] not found");
break;
}
if (ademcoParseDataSegment(pdata, ++p - pdata, &pkt->data, err) != RESULT_OK) { dline; break; }
if (ademcoParseDataSegment(pdata, ++p - pdata, &pkt->data, err) != RESULT_OK) {
dline;
break;
}
// *xdata
if (*p == '[') { // xdata exists
......@@ -1162,7 +1155,8 @@ AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff, size_t len,
xlf = TWO_HEX;
if (xlf == FOUR_DECIMAL) {
memcpy(temp, pxdata + 1, 4); temp[4] = '\0';
memcpy(temp, pxdata + 1, 4);
temp[4] = '\0';
valid_len = strtoul(temp, NULL, 16);
p += 4 + valid_len;
} else {
......@@ -1225,10 +1219,14 @@ size_t ademcoHiLoArrayToDecStr(ademco_char_t* str, const uint8_t* arr, size_t le
char* p = str;
for (size_t i = 0; i < len; i++) {
char c = (arr[i] >> 4) & 0x0F;
if (c > 9) { return p - str; }
if (c > 9) {
return p - str;
}
*p++ = c + '0';
c = (arr[i] & 0x0F);
if (c > 9) { return p - str; }
if (c > 9) {
return p - str;
}
*p++ = c + '0';
}
return p - str;
......@@ -1319,7 +1317,6 @@ size_t ademcoDecStrToHiLoArray2(uint8_t* arr, size_t len, const char* str) {
return len;
}
size_t ademcoHexArrayToStr(char* str, const uint8_t* arr, size_t len) {
char* p = str;
for (size_t i = 0; i < len; i++) {
......@@ -1349,7 +1346,8 @@ size_t ademcoHexStrToArray(uint8_t* arr, const char* str, uint8_t padding) {
return p - arr;
}
size_t ademcoHexStrToArrayN(uint8_t* arr, const char* str, size_t len, uint8_t padding) {
size_t ademcoHexStrToArrayN(uint8_t* arr, const char* str,
size_t len, uint8_t padding) {
uint8_t* p = arr;
uint8_t hi = 0, lo = 0;
padding &= 0x0F;
......@@ -1368,7 +1366,10 @@ size_t ademcoHexStrToArrayN(uint8_t* arr, const char* str, size_t len, uint8_t p
return p - arr;
}
size_t ademcoHexStrToArrayN_allow_non_hex_str(uint8_t* arr, const char* str, size_t len, uint8_t padding) {
size_t ademcoHexStrToArrayN_allow_non_hex_str(uint8_t* arr,
const char* str,
size_t len,
uint8_t padding) {
uint8_t* p = arr;
uint8_t hi = 0, lo = 0;
padding &= 0x0F;
......
/*
* Ademco library
* captainwong
* 2022-6-13 rewrited this C version
*/
#ifndef __ADEMCO_H__
#define __ADEMCO_H__
......@@ -28,6 +22,8 @@
#include <stdint.h>
#include <time.h>
#include "ademco_version.h"
#ifdef __cplusplus
extern "C" {
#endif
......@@ -90,188 +86,112 @@ static inline int ademcoIsValidZoneStrict(AdemcoZone zone) {
#define ADEMCO_SIGNAL_STRENGTH_MIN 0
#define ADEMCO_SIGNAL_STRENGTH_MAX 31
// 主机或分机状态报告
#define ADEMCO_STATUS_EVENTS_MAP(XX) \
XX(ARM, 3400, "布防") \
XX(DISARM, 1400, "撤防") \
XX(HALFARM, 3456, "半布防") \
XX(HALFARM_1456, 1456, "半布防") \
XX(EMERGENCY, 1120, "紧急报警")
// 防区报警
#define ADEMCO_ALARM_EVENTS_MAP(XX) \
XX(BURGLAR, 1130, "盗警") \
XX(DOORRINGING, 1134, "门铃") \
XX(FIRE, 1110, "火警") \
XX(DURESS, 1121, "胁迫") \
XX(GAS, 1151, "煤气") \
XX(WATER, 1113, "水警") \
XX(TAMPER, 1137, "主机防拆") \
XX(ZONE_TAMPER, 1383, "防区防拆") \
XX(BYPASS, 1570, "旁路")
// 防区异常
#define ADEMCO_EXEPTION_EVENTS_MAP(XX) \
XX(AC_BROKE, 1301, "主机AC掉电") \
XX(LOWBATTERY, 1302, "低电") \
XX(BADBATTERY, 1311, "坏电") \
XX(SOLARDISTURB, 1387, "光扰") \
XX(DISCONNECT, 1381, "失效") \
XX(LOST, 1393, "失联") \
XX(BATTERY_EXCEPTION, 1384, "电源故障") \
XX(OTHER_EXCEPTION, 1380, "其他故障")
// 防区异常恢复
#define ADEMCO_RESUME_EVENTS_MAP(XX) \
XX(BYPASS_RESUME, 3570, "解除旁路") \
XX(AC_RECOVER, 3301, "主机AC复电") \
XX(BATTERY_RECOVER, 3302, "低电恢复") \
XX(BADBATTERY_RECOVER, 3311, "坏电恢复") \
XX(SOLARDISTURB_RECOVER, 3387, "光扰恢复") \
XX(RECONNECT, 3381, "失效恢复") \
XX(LOST_RECOVER, 3393, "失联恢复") \
XX(BATTERY_EXCEPTION_RECOVER, 3384, "电源故障恢复") \
XX(OTHER_EXCEPTION_RECOVER, 3380, "其他故障恢复") \
XX(CLEAR_EXCPTION, 3100, "清除异常指示")
// 恒博自定义安定宝事件码
#define ADEMCO_HB_EVENTS_MAP(XX) \
XX(SERIAL485DIS, 1485, "485断开") \
XX(SERIAL485CONN, 3485, "485连接") \
XX(CONN_HANGUP, 1700, "链路挂起") \
XX(CONN_RESUME, 3700, "链路恢复") \
XX(DISARM_PWD_ERR, 1701, "撤防密码错误") \
XX(SUB_MACHINE_SENSOR_EXCEPTION, 1702, "分机探头异常") \
XX(SUB_MACHINE_SENSOR_RESUME, 3702, "分机探头恢复") \
XX(SUB_MACHINE_POWER_EXCEPTION, 1703, "分机电源异常") \
XX(SUB_MACHINE_POWER_RESUME, 3703, "分机电源恢复") \
XX(COM_PASSTHROUGH, 1704, "串口透传") \
XX(ENTER_SET_MODE, 2704, "进入设置状态") \
XX(EXIT_SET_MODE, 3704, "退出设置状态") \
XX(QUERY_SUB_MACHINE, 1705, "查询分机信息") \
XX(WRITE_TO_MACHINE, 1706, "写入主机信息") \
XX(I_AM_NET_MODULE, 1707, "主机类型--网络模块") \
XX(I_AM_GPRS, 1717, "主机类型--GPRS主机") \
XX(I_AM_LCD_MACHINE, 1727, "主机类型--液晶主机") \
XX(I_AM_WIRE_MACHINE, 1737, "主机类型--网线主机") \
XX(I_AM_WIFI_MACHINE, 1747, "主机类型--WiFi主机(停用)") \
XX(I_AM_3_SECTION_MACHINE, 1757, "主机类型--三区段主机") \
XX(I_AM_IOT_MACHINE, 1767, "主机类型--物联卡主机") \
XX(I_AM_TRUE_COLOR, 1777, "主机类型--真彩主机") \
XX(I_AM_GPRS_IOT, 1787, "主机类型--物联卡主机") \
XX(I_AM_GPRS_PHONE, 1797, "主机类型--GRPS主机带电话功能") \
XX(I_AM_NB_MACHINE, 1807, "主机类型--NB报警接收主机") \
XX(I_AM_WIFI2_MACHINE, 1817, "主机类型--WiFi主机(新版)") \
XX(PHONE_USER_SOS, 1709, "手机用户SOS") \
XX(PHONE_USER_CANCLE_ALARM, 1711, "手机用户消警") \
XX(ENTER_SETTING_MODE, 1712, "主机进入设置状态") \
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(WHAT_IS_YOUR_TYPE, 1798, "索要主机类型") \
XX(SIGNAL_STRENGTH_CHANGED, 1799, "主机信号强度变化,强度值编码后以 xdata 传输") \
XX(OFFLINE, 1944, "主机断线") \
XX(ONLINE, 1946, "主机上线")
// Ademco events
typedef enum AdemcoEvent {
EVENT_INVALID_EVENT = 0,
// -------------------标准安定宝协议事件--------------------------------
// 主机或分机状态报告
EVENT_ARM = 3400, // 布防
EVENT_DISARM = 1400, // 撤防
EVENT_HALFARM_1456 = 1456, // 半布防
EVENT_HALFARM = 3456, // 半布防
EVENT_EMERGENCY = 1120, // 紧急报警
// 防区报警
EVENT_BURGLAR = 1130, // 盗警
EVENT_DOORRINGING = 1134, // 门铃
EVENT_FIRE = 1110, // 火警
EVENT_DURESS = 1121, // 胁迫
EVENT_GAS = 1151, // 煤气
EVENT_WATER = 1113, // 水警
EVENT_TAMPER = 1137, // 主机防拆
EVENT_ZONE_TAMPER = 1383, // 防区防拆
EVENT_BYPASS = 1570, // 旁路
EVENT_BYPASS_RESUME = 3570, // 解除旁路
// 防区异常
EVENT_AC_BROKE = 1301, // 主机AC掉电
EVENT_AC_RECOVER = 3301, // 主机AC复电
EVENT_LOWBATTERY = 1302, // 低电
EVENT_BATTERY_RECOVER = 3302, // 复电
EVENT_BADBATTERY = 1311, // 坏电
EVENT_BADBATTERY_RECOVER = 3311, // 坏电恢复
EVENT_SOLARDISTURB = 1387, // 光扰
EVENT_SOLARDISTURB_RECOVER = 3387, // 光扰恢复
EVENT_DISCONNECT = 1381, // 失效
EVENT_RECONNECT = 3381, // 恢复
EVENT_BATTERY_EXCEPTION = 1384, // 电源故障
EVENT_BATTERY_EXCEPTION_RECOVER = 3384, // 电源故障恢复
EVENT_OTHER_EXCEPTION = 1380, // 其他故障
EVENT_OTHER_EXCEPTION_RECOVER = 3380, // 其他故障恢复
EVENT_LOST = 1393, // 失联
EVENT_LOST_RECOVER = 3393, // 失联恢复
// 标准事件,但不做处理
EVENT_3100 = 3100, // 液晶主机清除异常指示
// ------------------私有事件-----------------------------------------
EVENT_SERIAL485DIS = 1485, // 网络模块与主机485串口连接断开
EVENT_SERIAL485CONN = 3485, // 网络模块与主机485串口连接恢复
EVENT_CONN_HANGUP = 1700, // 链路挂起
EVENT_CONN_RESUME = 3700, // 链路恢复
EVENT_DISARM_PWD_ERR = 1701, // 撤防密码错误
EVENT_SUB_MACHINE_SENSOR_EXCEPTION = 1702, // 分机探头异常
EVENT_SUB_MACHINE_SENSOR_RESUME = 3702, // 分机探头恢复
EVENT_SUB_MACHINE_POWER_EXCEPTION = 1703, // 分机电源异常
EVENT_SUB_MACHINE_POWER_RESUME = 3703, // 分机电源恢复
EVENT_COM_PASSTHROUGH = 1704, // 串口透传
EVENT_ENTER_SET_MODE = 2704, // 进入设置状态
EVENT_EXIT_SET_MODE = 3704, // 接警中心发送,为停止索要;报警主机发送,为拒绝索要
EVENT_QUERY_SUB_MACHINE = 1705, // 查询分机信息
EVENT_WRITE_TO_MACHINE = 1706, // 写入主机信息
EVENT_I_AM_NET_MODULE = 1707, // 主机类型--网络模块
EVENT_I_AM_GPRS = 1717, // 主机类型--GPRS主机
EVENT_I_AM_LCD_MACHINE = 1727, // 主机类型--液晶主机
EVENT_I_AM_WIRE_MACHINE = 1737, // 主机类型--网线主机
EVENT_I_AM_WIFI_MACHINE = 1747, // 主机类型--WiFi主机(停用)
EVENT_I_AM_3_SECTION_MACHINE = 1757, // 主机类型--三区段主机
EVENT_I_AM_IOT_MACHINE = 1767, // 主机类型--物联卡主机
EVENT_I_AM_TRUE_COLOR = 1777, // 主机类型--真彩主机
EVENT_I_AM_GPRS_IOT = 1787, // 主机类型--物联卡主机
EVENT_I_AM_GPRS_PHONE = 1797, // 主机类型--GRPS主机带电话功能
EVENT_I_AM_NB_MACHINE = 1807, // 主机类型--NB报警接收主机
EVENT_I_AM_WIFI2_MACHINE = 1817, // 主机类型--WiFi主机(新版)
EVENT_PHONE_USER_SOS = 1709, // 手机用户SOS
EVENT_PHONE_USER_CANCLE_ALARM = 1711, // 手机用户消警
EVENT_ENTER_SETTING_MODE = 1712, // 主机进入设置状态
EVENT_EXIT_SETTING_MODE = 3712, // 主机退出设置状态
EVENT_RESTORE_FACTORY_SETTINGS_710 = 1710, // 主机恢复出厂设置
EVENT_RESTORE_FACTORY_SETTINGS = 1713, // 主机恢复出厂设置
// 此处电话设置仅为主机自身支持的电话设置,与阿里语音无关
EVENT_SIM_IS_IOT_CARD = 1756, // 主机SIM卡为物联卡,禁用主机侧电话设置
EVENT_SIM_IS_IOT_PLATFORM_CARD = 2756, // 主机SIM卡为平台物联卡,禁用主机侧电话设置
EVENT_SIM_IS_NOT_IOT_CARD = 3756, // 主机SIM卡为非物联卡,启用主机侧电话设置
EVENT_WHAT_IS_YOUR_TYPE = 1798, // 索要主机类型
EVENT_SIGNAL_STRENGTH_CHANGED = 1799, // 主机信号强度变化,强度值编码后以 xdata 传输
// 2021年1月24日17:06:55修改,对标丛文3B0 3B2
EVENT_OFFLINE = 1944, // 主机断线
EVENT_ONLINE = 1946, // 主机上线
#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)
// ---私有事件---------
ADEMCO_HB_EVENTS_MAP(XX)
#undef XX
#define ADEMCO_EVENT_SENTINEL 10000
} AdemcoEvent;
static const AdemcoEvent AdemcoEvents[] = {
EVENT_ARM,
EVENT_DISARM,
EVENT_HALFARM,
EVENT_EMERGENCY,
EVENT_BURGLAR,
EVENT_DOORRINGING,
EVENT_FIRE,
EVENT_DURESS,
EVENT_GAS,
EVENT_WATER,
EVENT_TAMPER,
EVENT_ZONE_TAMPER,
EVENT_BYPASS,
EVENT_BYPASS_RESUME,
EVENT_AC_BROKE,
EVENT_AC_RECOVER,
EVENT_LOWBATTERY,
EVENT_BATTERY_RECOVER,
EVENT_BADBATTERY,
EVENT_BADBATTERY_RECOVER,
EVENT_SOLARDISTURB,
EVENT_SOLARDISTURB_RECOVER,
EVENT_DISCONNECT,
EVENT_RECONNECT,
EVENT_LOST,
EVENT_LOST_RECOVER,
EVENT_3100,
EVENT_BATTERY_EXCEPTION,
EVENT_BATTERY_EXCEPTION_RECOVER,
EVENT_OTHER_EXCEPTION,
EVENT_OTHER_EXCEPTION_RECOVER,
EVENT_SERIAL485DIS,
EVENT_SERIAL485CONN,
EVENT_CONN_HANGUP,
EVENT_CONN_RESUME,
EVENT_DISARM_PWD_ERR,
EVENT_SUB_MACHINE_SENSOR_EXCEPTION,
EVENT_SUB_MACHINE_SENSOR_RESUME,
EVENT_SUB_MACHINE_POWER_EXCEPTION,
EVENT_SUB_MACHINE_POWER_RESUME,
EVENT_COM_PASSTHROUGH,
EVENT_ENTER_SET_MODE,
EVENT_EXIT_SET_MODE,
EVENT_QUERY_SUB_MACHINE,
EVENT_WRITE_TO_MACHINE,
EVENT_I_AM_NET_MODULE,
EVENT_I_AM_GPRS,
EVENT_I_AM_LCD_MACHINE,
EVENT_I_AM_WIRE_MACHINE,
EVENT_I_AM_WIFI_MACHINE,
EVENT_I_AM_3_SECTION_MACHINE,
EVENT_I_AM_IOT_MACHINE,
EVENT_I_AM_TRUE_COLOR,
EVENT_I_AM_GPRS_IOT,
EVENT_I_AM_GPRS_PHONE,
EVENT_I_AM_NB_MACHINE,
EVENT_I_AM_WIFI2_MACHINE,
EVENT_SIM_IS_IOT_CARD,
EVENT_SIM_IS_IOT_PLATFORM_CARD,
EVENT_SIM_IS_NOT_IOT_CARD,
EVENT_PHONE_USER_SOS,
EVENT_PHONE_USER_CANCLE_ALARM,
EVENT_ENTER_SETTING_MODE,
EVENT_EXIT_SETTING_MODE,
EVENT_RESTORE_FACTORY_SETTINGS,
EVENT_WHAT_IS_YOUR_TYPE,
EVENT_SIGNAL_STRENGTH_CHANGED,
};
// 安定宝事件级别
typedef enum AdemcoEventLevel {
EVENT_LEVEL_NULL,
......@@ -372,6 +292,8 @@ 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);
......@@ -379,20 +301,28 @@ ADEMCO_EXPORT_SYMBOL uint8_t ademcoDecodeSignalStrength(uint8_t code);
//////////////////////// AdemcoEvent functions ////////////////////////
//! 是否合法主机账号
ADEMCO_EXPORT_SYMBOL int ademcoIsValidAccount(const char* acct);
ADEMCO_EXPORT_SYMBOL
int ademcoIsValidAccount(const char* acct);
//! 是否主机状态事件
ADEMCO_EXPORT_SYMBOL int ademcoIsMachineStatusEvent(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL
int ademcoIsMachineStatusEvent(AdemcoEvent ademcoEvent);
//! 是否主机类型事件
ADEMCO_EXPORT_SYMBOL int ademcoIsMachineTypeEvent(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL
int ademcoIsMachineTypeEvent(AdemcoEvent ademcoEvent);
//! 事件是否需要控制源
ADEMCO_EXPORT_SYMBOL int ademcoIsEventNeedControlSource(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL
int ademcoIsEventNeedControlSource(AdemcoEvent ademcoEvent);
//! 获取安定宝事件级别
ADEMCO_EXPORT_SYMBOL AdemcoEventLevel ademcoGetEventLevel(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL
AdemcoEventLevel ademcoGetEventLevel(AdemcoEvent ademcoEvent);
//! 获取异常恢复事件所对应的异常事件
ADEMCO_EXPORT_SYMBOL AdemcoEvent ademcoGetExceptionEventByResumeEvent(AdemcoEvent resumeEvent);
ADEMCO_EXPORT_SYMBOL const char* ademcoEventToString(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL
AdemcoEvent ademcoGetExceptionEventByResumeEvent(AdemcoEvent resumeEvent);
ADEMCO_EXPORT_SYMBOL
const char* ademcoEventToString(AdemcoEvent ademcoEvent);
#ifdef ADEMCO_ENABLE_CHINESE
ADEMCO_EXPORT_SYMBOL const char* ademcoEventToStringChinese(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL
const char* ademcoEventToStringChinese(AdemcoEvent ademcoEvent);
#endif
//////////////////////// AdemcoDataSegment functions ////////////////////////
......@@ -415,39 +345,62 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoAppendDataSegment2(AdemcoDataSegment* dataSegm
//! 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,
ADEMCO_EXPORT_SYMBOL
AdemcoParseResult ademcoParseDataSegment(const ademco_char_t* packet,
size_t packet_len,
AdemcoDataSegment* dataSegment,
AdemcoParseError* err);
// return 0 for empty packet, CONGWIN_FE100_PACKET_LEN for success
ADEMCO_EXPORT_SYMBOL size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100, size_t fe100_len,
ADEMCO_EXPORT_SYMBOL
size_t ademcoDataSegmentToCongwinFe100(ademco_char_t* fe100,
size_t fe100_len,
const AdemcoDataSegment* dataSegment);
//////////////////////// AdemcoXDataSegment functions ////////////////////////
// init a empty 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])
ADEMCO_EXPORT_SYMBOL const char* ademcoXDataGetValidContentAddr(const AdemcoXDataSegment* xdata);
ADEMCO_EXPORT_SYMBOL
const char* ademcoXDataGetValidContentAddr(const AdemcoXDataSegment* xdata);
#endif
// get valid content length of xdata (except [len])
ADEMCO_EXPORT_SYMBOL size_t ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata);
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, const void* buf, size_t buf_len);
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, const AdemcoXDataSegment* src);
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, AdemcoXDataLengthFormat xlf,
AdemcoXDataTransform xtr, const ademco_char_t* content, size_t len);
ADEMCO_EXPORT_SYMBOL int ademcoMakeXData(AdemcoXDataSegment* xdata,
AdemcoXDataLengthFormat xlf,
AdemcoXDataTransform xtr,
const ademco_char_t* content,
size_t len);
//////////////////////// AdemcoPacketId functions ////////////////////////
ADEMCO_EXPORT_SYMBOL int isAdemcoPacketId(const char* standard, const char* id, size_t len);
ADEMCO_EXPORT_SYMBOL AdemcoPacketId getAdemcoPacketId(const char* id, size_t len);
ADEMCO_EXPORT_SYMBOL int isAdemcoPacketId(const char* standard,
const char* id,
size_t len);
ADEMCO_EXPORT_SYMBOL AdemcoPacketId getAdemcoPacketId(const char* id,
size_t len);
ADEMCO_EXPORT_SYMBOL const char* ademcoPacketIdToString(AdemcoPacketId id);
/*
......@@ -456,58 +409,104 @@ ADEMCO_EXPORT_SYMBOL const char* ademcoPacketIdToString(AdemcoPacketId id);
* otherwise return 0
*/
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 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, 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,
size_t len,
const char* id,
uint16_t seq,
const char* acct,
AdemcoId ademcoId);
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 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, size_t len,
uint16_t seq, const char* acct, AdemcoId ademcoId);
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, size_t len,
uint16_t seq, const char* acct, AdemcoId ademcoId);
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, size_t len,
uint16_t seq, const char* acct, AdemcoId ademcoId);
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, size_t len,
uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone,
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeHbPacket(ademco_char_t* buff,
size_t len,
uint16_t seq,
const char* acct,
AdemcoId ademcoId,
AdemcoEvent ademcoEvent,
AdemcoGG gg,
AdemcoZone zone,
const AdemcoXDataSegment* xdata);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeAdmPacket(ademco_char_t* buff, size_t len,
uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone,
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeAdmPacket(ademco_char_t* buff,
size_t len,
uint16_t seq,
const char* acct,
AdemcoId ademcoId,
AdemcoEvent ademcoEvent,
AdemcoGG gg,
AdemcoZone zone,
const AdemcoXDataSegment* xdata);
// like upper funcs, store buff and len to pkt->raw, pkt->raw_len
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeNullPacket2(AdemcoPacket* pkt,
uint16_t seq, const char* acct, AdemcoId ademcoId);
uint16_t seq,
const char* acct,
AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeAckPacket2(AdemcoPacket* pkt,
uint16_t seq, const char* acct, AdemcoId ademcoId);
uint16_t seq,
const char* acct,
AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeNakPacket2(AdemcoPacket* pkt,
uint16_t seq, const char* acct, AdemcoId ademcoId);
uint16_t seq,
const char* acct,
AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeHbPacket2(AdemcoPacket* pkt,
uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone,
uint16_t seq,
const char* acct,
AdemcoId ademcoId,
AdemcoEvent ademcoEvent,
AdemcoGG gg,
AdemcoZone zone,
const AdemcoXDataSegment* xdata);
ADEMCO_EXPORT_SYMBOL size_t ademcoMakeAdmPacket2(AdemcoPacket* pkt,
uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone,
uint16_t seq,
const char* acct,
AdemcoId ademcoId,
AdemcoEvent ademcoEvent,
AdemcoGG gg,
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, size_t len,
AdemcoPacket* pkt, size_t* cb_commited,
ADEMCO_EXPORT_SYMBOL AdemcoParseResult ademcoPacketParse(const ademco_char_t* buff,
size_t len,
AdemcoPacket* pkt,
size_t* cb_commited,
AdemcoParseError* err);
/* CRC16 implementation according to ARC
......@@ -521,7 +520,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,否则停止
......@@ -529,7 +529,9 @@ ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC16(const ademco_char_t* buff, size_t len)
// 注意:函数不会在str末尾补 null terminator
// 调用者应确保str有足够空间,至少len的2倍,否则会崩溃
// 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101"
ADEMCO_EXPORT_SYMBOL size_t ademcoHiLoArrayToDecStr(ademco_char_t* str, const uint8_t* arr, size_t len);
ADEMCO_EXPORT_SYMBOL size_t ademcoHiLoArrayToDecStr(ademco_char_t* str,
const uint8_t* arr,
size_t len);
// 将一串以高低字节表示的十六进制数组转换为字符串
// 每个字节的高四位和低四位若不大于9,将该四位表示的数字以10进制ascii码填入str,否则:
......@@ -539,27 +541,41 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoHiLoArrayToDecStr(ademco_char_t* str, const ui
// 调用者应确保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, const uint8_t* arr, size_t len);
ADEMCO_EXPORT_SYMBOL size_t ademcoHiLoArrayToDecStr2(ademco_char_t* str,
const uint8_t* arr,
size_t len);
// 将一个10进制数字符串转为高低字节表示的数组,节省空间
// str应只包含'0'~'9',否则失败返回0
// str长度若大于len * 2,str[len]及之后的内容将被舍弃以避免溢出
// 转换后的长度若不满len,则以0xF补满。
// 示例:输入字符串"123ABC",返回0
// 示例:输入字符串 "18240888101", len=9, 则arr内容为 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff, return 9
// 示例:输入字符串 "12345678901234567890", len=9, 则arr内容为 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78, return 9
// 示例:输入字符串 "18240888101", len=9, 则arr内容为
// 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff
// return 9
// 示例:输入字符串 "12345678901234567890", len=9, 则arr内容为
// 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78
// return 9
// 示例:输入NULL,返回 9个 0xFF
ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray(uint8_t* arr, size_t len, const char* str);
ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray(uint8_t* arr,
size_t len,
const char* str);
// 将一个16进制数字符串转为高低字节表示的数组,节省空间
// str应只包含'0'~'9', 'A'~'F', 'a'~'f',否则失败返回0
// str长度若大于len * 2,str[len]及之后的内容将被舍弃以避免溢出
// 转换后的长度若不满len,则以0xF补满。
// 示例:输入字符串"123ABC",len=6, 则 arr 内容为 0x12 0x3a 0xbc 0xff 0xff 0xff
// 示例:输入字符串 "18240888101", len=9, 则arr内容为 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff, return 9
// 示例:输入字符串 "12345678901234567890", len=9, 则arr内容为 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78, return 9
// 示例:输入字符串 "18240888101", len=9, 则arr内容为
// 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff
// return 9
// 示例:输入字符串 "12345678901234567890", len=9, 则arr内容为
// 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78
// return 9
// 示例:输入NULL,返回 9个 0xFF
ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray2(uint8_t* arr, size_t len, const char* str);
ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray2(uint8_t* arr,
size_t len,
const char* str);
// 将一串字节流转换为可打印形式
// 返回str长度(len * 2)
......@@ -567,7 +583,9 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoDecStrToHiLoArray2(uint8_t* arr, size_t len, c
// 注意:函数不会在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, const uint8_t* arr, size_t len);
ADEMCO_EXPORT_SYMBOL size_t ademcoHexArrayToStr(char* str,
const uint8_t* arr,
size_t len);
// 将一串字符串(内容为'0'~'9', 'A'~'F', 'a' ~'f')转为字节流
// 若strlen(str)为奇数,以padding补足arr, padding 应 <= 0x0F
......@@ -576,17 +594,25 @@ ADEMCO_EXPORT_SYMBOL size_t ademcoHexArrayToStr(char* str, const uint8_t* arr, s
// 示例:输入字符串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, const char* str, uint8_t padding);
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, const char* str, size_t len, uint8_t padding);
ADEMCO_EXPORT_SYMBOL size_t ademcoHexStrToArrayN(uint8_t* arr,
const char* str,
size_t len, uint8_t padding);
// 同ademcoHexStrToArrayN,但允许str包含非hex字符,即'0'~'9','a'~'f','A'~'F'之外的内容,以 padding 替换
// 同ademcoHexStrToArrayN,但允许str包含非hex字符,
// 即'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, const char* str, size_t len, uint8_t padding);
ADEMCO_EXPORT_SYMBOL size_t ademcoHexStrToArrayN_allow_non_hex_str(uint8_t* arr,
const char* str,
size_t len,
uint8_t padding);
#ifdef __cplusplus
}
......
#ifndef __ADEMCO_VERSION_H__
#define __ADEMCO_VERSION_H__
/*
* Versions with the same major number are ABI stable. API is allowed to
* evolve between minor releases, but only in a backwards compatible way.
*/
#define ADEMCO_VERSION_MAJOR 1
#define ADEMCO_VERSION_MINOR 0
#define ADEMCO_VERSION_PATCH 0
#define ADEMCO_VERSION_IS_RELEASE 1
#define ADEMCO_VERSION_SUFFIX ""
#define ADEMCO_VERSION_HEX ((ADEMCO_VERSION_MAJOR << 16) | \
(ADEMCO_VERSION_MINOR << 8) | \
(ADEMCO_VERSION_PATCH))
#endif /* __ADEMCO_VERSION_H__ */
......@@ -25,109 +25,38 @@ const char* print_bool(bool b) {
}
AdemcoEvent statusEvents[] = {
// 主机或分机状态报告
EVENT_ARM,
EVENT_DISARM,
EVENT_HALFARM_1456,
EVENT_HALFARM,
EVENT_EMERGENCY,
#define XX(name, code, zh) EVENT_##name,
ADEMCO_STATUS_EVENTS_MAP(XX)
#undef XX
};
AdemcoEvent alarmEvents[] = {
// 防区报警
EVENT_BURGLAR,
EVENT_DOORRINGING,
EVENT_FIRE,
EVENT_DURESS,
EVENT_GAS,
EVENT_WATER,
EVENT_TAMPER,
EVENT_ZONE_TAMPER,
EVENT_BYPASS,
EVENT_BYPASS_RESUME,
#define XX(name, code, zh) EVENT_##name,
ADEMCO_ALARM_EVENTS_MAP(XX)
#undef XX
};
AdemcoEvent excepEvents[] = {
// 防区异常
EVENT_AC_BROKE,
EVENT_AC_RECOVER,
EVENT_LOWBATTERY,
EVENT_BATTERY_RECOVER,
EVENT_BADBATTERY,
EVENT_BADBATTERY_RECOVER,
EVENT_SOLARDISTURB,
EVENT_SOLARDISTURB_RECOVER,
EVENT_DISCONNECT,
EVENT_RECONNECT,
EVENT_BATTERY_EXCEPTION,
EVENT_BATTERY_EXCEPTION_RECOVER,
EVENT_OTHER_EXCEPTION,
EVENT_OTHER_EXCEPTION_RECOVER,
EVENT_LOST,
EVENT_LOST_RECOVER,
// 标准事件,但不做处理
EVENT_3100,
#define XX(name, code, zh) EVENT_##name,
ADEMCO_EXEPTION_EVENTS_MAP(XX)
ADEMCO_RESUME_EVENTS_MAP(XX)
#undef XX
};
AdemcoEvent privateEvents[] = {
#define XX(name, code, zh) EVENT_##name,
ADEMCO_HB_EVENTS_MAP(XX)
#undef XX
};
// ------------------私有事件-----------------------------------------
EVENT_SERIAL485DIS,
EVENT_SERIAL485CONN,
EVENT_CONN_HANGUP,
EVENT_CONN_RESUME,
EVENT_DISARM_PWD_ERR,
EVENT_SUB_MACHINE_SENSOR_EXCEPTION ,
EVENT_SUB_MACHINE_SENSOR_RESUME,
EVENT_SUB_MACHINE_POWER_EXCEPTION,
EVENT_SUB_MACHINE_POWER_RESUME,
EVENT_COM_PASSTHROUGH,
EVENT_ENTER_SET_MODE,
EVENT_EXIT_SET_MODE,
EVENT_QUERY_SUB_MACHINE,
EVENT_WRITE_TO_MACHINE,
EVENT_I_AM_NET_MODULE,
EVENT_I_AM_GPRS,
EVENT_I_AM_LCD_MACHINE,
EVENT_I_AM_WIRE_MACHINE,
EVENT_I_AM_WIFI_MACHINE,
EVENT_I_AM_3_SECTION_MACHINE,
EVENT_I_AM_IOT_MACHINE,
EVENT_I_AM_TRUE_COLOR,
EVENT_I_AM_GPRS_IOT,
EVENT_I_AM_GPRS_PHONE,
EVENT_I_AM_NB_MACHINE,
EVENT_I_AM_WIFI2_MACHINE,
EVENT_PHONE_USER_SOS,
EVENT_PHONE_USER_CANCLE_ALARM,
EVENT_ENTER_SETTING_MODE,
EVENT_EXIT_SETTING_MODE,
EVENT_RESTORE_FACTORY_SETTINGS_710,
EVENT_RESTORE_FACTORY_SETTINGS,
EVENT_SIM_IS_IOT_CARD,
EVENT_SIM_IS_IOT_PLATFORM_CARD,
EVENT_SIM_IS_NOT_IOT_CARD,
EVENT_WHAT_IS_YOUR_TYPE,
EVENT_SIGNAL_STRENGTH_CHANGED,
EVENT_OFFLINE,
EVENT_ONLINE,
AdemcoEvent allEvents[] = {
#define XX(name, code, zh) EVENT_##name,
ADEMCO_STATUS_EVENTS_MAP(XX)
ADEMCO_ALARM_EVENTS_MAP(XX)
ADEMCO_EXEPTION_EVENTS_MAP(XX)
ADEMCO_RESUME_EVENTS_MAP(XX)
ADEMCO_HB_EVENTS_MAP(XX)
#undef XX
};
void printEvents(const AdemcoEvent* events, size_t len)
......@@ -239,7 +168,7 @@ void print_machineTypes()
printf("|事件码类型|主机类型|布防|撤防|半布防|设置|信号强度|防区|有线防区|SMS|内核|网络|型号|\n"
"|---------|-------|----|----|-----|----|-------|----|-------|---|----|---|----|\n");
for (auto e : AdemcoEvents) {
for (auto e : allEvents) {
if (ademcoIsMachineTypeEvent(e)) {
auto t = hbMachineTypeFromAdemcoEvent(e);
if(!hbMachineIsSelling(t)) continue;
......@@ -275,7 +204,7 @@ void print_imgs()
"|---|--------|\n");
std::map<std::string, std::string> imgs;
for (auto e : AdemcoEvents) {
for (auto e : allEvents) {
if (ademcoIsMachineTypeEvent(e)) {
auto t = hbMachineTypeFromAdemcoEvent(e);
if (!hbMachineIsSelling(t)) continue;
......@@ -350,8 +279,7 @@ void print_available_zone_props()
}
printf("|\n");
for (auto e : AdemcoEvents) {
for (auto e : allEvents) {
if (ademcoIsMachineTypeEvent(e)) {
auto t = hbMachineTypeFromAdemcoEvent(e);
if (!hbMachineIsSelling(t)) continue;
......
#include "hb_com.h"
#include <string.h>
int hbGetAvailableZoneProperties(HbMachineType type, HbZoneProperty props[12]) {
int hbGetAvailableZoneProperties(HbMachineType type,
HbZoneProperty props[12]) {
switch (type) {
case HMT_WIFI:
break;
......@@ -11,60 +12,88 @@ int hbGetAvailableZoneProperties(HbMachineType type, HbZoneProperty props[12]) {
case HMT_GPRS:
case HMT_WIFI2:
{
HbZoneProperty hzps[] = { HZP_BUGLAR, HZP_EMERGENCY, HZP_FIRE, HZP_DURESS, HZP_GAS, HZP_WATER, HZP_REMOTE_CONTROL, };
HbZoneProperty hzps[] = {
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:
{
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, };
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,
};
memcpy(props, hzps, sizeof(hzps));
return sizeof(hzps) / sizeof(HbZoneProperty);
}
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 };
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
};
memcpy(props, hzps, sizeof(hzps));
return sizeof(hzps) / sizeof(HbZoneProperty);
}
case HMT_WIRED:
{
HbZoneProperty hzps[] = { HZP_BUGLAR, HZP_EMERGENCY, HZP_FIRE, HZP_DURESS, HZP_GAS, HZP_WATER, HZP_REMOTE_CONTROL, };
HbZoneProperty hzps[] = {
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:
{
HbZoneProperty hzps[] = { HZP_BUGLAR, HZP_EMERGENCY, HZP_FIRE, HZP_DURESS, HZP_GAS, HZP_WATER, HZP_REMOTE_CONTROL,
HZP_SHIELD, HZP_DOOR_RING, HZP_BYPASS };
HbZoneProperty hzps[] = {
HZP_BUGLAR, HZP_EMERGENCY, HZP_FIRE,
HZP_DURESS, HZP_GAS, HZP_WATER, HZP_REMOTE_CONTROL,
HZP_SHIELD, HZP_DOOR_RING, HZP_BYPASS
};
memcpy(props, hzps, sizeof(hzps));
return sizeof(hzps) / sizeof(HbZoneProperty);
}
case HMT_3_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 };
HbZoneProperty hzps[] = {
HZP_BUGLAR, HZP_EMERGENCY, HZP_FIRE,
HZP_DURESS, HZP_GAS, HZP_WATER, HZP_REMOTE_CONTROL,
HZP_SHIELD, HZP_DOOR_RING, HZP_BYPASS
};
memcpy(props, hzps, sizeof(hzps));
return sizeof(hzps) / sizeof(HbZoneProperty);
}
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 };
HbZoneProperty hzps[] = {
HZP_BUGLAR, HZP_EMERGENCY, HZP_FIRE,
HZP_DURESS, HZP_GAS, HZP_WATER, HZP_REMOTE_CONTROL,
HZP_SHIELD, HZP_DOOR_RING, HZP_BYPASS
};
memcpy(props, hzps, sizeof(hzps));
return sizeof(hzps) / sizeof(HbZoneProperty);
}
case HMT_GPRS_PHONE:
{
HbZoneProperty hzps[] = { HZP_BUGLAR, HZP_EMERGENCY, HZP_FIRE, HZP_DURESS, HZP_GAS, HZP_WATER, HZP_REMOTE_CONTROL, };
HbZoneProperty hzps[] = {
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:
{
HbZoneProperty hzps[] = { HZP_BUGLAR, HZP_EMERGENCY, HZP_FIRE, HZP_DURESS, HZP_GAS, HZP_WATER, HZP_DOOR_RING, };
HbZoneProperty hzps[] = {
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);
}
......@@ -107,7 +136,8 @@ uint16_t hbZoneMax(HbMachineType type) {
}
int hbIsValidZone(HbMachineType type, uint16_t zone) {
return ADEMCO_ZONE_FOR_MACHINE_SELF <= zone && zone <= hbZoneMax(type);
return ADEMCO_ZONE_FOR_MACHINE_SELF <= zone &&
zone <= hbZoneMax(type);
}
int hbIsValidZoneStrict(HbMachineType type, uint16_t zone) {
......@@ -215,8 +245,9 @@ void hbInitMachineTimer(HbMachineTimer* timer) {
}
int hbIsValidTimePoint(HbMachineTimePoint* tp) {
return tp && 0 <= tp->hour && tp->hour < 24 &&
0 <= tp->minute && tp->minute < 60;
return tp &&
tp->hour < 24 &&
tp->minute < 60;
}
void hbTimePointToGreenwich(HbMachineTimePoint* tp) {
......@@ -230,11 +261,15 @@ void hbTimePointFromGreenwich(HbMachineTimePoint* tp) {
}
int hbIsValidTimer(HbTimer* timer) {
return timer && hbIsValidTimePoint(&timer->armAt) && hbIsValidTimePoint(&timer->disarmAt);
return timer &&
hbIsValidTimePoint(&timer->armAt) &&
hbIsValidTimePoint(&timer->disarmAt);
}
int hbIsValidMachineTimer(HbMachineTimer* timer) {
return timer && hbIsValidTimer(&timer->timer[0]) && hbIsValidTimer(&timer->timer[1]);
return timer &&
hbIsValidTimer(&timer->timer[0]) &&
hbIsValidTimer(&timer->timer[1]);
}
void hbMachineTimerToGreenwich(HbMachineTimer* timer) {
......@@ -464,7 +499,9 @@ int hbCheckSum(const uint8_t* data, size_t len) {
memcpy(cd->data, data, len & 0xFF); \
}
HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* cd) {
HbComRequestType hbComParseRequest(const uint8_t* data,
size_t len,
HbComData* cd) {
do {
if (len < 5) { break; }
if (data[0] != 0xEB) { break; }
......@@ -536,7 +573,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
if (data[3] == 0x09 &&
data[4] == 0xA3 &&
len == HbComReq_A3_len) { // EB CB 3F 09 A3 P1 P2 P3 SUM
len == HbComReq_A3_len) {
// EB CB 3F 09 A3 P1 P2 P3 SUM
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComReq_A3;
......@@ -550,7 +588,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
}
} else if (data[3] == 0x0E &&
data[4] == 0xA7 &&
len == HbComReq_A7_len) { // EB CB 3F 0E A7 H1 M1 H2 M2 H3 M3 H4 M4 SUM
len == HbComReq_A7_len) {
// EB CB 3F 0E A7 H1 M1 H2 M2 H3 M3 H4 M4 SUM
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComReq_A7;
......@@ -564,7 +603,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
else if (data[3] == 0x08 &&
data[4] == 0xAA &&
len == HbComReq_AA_len) { // EB CB 3F 08 AA P1 P2 SUM
len == HbComReq_AA_len) {
// EB CB 3F 08 AA P1 P2 SUM
if (hbCheckSum(data, len)) {
copy_data_to_com;
return HbComReq_AA;
......@@ -578,7 +618,8 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
else if (data[3] == 0x06 && data[4] == 0xB0 &&
len == HbComReq_B0_len &&
memcmp(HbComReq_B0_data, data, len) == 0) { // EB CB 3F 06 B0 AB
memcmp(HbComReq_B0_data, data, len) == 0) {
// EB CB 3F 06 B0 AB
copy_data_to_com;
return HbComReq_B0;
}
......@@ -588,14 +629,19 @@ HbComRequestType hbComParseRequest(const uint8_t* data, size_t len, HbComData* c
return HbComReq_Invalid;
}
ADEMCO_EXPORT_SYMBOL HbComRequestType hbComParseXDataRequest(const AdemcoXDataSegment* xdata,
HbComRequestType hbComParseXDataRequest(const AdemcoXDataSegment* xdata,
HbComData* cd) {
if (!xdata) { return HbComReq_Invalid; }
return hbComParseRequest((const uint8_t*)ademcoXDataGetValidContentAddr(xdata),
ademcoXDataGetValidContentLen(xdata), cd);
return hbComParseRequest(
(const uint8_t*)ademcoXDataGetValidContentAddr(xdata),
ademcoXDataGetValidContentLen(xdata),
cd
);
}
HbComResponseType hbComParseResponse(const uint8_t* data, size_t len, HbComData* 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; }
......@@ -720,8 +766,11 @@ HbComResponseType hbComParseResponse(const uint8_t* data, size_t len, HbComData*
HbComResponseType hbComParseXDataResponse(const AdemcoXDataSegment* xdata,
HbComData* cd) {
if (!xdata) { return HbComResp_Invalid; }
return hbComParseResponse((const uint8_t*)ademcoXDataGetValidContentAddr(xdata),
ademcoXDataGetValidContentLen(xdata), cd);
return hbComParseResponse(
(const uint8_t*)ademcoXDataGetValidContentAddr(xdata),
ademcoXDataGetValidContentLen(xdata),
cd
);
}
void hbComMakeReqA0_getMachineStatus(HbComData* data) {
......@@ -739,8 +788,10 @@ void hbComMakeReqA2_getMoreMachineZones(HbComData* data) {
data->len = HbComReq_A2_len;
}
void hbComMakeReqA3_modifyMachineZone(HbComData* data, uint8_t zone,
HbZoneProperty prop, HbComReq_A3_op op) {
void hbComMakeReqA3_modifyMachineZone(HbComData* data,
uint8_t zone,
HbZoneProperty prop,
HbComReq_A3_op op) {
memcpy(data->data, HbComReq_A3_head, 5);
data->data[5] = zone;
data->data[6] = prop;
......@@ -754,14 +805,17 @@ void hbComMakeReqA5_getMachineTimer(HbComData* data) {
data->len = HbComReq_A5_len;
}
void hbComMakeReqA7_setMachineTimer(HbComData* data, HbMachineTimer* timer) {
void hbComMakeReqA7_setMachineTimer(HbComData* data,
HbMachineTimer* timer) {
memcpy(data->data, HbComReq_A7_head, 5);
memcpy(data->data + 5, timer, sizeof(*timer));
data->len = HbComReq_A7_len;
hbSum(data->data, data->len);
}
void hbComMakeReqAA_modifyMachineZoneLostConfig(HbComData* data, uint8_t zone, int on) {
void hbComMakeReqAA_modifyMachineZoneLostConfig(HbComData* data,
uint8_t zone,
int on) {
memcpy(data->data, HbComReq_AA_head, 5);
data->data[5] = zone;
data->data[6] = !!on;
......@@ -779,7 +833,8 @@ void hbComMakeReqAD_getMoreMachineZoneLostConfig(HbComData* data) {
data->len = HbComReq_AD_len;
}
void hbComMakeReqAE_set3SectionMachineStatus(HbComData* data, HbCom_3sec_which p1,
void hbComMakeReqAE_set3SectionMachineStatus(HbComData* data,
HbCom_3sec_which p1,
HbCom_3sec_status status) {
memcpy(data->data, HbComReq_AE_head, 5);
data->data[5] = p1;
......@@ -805,7 +860,8 @@ void hbComMakeReqWR_acct(HbComData* data, const char* acct) {
hbSum(data->data, data->len);
}
void hbComResp_A2_Iter_init(HbComResp_A2_Iter* iter, const HbComData* com) {
void hbComResp_A2_Iter_init(HbComResp_A2_Iter* iter,
const HbComData* com) {
if (!iter || !com)return;
memcpy(&iter->com, com, sizeof(HbComData));
iter->i = 0;
......@@ -820,7 +876,8 @@ void hbComResp_A2_Iter_init(HbComResp_A2_Iter* iter, const HbComData* com) {
}
}
HbComResp_A2_p1 hbComResp_A2_Iter_next(HbComResp_A2_Iter* iter, HbZoneAndProperty* zp) {
HbComResp_A2_p1 hbComResp_A2_Iter_next(HbComResp_A2_Iter* iter,
HbZoneAndProperty* zp) {
if (iter->i == iter->total)
return HbComResp_A2_p1_nomore;
zp->zone = iter->com.data[6 + iter->i * 2];
......@@ -829,7 +886,8 @@ HbComResp_A2_p1 hbComResp_A2_Iter_next(HbComResp_A2_Iter* iter, HbZoneAndPropert
return HbComResp_A2_p1_more;
}
void hbComMakeRespA0_getMachineStatus(HbComData* data, HbMachineStatus status,
void hbComMakeRespA0_getMachineStatus(HbComData* data,
HbMachineStatus status,
HbMachineType type) {
memcpy(data->data, HbComResp_A0_head, 6);
data->data[6] = status;
......@@ -838,8 +896,11 @@ void hbComMakeRespA0_getMachineStatus(HbComData* data, HbMachineStatus status,
hbSum(data->data, data->len);
}
void hbComMakeRespA2_getMachineZones(HbComData* data, size_t count, AdemcoZone* zones,
HbZoneProperty* props, HbComResp_A2_p1 p1) {
void hbComMakeRespA2_getMachineZones(HbComData* data,
size_t count,
AdemcoZone* zones,
HbZoneProperty* props,
HbComResp_A2_p1 p1) {
if (count > HbComResp_A2_max_zone) { return; }
memcpy(data->data, HbComResp_A2_head, 6);
data->data[3] = (HbComResp_A2_len_min + count * 2) & 0xFF;
......@@ -858,8 +919,10 @@ void hbComMakeRespA3_waitingSignal(HbComData* data) {
data->len = HbComResp_A3_len;
}
void hbComMakeRespA4_modifyMachineZone(HbComData* data, AdemcoZone zone,
HbZoneProperty prop, HbComResp_A4_p3 p3) {
void hbComMakeRespA4_modifyMachineZone(HbComData* data,
AdemcoZone zone,
HbZoneProperty prop,
HbComResp_A4_p3 p3) {
memcpy(data->data, HbComResp_A4_head, 6);
data->data[6] = zone & 0xFF;
data->data[7] = prop;
......@@ -868,7 +931,8 @@ void hbComMakeRespA4_modifyMachineZone(HbComData* data, AdemcoZone zone,
hbSum(data->data, data->len);
}
void hbComMakeRespA6_getMachineTimer(HbComData* data, HbMachineTimer* timer) {
void hbComMakeRespA6_getMachineTimer(HbComData* data,
HbMachineTimer* timer) {
memcpy(data->data, HbComResp_A6_head, 6);
memcpy(data->data + 6, timer->data, sizeof(*timer));
data->len = HbComResp_A6_len;
......@@ -885,7 +949,8 @@ void hbComMakeRespA8_reject(HbComData* data) {
data->len = HbComResp_A8_len;
}
void hbComMakeRespAB_modifyMachineZoneLostConfig(HbComData* data, AdemcoZone zone,
void hbComMakeRespAB_modifyMachineZoneLostConfig(HbComData* data,
AdemcoZone zone,
HbComResp_AB_p2 p2) {
memcpy(data->data, HbComResp_AB_head, 6);
data->data[6] = zone & 0xFF;
......@@ -894,12 +959,17 @@ void hbComMakeRespAB_modifyMachineZoneLostConfig(HbComData* data, AdemcoZone zon
hbSum(data->data, data->len);
}
void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* data, HbComResp_AD_p1 p1,
size_t count, AdemcoZone* zones,
void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* data,
HbComResp_AD_p1 p1,
size_t count,
AdemcoZone* zones,
HbComResp_AD_p2 p2) {
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++) {
......@@ -915,7 +985,8 @@ void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* data, HbComResp_AD_p1 p
hbSum(data->data, data->len);
}
void hbComMakeRespAF_set3SectionMachineStatus(HbComData* data, HbCom_3sec_which p1,
void hbComMakeRespAF_set3SectionMachineStatus(HbComData* data,
HbCom_3sec_which p1,
HbCom_3sec_status status) {
memcpy(data->data, HbComResp_AF_head, 6);
data->data[6] = p1;
......@@ -930,12 +1001,17 @@ void hbComMakeRespB1_get3SectionMachineStatus(HbComData* data,
HbMachineStatus statusSec2,
HbMachineStatus statusSec3) {
memcpy(data->data, HbComResp_B1_head, 6);
data->data[6] = (statusMachine << 6) | (statusSec1 << 4) | (statusSec2 << 2) | (statusSec3);
data->data[6] = (statusMachine << 6) |
(statusSec1 << 4) |
(statusSec2 << 2) |
(statusSec3);
data->len = HbComResp_B1_len;
hbSum(data->data, data->len);
}
void hbComDataToAdemcoXData(const HbComData* const data, AdemcoXDataSegment* xdata,
AdemcoXDataLengthFormat xlf, AdemcoXDataTransform xtr) {
void hbComDataToAdemcoXData(const HbComData* const data,
AdemcoXDataSegment* xdata,
AdemcoXDataLengthFormat xlf,
AdemcoXDataTransform xtr) {
ademcoMakeXData(xdata, xlf, xtr, (const char*)data->data, data->len);
}
/*
* Hengbo COM library
* captainwong
* 2022-8-12 rewrited this C version
*/
#ifndef __HB_COM_H__
#define __HB_COM_H__
......@@ -21,7 +15,8 @@ extern "C" {
//! 是否合法的三防区主机状态GG
static inline int hbIsValid3SectionMachineGG(AdemcoGG gg) {
return HB_3SECTION_MACHINE_GG_MIN <= gg && gg <= HB_3SECTION_MACHINE_GG_MAX;
return HB_3SECTION_MACHINE_GG_MIN <= gg &&
gg <= HB_3SECTION_MACHINE_GG_MAX;
}
//! 主机状态
......@@ -232,33 +227,41 @@ typedef enum HbComResp_A4_p3 {
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);
#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
//! 拒绝设置回应
//! 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 {
......@@ -267,21 +270,26 @@ 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个防区
#define HbComResp_AD_max_zone 20
// 一包最多有 9 + 20 *2 = 49 个字节
#define HbComResp_AD_len_max (HbComResp_AD_len_min + HbComResp_AD_max_zone * 2)
#define HbComResp_AD_len_max \
(HbComResp_AD_len_min + HbComResp_AD_max_zone * 2)
typedef enum HbComResp_AD_p1 {
HbComResp_AD_p1_single = 0xF0, // 防区号以单字节表示
HbComResp_AD_p1_double = 0xF1, // 防区号以双字节表示
......@@ -319,10 +327,17 @@ typedef enum HbCom_3sec_which {
//! 三区段主机状态回应 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) ((((d)[6] >> 6) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status1(d) ((((d)[6] >> 4) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status2(d) ((((d)[6] >> 2) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status3(d) ((((d)[6]) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status(d) \
((((d)[6] >> 6) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status1(d) \
((((d)[6] >> 4) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status2(d) \
((((d)[6] >> 2) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
#define hbComResp_B1_status3(d) \
((((d)[6]) & 0x03) == HbCom_3sec_arm ? HMS_ARM : HMS_DISARM)
//! 读取主机账号
#define HbComReq_RD_acct_len 7
......@@ -341,11 +356,14 @@ typedef enum HbCom_3sec_which {
#define HbComResp_WR_acct_head HbComReq_WR_acct_head
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};
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 int hbGetAvailableZoneProperties(HbMachineType type,
HbZoneProperty props[12]);
//! 最大防区号根据型号不同而不同
ADEMCO_EXPORT_SYMBOL uint16_t hbZoneMax(HbMachineType type);
......@@ -409,56 +427,106 @@ 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 HbComRequestType hbComParseRequest(const uint8_t* buff, size_t len, HbComData* cd);
ADEMCO_EXPORT_SYMBOL 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);
// 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
HbComRequestType hbComParseRequest(const uint8_t* buff, size_t len, HbComData* cd);
ADEMCO_EXPORT_SYMBOL
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);
// 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, uint8_t zone, HbZoneProperty prop, HbComReq_A3_op op);
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 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 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);
// p2 must be HbCom_3sec_arm or HbCom_3sec_disarm
ADEMCO_EXPORT_SYMBOL void hbComMakeReqAE_set3SectionMachineStatus(HbComData* data, HbCom_3sec_which p1, HbCom_3sec_status status);
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 hbComMakeReqRD_acct(HbComData* data);
ADEMCO_EXPORT_SYMBOL void hbComMakeReqWR_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 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, HbMachineStatus status, HbMachineType type);
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, size_t count,
AdemcoZone* zones, HbZoneProperty* props, HbComResp_A2_p1 p1);
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, AdemcoZone zone, HbZoneProperty prop, HbComResp_A4_p3 p3);
ADEMCO_EXPORT_SYMBOL void hbComMakeRespA6_getMachineTimer(HbComData* data, HbMachineTimer* timer);
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 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, AdemcoZone zone, HbComResp_AB_p2 p2);
ADEMCO_EXPORT_SYMBOL void hbComMakeRespAB_modifyMachineZoneLostConfig(HbComData* data,
AdemcoZone zone,
HbComResp_AB_p2 p2);
// 返回所有失联开的防区
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, HbCom_3sec_which p1, HbCom_3sec_status status);
ADEMCO_EXPORT_SYMBOL void hbComMakeRespB1_get3SectionMachineStatus(HbComData* data, HbMachineStatus statusMachine,
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,
HbCom_3sec_which p1,
HbCom_3sec_status status);
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, AdemcoXDataSegment* xdata,
AdemcoXDataLengthFormat xlf, AdemcoXDataTransform xtr);
ADEMCO_EXPORT_SYMBOL void hbComDataToAdemcoXData(const HbComData* const data,
AdemcoXDataSegment* xdata,
AdemcoXDataLengthFormat xlf,
AdemcoXDataTransform xtr);
#ifdef __cplusplus
}
......
......@@ -2,3 +2,4 @@ xcopy /i /s /y G:\dev_libs\ademco\hb\ademco.h ..\
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 ..\
......@@ -18,6 +18,14 @@ export MACOS_TARGET=jack@JackMacBook-Pro.local
export MACOS_PROJECT_PATH=/Users/jack/projects/ademco_hb
export MACOS_JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home
major=`cat ../ademco_version.h | grep ADEMCO_VERSION_MAJOR | head -n1 | awk '{print $3}'`
minor=`cat ../ademco_version.h | grep ADEMCO_VERSION_MINOR | head -n1 | awk '{print $3}'`
patch=`cat ../ademco_version.h | grep ADEMCO_VERSION_PATCH | head -n1 | awk '{print $3}'`
version=$major.$minor.$patch
echo "version: $version"
rm -rf dist
mkdir -p dist
......@@ -44,3 +52,8 @@ mkdir -p dist
# mac-node
./mk_macos_node.sh
mv dist ademco_hb-$version
tar -zcvf ademco_hb-$version.tar.gz ademco_hb-$version
zip -r ademco_hb-$version.zip ademco_hb-$version
rm -rf ademco_hb-$version
#!/bin/bash
# win-node
./clean.sh
mkdir -p win_node
./win_node.bat
cp -r ../swig/build/ win_node/
cp ../swig/nodejs-demo.js win_node/
rm -f win_node.zip
cd win_node
zip -r ../win_node.zip . *
cd ..
rm -rf win_node/
CURRENT_DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd $CURRENT_DIR
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