Merge branch 'CardReaderServiceAlwaysStart-Issue90' into Release0.2

This commit is contained in:
Chris.Watts90@outlook.com 2018-03-06 15:11:05 +00:00
commit 9a2ff37004

View File

@ -12,10 +12,10 @@ namespace CardReaderService
{ {
private Thread _mainWorkThread; private Thread _mainWorkThread;
private bool _stopMainWorkerThread; private bool _stopMainWorkerThread;
private AutoResetEvent _mainWorkerTerminationSignal;
private string _readerName = ""; private string _readerName = "";
//private SCardReader _reader;
private SCardMonitor _cardMonitor; private SCardMonitor _cardMonitor;
private bool _initialised=false;
public Service1() public Service1()
{ {
@ -24,29 +24,30 @@ namespace CardReaderService
public void Start() public void Start()
{ {
OnStart(new string[] {}); OnStart(new string[] { });
} }
//
protected override void OnStart(string[] args) protected override void OnStart(string[] args)
{ {
Console.WriteLine("Starting.. Getting available readers"); StartWorkerThread();
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(); private bool WeHaveValidCardReader()
{
if (_cardMonitor == null)
{
return false;
} }
Console.WriteLine(_cardMonitor.GetCurrentState(0));
if (_cardMonitor.GetCurrentState(0) == SCRState.Unknown
|| _cardMonitor.GetCurrentState(0) == SCRState.Unavailable
|| _cardMonitor.GetCurrentState(0) == (SCRState.Ignore | SCRState.Unavailable)
//|| _cardMonitor.GetCurrentState(0) == SCRState.Unaware //if we say this is an invalid state, we cause a memory leak where we create a duplicate card monitor, subscribe and overwrite.
)
{
return false;
}
return true;
} }
public void Stop() public void Stop()
@ -57,19 +58,16 @@ namespace CardReaderService
protected override void OnStop() protected override void OnStop()
{ {
_stopMainWorkerThread = true; _stopMainWorkerThread = true;
if (_mainWorkThread!= null && _mainWorkThread.IsAlive) _mainWorkerTerminationSignal.Set();
if (_mainWorkThread != null && _mainWorkThread.IsAlive)
{ {
_mainWorkThread.Join(3000); _mainWorkThread.Interrupt();
if (_mainWorkThread.IsAlive)
{
_mainWorkThread.Interrupt();
}
} }
if (_cardMonitor != null) if (_cardMonitor != null)
{ {
_cardMonitor.Cancel(); _cardMonitor.Cancel();
_cardMonitor.Dispose(); _cardMonitor.Dispose();
_cardMonitor = null; _cardMonitor = null;
} }
} }
@ -81,6 +79,7 @@ namespace CardReaderService
Name = "CardServiceMainThread", Name = "CardServiceMainThread",
IsBackground = false IsBackground = false
}; };
_mainWorkerTerminationSignal = new AutoResetEvent(false);
_mainWorkThread.Start(); _mainWorkThread.Start();
} }
@ -99,7 +98,7 @@ namespace CardReaderService
_stopMainWorkerThread = true; _stopMainWorkerThread = true;
return; return;
} }
var err = reader.Connect(_readerName, SCardShareMode.Shared, SCardProtocol.T0 | SCardProtocol.T1); var err = reader.Connect(_readerName, SCardShareMode.Shared, SCardProtocol.T0 | SCardProtocol.T1);
if (err == SCardError.Success) if (err == SCardError.Success)
@ -113,10 +112,10 @@ namespace CardReaderService
var atrString = ConvertByteUIDToString(e.Atr); var atrString = ConvertByteUIDToString(e.Atr);
Console.WriteLine("Card Inserted, ATR: " + atrString + ", and UID is: " + uid); 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"); DataCenterHelper.PostAsync(postObj, "/api/swipedata");
Console.WriteLine("Posted to Server"); Console.WriteLine("Posted to Server");
} }
} }
else else
{ {
@ -125,21 +124,53 @@ namespace CardReaderService
} }
} }
private void MainWorkerThread() private void MainWorkerThread()
{ {
while (!_stopMainWorkerThread) while (!_stopMainWorkerThread)
{ {
//dont actually need to do anything.. but cannot exit right away? if (!WeHaveValidCardReader())
Thread.Sleep(3000); { //only do this if we don't have a valid card reader
if (_initialised)
{
//card reader no longer available, tidy up.
_cardMonitor.Cancel();
_cardMonitor.CardInserted -= _cardMonitor_CardInserted;
_cardMonitor.Dispose();
_cardMonitor = null;
_initialised = false;
}
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);
_initialised = true;
}
else
{
Console.WriteLine("No Card Reader is available..");
}
}
}
_mainWorkerTerminationSignal.WaitOne(3000);
} }
} }
private string ConvertByteUIDToString(byte[] uid) 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); sb.AppendFormat("{0:X2}", b);
} }