It is a door opener with mbed and Felica(RFID).

Dependencies:   mbed Servo SDFileSystem

Committer:
ryought
Date:
Tue May 15 07:47:19 2012 +0000
Revision:
6:9fe8caff6142
Parent:
5:4242d287f7f4
FINAL

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryought 1:26e3869ba544 1 #include "mbed.h"
ryought 1:26e3869ba544 2 #include "Servo.h"
ryought 1:26e3869ba544 3 #include "TextLCD.h"
ryought 1:26e3869ba544 4 #include "SDFileSystem.h"
ryought 6:9fe8caff6142 5 #include "RCS620S.h" //library for felica RCS620S(switch science)
ryought 6:9fe8caff6142 6 #include <inttypes.h>
ryought 6:9fe8caff6142 7 #include <string.h>
ryought 6:9fe8caff6142 8
ryought 6:9fe8caff6142 9 #define MAX_USER_NUMBER 40
ryought 1:26e3869ba544 10
ryought 1:26e3869ba544 11 TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7
ryought 1:26e3869ba544 12 Serial pc(USBTX, USBRX);
ryought 6:9fe8caff6142 13 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card reader module
ryought 4:f71760338b1e 14 Servo myServo(p21); //port-21 = doorlock servo
ryought 6:9fe8caff6142 15
ryought 6:9fe8caff6142 16 InterruptIn int_p23(p23); //reg_button
ryought 6:9fe8caff6142 17 InterruptIn int_doorbutton(p24); //door open/close analog control button
ryought 6:9fe8caff6142 18 Serial serial(p9, p10); //Felica read and write module
ryought 6:9fe8caff6142 19
ryought 6:9fe8caff6142 20 static char HEXSTRING[17] = "0123456789ABCDEF";
ryought 6:9fe8caff6142 21 char *itoh(uint8_t val, char *ptr);
ryought 6:9fe8caff6142 22
ryought 6:9fe8caff6142 23 char userid[MAX_USER_NUMBER][18]; //userid read from SD
ryought 6:9fe8caff6142 24 char regid[18]; //register id
ryought 6:9fe8caff6142 25
ryought 6:9fe8caff6142 26 char *format = "%s";
ryought 6:9fe8caff6142 27 bool reg_button = false;
ryought 6:9fe8caff6142 28 bool door_status;
ryought 6:9fe8caff6142 29
ryought 6:9fe8caff6142 30 int already_count = 0;
ryought 6:9fe8caff6142 31 //int try_count = 0;
ryought 6:9fe8caff6142 32
ryought 6:9fe8caff6142 33 char *p_items; //used in loading userid from SDcard
ryought 6:9fe8caff6142 34
ryought 6:9fe8caff6142 35 DigitalOut serialready(LED1);
ryought 6:9fe8caff6142 36 DigitalOut felicarwready(LED2);
ryought 6:9fe8caff6142 37 DigitalOut door_status_led(LED3);
ryought 5:4242d287f7f4 38 DigitalOut int_led(LED4);
ryought 1:26e3869ba544 39
ryought 6:9fe8caff6142 40 DigitalOut felicaready(p25);
ryought 6:9fe8caff6142 41 DigitalOut auth_ok(p26);
ryought 6:9fe8caff6142 42 DigitalOut auth_ng(p27);
ryought 6:9fe8caff6142 43 DigitalOut regready(p28);
ryought 6:9fe8caff6142 44 DigitalOut error_led(p29);
ryought 3:046e6f173f9e 45
ryought 6:9fe8caff6142 46 class Watchdog { //watchdog timer
ryought 4:f71760338b1e 47 public:
ryought 4:f71760338b1e 48 void kick(float s) {
ryought 4:f71760338b1e 49 LPC_WDT->WDCLKSEL = 0x1;
ryought 4:f71760338b1e 50 uint32_t clk = SystemCoreClock / 16;
ryought 4:f71760338b1e 51 LPC_WDT->WDTC = s * (float)clk;
ryought 4:f71760338b1e 52 LPC_WDT->WDMOD = 0x3;
ryought 4:f71760338b1e 53
ryought 4:f71760338b1e 54 kick();
ryought 4:f71760338b1e 55 }
ryought 4:f71760338b1e 56
ryought 4:f71760338b1e 57 void kick() {
ryought 4:f71760338b1e 58 LPC_WDT->WDFEED = 0xAA;
ryought 4:f71760338b1e 59 LPC_WDT->WDFEED = 0x55;
ryought 4:f71760338b1e 60 }
ryought 4:f71760338b1e 61 };
ryought 4:f71760338b1e 62
ryought 4:f71760338b1e 63 Watchdog w;
ryought 4:f71760338b1e 64
ryought 6:9fe8caff6142 65
ryought 6:9fe8caff6142 66 //interrupt pin setup
ryought 6:9fe8caff6142 67 void int_reg() { //registering button's interrupt
ryought 6:9fe8caff6142 68 int_led = 1;
ryought 6:9fe8caff6142 69 reg_button = 1;
ryought 6:9fe8caff6142 70 regready = 1;
ryought 6:9fe8caff6142 71 }
ryought 6:9fe8caff6142 72
ryought 6:9fe8caff6142 73
ryought 6:9fe8caff6142 74 void logSetup(){ //log and userid setup and read again
ryought 6:9fe8caff6142 75 FILE *fp = fopen("/sd/rdoor/userlist.txt", "r"); //user list(in sd)
ryought 6:9fe8caff6142 76 FILE *fp2 = fopen("/sd/rdoor/log.txt", "a"); //logfile(in sd)
ryought 6:9fe8caff6142 77 if (fp2 == NULL) error("could not read LOGFILES\n");
ryought 6:9fe8caff6142 78 if (fp == NULL) error("could not read USERLIST\n");
ryought 6:9fe8caff6142 79
ryought 6:9fe8caff6142 80 //load all userid saved in SDcard
ryought 6:9fe8caff6142 81 for (int ii=0; ii < MAX_USER_NUMBER; ii++) {
ryought 6:9fe8caff6142 82 p_items = fgets(userid[ii], 18, fp); //load userid(max.18 character) from fp
ryought 6:9fe8caff6142 83 strtok(userid[ii], "\n\0"); // change \n to \0 method
ryought 6:9fe8caff6142 84 if(p_items == NULL) break;
ryought 6:9fe8caff6142 85 }
ryought 6:9fe8caff6142 86
ryought 6:9fe8caff6142 87 fclose(fp);
ryought 6:9fe8caff6142 88 fclose(fp2);
ryought 6:9fe8caff6142 89 pc.printf("File OK\n");
ryought 5:4242d287f7f4 90 }
ryought 5:4242d287f7f4 91
ryought 5:4242d287f7f4 92
ryought 6:9fe8caff6142 93 void openDoor(){ //opening door(move motor, refresh lcd, change door_status, led)
ryought 4:f71760338b1e 94 lcd.cls();
ryought 4:f71760338b1e 95 lcd.printf("-MOTOR DRIVING-");
ryought 6:9fe8caff6142 96 myServo = 0;
ryought 4:f71760338b1e 97 lcd.cls();
ryought 4:f71760338b1e 98 lcd.printf("-DOOR:OPENED-");
ryought 6:9fe8caff6142 99 door_status = true;
ryought 6:9fe8caff6142 100 door_status_led = 1;
ryought 6:9fe8caff6142 101 }
ryought 6:9fe8caff6142 102 void closeDoor(){ //closing door
ryought 6:9fe8caff6142 103 lcd.cls();
ryought 6:9fe8caff6142 104 lcd.printf("-MOTOR DRIVING");
ryought 6:9fe8caff6142 105 myServo = 1.0;
ryought 6:9fe8caff6142 106 lcd.cls();
ryought 6:9fe8caff6142 107 lcd.printf("-DOOR:CLOSED-");
ryought 6:9fe8caff6142 108 door_status = false;
ryought 6:9fe8caff6142 109 door_status_led = 0;
ryought 6:9fe8caff6142 110 }
ryought 6:9fe8caff6142 111
ryought 6:9fe8caff6142 112 //interrupt pin setup
ryought 6:9fe8caff6142 113 void int_doorctrl() { //doorcontrol button's interrupt
ryought 6:9fe8caff6142 114 if (door_status == true) {
ryought 6:9fe8caff6142 115 closeDoor();
ryought 6:9fe8caff6142 116 door_status = true;
ryought 6:9fe8caff6142 117
ryought 6:9fe8caff6142 118 } else if (door_status == false) {
ryought 6:9fe8caff6142 119 openDoor();
ryought 6:9fe8caff6142 120 door_status = false;
ryought 6:9fe8caff6142 121
ryought 6:9fe8caff6142 122 }
ryought 6:9fe8caff6142 123 door_status = !door_status;
ryought 6:9fe8caff6142 124 wait(2);
ryought 4:f71760338b1e 125 }
ryought 4:f71760338b1e 126
ryought 4:f71760338b1e 127
ryought 6:9fe8caff6142 128 int main() {
ryought 6:9fe8caff6142 129 lcd.printf("Hello! \n RFID_doorlock\n");
ryought 6:9fe8caff6142 130
ryought 6:9fe8caff6142 131
ryought 6:9fe8caff6142 132 //first setup
ryought 6:9fe8caff6142 133 logSetup(); //load all userid from SD(must : connect SD card)
ryought 6:9fe8caff6142 134 closeDoor(); //at beginning, door_status is set up tp close(false)
ryought 6:9fe8caff6142 135
ryought 6:9fe8caff6142 136 int_p23.rise(&int_reg);
ryought 6:9fe8caff6142 137 int_doorbutton.rise(&int_doorctrl); //interrupt pin setup
ryought 6:9fe8caff6142 138
ryought 4:f71760338b1e 139
ryought 6:9fe8caff6142 140 //felica setup
ryought 6:9fe8caff6142 141 int ret;
ryought 6:9fe8caff6142 142 int loop;
ryought 6:9fe8caff6142 143 char idbuffer[17];
ryought 6:9fe8caff6142 144 char *hexid;
ryought 6:9fe8caff6142 145
ryought 6:9fe8caff6142 146 serial.baud(115200);
ryought 6:9fe8caff6142 147 serialready = 1;
ryought 4:f71760338b1e 148
ryought 6:9fe8caff6142 149 ret = 0;
ryought 6:9fe8caff6142 150 RCS620S felica;
ryought 6:9fe8caff6142 151 while (ret == 0) {
ryought 6:9fe8caff6142 152 wait(1);
ryought 6:9fe8caff6142 153 ret = felica.initDevice();
ryought 6:9fe8caff6142 154 }
ryought 6:9fe8caff6142 155 felicarwready = 1;
ryought 6:9fe8caff6142 156 pc.printf("Reader OK \n"); //Felica Reader loading finished
ryought 4:f71760338b1e 157
ryought 6:9fe8caff6142 158
ryought 6:9fe8caff6142 159 //print all loaded USERID first.
ryought 6:9fe8caff6142 160 for (int x = 0; x <= MAX_USER_NUMBER; x++) {
ryought 6:9fe8caff6142 161 pc.printf("-%s \n", userid[x]);
ryought 6:9fe8caff6142 162 }
ryought 6:9fe8caff6142 163
ryought 1:26e3869ba544 164
ryought 5:4242d287f7f4 165
ryought 6:9fe8caff6142 166 //main routine
ryought 5:4242d287f7f4 167 while(1) {
ryought 6:9fe8caff6142 168 pc.printf("Please FeliCa Touch\n");
ryought 6:9fe8caff6142 169 felicaready = 1;
ryought 6:9fe8caff6142 170
ryought 6:9fe8caff6142 171 //reading id of touched Felica card
ryought 6:9fe8caff6142 172 hexid = idbuffer + sizeof(idbuffer); // hexid = buffer[ last of elements ];
ryought 6:9fe8caff6142 173 *--hexid = '\0';
ryought 6:9fe8caff6142 174 while (felica.polling(0xffff) == 0);
ryought 6:9fe8caff6142 175 felicarwready = 0;
ryought 6:9fe8caff6142 176 pc.printf(">idm: ");
ryought 6:9fe8caff6142 177 felicaready = 0;
ryought 6:9fe8caff6142 178 for (loop = 7; loop >= 0; loop--){
ryought 6:9fe8caff6142 179 hexid = itoh(felica.idm[loop], hexid);
ryought 6:9fe8caff6142 180 }
ryought 6:9fe8caff6142 181 pc.printf("%s \n", hexid); //print touched id
ryought 6:9fe8caff6142 182
ryought 6:9fe8caff6142 183
ryought 6:9fe8caff6142 184 /*cf.
ryought 6:9fe8caff6142 185 hexid : touched Felica ID
ryought 6:9fe8caff6142 186 regid : special ID used by registering method
ryought 6:9fe8caff6142 187 userid[] : registered ID read from SDcard
ryought 6:9fe8caff6142 188 */
ryought 6:9fe8caff6142 189
ryought 5:4242d287f7f4 190
ryought 6:9fe8caff6142 191 //authentication
ryought 6:9fe8caff6142 192 for (int i = 0; i <= MAX_USER_NUMBER; i++) {
ryought 6:9fe8caff6142 193 if (strcmp(hexid, userid[i]) == 0) { //hexid = userid[i]
ryought 6:9fe8caff6142 194 pc.printf(">Auth Succeeded\n");
ryought 6:9fe8caff6142 195 auth_ok = 1;
ryought 6:9fe8caff6142 196 if (door_status == true) { //if door is opened now... close door
ryought 6:9fe8caff6142 197 closeDoor();
ryought 6:9fe8caff6142 198 pc.printf(">close door by %s to %s(No.%d)\n", hexid, userid[i], i+1);
ryought 6:9fe8caff6142 199 wait(1);
ryought 6:9fe8caff6142 200 auth_ok = 0;
ryought 6:9fe8caff6142 201 break;
ryought 6:9fe8caff6142 202 }
ryought 6:9fe8caff6142 203 if (door_status == false) { //if door is closed now... open door
ryought 6:9fe8caff6142 204 openDoor();
ryought 6:9fe8caff6142 205 pc.printf(">open door by %s to %s(No.%d)\n", hexid, userid[i], i+1);
ryought 6:9fe8caff6142 206 wait(1);
ryought 6:9fe8caff6142 207 auth_ok = 0;
ryought 6:9fe8caff6142 208 break;
ryought 6:9fe8caff6142 209 }
ryought 6:9fe8caff6142 210 } else { //hexid &#65533;&#65533; userid[i]
ryought 6:9fe8caff6142 211 pc.printf(">Auth failed by %s to %s(No.%d)\n", hexid, userid[i], i+1);
ryought 6:9fe8caff6142 212
ryought 6:9fe8caff6142 213 if (i == MAX_USER_NUMBER) {
ryought 6:9fe8caff6142 214 pc.printf(">Auth Failed\n");
ryought 6:9fe8caff6142 215 auth_ng = 1;
ryought 6:9fe8caff6142 216 wait(1);
ryought 6:9fe8caff6142 217 auth_ng = 0;
ryought 6:9fe8caff6142 218 }
ryought 6:9fe8caff6142 219 }
ryought 5:4242d287f7f4 220 }
ryought 6:9fe8caff6142 221 wait(1); //to avoid repeating auth of same card
ryought 6:9fe8caff6142 222
ryought 6:9fe8caff6142 223
ryought 6:9fe8caff6142 224 //register new user's card
ryought 6:9fe8caff6142 225 if (reg_button == true) {
ryought 6:9fe8caff6142 226 pc.printf("--register mode--\n");
ryought 6:9fe8caff6142 227
ryought 6:9fe8caff6142 228 //read again USERLIST from SD
ryought 6:9fe8caff6142 229 FILE *fp = fopen("/sd/rdoor/userlist.txt", "a");
ryought 6:9fe8caff6142 230 if (fp == NULL) error("could not read USERLIST\n");
ryought 6:9fe8caff6142 231
ryought 6:9fe8caff6142 232 //first, read and auth MASTER_ID
ryought 6:9fe8caff6142 233 pc.printf("Please Master Felica Card Touch\n");
ryought 6:9fe8caff6142 234 felicaready = 1;
ryought 6:9fe8caff6142 235 hexid = idbuffer + sizeof(idbuffer);
ryought 6:9fe8caff6142 236 *--hexid = '\0';
ryought 6:9fe8caff6142 237 while (felica.polling(0xffff) == 0);
ryought 6:9fe8caff6142 238 felicarwready = 0;
ryought 6:9fe8caff6142 239 pc.printf(">idm: ");
ryought 6:9fe8caff6142 240 felicaready = 0;
ryought 6:9fe8caff6142 241 for (loop = 7; loop >= 0; loop--){
ryought 6:9fe8caff6142 242 hexid = itoh(felica.idm[loop], hexid);
ryought 6:9fe8caff6142 243 }
ryought 6:9fe8caff6142 244 pc.printf("%s (MASTER)\n", hexid);
ryought 6:9fe8caff6142 245 wait(3);
ryought 6:9fe8caff6142 246
ryought 6:9fe8caff6142 247
ryought 6:9fe8caff6142 248 //first id = master id...
ryought 6:9fe8caff6142 249 if (strcmp(hexid, userid[0]) == 0) {
ryought 6:9fe8caff6142 250 pc.printf(">Auth Succeeded\n");
ryought 6:9fe8caff6142 251 auth_ok = 1;
ryought 6:9fe8caff6142 252 auth_ng = 0;
ryought 6:9fe8caff6142 253 //next, read and register NEW_USER's_ID
ryought 6:9fe8caff6142 254 pc.printf("Please Felica of New_User Touch\n");
ryought 6:9fe8caff6142 255 felicaready = 1;
ryought 6:9fe8caff6142 256
ryought 6:9fe8caff6142 257 //Felica auth(hexid = NEW_USER's_ID)
ryought 6:9fe8caff6142 258 hexid = idbuffer + sizeof(idbuffer);
ryought 6:9fe8caff6142 259 *--hexid = '\0';
ryought 6:9fe8caff6142 260 while (felica.polling(0xffff) == 0);
ryought 6:9fe8caff6142 261 felicarwready = 0;
ryought 6:9fe8caff6142 262 pc.printf(">idm: ");
ryought 6:9fe8caff6142 263 felicaready = 0;
ryought 6:9fe8caff6142 264 for (loop = 7; loop >= 0; loop--){
ryought 6:9fe8caff6142 265 hexid = itoh(felica.idm[loop], hexid);
ryought 6:9fe8caff6142 266 }
ryought 6:9fe8caff6142 267 pc.printf("%s (NEW USER)\n", hexid);
ryought 6:9fe8caff6142 268
ryought 6:9fe8caff6142 269
ryought 6:9fe8caff6142 270 //to avoid registering same ID
ryought 6:9fe8caff6142 271 already_count = 0; //variable initialization
ryought 6:9fe8caff6142 272 for (int i = 0; i <= MAX_USER_NUMBER; i++) {
ryought 6:9fe8caff6142 273 if (strcmp(hexid, userid[i]) == 0) {
ryought 6:9fe8caff6142 274 //NEW_USER's_ID == userid[i]... already_count++
ryought 6:9fe8caff6142 275 already_count = already_count + 1;
ryought 6:9fe8caff6142 276 pc.printf(">%d(debug)\n", already_count);
ryought 6:9fe8caff6142 277 }
ryought 6:9fe8caff6142 278 }
ryought 6:9fe8caff6142 279
ryought 6:9fe8caff6142 280
ryought 6:9fe8caff6142 281 //if already_count is over 0, the ID is ALREADY REGISTERED ID.
ryought 6:9fe8caff6142 282 if (already_count == 0) {
ryought 6:9fe8caff6142 283 //registering
ryought 6:9fe8caff6142 284 //first, add "\n" to the end of NEW_USER'S_ID(hexid) (hexid + "\n" = regid)
ryought 6:9fe8caff6142 285 sprintf(regid, "%s\n", hexid);
ryought 6:9fe8caff6142 286 int ret = fputs(regid, fp); //writing to SD
ryought 6:9fe8caff6142 287 if(ret == EOF) {
ryought 6:9fe8caff6142 288 error("Userid writing error");
ryought 6:9fe8caff6142 289 auth_ng = 1;
ryought 6:9fe8caff6142 290 auth_ok = 0;
ryought 6:9fe8caff6142 291 wait(2);
ryought 6:9fe8caff6142 292 } else {
ryought 6:9fe8caff6142 293 pc.printf("Registering was completed\n");
ryought 6:9fe8caff6142 294 auth_ok = 1;
ryought 6:9fe8caff6142 295 auth_ng = 0;
ryought 6:9fe8caff6142 296 wait(2);
ryought 6:9fe8caff6142 297 }
ryought 6:9fe8caff6142 298 } else if(already_count > 0) {
ryought 6:9fe8caff6142 299 pc.printf("Sorry, this is already registered ID\n");
ryought 6:9fe8caff6142 300 auth_ng = 1;
ryought 6:9fe8caff6142 301 auth_ok = 0;
ryought 6:9fe8caff6142 302 wait(2);
ryought 6:9fe8caff6142 303 } else {
ryought 6:9fe8caff6142 304 pc.printf("Error\n");
ryought 6:9fe8caff6142 305 auth_ng = 1;
ryought 6:9fe8caff6142 306 auth_ok = 0;
ryought 6:9fe8caff6142 307 wait(2);
ryought 6:9fe8caff6142 308 }
ryought 6:9fe8caff6142 309
ryought 6:9fe8caff6142 310 fclose(fp);
ryought 6:9fe8caff6142 311
ryought 6:9fe8caff6142 312
ryought 6:9fe8caff6142 313 //read userid from SD and setup userid list again.
ryought 6:9fe8caff6142 314 logSetup();
ryought 6:9fe8caff6142 315 //printing userid again.
ryought 6:9fe8caff6142 316 for (int xx = 0; xx <= MAX_USER_NUMBER; xx++) {
ryought 6:9fe8caff6142 317 pc.printf("-%s \n", userid[xx]);
ryought 6:9fe8caff6142 318 }
ryought 6:9fe8caff6142 319
ryought 6:9fe8caff6142 320
ryought 6:9fe8caff6142 321 //if registering NEW_USER's_ID was completed successfully...
ryought 6:9fe8caff6142 322 // reg_button_flag : down
ryought 6:9fe8caff6142 323 reg_button = false;
ryought 6:9fe8caff6142 324 int_led = 0;
ryought 6:9fe8caff6142 325
ryought 6:9fe8caff6142 326 } else {
ryought 6:9fe8caff6142 327 //first id &#65533;&#65533; master id... restart.
ryought 6:9fe8caff6142 328 pc.printf(">Auth Failed\n");
ryought 6:9fe8caff6142 329 pc.printf("Sorry, you aren't allowed to use register mode\n");
ryought 6:9fe8caff6142 330 auth_ok = 0;
ryought 6:9fe8caff6142 331 auth_ng = 1;
ryought 6:9fe8caff6142 332 wait(2);
ryought 6:9fe8caff6142 333
ryought 6:9fe8caff6142 334 }
ryought 6:9fe8caff6142 335 regready = 0;
ryought 6:9fe8caff6142 336 }
ryought 6:9fe8caff6142 337 auth_ok = 0;
ryought 6:9fe8caff6142 338 auth_ng = 0;
ryought 6:9fe8caff6142 339 felicaready = 0;
ryought 5:4242d287f7f4 340 }
ryought 6:9fe8caff6142 341 }
ryought 5:4242d287f7f4 342
ryought 6:9fe8caff6142 343 //used by Felica
ryought 6:9fe8caff6142 344 char *itoh(uint8_t val, char *ptr) {
ryought 6:9fe8caff6142 345 *--ptr = HEXSTRING[(val % 16)]; // (val & 0x0f)
ryought 6:9fe8caff6142 346 val /= 16; // val = val >> 4;
ryought 6:9fe8caff6142 347 *--ptr = HEXSTRING[(val % 16)]; // (val & 0x0f)
ryought 6:9fe8caff6142 348 return(ptr);
ryought 6:9fe8caff6142 349 }