Uses an ID20 RFID Reader to create a tag list with a few functions that include: printing the current list, checking if a tag exists in the list, adding a tag to the list, and deleting a tag from the list
Dependencies: ID12RFID TextLCD mbed
Code to create an RFID Tag List. Page is located at http://mbed.org/users/memsterjr09/notebook/rfid-tag-list-builder/
main.cpp@0:fa3fe200c570, 2013-10-16 (annotated)
- Committer:
- memsterjr09
- Date:
- Wed Oct 16 03:14:09 2013 +0000
- Revision:
- 0:fa3fe200c570
- Child:
- 1:867cf1706b42
RFID Tag List
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
memsterjr09 | 0:fa3fe200c570 | 1 | #include "mbed.h" |
memsterjr09 | 0:fa3fe200c570 | 2 | #include "ID12RFID.h" |
memsterjr09 | 0:fa3fe200c570 | 3 | #include "TextLCD.h" |
memsterjr09 | 0:fa3fe200c570 | 4 | #include "RFID_Functions.h" |
memsterjr09 | 0:fa3fe200c570 | 5 | |
memsterjr09 | 0:fa3fe200c570 | 6 | |
memsterjr09 | 0:fa3fe200c570 | 7 | DigitalIn show(p24); //PushButton to show list |
memsterjr09 | 0:fa3fe200c570 | 8 | DigitalIn look(p23); //PushButton to look if user is in list |
memsterjr09 | 0:fa3fe200c570 | 9 | DigitalIn add(p22); //PushButton to add user to list |
memsterjr09 | 0:fa3fe200c570 | 10 | DigitalIn del(p21); //PushButton to delete user from list |
memsterjr09 | 0:fa3fe200c570 | 11 | ID12RFID rfid(p14); // uart rx |
memsterjr09 | 0:fa3fe200c570 | 12 | Serial pc(USBTX, USBRX); //PC Terminal Display |
memsterjr09 | 0:fa3fe200c570 | 13 | TextLCD lcd(p15, p16, p17, p18, p19, p20); //LCD Screen Display |
memsterjr09 | 0:fa3fe200c570 | 14 | int state = 0; // Will determine what pushbutton is being pressed |
memsterjr09 | 0:fa3fe200c570 | 15 | LinkedList IDList = emptyList(); //initialize the IDList |
memsterjr09 | 0:fa3fe200c570 | 16 | LLNode *toAdd = IDList.head; //Create an Empty Tag Node |
memsterjr09 | 0:fa3fe200c570 | 17 | int ID = 0; // Initialize the ID number |
memsterjr09 | 0:fa3fe200c570 | 18 | int found; // Flag that will determine if an ID exists in the list already |
memsterjr09 | 0:fa3fe200c570 | 19 | int main() |
memsterjr09 | 0:fa3fe200c570 | 20 | { |
memsterjr09 | 0:fa3fe200c570 | 21 | lcd.cls(); //Clear the Screen on Reset |
memsterjr09 | 0:fa3fe200c570 | 22 | // Initialize the pullup resistors in pushbutton |
memsterjr09 | 0:fa3fe200c570 | 23 | show.mode(PullUp); |
memsterjr09 | 0:fa3fe200c570 | 24 | look.mode(PullUp); |
memsterjr09 | 0:fa3fe200c570 | 25 | add.mode(PullUp); |
memsterjr09 | 0:fa3fe200c570 | 26 | del.mode(PullUp); |
memsterjr09 | 0:fa3fe200c570 | 27 | while(1) { |
memsterjr09 | 0:fa3fe200c570 | 28 | lcd.cls(); |
memsterjr09 | 0:fa3fe200c570 | 29 | // Determine if any of the pushbuttons are being pressed, and update the state accordingly |
memsterjr09 | 0:fa3fe200c570 | 30 | if(!show) state = 1; |
memsterjr09 | 0:fa3fe200c570 | 31 | if(!look) state = 2; |
memsterjr09 | 0:fa3fe200c570 | 32 | if(!add) state = 3; |
memsterjr09 | 0:fa3fe200c570 | 33 | if(!del) state = 4; |
memsterjr09 | 0:fa3fe200c570 | 34 | switch(state) { |
memsterjr09 | 0:fa3fe200c570 | 35 | // Print the List |
memsterjr09 | 0:fa3fe200c570 | 36 | case 1: |
memsterjr09 | 0:fa3fe200c570 | 37 | lcd.printf("Printing List"); |
memsterjr09 | 0:fa3fe200c570 | 38 | wait(1); |
memsterjr09 | 0:fa3fe200c570 | 39 | showList(IDList); |
memsterjr09 | 0:fa3fe200c570 | 40 | lcd.cls(); |
memsterjr09 | 0:fa3fe200c570 | 41 | lcd.printf("List Printed"); |
memsterjr09 | 0:fa3fe200c570 | 42 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 43 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 44 | break; |
memsterjr09 | 0:fa3fe200c570 | 45 | // Check to see if an ID exists in the list already |
memsterjr09 | 0:fa3fe200c570 | 46 | case 2: |
memsterjr09 | 0:fa3fe200c570 | 47 | int flag = false; |
memsterjr09 | 0:fa3fe200c570 | 48 | lcd.printf("Look Up Tag\n"); |
memsterjr09 | 0:fa3fe200c570 | 49 | lcd.printf("Scan RFID Tag"); |
memsterjr09 | 0:fa3fe200c570 | 50 | // Wait for a Tag to be scanned |
memsterjr09 | 0:fa3fe200c570 | 51 | while(!ID) { |
memsterjr09 | 0:fa3fe200c570 | 52 | if(rfid.readable()) { |
memsterjr09 | 0:fa3fe200c570 | 53 | ID = rfid.read(); |
memsterjr09 | 0:fa3fe200c570 | 54 | } |
memsterjr09 | 0:fa3fe200c570 | 55 | wait(1); |
memsterjr09 | 0:fa3fe200c570 | 56 | } |
memsterjr09 | 0:fa3fe200c570 | 57 | lcd.cls(); |
memsterjr09 | 0:fa3fe200c570 | 58 | LLNode *node = IDList.head; |
memsterjr09 | 0:fa3fe200c570 | 59 | // Traverse through the list. Will figure out if the tag exists in the list already |
memsterjr09 | 0:fa3fe200c570 | 60 | while(node->data != NULL) { |
memsterjr09 | 0:fa3fe200c570 | 61 | if(node->data == ID) { |
memsterjr09 | 0:fa3fe200c570 | 62 | lcd.printf("ID: %d\n", ID); |
memsterjr09 | 0:fa3fe200c570 | 63 | lcd.printf("Was Found"); |
memsterjr09 | 0:fa3fe200c570 | 64 | ID = 0; |
memsterjr09 | 0:fa3fe200c570 | 65 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 66 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 67 | flag = true; |
memsterjr09 | 0:fa3fe200c570 | 68 | break; |
memsterjr09 | 0:fa3fe200c570 | 69 | } |
memsterjr09 | 0:fa3fe200c570 | 70 | node = node->next; |
memsterjr09 | 0:fa3fe200c570 | 71 | } |
memsterjr09 | 0:fa3fe200c570 | 72 | // If the flag was set, then the tag was found in the list, so don't want to do the Not Found part |
memsterjr09 | 0:fa3fe200c570 | 73 | if(flag) break; |
memsterjr09 | 0:fa3fe200c570 | 74 | lcd.printf("ID: %d\n", ID); |
memsterjr09 | 0:fa3fe200c570 | 75 | lcd.printf("Was Not Found"); |
memsterjr09 | 0:fa3fe200c570 | 76 | ID = 0; |
memsterjr09 | 0:fa3fe200c570 | 77 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 78 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 79 | break; |
memsterjr09 | 0:fa3fe200c570 | 80 | // Add a tag to the list |
memsterjr09 | 0:fa3fe200c570 | 81 | case 3: |
memsterjr09 | 0:fa3fe200c570 | 82 | lcd.printf("Add Tag\n"); |
memsterjr09 | 0:fa3fe200c570 | 83 | lcd.printf("Scan RFID Tag"); |
memsterjr09 | 0:fa3fe200c570 | 84 | // Wait or a tag scan |
memsterjr09 | 0:fa3fe200c570 | 85 | while(!ID) { |
memsterjr09 | 0:fa3fe200c570 | 86 | if(rfid.readable()) { |
memsterjr09 | 0:fa3fe200c570 | 87 | ID = rfid.read(); |
memsterjr09 | 0:fa3fe200c570 | 88 | } |
memsterjr09 | 0:fa3fe200c570 | 89 | wait(1); |
memsterjr09 | 0:fa3fe200c570 | 90 | } |
memsterjr09 | 0:fa3fe200c570 | 91 | lcd.cls(); |
memsterjr09 | 0:fa3fe200c570 | 92 | // Determine if the Tag already exists in the list |
memsterjr09 | 0:fa3fe200c570 | 93 | found = lookUp(IDList, ID); |
memsterjr09 | 0:fa3fe200c570 | 94 | // Tag previously exists |
memsterjr09 | 0:fa3fe200c570 | 95 | if(found) { |
memsterjr09 | 0:fa3fe200c570 | 96 | lcd.printf("ID: %d\n", ID); |
memsterjr09 | 0:fa3fe200c570 | 97 | lcd.printf("Exists in List"); |
memsterjr09 | 0:fa3fe200c570 | 98 | ID = 0; |
memsterjr09 | 0:fa3fe200c570 | 99 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 100 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 101 | break; |
memsterjr09 | 0:fa3fe200c570 | 102 | // Tag doesn't exist |
memsterjr09 | 0:fa3fe200c570 | 103 | } else { |
memsterjr09 | 0:fa3fe200c570 | 104 | addToList(&IDList, ID); |
memsterjr09 | 0:fa3fe200c570 | 105 | lcd.printf("ID: %d\n", ID); |
memsterjr09 | 0:fa3fe200c570 | 106 | lcd.printf("Added to List"); |
memsterjr09 | 0:fa3fe200c570 | 107 | ID = 0; |
memsterjr09 | 0:fa3fe200c570 | 108 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 109 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 110 | break; |
memsterjr09 | 0:fa3fe200c570 | 111 | } |
memsterjr09 | 0:fa3fe200c570 | 112 | // Delete a tag from the list |
memsterjr09 | 0:fa3fe200c570 | 113 | case 4: |
memsterjr09 | 0:fa3fe200c570 | 114 | lcd.printf("Delete Tag\n"); |
memsterjr09 | 0:fa3fe200c570 | 115 | lcd.printf("Scan RFID Tag"); |
memsterjr09 | 0:fa3fe200c570 | 116 | // Wait for a tag scan |
memsterjr09 | 0:fa3fe200c570 | 117 | while(!ID) { |
memsterjr09 | 0:fa3fe200c570 | 118 | if(rfid.readable()) { |
memsterjr09 | 0:fa3fe200c570 | 119 | ID = rfid.read(); |
memsterjr09 | 0:fa3fe200c570 | 120 | } |
memsterjr09 | 0:fa3fe200c570 | 121 | wait(1); |
memsterjr09 | 0:fa3fe200c570 | 122 | } |
memsterjr09 | 0:fa3fe200c570 | 123 | lcd.cls(); |
memsterjr09 | 0:fa3fe200c570 | 124 | // Determine if the tag exists in the list |
memsterjr09 | 0:fa3fe200c570 | 125 | found = lookUp(IDList, ID); |
memsterjr09 | 0:fa3fe200c570 | 126 | // If it does, delete it from the list |
memsterjr09 | 0:fa3fe200c570 | 127 | if(found) { |
memsterjr09 | 0:fa3fe200c570 | 128 | deleteFromList(&IDList, ID); |
memsterjr09 | 0:fa3fe200c570 | 129 | lcd.printf("ID: %d\n", ID); |
memsterjr09 | 0:fa3fe200c570 | 130 | lcd.printf("Deleted"); |
memsterjr09 | 0:fa3fe200c570 | 131 | ID = 0; |
memsterjr09 | 0:fa3fe200c570 | 132 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 133 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 134 | break; |
memsterjr09 | 0:fa3fe200c570 | 135 | // Otherwise, tell the user it doesn't exist |
memsterjr09 | 0:fa3fe200c570 | 136 | } else { |
memsterjr09 | 0:fa3fe200c570 | 137 | lcd.printf("ID: %d\n", ID); |
memsterjr09 | 0:fa3fe200c570 | 138 | lcd.printf("Not in List"); |
memsterjr09 | 0:fa3fe200c570 | 139 | ID = 0; |
memsterjr09 | 0:fa3fe200c570 | 140 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 141 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 142 | break; |
memsterjr09 | 0:fa3fe200c570 | 143 | } |
memsterjr09 | 0:fa3fe200c570 | 144 | } |
memsterjr09 | 0:fa3fe200c570 | 145 | } |
memsterjr09 | 0:fa3fe200c570 | 146 | } |
memsterjr09 | 0:fa3fe200c570 | 147 | |
memsterjr09 | 0:fa3fe200c570 | 148 | // Initializes an empty Tag list |
memsterjr09 | 0:fa3fe200c570 | 149 | LinkedList emptyList() |
memsterjr09 | 0:fa3fe200c570 | 150 | { |
memsterjr09 | 0:fa3fe200c570 | 151 | LinkedList it = {NULL, NULL}; |
memsterjr09 | 0:fa3fe200c570 | 152 | addPhantom(&it); |
memsterjr09 | 0:fa3fe200c570 | 153 | return it; |
memsterjr09 | 0:fa3fe200c570 | 154 | } |
memsterjr09 | 0:fa3fe200c570 | 155 | |
memsterjr09 | 0:fa3fe200c570 | 156 | // Print the list via USB Serial port to the PC |
memsterjr09 | 0:fa3fe200c570 | 157 | void showList(LinkedList theList) |
memsterjr09 | 0:fa3fe200c570 | 158 | { |
memsterjr09 | 0:fa3fe200c570 | 159 | LLNode *phere = theList.head; /* start at the head */ |
memsterjr09 | 0:fa3fe200c570 | 160 | int n = 1; |
memsterjr09 | 0:fa3fe200c570 | 161 | pc.printf("***********\n"); //start the list |
memsterjr09 | 0:fa3fe200c570 | 162 | if(phere->data == 0) pc.printf("No Tags in List\n"); //List is empty |
memsterjr09 | 0:fa3fe200c570 | 163 | else pc.printf("%d: %d\n", n, phere->data); //List isn't empty, print first tag |
memsterjr09 | 0:fa3fe200c570 | 164 | n++; |
memsterjr09 | 0:fa3fe200c570 | 165 | while(phere->next) { |
memsterjr09 | 0:fa3fe200c570 | 166 | pc.printf("%d: %d\n", n, phere->next->data); // keep printing while there is still data |
memsterjr09 | 0:fa3fe200c570 | 167 | phere = phere->next; /* work forward via next ptrs */ |
memsterjr09 | 0:fa3fe200c570 | 168 | n++; |
memsterjr09 | 0:fa3fe200c570 | 169 | } |
memsterjr09 | 0:fa3fe200c570 | 170 | pc.printf("***********\n\n"); // end the list |
memsterjr09 | 0:fa3fe200c570 | 171 | } |
memsterjr09 | 0:fa3fe200c570 | 172 | |
memsterjr09 | 0:fa3fe200c570 | 173 | // Add a tag to the list (added to the back of the list) |
memsterjr09 | 0:fa3fe200c570 | 174 | void addToList(LinkedList *pLL, int data) |
memsterjr09 | 0:fa3fe200c570 | 175 | { |
memsterjr09 | 0:fa3fe200c570 | 176 | // If the list has no data, its the head of the list |
memsterjr09 | 0:fa3fe200c570 | 177 | if(pLL->head->data == NULL) { |
memsterjr09 | 0:fa3fe200c570 | 178 | pLL->head->data = data; |
memsterjr09 | 0:fa3fe200c570 | 179 | // otherwise you have to add a new node to the tail of the list |
memsterjr09 | 0:fa3fe200c570 | 180 | } else { |
memsterjr09 | 0:fa3fe200c570 | 181 | // Initialize the node |
memsterjr09 | 0:fa3fe200c570 | 182 | LLNode *toAdd = (LLNode *) malloc(sizeof(LLNode)); |
memsterjr09 | 0:fa3fe200c570 | 183 | // Add the data and fix all of the pointers |
memsterjr09 | 0:fa3fe200c570 | 184 | toAdd->data = data; |
memsterjr09 | 0:fa3fe200c570 | 185 | toAdd->prev = pLL->tail; |
memsterjr09 | 0:fa3fe200c570 | 186 | toAdd->next = NULL; |
memsterjr09 | 0:fa3fe200c570 | 187 | pLL->tail->next = toAdd; |
memsterjr09 | 0:fa3fe200c570 | 188 | pLL->tail = toAdd; |
memsterjr09 | 0:fa3fe200c570 | 189 | } |
memsterjr09 | 0:fa3fe200c570 | 190 | } |
memsterjr09 | 0:fa3fe200c570 | 191 | |
memsterjr09 | 0:fa3fe200c570 | 192 | // Used to create the first empty node in the initial list |
memsterjr09 | 0:fa3fe200c570 | 193 | void addPhantom(LinkedList *pLL) |
memsterjr09 | 0:fa3fe200c570 | 194 | { |
memsterjr09 | 0:fa3fe200c570 | 195 | /* create LLNode */ |
memsterjr09 | 0:fa3fe200c570 | 196 | LLNode *phere = (LLNode *) malloc(sizeof(LLNode)); |
memsterjr09 | 0:fa3fe200c570 | 197 | phere->data = NULL; |
memsterjr09 | 0:fa3fe200c570 | 198 | phere->next = NULL; |
memsterjr09 | 0:fa3fe200c570 | 199 | phere->prev = NULL; |
memsterjr09 | 0:fa3fe200c570 | 200 | pLL->head = phere; |
memsterjr09 | 0:fa3fe200c570 | 201 | pLL->tail = phere; |
memsterjr09 | 0:fa3fe200c570 | 202 | } |
memsterjr09 | 0:fa3fe200c570 | 203 | |
memsterjr09 | 0:fa3fe200c570 | 204 | // delete a tag from the list |
memsterjr09 | 0:fa3fe200c570 | 205 | void deleteFromList(LinkedList *pll, int data) |
memsterjr09 | 0:fa3fe200c570 | 206 | { |
memsterjr09 | 0:fa3fe200c570 | 207 | // Flags used to delete |
memsterjr09 | 0:fa3fe200c570 | 208 | int flag = true; |
memsterjr09 | 0:fa3fe200c570 | 209 | int first = true; |
memsterjr09 | 0:fa3fe200c570 | 210 | // Get first node |
memsterjr09 | 0:fa3fe200c570 | 211 | LLNode *node = pll->head; |
memsterjr09 | 0:fa3fe200c570 | 212 | while(flag) { |
memsterjr09 | 0:fa3fe200c570 | 213 | // If you find the tag |
memsterjr09 | 0:fa3fe200c570 | 214 | if(node->data == data) { |
memsterjr09 | 0:fa3fe200c570 | 215 | // If its the first node, then you just have to move the head pointer |
memsterjr09 | 0:fa3fe200c570 | 216 | if(first) { |
memsterjr09 | 0:fa3fe200c570 | 217 | pll->head = pll->head->next; |
memsterjr09 | 0:fa3fe200c570 | 218 | flag = false; |
memsterjr09 | 0:fa3fe200c570 | 219 | // if its the last tag added... just adjust the tail pointers |
memsterjr09 | 0:fa3fe200c570 | 220 | } else { |
memsterjr09 | 0:fa3fe200c570 | 221 | if(node->next == NULL) { |
memsterjr09 | 0:fa3fe200c570 | 222 | pll->tail = node->prev; |
memsterjr09 | 0:fa3fe200c570 | 223 | node->prev->next = NULL; |
memsterjr09 | 0:fa3fe200c570 | 224 | flag = false; |
memsterjr09 | 0:fa3fe200c570 | 225 | //otherwise just skip the node in the list |
memsterjr09 | 0:fa3fe200c570 | 226 | } else { |
memsterjr09 | 0:fa3fe200c570 | 227 | node->prev->next = node->next; |
memsterjr09 | 0:fa3fe200c570 | 228 | node->next->prev = node->prev; |
memsterjr09 | 0:fa3fe200c570 | 229 | flag = false; |
memsterjr09 | 0:fa3fe200c570 | 230 | } |
memsterjr09 | 0:fa3fe200c570 | 231 | } |
memsterjr09 | 0:fa3fe200c570 | 232 | } |
memsterjr09 | 0:fa3fe200c570 | 233 | // Traverse through the list via next pointers |
memsterjr09 | 0:fa3fe200c570 | 234 | node = node->next; |
memsterjr09 | 0:fa3fe200c570 | 235 | first = false; |
memsterjr09 | 0:fa3fe200c570 | 236 | } |
memsterjr09 | 0:fa3fe200c570 | 237 | } |
memsterjr09 | 0:fa3fe200c570 | 238 | |
memsterjr09 | 0:fa3fe200c570 | 239 | // Used to determine if a tag already exists in the list |
memsterjr09 | 0:fa3fe200c570 | 240 | int lookUp(LinkedList IDList, int ID) |
memsterjr09 | 0:fa3fe200c570 | 241 | { |
memsterjr09 | 0:fa3fe200c570 | 242 | int found = false; |
memsterjr09 | 0:fa3fe200c570 | 243 | LLNode *node = IDList.head; |
memsterjr09 | 0:fa3fe200c570 | 244 | // While the data isn't null, check it |
memsterjr09 | 0:fa3fe200c570 | 245 | while(node->data != NULL) { |
memsterjr09 | 0:fa3fe200c570 | 246 | if(node->data == ID) { |
memsterjr09 | 0:fa3fe200c570 | 247 | found = true; |
memsterjr09 | 0:fa3fe200c570 | 248 | return found; |
memsterjr09 | 0:fa3fe200c570 | 249 | } |
memsterjr09 | 0:fa3fe200c570 | 250 | // if the next pointer is null, we're at the end of the list; |
memsterjr09 | 0:fa3fe200c570 | 251 | if(node->next == NULL) return found; |
memsterjr09 | 0:fa3fe200c570 | 252 | node = node->next; |
memsterjr09 | 0:fa3fe200c570 | 253 | } |
memsterjr09 | 0:fa3fe200c570 | 254 | return found; |
memsterjr09 | 0:fa3fe200c570 | 255 | } |