Files
2021-02-18 19:11:43 +01:00

213 lines
6.7 KiB
C#

using System;
using System.Threading;
using System.Windows.Forms;
using Flir.Atlas.Live.Device;
using Flir.Atlas.Live.Discovery;
namespace Thermo.Cam.Setup
{
public partial class DiscoveryForm : Form
{
#region Private Fields
private Discovery _discovery;
#endregion Private Fields
#region Public Constructors
public DiscoveryForm()
{
InitializeComponent();
}
#endregion Public Constructors
#region Public Properties
public string CameraAddress { get; set; } = "";
public string CameraName { get; set; } = "";
public bool doAutoConnect
{
get
{
return (!string.IsNullOrEmpty(CameraAddress) || !string.IsNullOrEmpty(CameraName));
}
}
/// <summary>
/// Camera selezionata
/// </summary>
public CameraDeviceInfo SelectedCameraDevice { get; set; }
#endregion Public Properties
#region Private Methods
private static void DisposeDiscovery(Object context)
{
var discovery = (Discovery)context;
discovery.Dispose();
}
private static void ShowError(string message)
{
MessageBox.Show(message);
}
private void _discovery_DeviceError(object sender, DeviceErrorEventArgs e)
{
BeginInvoke((Action)(() => ShowError(e.ErrorMessage)));
}
private void _discovery_DeviceFound(object sender, CameraDeviceInfoEventArgs e)
{
BeginInvoke((Action)(() => AddDevice(e.CameraDevice)));
}
private void _discovery_DeviceLost(object sender, CameraDeviceInfoEventArgs e)
{
BeginInvoke((Action)(() => RemoveDevice(e.CameraDevice)));
}
private void AddDevice(CameraDeviceInfo cameraDeviceInfo)
{
// A camera have been found, add the camera to the list control.
// One camera might support multiple streaming formats, iterate and add...
foreach (var streamingFormat in cameraDeviceInfo.StreamingFormats)
{
// This can be filtered if your only want 16-bit cameras or Video overlay.
//if (streamingFormat != ImageFormat.FlirFileFormat)
//{
// continue;
//}
var info = new CameraDeviceInfo(cameraDeviceInfo);
var item = new ListViewItem(string.Format("{0}", cameraDeviceInfo.Name));
if (cameraDeviceInfo.IpSettings != null)
{
item.SubItems.Add(cameraDeviceInfo.IpSettings.IpAddress);
item.SubItems.Add(cameraDeviceInfo.IpSettings.IsWireless ? "Yes" : "No");
}
else
{
item.SubItems.Add("N/A"); // IP
item.SubItems.Add("N/A"); // WiFi
}
info.SelectedStreamingFormat = streamingFormat;
item.SubItems.Add(streamingFormat.ToString());
item.Tag = info;
listViewDevices.Items.Add(item);
}
}
private void buttonSelect_Click(object sender, EventArgs e)
{
SelectCameraFromListCtrl();
DialogResult = DialogResult.OK;
Close();
}
private void DiscoveryForm_FormClosing(object sender, FormClosingEventArgs e)
{
Stop();
}
private void DiscoveryForm_Load(object sender, EventArgs e)
{
Start();
timerAutoconnect.Start();
}
private void listViewDevices_MouseDoubleClick(object sender, MouseEventArgs e)
{
SelectCameraFromListCtrl();
DialogResult = DialogResult.OK;
Close();
}
private void listViewDevices_SelectedIndexChanged(object sender, EventArgs e)
{
var items = listViewDevices.SelectedItems;
buttonSelect.Enabled = items.Count != 0;
}
private void RemoveDevice(CameraDeviceInfo cameraDeviceInfo)
{
foreach (ListViewItem item in listViewDevices.Items)
{
var device = item.Tag as CameraDeviceInfo;
if (device != null && device.DeviceIdentifier == cameraDeviceInfo.DeviceIdentifier)
{
listViewDevices.Items.Remove(item);
}
}
}
private void SelectCameraFromListCtrl()
{
var items = listViewDevices.SelectedItems;
if (items.Count <= 0) return;
var lv = items[0];
var device = lv.Tag as CameraDeviceInfo;
SelectedCameraDevice = device;
DialogResult = DialogResult.OK;
Close();
}
private void Start()
{
Stop();
_discovery = new Discovery();
_discovery.DeviceFound += _discovery_DeviceFound;
_discovery.DeviceLost += _discovery_DeviceLost;
_discovery.DeviceError += _discovery_DeviceError;
// Scan for camera devices on all interfaces. If you are only interested in devices from i.e. USB
// then you can start Discovery with the bit-flag Interface.Usb.
// _discovery.Start(Interface.Usb);
// or with a combination
// _discovery.Start(Interface.Network | Interface.Usb);
// Start discovery, scan on all interfaces.
// This requires that Bonjour and the Pleora drivers are installed, see the Atlas web page for more information.
_discovery.Start();
}
private void Stop()
{
if (_discovery == null) return;
_discovery.DeviceFound -= _discovery_DeviceFound;
_discovery.DeviceLost -= _discovery_DeviceLost;
_discovery.DeviceError -= _discovery_DeviceError;
// Stop discovery might take some time. Put dispose of discovery on a background thread.
ThreadPool.QueueUserWorkItem(DisposeDiscovery, _discovery);
_discovery = null;
}
private void timerAutoconnect_Tick(object sender, EventArgs e)
{
timerAutoconnect.Stop();
if (doAutoConnect)
{
foreach (ListViewItem item in listViewDevices.Items)
{
if (item.Text == CameraName)
{
item.Selected = true;
SelectCameraFromListCtrl();
}
}
}
timerAutoconnect.Start();
}
#endregion Private Methods
}
}