RFID tracking with mbed & RS-EDP reference design

Dependencies:   RWDModule mbed SDCard

Revision:
0:fd63457452f4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/log/logger.cpp	Wed Jul 28 11:02:36 2010 +0000
@@ -0,0 +1,174 @@
+/*
+Copyright (c) 2010 ARM Limited
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+ 
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+ 
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+#include "mbed.h"
+#include "logger.h"
+
+#include "MySQLClient.h"
+
+#define MAX_ELEMENTS_IN_QUEUE 50
+
+
+Logger::Logger(const string& table) : m_lSQLReq(MAX_ELEMENTS_IN_QUEUE), m_fd(NULL), m_sqlClient(), m_sqlLastResult(MYSQL_PROCESSING), 
+m_sqlConnecting(false), m_sqlConnected(false), m_sqlConnectionError(false), m_sqlCommand(false)
+{
+  m_table = table;
+}
+
+Logger::~Logger()
+{
+
+}
+
+//Open file for logging
+int Logger::fileOpen(const char* filename)
+{
+  if(m_fd)
+    return -1; //File already opened
+  m_fd = fopen(filename, "a");
+  if(!m_fd) //Try again in "w" mode (creates the file if not existent)
+    m_fd = fopen(filename, "w");
+  if(!m_fd)
+    return -1; //Could not open file
+  return 0;
+}
+
+//Close log file
+int Logger::fileClose()
+{
+  if(!m_fd)
+    return -1; //Nothing to close
+  fclose(m_fd);
+  m_fd = NULL;
+  return 0;
+}
+
+//Try to connect to server
+int Logger::sqlOpen(Host& host, const string& user, const string& password, const string& db)
+{
+  m_sqlClient.open(host, user, password, db, this, &Logger::onMySQLResult); //Non blocking
+  //The onMySQLResult() method will be called on result of this command
+  m_sqlConnecting = true;
+  m_sqlConnectionError = false;
+  return 0;
+}
+  
+//Close server connection
+int Logger::sqlClose()
+{
+  m_sqlClient.exit();
+  m_sqlConnected = false;
+  return 0;
+}
+  
+//Log some data
+int Logger::log(LogInfo* pInfo) //Returns 0 on success, -1 on failure
+{
+
+  if(m_fd) //If file is open, append record to file in CSV format
+  {
+    fputs(pInfo->toCSV().c_str(), m_fd);
+    fputs("\r\n", m_fd); //Append new line
+  }
+  if(m_lSQLReq.size()<MAX_ELEMENTS_IN_QUEUE) //Check if there is (arbitrary) space in queue
+  {
+    m_lSQLReq.push(pInfo->toSQL(m_table)); //Put record in queue for next network push
+    return 0; //Request queued
+  }
+  else
+  {
+    return -1; //Error
+  }
+}
+
+void Logger::service()
+{
+  Net::poll(); //Poll Networking stack
+  if(m_sqlConnected) //Are we connected to the server?
+  {
+    //Can serve SQL requests
+    if(m_sqlCommand && m_sqlLastResult!=MYSQL_PROCESSING) //Previous command completed?
+    {
+      if(m_sqlLastResult==MYSQL_OK) //Has previous command completed with success?
+      {
+        if(!m_lSQLReq.empty())
+        {
+          m_lSQLReq.pop(); //Ok, we can dequeue previous element
+        } 
+      }
+      m_sqlCommand = false; //No command being executed
+    }
+    if(!m_sqlCommand) //Ready for a command?
+    {
+      if(!m_lSQLReq.empty()) //Anything in the queue?
+      {
+        //Execute the next SQL request
+        m_sqlLastResult = m_sqlClient.sql(m_lSQLReq.front()); //MYSQL_PROCESSING
+        m_sqlCommand = true;
+      }
+    }
+  }
+}
+
+bool Logger::isEmpty()
+{
+  return m_lSQLReq.empty();
+}
+
+bool Logger::isConnecting()
+{
+  return m_sqlConnecting;
+}
+
+bool Logger::isConnected()
+{
+  return m_sqlConnected;
+}
+
+bool Logger::connectionError()
+{
+  return m_sqlConnectionError;
+}
+
+MySQLResult Logger::getLastResult() //Returns last command's result
+{
+  return m_sqlLastResult;
+}
+
+void Logger::onMySQLResult(MySQLResult r) //Callback from MySQL client
+{
+  //Update status
+  m_sqlLastResult = r;
+  if(m_sqlConnecting) //Check if we're connecting, if so this result is the result of the connection
+  {
+    m_sqlConnected = (r==0)?true:false; //If no error, we're connected
+    m_sqlConnecting = false;
+    if(r!=0)
+      m_sqlConnectionError = true; //Else there was an error during connection
+  }
+  if( (r==MYSQL_DNS) || (r==MYSQL_PRTCL) || (r==MYSQL_AUTHFAILED) || (r==MYSQL_TIMEOUT) || (r==MYSQL_CONN) ) //Was this a fatal error?
+  {
+    //Connection has been closed, we must reconnect
+    m_sqlConnected = false;
+    m_sqlConnectionError = true;
+  }
+}
\ No newline at end of file