RFID tracking with mbed & RS-EDP reference design
Dependencies: RWDModule mbed SDCard
main.cpp@0:fd63457452f4, 2010-07-28 (annotated)
- Committer:
- donatien
- Date:
- Wed Jul 28 11:02:36 2010 +0000
- Revision:
- 0:fd63457452f4
Who changed what in which revision?
User | Revision | Line number | New 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 | } |