diff options
author | cbdev <cb@cbcdn.com> | 2023-06-21 00:36:33 +0200 |
---|---|---|
committer | cbdev <cb@cbcdn.com> | 2023-06-21 00:36:33 +0200 |
commit | cb686cd6314d3e181bd91c0f2d449750c9429be7 (patch) | |
tree | 4f360bb0da5648ee769fb318f4d2ad77831d5a88 /reader.c | |
parent | 0da2f58c7528b504ee54e380b755ea5f0801b4bb (diff) | |
download | nfcommander-cb686cd6314d3e181bd91c0f2d449750c9429be7.tar.gz nfcommander-cb686cd6314d3e181bd91c0f2d449750c9429be7.tar.bz2 nfcommander-cb686cd6314d3e181bd91c0f2d449750c9429be7.zip |
Formalize tag status flags
Diffstat (limited to 'reader.c')
-rw-r--r-- | reader.c | 56 |
1 files changed, 37 insertions, 19 deletions
@@ -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; } } |