diff --git a/CardReaderService/CardReaderService/Service1.cs b/CardReaderService/CardReaderService/Service1.cs index 971ea0b..2254187 100644 --- a/CardReaderService/CardReaderService/Service1.cs +++ b/CardReaderService/CardReaderService/Service1.cs @@ -12,9 +12,8 @@ namespace CardReaderService { private Thread _mainWorkThread; private bool _stopMainWorkerThread; - + private AutoResetEvent _mainWorkerTerminationSignal; private string _readerName = ""; - //private SCardReader _reader; private SCardMonitor _cardMonitor; public Service1() @@ -24,29 +23,27 @@ namespace CardReaderService public void Start() { - OnStart(new string[] {}); + OnStart(new string[] { }); } -// + protected override void OnStart(string[] args) { - Console.WriteLine("Starting.. Getting available readers"); - var ctxFactory = ContextFactory.Instance; - using(var context = ctxFactory.Establish(SCardScope.System)) - { - var readerNames = context.GetReaders(); - if (NoReaderAvailable(readerNames)) - { - Console.WriteLine("No Card Reader is available, Exiting.."); - return; - } - Console.WriteLine("Choosing first available reader: " + readerNames.First()); - _readerName = readerNames.First(); - _cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System); - _cardMonitor.CardInserted += _cardMonitor_CardInserted; - _cardMonitor.Start(_readerName); + StartWorkerThread(); + } - StartWorkerThread(); + private bool WeHaveValidCardReader() + { + if (_cardMonitor == null) + { + return false; } + if (_cardMonitor.GetCurrentState(0) == SCRState.Unknown || + _cardMonitor.GetCurrentState(0) == SCRState.Unavailable || + _cardMonitor.GetCurrentState(0) == SCRState.Unaware) + { + return false; + } + return true; } public void Stop() @@ -57,19 +54,16 @@ namespace CardReaderService protected override void OnStop() { _stopMainWorkerThread = true; - if (_mainWorkThread!= null && _mainWorkThread.IsAlive) + _mainWorkerTerminationSignal.Set(); + if (_mainWorkThread != null && _mainWorkThread.IsAlive) { - _mainWorkThread.Join(3000); - if (_mainWorkThread.IsAlive) - { - _mainWorkThread.Interrupt(); - } + _mainWorkThread.Interrupt(); } if (_cardMonitor != null) { _cardMonitor.Cancel(); _cardMonitor.Dispose(); - _cardMonitor = null; + _cardMonitor = null; } } @@ -81,6 +75,7 @@ namespace CardReaderService Name = "CardServiceMainThread", IsBackground = false }; + _mainWorkerTerminationSignal = new AutoResetEvent(false); _mainWorkThread.Start(); } @@ -99,7 +94,7 @@ namespace CardReaderService _stopMainWorkerThread = true; return; } - + var err = reader.Connect(_readerName, SCardShareMode.Shared, SCardProtocol.T0 | SCardProtocol.T1); if (err == SCardError.Success) @@ -113,10 +108,10 @@ namespace CardReaderService var atrString = ConvertByteUIDToString(e.Atr); Console.WriteLine("Card Inserted, ATR: " + atrString + ", and UID is: " + uid); - CardDataPost postObj = new CardDataPost {CardUId = uid}; + CardDataPost postObj = new CardDataPost { CardUId = uid }; DataCenterHelper.PostAsync(postObj, "/api/swipedata"); Console.WriteLine("Posted to Server"); - } + } } else { @@ -125,21 +120,44 @@ namespace CardReaderService } } - + private void MainWorkerThread() { while (!_stopMainWorkerThread) { - //dont actually need to do anything.. but cannot exit right away? - Thread.Sleep(3000); + if (!WeHaveValidCardReader()) + { //only do this if we don't have a valid card reader + Console.WriteLine("Starting.. Getting available readers"); + var ctxFactory = ContextFactory.Instance; + using (var context = ctxFactory.Establish(SCardScope.System)) + { + var readerNames = context.GetReaders(); + if (!NoReaderAvailable(readerNames)) + { + //we have a reader available, so initialise! + Console.WriteLine("Choosing first available reader: " + readerNames.First()); + _readerName = readerNames.First(); + _cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System); + _cardMonitor.CardInserted += _cardMonitor_CardInserted; + _cardMonitor.Start(_readerName); + + StartWorkerThread(); + } + else + { + Console.WriteLine("No Card Reader is available.."); + } + } + } + _mainWorkerTerminationSignal.WaitOne(3000); } } private string ConvertByteUIDToString(byte[] uid) { - StringBuilder sb = new StringBuilder(); + var sb = new StringBuilder(); - foreach(var b in uid) + foreach (var b in uid) { sb.AppendFormat("{0:X2}", b); }