Commit d0df2ed4 authored by captainwong's avatar captainwong

update

parent f9e16e88
......@@ -115,6 +115,164 @@ 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_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";
}
}
const wchar_t* ademcoEventToStringChinese(AdemcoEvent ademcoEvent)
{
switch (ademcoEvent) {
case EVENT_ARM: return L"布防";
case EVENT_BURGLAR: return L"盗警";
case EVENT_DISARM: return L"撤防";
case EVENT_DURESS: return L"胁迫";
case EVENT_EMERGENCY: return L"紧急报警";
case EVENT_FIRE: return L"火警";
case EVENT_GAS: return L"煤气";
case EVENT_HALFARM: case EVENT_HALFARM_1456: return L"半布防";
case EVENT_TAMPER: return L"防拆";
case EVENT_ZONE_TAMPER: return L"防区防拆";
case EVENT_WATER: return L"水警";
case EVENT_BYPASS: return L"旁路";
case EVENT_BYPASS_RESUME: return L"解除旁路";
case EVENT_AC_BROKE: return L"主机AC掉电";
case EVENT_AC_RECOVER: return L"主机AC恢复";
case EVENT_LOWBATTERY: return L"低电";
case EVENT_BATTERY_RECOVER: return L"复电";
case EVENT_BADBATTERY: return L"坏电";
case EVENT_BADBATTERY_RECOVER: return L"坏电恢复";
case EVENT_SOLARDISTURB: return L"光扰";
case EVENT_SOLARDISTURB_RECOVER: return L"光扰恢复";
case EVENT_DISCONNECT: return L"失效";
case EVENT_RECONNECT: return L"恢复";
case EVENT_LOST: return L"失联";
case EVENT_LOST_RECOVER: return L"恢复";
case EVENT_3100: return L"液晶主机清除异常指示";
case EVENT_BATTERY_EXCEPTION: return L"防区电源故障";
case EVENT_BATTERY_EXCEPTION_RECOVER: return L"防区电源故障恢复";
case EVENT_OTHER_EXCEPTION: return L"防区其他故障";
case EVENT_OTHER_EXCEPTION_RECOVER: return L"防区其他故障恢复";
case EVENT_SERIAL485DIS: return L"485断开";
case EVENT_SERIAL485CONN: return L"485恢复";
case EVENT_DOORRINGING: return L"门铃";
case EVENT_CONN_HANGUP: return L"链路挂起";
case EVENT_CONN_RESUME: return L"链路恢复";
case EVENT_DISARM_PWD_ERR: return L"撤防密码错误";
case EVENT_SUB_MACHINE_SENSOR_EXCEPTION: return L"分防区异常";
case EVENT_SUB_MACHINE_SENSOR_RESUME: return L"分防区恢复";
case EVENT_SUB_MACHINE_POWER_EXCEPTION: return L"分防区电源异常";
case EVENT_SUB_MACHINE_POWER_RESUME: return L"分防区电源恢复";
case EVENT_COM_PASSTHROUGH: return L"串口透传";
case EVENT_ENTER_SET_MODE: return L"进入设置状态";
case EVENT_EXIT_SET_MODE: return L"拒绝/停止设置";
case EVENT_QUERY_SUB_MACHINE: return L"查询";
case EVENT_WRITE_TO_MACHINE: return L"写入主机信息";
case EVENT_I_AM_NET_MODULE: return L"我是网络模块";
case EVENT_PHONE_USER_SOS: return L"手机用户SOS";
case EVENT_PHONE_USER_CANCLE_ALARM: return L"手机用户消警";
case EVENT_I_AM_GPRS: return L"我是GPRS主机";
case EVENT_I_AM_LCD_MACHINE: return L"我是液晶主机";
case EVENT_I_AM_WIRE_MACHINE: return L"我是网线主机";
case EVENT_I_AM_WIFI_MACHINE: return L"我是WiFi主机";
case EVENT_I_AM_3_SECTION_MACHINE: return L"我是三区段主机";
case EVENT_I_AM_IOT_MACHINE: return L"我是物联卡主机";
case EVENT_I_AM_TRUE_COLOR: return L"我是真彩主机";
case EVENT_I_AM_GPRS_IOT: return L"我是简化版物联卡主机";
case EVENT_I_AM_GPRS_PHONE: return L"我是GPRS主机能打电话";
case EVENT_I_AM_NB_MACHINE: return L"我是NB报警接收主机";
case EVENT_SIM_IS_IOT_CARD: return L"SIM卡为物联卡";
case EVENT_SIM_IS_IOT_PLATFORM_CARD: return L"SIM卡为平台物联卡";
case EVENT_SIM_IS_NOT_IOT_CARD: return L"SIM卡为非物联卡";
case EVENT_ENTER_SETTING_MODE: return L"主机进入设置状态";
case EVENT_EXIT_SETTING_MODE: return L"主机退出设置状态";
case EVENT_RESTORE_FACTORY_SETTINGS_710:
case EVENT_RESTORE_FACTORY_SETTINGS: return L"主机恢复出厂设置";
case EVENT_WHAT_IS_YOUR_TYPE: return L"索要主机类型";
case EVENT_SIGNAL_STRENGTH_CHANGED: return L"信号强度变化";
case EVENT_OFFLINE: return L"上线";
case EVENT_ONLINE: return L"离线";
default: return L"未定义的安定宝事件";
}
}
uint16_t ademcoCRC8(char c, uint16_t crc)
{
static const uint16_t crcTable[] = {
......@@ -335,6 +493,56 @@ int ademcoDataSegmentToCongwinFe100(uint8_t* fe100, const AdemcoDataSegment* dat
return 0;
}
const uint8_t* ademcoXDataGetValidContentAddr(const AdemcoXDataSegment* xdata)
{
if (xdata->lenghFormat == TWO_HEX && xdata->raw_len > 4) {
return xdata->raw + 3;
} else if (xdata->lenghFormat == FOUR_DECIMAL && xdata->raw_len > 6) {
return xdata->raw + 5;
} else {
return NULL;
}
}
int ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata)
{
if (xdata->lenghFormat == TWO_HEX && xdata->raw_len > 4) {
return xdata->raw_len - 4;
} else if (xdata->lenghFormat == FOUR_DECIMAL && xdata->raw_len > 6) {
return xdata->raw_len - 6;
} else {
return 0;
}
}
int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf, const uint8_t* content, int len)
{
xdata->lenghFormat = xlf;
if (xlf == TWO_HEX && len + 4 < ADEMCO_PACKET_XDATA_MAX_LEN) {
uint8_t* p = xdata->raw;
*p++ = '[';
*p++ = (len & 0xFFFF) >> 8;
*p++ = (len & 0xFFFF) & 0xFF;
memcpy(p, content, len);
p += len;
*p++ = ']';
return ADEMCO_OK;
} else if (xlf == FOUR_DECIMAL && len + 6 < ADEMCO_PACKET_XDATA_MAX_LEN) {
uint8_t* p = xdata->raw;
*p++ = '[';
char temp[5];
sprintf(temp, "%04d", len & 0xFFFF);
memcpy(p, temp, 4);
p += 4;
memcpy(p, content, len);
p += len;
*p++ = ']';
return ADEMCO_OK;
} else {
return ADEMCO_ERR;
}
}
int isAdemcoId(const char* standard, const char* id, int len)
{
return strncmp(standard, id, strlen(standard)) == 0;
......@@ -438,7 +646,7 @@ int ademcoMakeNakPacket(uint8_t* buff, int len, uint16_t seq, const char* acct,
}
int ademcoMakeHbPacket(uint8_t* dst_buff, int len, uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone, XData* xdata)
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone, AdemcoXDataSegment* xdata)
{
char buff[ADEMCO_PACKET_MAX_LEN];
char* p = buff;
......@@ -550,7 +758,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
if (p - pseq != 4 || (*p != 'R' && *p != 'L')) { break; }
memcpy(temp, pseq, 4); temp[4] = '\0';
pkt->seq = strtoul(temp, NULL, 10);
//if (pkt->seq >= 10000) { break; }
if (pkt->seq >= 10000) { pkt->seq = 0; }
// *rrcvr
if (*p == 'R') { // rrcvr exists
......@@ -590,7 +798,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
// *xdata
if (*p == '[') { // xdata exists
const uint8_t* pxdata = p++;
XDataLengthFormat xlf = FOUR_DECIMAL;
AdemcoXDataLengthFormat xlf = FOUR_DECIMAL;
int valid_len;
for (int i = 0; i < 4; i++) {
if (!isxdigit(*(p + i))) {
......@@ -644,6 +852,72 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
return RESULT_ERROR;
}
int hbGetAvailableZoneProperties(HbMachineType type, HbZoneProperty props[12])
{
switch (type) {
case HMT_WIFI:
break;
case HMT_CAMERA:
break;
case HMT_GPRS_IOT:
case HMT_GPRS:
{
HbZoneProperty hzps[] = { HZP_BUGLAR, HZP_EMERGENCY, HZP_FIRE, HZP_DURESS, HZP_GAS, HZP_WATER, HZP_REMOTE_CONTROL, };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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, };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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 };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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, };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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 };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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 };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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 };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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, };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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, };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
return sizeof(hzps) / sizeof(HbZoneProperty);
}
}
return 0;
}
uint16_t hbZoneMax(HbMachineType type)
{
......@@ -688,7 +962,7 @@ int hbIsValidZoneStrict(HbMachineType type, uint16_t zone)
return ADEMCO_ZONE_MIN <= zone && zone <= hbZoneMax(type);
}
int hbIsMachineSelling(HbMachineType type)
int hbMachineIsSelling(HbMachineType type)
{
return type == HMT_NETMOD
|| type == HMT_GPRS
......@@ -705,17 +979,17 @@ int hbIsMachineSelling(HbMachineType type)
int hbMachineCanArm(HbMachineType type)
{
return hbIsMachineSelling(type) && (type != HMT_NB);
return hbMachineIsSelling(type) && (type != HMT_NB);
}
int hbMachineCanDisarm(HbMachineType type)
{
return hbIsMachineSelling(type) && (type != HMT_NB);
return hbMachineIsSelling(type) && (type != HMT_NB);
}
int hbMachineCanEnterSettings(HbMachineType type)
{
return hbIsMachineSelling(type);
return hbMachineIsSelling(type);
}
int hbMachineCanHalfArm(HbMachineType type)
......@@ -801,7 +1075,199 @@ int hbZonePropCanReportLost(HbZoneProperty zp)
}
}
void hbInitMachineTimer(HbMachineTimer* timer)
{
memset(timer->data, 0xFF, sizeof(timer));
}
int hbIsValidTimer(HbTimer* timer)
{
return 0 <= timer->armAt.hour && timer->armAt.hour < 24 &&
0 <= timer->armAt.minute && timer->armAt.minute < 60 &&
0 <= timer->disarmAt.hour && timer->disarmAt.hour < 24 &&
0 <= timer->disarmAt.minute && timer->disarmAt.minute < 60;
}
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;
}
}
HbMachineStatus hbMachineStatusFromAdemcoEvent(AdemcoEvent ademcoEvent)
{
switch (ademcoEvent) {
case EVENT_ARM:
return HMS_ARM;
case EVENT_DISARM:
return HMS_DISARM;
case EVENT_HALFARM:
case EVENT_HALFARM_1456:
return HMS_HALF_ARM;
case EVENT_ENTER_SETTING_MODE:
case EVENT_ENTER_SET_MODE:
return HMS_SETTING;
default:
return HMS_INVALID;
}
}
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;
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;
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;
}
}
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";
default: return "Unknown HbMachineType";
}
}
const wchar_t* hbMachineTypeToStringChinese(HbMachineType type)
{
switch (type) {
case HMT_WIFI: return L"0 WiFi主机";
case HMT_CAMERA: return L"1 摄像头主机";
case HMT_GPRS_IOT: return L"2 简化的物联卡主机";
case HMT_NETMOD: return L"3 网络模块+工程主机";
case HMT_GPRS: return L"4 GPRS主机";
case HMT_LCD: return L"5 液晶主机";
case HMT_WIRED: return L"6 网线主机";
case HMT_TRUE_COLOR: return L"7 真彩主机";
case HMT_3_SECTION: return L"8 三区段主机";
case HMT_IOT: return L"9 物联卡主机";
case HMT_GPRS_PHONE: return L"10 GPRS主机能打电话";
case HMT_NB: return L"11 NB报警接收主机";
default: return L"未知主机";
}
}
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";
}
}
const wchar_t* hbZonePropertyToStringChinese(HbZoneProperty zp)
{
switch (zp) {
case HZP_BUGLAR: return L"匪警全局";
case HZP_EMERGENCY: return L"匪警紧急";
case HZP_FIRE: return L"火警防区";
case HZP_DURESS: return L"胁迫防区";
case HZP_GAS: return L"燃气防区";
case HZP_WATER: return L"淹水防区";
case HZP_SUB_MACHINE: return L"分机";
case HZP_REMOTE_CONTROL: return L"遥控器";
case HZP_BUGLAR_HALF: return L"匪警半局";
case HZP_SHIELD: return L"屏蔽防区";
case HZP_DOOR_RING: return L"门铃防区";
case HZP_RESERVED_0B: return L"保留";
case HZP_RESERVED_0C: return L"保留";
case HZP_RESERVED_0D: return L"保留";
case HZP_RESERVED_0E: return L"保留";
case HZP_BYPASS: return L"旁路防区";
default: return L"无效属性";
}
}
const char* hbGetZoneFormatString(HbMachineType type)
{
uint16_t zone = hbZoneMax(type);
if (10 < zone && zone < 100) { return "%02d"; }
else if (zone < 1000) { return "%03d"; }
else { return "%d"; }
}
const wchar_t* hbGetZoneFormatStringW(HbMachineType type)
{
uint16_t zone = hbZoneMax(type);
if (10 < zone && zone < 100) { return L"%02d"; }
else if (zone < 1000) { return L"%03d"; }
else { return L"%d"; }
}
int hbHiLoArrayToDecStr(char* str, const uint8_t* arr, int len)
{
......
......@@ -5,14 +5,13 @@
*/
#ifndef __ADEMCO_H__
#define __ADEMCO_H__
#pragma once
#ifdef ADEMCO_EXPORTS
# if defined __GNUC__
......@@ -84,15 +83,6 @@ static inline int ademcoIsValidZoneStrict(AdemcoZone zone) {
#define ADEMCO_GG_MAX 99
#define ADEMCO_GG_SENTINEL 100
//! 三防区主机状态GG范围 1~3
#define ADEMCO_3SECTION_MACHINE_GG_MIN 1
#define ADEMCO_3SECTION_MACHINE_GG_MAX 3
//! 是否合法的三防区主机状态GG
static inline int ademcoIsValid3SectionMachineGG(AdemcoGG gg) {
return ADEMCO_3SECTION_MACHINE_GG_MIN <= gg && gg <= ADEMCO_3SECTION_MACHINE_GG_MAX;
}
// Ademco events
typedef enum AdemcoEvent {
EVENT_INVALID_EVENT = 0,
......@@ -195,6 +185,84 @@ typedef enum AdemcoEvent {
}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_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
{
......@@ -222,16 +290,16 @@ typedef struct AdemcoDataSegment {
AdemcoZone zone;
}AdemcoDataSegment;
typedef enum XDataLengthFormat {
typedef enum AdemcoXDataLengthFormat {
TWO_HEX, // 两个hex字节表示长度
FOUR_DECIMAL, // 四个decimal char 表示长度
}XDataLengthFormat;
}AdemcoXDataLengthFormat;
typedef struct XData {
XDataLengthFormat lenghFormat;
typedef struct AdemcoXDataSegment {
AdemcoXDataLengthFormat lenghFormat;
uint8_t raw[ADEMCO_PACKET_XDATA_MAX_LEN];
int raw_len;
}XData;
}AdemcoXDataSegment;
#define ADEMCO_PACKET_ID_NULL "\"NULL\""
#define ADEMCO_PACKET_ID_ACK "\"ACK\""
......@@ -265,10 +333,10 @@ typedef struct AdemcoPacket {
uint16_t crc;
int len;
AdemcoPacketId id;
int seq;
uint16_t seq;
char acct[ADEMCO_PACKET_ACCT_MAX_LEN + 1];
AdemcoDataSegment data;
XData xdata;
AdemcoXDataSegment xdata;
time_t timestamp;
}AdemcoPacket;
......@@ -285,12 +353,18 @@ 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);
ADEMCO_EXPORT_SYMBOL const wchar_t* ademcoEventToStringChinese(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL int ademcoAppendDataSegment(uint8_t* packet, AdemcoId ademcoId, AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone);
ADEMCO_EXPORT_SYMBOL int ademcoAppendDataSegment2(uint8_t* packet, const AdemcoDataSegment* dataSegment);
ADEMCO_EXPORT_SYMBOL AdemcoParseResult ademcoParseDataSegment(const uint8_t* packet, int packet_len, AdemcoDataSegment* dataSegment);
// return 0 for empty packet, CONGWIN_FE100_PACKET_LEN for non-empty packet
ADEMCO_EXPORT_SYMBOL int ademcoDataSegmentToCongwinFe100(uint8_t* fe100, const AdemcoDataSegment* dataSegment);
ADEMCO_EXPORT_SYMBOL const uint8_t* ademcoXDataGetValidContentAddr(const AdemcoXDataSegment* xdata);
ADEMCO_EXPORT_SYMBOL int ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata);
// return ADEMCO_OK for success, return ADEMCO_ERR for len is too long
ADEMCO_EXPORT_SYMBOL int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf, const uint8_t* content, int len);
ADEMCO_EXPORT_SYMBOL int isAdemcoId(const char* standard, const char* id, int len);
ADEMCO_EXPORT_SYMBOL AdemcoPacketId getAdemcoId(const char* id, int len);
......@@ -306,7 +380,7 @@ ADEMCO_EXPORT_SYMBOL int ademcoMakeNullPacket(uint8_t* buff, int len, uint16_t s
ADEMCO_EXPORT_SYMBOL int ademcoMakeAckPacket(uint8_t* buff, int len, uint16_t seq, const char* acct, AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL int ademcoMakeNakPacket(uint8_t* buff, int len, uint16_t seq, const char* acct, AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL int ademcoMakeHbPacket(uint8_t* buff, int len, uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone, XData* xdata);
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone, AdemcoXDataSegment* xdata);
ADEMCO_EXPORT_SYMBOL AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket* pkt, int* cb_commited);
......@@ -314,6 +388,17 @@ ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC8(char c, uint16_t crc);
ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC16(const uint8_t* buff, int len, uint16_t crc);
/* Hengbo */
//! 三防区主机状态GG范围 1~3
#define HB_3SECTION_MACHINE_GG_MIN 1
#define HB_3SECTION_MACHINE_GG_MAX 3
//! 是否合法的三防区主机状态GG
static inline int hbIsValid3SectionMachineGG(AdemcoGG gg) {
return HB_3SECTION_MACHINE_GG_MIN <= gg && gg <= HB_3SECTION_MACHINE_GG_MAX;
}
typedef enum HbMachineStatus {
HMS_ARM,
HMS_HALF_ARM,
......@@ -392,6 +477,30 @@ typedef enum HbZoneProperty {
HZP_INVALID = -1,
}HbZoneProperty;
typedef struct HbMachineTimePoint {
uint8_t hour;
uint8_t minute;
}HbMachineTimePoint;
typedef struct HbTimer {
HbMachineTimePoint armAt;
HbMachineTimePoint disarmAt;
}HbTimer;
typedef union HbMachineTimer {
HbTimer timer[2]; // 2 set of timer
uint8_t data[8];
}HbMachineTimer;
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防区)
......@@ -425,14 +534,19 @@ 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 hbIsValidTimer(HbTimer* 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* hbMachineTypeToString(HbMachineType type);
ADEMCO_EXPORT_SYMBOL const wchar_t* hbMachineTypeToStringChinese(HbMachineType type);
ADEMCO_EXPORT_SYMBOL const char* hbZonePropertyToString(HbZoneProperty zp);
ADEMCO_EXPORT_SYMBOL const wchar_t* hbZonePropertyToStringChinese(HbZoneProperty zp);
ADEMCO_EXPORT_SYMBOL const char* hbGetZoneFormatString(HbMachineType type);
ADEMCO_EXPORT_SYMBOL const wchar_t* hbGetZoneFormatStringW(HbMachineType type);
......
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