Files
HDIP_GUI/RapierHD_Control/frmRapierCmd.cs
2026-01-14 14:33:12 +00:00

5703 lines
217 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AForge.Imaging;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using Google.Apis.Util.Store;
using HDIPMk2Streaming;
using LibVLCSharp.Shared;
using LibVLCSharp.WinForms;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Reflection;
using System.Security.Principal;
using System.ServiceModel.Discovery;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;
using Application = System.Windows.Forms.Application;
using Color = System.Drawing.Color;
using DateTime = System.DateTime;
using IPAddress = System.Net.IPAddress;
namespace RapierCommand1
{
public partial class frmRapierCmd : Form
{
static readonly UdpClient sendClientANPR = new UdpClient();
static readonly UdpClient sendClientOV = new UdpClient();
static readonly UdpClient clRx = new UdpClient();
static IPEndPoint groupEp;
static IPEndPoint RemoteIpEndPoint;
static IPEndPoint localEPANPR = new IPEndPoint(IPAddress.Any, 0); // this is used in the async recv callback
static IPEndPoint localEPOV = new IPEndPoint(IPAddress.Any, 0); // this is used in the async recv callback
static IPEndPoint remoteEPANPR = new IPEndPoint(IPAddress.Any, 0); // this is the address and port of the ITX encoder here
static IPEndPoint remoteEPOV = new IPEndPoint(IPAddress.Any, 0); // this is the address and port of the ITX encoder here
readonly LibVLC libVLC = new LibVLC();
public static readonly Regex RegexIPPattern = new Regex(@"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[0-9]{1,4}))?$", RegexOptions.Compiled); // IP Regex with optional port extension
public static readonly Regex RegexVISCA = new Regex(@"^81(( [0-9A-Fa-f]{2})+)? FF$", RegexOptions.Compiled); // VISCA Regex
Point LastLoc = new Point(0, 0);
readonly Color BtnColour = Color.FromArgb(192, 255, 255);
enum SelectedCam
{
NONE,
ANPR,
OVERVIEW
}
enum Module
{
NONE,
KTnC,
HZ5512,
HZ5510,
MC105
}
enum EncoderManufacturer
{
NONE,
MLVInew,
MLVIold,
KTnC,
IONODES,
IONODES_AVML
}
SelectedCam CameraSelected = SelectedCam.NONE;
Module CameraModule = Module.NONE;
EncoderManufacturer Encoder = EncoderManufacturer.NONE;
int monitorCount = 0;
int noOfExpectedResonses = 1;
int noOfOnvifResponses = 0;
int TimeoutCounter = 0;
readonly int sizedif = 350;
public static bool CorrectPassword = false;
public static bool MAVCopy = false;
bool selectedCamera = false;
bool cancelMonitor = false;
bool getReplyFlg = false;
bool monitorOnFlg = false;
bool CamsFound = false;
bool rxDataUdpTimeout = false;
bool AdvancedOpen = false;
bool FullscreenANPR = false;
bool FullscreenOV = false;
bool LVOV = false;
bool LVANPR = false;
bool TibboOnline = true;
bool DefConfig = false;
bool IsRMA = false;
bool InProgress = false;
bool VISCAInReply = false;
bool OVstartup = true;
bool ANPRstartup = true;
bool WWSave = false;
bool starting = true;
string rxBuffer;
string rxMssg = "";
string rxMssg2 = "";
string rxMssgVISCA = "";
string IrisLimitHex;
string CamIP;
string newSerialNumberString;
string SoftwareVer;
string selectedPort = "";
string OVStreamUrl = "NONE";
string ANPRStreamUrl = "NONE";
string GUIVersion = Convert.ToString(Assembly.GetExecutingAssembly().GetName().Version);
static readonly string EncoderSoftVer = "A100.11031.00";
public static string TxtFileDir = @"C:\ProgramData\MAV\R50_HD_IP\";
readonly string[] onvifDevices = new string[128]; // allows up to 128 encoders to be found on 1 network segment
readonly string MadeInGb = "^^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR2,2~SD15^JUS^LRN^CI0^XZ" +
"~DG000.GRF,00768,008," +
",:::::::::::::::::::::::::::::::J0H7L037,I07FF0J01FF80H01DHDK05DD80H03FHFK0IF80H0J7J037H7,H0JFJ07FHF8001DD80J0HDC0,03FE0J01FF,0770K0176,0FF0K03FC,0DC0K05D8,1FC0K07F0,1740K0760,1F80K0FE0,1D80K0DC0,3F0L0FC0,370L0740,3F0K01FIF8,1D0K01DID8,3F0K01FIF8,370K017I70,3F0K01FIF8,1D0L0JD8,3F0L0FC0,370L0740,1F80K0FE0,1DC0K05C0,1FC0K07F0,0760K0H70,0FF0K03FC,05D80J01DC,03FC0J01FF,01770K0H740,01FHF10I07FHF80H0JDJ01DHD80H03FHFJ01FHF80H017H7K0I7,I07FF0J03FF80I01DD0K05D80K020L02,,:::::::::::::::::::::::~DG001.GRF,00768,008," +
",::::::::::::::::::::::::H010,H010O02,I080N04,I040N08,I020H07FC0010,I01007F0F8020,I0180E1F8D840,J0C1E0H03C80,J027FJFD,J0310I0H2,J0190I024,K0D0I06C,K070I074,K0380H068,K0180H064,K0180H0FC,K01C1FD60,L0A1FE60,L0900440,L0H80840,L0841040,L0822040,L0814040,L0808040,L0C1C040,L0C320C0,L0C630C0,L0HC18C0,L05804C0,L0700680,L0600380,L0C00180,K01D0H0C0,K0340H0C0,K064003E0,K0C400630,J0184005B8,J0304005B4,J0207FFE32,J0C03003E1,I01803001C080,I010M0C0,I020M060,I040M010,I080M010,,::::::::I01FMFE0,::::::::,:::::::~DG002.GRF,01536,024," +
",I03FE1FHFCFFE07C00F807E00FFC00FHFE03F1F00F0,I03FF1FHFCFFE07E01F807F00FHF80FHFE03F1F80F0,I03FF8FHFCFFE07F01F807F00FHFE0FHFE03F1FC0F0,I03FFC7FFCFFE07F03F80FF80FIF0FHFE03F1FC0F0,I03FFE3FFCFFE07F87F80FF80FIF8FHFE03F1FE0F0,I03FHF1FFCFFE07FCFF81FF80F87F8FC0H03F1FF0F0,I03FHF8FFCFFE07FIF81FFC0F81F8FC0H03F1FF8F0,I03FHFC7FCFFE07FIF81F7C0F80FCFHFC03F1FFCF0,I03FHFE3FCFFE07FIF83F7E0F80FCFHFC03F1FFCF0,I01FIF1FCFFE07FFEF83E7E0F80FCFHFC03F1FFEF0,J0JF8FCFFE07DFEF83E3E0F80FCFHFC03F1F7FF0,J07FHFC7CFFE07CFCF87FHF0F80FCFHFC03F1F3FF0,J03FHFE3CFFE07C00F87FHF0F81F8FC0H03F1F1FF0,I031FIF1CFFE07C00F8FIF8F83F8FC0H03F1F0FF0,I038FIF8CFFE07C00F8FIF8FIF8FHFE03F1F0FF0,I03C7FHFC0FFE07C00F8FIF8FIF0FHFE03F1F07F0,I03E3FHFE0FFE07C00F9F80FCFHFE0FHFE03F1F03F0,I03F1FIF0FFE07C00F9F80FCFHFC0FHFE03F1F01F0,I03F8FIF8FFE07C00F9F007CFFC00FHFE03F1F00F0,I03FC7FHFCFFE,I03FE3FHFEFFE,I03FF1FKFE,I03FF8FKFE07FF80FHFH0FCFIF83F803E1F00F0,I03FFC7FJFE07FFE0FHFE0FCFIF83F803E1F80F0,I03FFE3FJFE07FHF0FIF0FCFIF83F803E1FC0F0,I03FHF1FJFE07FHF0FIF0FCFIF87FC03E1FE0F0,I03FHF8" +
"FJFE07FHF0FIF0FCFIF87FC03E1FF0F0,N07FIFE07C1F0FC3F0FC03E007FE03E1FF0F0,N03FIFE07C1F0FC1F0FC03E00FFE03E1FF8F0,N01FIFE07FHF0FC1F0FC03E00FBF03E1FFCF0,I03FNFE07FFE0FC3F0FC03E01FBF03E1FFEF0,I03FNFE07FHF0FIF0FC03E01F9F03E1F7EF0,I03FNFE07FHF8FHFE0FC03E01F1F83E1F3FF0,I03FNFE07C1F8FHFC0FC03E03FHF83E1F3FF0,I03FNFE07C0F8FHFC0FC03E03FHFC3E1F1FF0,I03FNFE07C1F8FCFE0FC03E03FHFC3E1F0FF0,I03FNFE07FHF8FC7E0FC03E07FHFC3E1F07F0,I03FNFE07FHF8FC3F0FC03E07FHFE3E1F03F0,I03FNFE07FHF0FC3F8FC03E0FC07E3E1F03F0,I03FNFE07FFE0FC1F8FC03E0FC03F3E1F01F0,,::::::::::::::::::::::^XA" +
"^MMT" +
"^PW384" +
"^LL0096" +
"^LS0" +
"^FT224,96^XG000.GRF,1,1^FS+" +
"^FT288,96^XG001.GRF,1,1^FS" +
"^FT32,96^XG002.GRF,1,1^FS" +
"^PQ1,0,1,Y^XZ" +
"^XA^ID000.GRF^FS^XZ" +
"^XA^ID001.GRF^FS^XZ" +
"^XA^ID002.GRF^FS^XZ";
string GE67SALbl = "CT~~CD,~CC^~CT~" +
"^XA ~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR2,2~SD30^JUS^LRN^CI0^XZ" +
"^XA" +
"^MMT" +
"^PW320" +
"^LL0096" +
"^LS0" +
@"^FT15,41^A0N,31,26^FH\^FDGE67SA-M3 SN:K1004XXX^FS" +
@"^FT48,78^A0N,31,26^FH\^FDHD:IP Mk2 SW05/03^FS" +
"^PQ1,0,1,Y^XZ";
string YT65JGLbl = "^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR2,2~SD15^JUS^LRN^CI0^XZ" + Environment.NewLine +
"^XA" + Environment.NewLine +
"^MMT" + Environment.NewLine +
"^PW384" + Environment.NewLine +
"^LL0096" + Environment.NewLine +
"^LS0" + Environment.NewLine +
"^FO256,0^GFA,01536,01536,00016,:Z64:" + Environment.NewLine +
"eJzN072K20AQB/ARW6gRp1aCYL2CzDU2BJtUeQ2BC7cBF+eAyCpsiBuB2gSO82skTZAwRM1hv4LMQVRGxzYSLJ6sOa2+sFPfdD+W0ez+tQvw+ougoDe09B3MLhsMb+9XaIF32U74AYPZnSVqzx/X0iu79ceBabyY+P/xMsnwfuCwsRO+T2J8aOaBobtkRjv76xvFcnz/e9U5X8+yvIJWrBPJ0O9K+rxpVB02p4UW2ap/YJLz/CBSfiK1075hKuy9A+SX2dg6e6RsC+vLCMiDXvfr8RK8OT/GnvKfnmGe3bzRopN7xSPyFUBnP4zaM7I52xr4m1HPjw06R1hlt7Uz41PPVeG53jSwd8FlTwxLEGSlykv61LVr2NK7xgnPE6YXI5XP0EA3MU0Ky7xsmW8l7pAja1yeFtK7dl36qXFs5nJ+YN2+7JdkfUMVYLKVH1HzKjmtYzJ567tOwhEbr/v2S9dsDcizPUzDkQvKx66JJvSC6Azr/IY+H1iLdPaZZ623OtM6JlFreb/XyMC0H73Llu9jLCqmxVfshNSl+RMWteX7dGnKB5brmbL1LFKmHa6ajrcaHjv9PYNBtU3KvydBa5ZydZ9e/Jf/VEbhxIBRpf7nwK+p/gEmr4ir:A94D" + Environment.NewLine +
"^FO0,0^GFA,01280,01280,00020,:Z64:" + Environment.NewLine +
"eJztz7ENAyEMQFGjKygZgVFuNBiNUxbhdAsQpQgFwrFDlARwkzr3JTePAhvg/8LkMhisKoGOjTRS4BAv9PIyw+Zp9vI2y7bRXAvYMFiuvR3NVt9sDTaaI8OS3ce8DWyKzMG3JbLVS1Yns0GwrUxm9t54P/59NH0T7J4mW1Cy2BnfpgZLTwuTgWh+NicZnJ392gMKlLLa:A7F4" + Environment.NewLine +
$"^FT159,84^A0N,25,24^FH\\^FDK1004XXX^FS" + Environment.NewLine +
"^FT26,56^A0N,14,14^FH\\^FDModel:^FS" + Environment.NewLine +
$"^FT159,32^A0N,25,28^FH\\^FDFHD:IP Mk2^FS" + Environment.NewLine +
"^FT159,56^A0N,14,14^FH\\^FDSerial Number:^FS" + Environment.NewLine +
$"^FT26,84^A0N,25,24^FH\\^FDYT65JG-M2^FS" + Environment.NewLine +
"^PQ1,0,1,Y^XZ";
readonly byte[] viscaExpAuto = VISCACommand(0x04, 0x39, 0x00);
readonly byte[] viscaExpShutter = VISCACommand(0x04, 0x39, 0x0A);
readonly byte[] viscaExpManual = VISCACommand(0x04, 0x39, 0x03);
readonly byte[] viscaInqExpMode = VISCAInquiry(0x04, 0x39);
readonly byte[] viscaAutoIR = VISCACommand(0x04, 0x51, 0x02);
readonly byte[] viscaManualIR = VISCACommand(0x04, 0x51, 0x03);
readonly byte[] viscaIrDay = VISCACommand(0x04, 0x01, 0x03);
readonly byte[] viscaIrNight = VISCACommand(0x04, 0x01, 0x02);
readonly byte[] viscaInqIrMode = VISCAInquiry(0x04, 0x51);
readonly byte[] viscaInqIrDayNight = VISCAInquiry(0x04, 0x01);
readonly byte[] viscaFocusAuto = VISCACommand(0x04, 0x38, 0x02);
readonly byte[] viscaFocusManual = VISCACommand(0x04, 0x38, 0x03);
readonly byte[] viscaFocusNow = VISCACommand(0x04, 0x18, 0x01);
readonly byte[] viscaInqFocusPos = VISCAInquiry(0x04, 0x48);
readonly byte[] viscaInqFocusMode = VISCAInquiry(0x04, 0x38);
readonly byte[] viscaInqZoomPos = VISCAInquiry(0x04, 0x47);
readonly byte[] viscaShutterUp = VISCACommand(0x04, 0x0A, 0x02);
readonly byte[] viscaShutterDown = VISCACommand(0x04, 0x0A, 0x03);
readonly byte[] viscaInqShutter = VISCAInquiry(0x04, 0x4A);
readonly byte[] viscaMinShutterOn = VISCACommand(0x04, 0x12, 0x02);
readonly byte[] viscaMinShutterInq = VISCAInquiry(0x04, 0x13);
readonly byte[] viscaIrisUp = VISCACommand(0x04, 0x0B, 0x02);
readonly byte[] viscaIrisDown = VISCACommand(0x04, 0x0B, 0x03);
readonly byte[] viscaInqIris = VISCAInquiry(0x04, 0x4B);
readonly byte[] viscaInqIrisLim = VISCAInquiry(0x70, 0xD3);
readonly byte[] viscaInqIrisLimWW = VISCAInquiry(0x05, 0x24, 0x4B, 0x01);
readonly byte[] viscaGainUp = VISCACommand(0x04, 0x0C, 0x02);
readonly byte[] viscaGainDown = VISCACommand(0x04, 0x0C, 0x03);
readonly byte[] viscaInqGain = VISCAInquiry(0x04, 0x4C);
readonly byte[] viscaInqGainLim = VISCAInquiry(0x04, 0x2C);
readonly byte[] viscaSharpnessUp = VISCACommand(0x04, 0x02, 0x02);
readonly byte[] viscaSharpnessDown = VISCACommand(0x04, 0x02, 0x03);
readonly byte[] viscaInqSharpness = VISCAInquiry(0x04, 0x42);
readonly byte[] viscaExpCompOn = VISCACommand(0x04, 0x3E, 0x02);
readonly byte[] viscaExpCompOff = VISCACommand(0x04, 0x3E, 0x03);
readonly byte[] viscaExpCompUp = VISCACommand(0x04, 0x0E, 0x02);
readonly byte[] viscaExpCompDown = VISCACommand(0x04, 0x0E, 0x03);
readonly byte[] viscaExpCompReset = VISCACommand(0x04, 0x0E, 0x00);
readonly byte[] viscaInqExpCompMode = VISCAInquiry(0x04, 0x3E);
readonly byte[] viscaInqExpComp = VISCAInquiry(0x04, 0x4E);
readonly byte[] visca720p25 = VISCACommand(0x04, 0x24, 0x72, 0x01, 0x01);
readonly byte[] visca720p30 = VISCACommand(0x04, 0x24, 0x72, 0x00, 0x0F);
readonly byte[] visca1080p25 = VISCACommand(0x04, 0x24, 0x72, 0x00, 0x08);
readonly byte[] visca1080p30 = VISCACommand(0x04, 0x24, 0x72, 0x00, 0x07);
readonly byte[] viscaQuery = VISCAInquiry(0x04, 0x24, 0x72);
readonly byte[] viscaInqNR = VISCAInquiry(0x04, 0x53);
readonly byte[] viscaInqNRWW = VISCAInquiry(0x05, 0x53);
readonly byte[] viscaInqGamma = VISCAInquiry(0x04, 0x5B);
readonly byte[] viscaInqContrast = VISCAInquiry(0x71, 0x40);
readonly byte[] viscaInqContrastWW = VISCAInquiry(0x05, 0x5D);
readonly byte[] viscaMirrorOn = VISCACommand(0x04, 0x61, 0x02);
readonly byte[] viscaMirrorOff = VISCACommand(0x04, 0x61, 0x03);
readonly byte[] viscaInqMirror = VISCAInquiry(0x04, 0x61);
readonly byte[] viscaDISOn = VISCACommand(0x04, 0x34, 0x02);
readonly byte[] viscaDISOff = VISCACommand(0x04, 0x34, 0x03);
readonly byte[] viscaInqDIS = VISCAInquiry(0x04, 0x34);
readonly byte[] viscaWDROn = VISCACommand(0x04, 0x3D, 0x02);
readonly byte[] viscaWDROff = VISCACommand(0x04, 0x3D, 0x03);
readonly byte[] viscaWDRInq = VISCAInquiry(0x04, 0x3D);
readonly byte[] viscaWDRLevelInq = VISCAInquiry(0x70, 0x3A);
readonly byte[] viscaWDROnWW = VISCACommand(0x04, 0x1A, 0x02);
readonly byte[] viscaWDRManualWW = VISCACommand(0x04, 0x1A, 0x30, 0x00);
readonly byte[] viscaWDROffWW = VISCACommand(0x04, 0x1A, 0x03);
readonly byte[] viscaWDRInqWW = VISCAInquiry(0x04, 0x1A);
readonly byte[] viscaWDRLvllInqDWW = VISCAInquiry(0x04, 0x1A, 0x40);
readonly byte[] viscaWDRLvllInqBWW = VISCAInquiry(0x04, 0x1A, 0x50);
readonly byte[] viscaFirmwareVer = VISCAInquiry(0x00, 0x02);
readonly byte[] viscaFirmwareVerWW = VISCAInquiry(0x00, 0x37);
readonly byte[] viscaSaveWW = VISCACommand(0x04, 0x3F, 0x01, 0x7F);
public frmRapierCmd()
{
InitializeComponent();
}
private void frmRapierTest_Load(object sender, EventArgs e)
{
// --- Version Handling ---
int dotloaction = GUIVersion.IndexOf(".");
if (dotloaction >= 0)
{
if (GUIVersion.Substring(dotloaction + 1, 1) == "0")
{
GUIVersion = GUIVersion.Substring(0, dotloaction);
}
else
{
GUIVersion = GUIVersion.Substring(0, GUIVersion.IndexOf(".", dotloaction + 1));
}
}
UpdateFirewall(GUIVersion); // Update firewall rules on first startup
// --- GUI Setup ---
this.Text = "HD:IP GUI V" + GUIVersion;
this.Width = 980;
Core.Initialize();
videoViewANPR.MediaPlayer = new MediaPlayer(libVLC);
videoViewOV.MediaPlayer = new MediaPlayer(libVLC);
clRx.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
clRx.Client.Bind(new IPEndPoint(IPAddress.Any, 52381));
RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 52381);
TkBrGain.SendToBack();
GetPorts();
if (!Directory.Exists(TxtFileDir))
{
Directory.CreateDirectory(TxtFileDir);
}
using (StreamWriter AL = File.AppendText($"{TxtFileDir}ActivityLog.txt"))
{
AL.WriteLine("GUI Opened " + DateTime.Now);
}
if (File.Exists($"{TxtFileDir}COMInfo.txt"))
{
using (StreamReader fileSerial = new StreamReader($"{TxtFileDir}COMInfo.txt"))
{
string ComRead = fileSerial.ReadLine();
try
{
MAVCopy = Convert.ToBoolean(fileSerial.ReadLine());
if (MAVCopy)
{
AdvancedOpen = CorrectPassword = true;
PicLogo_Click(sender, e);
TxBxZebraIP_TextChanged(sender, e);
TxBxPSUIP_TextChanged(sender, e);
}
}
catch { MAVCopy = false; }
try
{
TxBxPSUIP.Text = fileSerial.ReadLine();
TxBxZebraIP.Text = fileSerial.ReadLine();
}
catch { }
openSerialIfPresent(serialPort1, ComRead, tsmenuSelectCom);
}
}
tbxSend.Select();
DiscoverEncoders(sender, e);
starting = false;
this.Enabled = true;
}
public static void UpdateFirewall(string GUIVer)
{
WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent());
bool runAsAdmin = wp.IsInRole(WindowsBuiltInRole.Administrator);
string ExeLoc = Assembly.GetEntryAssembly().Location.Replace("dll", "exe"); // Sometimes trys to open the dll instead of exe
if (MAV_Rapier_HDIP.Properties.Settings.Default.FirstRun == true && !runAsAdmin) // On first run, put into admin mode to allow defender.
{
StartAsAdmin(ExeLoc);
}
else if (runAsAdmin)
{
// Use dynamic for COM interop
Type ruleType = Type.GetTypeFromProgID("HNetCfg.FWRule");
Type policyType = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
dynamic firewallRule = Activator.CreateInstance(ruleType);
dynamic firewallPolicy = Activator.CreateInstance(policyType);
firewallRule.ApplicationName = ExeLoc;
firewallRule.Action = 1; // NET_FW_ACTION_ALLOW
firewallRule.Description = "Programmatically added rule to allow the GUI to work";
firewallRule.Enabled = true;
firewallRule.InterfaceTypes = "All";
firewallRule.Name = "HD:IP GUI " + GUIVer;
firewallRule.Protocol = 17; // UDP
firewallPolicy.Rules.Add(firewallRule);
MAV_Rapier_HDIP.Properties.Settings.Default.FirstRun = false; //only false after defender rule been added.
MAV_Rapier_HDIP.Properties.Settings.Default.Save();
}
}
public static void StartAsAdmin(string ExeLoc)
{
ProcessStartInfo processInfo = new ProcessStartInfo(ExeLoc)
{
UseShellExecute = true,
Verb = "runas"
};
try
{
Process.Start(processInfo);
MAV_Rapier_HDIP.Properties.Settings.Default.FirstRun = false;
MAV_Rapier_HDIP.Properties.Settings.Default.Save();
Application.Exit(); // Exit now that we have admin rights version
}
catch
{
MessageBox.Show("Sorry, but I don't seem to be able to start this program with administrator rights!");
}
}
private void GetPorts()
{
string[] ports = SerialPort.GetPortNames();
tsmenuSelectCom.DropDownItems.Clear();
foreach (string port in ports)
{
ToolStripMenuItem newitem = new ToolStripMenuItem
{
Text = port
};
tsmenuSelectCom.DropDownItems.Add(newitem);
}
serialPort1.NewLine = ">";
}
private void frmRapierTest_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort1.IsOpen)
{
string[] lines = { serialPort1.PortName, MAVCopy.ToString(), TxBxPSUIP.Text, TxBxZebraIP.Text };
File.WriteAllLines($"{TxtFileDir}COMInfo.txt", lines);
}
if (serialPort1.IsOpen == true)
{
serialPort1.Close();
}
Environment.Exit(Environment.ExitCode);
}
private void openSerialIfPresent(SerialPort serialPort, string ComCompare, ToolStripMenuItem toolStrip)
{
bool portFound = false;
if (ComCompare == "null" || ComCompare.Length < 4)
{
return;
}
foreach (ToolStripMenuItem item in toolStrip.DropDownItems) // clear currently checked items
{
if (item.Text == ComCompare)
{
item.Checked = true;
selectedPort = serialPort.PortName;
serialPort.PortName = ComCompare;
portFound = true;
}
else
{
item.Checked = false;
}
}
if (portFound == true)
{
try
{
serialPort.Open();
toolStrip.BackColor = Color.LightGreen;
tsmenuSelectCom.Text = "Using Com " + serialPort1.PortName;
btnClosePort.Text = "Close Port";
SendCmd("CK0", 1);
if (rxMssg.Contains("CK0"))
{
TibboOnline = true;
EnableTibboControls();
BtnANPR.BackColor = Color.LightGreen;
BtnOV.BackColor = BtnColour;
CameraSelected = SelectedCam.ANPR;
}
}
catch
{
foreach (ToolStripMenuItem item in toolStrip.DropDownItems) // Clear currently checked items
{
item.Checked = false;
}
if (ComCompare != "null")
{
MessageBox.Show("Saved " + ComCompare + " not available");
}
btnClosePort.BackColor = BtnColour;
}
}
else
{
MessageBox.Show("Saved " + ComCompare + " not found");
}
}
private void tsmenuSelectCom_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
stopLedMonitor();
string clickeditem = e.ClickedItem.Text;
if (serialPort1.IsOpen == true)
{
serialPort1.Close();
}
serialPort1.PortName = clickeditem;
foreach (ToolStripMenuItem item in tsmenuSelectCom.DropDownItems) // clear currently checked items
{
if (item.Text == clickeditem)
{
item.Checked = true;
selectedPort = serialPort1.PortName;
}
else
{
item.Checked = false;
}
}
try
{
serialPort1.Open();
tsmenuSelectCom.BackColor = Color.LightGreen;
tsmenuSelectCom.Text = "Using Com " + serialPort1.PortName;
btnClosePort.Text = "Close Port";
SendCmd("CK0", 1);
if (rxMssg.Contains("CK0"))
{
TibboOnline = true;
EnableTibboControls();
BtnANPR.BackColor = Color.LightGreen;
BtnOV.BackColor = BtnColour;
CameraSelected = SelectedCam.ANPR;
}
string[] lines = { serialPort1.PortName, MAVCopy.ToString(), TxBxPSUIP.Text, TxBxZebraIP.Text };
File.WriteAllLines($"{TxtFileDir}COMInfo.txt", lines);
}
catch
{
foreach (ToolStripMenuItem item in tsmenuSelectCom.DropDownItems) // Clear currently checked items
{
item.Checked = false;
}
tsmenuSelectCom.BackColor = BtnColour;
tsmenuSelectCom.Text = "Port select";
btnClosePort.BackColor = BtnColour;
MessageBox.Show("Port " + clickeditem + " not available", "Port select");
}
}
public void SendCmd(string message, int NOER)
{
noOfExpectedResonses = NOER;
if (serialPort1.IsOpen == false)
{
MessageBox.Show("Please select port first", "Port select");
return;
}
rxMssg = rxMssg2 = "";
timerTimeout.Enabled = false;
timerTimeout.Enabled = true; // Start timeout rx data counter now
serialPort1.WriteLine("<" + message + "/"); // '>' is newline char so don't add to writeline message
getReplyFlg = true;
richTxBxRxCmd.SelectionColor = Color.Red;
richTxBxRxCmd.AppendText(">> <" + message + "/>" + Environment.NewLine);
richTxBxRxCmd.SelectionStart = richTxBxRxCmd.Text.Length;
richTxBxRxCmd.ScrollToCaret();
if (message.Contains("#8"))
{
VISCAInReply = true;
}
while (noOfExpectedResonses != 0) // wait for all replies here
{
Application.DoEvents();
Thread.Sleep(10);
if (timerTimeout.Enabled == false) // or until timout expires
{
getReplyFlg = false;
richTxBxRxCmd.SelectionColor = Color.Red;
richTxBxRxCmd.AppendText("<< no reply" + Environment.NewLine);
richTxBxRxCmd.SelectionStart = richTxBxRxCmd.Text.Length;
richTxBxRxCmd.ScrollToCaret();
rxMssg = "no reply";
if (monitorOnFlg == true && chkBxContErr.Checked == false)
{
cancelMonitor = true;
lblMonFail.Visible = true;
}
break;
}
}
noOfExpectedResonses = 1;
WaitMs(100);
}
private void checkRxMessage(TextBox txBxResult)
{
if (rxMssg.Contains(">"))
{
int startPos = rxMssg.IndexOf("@");
int endPos = rxMssg.IndexOf(">");
if (endPos > startPos)
{
int trimLength = endPos - startPos;
txBxResult.Text = rxMssg.Substring(startPos + 1, trimLength - 2);
}
}
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
rxBuffer = serialPort1.ReadLine();
}
catch (Exception ex)
{
MessageBox.Show("COM port error " + ex);
return;
}
this.Invoke(new EventHandler(DoRxMssg)); // message received so deal with it
}
private void DoRxMssg(object sender, EventArgs e)
{
try
{
rxBuffer = rxBuffer.Substring(rxBuffer.IndexOf("<")) + ">";
}
catch
{
MessageBox.Show("Reply in incorrect format, does not contain '<'" + Environment.NewLine + "Reply: " + rxBuffer);
}
if (getReplyFlg == true)
{
richTxBxRxCmd.SelectionColor = Color.Green;
switch (noOfExpectedResonses)
{
case 2:
rxMssg2 = rxBuffer; // this will hold the second rx message
richTxBxRxCmd.AppendText("<< " + rxMssg2 + Environment.NewLine);
break;
case 1:
rxMssg = rxBuffer; //this will hold the first rx message
richTxBxRxCmd.AppendText("<< " + rxMssg + Environment.NewLine);
if (VISCAInReply == true)
{
rxMssgVISCA = rxBuffer;
VISCAInReply = false;
}
break;
default:
TxBxRxErrMssg.AppendText(rxBuffer + Environment.NewLine); // unsolicited reply so add to box
TxBxRxErrMssg.SelectionStart = TxBxRxErrMssg.Text.Length;
TxBxRxErrMssg.ScrollToCaret();
break;
}
noOfExpectedResonses--;
if (noOfExpectedResonses == 0)
{
getReplyFlg = false;
}
richTxBxRxCmd.SelectionStart = richTxBxRxCmd.Text.Length;
richTxBxRxCmd.ScrollToCaret();
}
else
{
if (rxBuffer.Contains("frame"))
{
TxBxRxErrMssg.AppendText(rxBuffer + " " + DateTime.Now.ToString("hh:mm:ss") + Environment.NewLine); // unsolicited reply so add to box
}
else
{
TxBxRxErrMssg.AppendText(rxBuffer + Environment.NewLine); // unsolicited reply so add to box
}
TxBxRxErrMssg.SelectionStart = TxBxRxErrMssg.Text.Length;
TxBxRxErrMssg.ScrollToCaret();
}
if (rxBuffer == "<NCy/>")
{
btnIllumOn.BackColor = Color.LightGreen;
btnIllumOff.BackColor = BtnColour;
}
else if (rxBuffer == "<NCn/>")
{
btnIllumOff.BackColor = Color.LightGreen;
btnIllumOn.BackColor = BtnColour;
}
else if ((AdvancedOpen == true || MAVCopy == true) && (rxBuffer.Contains("<LedISet@") || rxBuffer.Contains("<NC@")))
{
try
{
TxBxLEDCurrent.Text = rxBuffer.Substring(rxBuffer.IndexOf("@") + 1, 4) + "A";
TkBarLED.Value = Convert.ToInt16(Convert.ToDouble(rxBuffer.Substring(rxBuffer.IndexOf("@") + 1, 4)) * 10);
}
catch { }
}
}
private void timerTimeout_Tick(object sender, EventArgs e)
{
timerTimeout.Enabled = false;
}
private void btnIllumOn_Click(object sender, EventArgs e)
{
pauseMonitor();
SendCmd("NCy", 1);
checkRestartMonitor();
}
private void btnIllumOff_Click(object sender, EventArgs e)
{
pauseMonitor();
SendCmd("NCn", 1);
checkRestartMonitor();
}
private void btnSend_Click(object sender, EventArgs e)
{
SendCmd(tbxSend.Text, 1);
}
private void btnClearList_Click(object sender, EventArgs e)
{
richTxBxRxCmd.Text = "";
}
private void btnClrRxErrMssg_Click(object sender, EventArgs e)
{
TxBxRxErrMssg.Text = "";
}
private void btnClosePort_Click(object sender, EventArgs e)
{
stopLedMonitor();
richTxBxRxCmd.Text = TxBxRxErrMssg.Text = "";
btnIllumOn.BackColor = btnIllumOff.BackColor = BtnColour;
if (serialPort1.IsOpen)
{
serialPort1.Close();
btnClosePort.BackColor = BtnColour;
btnClosePort.Text = "Open Last Port";
foreach (ToolStripMenuItem item in tsmenuSelectCom.DropDownItems) // clear currently checked items
{
item.Checked = false;
}
GetPorts();
}
else
{
if (selectedPort == "")
{
MessageBox.Show("No port selected", "Port select");
return;
}
foreach (ToolStripMenuItem item in tsmenuSelectCom.DropDownItems)
{
if (item.Text == selectedPort)
{
item.Checked = true;
}
else
{
item.Checked = false;
}
}
btnClosePort.Text = "Close Port";
btnClosePort.BackColor = Color.LightGreen;
serialPort1.Open();
}
}
private void tbxSend_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13 && tbxSend.Text != "")
{
SendCmd(tbxSend.Text, 1);
}
}
private void WaitMs(int waittime)
{
timerWait.Interval = waittime;
timerWait.Enabled = true;
while (timerWait.Enabled == true)
{
Application.DoEvents();
Thread.Sleep(10);
}
}
private void timerWait_Tick(object sender, EventArgs e)
{
timerWait.Enabled = false;
}
private void pauseMonitor()
{
if (monitorOnFlg == true)
{
cancelMonitor = true; // stop monitor from running again
timerMonitor.Enabled = false;
WaitMs(500);
}
}
private void checkRestartMonitor()
{
if (monitorOnFlg == true)
{
cancelMonitor = false; // start monitor running again
timerMonitor.Enabled = true;
}
}
private void CheckEncoderManufacturer()
{
BtnDefConfig.Enabled = true;
string EncoderFWVer = CheckEncoderFirmwareVer(CamIP);
if (EncoderFWVer.Contains("A100"))
{
Encoder = EncoderManufacturer.MLVInew;
}
else if (EncoderFWVer.Contains("89100"))
{
Encoder = EncoderManufacturer.MLVIold;
}
else
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + CamIP + "/system_update.html");
request.Credentials = new NetworkCredential("admin", "admin");
StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.ASCII);
if (reader.ReadToEnd().Contains("ACE-HEN6338-iL"))
{
Encoder = EncoderManufacturer.KTnC;
BtnDefConfig.Enabled = false;
}
else
{
CheckIONodes(); // replies but not including the correct part number included so could be a different manufacturer
}
}
catch
{
CheckIONodes(); // API call failed so could be a differnet manufacturer
}
}
if (Encoder == EncoderManufacturer.MLVInew || Encoder == EncoderManufacturer.MLVIold)
{
BtnSetH264.Enabled = BtnSetMJPEGANPR.Enabled = BtnSetIPANPR.Enabled = BtnSetIPOV.Enabled = BtnFinalTest.Enabled = true;
}
else
{
BtnSetH264.Enabled = BtnSetMJPEGANPR.Enabled = BtnSetIPANPR.Enabled = BtnSetIPOV.Enabled = BtnFinalTest.Enabled = false;
}
}
private void CheckIONodes()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + CamIP + "/services/system.ion?sel=echo&foo=bar");
request.Credentials = new NetworkCredential("admin", "admin");
StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.ASCII);
if (reader.ReadToEnd().Contains("ionrsp stat=\"ok\""))
{
Encoder = EncoderManufacturer.IONODES;
}
else
{
// Unknown encoder type
MessageBox.Show("Cannot determine encoder type, is webpage active? Have you tried a power cycle?" + Environment.NewLine + "If issue persists please contact manufacturer");
}
}
private void BtnANPR_Click(object sender, EventArgs e)
{
pauseMonitor();
this.Enabled = false;
richTxBxRxCmd.Clear();
TxBxRxErrMssg.Clear();
TxBxRecManVISCA.Clear();
anprSelect(); // Also checks encoder and camera module
CamSetup(sender, e);
if (TibboOnline)
{
SendCmd("NC?", 1);
checkRestartMonitor();
}
this.Enabled = true;
}
private void BtnOV_Click(object sender, EventArgs e)
{
pauseMonitor();
this.Enabled = false;
TxBxRecManVISCA.Clear();
ovSelect(); // Also checks encoder and camera module
CamSetup(sender, e);
checkRestartMonitor();
this.Enabled = true;
}
private void CamSetup(object sender, EventArgs e)
{
if (Encoder == EncoderManufacturer.IONODES || Encoder == EncoderManufacturer.IONODES_AVML)
return;
if (richTxBxRxCmd.Text.Contains("no reply") || TxBxRxErrMssg.Text.Contains("no reply"))
{
MessageBox.Show("Tibbo not connected to VSP");
TibboOnline = false;
DisableTibboControls();
}
gpBxCamControl.Enabled = GpBxAddCrtls.Enabled = GpBxAdCont.Enabled = GpBxMins.Enabled = true;
try
{
SendVISCA(viscaInqZoomPos, 4, txBxZoom, false, "ZO?", 1);
try
{
trackBarZoom.Value = Convert.ToInt32(txBxZoom.Text, 16);
}
catch { }
SendVISCA(viscaInqFocusPos, 4, txBxFocus, false, "FF?", 1);
try
{
trackBarFocus.Value = Convert.ToInt32(txBxFocus.Text, 16);
}
catch { }
SendVISCA(viscaInqFocusMode, 2, TxBxReply, false, "FM?", 1);
if (TxBxReply.Text.Contains("2") || TxBxReply.Text.Contains("a"))
{
BtnFocusAuto.BackColor = Color.LightGreen;
BtnFocusMan.BackColor = BtnColour;
BtnFocusNeg.Enabled = BtnFocusPlus.Enabled = txBxFocus.Enabled = trackBarFocus.Enabled = TxBxFocus2.Enabled = false;
}
else if (TxBxReply.Text.Contains("3") || TxBxReply.Text.Contains("m"))
{
BtnFocusMan.BackColor = Color.LightGreen;
BtnFocusAuto.BackColor = BtnColour;
BtnFocusNeg.Enabled = BtnFocusPlus.Enabled = txBxFocus.Enabled = trackBarFocus.Enabled = TxBxFocus2.Enabled = true;
}
TxBxExpComp_Click(sender, e);
SendVISCA(viscaInqExpCompMode, 2, TxBxReply, false);
if (TxBxReply.Text.Contains("2"))
{
BtnExpCompOn.BackColor = Color.LightGreen;
BtnExpCompOff.BackColor = BtnColour;
BtnBrightnessReset.Enabled = BtnExpCompDown.Enabled = BtnExpCompUp.Enabled = TxBxExpComp.Enabled = true;
}
else if (TxBxReply.Text.Contains("3"))
{
BtnExpCompOff.BackColor = Color.LightGreen;
BtnExpCompOn.BackColor = BtnColour;
BtnBrightnessReset.Enabled = BtnExpCompDown.Enabled = BtnExpCompUp.Enabled = TxBxExpComp.Enabled = false;
TxBxExpComp.Text = "-";
}
else
{
BtnExpCompOff_Click(sender, e);
BtnExpCompOff.BackColor = Color.LightGreen;
BtnExpCompOn.BackColor = BtnColour;
BtnBrightnessReset.Enabled = BtnExpCompDown.Enabled = BtnExpCompUp.Enabled = false;
}
if (CameraModule == Module.MC105)
{
SendVISCA(viscaWDRInqWW, 1, TxBxReply, false);
}
else
{
SendVISCA(viscaWDRInq, 2, TxBxReply, false);
}
if (TxBxReply.Text.Contains("2"))
{
BtnWDROn.BackColor = Color.LightGreen;
BtnWDROff.BackColor = SystemColors.ControlLightLight;
BtnWDRLvlDown.Enabled = BtnWDRLvlUp.Enabled = true;
BtnBrightnessReset.Enabled = BtnExpCompDown.Enabled = BtnExpCompOff.Enabled = BtnExpCompOn.Enabled =
BtnExpCompUp.Enabled = TxBxExpComp.Enabled = btnIrisClose.Enabled = txBxIris.Enabled =
btnIrisUp.Enabled = BtnGainDown.Enabled = txBxGain.Enabled = BtnGainUp.Enabled =
BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled = false;
txBxIris.Text = txBxGain.Text = txBxShutter.Text = "-";
BtnExpManual.BackColor = BtnExpShtrPri.BackColor = BtnAutoExp.BackColor = BtnColour;
TxBxWDRLvl_Click(sender, e);
}
else
{
BtnWDROff.BackColor = Color.LightGreen;
BtnWDROn.BackColor = SystemColors.ControlLightLight;
BtnWDRLvlDown.Enabled = BtnWDRLvlUp.Enabled = false;
TxBxWDRLvl.Text = "-";
BtnBrightnessReset.Enabled = BtnExpCompDown.Enabled = BtnExpCompOff.Enabled =
BtnExpCompOn.Enabled = BtnExpCompUp.Enabled = TxBxExpComp.Enabled = true;
SendVISCA(viscaInqExpMode, 2, TxBxReply, false, "AM?", 1);
if (TxBxReply.Text.Contains("00") || (Encoder == EncoderManufacturer.IONODES_AVML && TxBxReply.Text.Contains("a")))
{
BtnAutoExp.BackColor = Color.LightGreen;
BtnExpManual.BackColor = BtnExpShtrPri.BackColor = BtnColour;
btnIrisClose.Enabled = txBxIris.Enabled = btnIrisUp.Enabled = BtnGainDown.Enabled = txBxGain.Enabled =
BtnGainUp.Enabled = BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled = false;
txBxGain.Text = txBxShutter.Text = txBxIris.Text = "-";
TxBxGainLim.Enabled = TkBrGain.Enabled = true;
TxBxGainLim_Click(sender, e);
TxBxShutLim_Click(sender, e);
}
else if (TxBxReply.Text.Contains("03") || (Encoder == EncoderManufacturer.IONODES_AVML && TxBxReply.Text.Contains("m")))
{
BtnExpManual.BackColor = Color.LightGreen;
BtnAutoExp.BackColor = BtnExpShtrPri.BackColor = BtnColour;
btnIrisClose.Enabled = txBxIris.Enabled = btnIrisUp.Enabled = BtnGainDown.Enabled =
txBxGain.Enabled = BtnGainUp.Enabled = BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled = true;
TxBxGainLim.Enabled = TkBrGain.Enabled = false;
TxBxGainLim.Text = "-";
txBxIris_Click(sender, e);
txBxGain_Click(sender, e);
txBxShutter_Click(sender, e);
}
else if (TxBxReply.Text.Contains("0A") || (Encoder == EncoderManufacturer.IONODES_AVML && TxBxReply.Text.Contains("s")))
{
BtnExpShtrPri.BackColor = Color.LightGreen;
BtnAutoExp.BackColor = BtnExpManual.BackColor = BtnColour;
btnIrisClose.Enabled = txBxIris.Enabled = btnIrisUp.Enabled =
BtnGainDown.Enabled = txBxGain.Enabled = BtnGainUp.Enabled = false;
txBxIris.Text = txBxGain.Text = "-";
BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled =
TxBxGainLim.Enabled = TkBrGain.Enabled = true;
txBxShutter_Click(sender, e);
TxBxGainLim_Click(sender, e);
TxBxShutLim_Click(sender, e);
}
}
if (TibboOnline)
{
CheckLEDPower();
}
if (AdvancedOpen == true)
{
starting = true;
PicLogo_Click(sender, e);
starting = false;
}
}
catch
{
gpBxCamControl.Enabled = GpBxAddCrtls.Enabled = GpBxAdCont.Enabled = false;
}
}
private void DayorNight()
{
SendVISCA(viscaInqIrDayNight, 2, TxBxReply, false, "II?", 1);
if (TxBxReply.Text.ToUpper().Contains("2F") || TxBxReply.Text.ToUpper().Contains("02") || TxBxReply.Text.Contains("IIo"))
{
BtnNight.BackColor = Color.LightGreen;
BtnDay.BackColor = BtnColour;
}
else if (TxBxReply.Text.ToUpper().Contains("3F") || TxBxReply.Text.ToUpper().Contains("03") || TxBxReply.Text.Contains("IIi"))
{
BtnDay.BackColor = Color.LightGreen;
BtnNight.BackColor = BtnColour;
}
}
private void ICRMode()
{
SendVISCA(viscaInqIrMode, 2, TxBxReply, false);
if (TxBxReply.Text.ToUpper().Contains("2F"))
{
BtnIRAuto.BackColor = Color.LightGreen;
BtnIRMan.BackColor = BtnColour;
}
else if (TxBxReply.Text.ToUpper().Contains("3F"))
{
BtnIRMan.BackColor = Color.LightGreen;
BtnIRAuto.BackColor = BtnColour;
}
}
private void BtnSave_Click(object sender, EventArgs e)
{
pauseMonitor();
SendCmd("MS0", 1);
checkRestartMonitor();
}
private void CkBxSwitch_CheckStateChanged(object sender, EventArgs e)
{
if (CkBxSwitch.CheckState == CheckState.Checked)
{
CkBxSwitch.Text = "Monitor all";
}
else if (CkBxSwitch.CheckState == CheckState.Indeterminate)
{
CkBxSwitch.Text = "Monitor LED only";
if (monitorCount > 5)
{
monitorCount = -1;
}
}
else if (CkBxSwitch.CheckState == CheckState.Unchecked)
{
CkBxSwitch.Text = "Monitor switch only";
if (monitorCount < 5)
{
monitorCount = 5;
}
}
}
private void BtnStartMon_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen == false)
{
MessageBox.Show("Please select port first", "Port select");
return;
}
lblMonFail.Visible = cancelMonitor = false;
monitorOnFlg = timerMonitor.Enabled = true;
monitorCount = 0;
if (CkBxSwitch.CheckState == CheckState.Unchecked)
{
monitorCount = 5;
}
}
private void resetTxBxToGrey()
{
foreach (Control txBx in gbBx4ChMonitor.Controls)
{
if (txBx is TextBox)
{
if (((TextBox)txBx).BackColor == Color.LightGreen)
{
((TextBox)txBx).BackColor = SystemColors.Window;
}
}
}
}
private void timerMonitor_Tick(object sender, EventArgs e)
{
timerMonitor.Enabled = false;
rxMssg = rxMssg2 = "";
resetTxBxToGrey();
try //in case of weird reply, GUI won't completely crash
{
switch (monitorCount)
{
case 0:
SendCmd("NV?", 2);
string checkString = rxMssg + rxMssg2;
txBxLedVCh1.Text = checkRxMsg("Ch1", 5, checkString);
txBxLedVCh2.Text = checkRxMsg("Ch2", 5, checkString);
changeTxBxColour(txBxLedVCh1, txBxLedVCh2);
break;
case 1:
SendCmd("NC&", 2);
checkString = rxMssg + rxMssg2;
txBxLedICh1.Text = checkRxMsg("Ch1", 5, checkString);
txBxLedICh2.Text = checkRxMsg("Ch2", 5, checkString);
changeTxBxColour(txBxLedICh1, txBxLedICh2);
break;
case 2:
SendCmd("NZ#", 2);
checkString = rxMssg + rxMssg2;
txBxDutyCh1.Text = checkRxMsg("Ch1", 6, checkString);
txBxDutyCh2.Text = checkRxMsg("Ch2", 6, checkString);
changeTxBxColour(txBxDutyCh1, txBxDutyCh2);
break;
case 3:
SendCmd("NF?", 1);
checkString = rxMssg;
txBxFrame.Text = checkRxMsg("NF", 7, checkString);
changeTxBxColour(txBxFrame);
break;
case 4:
SendCmd("NTi", 1);
checkString = rxMssg;
txBxPcbTemp.Text = checkRxMsg("TempInt", 2, checkString) + "°C";
changeTxBxColour(txBxPcbTemp);
if (CkBxSwitch.CheckState == CheckState.Indeterminate)
{
monitorCount = -1;
}
break;
case 5:
GigECheck("113E", TxBxGigEANPRStatus, "100");
break;
case 6:
GigECheck("413E", TxBxGigEOviewStatus, "100");
break;
case 7:
GigECheck("513E", TxBxGigETibboStatus, "100");
break;
case 8:
GigECheck("213E", TxBxGigEOutStatus, "1000");
break;
case 9:
GigECheck("313E", TxBxGigER48Status, "100");
break;
}
}
catch { }
monitorCount++;
if (monitorCount > 9)
{
if (CkBxSwitch.CheckState == CheckState.Unchecked)
{
monitorCount = 5;
}
else
{
monitorCount = 0;
}
}
if (cancelMonitor == false)
{
timerMonitor.Enabled = true;
}
}
private void stopLedMonitor()
{
monitorOnFlg = false;
cancelMonitor = true;
timerMonitor.Enabled = false;
resetTxBxToGrey();
WaitMs(500);
}
private void BtnStopMon_Click(object sender, EventArgs e)
{
stopLedMonitor();
}
private void changeTxBxColour(TextBox TxBx, TextBox TxBx2)
{
changeTxBxColour(TxBx);
changeTxBxColour(TxBx2);
}
private void changeTxBxColour(TextBox TxBx)
{
if (TxBx.BackColor == SystemColors.Window)
{
TxBx.BackColor = Color.LightGreen;
}
}
private string checkRxMsg(string searchString, int resultLength, string checkString)
{
int posSearchString = checkString.IndexOf(searchString);
if (searchString.Contains("QX")) // Second bit in hex
{
posSearchString += 2;
}
if (posSearchString != -1 && checkString.Length > posSearchString + searchString.Length + 1 + resultLength)
{
return checkString.Substring(posSearchString + searchString.Length + 1, resultLength);
}
return "??";
}
private void btnIrisUp_Click(object sender, EventArgs e)
{
if (Encoder == EncoderManufacturer.KTnC) // R48 is reversed
{
SendVISCA(viscaIrisUp, "AId");
}
else
{
SendVISCA(viscaIrisDown, "AIu");
}
SendVISCA(viscaInqIris, 2, txBxIris, false, "AI?", 1);
}
private void btnIrisClose_Click(object sender, EventArgs e)
{
if (Encoder == EncoderManufacturer.KTnC) // R48 is reversed
{
SendVISCA(viscaIrisDown, "AIu");
}
else
{
SendVISCA(viscaIrisUp, "AId");
}
SendVISCA(viscaInqIris, 2, txBxIris, false, "AI?", 1);
}
private void BtnGainDown_Click(object sender, EventArgs e)
{
SendVISCA(viscaGainDown, "AGd");
SendVISCA(viscaInqGain, 2, txBxGain, false, "AG?", 1);
}
private void BtnGainUp_Click(object sender, EventArgs e)
{
SendVISCA(viscaGainUp, "AGu");
SendVISCA(viscaInqGain, 2, txBxGain, false, "AG?", 1);
}
private void BtnShutterDown_Click(object sender, EventArgs e)
{
SendVISCA(viscaShutterDown, "ASd");
SendVISCA(viscaInqShutter, 2, txBxShutter, false, "AS?", 1);
}
private void BtnShutterUp_Click(object sender, EventArgs e)
{
SendVISCA(viscaShutterUp, "ASu");
SendVISCA(viscaInqShutter, 2, txBxShutter, false, "AS?", 1);
}
private void BtnFocusAuto_Click(object sender, EventArgs e)
{
SendVISCA(viscaFocusAuto, "FMa");
SendVISCA(viscaInqFocusMode, "FMa");
SendVISCA(viscaInqFocusMode, 2, TxBxReply, false, "FM?", 1);
if (TxBxReply.Text.Contains("2"))
{
BtnFocusAuto.BackColor = Color.LightGreen;
BtnFocusMan.BackColor = BtnColour;
}
else if (TxBxReply.Text.Contains("3"))
{
BtnFocusMan.BackColor = Color.LightGreen;
BtnFocusAuto.BackColor = BtnColour;
}
else
{
BtnFocusMan_Click(sender, e);
}
BtnFocusNeg.Enabled = BtnFocusPlus.Enabled = txBxFocus.Enabled =
trackBarFocus.Enabled = TxBxFocus2.Enabled = false;
TxBxFocus2.Text = txBxFocus.Text = "-";
}
private void BtnFocusMan_Click(object sender, EventArgs e)
{
SendVISCA(viscaFocusManual, "FMm");
SendVISCA(viscaInqFocusMode, "FMm");
SendVISCA(viscaInqFocusMode, 2, TxBxReply, false, "FM?", 1);
if (TxBxReply.Text.Contains("2"))
{
BtnFocusAuto.BackColor = Color.LightGreen;
BtnFocusMan.BackColor = BtnColour;
}
else if (TxBxReply.Text.Contains("3"))
{
BtnFocusMan.BackColor = Color.LightGreen;
BtnFocusAuto.BackColor = BtnColour;
}
else
{
BtnFocusMan_Click(sender, e);
}
BtnFocusNeg.Enabled = BtnFocusPlus.Enabled = txBxFocus.Enabled = trackBarFocus.Enabled = TxBxFocus2.Enabled = true;
}
private void FocusNow_Click(object sender, EventArgs e)
{
SendVISCA(viscaFocusNow, "FFo");
BtnFocusNow.Enabled = BtnFocusNeg.Enabled = BtnFocusPlus.Enabled =
txBxFocus.Enabled = trackBarFocus.Enabled = TxBxFocus2.Enabled = false;
TxBxFocus2.Text = txBxFocus.Text = "-";
timerFocus.Enabled = true;
}
private void timerFocus_Tick(object sender, EventArgs e)
{
timerFocus.Enabled = false;
txBxFocus_Click(sender, e);
this.Enabled =
BtnFocusNow.Enabled = BtnFocusNeg.Enabled = BtnFocusPlus.Enabled =
txBxFocus.Enabled = trackBarFocus.Enabled = TxBxFocus2.Enabled = true;
}
private void ExpManual_Click(object sender, EventArgs e)
{
if (CameraSelected == SelectedCam.OVERVIEW && BtnWDROn.BackColor == Color.LightGreen && DefConfig == false)
{
DialogResult dialogResult = MessageBox.Show("Are you sure you want to turn off WDR?", "WDR", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes) // Off at start of button click. so turn back on if they want it
{
BtnWDROff_Click(sender, e);
}
else
{
return;
}
}
SendVISCA(viscaExpManual, "AMm");
BtnExpManual.BackColor = Color.LightGreen;
BtnAutoExp.BackColor = BtnExpShtrPri.BackColor = BtnColour;
TxBxGainLim.Text = TxBxIrisLim.Text = "-";
// Enable iris, gain, and shutter controls
btnIrisClose.Enabled = txBxIris.Enabled = btnIrisUp.Enabled =
BtnGainDown.Enabled = txBxGain.Enabled = BtnGainUp.Enabled =
BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled = true;
// Disable and reset limit controls
TxBxGainLim.Enabled = TkBrGain.Enabled =
BtnIrisLimDown.Enabled = TxBxIrisLim.Enabled = BtnIrisLimUp.Enabled = false;
txBxIris_Click(sender, e);
txBxGain_Click(sender, e);
txBxShutter_Click(sender, e);
}
private void ExpAuto_Click(object sender, EventArgs e)
{
if (CameraSelected == SelectedCam.OVERVIEW && BtnWDROn.BackColor == Color.LightGreen && DefConfig == false)
{
DialogResult dialogResult = MessageBox.Show("Are you sure you want to turn off WDR?", "WDR", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes) // Off at start of button click. so turn back on if they want it
{
BtnWDROff_Click(sender, e);
}
else
{
return;
}
}
SendVISCA(viscaExpAuto, "AMa");
BtnAutoExp.BackColor = Color.LightGreen;
BtnExpManual.BackColor = BtnExpShtrPri.BackColor = BtnColour;
txBxIris.Text = txBxGain.Text = txBxShutter.Text = "-";
// Disable iris, gain, and shutter controls
btnIrisClose.Enabled = txBxIris.Enabled = btnIrisUp.Enabled =
BtnGainDown.Enabled = txBxGain.Enabled = BtnGainUp.Enabled =
BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled = false;
// Enable limit controls
TxBxGainLim.Enabled = TkBrGain.Enabled =
BtnIrisLimDown.Enabled = TxBxIrisLim.Enabled = BtnIrisLimUp.Enabled = true;
}
private void ExpShutter_Click(object sender, EventArgs e)
{
if (CameraSelected == SelectedCam.OVERVIEW && BtnWDROn.BackColor == Color.LightGreen && DefConfig == false)
{
DialogResult dialogResult = MessageBox.Show("Are you sure you want to turn off WDR?", "WDR", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes) // Off at start of button click. so turn back on if they want it
{
BtnWDROff_Click(sender, e);
}
else
{
return;
}
}
SendVISCA(viscaExpShutter, "AMs");
BtnExpShtrPri.BackColor = Color.LightGreen;
BtnAutoExp.BackColor = BtnExpManual.BackColor = BtnColour;
txBxIris.Text = txBxGain.Text = "-";
// Disable iris and gain controls
btnIrisClose.Enabled = txBxIris.Enabled = btnIrisUp.Enabled =
BtnGainDown.Enabled = txBxGain.Enabled = BtnGainUp.Enabled = false;
// Enable shutter and limit controls
BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled =
TxBxGainLim.Enabled = TkBrGain.Enabled =
BtnIrisLimDown.Enabled = TxBxIrisLim.Enabled = BtnIrisLimUp.Enabled = true;
txBxShutter_Click(sender, e);
}
private void PwrLow_Click(object sender, EventArgs e)
{
pauseMonitor();
SendCmd("NPl", 1);
CheckLEDPower();
checkRestartMonitor();
}
private void PwrNormal_Click(object sender, EventArgs e)
{
pauseMonitor();
SendCmd("NPn", 1);
CheckLEDPower();
checkRestartMonitor();
}
private void PwrHigh_Click(object sender, EventArgs e)
{
pauseMonitor();
SendCmd("NPh", 1);
CheckLEDPower();
checkRestartMonitor();
}
private void CheckLEDPower()
{
SendCmd("NP?", 1);
BtnPwrLow.BackColor = BtnPwrMed.BackColor = BtnPwrHigh.BackColor = BtnColour;
if (rxBuffer == "<NPh/>")
{
BtnPwrHigh.BackColor = Color.LightGreen;
}
else if (rxBuffer == "<NPn/>")
{
BtnPwrMed.BackColor = Color.LightGreen;
}
else if (rxBuffer == "<NPl/>")
{
BtnPwrLow.BackColor = Color.LightGreen;
}
SendCmd("NC#", 1);
}
private void txBxShutter_Click(object sender, EventArgs e)
{
SendVISCA(viscaInqShutter, 2, txBxShutter, false, "AS?", 1);
}
private void txBxGain_Click(object sender, EventArgs e)
{
SendVISCA(viscaInqGain, 2, txBxGain, false, "AG?", 1);
}
private void txBxIris_Click(object sender, EventArgs e)
{
SendVISCA(viscaInqIris, 2, txBxIris, false, "AI?", 1);
}
private void txBxZoom_Click(object sender, EventArgs e)
{
SendVISCA(viscaInqZoomPos, 4, txBxZoom, false, "ZO?", 1);
try
{
trackBarZoom.Value = Convert.ToInt32(txBxZoom.Text, 16);
}
catch { }
}
private void txBxFocus_Click(object sender, EventArgs e)
{
SendVISCA(viscaInqFocusPos, 4, txBxFocus, false, "FF?", 1);
try
{
trackBarFocus.Value = Convert.ToInt32(txBxFocus.Text, 16);
}
catch { }
}
private void BtnDiscoverEncoders_Click(object sender, EventArgs e)
{
DiscoverEncoders(sender, e);
}
private void DiscoverEncoders(object sender, EventArgs e)
{
BtnDiscoverEncoders.Enabled = false;
if (videoViewANPR.MediaPlayer.IsPlaying == false)
{
comboBox_Devices.Text = "Searching... ";
}
if (videoViewOV.MediaPlayer.IsPlaying == false)
{
comboBox_Devices2.Text = "Searching...";
}
comboBox_Devices.Items.Clear();
comboBox_Devices2.Items.Clear();
Array.Clear(onvifDevices, 0, onvifDevices.Length); // empty string array
UdpDiscoveryEndpoint endPoint = new UdpDiscoveryEndpoint(DiscoveryVersion.WSDiscoveryApril2005);
DiscoveryClient discoveryClient = new DiscoveryClient(endPoint);
discoveryClient.FindProgressChanged += discoveryClient_FindProgressChanged;
FindCriteria findCriteria = new FindCriteria();
findCriteria.ContractTypeNames.Add(new System.Xml.XmlQualifiedName("NetworkVideoTransmitter", "http://www.onvif.org/ver10/network/wsdl"));
discoveryClient.FindAsync(findCriteria);
noOfOnvifResponses = 0;
int Onvif = 0;
CamsFound = false;
timerSearch.Enabled = true;
while (timerSearch.Enabled)
{
if (CamsFound && noOfOnvifResponses != Onvif)
{
timerSearch.Enabled = false;
Onvif = noOfOnvifResponses;
timerSearch.Enabled = true;
}
WaitMs(60);
}
if (CamsFound)
{
string[] onvifLessDuplicates = onvifDevices.Distinct().ToArray();
int CamNum = onvifLessDuplicates.Length - 1; // Stops subtraction being done every loop.
for (int i = 0; i < CamNum; i++)
{
// Non exact, no port IP regex
Match match = Regex.Match(onvifLessDuplicates[i], @"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)?");
comboBox_Devices.Items.Add(match);
comboBox_Devices2.Items.Add(match);
if (serialPort1.IsOpen == true && MAVCopy == false)
{
if (onvifLessDuplicates[i].Contains("192.168.1.111"))
{
comboBox_Devices.SelectedIndex = i;
comboBox_Devices.Text = "192.168.1.111";
btnPlayVlc21.Enabled = BtnSetMJPEGANPR.Enabled = BtnSetIPANPR.Enabled = BtnWebpageANPR.Enabled = true;
btnPlayVlc21_Click(sender, e);
}
else if (onvifLessDuplicates[i].Contains("192.168.1.112"))
{
comboBox_Devices2.SelectedIndex = i;
comboBox_Devices2.Text = "192.168.1.112";
btnPlayVlc22.Enabled = BtnSetH264.Enabled = BtnSetIPOV.Enabled = BtnWebpageOV.Enabled = true;
btnPlayVlc22_Click(sender, e);
}
}
}
UpdateCameraStatus(comboBox_Devices2, "192.168.1.112", videoViewOV);
UpdateCameraStatus(comboBox_Devices, "192.168.1.111", videoViewANPR);
}
else
{
comboBox_Devices.Text = comboBox_Devices2.Text = "No Cameras Found";
}
BtnDiscoverEncoders.Enabled = true;
}
void UpdateCameraStatus(ComboBox comboBox, string excludedIP, VideoView videoView)
{
if (comboBox.Text != excludedIP && !videoView.MediaPlayer.IsPlaying)
{
comboBox.Text = comboBox.Items.Count == 1 ? "1 Camera found" : $"{comboBox.Items.Count} Cameras found";
}
}
private void discoveryClient_FindProgressChanged(object sender, FindProgressChangedEventArgs e)
{
onvifDevices[noOfOnvifResponses] = Convert.ToString(e.EndpointDiscoveryMetadata.ListenUris[0]);
noOfOnvifResponses++;
if (noOfOnvifResponses > 128)
{
noOfOnvifResponses = 0; // prevent array overflow
}
CamsFound = true;
}
private void btnPlayVlc21_Click(object sender, EventArgs e)
{
starting = true;
this.Enabled = false;
TimerANPRPlaying.Enabled = false;
BtnDefConfig.BackColor = BtnColour;
CamIP = IPMatch(comboBox_Devices, txBxManualIP);
CheckEncoderManufacturer();
if (Encoder == EncoderManufacturer.MLVInew || Encoder == EncoderManufacturer.MLVIold)
{
BtnSetH264.Enabled = true;
BtnSetIPOV.Enabled = true;
ANPRStreamUrl = "rtsp://ADMIN:1234@" + CamIP + ":554/live/main";
}
else if (Encoder == EncoderManufacturer.IONODES_AVML || Encoder == EncoderManufacturer.IONODES)
{
BtnSetH264.Enabled = false;
BtnSetIPOV.Enabled = false;
ANPRStreamUrl = "rtsp://admin:admin@" + CamIP + ":554/videoinput_1/h264_1/media.stm";
}
else if (Encoder == EncoderManufacturer.KTnC)
{
BtnSetH264.Enabled = false;
BtnSetIPOV.Enabled = false;
ANPRStreamUrl = "rtsp://admin:admin@" + CamIP + ":554/stream0";
groupEp = new IPEndPoint(IPAddress.Parse(CamIP), 52381);
clRx.Connect(groupEp);
clRx.BeginReceive(new AsyncCallback(recv), null);
}
try
{
remoteEPANPR = new IPEndPoint(IPAddress.Parse(CamIP), 52381);
Media rtsp1 = new Media(libVLC, ANPRStreamUrl, FromType.FromLocation);
videoViewANPR.MediaPlayer.Play(rtsp1);
}
catch (Exception ex)
{
MessageBox.Show("Endpoint and VLC error: " + ex.ToString());
}
if (sendClientANPR.Client.IsBound == false && Encoder != EncoderManufacturer.KTnC)
{
sendClientANPR.ExclusiveAddressUse = false;
sendClientANPR.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
sendClientANPR.Client.Bind(localEPANPR);
try
{
sendClientANPR.BeginReceive(new AsyncCallback(recvANPR), null);
}
catch (Exception f)
{
MessageBox.Show(f.ToString());
}
gpBxCamControl.Enabled = true;
gbxCommands.Enabled = true;
GpBxFrame.Enabled = true;
BtnANPR.Enabled = true;
GpBxAdCont.Enabled = true;
GpBxFrame.Enabled = true;
GpBxMins.Enabled = true;
GpBxAddCrtls.Enabled = true;
selectedCamera = true;
if (serialPort1.IsOpen == false)
{
MessageBox.Show("Please select COM");
}
BtnANPR_Click(sender, e);
}
else
{
selectedCamera = true;
BtnANPR_Click(sender, e);
}
ANPRstartup = true;
TimerANPRPlaying.Enabled = true;
this.Enabled = true;
starting = false;
}
private void btnPlayVlc22_Click(object sender, EventArgs e)
{
starting = true;
this.Enabled = false;
TimerOVPlaying.Enabled = false;
BtnDefConfig.BackColor = BtnColour;
CamIP = IPMatch(comboBox_Devices2, txBxManualIpOv);
CheckEncoderManufacturer();
if (Encoder == EncoderManufacturer.MLVInew || Encoder == EncoderManufacturer.MLVIold)
{
BtnSetH264.Enabled = true;
BtnSetIPOV.Enabled = true;
OVStreamUrl = "rtsp://ADMIN:1234@" + CamIP + ":554/live/main";
}
else if (Encoder == EncoderManufacturer.IONODES_AVML || Encoder == EncoderManufacturer.IONODES)
{
BtnSetH264.Enabled = false;
BtnSetIPOV.Enabled = false;
OVStreamUrl = "rtsp://admin:admin@" + CamIP + ":554/videoinput_1/h264_1/media.stm";
}
else if (Encoder == EncoderManufacturer.KTnC)
{
BtnSetH264.Enabled = false;
BtnSetIPOV.Enabled = false;
OVStreamUrl = "rtsp://admin:admin@" + CamIP + ":554/stream0";
groupEp = new IPEndPoint(IPAddress.Parse(CamIP), 52381);
clRx.Connect(groupEp);
clRx.BeginReceive(new AsyncCallback(recv), null);
}
try
{
remoteEPOV = new IPEndPoint(IPAddress.Parse(CamIP), 52381);
Media rtsp1 = new Media(libVLC, OVStreamUrl, FromType.FromLocation);
videoViewOV.MediaPlayer.Play(rtsp1);
}
catch (Exception ex)
{
MessageBox.Show("Endpoint and VLC error: " + ex.ToString());
}
if (sendClientOV.Client.IsBound == false && Encoder != EncoderManufacturer.KTnC)
{
sendClientOV.ExclusiveAddressUse = false;
sendClientOV.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
sendClientOV.Client.Bind(localEPOV);
try
{
sendClientOV.BeginReceive(new AsyncCallback(recvOV), null);
}
catch (Exception f)
{
MessageBox.Show(f.ToString());
}
gpBxCamControl.Enabled = true;
gbxCommands.Enabled = true;
GpBxFrame.Enabled = true;
BtnOV.Enabled = true;
GpBxAdCont.Enabled = true;
GpBxFrame.Enabled = true;
GpBxMins.Enabled = true;
GpBxAddCrtls.Enabled = true;
selectedCamera = true;
if (serialPort1.IsOpen == false)
{
MessageBox.Show("Please select COM");
}
BtnOV_Click(sender, e);
}
else
{
selectedCamera = true;
BtnOV_Click(sender, e);
}
OVstartup = true;
TimerOVPlaying.Enabled = true;
this.Enabled = true;
starting = false;
}
private void btnStopVlc21_Click(object sender, EventArgs e)
{
TimerANPRPlaying.Enabled = false;
videoViewANPR.MediaPlayer.Stop();
}
private void btnStop2_Click(object sender, EventArgs e)
{
TimerOVPlaying.Enabled = false;
videoViewOV.MediaPlayer.Stop();
}
private void anprSelect()
{
CameraSelected = SelectedCam.ANPR;
CamIP = IPMatch(comboBox_Devices, txBxManualIP);
if (serialPort1.IsOpen)
{
SendCmd("CK0", 1);
richTxBxRxCmd.Clear();
TxBxRxErrMssg.Clear();
SendCmd("CK0", 1);
}
EncoderModuleDetect();
BtnANPR.BackColor = Color.LightGreen;
BtnOV.BackColor = BtnColour;
}
private void ovSelect()
{
CameraSelected = SelectedCam.OVERVIEW;
CamIP = IPMatch(comboBox_Devices2, txBxManualIpOv);
if (serialPort1.IsOpen)
{
SendCmd("CK1", 1);
richTxBxRxCmd.Clear();
TxBxRxErrMssg.Clear();
SendCmd("CK1", 1);
}
EncoderModuleDetect();
BtnOV.BackColor = Color.LightGreen;
BtnANPR.BackColor = BtnColour;
}
private void EncoderModuleDetect()
{
CheckEncoderManufacturer();
if (Encoder == EncoderManufacturer.MLVInew || Encoder == EncoderManufacturer.MLVIold)
{
SendVISCA(viscaFirmwareVer, 5, TxBxRecManVISCA, true);
Thread.Sleep(100);
SendVISCA(viscaFirmwareVer, 5, TxBxRecManVISCA, true); // Try again in case of false reply.
this.Refresh(); // To make sure box is up to date.
if (TxBxRecManVISCA.Text.Contains("0468")) // HD:IP Mk2
{
CameraModule = Module.HZ5510;
this.Text = "HD:IP GUI V" + GUIVersion + " - HD:IP Mk2";
}
else if (TxBxRecManVISCA.Text.Contains("045D")) // FHD:IP Mk2
{
CameraModule = Module.HZ5512;
this.Text = "HD:IP GUI V" + GUIVersion + " - FHD:IP Mk2";
}
else
{
SendVISCA(viscaFirmwareVerWW, 5, TxBxRecManVISCA, true);
Thread.Sleep(100);
SendVISCA(viscaFirmwareVerWW, 5, TxBxRecManVISCA, true); // Try again in case of false reply.
this.Refresh(); // To make sure box is up to date.
// MC-105 || MC-108 therefore R49
if (TxBxRecManVISCA.Text.Contains("CD0E") || TxBxRecManVISCA.Text.Contains("465A"))
{
this.Text = "HD:IP GUI V" + GUIVersion + " - R49";
BtnIrisLimUp.Enabled = BtnIrisLimDown.Enabled = false;
TxBxIrisLim.Text = "-";
CameraModule = Module.MC105;
BtnDefConfig.Enabled = true;
}
else
{
this.Text = "HD:IP GUI V" + GUIVersion + " - ???";
BtnDefConfig.Enabled = false;
}
}
}
else if (Encoder == EncoderManufacturer.KTnC)
{
CameraModule = Module.KTnC;
this.Text = "HD:IP GUI V" + GUIVersion + " - R48";
BtnDefConfig.Enabled = true;
}
else if (Encoder == EncoderManufacturer.IONODES)
{
CameraModule = Module.KTnC;
this.Text = "HD:IP GUI V" + GUIVersion + " - HD:IP Mk1";
BtnDefConfig.Enabled = true;
}
else
{
CameraModule = Module.NONE;
this.Text = "HD:IP GUI V" + GUIVersion + " - ???";
BtnDefConfig.Enabled = false;
}
}
private void txBxManualIP_TextChanged(object sender, EventArgs e)
{
if (RegexIPPattern.IsMatch(txBxManualIP.Text))
{
txBxManualIP.BackColor = Color.LightGreen;
txBxManualIP.ForeColor = Color.Black;
btnPlayVlc21.Enabled = BtnSetMJPEGANPR.Enabled = BtnSetIPANPR.Enabled = BtnWebpageANPR.Enabled = true;
}
else if (txBxManualIP.TextLength == 0)
{
txBxManualIP.BackColor = Color.White;
txBxManualIP.ForeColor = Color.Black;
}
else
{
txBxManualIP.BackColor = Color.Red;
txBxManualIP.ForeColor = Color.White;
}
}
private void txBxManualIpOv_TextChanged(object sender, EventArgs e)
{
if (RegexIPPattern.IsMatch(txBxManualIpOv.Text))
{
txBxManualIpOv.BackColor = Color.LightGreen;
txBxManualIpOv.ForeColor = Color.Black;
btnPlayVlc22.Enabled = BtnSetH264.Enabled = BtnSetIPOV.Enabled = BtnWebpageOV.Enabled = true;
}
else if (txBxManualIpOv.TextLength == 0)
{
txBxManualIpOv.BackColor = Color.White;
txBxManualIpOv.ForeColor = Color.Black;
}
else
{
txBxManualIpOv.BackColor = Color.Red;
txBxManualIpOv.ForeColor = Color.White;
}
}
bool IsBitSet(byte b, int pos)
{
return (b & 1 << pos) != 0;
}
private void comboBox_Devices_SelectedIndexChanged(object sender, EventArgs e)
{
btnPlayVlc21.Enabled = BtnSetMJPEGANPR.Enabled = BtnSetIPANPR.Enabled = BtnWebpageANPR.Enabled = true;
}
private void comboBox_Devices2_SelectedIndexChanged(object sender, EventArgs e)
{
btnPlayVlc22.Enabled = BtnSetIPOV.Enabled = BtnSetH264.Enabled = BtnWebpageOV.Enabled = true;
}
private void timerSearch_Tick(object sender, EventArgs e)
{
timerSearch.Enabled = false;
}
private void GigECheck(string Query, TextBox TxBx, string SwitchCap)
{
SendCmd("QX@" + Query, 1); // Check connection speed of GigE
if (rxMssg.Contains("unrecognised"))
{
TxBx.Text = "N/A";
TxBx.BackColor = SystemColors.Window;
return;
}
string checkString = rxMssg + rxMssg2;
byte regValue = Convert.ToByte(checkRxMsg("QX", 2, checkString), 16);
// Determine connection speed in mbps
string speed = IsBitSet(regValue, 6) ? "1000" :
IsBitSet(regValue, 5) ? "100" :
IsBitSet(regValue, 4) ? "10" : "NONE";
// Add duplex type if applicable
if (speed != "NONE")
speed += IsBitSet(regValue, 3) ? "F" : "H";
TxBx.Text = speed;
if (!TxBx.Text.Contains(SwitchCap))
{
TxBx.ForeColor = Color.White;
TxBx.BackColor = Color.Red;
}
else
{
TxBx.ForeColor = Color.Black;
TxBx.BackColor = Color.LightGreen;
}
}
private void tbxManualIP_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13 && txBxManualIP.BackColor == Color.LightGreen)
{
btnPlayVlc21_Click(sender, e);
}
}
private void tbxManualIPOV_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13 && txBxManualIpOv.BackColor == Color.LightGreen)
{
btnPlayVlc22_Click(sender, e);
}
}
private void BtnNight_Click(object sender, EventArgs e)
{
SendVISCA(viscaIrNight, "IIo");
DayorNight();
}
private void BtnDay_Click(object sender, EventArgs e)
{
SendVISCA(viscaIrDay, "IIi");
DayorNight();
}
private byte[] ConvertByteArray(string hexValue)
{
byte[] hexInt = new byte[4];
for (int i = 0; i < 4; i++)
{
hexInt[i] = Convert.ToByte(int.Parse(hexValue.Substring(i, 1), NumberStyles.HexNumber));
}
return hexInt;
}
private void trackBarZoom_MouseUp(object sender, MouseEventArgs e)
{
string hexValue = trackBarZoom.Value.ToString("X4");
txBxZoom.Text = Convert.ToString(hexValue);
byte[] hexInt = ConvertByteArray(hexValue);
byte[] viscaZoomDirect = VISCACommand(0x04, 0x47, hexInt[0], hexInt[1], hexInt[2], hexInt[3]);
timerRxDataUdp.Interval = 5000;
SendVISCA(viscaZoomDirect, "#S6105" + hexValue + "T");
timerRxDataUdp.Interval = 2000;
}
private void SendVISCA(string ToSend)
{
if (Encoder == EncoderManufacturer.IONODES_AVML)
{
byte[] Placeholder = { 0x01 };
SendVISCA(Placeholder, ToSend);
}
}
private void SendVISCA(byte[] ToSend)
{
if (Encoder != EncoderManufacturer.IONODES_AVML)
{
SendVISCA(ToSend, "");
}
}
private void SendVISCA(byte[] ToSend, string AVML)
{
switch (Encoder)
{
case EncoderManufacturer.MLVInew: // HD:IP Mk2, FHD:IP Mk2 & R49
SendVISCA_MLVI_new(ToSend, 0, TxBxReply, false);
break;
case EncoderManufacturer.MLVIold: // HD:IP Mk2, FHD:IP Mk2 & R49
SendVISCA_MLVI_old(ToSend);
break;
case EncoderManufacturer.IONODES: // FHD:IP (prototypes)
SendVISCA_IONODES(ToSend);
break;
case EncoderManufacturer.IONODES_AVML:// HD:IP Mk1
SendCmd(AVML, 1);
break;
case EncoderManufacturer.KTnC: // R48
KTnCSendandReply(ToSend);
rxMssgVISCA = "";
break;
}
}
private void SendVISCA(byte[] ToSend, int NumBytesParse, TextBox TxBx, bool AllNibbles)
{
if (Encoder != EncoderManufacturer.IONODES_AVML)
{
SendVISCA(ToSend, NumBytesParse, TxBx, AllNibbles, "", 0);
}
}
private void SendVISCA(byte[] ToSend, int NumBytesParse, TextBox TxBx, bool AllNibbles, string AVML, int NOER)
{
string lastreply;
switch (Encoder)
{
case EncoderManufacturer.MLVInew: // HD:IP Mk2, FHD:IP Mk2 & R49
SendVISCA_MLVI_new(ToSend, NumBytesParse, TxBx, AllNibbles);
break;
case EncoderManufacturer.MLVIold: // HD:IP Mk2, FHD:IP Mk2 & R49
SendVISCA_MLVI_old(ToSend);
ViscaParseReply(NumBytesParse, TxBx, AllNibbles);
break;
case EncoderManufacturer.IONODES: // FHD:IP (prototypes)
SendVISCA_IONODES(ToSend);
lastreply = richTxBxRxCmd.Text.Substring(richTxBxRxCmd.Text.LastIndexOf("<<"));
if (lastreply.Contains("#")) // HD:IP Mk1 replies with question becuase it doesn't know what else to do
{
Encoder = EncoderManufacturer.IONODES_AVML;
SendVISCA(ToSend, NumBytesParse, TxBx, AllNibbles, AVML, NOER);
}
ViscaParseReplyIONODES(NumBytesParse, TxBx, AllNibbles);
break;
case EncoderManufacturer.IONODES_AVML:// HD:IP Mk1
SendCmd(AVML, NOER);
lastreply = richTxBxRxCmd.Text.Substring(richTxBxRxCmd.Text.LastIndexOf("<<"));
if (lastreply.Contains("no reply")) // It's not actually AVML so go back to IONODES
{
Encoder = EncoderManufacturer.IONODES;
SendVISCA(ToSend, NumBytesParse, TxBx, AllNibbles, AVML, NOER);
}
checkRxMessage(TxBx);
break;
case EncoderManufacturer.KTnC: // R48
KTnCSendandReply(ToSend);
ReplyKTnC(NumBytesParse, TxBx, AllNibbles);
break;
}
}
private void SendVISCA_MLVI_old(byte[] ToSend)
{
rxMssgVISCA = "";
RhTxBxVISCAReplies.SelectionColor = Color.Red;
try
{
string BuiltString = VISCABuilder(ToSend);
RhTxBxVISCAReplies.AppendText(">> " + BuiltString + Environment.NewLine);
}
catch
{
RhTxBxVISCAReplies.AppendText(">> Error" + Environment.NewLine);
}
RhTxBxVISCAReplies.SelectionStart = RhTxBxVISCAReplies.Text.Length;
RhTxBxVISCAReplies.ScrollToCaret();
if (CameraSelected == SelectedCam.ANPR)
{
if (sendClientANPR.Send(ToSend, ToSend.Length, remoteEPANPR) != ToSend.Length)
{
MessageBox.Show("Not all bytes sent");
return;
}
if (ToSend.Length == 13)
{
Thread.Sleep(200);
if (sendClientANPR.Send(ToSend, ToSend.Length, remoteEPANPR) != ToSend.Length)
{
MessageBox.Show("Not all bytes sent");
return;
}
}
}
else if (CameraSelected == SelectedCam.OVERVIEW)
{
if (sendClientOV.Send(ToSend, ToSend.Length, remoteEPOV) != ToSend.Length)
{
MessageBox.Show("Not all bytes sent");
return;
}
if (ToSend.Length == 13)
{
Thread.Sleep(200);
if (sendClientOV.Send(ToSend, ToSend.Length, remoteEPOV) != ToSend.Length)
{
MessageBox.Show("Not all bytes sent");
return;
}
}
}
else
{
MessageBox.Show("Please select camera");
}
WaitMs(100);
}
private void ViscaParseReply(int NumBytesParse, TextBox TxBx, bool AllNibbles)
{
timerRxDataUdp.Enabled = false;
rxDataUdpTimeout = false;
timerRxDataUdp.Enabled = true;
// 90 50 Done Inq + 90 51 Done cmd
while (!rxMssgVISCA.Contains("90 5") && rxDataUdpTimeout == false)
{
Application.DoEvents();
Thread.Sleep(10);
if (rxMssgVISCA.Contains("90 6"))
{
timerRxDataUdp.Enabled = false;
return;
}
}
timerRxDataUdp.Enabled = false;
if (rxDataUdpTimeout == true)
{
TimeoutCounter++;
if (TimeoutCounter > 2)
{
RhTxBxVISCAReplies.AppendText("Timeout occured at " + TxBx.Name.Substring(4, TxBx.Name.Length - 4) + Environment.NewLine);
RhTxBxVISCAReplies.SelectionStart = RhTxBxVISCAReplies.Text.Length;
RhTxBxVISCAReplies.ScrollToCaret();
return;
}
}
string RxMssg = rxMssgVISCA.Replace(" ", "");
rxMssgVISCA = ""; // In case of another response
if (NumBytesParse == 0)
{
TxBx.Text = RxMssg;
return;
}
if (RxMssg.Contains("9050")) // means info to come back, 51 is just ack.
{
TxBx.Text = ConvertToWantedBits(RxMssg, NumBytesParse, AllNibbles);
}
}
private void SendVISCA_MLVI_new(byte[] ToSend, int NumBytesParse, TextBox TxBx, bool AllNibbles)
{
if (InProgress == true)
{
return;
}
InProgress = true;
rxMssgVISCA = "";
RhTxBxVISCAReplies.SelectionColor = Color.Red;
try
{
string BuiltString = VISCABuilder(ToSend);
RhTxBxVISCAReplies.AppendText(">> " + BuiltString + Environment.NewLine);
}
catch
{
RhTxBxVISCAReplies.AppendText(">> Error" + Environment.NewLine);
InProgress = false;
return;
}
RhTxBxVISCAReplies.SelectionStart = RhTxBxVISCAReplies.Text.Length;
RhTxBxVISCAReplies.ScrollToCaret();
// If (ANPR and not all bytes sent) or (Overview and not all bytes sent)
if ((CameraSelected == SelectedCam.ANPR && sendClientANPR.Send(ToSend, ToSend.Length, remoteEPANPR) != ToSend.Length)
|| (CameraSelected == SelectedCam.OVERVIEW && sendClientOV.Send(ToSend, ToSend.Length, remoteEPOV) != ToSend.Length))
{
MessageBox.Show("Not all bytes sent");
InProgress = false;
return;
}
timerRxDataUdp.Enabled = false;
rxDataUdpTimeout = false;
timerRxDataUdp.Enabled = true;
// 90 50 Done Inq + 90 51 Done cmd
while (!rxMssgVISCA.Contains("90 5") && rxDataUdpTimeout == false)
{
Application.DoEvents();
Thread.Sleep(5);
if (rxMssgVISCA.Contains("90 6"))
{
InProgress = false;
timerRxDataUdp.Enabled = false;
break;
}
else if (rxMssgVISCA == "90 41 FF ") // Not timeout just haven't captured 90 5x FF
{
RhTxBxVISCAReplies.AppendText("ACK but no confirm" + Environment.NewLine);
RhTxBxVISCAReplies.SelectionStart = RhTxBxVISCAReplies.Text.Length;
RhTxBxVISCAReplies.ScrollToCaret();
break;
}
}
timerRxDataUdp.Enabled = false;
if (rxDataUdpTimeout == true)
{
RhTxBxVISCAReplies.AppendText("Timeout occured at " + TxBx.Name.Substring(4) + Environment.NewLine);
RhTxBxVISCAReplies.SelectionStart = RhTxBxVISCAReplies.Text.Length;
RhTxBxVISCAReplies.ScrollToCaret();
InProgress = false;
return;
}
rxDataUdpTimeout = false;
string RxMssg = rxMssgVISCA.Replace(" ", "");
rxMssgVISCA = ""; // In case of another response
InProgress = false;
// Command sent so need to save. Set timer going or reset timer.
// Inq command and timer is already running so restart timer to not interfere with command
if (CameraModule == Module.MC105 && WWSave == false && (ToSend[9] == 0x01 || TimerWWSave.Enabled == true))
{
TimerWWSave.Enabled = false;
TimerWWSave.Enabled = true;
}
if (NumBytesParse == 0) // Case where we don't care what the reply is, but have to wait till it's recieved so we can send the next command.
{
TxBx.Text = RxMssg;
return;
}
if (RxMssg.Contains("9050")) //means info to come back, 51 is just ack.
{
TxBx.Text = ConvertToWantedBits(RxMssg, NumBytesParse, AllNibbles);
}
return;
}
private void SendVISCA_IONODES(byte[] ToSend)
{
rxMssgVISCA = "";
try
{
string SendString = VISCABuilder(ToSend).Replace(" ", "");
noOfExpectedResonses = 2; // 9041 & 9051
if (SendString.Length == 10 || (SendString.Contains("72") && SendString.Contains("09"))) // Inquiry command 5 bytes x2 + 4 spaces for string or contains 72 which is resolution registers
{
noOfExpectedResonses = 1;
}
SendCmd("#" + SendString, noOfExpectedResonses);
}
catch
{
richTxBxRxCmd.AppendText(">> Error" + Environment.NewLine);
}
WaitMs(100);
}
private bool ViscaParseReplyIONODES(int NumBytesParse, TextBox TxBx, bool AllNibbles)
{
timerRxDataUdp.Enabled = false;
rxDataUdpTimeout = false;
timerRxDataUdp.Enabled = true;
while (!rxMssgVISCA.Contains("905") && !rxMssgVISCA.Contains("904") && rxDataUdpTimeout == false) // needs timeout
{
Application.DoEvents();
Thread.Sleep(10);
}
timerRxDataUdp.Enabled = false;
if (rxMssgVISCA.Contains("9061"))
{
MessageBox.Show("Could not execute the command in the current mode.");
return false;
}
else if (rxDataUdpTimeout == true)
{
TimeoutCounter++;
if (TimeoutCounter > 2)
{
richTxBxRxCmd.AppendText("Timeout occured at " + TxBx.Name.Substring(4, TxBx.Name.Length - 4));
richTxBxRxCmd.SelectionStart = richTxBxRxCmd.Text.Length;
richTxBxRxCmd.ScrollToCaret();
return false;
}
}
string RxMssg;
try
{
RxMssg = rxMssgVISCA.Substring(1, rxMssgVISCA.Length - 3); // Get rid of AVML wrapper.
}
catch
{
RxMssg = rxMssgVISCA;
}
rxMssgVISCA = ""; // In case of another message
if (RxMssg.Contains("9050")) // Means info to come back, 51 is just ack.
{
TxBx.Text = ConvertToWantedBits(RxMssg, NumBytesParse, AllNibbles);
}
return true;
}
private void KTnCSendandReply(byte[] dataTx)
{
rxMssgVISCA = "";
if (clRx.Send(dataTx, dataTx.Length) != dataTx.Length)
{
MessageBox.Show("Not all bytes sent");
return;
}
if (dataTx.Length == 13)
{
Thread.Sleep(400);
rxMssgVISCA = "";
if (clRx.Send(dataTx, dataTx.Length) != dataTx.Length)
{
MessageBox.Show("Not all bytes sent");
return;
}
}
string SendString = VISCABuilder(dataTx);
RhTxBxVISCAReplies.SelectionColor = Color.Red;
RhTxBxVISCAReplies.AppendText(">> " + SendString + Environment.NewLine);
RhTxBxVISCAReplies.SelectionStart = RhTxBxVISCAReplies.Text.Length;
RhTxBxVISCAReplies.ScrollToCaret();
timerRxDataUdp.Enabled = false;
rxDataUdpTimeout = false;
timerRxDataUdp.Enabled = true;
while (!rxMssgVISCA.Contains("90 5") && !rxMssgVISCA.Contains("90 4") && rxDataUdpTimeout == false) // needs timeout
{
Application.DoEvents();
Thread.Sleep(10);
}
timerRxDataUdp.Enabled = false;
}
private void ReplyKTnC(int NumBytesParse, TextBox TxBx, bool AllNibbles)
{
if (rxDataUdpTimeout == true)
{
RhTxBxVISCAReplies.SelectionColor = Color.Green;
RhTxBxVISCAReplies.AppendText(Environment.NewLine + "<< Rx Timeout error");
}
else
{
string RxMssg = rxMssgVISCA.Replace(" ", "");
rxMssgVISCA = ""; // In case of another message
if (RxMssg.Contains("9050")) // Means info to come back, 51 is just ack.
{
TxBx.Text = ConvertToWantedBits(RxMssg, NumBytesParse, AllNibbles);
}
}
RhTxBxVISCAReplies.SelectionStart = RhTxBxVISCAReplies.Text.Length;
RhTxBxVISCAReplies.ScrollToCaret();
}
//CallBack for KT&C encoder.
private void recv(IAsyncResult res)
{
try
{
byte[] received = clRx.EndReceive(res, ref RemoteIpEndPoint);
clRx.BeginReceive(new AsyncCallback(recv), null);
StringBuilder sb = new StringBuilder();
foreach (byte b in received)
{
sb.AppendFormat("{0:x2} ", b);
}
rxMssgVISCA = sb.ToString().ToUpper();
RhTxBxVISCAReplies.SelectionColor = Color.Green;
RhTxBxVISCAReplies.AppendText("<< " + rxMssgVISCA + Environment.NewLine);
}
catch { }
}
private void recvANPR(IAsyncResult res)
{
if (InvokeRequired)
{
BeginInvoke(new MethodInvoker(delegate () { recvANPR(res); }));
}
else
{
byte[] received = sendClientANPR.EndReceive(res, ref localEPANPR);
sendClientANPR.BeginReceive(new AsyncCallback(recvANPR), null);
ProcessReply(received);
}
}
private void recvOV(IAsyncResult res)
{
if (InvokeRequired)
{
BeginInvoke(new MethodInvoker(delegate () { recvOV(res); }));
}
else
{
byte[] received = sendClientOV.EndReceive(res, ref localEPOV);
sendClientOV.BeginReceive(new AsyncCallback(recvOV), null);
ProcessReply(received);
}
}
private void ProcessReply(byte[] received)
{
if (received.Length < 3) // Minimum of 90 41 FF therefore 3.
{
MessageBox.Show("Unexpected reply from camera VISCA" + Environment.NewLine + "reply: " + rxMssgVISCA);
return;
}
StringBuilder sb = new StringBuilder();
foreach (byte b in received)
{
sb.AppendFormat("{0:x2} ", b);
}
rxMssgVISCA = sb.ToString().ToUpper();
try
{
rxMssgVISCA = rxMssgVISCA.Substring(rxMssgVISCA.IndexOf("90"), rxMssgVISCA.IndexOf("FF 00", rxMssgVISCA.IndexOf("90")) - rxMssgVISCA.IndexOf("90") + 3);
RhTxBxVISCAReplies.SelectionColor = Color.Green;
RhTxBxVISCAReplies.AppendText("<< " + rxMssgVISCA + Environment.NewLine);
RhTxBxVISCAReplies.SelectionStart = RhTxBxVISCAReplies.Text.Length;
RhTxBxVISCAReplies.ScrollToCaret();
}
catch { }
}
private string ConvertToWantedBits(string RxMssg, int NumBytesParse, bool AllNibbles)
{
try
{
int bytescharlength = NumBytesParse * 2;
// start pos is the length - FF - how many bytes wanted
int StartParsePos = RxMssg.Length - 2 - bytescharlength;
string ParseString = "";
RxMssg = RxMssg.Substring(RxMssg.IndexOf("9050") + StartParsePos, bytescharlength);
for (int i = 1; i < bytescharlength; i += 2)
{
if (AllNibbles == false)
{
ParseString += RxMssg.Substring(i, 1);
}
else
{
ParseString += RxMssg.Substring(i - 1, 2);
}
}
return ParseString.ToUpper();
}
catch { }
return RxMssg;
}
private string VISCABuilder(byte[] ToSend)
{
bool StartSB = false;
StringBuilder sb = new StringBuilder();
foreach (byte b in ToSend)
{
if (b == 0x81)
{
StartSB = true;
}
if (StartSB == true)
{
sb.AppendFormat("{0:x2} ", b);
}
}
return sb.ToString().ToUpper();
}
private void timerRxDataUdp_Tick(object sender, EventArgs e)
{
timerRxDataUdp.Enabled = false;
rxDataUdpTimeout = true;
}
private void trackFocus_MouseUp(object sender, MouseEventArgs e)
{
string hexValue = trackBarFocus.Value.ToString("X4");
txBxFocus.Text = Convert.ToString(hexValue);
byte[] hexInt = ConvertByteArray(hexValue);
byte[] viscaFocusDirect = VISCACommand(0x04, 0x48, hexInt[0], hexInt[1], hexInt[2], hexInt[3]);
timerRxDataUdp.Interval = 5000;
SendVISCA(viscaFocusDirect, 4, TxBxReply, true, "#S6104" + hexValue + "T", 1);
timerRxDataUdp.Interval = 2000;
}
private void BtnQueryFrameRate_Click(object sender, EventArgs e)
{
SendVISCA(viscaQuery, 12, TxBxReply, false);
Btn720p30.BackColor = BtnColour;
Btn720p25.BackColor = BtnColour;
Btn1080p25.BackColor = BtnColour;
Btn1080p30.BackColor = BtnColour;
if (TxBxReply.Text.Contains("0E") || TxBxReply.Text.Contains("0F"))
{
Btn720p30.BackColor = Color.LightGreen;
}
else if (TxBxReply.Text.Contains("07") || TxBxReply.Text.Contains("06"))
{
Btn1080p30.BackColor = Color.LightGreen;
}
else if (TxBxReply.Text.Contains("01"))
{
Btn720p25.BackColor = Color.LightGreen;
}
else if (TxBxReply.Text.Contains("08"))
{
Btn1080p25.BackColor = Color.LightGreen;
}
else
{
MessageBox.Show("Unknown framerate, please set manually");
}
}
private void Btn1080p25_Click(object sender, EventArgs e)
{
SendVISCA(visca1080p25);
BtnQueryFrameRate_Click(sender, e);
}
private void Btn1080p30_Click(object sender, EventArgs e)
{
SendVISCA(visca1080p30);
BtnQueryFrameRate_Click(sender, e);
}
private void Btn720p25_Click(object sender, EventArgs e)
{
SendVISCA(visca720p25);
BtnQueryFrameRate_Click(sender, e);
}
private void Btn720p30_Click(object sender, EventArgs e)
{
SendVISCA(visca720p30);
BtnQueryFrameRate_Click(sender, e);
}
private void BtnIRAuto_Click(object sender, EventArgs e)
{
SendVISCA(viscaAutoIR);
ICRMode();
}
private void BtnIRMan_Click(object sender, EventArgs e)
{
SendVISCA(viscaManualIR);
ICRMode();
}
private void txBxZoom_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13)
{
try
{
trackBarZoom.Value = Convert.ToInt32(txBxZoom.Text, 16);
}
catch
{
MessageBox.Show("Not an accceptable zoom value, range is" + Environment.NewLine + trackBarZoom.Minimum + "-" + trackBarZoom.Maximum);
return;
}
UpdateZoom();
}
}
private void txBxZoom2_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13)
{
int InputVal = Convert.ToInt16(txBxZoom2.Text);
if (InputVal <= 10 && InputVal >= 0)
{
trackBarZoom.Value = Convert.ToInt32(InputVal * 1638.4);
UpdateZoom();
}
}
}
private void BtnZoomIn_Click(object sender, EventArgs e)
{
int InputVal = Convert.ToInt16(trackBarZoom.Value / 1638.4);
if (InputVal <= 9 && InputVal >= 0)
{
txBxZoom2.Text = Convert.ToString(InputVal + 1);
if (InputVal != 10)
{
trackBarZoom.Value = Convert.ToInt32((InputVal * 1638.4) + 1638.4);
}
UpdateZoom();
}
}
private void BtnZoomOut_Click(object sender, EventArgs e)
{
int InputVal = Convert.ToInt16(trackBarZoom.Value / 1638.4);
if (InputVal <= 10 && InputVal >= 1)
{
txBxZoom2.Text = Convert.ToString(InputVal - 1);
if (InputVal != 0)
{
trackBarZoom.Value = Convert.ToInt32((InputVal * 1638.4) - 1638.4);
}
UpdateZoom();
}
}
private void UpdateZoom()
{
string hexValue = trackBarZoom.Value.ToString("X4");
txBxZoom.Text = Convert.ToString(hexValue);
byte[] hexInt = ConvertByteArray(hexValue);
byte[] viscaZoomDirect = VISCACommand(0x04, 0x47, hexInt[0], hexInt[1], hexInt[2], hexInt[3]);
SendVISCA(viscaZoomDirect, "#S6105" + hexValue + "T");
}
private void BtnFocusPlus_Click(object sender, EventArgs e)
{
int InputVal = Convert.ToInt16((trackBarFocus.Value - 256) / 6502.4);
if (InputVal <= 9 && InputVal >= 0)
{
TxBxFocus2.Text = Convert.ToString(InputVal + 1);
if (InputVal != 10)
{
trackBarFocus.Value = Convert.ToInt32((InputVal * 6502.4) + 256 + 6502.4);
}
UpdateFocus();
}
}
private void BtnFocusNeg_Click(object sender, EventArgs e)
{
int InputVal = Convert.ToInt16((trackBarFocus.Value - 256) / 6502.4);
if (InputVal <= 10 && InputVal >= 1)
{
TxBxFocus2.Text = Convert.ToString(InputVal - 1);
if (InputVal != 0)
{
trackBarFocus.Value = Convert.ToInt32((InputVal * 6502.4) + 256 - 6502.4);
}
UpdateFocus();
}
}
private void txBxFocus_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13)
{
try
{
trackBarFocus.Value = Convert.ToInt32(txBxFocus.Text, 16);
}
catch
{
MessageBox.Show("Not an accceptable focus value, range is" + Environment.NewLine + trackBarFocus.Minimum + "-" + trackBarFocus.Maximum);
return;
}
UpdateFocus();
}
}
private void TxBxFocus2_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13)
{
int InputVal = Convert.ToInt16(TxBxFocus2.Text);
if (InputVal <= 10 && InputVal >= 0)
{
trackBarFocus.Value = Convert.ToInt32((InputVal * 6502.4) + 256);
UpdateFocus();
}
}
}
private void UpdateFocus()
{
string hexValue = trackBarFocus.Value.ToString("X4");
txBxFocus.Text = Convert.ToString(hexValue);
byte[] hexInt = ConvertByteArray(hexValue);
byte[] viscaFocusDirect = VISCACommand(0x04, 0x48, hexInt[0], hexInt[1], hexInt[2], hexInt[3]);
SendVISCA(viscaFocusDirect, "#S6104" + hexValue + "T");
}
private void BtnSharpUp_Click(object sender, EventArgs e)
{
SendVISCA(viscaSharpnessUp, "APu");
TxBxSharp_Click(sender, e);
}
private void BtnSharpDown_Click(object sender, EventArgs e)
{
SendVISCA(viscaSharpnessDown, "APd");
TxBxSharp_Click(sender, e);
}
private void TxBxSharp_Click(object sender, EventArgs e)
{
SendVISCA(viscaInqSharpness, 1, TxBxSharp, false, "AP?", 1);
}
private void AdjustGamma(int delta, object sender, EventArgs e)
{
if (TxBxGamma.Text == null)
{
TxBxGamma_Click(sender, e);
}
byte GammaValue = Convert.ToByte(Convert.ToInt16(TxBxGamma.Text) + delta);
if (Encoder == EncoderManufacturer.IONODES_AVML) //HD:IP Mk1 AVML
{
if (delta > 0)
SendVISCA("ANu");
else
SendVISCA("ANd");
}
else if (GammaValue >= 0 && GammaValue <= 6)
{
byte[] viscaGammaDirect = VISCACommand(0x04, 0x5B, GammaValue);
SendVISCA(viscaGammaDirect);
}
TxBxGamma_Click(sender, e);
}
private void BtnGammaUp_Click(object sender, EventArgs e)
{
AdjustGamma(1, sender, e);
}
private void BtnGammaDown_Click(object sender, EventArgs e)
{
AdjustGamma(-1, sender, e);
}
private void TxBxGamma_Click(object sender, EventArgs e)
{
SendVISCA(viscaInqGamma, 1, TxBxGamma, false, "AN?", 1);
}
private void AdjustContrast(int delta, object sender, EventArgs e)
{
if (TxBxContrast.Text == null)
{
TxBxContrast_Click(sender, e);
}
int ConValue = int.Parse(TxBxContrast.Text, NumberStyles.HexNumber) + delta;
if (Encoder == EncoderManufacturer.IONODES_AVML) // HD:IP Mk1 AVML
{
if (delta > 0)
SendVISCA("ACu");
else
SendVISCA("ACd");
}
else if (ConValue >= 0 && ConValue <= 20)
{
if (CameraModule == Module.MC105)
{
byte[] viscaWWContrast = VISCACommand(0x05, 0x5D, 0x00, 0x00, 0x00, Convert.ToByte(ConValue));
SendVISCA(viscaWWContrast);
}
else
{
byte[] viscaContrastDirect = VISCACommand(0x71, 0x40, Convert.ToByte(ConValue));
SendVISCA(viscaContrastDirect);
}
}
TxBxContrast_Click(sender, e);
}
private void BtnContrastPlus_Click(object sender, EventArgs e)
{
AdjustContrast(1, sender, e);
}
private void BtnContrastNeg_Click(object sender, EventArgs e)
{
AdjustContrast(-1, sender, e);
}
private void TxBxContrast_Click(object sender, EventArgs e)
{
if (CameraModule == Module.MC105)
{
SendVISCA(viscaInqContrastWW, 2, TxBxContrast, false, "AC?", 1);
}
else
{
SendVISCA(viscaInqContrast, 1, TxBxContrast, true, "AC?", 1);
}
try
{
if (TxBxContrast.Text.Substring(0, 1) == "0")
{
TxBxContrast.Text = TxBxContrast.Text.Substring(1);
}
}
catch { }
}
private void BtnExpCompUp_Click(object sender, EventArgs e)
{
SendVISCA(viscaExpCompUp);
TxBxExpComp_Click(sender, e);
}
private void BtnExpCompDown_Click(object sender, EventArgs e)
{
SendVISCA(viscaExpCompDown);
TxBxExpComp_Click(sender, e);
}
private void BtnExpCompReset_Click(object sender, EventArgs e)
{
SendVISCA(viscaExpCompReset);
TxBxExpComp_Click(sender, e);
}
private void TxBxExpComp_Click(object sender, EventArgs e)
{
SendVISCA(viscaInqExpComp, 1, TxBxExpComp, false);
}
private void AdjustNR(int delta, object sender, EventArgs e)
{
if (TxBxNR.Text == null)
{
TxBxNR_Click(sender, e);
}
if (Encoder == EncoderManufacturer.IONODES_AVML)
{
int i = 0;
string[] NRAVMLCommands = new string[4] { "n", "a", "2", "3" };
foreach (string CMD in NRAVMLCommands)
{
if (TxBxNR.Text.Contains(CMD))
{
try
{
string Cmdtosend = "XN" + NRAVMLCommands[i + delta];
SendVISCA(viscaFirmwareVer, Cmdtosend);
}
catch { }
}
i++;
}
}
else if (TxBxNR.Text != "0")
{
try
{
int NR_Num = Convert.ToInt16(TxBxNR.Text) + delta;
int limit = 6; // KT&C limits
if (CameraModule == Module.MC105)
{
limit = 15; // 0x0F
}
if (NR_Num > limit)
{
NR_Num = limit;
}
byte NRByte = Convert.ToByte(NR_Num);
if (CameraModule == Module.MC105)
{
byte[] viscaNRDirectWW = VISCACommand(0x05, 0x53, NRByte, 0x00);
SendVISCA(viscaNRDirectWW);
Thread.Sleep(100);
}
else
{
byte[] viscaNRDirect = VISCACommand(0x04, 0x53, NRByte);
SendVISCA(viscaNRDirect);
}
}
catch { }
}
TxBxNR_Click(sender, e);
}
private void BtnNRUp_Click(object sender, EventArgs e)
{
AdjustNR(1, sender, e);
}
private void BtnNRDown_Click(object sender, EventArgs e)
{
AdjustNR(-1, sender, e);
}
private void TxBxNR_Click(object sender, EventArgs e)
{
if (CameraModule == Module.MC105)
{
SendVISCA(viscaInqNRWW, 2, TxBxNR, false, "XN?", 1);
try // Cut off 3D NR reply
{
TxBxNR.Text = TxBxNR.Text.Substring(0, 1);
}
catch { }
}
else
{
SendVISCA(viscaInqNR, 1, TxBxNR, false, "XN?", 1);
}
}
private void BtnMirrorOn_Click(object sender, EventArgs e)
{
SendVISCA(viscaMirrorOn, "ARm");
BtnMirrorOn.BackColor = Color.LightGreen;
BtnMirrorOff.BackColor = BtnColour;
}
private void BtnMirrorOff_Click(object sender, EventArgs e)
{
SendVISCA(viscaMirrorOff, "ARn");
BtnMirrorOff.BackColor = Color.LightGreen;
BtnMirrorOn.BackColor = BtnColour;
}
private void TkBarLED_MouseUp(object sender, MouseEventArgs e)
{
TkBarLED.Enabled = false;
if (TkBarLED.Value == 0)
{
btnIllumOff_Click(sender, e);
TxBxLEDCurrent.Text = "LED's Off";
}
else
{
if (btnIllumOff.BackColor == Color.LightGreen)
{
btnIllumOn_Click(sender, e);
}
string LEDCurrent = TxBxLEDCurrent.Text.Remove(TxBxLEDCurrent.Text.Length - 1);
pauseMonitor();
SendCmd("NC@" + LEDCurrent, 1);
CheckLEDPower();
checkRestartMonitor();
}
TimerLEDCoolDown.Enabled = true;
}
private void TkBarLED_ValueChanged(object sender, EventArgs e)
{
TxBxLEDCurrent.Text = (TkBarLED.Value / 10.0).ToString("N2") + "A"; // Translates trackbar position to current and displays live
}
private void TimerLEDCoolDown_Tick(object sender, EventArgs e)
{
TkBarLED.Enabled = true;
TimerLEDCoolDown.Enabled = false;
}
private void PicLogo_Click(object sender, EventArgs e)
{
PicLogo.Enabled = false;
if (AdvancedOpen == false)
{
PasswordForm PasswordForm = new PasswordForm();
this.Enabled = false;
PasswordForm.Show();
PasswordForm.Location = new Point(this.Location.X + (this.Width / 2) - (PasswordForm.Width / 2), this.Location.Y + (this.Height / 2) - (PasswordForm.Height / 2));
while (PasswordForm.Visible == true)
{
Application.DoEvents();
Thread.Sleep(10);
}
this.Enabled = true;
}
else if (starting == false)
{
DialogResult dialogResult = MessageBox.Show("Do you wish to close the advanced menu?", "Close advanced menu", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
MAVCopy = false;
AdvancedOpen = false;
this.Width = 980;
string[] lines = { serialPort1.PortName, MAVCopy.ToString(), TxBxPSUIP.Text, TxBxZebraIP.Text };
File.WriteAllLines($"{TxtFileDir}COMInfo.txt", lines);
}
PicLogo.Enabled = true;
return;
}
if (CorrectPassword == true)
{
try
{
this.Width = 1260;
AdvancedOpen = true;
if (selectedCamera == true)
{
TxBxSharp_Click(sender, e);
TxBxGamma_Click(sender, e);
TxBxContrast_Click(sender, e);
TxBxNR_Click(sender, e);
if (BtnExpShtrPri.BackColor == Color.LightGreen || BtnAutoExp.BackColor == Color.LightGreen)
{
TxBxGainLim_Click(sender, e);
TxBxIrisLim_Click(sender, e);
}
SendVISCA(viscaInqDIS, 2, TxBxReply, false);
if (TxBxReply.Text.Contains("2"))
{
BtnDISOn.BackColor = Color.LightGreen;
BtnDISOff.BackColor = BtnColour;
}
else if (TxBxReply.Text.Contains("3"))
{
BtnDISOff.BackColor = Color.LightGreen;
BtnDISOn.BackColor = BtnColour;
}
else
{
BtnDISOff_Click(sender, e);
BtnDISOff.BackColor = Color.LightGreen;
BtnDISOn.BackColor = BtnColour;
}
SendVISCA(viscaInqMirror, 2, TxBxReply, false, "AR?", 1);
if (TxBxReply.Text.Contains("2") || TxBxReply.Text.Contains("m") || TxBxReply.Text.Contains("r") || TxBxReply.Text.Contains("y")) // Mirrored 'm' or both mirrored and inverted 'r' or 'y'.
{
BtnMirrorOn.BackColor = Color.LightGreen;
BtnMirrorOff.BackColor = BtnColour;
}
else if (TxBxReply.Text.Contains("3") || TxBxReply.Text.Contains("n") || TxBxReply.Text.Contains("i")) // Not on 'n' or just inverted 'i'.
{
BtnMirrorOff.BackColor = Color.LightGreen;
BtnMirrorOn.BackColor = BtnColour;
}
else
{
BtnMirrorOff_Click(sender, e);
BtnMirrorOff.BackColor = Color.LightGreen;
BtnMirrorOn.BackColor = BtnColour;
}
ICRMode();
DayorNight();
BtnQueryFrameRate_Click(sender, e);
}
BtnSetMJPEGANPR.Visible = BtnSetH264.Visible = true;
if (MAVCopy == true)
{
GpBxOSD.Visible = BtnWebpageOV.Visible = BtnWebpageANPR.Visible = BtnSetIPANPR.Visible = BtnSetIPOV.Visible = true;
}
}
catch
{
gpBxCamControl.Enabled = GpBxAddCrtls.Enabled = GpBxAdCont.Enabled = false;
}
}
PicLogo.Enabled = true;
}
private void BtnExpCompOn_Click(object sender, EventArgs e)
{
SendVISCA(viscaExpCompOn);
BtnExpCompOn.BackColor = Color.LightGreen;
BtnExpCompOff.BackColor = BtnColour;
BtnBrightnessReset.Enabled = BtnExpCompDown.Enabled = BtnExpCompUp.Enabled = TxBxExpComp.Enabled = true;
}
private void BtnExpCompOff_Click(object sender, EventArgs e)
{
SendVISCA(viscaExpCompOff);
BtnExpCompOff.BackColor = Color.LightGreen;
BtnExpCompOn.BackColor = BtnColour;
BtnBrightnessReset.Enabled = BtnExpCompDown.Enabled = BtnExpCompUp.Enabled = TxBxExpComp.Enabled = false;
}
private static readonly Dictionary<string, string> KTnCShutterMap = new Dictionary<string, string>()
{
{ "00", "1/1" }, { "01", "1/2" }, { "02", "1/4" }, { "03", "1/8" },
{ "04", "1/15" }, { "05", "1/30" }, { "06", "1/60" }, { "07", "1/90" },
{ "08", "1/100" }, { "09", "1/125" }, { "0A", "1/180" }, { "0B", "1/250" },
{ "0C", "1/350" }, { "0D", "1/500" }, { "0E", "1/725" }, { "0F", "1/1000" },
{ "10", "1/1500" }, { "11", "1/2000" }, { "12", "1/3000" }, { "13", "1/4000" },
{ "14", "1/6000" }, { "15", "1/10000" }
};
private static readonly Dictionary<string, string> MC105ShutterMap = new Dictionary<string, string>()
{
{ "00", "1/1" }, { "01", "1/2" }, { "02", "1/4" }, { "03", "1/8" },
{ "04", "1/15" }, { "05", "1/30" }, { "06", "1/60" }, { "07", "1/100" },
{ "08", "1/120" }, { "09", "1/250" }, { "0A", "1/500" }, { "0B", "1/1000" },
{ "0C", "1/2000" }, { "0D", "1/5000" }, { "0E", "1/10000" }, { "0F", "1/20000" },
{ "10", "1/30000" }
};
private static readonly Dictionary<string, string> KTnCIrisMap = new Dictionary<string, string>()
{
{ "00", "Closed" }, { "01", "F32" }, { "02", "F22" }, { "03", "F19" },
{ "04", "F16" }, { "05", "F14" }, { "06", "F11" }, { "07", "F9.6" },
{ "08", "F8" }, { "09", "F6.8" }, { "0A", "F5.6" }, { "0B", "F4.8" },
{ "0C", "F4" }, { "0D", "F3.4" }, { "0E", "F2.8" }, { "0F", "F2.4" },
{ "10", "F2.0" }, { "11", "F1.6" }
};
private static readonly Dictionary<string, string> MC105IrisMap = new Dictionary<string, string>()
{
{ "00", "Closed" }, { "04", "F16.0" }, { "05", "F14.0" }, { "06", "F11.0" },
{ "07", "F9.6" }, { "08", "F8.0" }, { "09", "F6.8" }, { "0A", "F5.6" },
{ "0B", "F4.8" }, { "0C", "F4.0" }, { "0D", "F3.4" }, { "0E", "F2.8" },
{ "0F", "F2.4" }, { "10", "F2.0" }, { "11", "F1.8" }, { "12", "F1.7" }
};
private void ConvertShutter(TextBox TxBx)
{
Dictionary<string, string> map = null;
if (CameraModule == Module.KTnC || CameraModule == Module.HZ5510 || CameraModule == Module.HZ5512)
{
map = KTnCShutterMap;
}
else if (CameraModule == Module.MC105)
{
map = MC105ShutterMap;
}
if (map != null && map.TryGetValue(TxBx.Text, out string value))
{
TxBx.Text = value;
}
}
private void ConvertIris(TextBox TxBx)
{
Dictionary<string, string> map = null;
if (CameraModule == Module.KTnC || CameraModule == Module.HZ5510 || CameraModule == Module.HZ5512)
{
map = KTnCIrisMap;
}
else if (CameraModule == Module.MC105)
{
map = MC105IrisMap;
}
if (map != null && map.TryGetValue(TxBx.Text, out string value))
{
TxBx.Text = value;
}
}
private void ConvertGain(TextBox TxBx)
{
if (byte.TryParse(TxBx.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out byte value))
{
int gain;
if (value <= 0x0F)
gain = value * 2;
else
gain = 30 + (value - 0x0F) * 3;
TxBx.Text = $"{gain}dB";
} // if it is an invalid input keep text unchanged
}
private void txBxShutter_TextChanged(object sender, EventArgs e)
{
if (txBxShutter.Text.Contains("Stream")) // HD:IP Mk1 stream start message interpting queries
{
txBxShutter_Click(sender, e);
}
ConvertShutter(txBxShutter);
}
private void txBxIris_TextChanged(object sender, EventArgs e)
{
if (txBxIris.Text.Contains("Stream")) // HD:IP Mk1 stream start message interpting queries
{
txBxIris_Click(sender, e);
}
ConvertIris(txBxIris);
}
private void txBxGain_TextChanged(object sender, EventArgs e)
{
if (txBxGain.Text.Contains("Stream")) // HD:IP Mk1 stream start message interpting queries
{
txBxGain_Click(sender, e);
}
ConvertGain(txBxGain);
}
private void BtnDefConfig_Click(object sender, EventArgs e)
{
this.Enabled = false;
DefConfig = true;
BtnDefConfig.BackColor = SystemColors.ControlLightLight;
if (Encoder == EncoderManufacturer.IONODES_AVML) // HD:IP Mk1
{
anprSelect();
SendCmd("NZl", 1);
SendCmd("IIo", 1);
SendCmd("AMm", 1);
SendCmd("NCy", 1);
SendCmd("ARy", 1);
SendCmd("AF@30.0", 1);
SendCmd("AI@0A", 1);
checkRxMessage(txBxIris);
SendCmd("AG@05", 1);
checkRxMessage(txBxGain);
SendCmd("AS@0A", 1);
checkRxMessage(txBxShutter);
trackBarZoom.Value = 0;
Thread.Sleep(100);
UpdateZoom();
this.Enabled = true;
BtnDefConfig.BackColor = Color.LightGreen;
DefConfig = false;
return;
}
if (videoViewOV.MediaPlayer.IsPlaying == true) // HD:IP Mk2, FHD:IP Mk2, R49, R48
{
if (CameraSelected == SelectedCam.ANPR)
{
ovSelect(); // Also checks encoder and camera module
CamSetup(sender, e);
}
trackBarZoom.Value = 0;
UpdateZoom();
BtnDay_Click(sender, e); // day mode
BtnFocusMan_Click(sender, e); // Manual focus
ExpAuto_Click(sender, e); // Auto Exposure
if (CameraModule == Module.MC105) // R49 - MC-105
{
byte[] viscaWWMaxShutOn = VISCACommand(0x04, 0x3B, 0x02);
SendVISCA(viscaWWMaxShutOn); // Max shutter on
WaitMs(200);
byte[] viscaWWMaxShut = VISCACommand(0x04, 0x2F, 0x00, 0x00, 0x00, 0x0E);
SendVISCA(viscaWWMaxShut); // Max shutter 1/10000
WaitMs(200);
byte[] viscaWWMinShutOn = VISCACommand(0x04, 0x12, 0x02);
SendVISCA(viscaWWMinShutOn); // Min shutter on
WaitMs(200);
byte[] viscaWWMinShut = VISCACommand(0x04, 0x2E, 0x00, 0x00, 0x00, 0x08);
SendVISCA(viscaWWMinShut); // Min shutter 1/120
WaitMs(200);
byte[] viscaWWGainLim = VISCACommand(0x04, 0x2C, 0x02, 0x03);
SendVISCA(viscaWWGainLim); // Gain limit 23
WaitMs(200);
byte[] viscaWWIrisLim = VISCACommand(0x04, 0x24, 0x0B, 0x05, 0x0A);
SendVISCA(viscaWWIrisLim); // Min iris F1.7
WaitMs(200);
SendVISCA(viscaFocusManual); // Manual focus
WaitMs(200);
SendVISCA(viscaWDROffWW); // DWDR Off
WaitMs(500);
byte[] viscaWWSharp = VISCACommand(0x04, 0x42, 0x00, 0x00, 0x00, 0x04);
SendVISCA(viscaWWSharp); // Sharpness 4
WaitMs(500);
SendVISCA(viscaExpCompOn); // Exposure comp on
WaitMs(200);
byte[] viscaWWExpComp = VISCACommand(0x4E, 0x00, 0x00, 0x00, 0x07);
SendVISCA(viscaWWExpComp); // Exp comp 7
WaitMs(200);
byte[] viscaWWBright = VISCACommand(0x05, 0x5E, 0x00, 0x00, 0x00, 0x0A);
SendVISCA(viscaWWBright); // Brightness A
WaitMs(200);
byte[] viscaWWGamma = VISCACommand(0x04, 0x5B, 0x02);
SendVISCA(viscaWWGamma); // Gamma 2
WaitMs(200);
byte[] viscaWWContrast = VISCACommand(0x05, 0x5D, 0x00, 0x00, 0x00, 0x07);
SendVISCA(viscaWWContrast); // Contrast 7
WaitMs(200);
byte[] viscaWWChroma = VISCACommand(0x04, 0x13, 0x00, 0x00, 0x00, 0x0A);
SendVISCA(viscaWWChroma); // Chroma A
WaitMs(200);
byte[] viscaWWDNRon = VISCACommand(0x05, 0x53, 0x7F);
SendVISCA(viscaWWDNRon); // DNR on manual independent
WaitMs(200);
byte[] viscaWWDNR = VISCACommand(0x05, 0x53, 0x02, 0x00);
SendVISCA(viscaWWDNR); // DNR 2D 2
WaitMs(200);
byte[] viscaWWApContLvl = VISCACommand(0x04, 0x42, 0x00, 0x00, 0x00, 0x04);
SendVISCA(viscaWWApContLvl); // Aperture control 4
WaitMs(200);
byte[] viscaWWAntiSatOff = VISCACommand(0x04, 0x6B, 0x00, 0x00);
SendVISCA(viscaWWAntiSatOff); // Anti saturation off
WaitMs(200);
byte[] viscaWWWhiteBalance = VISCACommand(0x04, 0x35, 0x02);
SendVISCA(viscaWWWhiteBalance); // White balance outdoor
WaitMs(200);
byte[] viscaWWAEResponse = VISCACommand(0x04, 0x5D, 0x30);
SendVISCA(viscaWWAEResponse); // AE repsonse 30s
}
else if (CameraModule == Module.HZ5510) // HD:IP Mk2
{
byte[] viscaSharpnessDirectOV = VISCACommand(0x04, 0x42, 0x00, 0x00, 0x00, 0x05);
SendVISCA(viscaSharpnessDirectOV); // Sharpness = 5
byte[] viscaGammaDirectOV = VISCACommand(0x04, 0x5B, 0x01);
SendVISCA(viscaGammaDirectOV); // Gamma = 1
byte[] viscaContrastDirectOV = VISCACommand(0x71, 0x40, 0x07);
SendVISCA(viscaContrastDirectOV); // Contrast = 7
byte[] viscaAGCDirectOV = VISCACommand(0x70, 0x34, 0x04);
SendVISCA(viscaAGCDirectOV); //AGC max between 0-6 we want 176 on scale 0-255 which is approximetly equivilent to 4.
byte[] viscaGainLimDirect = VISCACommand(0x70, 0x34, 0x25);
SendVISCA(viscaGainLimDirect); // Gain limit 25
byte[] viscaShutterMinDirectA = VISCACommand(0x04, 0x13, 0x00, 0x00, 0x00, 0x08);
SendVISCA(viscaShutterMinDirectA); // Shutter limit 1/100
BtnExpCompOff_Click(sender, e); // Brightness mode off
byte[] viscaIrisLimDirect = VISCACommand(0x70, 0xD3, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0x00);
SendVISCA(viscaIrisLimDirect); // Iris Limit = just above default to all way open 70-F0.
BtnWDROn_Click(sender, e); // Wide Dynamic Range on
byte[] viscaWDRLvl = VISCACommand(0x70, 0x3A, 0x05);
SendVISCA(viscaWDRLvl); // WDR level = 05
byte[] viscaNRDirectOV = VISCACommand(0x04, 0x53, 0x00);
SendVISCA(viscaNRDirectOV); // Noise reduction off
}
else if (CameraModule == Module.HZ5512) // FHD:IP Mk2
{
byte[] viscaSharpnessDirectOV = VISCACommand(0x04, 0x42, 0x00, 0x00, 0x00, 0x0C);
SendVISCA(viscaSharpnessDirectOV); // Sharpness = C
byte[] viscaGammaDirectOV = VISCACommand(0x04, 0x5B, 0x01);
SendVISCA(viscaGammaDirectOV); // Gamma = 1
byte[] viscaContrastDirectOV = VISCACommand(0x71, 0x40, 0x0B);
SendVISCA(viscaContrastDirectOV); // Contrast = B
byte[] viscaAGCDirectOV = VISCACommand(0x70, 0x34, 0x04);
SendVISCA(viscaAGCDirectOV); // AGC max between 0-6 we want 176 on scale 0-255 which is approximetly equivilent to 4.
byte[] viscaGainLimDirect = VISCACommand(0x04, 0x2C, 0x23);
SendVISCA(viscaGainLimDirect); // Gain limit 23
byte[] viscaShutterMinDirectA = VISCACommand(0x04, 0x13, 0x00, 0x00, 0x00, 0x0A);
SendVISCA(viscaShutterMinDirectA); // Shutter limit 1/180
byte[] viscaAEResponse = VISCACommand(0x04, 0x5D, 0x30);
SendVISCA(viscaAEResponse); // Auto exposure response 30
BtnExpCompOn_Click(sender, e); // Brightness mode on
byte[] viscaExpCompDirectOV = VISCACommand(0x04, 0x4E, 0x00, 0x00, 0x00, 0x02);
SendVISCA(viscaExpCompDirectOV); // Brightness = 2
byte[] viscaSaturation = VISCACommand(0x71, 0x53, 0x10);
SendVISCA(viscaSaturation); // Saturation = 10
byte[] viscaWhiteBalance = VISCACommand(0x04, 0x35, 0x02);
SendVISCA(viscaWhiteBalance); // White balance = 2
byte[] viscaNRDirectOV = VISCACommand(0x04, 0x53, 0x00);
SendVISCA(viscaNRDirectOV); // Noise reduction off
}
TxBxSharp_Click(sender, e);
TxBxGamma_Click(sender, e);
TxBxContrast_Click(sender, e);
TxBxExpComp_Click(sender, e);
TxBxNR_Click(sender, e);
TxBxWDRLvl_Click(sender, e);
TxBxGainLim_Click(sender, e);
TxBxIrisLim_Click(sender, e);
TxBxShutLim_Click(sender, e);
FocusNow_Click(sender, e); // focus now
}
if (videoViewANPR.MediaPlayer.IsPlaying == true)
{
anprSelect(); // Also checks encoder and camera module
CamSetup(sender, e);
trackBarZoom.Value = 0;
UpdateZoom();
SendCmd("NC@1.00", 1);
PwrLow_Click(sender, e); // LED power to 1.00A
btnIllumOn_Click(sender, e);
BtnFocusMan_Click(sender, e); // Manual focus
ExpManual_Click(sender, e); // Manual mode
BtnNight_Click(sender, e); // Night mode
BtnExpCompOff_Click(sender, e); // Brightness mode off
byte[] viscaShutterDirect = VISCACommand(0x04, 0x4A, 0x00, 0x00, 0x00, 0x0F);
SendVISCA(viscaShutterDirect); // Shutter 1/1000th
byte[] viscaIrisDirect = VISCACommand(0x04, 0x4B, 0x00, 0x00, 0x00, 0x0C);
SendVISCA(viscaIrisDirect); // Iris F4
byte[] viscaGainDirect = VISCACommand(0x04, 0x4C, 0x00, 0x00, 0x00, 0x00);
SendVISCA(viscaGainDirect); // Gain 0db
if (CameraModule == Module.HZ5510) // HD:IP Mk2
{
byte[] viscaSharpnessDirectOV = VISCACommand(0x04, 0x42, 0x00, 0x00, 0x00, 0x05);
SendVISCA(viscaSharpnessDirectOV); // Sharpness 5
byte[] viscaContrastDirect = VISCACommand(0x71, 0x40, 0x12);
SendVISCA(viscaContrastDirect); // Contrast 12
}
else if (CameraModule == Module.HZ5512) // FHD:IP Mk2
{
byte[] viscaSharpnessDirectOV = VISCACommand(0x04, 0x42, 0x00, 0x00, 0x00, 0x07);
SendVISCA(viscaSharpnessDirectOV); // Sharpness 7
byte[] viscaContrastDirect = VISCACommand(0x71, 0x40, 0x14);
SendVISCA(viscaContrastDirect); // Contrast 14
}
byte[] viscaGammaDirect = VISCACommand(0x04, 0x5B, 0x03);
SendVISCA(viscaGammaDirect); // Gamma 3
byte[] viscaNRDirect = VISCACommand(0x04, 0x53, 0x00);
SendVISCA(viscaNRDirect); // Noise reduction off
txBxIris_Click(sender, e); // Reset values through btn clicks.
txBxGain_Click(sender, e);
txBxShutter_Click(sender, e);
TxBxSharp_Click(sender, e);
TxBxGamma_Click(sender, e);
TxBxContrast_Click(sender, e);
TxBxNR_Click(sender, e);
FocusNow_Click(sender, e);
}
this.Enabled = true;
BtnDefConfig.BackColor = Color.LightGreen;
DefConfig = false;
}
private void BtnFullscreenANPR_Click(object sender, EventArgs e)
{
if (FullscreenANPR == false)
{
LastLoc = new Point(this.Left, this.Top);
this.Location = new Point(0, 0);
this.FormBorderStyle = FormBorderStyle.None;
ActiveForm.Size = new Size(Screen.FromControl(this).Bounds.Width, Screen.FromControl(this).Bounds.Height);
videoViewANPR.Size = new Size(ActiveForm.Width, ActiveForm.Height);
videoViewANPR.Location = new Point(0, 0);
videoViewANPR.BringToFront();
GpBxANPR.Location = new Point(0, 0);
GpBxANPR.BringToFront();
BtnFullscreenANPR.Text = "Minimise";
BtnLVANPR.Enabled = false;
FullscreenANPR = true;
}
else
{
if (AdvancedOpen == true)
{
this.Size = new Size(1240, 745);
}
else
{
this.Size = new Size(960, 745);
}
if (LastLoc.X > 0 && LastLoc.X < this.Width && LastLoc.Y > 0 && LastLoc.Y < this.Height)
{
this.Location = LastLoc;
}
else
{
this.Location = new Point(0, 0);
}
this.FormBorderStyle = FormBorderStyle.FixedDialog;
GpBxANPR.Location = new Point(543, 400);
videoViewANPR.Size = new Size(400, 230);
videoViewANPR.Location = new Point(549, 505);
BtnFullscreenANPR.Text = "Fullscreen";
BtnLVANPR.Enabled = true;
FullscreenANPR = false;
}
}
private void BtnFullscreenOV_Click(object sender, EventArgs e)
{
if (FullscreenOV == false)
{
LastLoc = new Point(this.Left, this.Top);
this.Location = new Point(0, 0);
this.FormBorderStyle = FormBorderStyle.None;
ActiveForm.Size = new Size(Screen.FromControl(this).Bounds.Width, Screen.FromControl(this).Bounds.Height);
videoViewOV.Size = new Size(ActiveForm.Width, ActiveForm.Height);
videoViewOV.Location = new Point(0, 0);
videoViewOV.BringToFront();
GpBxOV.Location = new Point(0, 0);
GpBxOV.BringToFront();
BtnFullscreenOV.Text = "Minimise";
BtnLVOview.Enabled = false;
FullscreenOV = true;
}
else
{
if (AdvancedOpen == true)
{
this.Size = new Size(1240, 745);
}
else
{
this.Size = new Size(960, 745);
}
if (LastLoc.X > 0 && LastLoc.X < this.Width && LastLoc.Y > 0 && LastLoc.Y < this.Height)
{
this.Location = LastLoc;
}
else
{
this.Location = new Point(0, 0);
}
this.FormBorderStyle = FormBorderStyle.FixedDialog;
GpBxOV.Location = new Point(543, 30);
videoViewOV.Size = new Size(400, 230);
videoViewOV.Location = new Point(548, 136);
BtnFullscreenOV.Text = "Fullscreen";
BtnLVOview.Enabled = true;
FullscreenOV = false;
}
}
private void trackBarZoom_ValueChanged(object sender, EventArgs e)
{
txBxZoom2.Text = Convert.ToString(Convert.ToInt16(trackBarZoom.Value / 1638.4));
txBxZoom.Text = trackBarZoom.Value.ToString("X4");
}
private void trackBarFocus_ValueChanged(object sender, EventArgs e)
{
TxBxFocus2.Text = Convert.ToString(Convert.ToInt16((trackBarFocus.Value - 256) / 6502.4));
txBxFocus.Text = trackBarFocus.Value.ToString("X4");
}
private void TxBxGainLim_Click(object sender, EventArgs e)
{
SendVISCA(viscaInqGainLim, 1, TxBxGainLim, true);
TkBrGain.Value = Convert.ToInt16(int.Parse(TxBxGainLim.Text, NumberStyles.HexNumber) * 4.6);
}
private void BtnLVOview_Click(object sender, EventArgs e)
{
if (LVOV == false)
{
ActiveForm.Size = new Size(this.Width + sizedif, this.Height);
videoViewOV.Size = new Size(1113, 780);
videoViewOV.Location = new Point(195, 30);
videoViewOV.BringToFront();
GpBxOV.Location = new Point(195, 30);
GpBxOV.BringToFront();
BtnLVOview.Text = "Minimise";
GpBxAdCont.Location = new Point(GpBxAdCont.Location.X + sizedif, GpBxAdCont.Location.Y);
GpBxFrame.Location = new Point(GpBxFrame.Location.X + sizedif, GpBxFrame.Location.Y);
GpBxMins.Location = new Point(GpBxMins.Location.X + sizedif, GpBxMins.Location.Y);
GpBxOSD.Location = new Point(GpBxOSD.Location.X + sizedif, GpBxOSD.Location.Y);
LVOV = true;
BtnFullscreenOV.Enabled = false;
}
else
{
GpBxAdCont.Location = new Point(GpBxAdCont.Location.X - sizedif, GpBxAdCont.Location.Y);
GpBxFrame.Location = new Point(GpBxFrame.Location.X - sizedif, GpBxFrame.Location.Y);
GpBxOSD.Location = new Point(GpBxOSD.Location.X - sizedif, GpBxOSD.Location.Y);
GpBxMins.Location = new Point(GpBxMins.Location.X - sizedif, GpBxMins.Location.Y);
if (AdvancedOpen == true)
{
this.Size = new Size(1256, 780);
}
else
{
this.Size = new Size(980, 780);
}
GpBxOV.Location = new Point(543, 30);
videoViewOV.Size = new Size(400, 230);
videoViewOV.Location = new Point(548, 136);
BtnLVOview.Text = "Larger Video";
BtnFullscreenOV.Enabled = true;
LVOV = false;
}
}
private void BtnLVANPR_Click(object sender, EventArgs e)
{
if (LVANPR == false)
{
ActiveForm.Size = new Size(this.Width + sizedif, this.Height);
videoViewANPR.Size = new Size(1113, 780);
videoViewANPR.Location = new Point(195, 30);
videoViewANPR.BringToFront();
GpBxANPR.Location = new Point(195, 30);
GpBxANPR.BringToFront();
BtnLVANPR.Text = "Minimise";
GpBxAdCont.Location = new Point(GpBxAdCont.Location.X + sizedif, GpBxAdCont.Location.Y);
GpBxFrame.Location = new Point(GpBxFrame.Location.X + sizedif, GpBxFrame.Location.Y);
GpBxOSD.Location = new Point(GpBxOSD.Location.X + sizedif, GpBxOSD.Location.Y);
GpBxMins.Location = new Point(GpBxMins.Location.X + sizedif, GpBxMins.Location.Y);
LVANPR = true;
BtnFullscreenANPR.Enabled = false;
}
else
{
GpBxAdCont.Location = new Point(GpBxAdCont.Location.X - sizedif, GpBxAdCont.Location.Y);
GpBxFrame.Location = new Point(GpBxFrame.Location.X - sizedif, GpBxFrame.Location.Y);
GpBxOSD.Location = new Point(GpBxOSD.Location.X - sizedif, GpBxOSD.Location.Y);
GpBxMins.Location = new Point(GpBxMins.Location.X - sizedif, GpBxMins.Location.Y);
if (AdvancedOpen == true)
{
this.Size = new Size(1256, 780);
}
else
{
this.Size = new Size(980, 780);
}
GpBxANPR.Location = new Point(543, 400);
videoViewANPR.Size = new Size(400, 230);
videoViewANPR.Location = new Point(549, 505);
BtnLVANPR.Text = "Larger Video";
BtnFullscreenANPR.Enabled = true;
LVANPR = false;
}
}
private void BtnWebpage_Click(object sender, EventArgs e)
{
CamIP = IPMatch(comboBox_Devices2, txBxManualIpOv);
Process.Start("http://" + CamIP);
}
private void BtnWebpageANPR_Click(object sender, EventArgs e)
{
CamIP = IPMatch(comboBox_Devices, txBxManualIP);
Process.Start("http://" + CamIP);
}
private void btnPsuOn_Click(object sender, EventArgs e)
{
BtnSetPSU_Click(sender, e); // Makes sure it is off, then sets voltage and current limits.
Thread.Sleep(500);
if (SendDataPsu("OP1 1"))
{
btnPsuOff.BackColor = Color.Transparent;
btnPsuOn.BackColor = Color.Green;
}
}
private void btnPsuOff_Click(object sender, EventArgs e)
{
if (SendDataPsu("OP1 0"))
{
btnPsuOff.BackColor = Color.Green;
btnPsuOn.BackColor = Color.Transparent;
}
}
private void BtnSetPSU_Click(object sender, EventArgs e)
{
btnPsuOff_Click(sender, e);
SendDataPsu("I1 3.5");
SendDataPsu("V1 15");
}
private bool SendDataPsu(string dataTx)
{
if (TxBxPSUIP.BackColor == Color.Red)
{
MessageBox.Show("Not a valid PSU IP address");
return false;
}
Socket psuSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
if (!psuSocket.Connected)
{
try
{
IAsyncResult result = psuSocket.BeginConnect(TxBxPSUIP.Text, 9221, null, null);
bool success = result.AsyncWaitHandle.WaitOne(1000, true);
if (!psuSocket.Connected)
{
psuSocket.Close();
return false;
}
}
catch
{
psuSocket.Close();
return false;
}
}
try
{
psuSocket.Send(Encoding.ASCII.GetBytes(dataTx + "\n"));
}
catch
{
return false;
}
psuSocket.Close();
return true;
}
private void AdjustIrisLimit(int delta, object sender, EventArgs e)
{
if (delta < 0)
BtnIrisLimDown.Enabled = true;
else
BtnIrisLimUp.Enabled = true;
if (TxBxIrisLim.Text.Length == 0)
{
TxBxIrisLim_Click(sender, e);
WaitMs(100);
}
int IrisLimValue = int.Parse(IrisLimitHex, NumberStyles.HexNumber) - delta;
if (!IrisLimDirect(IrisLimValue)) // Sends direct of returns false if iris limit out of range
{
IrisLimitHex = "0A";
IrisLimValue = int.Parse(IrisLimitHex, NumberStyles.HexNumber) - 1;
IrisLimDirect(IrisLimValue);
}
TxBxIrisLim_Click(sender, e);
}
private void BtnIrisLimUp_Click(object sender, EventArgs e)
{
AdjustIrisLimit(-1, sender, e); // Limit is reversed
}
private void BtnIrisLimDown_Click(object sender, EventArgs e)
{
AdjustIrisLimit(1, sender, e); // Limit is reversed
}
private bool IrisLimDirect(int IrisLimValue)
{
if (IrisLimValue >= 0 && IrisLimValue <= 20)
{
if (CameraModule == Module.MC105) // Does iris min and max, only min is malleable
{
byte[] viscaIrisLimDirect = VISCACommand(0x05, 0x24, 0x4B, 0x01, 0x00, Convert.ToByte(IrisLimValue), 0x11);
SendVISCA(viscaIrisLimDirect);
}
else
{
byte[] viscaIrisLimDirect = VISCACommand(0x70, 0xD3, 0x00, 0x00, 0x00, 0x00, Convert.ToByte(IrisLimValue), 0x00, Convert.ToByte(IrisLimValue), 0x00);
SendVISCA(viscaIrisLimDirect);
}
return true;
}
return false;
}
private void TxBxIrisLim_Click(object sender, EventArgs e)
{
BtnIrisLimUp.Enabled = BtnIrisLimDown.Enabled = true;
if (CameraModule == Module.MC105)
{
SendVISCA(viscaInqIrisLimWW, 4, TxBxIrisLim, true);
}
else
{
SendVISCA(viscaInqIrisLim, 4, TxBxIrisLim, true);
}
try // In case inquiry fails.
{
TxBxIrisLim.Text = TxBxIrisLim.Text.Substring(0, 2);
IrisLimitHex = TxBxIrisLim.Text;
ConvertIris(TxBxIrisLim);
if (TxBxIrisLim.Text == "F22")
{
BtnIrisLimUp.Enabled = false;
}
if (TxBxIrisLim.Text == "F2.4")
{
BtnIrisLimDown.Enabled = false;
}
}
catch { }
}
private void DisableTibboControls()
{
TkBarLED.Enabled = TxBxLEDCurrent.Enabled = GpBxSerial.Enabled = gbBx4ChMonitor.Enabled = gbxIlluminator.Enabled = false;
stopLedMonitor();
richTxBxRxCmd.Text = TxBxRxErrMssg.Text = "";
btnIllumOn.BackColor = btnIllumOff.BackColor = BtnColour;
if (serialPort1.IsOpen)
{
serialPort1.Close();
btnClosePort.BackColor = BtnColour;
btnClosePort.Text = "Open Last Port";
foreach (ToolStripMenuItem item in tsmenuSelectCom.DropDownItems) // clear currently checked items
{
item.Checked = false;
}
tsmenuSelectCom.Text = "Select COM Port";
tsmenuSelectCom.BackColor = BtnColour;
GetPorts();
}
else
{
if (selectedPort == "")
{
MessageBox.Show("No port selected", "Port select");
return;
}
foreach (ToolStripMenuItem item in tsmenuSelectCom.DropDownItems)
{
if (item.Text == selectedPort)
{
item.Checked = true;
}
else
{
item.Checked = false;
}
}
btnClosePort.Text = "Close Port";
btnClosePort.BackColor = Color.LightGreen;
serialPort1.Open();
}
}
private void EnableTibboControls()
{
TkBarLED.Enabled = TxBxLEDCurrent.Enabled = GpBxSerial.Enabled = gbBx4ChMonitor.Enabled = gbxIlluminator.Enabled = true;
}
private void TxBxManVISCA_Click(object sender, EventArgs e)
{
if (TxBxManVISCA.Text == "81 xx xx xx xx FF")
{
TxBxManVISCA.Text = "";
}
}
private void TxBxManVISCA_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13 && BtnSendVISCA.Enabled == true) // Hit enter and string is valid
{
BtnSendVISCA_Click(sender, e);
}
}
private void TxBxManVISCA_TextChanged(object sender, EventArgs e)
{
BtnSendVISCA.Enabled = false;
if (RegexVISCA.IsMatch(TxBxManVISCA.Text))
{
BtnSendVISCA.Enabled = true;
}
}
private void BtnSendVISCA_Click(object sender, EventArgs e)
{
if (RegexVISCA.IsMatch(TxBxManVISCA.Text))
{
string ManualVISCAString = TxBxManVISCA.Text.Replace(" ", "").ToUpper();
string AVML_VAR = "#" + ManualVISCAString; // For HD:IP Mk1
byte[] ManVISCA = { 0x01, 0x10, 0x00, Convert.ToByte(ManualVISCAString.Length / 2), 0x00, 0x00, 0x00, 0x01 };
byte[] OtherByteArray = TxBxManVISCA.Text.Split(' ').Select(item => Convert.ToByte(item, 16)).ToArray();
byte[] ManToSend = Combine(ManVISCA, OtherByteArray);
SendVISCA(ManToSend, 0, TxBxRecManVISCA, false, AVML_VAR, 1);
}
else
{
MessageBox.Show("Incorrect format, please use format" + Environment.NewLine + "'81 xx xx xx xx FF'");
}
}
public static byte[] Combine(byte[] first, byte[] second)
{
byte[] bytes = new byte[first.Length + second.Length];
Buffer.BlockCopy(first, 0, bytes, 0, first.Length);
Buffer.BlockCopy(second, 0, bytes, first.Length, second.Length);
return bytes;
}
private void TkBrGain_MouseUp(object sender, MouseEventArgs e)
{
if (CameraModule == Module.MC105)
{
byte b = Convert.ToByte(TkBrGain.Value); // b == 0xpq
byte p = (byte)((b >> 4) & 0x0F); // 0x0p (upper nibble)
byte q = (byte)(b & 0x0F); // 0x0q (lower nibble)
byte[] viscaWWGainLim = VISCACommand(0x04, 0x2C, p, q);
SendVISCA(viscaWWGainLim);
}
else
{
byte[] viscaGainLimDirect = VISCACommand(0x04, 0x2C, Convert.ToByte(TkBrGain.Value));
SendVISCA(viscaGainLimDirect);
}
TxBxGainLim_Click(sender, e);
}
private void TkBrShutLim_MouseUp(object sender, MouseEventArgs e)
{
SendVISCA(viscaMinShutterOn);
byte value = (byte)TkBrShutLim.Value;
// Encode value into two bytes, big-endian
byte high = (byte)((value >> 4) & 0x0F);
byte low = (byte)(value & 0x0F);
byte[] ShutterLimVISCA = VISCACommand(0x04, 0x13, 0x00, 0x00, high, low);
SendVISCA(ShutterLimVISCA);
TxBxShutLim_Click(sender, e);
}
private void TxBxShutLim_Click(object sender, EventArgs e)
{
SendVISCA(viscaMinShutterInq, 2, TxBxShutLim, false);
try
{
TkBrShutLim.Value = Convert.ToInt32(TxBxShutLim.Text, 16);
}
catch
{
byte[] viscaShutterMinDirect = VISCACommand(0x04, 0x13, 0x00, 0x00, 0x00, Convert.ToByte(TkBrShutLim.Value));
SendVISCA(viscaShutterMinDirect);
SendVISCA(viscaMinShutterInq, 2, TxBxShutLim, false);
try
{
TkBrShutLim.Value = Convert.ToInt32(TxBxShutLim.Text, 16);
}
catch { }
}
ConvertShutter(TxBxShutLim);
}
private void BtnDISOn_Click(object sender, EventArgs e)
{
SendVISCA(viscaDISOn);
BtnDISOn.BackColor = Color.LightGreen;
BtnDISOff.BackColor = BtnColour;
}
private void BtnDISOff_Click(object sender, EventArgs e)
{
SendVISCA(viscaDISOff);
BtnDISOff.BackColor = Color.LightGreen;
BtnDISOn.BackColor = BtnColour;
}
private string IPMatch(ComboBox CmBx, TextBox TxBx)
{
if (RegexIPPattern.IsMatch(CmBx.Text)) // Combobox has valid IP address
{
return CmBx.Text;
}
else if (RegexIPPattern.IsMatch(TxBx.Text)) // Manual textbox has valid IP address
{
return TxBx.Text;
}
else // Don't know what IP address to use
{
MessageBox.Show("Please select a camera");
return "False";
}
}
private void BtnSetH264_Click(object sender, EventArgs e)
{
BtnSetH264.BackColor = SystemColors.ControlLightLight;
CamIP = IPMatch(comboBox_Devices2, txBxManualIpOv);
if (CamIP == "False")
{
return;
}
string Resolution = "1280x720";
string gopSize = "30";
if (CameraModule == Module.HZ5512 || CameraModule == Module.MC105)
{
Resolution = "1920x1080";
gopSize = "45";
}
string responseText = HTTPAPIrequest(CamIP, $"/cgi-bin/action.fcgi?api=set_setup.video.codec&codec0=h264&profile0=High&resolution0={Resolution}&fps0=30&gopsize0={gopSize}&bitctrl0=VBR&image_quality0=mid&bitavr0=10000&ff_mode=60");
if (!responseText.Contains("return_code=0x00000000"))
{
MessageBox.Show("API failure setting H264. Code: " + responseText.Substring(responseText.IndexOf("return_code"), 22));
}
BtnSetH264.BackColor = Color.LightGreen;
}
private void BtnSetMJPEGANPR_Click(object sender, EventArgs e)
{
BtnSetMJPEGANPR.BackColor = SystemColors.ControlLightLight;
CamIP = IPMatch(comboBox_Devices, txBxManualIP);
if (CamIP == "False")
{
return;
}
string Resolution = "1280x720";
if (CameraModule == Module.HZ5512)
{
Resolution = "1920x1080";
}
string responseText = HTTPAPIrequest(CamIP, $"/cgi-bin/action.fcgi?api=set_setup.video.codec&codec0=mjpeg&resolution0={Resolution}&fps0=15&jpegqual=65&ff_mode=60");
if (!responseText.Contains("return_code=0x00000000"))
{
MessageBox.Show("API failure setting MJPEG. Code: " + responseText.Substring(responseText.IndexOf("return_code"), 22));
}
BtnSetMJPEGANPR.BackColor = Color.LightGreen;
}
private void BtnSetIPOV_Click(object sender, EventArgs e)
{
SetIP("112", "254", comboBox_Devices2, txBxManualIpOv, BtnSetIPOV);
}
private void BtnSetIPANPR_Click(object sender, EventArgs e)
{
SetIP("111", "254", comboBox_Devices, txBxManualIP, BtnSetIPANPR);
}
private void SetIP(string IP, string gateway, ComboBox CBx, TextBox TxBx, Button Btn)
{
Btn.BackColor = SystemColors.ControlLightLight;
CamIP = IPMatch(CBx, TxBx);
if (CamIP == "False")
{
return;
}
string responseText = HTTPAPIrequest(CamIP, $"/cgi-bin/action.fcgi?api=set_setup.network.ipsetup&dhcpon=no&ipaddr=192.168.1.{IP}&subnet=255.255.255.0&gateway=192.168.1.{gateway}");
if (!responseText.Contains("return_code=0x00000000"))
{
MessageBox.Show("API failure setting IP. Code: " + responseText.Substring(responseText.IndexOf("return_code"), 22));
}
Btn.BackColor = Color.LightGreen;
}
private void TxBxGainLim_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13 && TxBxGainLim.Text.Length < 3 && MAVCopy == true)
{
try
{
TkBrGain.Value = Convert.ToInt16(TxBxGainLim.Text, 16);
}
catch { }
}
}
private void BtnWDROn_Click(object sender, EventArgs e)
{
if (CameraModule == Module.MC105)
{
SendVISCA(viscaWDROnWW); // Wide Dynamic Range on
SendVISCA(viscaWDRManualWW); // Manual mode
SendVISCA(viscaWDRInqWW, 1, TxBxReply, false);
}
else
{
SendVISCA(viscaWDROn); // Wide Dynamic Range on
SendVISCA(viscaWDRInq, 2, TxBxReply, false);
}
BtnWDRLvlDown.Enabled = BtnWDRLvlUp.Enabled = true;
if (TxBxReply.Text.Contains("2"))
{
BtnWDROn.BackColor = Color.LightGreen;
BtnWDROff.BackColor = SystemColors.ControlLightLight;
BtnBrightnessReset.Enabled = BtnExpCompDown.Enabled = BtnExpCompOff.Enabled = BtnExpCompOn.Enabled = BtnExpCompUp.Enabled =
TxBxExpComp.Enabled = btnIrisClose.Enabled = txBxIris.Enabled = btnIrisUp.Enabled = BtnGainDown.Enabled =
txBxGain.Enabled = BtnGainUp.Enabled = BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled = false;
txBxShutter.Text = txBxGain.Text = txBxIris.Text = "-";
TxBxWDRLvl_Click(sender, e);
BtnExpManual.BackColor = BtnAutoExp.BackColor = BtnExpShtrPri.BackColor = BtnColour;
}
}
private void BtnWDROff_Click(object sender, EventArgs e)
{
if (CameraModule == Module.MC105)
{
SendVISCA(viscaWDROffWW); // Wide Dynamic Range on
SendVISCA(viscaWDRInqWW, 1, TxBxReply, false);
}
else
{
SendVISCA(viscaWDROff); // Wide Dynamic Range on
SendVISCA(viscaWDRInq, 2, TxBxReply, false);
}
BtnWDRLvlDown.Enabled = BtnWDRLvlUp.Enabled = false;
TxBxWDRLvl.Text = "-";
if (TxBxReply.Text.Contains("3"))
{
BtnWDROff.BackColor = Color.LightGreen;
BtnWDROn.BackColor = SystemColors.ControlLightLight;
BtnBrightnessReset.Enabled = BtnExpCompDown.Enabled = BtnExpCompOff.Enabled = BtnExpCompOn.Enabled = BtnExpCompUp.Enabled =
TxBxExpComp.Enabled = btnIrisClose.Enabled = txBxIris.Enabled = btnIrisUp.Enabled = BtnGainDown.Enabled =
txBxGain.Enabled = BtnGainUp.Enabled = BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled = true;
SendVISCA(viscaInqExpMode, 2, TxBxReply, false, "AM?", 1);
if (TxBxReply.Text.Contains("0"))
{
BtnAutoExp.BackColor = Color.LightGreen;
BtnExpManual.BackColor = BtnExpShtrPri.BackColor = BtnColour;
btnIrisClose.Enabled = txBxIris.Enabled = btnIrisUp.Enabled = BtnGainDown.Enabled = txBxGain.Enabled =
BtnGainUp.Enabled = BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled = false;
txBxShutter.Text = txBxGain.Text = txBxIris.Text = "-";
TxBxGainLim.Enabled = TkBrGain.Enabled = true;
TxBxGainLim_Click(sender, e);
TxBxShutLim_Click(sender, e);
}
else if (TxBxReply.Text.Contains("3"))
{
BtnExpManual.BackColor = Color.LightGreen;
BtnAutoExp.BackColor = BtnExpShtrPri.BackColor = BtnColour;
btnIrisClose.Enabled = txBxIris.Enabled = btnIrisUp.Enabled = BtnGainDown.Enabled = txBxGain.Enabled =
BtnGainUp.Enabled = BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled = true;
TxBxGainLim.Enabled = TkBrGain.Enabled = false;
TxBxGainLim.Text = "-";
txBxIris_Click(sender, e);
txBxGain_Click(sender, e);
txBxShutter_Click(sender, e);
}
else if (TxBxReply.Text.Contains("A"))
{
BtnExpShtrPri.BackColor = Color.LightGreen;
BtnAutoExp.BackColor = BtnExpManual.BackColor = BtnColour;
btnIrisClose.Enabled = txBxIris.Enabled = btnIrisUp.Enabled = BtnGainDown.Enabled = txBxGain.Enabled = BtnGainUp.Enabled = false;
BtnShutterDown.Enabled = txBxShutter.Enabled = BtnShutterUp.Enabled = TxBxGainLim.Enabled = TkBrGain.Enabled = true;
txBxGain.Text = txBxIris.Text = "-";
txBxShutter_Click(sender, e);
TxBxGainLim_Click(sender, e);
TxBxShutLim_Click(sender, e);
}
}
}
private void BtnCMSet_Click(object sender, EventArgs e)
{
SendCmd("CM@GE67SA", 1);
}
private void BtnCMQuery_Click(object sender, EventArgs e)
{
SendCmd("CM?", 1);
}
private int Clamp(int val, int min, int max)
{
if (val.CompareTo(min) < 0) return min;
else if (val.CompareTo(max) > 0) return max;
else return val;
}
private void WWDWDRChange(bool wider, object sender, EventArgs e)
{
int WDRValueBright = int.Parse(TxBxWDRLvl.Text.Substring(0, TxBxWDRLvl.Text.IndexOf(" ")), NumberStyles.HexNumber);
int WDRValueDark = int.Parse(TxBxWDRLvl.Text.Substring(TxBxWDRLvl.Text.LastIndexOf(" ") + 1), NumberStyles.HexNumber);
if (wider)
{
WDRValueBright -= 1;
WDRValueDark += 1;
}
else
{
WDRValueBright += 1;
WDRValueDark -= 1;
}
WDRValueBright = Clamp(WDRValueBright, 1, 15);
WDRValueDark = Clamp(WDRValueDark, 1, 15);
byte BrightByte = Convert.ToByte(WDRValueBright);
byte DarkByte = Convert.ToByte(WDRValueDark);
byte[] viscaWWDWDRBright = VISCACommand(0x04, 0x1A, 0x50, 0x00, BrightByte);
SendVISCA(viscaWWDWDRBright);
byte[] viscaWWDWDRDark = VISCACommand(0x04, 0x1A, 0x40, 0x00, DarkByte);
SendVISCA(viscaWWDWDRDark);
Thread.Sleep(100);
TxBxWDRLvl_Click(sender, e);
}
private void BtnWDRLvlUp_Click(object sender, EventArgs e)
{
AdjustWDRLevel(+1, sender, e);
}
private void BtnWDRLvlDown_Click(object sender, EventArgs e)
{
AdjustWDRLevel(-1, sender, e);
}
private void AdjustWDRLevel(int delta, object sender, EventArgs e)
{
if (TxBxWDRLvl.Text == null)
{
TxBxWDRLvl_Click(sender, e);
}
if (CameraModule == Module.MC105)
{
WWDWDRChange(delta > 0, sender, e);
return;
}
int WDRValue;
try
{
WDRValue = Convert.ToInt16(TxBxWDRLvl.Text) + delta;
}
catch
{
WDRValue = int.Parse(TxBxWDRLvl.Text, NumberStyles.HexNumber) + delta;
}
if (WDRValue >= 0 && WDRValue <= 29)
{
byte Lvl = Convert.ToByte(WDRValue);
byte[] viscaWDRLvl = VISCACommand(0x70, 0x3A, Lvl);
SendVISCA(viscaWDRLvl);
}
TxBxWDRLvl_Click(sender, e);
}
private void TxBxWDRLvl_Click(object sender, EventArgs e)
{
if (CameraModule == Module.KTnC || CameraModule == Module.HZ5510 || CameraModule == Module.HZ5512)
{
SendVISCA(viscaWDRLevelInq, 1, TxBxWDRLvl, true);
}
else if (CameraModule == Module.MC105)
{
SendVISCA(viscaWDRLvllInqBWW, 1, TxBxReply, true); // Bright
SendVISCA(viscaWDRLvllInqDWW, 1, TxBxWDRLvl, true); // Dark
TxBxWDRLvl.Text = TxBxReply.Text + " - " + TxBxWDRLvl.Text;
}
}
private void PrintToZebra(string stingToPrint)
{
if (TxBxZebraIP.BackColor == Color.Red)
{
MessageBox.Show("Not a valid Zebra IP address");
return;
}
try
{
TcpClient client = new TcpClient(); // Open connection
client.Connect(TxBxZebraIP.Text, 9100);
StreamWriter writer = new StreamWriter(client.GetStream()); // Write ZPL String to connection
writer.Write(stingToPrint);
writer.Flush();
writer.Close(); // Close Connection
client.Close();
}
catch
{
MessageBox.Show("Failed to print");
}
}
private void UpdateSpreadSheet(string model)
{
string streamPath = @"G:\Shared drives\MAV Production GUI's\RMA GUI\client_secret_RMA.json";
string credPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string[] Scopes = { SheetsService.Scope.Spreadsheets };
UserCredential credential;
using (FileStream stream = new FileStream(streamPath, FileMode.Open, FileAccess.Read))
{
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.FromStream(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)).Result;
}
SheetsService service = new SheetsService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Google Sheets API .NET Quickstart",
});
string spreadsheetId = "12wl8BF5AXRMNNgs7_S8Ipneur9AG2iI0jQFzf75J4Wc"; // HD:IP Mk2 by default
string camdesc = "Camera - MAV HD:IP MK2, Dual Zoom 10x HD";
if (model == "YT65JG")
{
spreadsheetId = "1nrdMrUnmO4WrZkZCKgnGlCRxFniQ4YhgYPShPN0bygM"; // FHD:IP Mk2
camdesc = "Camera - Rapier FHD:IP Dual Zoom 12x FHD/1080p IP Encoders.";
}
IList<IList<object>> values = service.Spreadsheets.Values.Get(spreadsheetId, "B1:B").Execute().Values;
if (values != null && values.Count > 0)
{
int nextRow = values.Count + 1;
string lastSerialNumberLocation = "B" + Convert.ToString(values.Count) + ":B" + Convert.ToString(values.Count);
values = service.Spreadsheets.Values.Get(spreadsheetId, lastSerialNumberLocation).Execute().Values;
if (values != null && values.Count > 0)
{
string lastSerialNumberString = "";
foreach (IList<object> row in values)
{
lastSerialNumberString = Convert.ToString(row[0]);
}
try
{
int newSerialNumberInt = Convert.ToInt32(lastSerialNumberString.Substring(1).Replace(" ", "")) + 1;
newSerialNumberString = "K" + Convert.ToString(newSerialNumberInt);
}
catch
{
TestFail("Integer conversion failure");
}
string date = DateTime.Now.ToString().Substring(0, 10);
List<object> oblistAF = new List<object>() { model, newSerialNumberString, camdesc, date, SoftwareVer };
ValueRange ValueRange = new ValueRange { Values = new List<IList<object>> { oblistAF } };
SpreadsheetsResource.ValuesResource.UpdateRequest Update = service.Spreadsheets.Values.Update(ValueRange, spreadsheetId, "A" + nextRow + ":F" + nextRow);
Update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW;
Update.Execute();
ValueRange ValueRangeNotes = new ValueRange { Values = new List<IList<object>> { new List<object>() { "GUI Version: " + GUIVersion } } };
SpreadsheetsResource.ValuesResource.UpdateRequest UpdateNotes = service.Spreadsheets.Values.Update(ValueRangeNotes, spreadsheetId, "K" + nextRow);
UpdateNotes.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW;
UpdateNotes.Execute();
ValueRange ValueRangeESV = new ValueRange { Values = new List<IList<object>> { new List<object>() { EncoderSoftVer } } };
SpreadsheetsResource.ValuesResource.UpdateRequest UpdateESV = service.Spreadsheets.Values.Update(ValueRangeESV, spreadsheetId, "P" + nextRow);
UpdateESV.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW;
UpdateESV.Execute();
}
}
}
private bool CheckCamReboot(object sender, EventArgs e)
{
bool camFound = false;
timerCheckReboot.Enabled = true;
while (camFound == false && timerCheckReboot.Enabled == true)
{
Application.DoEvents();
try
{
if (PingIP("192.168.1.111") && PingIP("192.168.1.112"))
{
WaitMs(5000);
DiscoverEncoders(sender, e);
bool Found111 = false;
bool Found112 = false;
foreach (object OBJ in comboBox_Devices.Items)
{
if (OBJ.ToString() == "192.168.1.111")
{
Found111 = true;
}
else if (OBJ.ToString() == "192.168.1.112")
{
Found112 = true;
}
}
if (Found111 == true && Found112 == true)
{
camFound = true;
break;
}
else
{
Found111 = Found112 = false; // If both aren't found at the same time, continue waiting.
}
}
}
catch { }
Thread.Sleep(50);
}
return camFound;
}
private bool PingIP(string ipAddress)
{
try
{
Ping myPing = new Ping();
PingReply reply = myPing.Send(ipAddress, 500);
if (reply != null && reply.Status.ToString() == "Success")
{
return true;
}
}
catch { }
return false;
}
private void FillMonitor(object sender, EventArgs e)
{
BtnFillMon.BackColor = Color.FromArgb(192, 255, 255);
bool TestGood = true;
timerMonitor.Interval = 100; // Run monitor and check values.
BtnStartMon_Click(sender, e);
while (monitorCount != 9)
{
WaitMs(10);
}
cancelMonitor = true;
WaitMs(100);
timerMonitor.Interval = 500;
this.Refresh();
double Ch1Voltage;
double Ch2Voltage;
double Ch1Current;
double Ch2Current;
double Ch1Duty;
double Ch2Duty;
double Framerate;
double Temperature;
try
{
Ch1Voltage = Convert.ToDouble(txBxLedVCh1.Text.Substring(0, 4));
Ch2Voltage = Convert.ToDouble(txBxLedVCh2.Text.Substring(0, 4));
Ch1Current = Convert.ToDouble(txBxLedICh1.Text.Substring(0, 4));
Ch2Current = Convert.ToDouble(txBxLedICh2.Text.Substring(0, 4));
Ch1Duty = Convert.ToDouble(txBxDutyCh1.Text.Substring(0, 4));
Ch2Duty = Convert.ToDouble(txBxDutyCh2.Text.Substring(0, 4));
Framerate = Convert.ToDouble(txBxFrame.Text.Substring(0, 4));
Temperature = Convert.ToInt16(txBxPcbTemp.Text.Substring(0, txBxPcbTemp.Text.IndexOf("°")));
}
catch
{
MessageBox.Show("Could not convert monitor to readable values");
return;
}
int Vmin = 28;
int Vmax = 37;
double Imin = 3.3;
double Imax = 3.6;
if (Ch1Duty < 1.5 || Ch1Duty >= 1.8)
{
MessageBox.Show("Channel 1 Duty cycle out of specification " + txBxDutyCh1.Text);
TestGood = false;
}
if (Ch2Duty < 1.5 || Ch2Duty >= 1.8)
{
txBxDutyCh2.BackColor = Color.Red;
txBxDutyCh2.ForeColor = Color.White;
MessageBox.Show("Channel 2 Duty cycle out of specification " + txBxDutyCh2.Text);
TestGood = false;
}
if (Ch1Duty != 1.80) // 1.8uS means its maxed so V and I is irrelevant because duty is maxed out
{
if (Ch1Voltage < Vmin || Ch1Voltage > Vmax)
{
MessageBox.Show("Channel 1 Voltage out of specification V = " + Ch1Voltage);
TestGood = false;
}
if (Ch1Current < Imin || Ch1Current > Imax)
{
MessageBox.Show("Channel 1 LED current out of specification " + Ch1Current + "A");
TestGood = false;
}
}
if (Ch2Duty != 1.80) // 1.8uS means its maxed so V and I is irrelevant because duty is maxed out
{
if (Ch2Voltage < Vmin || Ch2Voltage > Vmax)
{
MessageBox.Show("Channel 2 Voltage out of specification V = " + Ch2Voltage);
TestGood = false;
}
if (Ch2Current < Imin || Ch2Current > Imax)
{
MessageBox.Show("Channel 2 LED current out of specification " + Ch2Current + "A");
TestGood = false;
}
}
if (Math.Abs(Framerate - 30) >= 0.5)
{
MessageBox.Show("Frame rate out of specification FPS= " + txBxFrame.Text);
TestGood = false;
}
if (Temperature <= 5 || Temperature >= 71)
{
MessageBox.Show("Temperature out of specification = " + txBxPcbTemp.Text);
TestGood = false;
}
if (TxBxGigEANPRStatus.BackColor == Color.Red || TxBxGigEOviewStatus.BackColor == Color.Red || TxBxGigETibboStatus.BackColor == Color.Red || TxBxGigEOutStatus.BackColor == Color.Red || TxBxGigER48Status.BackColor == Color.Red)
{
MessageBox.Show("Switch speeds are not correct, see red monitor box");
TestGood = false;
}
if (TestGood == true)
{
BtnFillMon.BackColor = Color.LightGreen;
}
}
private void BtnFillMon_Click(object sender, EventArgs e)
{
FillMonitor(sender, e);
}
private void TestFail(string errMssg)
{
DialogResult dialogResult = MessageBox.Show(errMssg + Environment.NewLine + "Do you wish to continue?", "Test Fail!", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.No)
{
Application.Restart();
}
}
private string CheckEncoderFirmwareVer(string CamIPAddress)
{
try
{
string responseText = HTTPAPIrequest(CamIPAddress, "/cgi-bin/action.fcgi?api=get_setup.system.info");
int startIndex = responseText.IndexOf("swver") + 7;
int EndIndex = responseText.IndexOf(Environment.NewLine, startIndex);
return responseText.Substring(startIndex, EndIndex - startIndex);
}
catch
{
return "UNKNOWN";
}
}
private string HTTPAPIrequest(string IP, string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://ADMIN:1234@" + IP + url);
request.Credentials = new NetworkCredential("ADMIN", "1234");
StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.ASCII);
return reader.ReadToEnd();
}
private void SIGCheck(VideoView VLCVV)
{
SendVISCA(viscaExpManual, "AMm"); // Exposure manual without dialog box on button click.
byte[] viscaShutterDirect = VISCACommand(0x04, 0x4A, 0x00, 0x00, 0x00, 0x09);
SendVISCA(viscaShutterDirect); //Shutter 1/125th
byte[] viscaGainDirect = VISCACommand(0x04, 0x4C, 0x00, 0x00, 0x00, 0x01);
SendVISCA(viscaGainDirect); //Gain 2db
byte[] viscaIrisDirect = VISCACommand(0x04, 0x4B, 0x00, 0x00, 0x00, 0x0F);
SendVISCA(viscaIrisDirect); //Iris F2.4
Thread.Sleep(3000);
VLCVV.MediaPlayer.TakeSnapshot(0, $"{TxtFileDir}CONTROL.jpg", 1280, 720); // Control image with default brightness
byte[] viscaShutterDirectLow = VISCACommand(0x04, 0x4A, 0x00, 0x00, 0x00, 0x04);
SendVISCA(viscaShutterDirectLow); //Shutter 1/15th
Thread.Sleep(3000);
VLCVV.MediaPlayer.TakeSnapshot(0, $"{TxtFileDir}SHUTTER.jpg", 1280, 720); // Brighter through shutter
SendVISCA(viscaShutterDirect); // Shutter 1/125th, back to control
byte[] viscaGainDirectLow = VISCACommand(0x04, 0x4C, 0x00, 0x00, 0x01, 0x04);
SendVISCA(viscaGainDirectLow); // Gain 45db
Thread.Sleep(3000);
VLCVV.MediaPlayer.TakeSnapshot(0, $"{TxtFileDir}GAIN.jpg", 1280, 720); // Brighter through gain
SendVISCA(viscaGainDirect); // Gain 2db, back to control
byte[] viscaIrisDirectSmall = VISCACommand(0x04, 0x4B, 0x00, 0x00, 0x00, 0x04);
SendVISCA(viscaIrisDirectSmall); // Iris F16
Thread.Sleep(3000);
VLCVV.MediaPlayer.TakeSnapshot(0, $"{TxtFileDir}IRIS.jpg", 1280, 720); // Darker through iris
Bitmap bmp = new Bitmap($"{TxtFileDir}CONTROL.jpg");
ImageStatisticsHSL hslStatistics = new ImageStatisticsHSL(bmp);
double luminanceCONTROL = Convert.ToDouble(hslStatistics.Luminance.Mean);
Bitmap bmp2 = new Bitmap($"{TxtFileDir}SHUTTER.jpg");
ImageStatisticsHSL hslStatistics2 = new ImageStatisticsHSL(bmp2);
double luminanceSHUTTER = Convert.ToDouble(hslStatistics2.Luminance.Mean);
Bitmap bmp3 = new Bitmap($"{TxtFileDir}IRIS.jpg");
ImageStatisticsHSL hslStatistics3 = new ImageStatisticsHSL(bmp3);
double luminanceIRIS = Convert.ToDouble(hslStatistics3.Luminance.Mean);
Bitmap bmp4 = new Bitmap($"{TxtFileDir}GAIN.jpg");
ImageStatisticsHSL hslStatistics4 = new ImageStatisticsHSL(bmp4);
double luminanceGAIN = Convert.ToDouble(hslStatistics4.Luminance.Mean);
if (!(luminanceSHUTTER > luminanceCONTROL + 0.05)) // Shutter 1/15th brighter than 1/500th
{
TestFail("Cannot control shutter control brightness:" + luminanceCONTROL + Environment.NewLine + "Shutter brightness: " + luminanceSHUTTER);
}
if (!(luminanceCONTROL > luminanceIRIS + 0.05)) // Shutter F16 darker than F2.4
{
TestFail("Cannot control iris control brightness:" + luminanceCONTROL + Environment.NewLine + "Iris brightness: " + luminanceIRIS);
}
if (!(luminanceGAIN > luminanceCONTROL + 0.05)) // Gain 28dB brighter than 0dB
{
TestFail("Cannot control gain control brightness:" + luminanceCONTROL + Environment.NewLine + "Gain brightness: " + luminanceGAIN);
}
}
private void BtnFinalTest_Click(object sender, EventArgs e)
{
if (!videoViewANPR.MediaPlayer.IsPlaying && !videoViewOV.MediaPlayer.IsPlaying && !serialPort1.IsOpen)
{
TestFail("Make sure video is playing and COM port is open before starting test.");
return;
}
if (TxBxPSUIP.BackColor == Color.Red || TxBxZebraIP.BackColor == Color.Red)
{
TestFail("Make sure PSU and Zebra IP's are correct before starting test.");
return;
}
richTxBxRxCmd.Text = TxBxRxErrMssg.Text = ""; // Clear serial boxes.
SendCmd("NC@3.50", 1); // LED's on high for test.
SendCmd("MS0", 1);
CamIP = IPMatch(comboBox_Devices2, txBxManualIpOv); // Check encoder firmware version
if (CamIP == "False")
{
TestFail("Overview camera not playing");
return;
}
string EncoderSoftwareVersion = CheckEncoderFirmwareVer(CamIP);
if (!EncoderSoftwareVersion.Contains(EncoderSoftVer))
{
TestFail("Overview Encoder is not up to date, responds " + EncoderSoftwareVersion + " and should be " + EncoderSoftVer);
}
CamIP = IPMatch(comboBox_Devices, txBxManualIP);
if (CamIP == "False")
{
TestFail("ANPR camera not playing");
return;
}
EncoderSoftwareVersion = CheckEncoderFirmwareVer(CamIP);
if (!EncoderSoftwareVersion.Contains(EncoderSoftVer))
{
TestFail("ANPR Encoder is not up to date, responds " + EncoderSoftwareVersion + " and should be " + EncoderSoftVer);
}
BtnANPR_Click(sender, e);
SendVISCA(viscaFirmwareVer, 8, TxBxReply, true);
string FWverComp = "118"; // HD:IP Mk2
if (CameraModule == Module.HZ5512) // FHD:IP
{
FWverComp = "218";
}
string fwversion = TxBxReply.Text;
if (!fwversion.Contains(FWverComp))
{
TestFail("ANPR camera module not updated. Needs to be " + FWverComp + ", getting back " + rxMssgVISCA);
}
SIGCheck(videoViewANPR);
BtnOV_Click(sender, e);
ExpManual_Click(sender, e); // In prep for SIG check
SendVISCA(viscaFirmwareVer, 8, TxBxReply, true);
fwversion = TxBxReply.Text;
if (!fwversion.Contains(FWverComp))
{
TestFail("OV camera module not updated. Needs to be " + FWverComp + ", getting back " + rxMssgVISCA);
}
SIGCheck(videoViewOV);
FillMonitor(sender, e); // Fills in monitor and checks it is within specification.
BtnDefConfig_Click(sender, e); // Fills in default camera config.
while (timerFocus.Enabled == true)
{
Application.DoEvents();
Thread.Sleep(10);
}
BtnSetH264_Click(sender, e); // Click MJPEG/H264 and IP buttons.
BtnSetMJPEGANPR_Click(sender, e);
SetIP("111", "1", comboBox_Devices, txBxManualIP, BtnSetIPANPR); // Temporary gateway
SetIP("112", "1", comboBox_Devices2, txBxManualIpOv, BtnSetIPOV); // Temporary gateway
MessageBox.Show("Make sure to click 'apply' on H264/MJPEG settings on both encoders before continuing");
WaitMs(1000);
SendCmd("NPn", 1); // Put LED's back to normal
SendCmd("MS0", 1);
WaitMs(5000);
btnClosePort_Click(sender, e);
WaitMs(1000);
btnPsuOff_Click(sender, e); // Reboot camera and wait
DialogResult diagCont = MessageBox.Show("Check there is NO continuity between chassis ground and negative of PSU.", "", MessageBoxButtons.YesNo);
DialogResult diagCont2 = MessageBox.Show("Check there is NO continuity between chassis ground and positive of PSU.", "", MessageBoxButtons.YesNo);
if (diagCont == DialogResult.No || diagCont2 == DialogResult.No)
{
TestFail("Continuity test failed, open it up and snip the pins of IC1 on power board");
}
WaitMs(5000);
btnPsuOn_Click(sender, e);
WaitMs(15000);
if (CheckCamReboot(sender, e) == false)
{
DialogResult dialogResult = MessageBox.Show("Couldn't find cameras, wait longer?", "", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
dialogResult = MessageBox.Show("Do you want to reboot cameras?", "", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
WaitMs(1000);
btnPsuOff_Click(sender, e); //Reboot camera and wait
WaitMs(5000);
btnPsuOn_Click(sender, e);
WaitMs(15000);
}
if (CheckCamReboot(sender, e) == false)
{
TestFail("Encoders not found on 192.168.1.111 & 192.168.1.112");
return;
}
}
else
{
TestFail("Encoders not found on 192.168.1.111 & 192.168.1.112");
return;
}
}
// Change IP's to new ones and start stream.
Media rtsp2 = new Media(libVLC, "rtsp://ADMIN:1234@192.168.1.111:554/live/main", FromType.FromLocation);
videoViewANPR.MediaPlayer.Play(rtsp2);
comboBox_Devices.Text = "192.168.1.111";
Media rtsp1 = new Media(libVLC, "rtsp://ADMIN:1234@192.168.1.112:554/live/main", FromType.FromLocation);
videoViewOV.MediaPlayer.Play(rtsp1);
comboBox_Devices2.Text = "192.168.1.112";
//Get codec settings and check they have saved over reboot.
string responseText = HTTPAPIrequest("192.168.1.112", "/cgi-bin/action.fcgi?api=get_setup.video.codec");
string[] StringsToCheckOV = { "codec0=h264", "resolution0=1280x720", "fps0=30", "profile0=High", "gopsize0=30", "bitctrl0=VBR", "image_quality0=mid", "bitavr0=10000", "ff_mode=60" };
if (CameraModule == Module.HZ5512)
{
StringsToCheckOV[1] = "resolution0=1920x1080";
}
bool StringNotFoundOV = StringsToCheckOV.Any(s => !responseText.Contains(s));
if (StringNotFoundOV == true) // One or more strings not found
{
StringReader readerstringreaderthatreadsstrings = new StringReader(responseText);
string line = readerstringreaderthatreadsstrings.ReadLine();
string responseTextculled = null;
while (line != null)
{
if (line.Contains("0=") || line.Contains("ff_mode"))
{
responseTextculled += line;
}
line = readerstringreaderthatreadsstrings.ReadLine();
}
MessageBox.Show("codec0=h264" + Environment.NewLine + StringsToCheckOV[1] + Environment.NewLine + "fps0=30" + Environment.NewLine + "profile0=High" + Environment.NewLine + "gopsize0=30" + Environment.NewLine + "bitctrl0=VBR" + Environment.NewLine + "image_quality0=mid" + Environment.NewLine + "bitavr0=10000" + Environment.NewLine + "ff_mode=60" + Environment.NewLine + Environment.NewLine + responseTextculled);
TestFail("H264 settings not saved to Overview camera");
}
responseText = HTTPAPIrequest("192.168.1.111", "/cgi-bin/action.fcgi?api=get_setup.video.codec");
string[] StringsToCheckANPR = { "codec0=mjpeg", "resolution0=1280x720", "fps0=15", "jpegqual=65", "ff_mode=60" };
if (CameraModule == Module.HZ5512)
{
StringsToCheckANPR[1] = "resolution0=1920x1080";
}
bool StringNotFoundANPR = StringsToCheckANPR.Any(s => !responseText.Contains(s));
if (StringNotFoundANPR == true) // One or more strings not found
{
StringReader readerstringreaderthatreadsstrings = new StringReader(responseText);
string line = readerstringreaderthatreadsstrings.ReadLine();
string responseTextculled = null;
while (line != null)
{
if (line.Contains("0=") || line.Contains("ff_mode") || line.Contains("jpegqual"))
{
responseTextculled += line;
}
line = readerstringreaderthatreadsstrings.ReadLine();
}
MessageBox.Show("codec0=mjpeg" + Environment.NewLine + StringsToCheckANPR[1] + Environment.NewLine + "fps0=15" + Environment.NewLine + "jpegqual=65" + Environment.NewLine + "ff_mode=60" + Environment.NewLine + Environment.NewLine + responseTextculled);
TestFail("MJPEG settings not saved to ANPR camera");
}
// Set NTP time server IP address
responseText = HTTPAPIrequest("192.168.1.112", "/cgi-bin/action.fcgi?api=set_setup.system.datetime_cgi&ntpserver=192.168.1.102&timeformat=0&ntpon=1&dateformat=2");
if (!responseText.Contains("WEB_ERR_RET_SUCCESS"))
{
TestFail("OV NTP not set " + Environment.NewLine + responseText);
}
responseText = HTTPAPIrequest("192.168.1.111", "/cgi-bin/action.fcgi?api=set_setup.system.datetime_cgi&ntpserver=192.168.1.102&timeformat=0&ntpon=1&dateformat=2");
if (!responseText.Contains("WEB_ERR_RET_SUCCESS"))
{
TestFail("ANPR NTP not set " + Environment.NewLine + responseText);
}
// Set motion to off
responseText = HTTPAPIrequest("192.168.1.112", "/cgi-bin/action.fcgi?api=get_setup.event.smartmotion&enable=off");
if (!responseText.Contains("WEB_ERR_RET_SUCCESS"))
{
TestFail("OV motion sensor not set off " + Environment.NewLine + responseText);
}
responseText = HTTPAPIrequest("192.168.1.111", "/cgi-bin/action.fcgi?api=get_setup.event.smartmotion&enable=off");
if (!responseText.Contains("WEB_ERR_RET_SUCCESS"))
{
TestFail("ANPR motion sensor not set off " + Environment.NewLine + responseText);
}
// Set privacy mask to off
responseText = HTTPAPIrequest("192.168.1.112", "/cgi-bin/action.fcgi?api=get_setup.live.privacymask_polygon&maskarea0=0&maskarea1=0&maskarea2=0&maskarea3=0&maskarea4=0&maskarea5=0&maskarea6=0&maskarea7=0");
if (!responseText.Contains("WEB_ERR_RET_SUCCESS"))
{
TestFail("OV privacy mask not set off " + Environment.NewLine + responseText);
}
responseText = HTTPAPIrequest("192.168.1.111", "/cgi-bin/action.fcgi?api=get_setup.live.privacymask_polygon&maskarea0=0&maskarea1=0&maskarea2=0&maskarea3=0&maskarea4=0&maskarea5=0&maskarea6=0&maskarea7=0");
if (!responseText.Contains("WEB_ERR_RET_SUCCESS"))
{
TestFail("ANPR privacy mask not set off " + Environment.NewLine + responseText);
}
// Set RTSP & HTTP port
responseText = HTTPAPIrequest("192.168.1.112", "/cgi-bin/action.fcgi?api=get_setup.network.service&httpport=80&rtspport=554");
if (!responseText.Contains("80") || !responseText.Contains("554"))
{
TestFail("OV privacy mask not set off " + Environment.NewLine + responseText);
}
responseText = HTTPAPIrequest("192.168.1.111", "/cgi-bin/action.fcgi?api=get_setup.network.service&httpport=80&rtspport=554");
if (!responseText.Contains("80") || !responseText.Contains("554"))
{
TestFail("ANPR privacy mask not set off " + Environment.NewLine + responseText);
}
try
{
btnClosePort_Click(sender, e); // Re-establish connection to COM port
SendCmd("CK0", 1);
richTxBxRxCmd.Text = TxBxRxErrMssg.Text = ""; // Clear serial boxes.
SendCmd("QV?", 1); // Camera control board
SendCmd("qV?", 1); // LED driver
SoftwareVer = richTxBxRxCmd.Text.Substring(richTxBxRxCmd.Text.IndexOf("QV@") + 3, 2) + " & " + richTxBxRxCmd.Text.Substring(richTxBxRxCmd.Text.LastIndexOf("QV@") + 3, 2);
}
catch
{
TestFail("Failed to read software versions");
}
try
{
SendCmd("CS?", 1);
WaitMs(1000); // Wait for LPC to respond
SendCmd("CS?", 1); // Try again because we are seeing no replies after reconneciton?
if (richTxBxRxCmd.Text.Substring(richTxBxRxCmd.Text.IndexOf("CS@") + 3, 7) != "???????")
{
DialogResult dialogResult = MessageBox.Show("Is this camera an RMA?", "", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
DialogResult dialogResultprint = MessageBox.Show("Do you want to reprint the label?", "", MessageBoxButtons.YesNo);
if (dialogResultprint == DialogResult.Yes)
{
GE67SALbl = GE67SALbl.Replace("1004XXX", " " + richTxBxRxCmd.Text.Substring(richTxBxRxCmd.Text.IndexOf("CS@") + 3, 7));
GE67SALbl = GE67SALbl.Replace("05/03", SoftwareVer); // Editing label to include software versions.
if (CameraModule == Module.HZ5512)
{
GE67SALbl = GE67SALbl.Replace("GE67SA-M3", "YT65JG"); // Editing label to model number.
GE67SALbl = GE67SALbl.Replace("HD:IP", "FHD:IP"); // Editing label to model description.
}
PrintToZebra(GE67SALbl);
}
IsRMA = true;
}
}
}
catch
{
TestFail("Failed to check serial number");
}
if (IsRMA == false)
{
try
{
string model = "GE67SA";
if (CameraModule == Module.HZ5512)
{
model = "YT65JG";
}
SendCmd($"CM@{model}", 0);
WaitMs(100);
SendCmd($"CM@{model}", 1);
UpdateSpreadSheet(model); // Get next serial number & put new camera in SS.
SendCmd("CS@" + newSerialNumberString.Substring(1), 1);
}
catch
{
TestFail("Failed to set model and serial");
}
try
{
PrintToZebra(MadeInGb);
if (CameraModule == Module.HZ5512)
{
YT65JGLbl = YT65JGLbl.Replace("K1004XXX", newSerialNumberString); // Editing label to serial number.
PrintToZebra(YT65JGLbl);
}
else
{
GE67SALbl = GE67SALbl.Replace("K1004XXX", newSerialNumberString); // Editing label to serial number.
GE67SALbl = GE67SALbl.Replace("05/03", SoftwareVer); // Editing label to include software versions.
PrintToZebra(GE67SALbl);
}
}
catch
{
TestFail("Cannot print labels");
}
}
BtnSetIPANPR_Click(sender, e); // gateway to 254
BtnSetIPOV_Click(sender, e); // gateway to 254
MessageBox.Show("Set Tibbo to 192.168.1.113 NOW");
BtnFinalTest.BackColor = Color.LightGreen;
MessageBox.Show("Final test passed");
Application.Restart();
}
private void timerCheckReboot_Tick(object sender, EventArgs e)
{
timerCheckReboot.Enabled = false;
}
private void btnTestZebra_Click(object sender, EventArgs e)
{
if (TxBxSerialPrint.Text != "K " && TxBxSerialPrint.Text.Length == 8 && TxBxSerialPrint.Text.Substring(0, 1) == "K")
{
DialogResult dialogResult = MessageBox.Show("Is correct serial number corrected?", "Serial number", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
if (CameraModule == Module.HZ5512)
{
YT65JGLbl = YT65JGLbl.Replace("K1004XXX", " " + TxBxSerialPrint.Text);
PrintToZebra(YT65JGLbl);
YT65JGLbl = "^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR2,2~SD15^JUS^LRN^CI0^XZ" + Environment.NewLine +
"^XA" + Environment.NewLine +
"^MMT" + Environment.NewLine +
"^PW384" + Environment.NewLine +
"^LL0096" + Environment.NewLine +
"^LS0" + Environment.NewLine +
"^FO256,0^GFA,01536,01536,00016,:Z64:" + Environment.NewLine +
"eJzN072K20AQB/ARW6gRp1aCYL2CzDU2BJtUeQ2BC7cBF+eAyCpsiBuB2gSO82skTZAwRM1hv4LMQVRGxzYSLJ6sOa2+sFPfdD+W0ez+tQvw+ougoDe09B3MLhsMb+9XaIF32U74AYPZnSVqzx/X0iu79ceBabyY+P/xMsnwfuCwsRO+T2J8aOaBobtkRjv76xvFcnz/e9U5X8+yvIJWrBPJ0O9K+rxpVB02p4UW2ap/YJLz/CBSfiK1075hKuy9A+SX2dg6e6RsC+vLCMiDXvfr8RK8OT/GnvKfnmGe3bzRopN7xSPyFUBnP4zaM7I52xr4m1HPjw06R1hlt7Uz41PPVeG53jSwd8FlTwxLEGSlykv61LVr2NK7xgnPE6YXI5XP0EA3MU0Ky7xsmW8l7pAja1yeFtK7dl36qXFs5nJ+YN2+7JdkfUMVYLKVH1HzKjmtYzJ567tOwhEbr/v2S9dsDcizPUzDkQvKx66JJvSC6Azr/IY+H1iLdPaZZ623OtM6JlFreb/XyMC0H73Llu9jLCqmxVfshNSl+RMWteX7dGnKB5brmbL1LFKmHa6ajrcaHjv9PYNBtU3KvydBa5ZydZ9e/Jf/VEbhxIBRpf7nwK+p/gEmr4ir:A94D" + Environment.NewLine +
"^FO0,0^GFA,01280,01280,00020,:Z64:" + Environment.NewLine +
"eJztz7ENAyEMQFGjKygZgVFuNBiNUxbhdAsQpQgFwrFDlARwkzr3JTePAhvg/8LkMhisKoGOjTRS4BAv9PIyw+Zp9vI2y7bRXAvYMFiuvR3NVt9sDTaaI8OS3ce8DWyKzMG3JbLVS1Yns0GwrUxm9t54P/59NH0T7J4mW1Cy2BnfpgZLTwuTgWh+NicZnJ392gMKlLLa:A7F4" + Environment.NewLine +
$"^FT159,84^A0N,25,24^FH\\^FDK1004XXX^FS" + Environment.NewLine +
"^FT26,56^A0N,14,14^FH\\^FDModel:^FS" + Environment.NewLine +
$"^FT159,32^A0N,25,28^FH\\^FDFHD:IP Mk2^FS" + Environment.NewLine +
"^FT159,56^A0N,14,14^FH\\^FDSerial Number:^FS" + Environment.NewLine +
$"^FT26,84^A0N,25,24^FH\\^FDYT65JG-M2^FS" + Environment.NewLine +
"^PQ1,0,1,Y^XZ";
}
else
{
GE67SALbl = GE67SALbl.Replace("K1004XXX", " " + TxBxSerialPrint.Text);
PrintToZebra(GE67SALbl);
GE67SALbl = "CT~~CD,~CC^~CT~" +
"^XA ~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR2,2~SD30^JUS^LRN^CI0^XZ" +
"^XA" +
"^MMT" +
"^PW320" +
"^LL0096" +
"^LS0" +
@"^FT39,41^A0N,31,26^FH\^FDGE67SA-M3 SN:K1004XXX^FS" +
@"^FT48,78^A0N,31,26^FH\^FDHD:IP Mk2 SW05/03^FS" +
"^PQ1,0,1,Y^XZ";
}
}
}
else
{
MessageBox.Show("Serial number in incorrect format, K followed by 7 digits");
}
}
private void BtnPrintGB_Click(object sender, EventArgs e)
{
PrintToZebra(MadeInGb);
}
private void TxBxSerialPrint_Click(object sender, EventArgs e)
{
if (TxBxSerialPrint.Text == "K ")
{
TxBxSerialPrint.Text = "K";
TxBxSerialPrint.SelectionStart = 1;
}
}
private void videoViewOV_Click(object sender, EventArgs e)
{
BtnLVOview_Click(sender, e);
}
private void videoViewANPR_Click(object sender, EventArgs e)
{
BtnLVANPR_Click(sender, e);
}
private void TxBxZebraIP_TextChanged(object sender, EventArgs e)
{
if (RegexIPPattern.IsMatch(TxBxZebraIP.Text))
{
TxBxZebraIP.BackColor = SystemColors.Window;
TxBxZebraIP.ForeColor = SystemColors.WindowText;
}
else
{
TxBxZebraIP.BackColor = Color.Red;
TxBxZebraIP.ForeColor = SystemColors.Window;
}
}
private void TxBxPSUIP_TextChanged(object sender, EventArgs e)
{
if (RegexIPPattern.IsMatch(TxBxPSUIP.Text))
{
TxBxPSUIP.BackColor = SystemColors.Window;
TxBxPSUIP.ForeColor = SystemColors.WindowText;
}
else
{
TxBxPSUIP.BackColor = Color.Red;
TxBxPSUIP.ForeColor = SystemColors.Window;
}
}
private void TimerOVPlaying_Tick(object sender, EventArgs e)
{
if (!videoViewOV.MediaPlayer.IsPlaying)
{
videoViewOV.MediaPlayer.Stop();
if (OVstartup == true)
{
try
{
OVStreamUrl = OVStreamUrl.Replace("554", "553"); // Try other RTSP port
remoteEPOV = new IPEndPoint(IPAddress.Parse(CamIP), 52381);
Media rtsp1 = new Media(libVLC, OVStreamUrl, FromType.FromLocation);
videoViewOV.MediaPlayer.Play(rtsp1);
}
catch (Exception ex)
{
MessageBox.Show("Endpoint and VLC error: " + ex.ToString());
}
OVstartup = false;
return;
}
TxBxRxErrMssg.Text = "OV stopped playing at " + DateTime.Now;
TimerOVPlaying.Enabled = false;
}
}
private void TimerANPRPlaying_Tick(object sender, EventArgs e)
{
if (!videoViewANPR.MediaPlayer.IsPlaying)
{
if (ANPRstartup == true)
{
videoViewANPR.MediaPlayer.Stop();
try
{
ANPRStreamUrl = ANPRStreamUrl.Replace("554", "553"); // Try other RTSP port
remoteEPANPR = new IPEndPoint(IPAddress.Parse(CamIP), 52381);
Media rtsp1 = new Media(libVLC, ANPRStreamUrl, FromType.FromLocation);
videoViewANPR.MediaPlayer.Play(rtsp1);
}
catch (Exception ex)
{
MessageBox.Show("Endpoint and VLC error: " + ex.ToString());
}
ANPRstartup = false;
return;
}
TxBxRxErrMssg.Text = "ANPR stopped playing at " + DateTime.Now;
TimerANPRPlaying.Enabled = false;
}
}
private void BtnR49Save_Click(object sender, EventArgs e)
{
if (CameraModule == Module.MC105)
{
WWSave = true;
SendVISCA(viscaSaveWW);
WWSave = false;
BtnR49Save.BackColor = Color.LightGreen;
}
}
private void TimerWWSave_Tick(object sender, EventArgs e)
{
WWSave = true;
SendVISCA(viscaSaveWW);
TimerWWSave.Enabled = WWSave = false;
}
private static readonly byte[] VISCA_HEADER = { 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x81, 0x01 }; // Common header
public static byte[] VISCACommand(params byte[] payload)
{
// Replace byte 3 with the correct length value
VISCA_HEADER[3] = (byte)(3 + payload.Length); // + 3 for 81 01 & FF not included in payload
// Build the final command by concatenating the header, payload, and 0xFF byte
return VISCA_HEADER.Concat(payload).Append((byte)0xFF).ToArray();
}
private static readonly byte[] VISCA_HEADER_INQ = { 0x01, 0x10, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x81, 0x09 };
public static byte[] VISCAInquiry(params byte[] payload)
{
// Replace byte 3 with the correct length value
VISCA_HEADER_INQ[3] = (byte)(3 + payload.Length); // + 3 for 81 01 & FF not included in payload
// Build the final command by concatenating the header, payload, and 0xFF byte
return VISCA_HEADER_INQ.Concat(payload).Append((byte)0xFF).ToArray();
}
private void BtnTest_Click(object sender, EventArgs e)
{
Stopwatch stopWatchTest = new Stopwatch();
stopWatchTest.Start();
// Test for Yunex
string NTPAPI = "/services/system.ion?action=triggerntpsync";
if (CameraModule == Module.HZ5512 || CameraModule == Module.HZ5510)
{
NTPAPI = "/cgi-bin/action.fcgi?api=set_setup.ntp.sync";
}
while (true)
{
try
{
string Resp = HTTPAPIrequest(comboBox_Devices.Text, NTPAPI);
Console.WriteLine("NTP Sync Response: " + Resp);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
int secondsSinceEpoch = (int)t.TotalSeconds;
string UnixTime = Convert.ToString(secondsSinceEpoch);
using (StreamWriter AL = File.AppendText($"{TxtFileDir}NTPLog.txt"))
{
AL.WriteLine("NTP Sync result: " + UnixTime + Environment.NewLine + Resp);
}
if (!Resp.Contains("result=1"))
{
using (StreamWriter AL = File.AppendText($"{TxtFileDir}NTPLog.txt"))
{
AL.WriteLine(Environment.NewLine + Environment.NewLine + "NTP ERROR!!!" + Environment.NewLine + Environment.NewLine);
}
}
Application.DoEvents();
Thread.Sleep(120000);
}
catch (Exception ex)
{
using (StreamWriter AL = File.AppendText($"{TxtFileDir}NTPLog.txt"))
{
AL.WriteLine("Unhandled Exception ERROR: " + ex.Message);
}
}
}
//GBSerialNumPrint.Visible = !GBSerialNumPrint.Visible;
stopWatchTest.Stop();
TimeSpan ts = stopWatchTest.Elapsed;
string elapsedTime = string.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
}
}
}