Commit 4b4cf3b7 authored by captainwong's avatar captainwong

crc16

parent 28f7410b
......@@ -273,9 +273,7 @@ const char* ademcoEventToStringChinese(AdemcoEvent ademcoEvent)
}
}
uint16_t ademcoCRC8(uint8_t c, uint16_t crc)
{
static const uint16_t crcTable[] = {
static const uint16_t crc16Table[256] = {
/* DEFINE THE FIRST ORDER POLYINOMIAL TABLE */
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
......@@ -309,19 +307,15 @@ uint16_t ademcoCRC8(uint8_t c, uint16_t crc)
0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040,
};
uint16_t res = (uint16_t)(crc >> 8) ^ crcTable[(uint8_t)c ^ (uint8_t)(crc & 0xFF)];
return res;
}
};
uint16_t ademcoCRC16(const uint8_t* buff, int len, uint16_t crc)
uint16_t ademcoCRC16(const char* buff, int len)
{
uint16_t CRC = crc;
for (int i = 0; i < len; i++) {
CRC = ademcoCRC8(buff[i], CRC);
uint16_t crc = 0;
while (len--) {
crc = (crc >> 8) ^ crc16Table[(crc ^ *buff++) & 0xFF];
}
return CRC;
return crc;
}
int ademcoAppendDataSegment(uint8_t* buff, AdemcoId ademcoId, AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone)
......@@ -642,7 +636,7 @@ int ademcoMakeEmptyDataPacket(uint8_t* dst_buff, int len, const char* id, uint16
int ademco_len = packet_len - 1 - 4 - 4 - 1;
snprintf(temp, 5, "%04X", ademco_len);
memcpy(plen, temp, 4);
uint16_t crc = ademcoCRC16(pid, ademco_len, 0);
uint16_t crc = ademcoCRC16(pid, ademco_len);
snprintf(temp, 5, "%04X", crc);
memcpy(pcrc, temp, 4);
......@@ -711,7 +705,7 @@ int ademcoMakeHbPacket(uint8_t* dst_buff, int len, uint16_t seq, const char* acc
int ademco_len = packet_len - 1 - 4 - 4 - 1;
snprintf(temp, 5, "%04X", ademco_len);
memcpy(plen, temp, 4);
uint16_t crc = ademcoCRC16((const uint8_t*)pid, ademco_len, 0);
uint16_t crc = ademcoCRC16((const uint8_t*)pid, ademco_len);
snprintf(temp, 5, "%04X", crc);
memcpy(pcrc, temp, 4);
......@@ -809,7 +803,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
break;
}
pkt->crc = ademcoCRC16(pid, pkt->len, 0);
pkt->crc = ademcoCRC16(pid, pkt->len);
if (pkt->crc != crc) {
break;
}
......
......@@ -400,8 +400,18 @@ 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(uint8_t c, uint16_t crc);
ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC16(const uint8_t* buff, int len, uint16_t crc);
/* CRC16 implementation according to ARC
* Name : CRC-16/ARC
* Alias : ARC, CRC-16, CRC-16/LHA, CRC-IBM
* Width : 16 bit
* Poly : 0x8005 (That is actually x^16 + x^15 + x^2 + 1)
* Initialization : 0x0000
* Reflect Input byte : True
* Reflect Output CRC : True
* Xor constant to output CRC : 0x0000
* Output for "123456789" : 0xBB3D
*/
ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC16(const char* buff, int len);
/* Hengbo */
......
......@@ -10,14 +10,27 @@
#endif
#else // WIN32
#ifdef _DEBUG
#pragma comment(lib, "../Win32/Debug/ademco.lib")
#pragma comment(lib, "../Debug/ademco.lib")
#else
#pragma comment(lib, "../Win32/Release/ademco.lib")
#pragma comment(lib, "../Release/ademco.lib")
#endif
#endif
int main()
{
{
uint16_t crc = ademcoCRC16("0", 1);
crc = ademcoCRC16("123456789", 9);
char data[] = "\xEB\xBA";
char data2[] = { 0xEB, 0xBA };
int ret = memcmp("\xEB\xBA", data2, 2);
ret == 0;
}
int cb_commited = 0;
AdemcoPacket pkt;
......@@ -65,11 +78,5 @@ int main()
}
char data[] = "\xEB\xBA";
char data2[] = {0xEB, 0xBA};
int ret = memcmp("\xEB\xBA", data2, 2);
ret == 0;
}
......@@ -7,6 +7,6 @@
<DebuggerFlavor>LinuxDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
<RemoteTarget>-2108636259;192.168.1.168 (username=, port=22, authentication=Password)</RemoteTarget>
<RemoteTarget>-2108636259;192.168.2.168 (username=, port=22, authentication=Password)</RemoteTarget>
</PropertyGroup>
</Project>
\ No newline at end of file
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