From e1fa1e659aef8d4537748db2e5f0f0182ab91168 Mon Sep 17 00:00:00 2001 From: AntiCat Date: Wed, 5 Sep 2018 22:23:44 +0200 Subject: [PATCH] Legic: Implemented write command for card simulation --- armsrc/legicrfsim.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/armsrc/legicrfsim.c b/armsrc/legicrfsim.c index 641907741..71c747115 100644 --- a/armsrc/legicrfsim.c +++ b/armsrc/legicrfsim.c @@ -411,6 +411,31 @@ static int32_t connected_phase(legic_card_select_t *p_card) { // transmit data tx_frame((crc << 8) | byte, 12); + + return 0; + } + + // check if command is LEGIC_WRITE + if(len == p_card->cmdsize + 8 + 4) { + // decode data + uint16_t mask = (1 << p_card->addrsize) - 1; + uint16_t addr = (cmd >> 1) & mask; + uint8_t byte = (cmd >> p_card->cmdsize) & 0xff; + uint8_t crc = (cmd >> (p_card->cmdsize + 8)) & 0xf; + + // check received against calculated crc + uint8_t calc_crc = calc_crc4(addr << 1, p_card->cmdsize, byte); + if(calc_crc != crc) { + Dbprintf("!!! crc mismatch: %x != %x !!!", calc_crc, crc); + return -1; + } + + // store data + legic_mem[addr] = byte; + + // transmit ack + tx_ack(); + return 0; }