From cb686cd6314d3e181bd91c0f2d449750c9429be7 Mon Sep 17 00:00:00 2001 From: cbdev Date: Wed, 21 Jun 2023 00:36:33 +0200 Subject: Formalize tag status flags --- reader.c | 56 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 19 deletions(-) (limited to 'reader.c') diff --git a/reader.c b/reader.c index 0704fca..f37ade4 100644 --- a/reader.c +++ b/reader.c @@ -13,10 +13,8 @@ #define DEFAULT_POLL_TIMEOUT 1000 #define MAX_TAGS 5 -#define FLAG_PRESENT 1 -#define FLAG_FULLY_READ 2 -#define FLAG_UNPROGRAMMED 4 -#define FLAG_ACTIVE 8 +#define FLAG_PRESENT 8 +#define FLAG_ACTIVE 16 static void* reader_module = NULL; static reader_plugin_handle reader_backend_handle = NULL; @@ -99,20 +97,32 @@ static int reader_process(){ size_t n = 0; for(n = 0; n < MAX_TAGS; n++){ if(tags[n].flags & FLAG_PRESENT){ - //TODO verify tag is fully read before pushing - if(!(tags[n].flags & FLAG_ACTIVE)){ //new tag - //TODO - printf("Tag index %lu detected\n", n); tags[n].flags |= FLAG_ACTIVE; + if(tags[n].flags & FLAG_TAG_LOCKED){ + printf("A tag was detected (slot %lu), but no key is known\n", n); + return 0; + } + if(tags[n].flags & FLAG_TAG_UNPROGRAMMED){ + printf("Unprogrammed tag detected (slot %lu)\n", n); + //TODO + return 0; + } + if(tags[n].flags & FLAG_TAG_DATA_VALID){ + printf("Command tag detected (slot %lu)\n", n); + //TODO + return 0; + } + + printf("Tag detected (slot %lu), but no state flags set by reader\n", n); } } else{ if(tags[n].flags & FLAG_ACTIVE){ //tag was removed //TODO - printf("Tag index %lu removed\n", n); + printf("Tag in slot %lu removed\n", n); } //reset all flags @@ -122,32 +132,40 @@ static int reader_process(){ return 0; } -int reader_tag_present(nfc_tag_info_t tag){ +int reader_tag_present(uint8_t flags, nfc_tag_info_t tag){ size_t n = 0; + //sanitize input flags + flags &= (FLAG_TAG_DATA_VALID | FLAG_TAG_UNPROGRAMMED | FLAG_TAG_LOCKED); + //check if tag already known for(n = 0; n < MAX_TAGS; n++){ if((tags[n].flags & (FLAG_PRESENT | FLAG_ACTIVE)) && tags[n].info.uid_length == tag.uid_length && !memcmp(tags[n].info.uid, tag.uid, tag.uid_length)){ - //mark still active + //mark still present tags[n].flags |= FLAG_PRESENT; - //TODO if full data submitted, copy in - - //if data has not yet been fully read, request a full read - return (tags[n].flags & (FLAG_FULLY_READ | FLAG_UNPROGRAMMED)) ? 0 : TAG_READ_REQUESTED; + //if full data submitted, copy in and set flags + if(!(tags[n].flags & TAG_STATUS_FLAGS)){ + if(flags & TAG_STATUS_FLAGS){ + memcpy(&(tags[n].info), &tag, sizeof(tag)); + tags[n].flags |= flags; + return 0; + } + //if data has not yet been fully read, request a full read + return TAG_READ_REQUESTED; + } + return 0; } } //if not, add it for(n = 0; n < MAX_TAGS; n++){ if(!tags[n].flags){ - tags[n].flags |= FLAG_PRESENT; + tags[n].flags |= FLAG_PRESENT | flags; memcpy(&(tags[n].info), &tag, sizeof(tag)); - - //TODO set FULLY_READ flag if necessary - return 0; + return (tags[n].flags & TAG_STATUS_FLAGS) ? 0 : TAG_READ_REQUESTED; } } -- cgit v1.2.3