RFID tracking with mbed & RS-EDP reference design

Dependencies:   RWDModule mbed SDCard

Committer:
donatien
Date:
Wed Jul 28 11:02:36 2010 +0000
Revision:
0:fd63457452f4

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:fd63457452f4 1 /*
donatien 0:fd63457452f4 2 Copyright (c) 2010 ARM Limited
donatien 0:fd63457452f4 3
donatien 0:fd63457452f4 4 Permission is hereby granted, free of charge, to any person obtaining a copy
donatien 0:fd63457452f4 5 of this software and associated documentation files (the "Software"), to deal
donatien 0:fd63457452f4 6 in the Software without restriction, including without limitation the rights
donatien 0:fd63457452f4 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
donatien 0:fd63457452f4 8 copies of the Software, and to permit persons to whom the Software is
donatien 0:fd63457452f4 9 furnished to do so, subject to the following conditions:
donatien 0:fd63457452f4 10
donatien 0:fd63457452f4 11 The above copyright notice and this permission notice shall be included in
donatien 0:fd63457452f4 12 all copies or substantial portions of the Software.
donatien 0:fd63457452f4 13
donatien 0:fd63457452f4 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 0:fd63457452f4 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 0:fd63457452f4 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 0:fd63457452f4 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 0:fd63457452f4 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:fd63457452f4 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
donatien 0:fd63457452f4 20 THE SOFTWARE.
donatien 0:fd63457452f4 21 */
donatien 0:fd63457452f4 22
donatien 0:fd63457452f4 23 /*
donatien 0:fd63457452f4 24 This is the main file for this project.
donatien 0:fd63457452f4 25 */
donatien 0:fd63457452f4 26
donatien 0:fd63457452f4 27 //Core libs
donatien 0:fd63457452f4 28 #include "mbed.h"
donatien 0:fd63457452f4 29
donatien 0:fd63457452f4 30 //Config
donatien 0:fd63457452f4 31 #include "Config_Common.h"
donatien 0:fd63457452f4 32 #include "Config_Impl.h"
donatien 0:fd63457452f4 33
donatien 0:fd63457452f4 34 //RFID
donatien 0:fd63457452f4 35 #include "RWDMifare.h"
donatien 0:fd63457452f4 36
donatien 0:fd63457452f4 37 //Network
donatien 0:fd63457452f4 38 #include "NTPClient.h" //To setup RTC
donatien 0:fd63457452f4 39 //The MySQL Client is included in logger.h
donatien 0:fd63457452f4 40
donatien 0:fd63457452f4 41 //Logging
donatien 0:fd63457452f4 42 #include "taginfo.h"
donatien 0:fd63457452f4 43 #include "logger.h"
donatien 0:fd63457452f4 44
donatien 0:fd63457452f4 45 //UI
donatien 0:fd63457452f4 46 #include "beep.h"
donatien 0:fd63457452f4 47
donatien 0:fd63457452f4 48 #define MAX_UID_LEN 10 //Mifare max UID length is 10 bytes (triple-uid)
donatien 0:fd63457452f4 49
donatien 0:fd63457452f4 50 //Implemented by the interface-specific demos
donatien 0:fd63457452f4 51 int network_init();
donatien 0:fd63457452f4 52 int network_close();
donatien 0:fd63457452f4 53
donatien 0:fd63457452f4 54 RWDMifare reader(p13, p14, p12);
donatien 0:fd63457452f4 55 Serial pc (USBTX,USBRX);
donatien 0:fd63457452f4 56
donatien 0:fd63457452f4 57 DigitalIn exitBtn(p19);
donatien 0:fd63457452f4 58
donatien 0:fd63457452f4 59 Beep beep(p20);
donatien 0:fd63457452f4 60
donatien 0:fd63457452f4 61 NTPClient ntp;
donatien 0:fd63457452f4 62 Logger logger(SQL_TABLE);
donatien 0:fd63457452f4 63
donatien 0:fd63457452f4 64 extern "C" void HardFault_Handler() { printf("Hard Fault!\n"); error(""); }
donatien 0:fd63457452f4 65
donatien 0:fd63457452f4 66 //Main routine
donatien 0:fd63457452f4 67 int main() {
donatien 0:fd63457452f4 68 pc.baud(115200); //Set bitrate for debug output
donatien 0:fd63457452f4 69
donatien 0:fd63457452f4 70 //Init Mifare Reader
donatien 0:fd63457452f4 71 RWDMifare::RWDMifareErr readerErr = reader.init();
donatien 0:fd63457452f4 72 if(readerErr)
donatien 0:fd63457452f4 73 {
donatien 0:fd63457452f4 74 beep.beep(Beep::TONE_ERR);
donatien 0:fd63457452f4 75 printf("Could not init reader (error %d)\n", readerErr);
donatien 0:fd63457452f4 76 return -1;
donatien 0:fd63457452f4 77 }
donatien 0:fd63457452f4 78
donatien 0:fd63457452f4 79 //Open network connection
donatien 0:fd63457452f4 80 int netRc = network_init();
donatien 0:fd63457452f4 81 if(netRc)
donatien 0:fd63457452f4 82 {
donatien 0:fd63457452f4 83 beep.beep(Beep::TONE_ERR);
donatien 0:fd63457452f4 84 printf("Could not init network interface\n");
donatien 0:fd63457452f4 85 return -1;
donatien 0:fd63457452f4 86 }
donatien 0:fd63457452f4 87
donatien 0:fd63457452f4 88 //Setup the mbed's RTC
donatien 0:fd63457452f4 89 NTPResult ntpResult;
donatien 0:fd63457452f4 90 Host ntpServer(IpAddr(), 123, NTP_SERVER);
donatien 0:fd63457452f4 91 do
donatien 0:fd63457452f4 92 {
donatien 0:fd63457452f4 93 ntpResult = ntp.setTime(ntpServer);
donatien 0:fd63457452f4 94 if(ntpResult)
donatien 0:fd63457452f4 95 {
donatien 0:fd63457452f4 96 beep.beep(Beep::TONE_WARN);
donatien 0:fd63457452f4 97 printf("Could not get time...\n");
donatien 0:fd63457452f4 98 wait(5.);
donatien 0:fd63457452f4 99 }
donatien 0:fd63457452f4 100 } while(ntpResult);
donatien 0:fd63457452f4 101
donatien 0:fd63457452f4 102 //Check time
donatien 0:fd63457452f4 103 time_t ctTime = time(NULL);
donatien 0:fd63457452f4 104 printf("Time is now (UTC) : %s\n", ctime(&ctTime));
donatien 0:fd63457452f4 105
donatien 0:fd63457452f4 106 Host sqlServer(SQL_SERVER_IP, 3306, SQL_SERVER);
donatien 0:fd63457452f4 107
donatien 0:fd63457452f4 108 const int locationId = LOCATION_ID; //This is the location id that will be sent on each req to the SQL server
donatien 0:fd63457452f4 109
donatien 0:fd63457452f4 110 printf("Starting main loop...\n");
donatien 0:fd63457452f4 111
donatien 0:fd63457452f4 112 bool connected = false;
donatien 0:fd63457452f4 113
donatien 0:fd63457452f4 114 #if SDCARD
donatien 0:fd63457452f4 115 logger.fileOpen(LOG_FILE); //Open file on SD card
donatien 0:fd63457452f4 116 #endif
donatien 0:fd63457452f4 117
donatien 0:fd63457452f4 118 beep.beep(Beep::TONE_OK);
donatien 0:fd63457452f4 119
donatien 0:fd63457452f4 120 uint8_t uid[MAX_UID_LEN]; //Buffer for uid
donatien 0:fd63457452f4 121 uint8_t lastUid[MAX_UID_LEN] = {0}; //Buffer for previous uid
donatien 0:fd63457452f4 122 size_t uidLen;
donatien 0:fd63457452f4 123 size_t lastUidLen = 0;
donatien 0:fd63457452f4 124
donatien 0:fd63457452f4 125 while (!exitBtn.read()) //Main loop
donatien 0:fd63457452f4 126 {
donatien 0:fd63457452f4 127 if((!logger.isEmpty())&&(!logger.isConnecting())&&(!logger.isConnected())) //If logger is not ready, check its status
donatien 0:fd63457452f4 128 {
donatien 0:fd63457452f4 129 if(logger.connectionError()) //Error connecting to the server?
donatien 0:fd63457452f4 130 {
donatien 0:fd63457452f4 131 printf("Connection error (error code %d).\n", logger.getLastResult());
donatien 0:fd63457452f4 132 beep.beep(Beep::TONE_WARN);
donatien 0:fd63457452f4 133 }
donatien 0:fd63457452f4 134 printf("Connecting to SQL Server...\n");
donatien 0:fd63457452f4 135 logger.sqlOpen(sqlServer, SQL_USER, SQL_PASSWORD, SQL_DB); //Open a connection to server
donatien 0:fd63457452f4 136 connected = false;
donatien 0:fd63457452f4 137 }
donatien 0:fd63457452f4 138 if((!connected)&&logger.isConnected()) //We are now connected
donatien 0:fd63457452f4 139 {
donatien 0:fd63457452f4 140 connected = true;
donatien 0:fd63457452f4 141 printf("Connected to SQL Server...\n");
donatien 0:fd63457452f4 142 beep.beep(Beep::TONE_OK);
donatien 0:fd63457452f4 143 }
donatien 0:fd63457452f4 144 if(!reader.getUID(uid, &uidLen)) //Got an UID successfully
donatien 0:fd63457452f4 145 {
donatien 0:fd63457452f4 146 uidLen = (uidLen<10)?uidLen:10; //Check length
donatien 0:fd63457452f4 147 if( (uidLen != lastUidLen) || !!memcmp(lastUid, uid, uidLen) ) //Compare UID with previous one
donatien 0:fd63457452f4 148 {
donatien 0:fd63457452f4 149 beep.beep(Beep::TONE_INFO);
donatien 0:fd63457452f4 150 printf("Tag ID = ");
donatien 0:fd63457452f4 151 for(int i = 0; i < uidLen; i++)
donatien 0:fd63457452f4 152 printf("%02x ", uid[i]);
donatien 0:fd63457452f4 153 printf("\n");
donatien 0:fd63457452f4 154
donatien 0:fd63457452f4 155 time_t timestamp = time(NULL);
donatien 0:fd63457452f4 156 timestamp += TIME_ZONE*3600;
donatien 0:fd63457452f4 157 TagInfo tagInfo(uid, uidLen, locationId, timestamp); //Setup infos for data logging
donatien 0:fd63457452f4 158 logger.log(&tagInfo); //Pass data to logger
donatien 0:fd63457452f4 159
donatien 0:fd63457452f4 160 //Save uid to avoid duplicate db entries
donatien 0:fd63457452f4 161 memcpy(lastUid, uid, uidLen);
donatien 0:fd63457452f4 162 lastUidLen = uidLen;
donatien 0:fd63457452f4 163 }
donatien 0:fd63457452f4 164 }
donatien 0:fd63457452f4 165 else //No card present
donatien 0:fd63457452f4 166 {
donatien 0:fd63457452f4 167 lastUidLen = 0; //Last logged card is now out of field
donatien 0:fd63457452f4 168 }
donatien 0:fd63457452f4 169 logger.service(); //Process logger service
donatien 0:fd63457452f4 170 }
donatien 0:fd63457452f4 171
donatien 0:fd63457452f4 172 printf("Stopping...\n");
donatien 0:fd63457452f4 173
donatien 0:fd63457452f4 174 //Close everything nicely
donatien 0:fd63457452f4 175 logger.sqlClose();
donatien 0:fd63457452f4 176
donatien 0:fd63457452f4 177 #if SDCARD
donatien 0:fd63457452f4 178 logger.fileClose();
donatien 0:fd63457452f4 179 #endif
donatien 0:fd63457452f4 180
donatien 0:fd63457452f4 181 network_close();
donatien 0:fd63457452f4 182
donatien 0:fd63457452f4 183 printf("End.\n");
donatien 0:fd63457452f4 184 beep.beep(Beep::TONE_OK);
donatien 0:fd63457452f4 185
donatien 0:fd63457452f4 186 while(1);
donatien 0:fd63457452f4 187
donatien 0:fd63457452f4 188 }