Commit a3a5c39f authored by captainwong's avatar captainwong

update

parent 86ccd9a5
......@@ -273,7 +273,7 @@ const char* ademcoEventToStringChinese(AdemcoEvent ademcoEvent)
}
}
uint16_t ademcoCRC8(char c, uint16_t crc)
uint16_t ademcoCRC8(uint8_t c, uint16_t crc)
{
static const uint16_t crcTable[] = {
/* DEFINE THE FIRST ORDER POLYINOMIAL TABLE */
......@@ -560,14 +560,12 @@ int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf, Adem
}
}
int isAdemcoId(const char* standard, const char* id, int len)
int isAdemcoPacketId(const char* standard, const char* id, int len)
{
return strncmp(standard, id, strlen(standard)) == 0;
}
AdemcoPacketId getAdemcoId(const char* id, int len)
{
static const char* const ids[AID_COUNT] = {
static const char* const ids[AID_COUNT] = {
ADEMCO_PACKET_ID_NULL,
ADEMCO_PACKET_ID_ACK,
ADEMCO_PACKET_ID_NAK,
......@@ -576,10 +574,12 @@ AdemcoPacketId getAdemcoId(const char* id, int len)
ADEMCO_PACKET_ID_ADM_CID,
ADEMCO_PACKET_ID_MOD_REG,
ADEMCO_PACKET_ID_REG_RSP,
};
};
AdemcoPacketId getAdemcoPacketId(const char* id, int len)
{
for (int i = 0; i < AID_COUNT; i++) {
if (isAdemcoId(ids[i], id, len)) {
if (isAdemcoPacketId(ids[i], id, len)) {
return (AdemcoPacketId)(i);
}
}
......@@ -587,6 +587,15 @@ AdemcoPacketId getAdemcoId(const char* id, int len)
return AID_INVALID;
}
const char* admecoPacketIdToString(AdemcoPacketId id)
{
if (0 <= id && id < AID_COUNT) {
return ids[id];
} else {
return "";
}
}
static void getNowTimestamp(char* buff)
{
time_t now = time(NULL);
......@@ -812,7 +821,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
p = pid + 1;
while (p < pcr && *p != '\"') { p++; }
if (p >= pcr || *p != '\"') { break; }
pkt->id = getAdemcoId((const char*)pid, ++p - pid);
pkt->id = getAdemcoPacketId((const char*)pid, ++p - pid);
if (pkt->id == AID_INVALID) { break; }
// seq
......@@ -929,57 +938,58 @@ int hbGetAvailableZoneProperties(HbMachineType type, HbZoneProperty props[12])
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));
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, };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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 };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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, };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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 };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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 };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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 };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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, };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
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, };
memcpy(props, hzps, sizeof(hzps) / sizeof(HbZoneProperty));
memcpy(props, hzps, sizeof(hzps));
return sizeof(hzps) / sizeof(HbZoneProperty);
}
default: return 0;
}
return 0;
}
......@@ -1102,8 +1112,8 @@ AdemcoZone hbWiredZoneMin(HbMachineType type)
case HMT_NETMOD: return 1;
case HMT_TRUE_COLOR: return 1;
case HMT_3_SECTION: return 61;
default: return 0;
}
return 0;
}
AdemcoZone hbWiredZoneMax(HbMachineType type)
......@@ -1112,8 +1122,8 @@ AdemcoZone hbWiredZoneMax(HbMachineType type)
case HMT_NETMOD: return 8;
case HMT_TRUE_COLOR: return 8;
case HMT_3_SECTION: return 68;
default: return 0;
}
return 0;
}
int hbMachineCanDirectlyWriteZone(HbMachineType type)
......@@ -1860,4 +1870,27 @@ int hbHexStrToArrayN(uint8_t* arr, const char* str, int len, uint8_t padding)
return p - arr;
}
int hbHexStrToArrayN_allow_non_hex_str(uint8_t* arr, const char* str, int len, uint8_t padding)
{
uint8_t* p = arr;
uint8_t hi = 0, lo = 0;
padding &= 0x0F;
for (int i = 0; i < len / 2; i++) {
char c = str[i * 2];
if ((hi = char2hex(c)) == 0xFF) {
hi = padding;
}
if (i * 2 + 1 < len) {
c = str[i * 2 + 1];
if ((lo = char2hex(c)) == 0xFF) {
lo = padding;
}
} else {
lo = padding;
}
*p++ = ((hi << 4) & 0xF0) | (lo & 0x0F);
}
return p - arr;
}
......@@ -374,8 +374,9 @@ ADEMCO_EXPORT_SYMBOL int ademcoXDataGetValidContentLen(const AdemcoXDataSegment*
// 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 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);
ADEMCO_EXPORT_SYMBOL int isAdemcoPacketId(const char* standard, const char* id, int len);
ADEMCO_EXPORT_SYMBOL AdemcoPacketId getAdemcoPacketId(const char* id, int len);
ADEMCO_EXPORT_SYMBOL const char* admecoPacketIdToString(AdemcoPacketId id);
/*
* ademcoMake*Packet functions
......@@ -399,7 +400,7 @@ ADEMCO_EXPORT_SYMBOL int ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq, co
ADEMCO_EXPORT_SYMBOL AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket* pkt, int* cb_commited);
ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC8(char c, uint16_t crc);
ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC8(uint8_t c, uint16_t crc);
ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC16(const uint8_t* buff, int len, uint16_t crc);
......@@ -842,9 +843,14 @@ ADEMCO_EXPORT_SYMBOL int hbHexStrToArray(uint8_t* arr, const char* str, uint8_t
// 功能同hbHexStrToArray
// 若strlen(str) > len, str[len]及之后的内容将被舍弃以避免溢出
// 示例:输入字符串str="ABCDE", len = 2 padding = 0x0F, 输出arr=[0xAB, 0xCD], return 2
// 示例:输入字符串str="ABCDE", len = 4 padding = 0x0F, 输出arr=[0xAB, 0xCD], return 2
ADEMCO_EXPORT_SYMBOL int hbHexStrToArrayN(uint8_t* arr, const char* str, int len, uint8_t padding);
// 同hbHexStrToArrayN,但允许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 int hbHexStrToArrayN_allow_non_hex_str(uint8_t* arr, const char* str, int len, uint8_t padding);
#ifdef __cplusplus
}
#endif
......
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