This commit introduces the `IperlHeadTestCtrl` component and `NfcServices` class, including core functionality for communication with iPerl heads via NFC/RFID. It integrates configuration options, multithreaded commands processing, and logging through `log4net`.
190 lines
7.2 KiB
C#
190 lines
7.2 KiB
C#
using System;
|
|
using System.Threading;
|
|
using System.Web.UI.WebControls;
|
|
using System.Windows.Forms;
|
|
using TBF.Rig.Sequences;
|
|
|
|
namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
|
{
|
|
public partial class IperlHeadTestCtrl : UserControl
|
|
{
|
|
IperlHeadCfg config;
|
|
IperlHead iPerlHead;
|
|
Thread optoThread;
|
|
|
|
private bool stopWorkerThread;
|
|
public event EventHandler<OptoReceivedEventArgs> OptoReceivedHandler;
|
|
|
|
public IperlHeadTestCtrl(IperlHeadCfg config)
|
|
{
|
|
this.config = config;
|
|
InitializeComponent();
|
|
if (config == null) return;
|
|
|
|
iPerlCommunicationForm.cfg = new TestMethodCfg(null); // default values for iPerlCommunication
|
|
|
|
foreach(var head in ProcessData.IperlHeads)
|
|
{
|
|
if (head != null && head.Name == config.Name) { iPerlHead = head; }
|
|
}
|
|
|
|
rfidCommandComboBox.DisplayMember = "Name";
|
|
rfidCommandComboBox.ValueMember = "Value";
|
|
var items = new[]
|
|
{
|
|
new {Name = "Read PCB", Value = "ReadPCB" },
|
|
new {Name = "Set Test Mode", Value = "SetTestMode" },
|
|
new {Name = "Set Active Mode", Value = "SetActiveMode" },
|
|
#if DEBUG
|
|
new {Name = "Start Read Opto Data", Value = "ReadOptoData" },
|
|
new {Name = "Stop Read Opto Data", Value = "StopReadOptoData" },
|
|
#endif
|
|
new {Name = " ", Value = "" },
|
|
new {Name = "Reset NFC Head", Value = "ResetNfcHead" },
|
|
new {Name = "Set NFC Head Interface", Value = "SetNfcHead" },
|
|
new {Name = "Set RFID Head interface", Value = "SetRfidHead" }
|
|
};
|
|
/*
|
|
// CTRL+ALT+double click - hidden poweruser menu
|
|
if (((Keyboard.ModifierKeys & Keys.Control) == Keys.Control) && ((Keyboard.ModifierKeys & Keys.Alt) == Keys.Alt) && Users.CurrentUser.AuthorizedAs == AuthorizedAs.PowerUser)
|
|
{
|
|
Array.Resize(ref items, items.Length + 1);
|
|
items[items.Length - 1] = new { Name = "Kluc", Value = "Kluc" };
|
|
}
|
|
*/
|
|
rfidCommandComboBox.DataSource = items;
|
|
|
|
stopWorkerThread = false;
|
|
|
|
OptoReceivedHandler += (EventHandler<OptoReceivedEventArgs>)((sndr, args) =>
|
|
{
|
|
if (this.InvokeRequired)
|
|
this.Invoke((Delegate)new EventHandler<OptoReceivedEventArgs>(this.OnOptoReceived2), sndr, (object)args);
|
|
else
|
|
this.OnOptoReceived2(sndr, args);
|
|
});
|
|
}
|
|
|
|
public void OnOptoReceived2(object sender, OptoReceivedEventArgs args)
|
|
{
|
|
optoListBox.Items.Insert(0,args.Data);
|
|
}
|
|
|
|
private void CommandTestButtonClick(object sender, MouseEventArgs e)
|
|
{
|
|
rfidOutputListBox.Items.Clear();
|
|
|
|
using (Tools.LogChecker logChecker = new Tools.LogChecker("RfidData", log4net.Core.Level.Debug))
|
|
{
|
|
ListItem rfidListItem = new ListItem();
|
|
rfidListItem.Attributes.Add("style", "font-weight:bold");
|
|
switch (rfidCommandComboBox.SelectedValue)
|
|
{
|
|
case "ReadPCB":
|
|
rfidListItem.Text = $"PCB: {OpticalHeadTest.ReadRequest_PCB(iPerlHead)}";
|
|
break;
|
|
case "SetTestMode":
|
|
rfidListItem.Text = OpticalHeadTest.SetTestMode(iPerlHead);
|
|
optoListBox.Items.Clear();
|
|
stopWorkerThread = false;
|
|
optoThread = new Thread(OptoWorker);
|
|
if (!optoThread.IsAlive)
|
|
{
|
|
iPerlHead.StartDataStreamProcessing(); // open opto port
|
|
optoThread.Start();
|
|
}
|
|
break;
|
|
case "SetActiveMode":
|
|
rfidListItem.Text = OpticalHeadTest.SetActiveMode(iPerlHead);
|
|
stopWorkerThread = true;
|
|
iPerlHead.StopDataStreamProcessing(); // close opto port
|
|
break;
|
|
case "ResetNfcHead":
|
|
iPerlHead.ResetNfcInterface();
|
|
break;
|
|
case "SetNfcHead":
|
|
iPerlHead.SetNfcInterface();
|
|
break;
|
|
case "SetRfidHead":
|
|
iPerlHead.SetRfidInterface();
|
|
break;
|
|
case "ReadOptoData":
|
|
optoListBox.Items.Clear();
|
|
stopWorkerThread = false;
|
|
optoThread = new Thread(OptoWorker);
|
|
if (optoThread.IsAlive)
|
|
{
|
|
stopWorkerThread = true;
|
|
iPerlHead.StopDataStreamProcessing(); // close opto port
|
|
}
|
|
if (!optoThread.IsAlive)
|
|
{
|
|
iPerlHead.StartDataStreamProcessing(); // open opto port
|
|
optoThread.Start();
|
|
}
|
|
break;
|
|
case "StopReadOptoData":
|
|
stopWorkerThread = true;
|
|
iPerlHead.StopDataStreamProcessing(); // close opto port
|
|
break;
|
|
}
|
|
rfidOutputListBox.Items.Add(rfidListItem);
|
|
rfidOutputListBox.Items.AddRange(logChecker.Messages.ToArray());
|
|
}
|
|
}
|
|
|
|
private void OptoWorker()
|
|
{
|
|
while (!this.stopWorkerThread)
|
|
{
|
|
Thread.Sleep(250);
|
|
if (this.stopWorkerThread)
|
|
break;
|
|
|
|
try
|
|
{
|
|
string buffer = iPerlHead.ReadOptoData();
|
|
if (string.IsNullOrEmpty(buffer))
|
|
{
|
|
this.OnOptoReceived((object)this, new OptoReceivedEventArgs("."));
|
|
}
|
|
else
|
|
OnOptoReceived((object)this, new OptoReceivedEventArgs(buffer));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
this.OnOptoReceived((object)this, new OptoReceivedEventArgs(ex.Message));
|
|
}
|
|
}
|
|
}
|
|
|
|
public void OnOptoReceived(object sender, OptoReceivedEventArgs args)
|
|
{
|
|
if (this.OptoReceivedHandler == null)
|
|
return;
|
|
try
|
|
{
|
|
this.OptoReceivedHandler(sender, args);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
}
|
|
}
|
|
|
|
private void UserControl_Load(object sender, EventArgs e)
|
|
{
|
|
this.ParentForm.FormClosing += new FormClosingEventHandler(ParentForm_FormClosing);
|
|
}
|
|
|
|
void ParentForm_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
//OnHandleDestroyed(new EventArgs());
|
|
stopWorkerThread = true;
|
|
if (optoThread != null)
|
|
{
|
|
optoThread.Abort();
|
|
}
|
|
}
|
|
}
|
|
}
|