Commit ef8c2dff authored by captainwong's avatar captainwong

test c dll with direct macchine ok

parent 03661efb
...@@ -324,20 +324,10 @@ uint16_t ademcoCRC16(const uint8_t* buff, int len, uint16_t crc) ...@@ -324,20 +324,10 @@ uint16_t ademcoCRC16(const uint8_t* buff, int len, uint16_t crc)
return CRC; return CRC;
} }
int ademcoAppendDataSegment(uint8_t* packet, AdemcoId ademcoId, AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone) int ademcoAppendDataSegment(uint8_t* buff, AdemcoId ademcoId, AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone)
{
AdemcoDataSegment dataSegment;
dataSegment.ademcoId = ademcoId;
dataSegment.ademcoEvent = ademcoEvent;
dataSegment.gg = gg;
dataSegment.zone = zone;
return ademcoAppendDataSegment2(packet, &dataSegment);
}
int ademcoAppendDataSegment2(uint8_t* buff, const AdemcoDataSegment* dataSegment)
{ {
char* p = buff; char* p = buff;
if (dataSegment->ademcoEvent == EVENT_INVALID_EVENT) { if (ademcoEvent == EVENT_INVALID_EVENT) {
*p++ = '['; *p++ = '[';
*p++ = ']'; *p++ = ']';
return ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN; return ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN;
...@@ -345,40 +335,51 @@ int ademcoAppendDataSegment2(uint8_t* buff, const AdemcoDataSegment* dataSegment ...@@ -345,40 +335,51 @@ int ademcoAppendDataSegment2(uint8_t* buff, const AdemcoDataSegment* dataSegment
*p++ = '['; *p++ = '[';
*p++ = '#'; *p++ = '#';
snprintf(p, 6 + 1, "%06X", dataSegment->ademcoId % ADEMCO_ID_SENTINEL); snprintf(p, 6 + 1, "%06X", ademcoId % ADEMCO_ID_SENTINEL);
p += 6; p += 6;
*p++ = '|'; *p++ = '|';
snprintf(p, 4 + 1, "%04d", dataSegment->ademcoEvent % ADEMCO_EVENT_SENTINEL); snprintf(p, 4 + 1, "%04d", ademcoEvent % ADEMCO_EVENT_SENTINEL);
p += 4; p += 4;
*p++ = ' '; *p++ = ' ';
if (dataSegment->gg == 0xEE) { if (gg == 0xEE) {
*p++ = 'E'; *p++ = 'E';
*p++ = 'E'; *p++ = 'E';
} else if (dataSegment->gg == 0xCC) { } else if (gg == 0xCC) {
*p++ = 'C'; *p++ = 'C';
*p++ = 'C'; *p++ = 'C';
} else { } else {
*p++ = ((dataSegment->gg / 10) & 0x0F) + '0'; *p++ = ((gg / 10) & 0x0F) + '0';
*p++ = ((dataSegment->gg % 10) & 0x0F) + '0'; *p++ = ((gg % 10) & 0x0F) + '0';
} }
*p++ = ' '; *p++ = ' ';
snprintf(p, 3 + 1, "%03d", dataSegment->zone % ADEMCO_ZONE_SENTINEL); snprintf(p, 3 + 1, "%03d", zone % ADEMCO_ZONE_SENTINEL);
p += 3; p += 3;
*p++ = ']'; *p++ = ']';
assert(p - buff == ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN); assert(p - buff == ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN);
*p++ = '\0'; // for debug convenience
return ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN; return ADEMCO_PACKET_DATA_SEGMENT_FULL_LEN;
} }
} }
int ademcoAppendDataSegment2(AdemcoDataSegment* dataSegment, AdemcoId ademcoId, AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone)
{
dataSegment->ademcoId = ademcoId;
dataSegment->ademcoEvent = ademcoEvent;
dataSegment->gg = gg;
dataSegment->zone = zone;
return dataSegment->raw_len = ademcoAppendDataSegment(dataSegment->raw, ademcoId, ademcoEvent, gg, zone);
}
AdemcoParseResult ademcoParseDataSegment(const uint8_t* packet, int packet_len, AdemcoDataSegment* dataSegment) AdemcoParseResult ademcoParseDataSegment(const uint8_t* packet, int packet_len, AdemcoDataSegment* dataSegment)
{ {
if (packet_len == ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN && packet[0] == '[' && packet[1] == ']') { if (packet_len == ADEMCO_PACKET_DATA_SEGMENT_EMPTY_LEN && packet[0] == '[' && packet[1] == ']') {
...@@ -515,28 +516,42 @@ int ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata) ...@@ -515,28 +516,42 @@ int ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata)
} }
} }
int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf, const uint8_t* content, int len) int ademcoMakeXData(AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf, AdemcoXDataTransform xtr, const uint8_t* content, int len)
{ {
uint8_t transformed[ADEMCO_PACKET_XDATA_MAX_LEN];
int translen = len;
if (xtr == AdemcoXDataTransform_as_is) {
memcpy(transformed, content, len);
} else {
if (len * 2 < ADEMCO_PACKET_XDATA_MAX_LEN) {
translen = hbHexArrayToStr((char*)transformed, content, len);
} else {
return ADEMCO_ERR;
}
}
xdata->lenghFormat = xlf; xdata->lenghFormat = xlf;
if (xlf == TWO_HEX && len + 4 < ADEMCO_PACKET_XDATA_MAX_LEN) { if (xlf == TWO_HEX && translen + 4 < ADEMCO_PACKET_XDATA_MAX_LEN) {
uint8_t* p = xdata->raw; uint8_t* p = xdata->raw;
*p++ = '['; *p++ = '[';
*p++ = (len & 0xFFFF) >> 8; *p++ = (translen & 0xFFFF) >> 8;
*p++ = (len & 0xFFFF) & 0xFF; *p++ = (translen & 0xFFFF) & 0xFF;
memcpy(p, content, len); memcpy(p, transformed, translen);
p += len; p += translen;
*p++ = ']'; *p++ = ']';
xdata->raw_len = p - xdata->raw;
return ADEMCO_OK; return ADEMCO_OK;
} else if (xlf == FOUR_DECIMAL && len + 6 < ADEMCO_PACKET_XDATA_MAX_LEN) { } else if (xlf == FOUR_DECIMAL && translen + 6 < ADEMCO_PACKET_XDATA_MAX_LEN) {
uint8_t* p = xdata->raw; uint8_t* p = xdata->raw;
*p++ = '['; *p++ = '[';
char temp[5]; char temp[5];
sprintf(temp, "%04d", len & 0xFFFF); sprintf(temp, "%04d", translen & 0xFFFF);
memcpy(p, temp, 4); memcpy(p, temp, 4);
p += 4; p += 4;
memcpy(p, content, len); memcpy(p, transformed, translen);
p += len; p += translen;
*p++ = ']'; *p++ = ']';
xdata->raw_len = p - xdata->raw;
return ADEMCO_OK; return ADEMCO_OK;
} else { } else {
return ADEMCO_ERR; return ADEMCO_ERR;
...@@ -700,6 +715,55 @@ int ademcoMakeHbPacket(uint8_t* dst_buff, int len, uint16_t seq, const char* acc ...@@ -700,6 +715,55 @@ int ademcoMakeHbPacket(uint8_t* dst_buff, int len, uint16_t seq, const char* acc
return 0; return 0;
} }
static void copyAcct2AdemcoPacket(AdemcoPacket* pkt, const char* acct)
{
int len = strlen(acct);
if (len > ADEMCO_PACKET_ACCT_MAX_LEN) {
len = ADEMCO_PACKET_ACCT_MAX_LEN;
}
memcpy(pkt->acct, acct, len);
pkt->acct[len] = '\0';
}
int ademcoMakeNullPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId)
{
pkt->seq = seq;
copyAcct2AdemcoPacket(pkt, acct);
pkt->data.ademcoId = ademcoId;
return pkt->raw_len = ademcoMakeNullPacket(pkt->raw, sizeof(pkt->raw), seq, acct, ademcoId);
}
int ademcoMakeAckPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId)
{
pkt->seq = seq;
copyAcct2AdemcoPacket(pkt, acct);
pkt->data.ademcoId = ademcoId;
return pkt->raw_len = ademcoMakeAckPacket(pkt->raw, sizeof(pkt->raw), seq, acct, ademcoId);
}
int ademcoMakeNakPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId)
{
pkt->seq = seq;
copyAcct2AdemcoPacket(pkt, acct);
pkt->data.ademcoId = ademcoId;
return pkt->raw_len = ademcoMakeNakPacket(pkt->raw, sizeof(pkt->raw), seq, acct, ademcoId);
}
int ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId, AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone, AdemcoXDataSegment* xdata)
{
pkt->seq = seq;
copyAcct2AdemcoPacket(pkt, acct);
ademcoAppendDataSegment2(&pkt->data, ademcoId, ademcoEvent, gg, zone);
if (xdata && xdata->raw_len > 0) {
pkt->xdata.lenghFormat = xdata->lenghFormat;
memcpy(pkt->xdata.raw, xdata->raw, xdata->raw_len);
pkt->xdata.raw_len = xdata->raw_len;
} else {
memset(&pkt->xdata, 0, sizeof(*xdata));
}
return pkt->raw_len = ademcoMakeHbPacket(pkt->raw, sizeof(pkt->raw), seq, acct, ademcoId, ademcoEvent, gg, zone, xdata);
}
AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket* pkt, int* cb_commited) AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket* pkt, int* cb_commited)
{ {
if (len < 9) { return RESULT_NOT_ENOUGH; } if (len < 9) { return RESULT_NOT_ENOUGH; }
...@@ -714,7 +778,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket* ...@@ -714,7 +778,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
// crc // crc
memcpy(temp, p, 4); memcpy(temp, p, 4);
temp[4] = '\0'; temp[4] = '\0';
uint16_t crc = strtoul(temp, NULL, 16); uint16_t crc = strtoul(temp, NULL, 16) & 0xFFFF;
p += 4; p += 4;
// len // len
...@@ -757,7 +821,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket* ...@@ -757,7 +821,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
while (p < pcr && *p != 'R' && *p != 'L') { p++; } while (p < pcr && *p != 'R' && *p != 'L') { p++; }
if (p - pseq != 4 || (*p != 'R' && *p != 'L')) { break; } if (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); pkt->seq = strtoul(temp, NULL, 10) & 0xFFFF;
if (pkt->seq >= 10000) { pkt->seq = 0; } if (pkt->seq >= 10000) { pkt->seq = 0; }
// *rrcvr // *rrcvr
...@@ -845,7 +909,8 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket* ...@@ -845,7 +909,8 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
} }
if (p++ != pcr) { break; } if (p++ != pcr) { break; }
*cb_commited = p - buff; pkt->raw_len = *cb_commited = p - buff;
memcpy(pkt->raw, buff, pkt->raw_len);
return RESULT_OK; return RESULT_OK;
} while (0); } while (0);
...@@ -1585,7 +1650,7 @@ void hbComMakeRespA2_getMachineZones(HbComData* data, int count, AdemcoZone* zon ...@@ -1585,7 +1650,7 @@ void hbComMakeRespA2_getMachineZones(HbComData* data, int count, AdemcoZone* zon
*p++ = props[i]; *p++ = props[i];
} }
*p++ = (count > 0) ? p1 : HbComResp_A2_p1_nomore; *p++ = (count > 0) ? p1 : HbComResp_A2_p1_nomore;
data->len = ++p - data; data->len = ++p - data->data;
hbSum(data->data, data->len); hbSum(data->data, data->len);
} }
...@@ -1650,7 +1715,7 @@ void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* data, HbComResp_AD_p1 p ...@@ -1650,7 +1715,7 @@ void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* data, HbComResp_AD_p1 p
} }
} }
*p++ = (count > 0) ? p2 : HbComResp_AD_p2_nomore; *p++ = (count > 0) ? p2 : HbComResp_AD_p2_nomore;
data->len = ++p - data; data->len = ++p - data->data;
hbSum(data->data, data->len); hbSum(data->data, data->len);
} }
...@@ -1672,6 +1737,11 @@ void hbComMakeRespB1_get3SectionMachineStatus(HbComData* data, HbMachineStatus s ...@@ -1672,6 +1737,11 @@ void hbComMakeRespB1_get3SectionMachineStatus(HbComData* data, HbMachineStatus s
hbSum(data->data, data->len); hbSum(data->data, data->len);
} }
void hbComDataToAdemcoXData(const HbComData* const data, AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf, AdemcoXDataTransform xtr)
{
ademcoMakeXData(xdata, xlf, xtr, data->data, data->len);
}
int hbHiLoArrayToDecStr(char* str, const uint8_t* arr, int len) int hbHiLoArrayToDecStr(char* str, const uint8_t* arr, int len)
{ {
char* p = str; char* p = str;
...@@ -1718,4 +1788,60 @@ int hbDecStrToHiLoArray(uint8_t* arr, int len, const char* str) ...@@ -1718,4 +1788,60 @@ int hbDecStrToHiLoArray(uint8_t* arr, int len, const char* str)
return len; return len;
} }
static uint8_t hex2char(uint8_t h) {
h &= 0x0F;
if (h > 9) {
return 'A' + h;
} else {
return '0' + h;
}
}
int hbHexArrayToStr(char* str, const uint8_t* arr, int len)
{
uint8_t c = 0;
char* p = str;
for (int i = 0; i < len; i++) {
*p++ = hex2char((arr[i] >> 4) & 0x0F);
*p++ = hex2char(arr[i] & 0x0F);
}
return p - str;
}
static uint8_t char2hex(uint8_t c) {
if ('0' <= c && c <= '9') {
return c - '0';
} else if ('A' <= c && c <= 'F') {
return c - 'A';
} else if ('a' <= c && c <= 'f') {
return c - 'a';
} else {
return 0xFF;
}
}
int hbHexStrToArray(uint8_t* arr, const char* str, uint8_t padding)
{
uint8_t* p = arr;
uint8_t hi = 0, lo = 0;
int slen = strlen(str);
padding &= 0x0F;
for (int i = 0; i < slen / 2; i++) {
char c = str[i * 2];
if ((hi = char2hex(c)) == 0xFF) {
return 0;
}
if (i * 2 + 1 < slen) {
c = str[i * 2 + 1];
if ((lo = char2hex(c)) == 0xFF) {
return 0;
}
} else {
lo = padding;
}
*p++ = ((hi << 4) & 0xF0) | (lo & 0x0F);
}
return p - arr;
}
/* /*
* Ademco library * Ademco library
* captainwong * captainwong
* 2022-6-13 rewrited this C version * 2022-6-13 rewrited this C version
...@@ -295,6 +295,11 @@ typedef enum AdemcoXDataLengthFormat { ...@@ -295,6 +295,11 @@ typedef enum AdemcoXDataLengthFormat {
FOUR_DECIMAL, // 四个decimal char 表示长度 FOUR_DECIMAL, // 四个decimal char 表示长度
}AdemcoXDataLengthFormat; }AdemcoXDataLengthFormat;
typedef enum AdemcoXDataTransform {
AdemcoXDataTransform_as_is, // 原样打包
AdemcoXDataTransform_to_ascii, // 转为ascii打包,如 0xEB 0xBA 打包为 "EBBA"
}AdemcoXDataTransform;
typedef struct AdemcoXDataSegment { typedef struct AdemcoXDataSegment {
AdemcoXDataLengthFormat lenghFormat; AdemcoXDataLengthFormat lenghFormat;
uint8_t raw[ADEMCO_PACKET_XDATA_MAX_LEN]; uint8_t raw[ADEMCO_PACKET_XDATA_MAX_LEN];
...@@ -338,6 +343,9 @@ typedef struct AdemcoPacket { ...@@ -338,6 +343,9 @@ typedef struct AdemcoPacket {
AdemcoDataSegment data; AdemcoDataSegment data;
AdemcoXDataSegment xdata; AdemcoXDataSegment xdata;
time_t timestamp; time_t timestamp;
uint8_t raw[ADEMCO_PACKET_MAX_LEN];
int raw_len;
}AdemcoPacket; }AdemcoPacket;
...@@ -357,14 +365,14 @@ ADEMCO_EXPORT_SYMBOL const char* ademcoEventToString(AdemcoEvent ademcoEvent); ...@@ -357,14 +365,14 @@ ADEMCO_EXPORT_SYMBOL const char* ademcoEventToString(AdemcoEvent ademcoEvent);
ADEMCO_EXPORT_SYMBOL const wchar_t* ademcoEventToStringChinese(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 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 int ademcoAppendDataSegment2(AdemcoDataSegment* dataSegment, AdemcoId ademcoId, AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone);
ADEMCO_EXPORT_SYMBOL AdemcoParseResult ademcoParseDataSegment(const uint8_t* packet, int packet_len, 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 // 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 int ademcoDataSegmentToCongwinFe100(uint8_t* fe100, const AdemcoDataSegment* dataSegment);
ADEMCO_EXPORT_SYMBOL const uint8_t* ademcoXDataGetValidContentAddr(const AdemcoXDataSegment* xdata); ADEMCO_EXPORT_SYMBOL const uint8_t* ademcoXDataGetValidContentAddr(const AdemcoXDataSegment* xdata);
ADEMCO_EXPORT_SYMBOL int ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata); ADEMCO_EXPORT_SYMBOL int ademcoXDataGetValidContentLen(const AdemcoXDataSegment* xdata);
// return ADEMCO_OK for success, return ADEMCO_ERR for len is too long // 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 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 int isAdemcoId(const char* standard, const char* id, int len);
ADEMCO_EXPORT_SYMBOL AdemcoPacketId getAdemcoId(const char* id, int len); ADEMCO_EXPORT_SYMBOL AdemcoPacketId getAdemcoId(const char* id, int len);
...@@ -382,6 +390,13 @@ ADEMCO_EXPORT_SYMBOL int ademcoMakeNakPacket(uint8_t* buff, int len, uint16_t se ...@@ -382,6 +390,13 @@ ADEMCO_EXPORT_SYMBOL int ademcoMakeNakPacket(uint8_t* buff, int len, uint16_t se
ADEMCO_EXPORT_SYMBOL int ademcoMakeHbPacket(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, AdemcoXDataSegment* xdata); AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone, AdemcoXDataSegment* xdata);
// like upper funcs, store buff and len to pkt->raw, pkt->raw_len
ADEMCO_EXPORT_SYMBOL int ademcoMakeNullPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL int ademcoMakeAckPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL int ademcoMakeNakPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId);
ADEMCO_EXPORT_SYMBOL int ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq, const char* acct, AdemcoId ademcoId,
AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone, AdemcoXDataSegment* xdata);
ADEMCO_EXPORT_SYMBOL AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket* pkt, int* cb_commited); 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(char c, uint16_t crc);
...@@ -790,6 +805,7 @@ ADEMCO_EXPORT_SYMBOL void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* da ...@@ -790,6 +805,7 @@ ADEMCO_EXPORT_SYMBOL void hbComMakeRespAD_getMachineZoneLostConfig(HbComData* da
ADEMCO_EXPORT_SYMBOL void hbComMakeRespAF_set3SectionMachineStatus(HbComData* data, HbCom_3sec_which p1, HbCom_3sec_status status); 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 hbComMakeRespB1_get3SectionMachineStatus(HbComData* data, HbMachineStatus statusMachine,
HbMachineStatus statusSec1, HbMachineStatus statusSec2, HbMachineStatus statusSec3); HbMachineStatus statusSec1, HbMachineStatus statusSec2, HbMachineStatus statusSec3);
ADEMCO_EXPORT_SYMBOL void hbComDataToAdemcoXData(const HbComData* const data, AdemcoXDataSegment* xdata, AdemcoXDataLengthFormat xlf, AdemcoXDataTransform xtr);
// 将一串以高低字节表示的十六进制数组转换为10进制数字符串,遇0xf或非'0'~'9'字符停止,返回字符串长度 // 将一串以高低字节表示的十六进制数组转换为10进制数字符串,遇0xf或非'0'~'9'字符停止,返回字符串长度
// 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101" // 示例:输入数组:0x18 0x24 0x08 0x88 0x10 0x1f 0xff,输出字符串"18240888101"
...@@ -798,7 +814,17 @@ ADEMCO_EXPORT_SYMBOL int hbHiLoArrayToDecStr(char* str, const uint8_t* arr, int ...@@ -798,7 +814,17 @@ ADEMCO_EXPORT_SYMBOL int hbHiLoArrayToDecStr(char* str, const uint8_t* arr, int
// 示例:输入字符串 "18240888101", len=9, 则arr内容为 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff, return 9 // 示例:输入字符串 "18240888101", len=9, 则arr内容为 0x18 0x24 0x08 0x88 0x10 0x1f 0xff 0xff 0xff, return 9
// 输入字符串 "12345678901234567890", len=9, 则失败返回0 // 输入字符串 "12345678901234567890", len=9, 则失败返回0
ADEMCO_EXPORT_SYMBOL int hbDecStrToHiLoArray(uint8_t* arr, int len, const char* str); ADEMCO_EXPORT_SYMBOL int hbDecStrToHiLoArray(uint8_t* arr, int len, const char* str);
// 将一串字节流转换为可打印形式
// 示例:输入 arr=[0xEB 0xBA 0x3F], len=3, 输出str = "EBBA3F"
// 返回str长度(len * 2)
ADEMCO_EXPORT_SYMBOL int hbHexArrayToStr(char* str, const uint8_t* arr, int len);
// 将一串字符串(内容为'0'~'9', 'A'~'F')转为字节流,若strlen(str)为奇数,以padding补足arr, padding 应 <= 0x0F
// 若str内包含非hex字符串,返回0
// 示例:输入字符串str="EBBA3F", 输出arr = [0xEB, 0xBA, 0x3F],返回 strlen(str) / 2
// 示例:输入字符串str="ABC", padding = 0, 输出arr=[0xAB, 0xC0],返回2
// 示例:输入字符串str="ABC", padding = 0x0F, 输出arr=[0xAB, 0xCF],返回2
// caller should make sure arr has enough space (strlen(str) / 2) to store result
ADEMCO_EXPORT_SYMBOL int hbHexStrToArray(uint8_t* arr, const char* str, uint8_t padding);
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -153,7 +153,7 @@ ...@@ -153,7 +153,7 @@
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\c\ademco.c" /> <ClCompile Include="..\..\c\ademco.c" />
<ClCompile Include="dllmain.cpp" /> <ClCompile Include="dllmain.c" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\c\ademco.h" /> <ClInclude Include="..\..\c\ademco.h" />
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
</Filter> </Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="dllmain.cpp"> <ClCompile Include="dllmain.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\c\ademco.c"> <ClCompile Include="..\..\c\ademco.c">
......
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