diff --git a/client/src/wiegand_formats.c b/client/src/wiegand_formats.c index d7818661c..d43e46964 100644 --- a/client/src/wiegand_formats.c +++ b/client/src/wiegand_formats.c @@ -770,6 +770,69 @@ static bool Unpack_H10302(wiegand_message_t *packed, wiegand_card_t *card) { return true; } + + + + + + + + + + + + + +static bool Pack_P10003(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0x0000FFFF) return false; // Can't encode FC. + if (card->CardNumber > 0x0007FFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 37; // Set number of bits + + set_linear_field(packed, card->FacilityCode, 2, 13); + set_linear_field(packed, card->CardNumber, 15, 18); + + set_bit_by_position(packed, evenparity32(get_linear_field(packed, 1, 18)), 0); + set_bit_by_position(packed, oddparity32(get_linear_field(packed, 18, 18)), 36); + if (preamble) + return add_HID_header(packed); + return true; +} + +static bool Unpack_P10003(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 37) return false; // Wrong length? Stop here. + + card->FacilityCode = get_linear_field(packed, 2, 13); + card->CardNumber = get_linear_field(packed, 15, 18); + card->ParityValid = + (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 18))) && + (get_bit_by_position(packed, 36) == oddparity32(get_linear_field(packed, 18, 18))); + return true; +} + + + + + + + + + + + + + + + + + + static bool Pack_H10304(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t));