Merge branch 'CardReaderServiceAlwaysStart-Issue90' into Release0.2
This commit is contained in:
commit
9a2ff37004
@ -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,13 +58,10 @@ 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)
|
||||||
{
|
{
|
||||||
@ -81,6 +79,7 @@ namespace CardReaderService
|
|||||||
Name = "CardServiceMainThread",
|
Name = "CardServiceMainThread",
|
||||||
IsBackground = false
|
IsBackground = false
|
||||||
};
|
};
|
||||||
|
_mainWorkerTerminationSignal = new AutoResetEvent(false);
|
||||||
_mainWorkThread.Start();
|
_mainWorkThread.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,7 +112,7 @@ 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");
|
||||||
}
|
}
|
||||||
@ -130,16 +129,48 @@ namespace CardReaderService
|
|||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user