Commit 4b4cf3b7 authored by captainwong's avatar captainwong

crc16

parent 28f7410b
...@@ -273,9 +273,7 @@ const char* ademcoEventToStringChinese(AdemcoEvent ademcoEvent) ...@@ -273,9 +273,7 @@ const char* ademcoEventToStringChinese(AdemcoEvent ademcoEvent)
} }
} }
uint16_t ademcoCRC8(uint8_t c, uint16_t crc) static const uint16_t crc16Table[256] = {
{
static const uint16_t crcTable[] = {
/* DEFINE THE FIRST ORDER POLYINOMIAL TABLE */ /* DEFINE THE FIRST ORDER POLYINOMIAL TABLE */
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
...@@ -309,19 +307,15 @@ uint16_t ademcoCRC8(uint8_t c, uint16_t crc) ...@@ -309,19 +307,15 @@ uint16_t ademcoCRC8(uint8_t c, uint16_t crc)
0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040, 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; uint16_t crc = 0;
for (int i = 0; i < len; i++) { while (len--) {
CRC = ademcoCRC8(buff[i], CRC); crc = (crc >> 8) ^ crc16Table[(crc ^ *buff++) & 0xFF];
} }
return CRC; return crc;
} }
int ademcoAppendDataSegment(uint8_t* buff, AdemcoId ademcoId, AdemcoEvent ademcoEvent, AdemcoGG gg, AdemcoZone zone) 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 ...@@ -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; int ademco_len = packet_len - 1 - 4 - 4 - 1;
snprintf(temp, 5, "%04X", ademco_len); snprintf(temp, 5, "%04X", ademco_len);
memcpy(plen, temp, 4); memcpy(plen, temp, 4);
uint16_t crc = ademcoCRC16(pid, ademco_len, 0); uint16_t crc = ademcoCRC16(pid, ademco_len);
snprintf(temp, 5, "%04X", crc); snprintf(temp, 5, "%04X", crc);
memcpy(pcrc, temp, 4); memcpy(pcrc, temp, 4);
...@@ -711,7 +705,7 @@ int ademcoMakeHbPacket(uint8_t* dst_buff, int len, uint16_t seq, const char* acc ...@@ -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; int ademco_len = packet_len - 1 - 4 - 4 - 1;
snprintf(temp, 5, "%04X", ademco_len); snprintf(temp, 5, "%04X", ademco_len);
memcpy(plen, temp, 4); 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); snprintf(temp, 5, "%04X", crc);
memcpy(pcrc, temp, 4); memcpy(pcrc, temp, 4);
...@@ -809,7 +803,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket* ...@@ -809,7 +803,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
break; break;
} }
pkt->crc = ademcoCRC16(pid, pkt->len, 0); pkt->crc = ademcoCRC16(pid, pkt->len);
if (pkt->crc != crc) { if (pkt->crc != crc) {
break; break;
} }
......
...@@ -400,8 +400,18 @@ ADEMCO_EXPORT_SYMBOL int ademcoMakeHbPacket2(AdemcoPacket* pkt, uint16_t seq, co ...@@ -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 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); /* CRC16 implementation according to ARC
ADEMCO_EXPORT_SYMBOL uint16_t ademcoCRC16(const uint8_t* buff, int len, uint16_t crc); * 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 */ /* Hengbo */
......
...@@ -10,14 +10,27 @@ ...@@ -10,14 +10,27 @@
#endif #endif
#else // WIN32 #else // WIN32
#ifdef _DEBUG #ifdef _DEBUG
#pragma comment(lib, "../Win32/Debug/ademco.lib") #pragma comment(lib, "../Debug/ademco.lib")
#else #else
#pragma comment(lib, "../Win32/Release/ademco.lib") #pragma comment(lib, "../Release/ademco.lib")
#endif #endif
#endif #endif
int main() 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; int cb_commited = 0;
AdemcoPacket pkt; AdemcoPacket pkt;
...@@ -65,11 +78,5 @@ int main() ...@@ -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 @@ ...@@ -7,6 +7,6 @@
<DebuggerFlavor>LinuxDebugger</DebuggerFlavor> <DebuggerFlavor>LinuxDebugger</DebuggerFlavor>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'"> <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> </PropertyGroup>
</Project> </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