public static string GetLogString(ResultObject obj)
        {
            StringBuilder logMsg = new StringBuilder();

            logMsg.AppendLine("[" + obj.TimeStampString +  "] MethodName : " + obj.MethodInfo );
            logMsg.AppendLine(", IsSuccess : " + obj.IsSuccess);

            if (!obj.IsSuccess)
            {
                logMsg.AppendLine(", ErrorMsg : " + obj.ErrorMessage);
                logMsg.AppendLine(", InternalErrorMsg : " + obj.ErrorMessageInternal);
            }

            return logMsg.ToString();
        }
        public ResultObject AddReader(ReaderInfo objReaderInfo)
        {
            lock (objLock)
            {
                LoggerAgent.Trace("Entering...");

                ResultObject objRes = new ResultObject();
                objRes.MethodInfo = "ReaderService.AddReader ";

                try
                {

                    // -- Adding reader to DB ----
                    ReaderDA objReaderDA = new ReaderDA();
                    objRes = objReaderDA.AddReader(objReaderInfo);

                    if (objRes.IsSuccess == false)
                    {
                        return objRes;
                    }

                    // --- Connecting to actual reader ---
                    RFIDMotorolaReader rdrObject = null;
                    try
                    {
                        rdrObject = new RFIDMotorolaReader(objReaderInfo, 1000, readerPulseMonitor_InMin);
                        objRes.IsSuccess = rdrObject.Connect(pollCycle, true);
                    }
                    catch (Exception ex)
                    {
                        objRes.IsSuccess = false;
                        objRes.ErrorMessage = "Unable to connect to Reader. IP Address " + objReaderInfo.IPAddress;
                        objRes.ErrorMessageInternal = "Error : " + ex.ToString();
                    }

                    //Reader-Service collection will cache actual reader.
                    dicReaders[objReaderInfo.ReaderId] = rdrObject;

                    //Set result object: - /*set online status*/
                    objReaderInfo.IsOnline = objRes.IsSuccess;
                    //Set readerInfo in result object
                    // NOTE: ReaderId key is already SET by DAL call.
                    // objRes.ResultData["ReaderInfo"] = objReaderInfo;
                    objRes.MethodInfo = "ReaderService.AddReader ";
                    objRes.TimeStampString = DateTime.Now.ToString();

                    LoggerAgent.Debug("Reader status:  "
                        + " Reader IP:Port = " + rdrObject.ReaderInfo.IPAddress + ":"  + rdrObject.ReaderInfo.PortNo.ToString()
                        + ", IsOnline = " + rdrObject.ReaderInfo.IsOnline.ToString() );
                }
                catch (Exception ex)
                {
                    objRes.IsSuccess = false;
                    objRes.ErrorMessage = "Unable to Add Reader. IP Address " + objReaderInfo.IPAddress;
                    objRes.ErrorMessageInternal = "Error : " + ex.ToString();

                    LoggerAgent.Error("Error : Failed to AddReader. " + objRes.ErrorMessage, ex);
                }
                finally
                {
                    LoggerAgent.Trace("Leaving...");
                }

                LoggerAgent.Info("Result status = " + ResultObject.GetLogString(objRes));
                return objRes;
            }
        }
        public ResultObject ReconnectReader(ReaderInfo objReaderInfo)
        {
            LoggerAgent.Trace("Entering...");

            ResultObject objRes = new ResultObject();
            objRes.MethodInfo = "ReaderService.ReconnectReader ";
            try
            {
                //param validation
                if (objReaderInfo == null)
                {
                    objRes.IsSuccess = false;
                    objRes.ErrorMessage = "ReconnectReader Error : Invalid ReaderInfo object supplied.";
                    objRes.ErrorMessageInternal = string.Empty;
                    objRes.TimeStampString = DateTime.Now.ToString();
                    return objRes;
                }

                if (objReaderInfo.ReaderId <= 0)
                {
                    objRes.IsSuccess = false;
                    objRes.ErrorMessage = "ReconnectReader Error : ReaderId is invalid. Invalid ReaderInfo object supplied.";
                    objRes.ErrorMessageInternal = string.Empty;
                    objRes.TimeStampString = DateTime.Now.ToString();
                    return objRes;
                }

                var reader = dicReaders[objReaderInfo.ReaderId];
                reader.Reconnect(pollCycle, true);

                objRes.IsSuccess = true;

            }
            catch (Exception ex)
            {
                objRes.IsSuccess = false;
                objRes.ErrorMessage = "Failed to ReconnectReader " + objReaderInfo.ReaderId.ToString();
                objRes.ErrorMessageInternal = "Error : " + ex.ToString();

                LoggerAgent.Error("Error in Reconnecting reader, ReaderId = " + objReaderInfo.ReaderId.ToString(), ex);
            }

            objRes.TimeStampString = DateTime.Now.ToString();
            //reset the methodinfo
            objRes.MethodInfo = "ReaderService.ReconnectReader ";

            LoggerAgent.Info("Result status = " + ResultObject.GetLogString(objRes));
            LoggerAgent.Trace("Leaving...");

            return objRes;
        }
        public ResultObject ModifyReader(ReaderInfo objReaderInfo)
        {
            ResultObject objRes = new ResultObject();
            objRes.MethodInfo = "ReaderService.ModifyReader ";
            try
            {
                //param validation
                if (objReaderInfo ==  null)
                {
                    objRes.IsSuccess = false;
                    objRes.ErrorMessage = "ModifyReader Error : Invalid ReaderInfo object supplied.";
                    objRes.ErrorMessageInternal = string.Empty;
                    objRes.TimeStampString = DateTime.Now.ToString();
                    return objRes;
                }

                if (objReaderInfo.ReaderId <= 0)
                {
                    objRes.IsSuccess = false;
                    objRes.ErrorMessage = "ModifyReader Error : ReaderId is invalid. Invalid ReaderInfo object supplied.";
                    objRes.ErrorMessageInternal = string.Empty;
                    objRes.TimeStampString = DateTime.Now.ToString();
                    return objRes;
                }

                ReaderDA objReaderDA = new ReaderDA();
                objRes = objReaderDA.ModifyReader(objReaderInfo);
            }
            catch (Exception ex)
            {
                objRes.IsSuccess = false;
                objRes.ErrorMessage = "Failed to modify reader " + objReaderInfo.ReaderId.ToString();
                objRes.ErrorMessageInternal = "Error : " + ex.ToString();
            }

            objRes.TimeStampString = DateTime.Now.ToString();
            //reset the methodinfo
            objRes.MethodInfo = "ReaderService.ModifyReader ";

            LoggerAgent.Info("Result status = " + ResultObject.GetLogString(objRes));
            LoggerAgent.Trace("Leaving...");
            return objRes;
        }
        //public ResultObject GetReaderDetails(int readerId)
        public ReaderInfo GetReaderDetails(int readerId)
        {
            LoggerAgent.Trace("Entering...");

            ResultObject objRes = new ResultObject();
            objRes.MethodInfo = "ReaderService.GetReaderDetails ";
            ReaderInfo rdrInfo = null;
            lock (objLock)
            {
                try
                {
                    RFIDMotorolaReader motoRdr;
                    motoRdr = dicReaders.ContainsKey(readerId) && dicReaders[readerId] != null ? dicReaders[readerId] : null;
                    //rdrInfo = dicReaders.ContainsKey(readerId) && dicReaders[readerId] != null ? dicReaders[readerId].ReaderInfo : null;

                    rdrInfo = motoRdr.ReaderInfo;

                    objRes.IsSuccess = true;

                }
                catch (Exception ex)
                {
                    objRes.IsSuccess = false;
                    objRes.ErrorMessage = "Failed to get reader details.";
                    objRes.ErrorMessageInternal = "Error : " + ex.ToString();

                    LoggerAgent.Error("Failed to get reader details for readerId = " + readerId.ToString(), ex);
                }
            }

            objRes.ResultData["ReaderInfo"] = rdrInfo;
            objRes.TimeStampString = DateTime.Now.ToString();

            LoggerAgent.Info("Result status = " + ResultObject.GetLogString(objRes));
            LoggerAgent.Trace("Leaving...");
            return rdrInfo;
        }
        public ResultObject AddReader(ReaderInfo readerInfo)
        {
            ResultObject objRes = new ResultObject();
            objRes.MethodInfo = " ReaderDA.AddReader ";
            string insertSql =
                                    "INSERT INTO [RF].[Reader] " +
                                                 " ([ReaderGroupID] " +
                                                 ", [ReaderTypeID] " +
                                                 ", [ReaderName] " +
                                                 ", [ReaderDescription] " +
                                                 ", [IPAddress] " +
                                                 ", [PortNo] " +
                                                 ", [MACAddress] " +
                                                 ", [AntennaPower] " +
                                                 ", [ReaderPower] " +
                                                 ", [LocationRef] " +
                                                 ", [LocationDescription] " +
                                                 ", [IsDeleted]  " +
                                                 ", [CreateDateTime]  " +
                                                 ", [UpdateDateTime] ) " +
                                                 " VALUES " +
                                                 "(@ReaderGroupID " +
                                                 ", @ReaderTypeID " +
                                                 ", @ReaderName " +
                                                 ", @ReaderDescription " +
                                                 ", @IPAddress " +
                                                 ", @PortNo " +
                                                 ", @MACAddress " +
                                                 ", @AntennaPower " +
                                                 ", @ReaderPower " +
                                                 ", @LocationRef " +
                                                 ", @LocationDescription " +
                                                 ", @IsDeleted " +
                                                 ", @CreateDateTime " +
                                                 ", @UpdateDateTime ); ";

            try
            {
                using (var dbhelper = new DbHelper())
                {
                    // Fetch Reader Group
                    dbhelper.Command.CommandType = System.Data.CommandType.Text;
                    dbhelper.Command.CommandText = insertSql;

                    dbhelper.AddParameter("@ReaderGroupID", SqlDbType.Int, readerInfo.ReaderGroupId);
                    dbhelper.AddParameter("@ReaderTypeID", SqlDbType.Int, readerInfo.ReaderTypeId);
                    dbhelper.AddParameter("@ReaderName", SqlDbType.NVarChar, readerInfo.ReaderName);
                    dbhelper.AddParameter("@ReaderDescription", SqlDbType.NVarChar, readerInfo.ReaderDescription);
                    dbhelper.AddParameter("@IPAddress", SqlDbType.NVarChar, readerInfo.IPAddress);
                    dbhelper.AddParameter("@PortNo", SqlDbType.Int, readerInfo.PortNo);
                    dbhelper.AddParameter("@MACAddress", SqlDbType.VarChar, readerInfo.MAC == null ? "  " : readerInfo.MAC);
                    dbhelper.AddParameter("@AntennaPower", SqlDbType.VarChar, (float)readerInfo.AntennaPower);
                    dbhelper.AddParameter("@ReaderPower", SqlDbType.Float, (float)1.0); // readerInfo.AntennaPower);
                    dbhelper.AddParameter("@LocationRef", SqlDbType.NVarChar, readerInfo.LocationRef);
                    dbhelper.AddParameter("@LocationDescription", SqlDbType.NVarChar, readerInfo.LocationDescription);
                    dbhelper.AddParameter("@IsDeleted", SqlDbType.Bit, 0);
                    dbhelper.AddParameter("@CreateDateTime", SqlDbType.DateTime, DateTime.Now);
                    dbhelper.AddParameter("@UpdateDateTime", SqlDbType.DateTime, DateTime.Now);

                    int i = dbhelper.ExecuteNoneQuery();

                    objRes.IsSuccess = true;
                }
            }
            catch (Exception ex)
            {
                objRes.IsSuccess = false;
                objRes.ErrorMessage = "Failed to add reader into database";
                objRes.ErrorMessageInternal = " Error : " + ex.ToString();
            }

            //try to return readerId for newly added reader
            ResultObject internalResultObject = new ResultObject();
            internalResultObject = GetReaderByReaderName(readerInfo.ReaderName);

            //Assign readerId to main result object with key "ReaderId"
            objRes.ResultData["ReaderId"] = internalResultObject.IsSuccess ? ((ReaderInfo)internalResultObject.ResultData["ReaderInfo"]).ReaderId : -1 /*OnError reader is -1*/;
               readerInfo.ReaderId  = internalResultObject.IsSuccess ? ((ReaderInfo)internalResultObject.ResultData["ReaderInfo"]).ReaderId : -1 /*OnError reader is -1*/;
            objRes.ResultData["ReaderInsertSql"] = insertSql;
            objRes.TimeStampString = DateTime.Now.ToString();

            return objRes;
        }
        public ResultObject ModifyReader(ReaderInfo readerInfo, bool isdeleted = false)
        {
            ResultObject objRes = new ResultObject();
            objRes.MethodInfo = " ReaderDA.ModifyReader ";

            try
            {
                using (var dbhelper = new DbHelper())
                {
                    // Fetch Reader Group
                    dbhelper.Command.CommandType = System.Data.CommandType.Text;
                    dbhelper.Command.CommandText = "UPDATE [RF].[Reader] " +
                                                   "SET [ReaderGroupID] = @ReaderGroupID " +
                                                    ", [ReaderTypeID] = @ReaderTypeID " +
                                                    ", [ReaderName] = @ReaderName " +
                                                    ", [ReaderDescription] = @ReaderDescription  " +
                                                    ", [IPAddress] = @IPAddress  " +
                                                    ", [PortNo] = @PortNo  " +
                                                    ", [MACAddress] = @MACAddress " +
                                                    ", [AntennaPower] = @AntennaPower " +
                                                    ", [ReaderPower] = @ReaderPower  " +
                                                    ", [LocationRef] = @LocationRef  " +
                                                    ", [LocationDescription] = @LocationDescription  " +
                                                    ", [IsDeleted] = @IsDeleted " +
                                                    ", [UpdateDateTime] = @UpdateDateTime " +
                                                    " WHERE ReaderID = @ReaderID ;";

                    dbhelper.AddParameter("@ReaderGroupID", SqlDbType.Int, readerInfo.ReaderGroupId);
                    dbhelper.AddParameter("@ReaderTypeID", SqlDbType.Int, readerInfo.ReaderTypeId);
                    dbhelper.AddParameter("@ReaderName", SqlDbType.NVarChar, readerInfo.ReaderName);
                    dbhelper.AddParameter("@ReaderDescription", SqlDbType.NVarChar, readerInfo.ReaderDescription);
                    dbhelper.AddParameter("@IPAddress", SqlDbType.NVarChar, readerInfo.IPAddress);
                    dbhelper.AddParameter("@PortNo", SqlDbType.Int, readerInfo.PortNo);
                    dbhelper.AddParameter("@MACAddress", SqlDbType.VarChar, readerInfo.MAC == null ? " " : readerInfo.MAC);
                    dbhelper.AddParameter("@AntennaPower", SqlDbType.VarChar, (float)readerInfo.AntennaPower);
                    dbhelper.AddParameter("@ReaderPower", SqlDbType.Float, readerInfo.AntennaPower);
                    dbhelper.AddParameter("@LocationRef", SqlDbType.NVarChar, readerInfo.LocationRef);
                    dbhelper.AddParameter("@LocationDescription", SqlDbType.NVarChar, readerInfo.LocationDescription);
                    dbhelper.AddParameter("@IsDeleted", SqlDbType.Bit, isdeleted ? 1 : 0);
                    dbhelper.AddParameter("@UpdateDateTime", SqlDbType.DateTime, DateTime.Now);
                    dbhelper.AddParameter("@ReaderID", SqlDbType.Int, readerInfo.ReaderId);

                    int i = dbhelper.ExecuteNoneQuery();

                    objRes.IsSuccess = true;
                    objRes.ResultData["ReaderId"] = readerInfo.ReaderId;
                    //objRes.ResultData["ReaderInfo"] = readerInfo;
                }
            }
            catch (Exception ex)
            {
                objRes.IsSuccess = false;
                objRes.ErrorMessage = "Failed to modify reader into database";
                objRes.ErrorMessageInternal = " Error : " + ex.ToString();
            }

            objRes.TimeStampString = DateTime.Now.ToString();
            return objRes;
        }
        public ResultObject GetReaderByReaderName(string readerName)
        {
            ResultObject objRes = new ResultObject();
            objRes.MethodInfo = "ReaderDA.GetReaderByReaderName ";
            try
            {
                using (var dbhelper = new DbHelper())
                {
                    // Fetch Reader Group
                    dbhelper.Command.CommandType = System.Data.CommandType.Text;
                    dbhelper.Command.CommandText = "SELECT [ReaderID],[ReaderGroupID],[ReaderTypeID],[ReaderName],[ReaderDescription],[IPAddress],[PortNo],[MACAddress],[AntennaPower],[ReaderPower],[LocationRef],[LocationDescription],[IsDeleted]  FROM [RF].[Reader] WHERE [ReaderName] = '" + readerName + "'";
                    DataSet dsReaders = dbhelper.ExcuteDatset(dbhelper.Command);

                    if (dsReaders.Tables.Count == 0 || dsReaders.Tables[0].Rows.Count == 0)
                    {
                        //throw new Exception("Reader not found");
                        objRes.IsSuccess = false;
                        objRes.ErrorMessage = "Reader not found";
                        objRes.ErrorMessageInternal = "Empty data table returned by DAL for supplied readerName = " + readerName;
                    }

                    List<ReaderInfo> readersInfo = DbHelper.DataTableToList<ReaderInfo>(dsReaders.Tables[0]).ToList();

                    objRes.IsSuccess = true;
                    objRes.ResultData["ReaderInfo"] = readersInfo.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                objRes.IsSuccess = false;
                objRes.ErrorMessage = "Failed to get ReaderInfo from database on supplied readerName = " + readerName;
                objRes.ErrorMessageInternal = "Error : " + ex.ToString();
            }

            objRes.TimeStampString = DateTime.Now.ToString();
            return objRes;
        }
        public ResultObject ExeSP(int readerId, string tagIds)
        {
            ResultObject objRes = new ResultObject();
            objRes.MethodInfo = "ReaderDA.ExeSP ";

            string spName = "[RF].[spProcessTags]";
            try
            {
                using (var dbhelper = new DbHelper())
                {
                    dbhelper.Command.CommandType = System.Data.CommandType.StoredProcedure;
                    dbhelper.Command.CommandText = spName;
                    dbhelper.AddParameter("@ReaderId", SqlDbType.VarChar, readerId);
                    dbhelper.AddParameter("@tags", SqlDbType.VarChar, tagIds);

                    dbhelper.ExecuteNoneQuery();
                }

                objRes.IsSuccess = true;
            }
            catch (Exception ex)
            {
                objRes.IsSuccess = false;
                objRes.ErrorMessage = "Failed to execute sp for processing tags.";
                objRes.ErrorMessageInternal = "Error : " + ex.ToString();
            }

            objRes.TimeStampString = DateTime.Now.ToString();
            return objRes;
        }