Simplify code and parity

This commit is contained in:
Jean-Michel Picod 2025-02-20 09:38:32 +01:00
commit e836e4bda3

View file

@ -879,7 +879,7 @@ static bool Unpack_HGeneric37(wiegand_message_t *packed, wiegand_card_t *card) {
static bool Pack_H800002(int format_idx, wiegand_card_t *card, static bool Pack_H800002(int format_idx, wiegand_card_t *card,
wiegand_message_t *packed, bool preamble) { wiegand_message_t *packed, bool preamble) {
uint32_t parity = 0; int even_parity = 0;
memset(packed, 0, sizeof(wiegand_message_t)); memset(packed, 0, sizeof(wiegand_message_t));
if (!validate_card_limit(format_idx, card)) { if (!validate_card_limit(format_idx, card)) {
@ -890,12 +890,11 @@ static bool Pack_H800002(int format_idx, wiegand_card_t *card,
set_linear_field(packed, card->FacilityCode, 1, 14); set_linear_field(packed, card->FacilityCode, 1, 14);
set_linear_field(packed, card->CardNumber, 15, 30); set_linear_field(packed, card->CardNumber, 15, 30);
parity = get_linear_field(packed, 1, 32); // Parity over 44 bits
parity ^= get_linear_field(packed, 33, 12); even_parity = evenparity32((packed->Bot >> 1) ^ (packed->Mid & 0x1fff));
set_bit_by_position(packed, evenparity32(parity), 0); set_bit_by_position(packed, even_parity, 0);
parity = get_linear_field(packed, 1, 32); // Invert parity for setting odd parity
parity ^= get_linear_field(packed, 33, 12); set_bit_by_position(packed, even_parity ^ 1, 45);
set_bit_by_position(packed, oddparity32(parity), 45);
if (preamble) { if (preamble) {
return add_HID_header(packed); return add_HID_header(packed);
} }
@ -903,7 +902,7 @@ static bool Pack_H800002(int format_idx, wiegand_card_t *card,
} }
static bool Unpack_H800002(wiegand_message_t *packed, wiegand_card_t *card) { static bool Unpack_H800002(wiegand_message_t *packed, wiegand_card_t *card) {
uint32_t parity = 0; int even_parity = 0;
memset(card, 0, sizeof(wiegand_card_t)); memset(card, 0, sizeof(wiegand_card_t));
if (packed->Length != 46) { if (packed->Length != 46) {
@ -912,12 +911,10 @@ static bool Unpack_H800002(wiegand_message_t *packed, wiegand_card_t *card) {
card->FacilityCode = get_linear_field(packed, 1, 14); card->FacilityCode = get_linear_field(packed, 1, 14);
card->CardNumber = get_linear_field(packed, 15, 30); card->CardNumber = get_linear_field(packed, 15, 30);
parity = get_linear_field(packed, 1, 32); even_parity = evenparity32((packed->Bot >> 1) ^ (packed->Mid & 0x1fff));
parity ^= get_linear_field(packed, 33, 12); card->ParityValid = get_bit_by_position(packed, 0) == even_parity;
card->ParityValid = get_bit_by_position(packed, 0) == evenparity32(parity); // Invert logic to compare against oddparity
parity = get_linear_field(packed, 1, 32); card->ParityValid &= get_bit_by_position(packed, 45) != even_parity;
parity ^= get_linear_field(packed, 33, 12);
card->ParityValid &= get_bit_by_position(packed, 45) == oddparity32(parity);
return true; return true;
} }