![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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@1:867cf1706b42, 2013-10-16 (annotated)
- Committer:
- memsterjr09
- Date:
- Wed Oct 16 18:10:39 2013 +0000
- Revision:
- 1:867cf1706b42
- Parent:
- 0:fa3fe200c570
Final RFID_Tag_List code
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 | 1:867cf1706b42 | 70 | if(node->next == NULL) break; |
memsterjr09 | 0:fa3fe200c570 | 71 | node = node->next; |
memsterjr09 | 0:fa3fe200c570 | 72 | } |
memsterjr09 | 0:fa3fe200c570 | 73 | // 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 | 74 | if(flag) break; |
memsterjr09 | 0:fa3fe200c570 | 75 | lcd.printf("ID: %d\n", ID); |
memsterjr09 | 0:fa3fe200c570 | 76 | lcd.printf("Was Not Found"); |
memsterjr09 | 0:fa3fe200c570 | 77 | ID = 0; |
memsterjr09 | 0:fa3fe200c570 | 78 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 79 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 80 | break; |
memsterjr09 | 0:fa3fe200c570 | 81 | // Add a tag to the list |
memsterjr09 | 0:fa3fe200c570 | 82 | case 3: |
memsterjr09 | 0:fa3fe200c570 | 83 | lcd.printf("Add Tag\n"); |
memsterjr09 | 0:fa3fe200c570 | 84 | lcd.printf("Scan RFID Tag"); |
memsterjr09 | 0:fa3fe200c570 | 85 | // Wait or a tag scan |
memsterjr09 | 0:fa3fe200c570 | 86 | while(!ID) { |
memsterjr09 | 0:fa3fe200c570 | 87 | if(rfid.readable()) { |
memsterjr09 | 0:fa3fe200c570 | 88 | ID = rfid.read(); |
memsterjr09 | 0:fa3fe200c570 | 89 | } |
memsterjr09 | 0:fa3fe200c570 | 90 | wait(1); |
memsterjr09 | 0:fa3fe200c570 | 91 | } |
memsterjr09 | 0:fa3fe200c570 | 92 | lcd.cls(); |
memsterjr09 | 0:fa3fe200c570 | 93 | // Determine if the Tag already exists in the list |
memsterjr09 | 0:fa3fe200c570 | 94 | found = lookUp(IDList, ID); |
memsterjr09 | 0:fa3fe200c570 | 95 | // Tag previously exists |
memsterjr09 | 0:fa3fe200c570 | 96 | if(found) { |
memsterjr09 | 0:fa3fe200c570 | 97 | lcd.printf("ID: %d\n", ID); |
memsterjr09 | 0:fa3fe200c570 | 98 | lcd.printf("Exists in List"); |
memsterjr09 | 0:fa3fe200c570 | 99 | ID = 0; |
memsterjr09 | 0:fa3fe200c570 | 100 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 101 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 102 | break; |
memsterjr09 | 0:fa3fe200c570 | 103 | // Tag doesn't exist |
memsterjr09 | 0:fa3fe200c570 | 104 | } else { |
memsterjr09 | 0:fa3fe200c570 | 105 | addToList(&IDList, ID); |
memsterjr09 | 0:fa3fe200c570 | 106 | lcd.printf("ID: %d\n", ID); |
memsterjr09 | 0:fa3fe200c570 | 107 | lcd.printf("Added to List"); |
memsterjr09 | 0:fa3fe200c570 | 108 | ID = 0; |
memsterjr09 | 0:fa3fe200c570 | 109 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 110 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 111 | break; |
memsterjr09 | 0:fa3fe200c570 | 112 | } |
memsterjr09 | 0:fa3fe200c570 | 113 | // Delete a tag from the list |
memsterjr09 | 0:fa3fe200c570 | 114 | case 4: |
memsterjr09 | 0:fa3fe200c570 | 115 | lcd.printf("Delete Tag\n"); |
memsterjr09 | 0:fa3fe200c570 | 116 | lcd.printf("Scan RFID Tag"); |
memsterjr09 | 0:fa3fe200c570 | 117 | // Wait for a tag scan |
memsterjr09 | 0:fa3fe200c570 | 118 | while(!ID) { |
memsterjr09 | 0:fa3fe200c570 | 119 | if(rfid.readable()) { |
memsterjr09 | 0:fa3fe200c570 | 120 | ID = rfid.read(); |
memsterjr09 | 0:fa3fe200c570 | 121 | } |
memsterjr09 | 0:fa3fe200c570 | 122 | wait(1); |
memsterjr09 | 0:fa3fe200c570 | 123 | } |
memsterjr09 | 0:fa3fe200c570 | 124 | lcd.cls(); |
memsterjr09 | 0:fa3fe200c570 | 125 | // Determine if the tag exists in the list |
memsterjr09 | 0:fa3fe200c570 | 126 | found = lookUp(IDList, ID); |
memsterjr09 | 0:fa3fe200c570 | 127 | // If it does, delete it from the list |
memsterjr09 | 0:fa3fe200c570 | 128 | if(found) { |
memsterjr09 | 0:fa3fe200c570 | 129 | deleteFromList(&IDList, ID); |
memsterjr09 | 0:fa3fe200c570 | 130 | lcd.printf("ID: %d\n", ID); |
memsterjr09 | 0:fa3fe200c570 | 131 | lcd.printf("Deleted"); |
memsterjr09 | 0:fa3fe200c570 | 132 | ID = 0; |
memsterjr09 | 0:fa3fe200c570 | 133 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 134 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 135 | break; |
memsterjr09 | 0:fa3fe200c570 | 136 | // Otherwise, tell the user it doesn't exist |
memsterjr09 | 0:fa3fe200c570 | 137 | } else { |
memsterjr09 | 0:fa3fe200c570 | 138 | lcd.printf("ID: %d\n", ID); |
memsterjr09 | 0:fa3fe200c570 | 139 | lcd.printf("Not in List"); |
memsterjr09 | 0:fa3fe200c570 | 140 | ID = 0; |
memsterjr09 | 0:fa3fe200c570 | 141 | state = 0; |
memsterjr09 | 0:fa3fe200c570 | 142 | wait(3); |
memsterjr09 | 0:fa3fe200c570 | 143 | break; |
memsterjr09 | 0:fa3fe200c570 | 144 | } |
memsterjr09 | 0:fa3fe200c570 | 145 | } |
memsterjr09 | 0:fa3fe200c570 | 146 | } |
memsterjr09 | 0:fa3fe200c570 | 147 | } |
memsterjr09 | 0:fa3fe200c570 | 148 | |
memsterjr09 | 0:fa3fe200c570 | 149 | // Initializes an empty Tag list |
memsterjr09 | 0:fa3fe200c570 | 150 | LinkedList emptyList() |
memsterjr09 | 0:fa3fe200c570 | 151 | { |
memsterjr09 | 0:fa3fe200c570 | 152 | LinkedList it = {NULL, NULL}; |
memsterjr09 | 0:fa3fe200c570 | 153 | addPhantom(&it); |
memsterjr09 | 0:fa3fe200c570 | 154 | return it; |
memsterjr09 | 0:fa3fe200c570 | 155 | } |
memsterjr09 | 0:fa3fe200c570 | 156 | |
memsterjr09 | 0:fa3fe200c570 | 157 | // Print the list via USB Serial port to the PC |
memsterjr09 | 0:fa3fe200c570 | 158 | void showList(LinkedList theList) |
memsterjr09 | 0:fa3fe200c570 | 159 | { |
memsterjr09 | 0:fa3fe200c570 | 160 | LLNode *phere = theList.head; /* start at the head */ |
memsterjr09 | 0:fa3fe200c570 | 161 | int n = 1; |
memsterjr09 | 0:fa3fe200c570 | 162 | pc.printf("***********\n"); //start the list |
memsterjr09 | 0:fa3fe200c570 | 163 | if(phere->data == 0) pc.printf("No Tags in List\n"); //List is empty |
memsterjr09 | 0:fa3fe200c570 | 164 | else pc.printf("%d: %d\n", n, phere->data); //List isn't empty, print first tag |
memsterjr09 | 0:fa3fe200c570 | 165 | n++; |
memsterjr09 | 0:fa3fe200c570 | 166 | while(phere->next) { |
memsterjr09 | 0:fa3fe200c570 | 167 | pc.printf("%d: %d\n", n, phere->next->data); // keep printing while there is still data |
memsterjr09 | 0:fa3fe200c570 | 168 | phere = phere->next; /* work forward via next ptrs */ |
memsterjr09 | 0:fa3fe200c570 | 169 | n++; |
memsterjr09 | 0:fa3fe200c570 | 170 | } |
memsterjr09 | 0:fa3fe200c570 | 171 | pc.printf("***********\n\n"); // end the list |
memsterjr09 | 0:fa3fe200c570 | 172 | } |
memsterjr09 | 0:fa3fe200c570 | 173 | |
memsterjr09 | 0:fa3fe200c570 | 174 | // Add a tag to the list (added to the back of the list) |
memsterjr09 | 0:fa3fe200c570 | 175 | void addToList(LinkedList *pLL, int data) |
memsterjr09 | 0:fa3fe200c570 | 176 | { |
memsterjr09 | 0:fa3fe200c570 | 177 | // If the list has no data, its the head of the list |
memsterjr09 | 0:fa3fe200c570 | 178 | if(pLL->head->data == NULL) { |
memsterjr09 | 0:fa3fe200c570 | 179 | pLL->head->data = data; |
memsterjr09 | 0:fa3fe200c570 | 180 | // otherwise you have to add a new node to the tail of the list |
memsterjr09 | 0:fa3fe200c570 | 181 | } else { |
memsterjr09 | 0:fa3fe200c570 | 182 | // Initialize the node |
memsterjr09 | 0:fa3fe200c570 | 183 | LLNode *toAdd = (LLNode *) malloc(sizeof(LLNode)); |
memsterjr09 | 0:fa3fe200c570 | 184 | // Add the data and fix all of the pointers |
memsterjr09 | 0:fa3fe200c570 | 185 | toAdd->data = data; |
memsterjr09 | 0:fa3fe200c570 | 186 | toAdd->prev = pLL->tail; |
memsterjr09 | 0:fa3fe200c570 | 187 | toAdd->next = NULL; |
memsterjr09 | 0:fa3fe200c570 | 188 | pLL->tail->next = toAdd; |
memsterjr09 | 0:fa3fe200c570 | 189 | pLL->tail = toAdd; |
memsterjr09 | 0:fa3fe200c570 | 190 | } |
memsterjr09 | 0:fa3fe200c570 | 191 | } |
memsterjr09 | 0:fa3fe200c570 | 192 | |
memsterjr09 | 0:fa3fe200c570 | 193 | // Used to create the first empty node in the initial list |
memsterjr09 | 0:fa3fe200c570 | 194 | void addPhantom(LinkedList *pLL) |
memsterjr09 | 0:fa3fe200c570 | 195 | { |
memsterjr09 | 0:fa3fe200c570 | 196 | /* create LLNode */ |
memsterjr09 | 0:fa3fe200c570 | 197 | LLNode *phere = (LLNode *) malloc(sizeof(LLNode)); |
memsterjr09 | 0:fa3fe200c570 | 198 | phere->data = NULL; |
memsterjr09 | 0:fa3fe200c570 | 199 | phere->next = NULL; |
memsterjr09 | 0:fa3fe200c570 | 200 | phere->prev = NULL; |
memsterjr09 | 0:fa3fe200c570 | 201 | pLL->head = phere; |
memsterjr09 | 0:fa3fe200c570 | 202 | pLL->tail = phere; |
memsterjr09 | 0:fa3fe200c570 | 203 | } |
memsterjr09 | 0:fa3fe200c570 | 204 | |
memsterjr09 | 0:fa3fe200c570 | 205 | // delete a tag from the list |
memsterjr09 | 0:fa3fe200c570 | 206 | void deleteFromList(LinkedList *pll, int data) |
memsterjr09 | 0:fa3fe200c570 | 207 | { |
memsterjr09 | 0:fa3fe200c570 | 208 | // Flags used to delete |
memsterjr09 | 0:fa3fe200c570 | 209 | int flag = true; |
memsterjr09 | 0:fa3fe200c570 | 210 | int first = true; |
memsterjr09 | 0:fa3fe200c570 | 211 | // Get first node |
memsterjr09 | 0:fa3fe200c570 | 212 | LLNode *node = pll->head; |
memsterjr09 | 0:fa3fe200c570 | 213 | while(flag) { |
memsterjr09 | 0:fa3fe200c570 | 214 | // If you find the tag |
memsterjr09 | 0:fa3fe200c570 | 215 | if(node->data == data) { |
memsterjr09 | 0:fa3fe200c570 | 216 | // If its the first node, then you just have to move the head pointer |
memsterjr09 | 0:fa3fe200c570 | 217 | if(first) { |
memsterjr09 | 0:fa3fe200c570 | 218 | pll->head = pll->head->next; |
memsterjr09 | 0:fa3fe200c570 | 219 | flag = false; |
memsterjr09 | 0:fa3fe200c570 | 220 | // if its the last tag added... just adjust the tail pointers |
memsterjr09 | 0:fa3fe200c570 | 221 | } else { |
memsterjr09 | 0:fa3fe200c570 | 222 | if(node->next == NULL) { |
memsterjr09 | 0:fa3fe200c570 | 223 | pll->tail = node->prev; |
memsterjr09 | 0:fa3fe200c570 | 224 | node->prev->next = NULL; |
memsterjr09 | 0:fa3fe200c570 | 225 | flag = false; |
memsterjr09 | 0:fa3fe200c570 | 226 | //otherwise just skip the node in the list |
memsterjr09 | 0:fa3fe200c570 | 227 | } else { |
memsterjr09 | 0:fa3fe200c570 | 228 | node->prev->next = node->next; |
memsterjr09 | 0:fa3fe200c570 | 229 | node->next->prev = node->prev; |
memsterjr09 | 0:fa3fe200c570 | 230 | flag = false; |
memsterjr09 | 0:fa3fe200c570 | 231 | } |
memsterjr09 | 0:fa3fe200c570 | 232 | } |
memsterjr09 | 0:fa3fe200c570 | 233 | } |
memsterjr09 | 0:fa3fe200c570 | 234 | // Traverse through the list via next pointers |
memsterjr09 | 0:fa3fe200c570 | 235 | node = node->next; |
memsterjr09 | 0:fa3fe200c570 | 236 | first = false; |
memsterjr09 | 0:fa3fe200c570 | 237 | } |
memsterjr09 | 0:fa3fe200c570 | 238 | } |
memsterjr09 | 0:fa3fe200c570 | 239 | |
memsterjr09 | 0:fa3fe200c570 | 240 | // Used to determine if a tag already exists in the list |
memsterjr09 | 0:fa3fe200c570 | 241 | int lookUp(LinkedList IDList, int ID) |
memsterjr09 | 0:fa3fe200c570 | 242 | { |
memsterjr09 | 0:fa3fe200c570 | 243 | int found = false; |
memsterjr09 | 0:fa3fe200c570 | 244 | LLNode *node = IDList.head; |
memsterjr09 | 0:fa3fe200c570 | 245 | // While the data isn't null, check it |
memsterjr09 | 0:fa3fe200c570 | 246 | while(node->data != NULL) { |
memsterjr09 | 0:fa3fe200c570 | 247 | if(node->data == ID) { |
memsterjr09 | 0:fa3fe200c570 | 248 | found = true; |
memsterjr09 | 0:fa3fe200c570 | 249 | return found; |
memsterjr09 | 0:fa3fe200c570 | 250 | } |
memsterjr09 | 0:fa3fe200c570 | 251 | // if the next pointer is null, we're at the end of the list; |
memsterjr09 | 0:fa3fe200c570 | 252 | if(node->next == NULL) return found; |
memsterjr09 | 0:fa3fe200c570 | 253 | node = node->next; |
memsterjr09 | 0:fa3fe200c570 | 254 | } |
memsterjr09 | 0:fa3fe200c570 | 255 | return found; |
memsterjr09 | 0:fa3fe200c570 | 256 | } |