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;
            }
        }
        private void MonitoringTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            monitoringTimer.Stop();
            try
            {
                foreach (var reader in currentGroup.Readers)
                {
                    if (dicReaders.ContainsKey(reader.ReaderId))
                    {
                        RFIDMotorolaReader rdr = dicReaders[reader.ReaderId];
                        if (null != rdr)
                        {
                            if (!rdr.ReaderInfo.IsOnline)
                            {
                                try { rdr.Reconnect(pollCycle, true); }
                                catch
                                {
                                    // Log Reader is offline
                                    rdr.ReaderInfo.IsOnline = false;
                                }
                            }

                        }
                        else
                        {
                            lock (objLock)
                            {

                                RFIDMotorolaReader rdrObject = null;
                                try
                                {
                                    rdrObject = new RFIDMotorolaReader(reader, 1000, readerPulseMonitor_InMin);
                                    rdrObject.Connect(pollCycle, true);
                                }
                                catch
                                { //Log Reader is offline
                                    reader.IsOnline = false;
                                }

                                dicReaders[reader.ReaderId] = rdrObject;
                            }
                        }
                    }
                    else
                    {
                        lock (objLock)
                        {

                            RFIDMotorolaReader rdrObject = null;
                            try
                            {
                                rdrObject = new RFIDMotorolaReader(reader, 1000, readerPulseMonitor_InMin);
                                rdrObject.Connect(pollCycle, true);
                            }
                            catch
                            { //Log Reader is offline
                                reader.IsOnline = false;
                            }

                            dicReaders[reader.ReaderId] = rdrObject;
                        }
                    }
                }
            }
            catch { }
            finally
            {
                monitoringTimer.Start();
            }
        }
        private bool InitService()
        {
            bool isInitDone = false;
            try
            {
                // Get Reader Group Details
                iReaderGroupID = int.Parse(ConfigurationManager.AppSettings["ReaderGroupID"]);

                ReaderGroupDA rdrGrpDataAccess = new ReaderGroupDA();
                currentGroup = rdrGrpDataAccess.GetReaderGroup(iReaderGroupID);

                if (!int.TryParse(ConfigurationManager.AppSettings["PollCycle"], out pollCycle))
                    pollCycle = 10000;

                //ReaderPulseMonitor_InMin
                if (!int.TryParse(ConfigurationManager.AppSettings["ReaderPulseMonitor_InMin"], out readerPulseMonitor_InMin))
                    readerPulseMonitor_InMin = 30;

                // Initialize all readers
                Parallel.ForEach(currentGroup.Readers,
                    rdr =>
                    {

                        RFIDMotorolaReader rdrObject = null;
                        try
                        {
                            rdrObject = new RFIDMotorolaReader(rdr, 1000, readerPulseMonitor_InMin);
                            rdrObject.Connect(pollCycle, true);

                        }
                        catch
                        { //Log Reader is offline }
                            rdr.IsOnline = false;
                        }

                        lock (objLock)
                        {
                            dicReaders[rdr.ReaderId] = rdrObject;
                        }
                    });

                monitoringTimer = new System.Timers.Timer(5000);
                monitoringTimer.Elapsed += MonitoringTimer_Elapsed;
                monitoringTimer.Start();

                isInitDone = true;
            }
            catch (Exception ex)
            {
                isInitDone = false;
                LoggerAgent.Error("Error in init reader service.", ex);
            }
            finally
            {
                LoggerAgent.Trace("Leaving...");
            }

            return isInitDone;
        }