Browse Source

20240122

20230911
Денис Кузнецов 2 years ago
parent
commit
009ca19489
  1. 166
      piv.cs
  2. 33
      reg.cs
  3. 370
      tcp — копия.cs
  4. 402
      tcp.cs
  5. 64
      udplib.cs
  6. 31
      util.cs

166
piv.cs

@ -1,9 +1,13 @@ @@ -1,9 +1,13 @@
using System;
#define VLADIMIR
using System;
using UTIL;
/// <summary>
/// Ноавя версия ПИВ 1.23
/// </summary>
namespace PIV
{
public static class CONST
@ -2182,6 +2186,12 @@ namespace PIV @@ -2182,6 +2186,12 @@ namespace PIV
/// </summary>
public static class AZUM
{
public static int WF { get => (int)Wfull; set => Wfull = (double)value; }
public static int HF { get => (int)Hfull; set => Hfull = (double)value; }
private static Double Wfull; // = (Double)WF;
private static Double Hfull; // = (Double)HF;
//const Double Wfull = 4072.0;
//const Double Hfull = 3064.0;
/*
private static void pix2ang()
{
@ -2272,31 +2282,41 @@ namespace PIV @@ -2272,31 +2282,41 @@ namespace PIV
//% w - количество столбцов изображения
//% h - количество строк изображения
//sAZUM retu;
if (WF == 0 || HF == 0)
{
throw new Exception("Не заданы значения размера матрицы!");
}
Double w_full = Wfull;
Double h_full = Hfull;
Double w_full = 4072.0;
Double h_full = 3064.0;
//#if DEBUG
// Console.WriteLine($"{Util.printdatetime(false)}{w_full} {h_full}");
//#endif
#if VLADIMIR
Double focus_meters = 27.5e-3;
Double pixel_size_meters = 3.2e-6; //22.5''
#else
Double focus_meters = 12e-3;
Double pixel_size_meters = 1.55e-6;
#endif
Double rad2deg = (180.0 / (Double)Math.PI);
Double f = focus_meters / pixel_size_meters;
//Double xc_full = 0.5f * w_full;
//Double yc_full = 0.5f * h_full;
Double xc_full = 0.5f * w_full;
Double yc_full = 0.5f * h_full;
Double yc_full = (6.0 / 42.0) * h_full;
Double x_full = (X + 0.5) * w_full / W;
Double y_full = (Y + 0.5) * h_full / H;
Double x_ohf = x_full - xc_full;
Double y_ohf = y_full - yc_full;
Double z_ohf = f;
Double rho = (Double)Math.Sqrt(x_ohf * x_ohf + z_ohf * z_ohf);
A = (Double)Math.Atan2(x_ohf, z_ohf) * rad2deg;
U = (Double)(-Math.Atan2(y_ohf, rho) * rad2deg);
}
public static void pix2ang(ref float A, ref float U, float W, float H, float X, float Y)
public static void p2a(ref Double A, ref Double U, Double W, Double H, Double X, Double Y)
{
//% (x, y) - координаты центра пикселя изображения
//% начало O = (0, 0) системы координат изображения находится
@ -2307,18 +2327,75 @@ namespace PIV @@ -2307,18 +2327,75 @@ namespace PIV
//% w - количество столбцов изображения
//% h - количество строк изображения
//sAZUM retu;
if (WF == 0 || HF == 0)
{
throw new Exception("Не заданы значения размера матрицы!");
}
Double w_full = Wfull;
Double h_full = Hfull;
float w_full = (float)4072.0;
float h_full = (float)3064.0;
//#if DEBUG
// Console.WriteLine($"{Util.printdatetime(false)}{w_full} {h_full}");
//#endif
#if VLADIMIR
Double focus_meters = 27.5e-3;
Double pixel_size_meters = 3.2e-6; //22.5''
#else
Double focus_meters = 12e-3;
Double pixel_size_meters = 1.55e-6;
#endif
Double rad2deg = (180.0 / (Double)Math.PI);
Double f = focus_meters / pixel_size_meters;
//Double xc_full = 0.5f * w_full;
//Double yc_full = 0.5f * h_full;
float focus_meters = 12e-3F;
float pixel_size_meters = 1.55e-6F;
Double xc_full = 0.5f * w_full;
Double yc_full = (6.0 / 42.0) * h_full;
float rad2deg = (180.0F / (float)Math.PI);
Double x_full = (X + 0.5) * w_full / W;
Double y_full = (Y + 0.5) * h_full / H;
Double x_ohf = x_full - xc_full;
Double y_ohf = y_full - yc_full;
Double z_ohf = f;
Double rho = (Double)Math.Sqrt(x_ohf * x_ohf + z_ohf * z_ohf);
A = (Double)Math.Atan2(x_ohf, z_ohf) * rad2deg;
U = (Double)(-Math.Atan2(y_ohf, rho) * rad2deg);
}
public static void pix2ang(ref float A, ref float U, float W, float H, float X, float Y)
{
//% (x, y) - координаты центра пикселя изображения
//% начало O = (0, 0) системы координат изображения находится
//% в центре левого верхнего пикселя
//% ось OX направлена вправо по возрастанию номеров столбцов
//% ось OY направлена вниз по возрастанию номеров строк
//%
//% w - количество столбцов изображения
//% h - количество строк изображения
//sAZUM retu;
if (WF == 0 || HF == 0)
{
throw new Exception("Не заданы значения размера матрицы!");
}
float w_full = (float)Wfull;
float h_full = (float)Hfull;
//#if DEBUG
// Console.WriteLine($"{Util.printdatetime(false)}{w_full} {h_full}");
//#endif
#if VLADIMIR
float focus_meters = 27.5e-3F;
float pixel_size_meters = 3.2e-6F; //22.5''
#else
float focus_meters = 12e-3;
float pixel_size_meters = 1.55e-6;
#endif
float rad2deg = (180.0F / (float)Math.PI);
float f = focus_meters / pixel_size_meters;
//float xc_full = 0.5f * w_full;
//float yc_full = 0.5f * h_full;
float xc_full = 0.5f * w_full;
float yc_full = 0.5f * h_full;
float yc_full = (6.0F / 42.0F) * h_full;
float x_full = (float)(X + 0.5) * w_full / W;
float y_full = (float)(Y + 0.5) * h_full / H;
@ -2345,17 +2422,29 @@ namespace PIV @@ -2345,17 +2422,29 @@ namespace PIV
//% w - количество столбцов изображения, double
//% h - количество строк изображения, double
Double w_full = (Double)(4072);
Double h_full = (Double)(3064);
Double focus_meters = (Double)(12e-3);
Double pixel_size_meters = (Double)(1.55e-6);
if (WF == 0 || HF == 0)
{
throw new Exception("Не заданы значения размера матрицы!");
}
Double w_full = (Double)Wfull;
Double h_full = (Double)Hfull;
//#if DEBUG
// Console.WriteLine($"{Util.printdatetime(false)}{w_full} {h_full}");
//#endif
#if VLADIMIR
Double focus_meters = 27.5e-3;
Double pixel_size_meters = 3.2e-6; //22.5''
#else
Double focus_meters = 12e-3;
Double pixel_size_meters = 1.55e-6;
#endif
Double deg2rad = (Double)(Math.PI / 180.0); //% pi = 3.14...
//float rad2deg = (180.0f /3.1415926f);
Double f = focus_meters / pixel_size_meters;
Double xc_full = 0.5 * w_full;
Double yc_full = 0.5 * h_full;
//Double xc_full = 0.5 * w_full;
//Double yc_full = 0.5 * h_full;
Double xc_full = 0.5f * w_full;
Double yc_full = (6.0 / 42.0) * h_full;
//_au.A = _au.A * deg2rad;
//_au.U = _au.U * deg2rad;
@ -2387,17 +2476,32 @@ namespace PIV @@ -2387,17 +2476,32 @@ namespace PIV
//% w - количество столбцов изображения, double
//% h - количество строк изображения, double
float w_full = 4072F;
float h_full = 3064F;
if (WF == 0 || HF == 0)
{
throw new Exception("Не заданы значения размера матрицы!");
}
float w_full = (float)Wfull;
float h_full = (float)Hfull;
#if DEBUG
Console.WriteLine($"{Util.printdatetime(false)}{w_full} {h_full}");
#endif
float focus_meters = 12e-3F;
float pixel_size_meters = 1.55e-6F;
#if VLADIMIR
float focus_meters = 27.5e-3F;
float pixel_size_meters = 3.2e-6F; //22.5''
#else
float focus_meters = 12e-3;
float pixel_size_meters = 1.55e-6;
#endif
float deg2rad = (float)(Math.PI / 180.0); //% pi = 3.14...
//float rad2deg = (180.0f /3.1415926f);
float f = focus_meters / pixel_size_meters;
float xc_full = 0.5F * w_full;
float yc_full = 0.5F * h_full;
//float xc_full = 0.5F * w_full;
//float yc_full = 0.5F * h_full;
float xc_full = 0.5f * w_full;
float yc_full = (6.0F / 42.0F) * h_full;
//_au.A = _au.A * deg2rad;
//_au.U = _au.U * deg2rad;

33
reg.cs

@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
//using System.IO.Ports;
//using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace UTIL
{
public class Reg
{
private RegistryKey rk;
public Reg(RegistryKey k, string path)
{
rk = k.OpenSubKey(path, true);
if (rk == null)
{
rk = k.CreateSubKey(path, true);
}
}
public string ReadKey(string keyname)
{
if (rk.GetValue(keyname) != null)
return rk.GetValue(keyname).ToString();
else
return null;
}
public void WriteKey(string keyname, string val)
{
rk.SetValue(keyname, val);
}
}
}

370
tcp — копия.cs

@ -0,0 +1,370 @@ @@ -0,0 +1,370 @@
using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Data;
//using System.Drawing;
//using System.IO.Ports;
//using System.Linq;
//using System.Text;
//using System.Threading;
//using System.Threading.Tasks;
//using System.Windows.Forms;
//using System.Xml.Linq;
//using UDPLIB;
using UTIL;
//using PIV;
//using static UDPLIB.CallBack;
//using static System.Windows.Forms.VisualStyles.VisualStyleElement.Button;
//using System.Reflection.Emit;
//using System.Drawing.Drawing2D;
//using System.Drawing.Imaging;
using System.Runtime.InteropServices;
//using System.Net.Sockets;
//using System.IO;
//using System.Net.Http;
//using Microsoft.Win32;
namespace nTCP
{
public static class TCP
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public static unsafe struct tcpControlHeader_s
{
public UInt16 signature;
public UInt16 cmd;
public UInt32 length;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct tcpControlStatus_s
{
public tcpControlHeader_s hdr;
public UInt16 cmd;
public Byte status;
public Byte ext;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct tcpControlVPFE_SensorCfg_s
{
public tcpControlHeader_s hdr;
public VPFE_sensorCfg_s cfg;
}
[StructLayout(LayoutKind.Explicit, Size = 20)]
public unsafe struct tcpControlVPFE_CCM_s
{
[FieldOffset(0)]
public tcpControlHeader_s hdr;
[FieldOffset(8)]
public UInt16[] k;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct VPFE_roi_s
{
public UInt16 x;
public UInt16 y;
public UInt16 width;
public UInt16 height;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct VPFE_sensorCfg_s
{
public UInt32 expTimeUs;
public UInt32 framePeriodUs;
public VPFE_roi_s roi;
}
public const UInt16 OES_CNTRL_CMD_SET_VPFE_SENSOR_CFG = 0x0004;
public const UInt16 OES_CNTRL_CMD_SET_VPFE_CCM = 0x0005;
public const UInt16 OES_CNTRL_CMD_SET_VPFE_AE = 0x0006; // Set Auto Exposure
public const UInt16 OES_CNTRL_CMD_SET_VPFE_AWB = 0x0007; // Set Auto White Balance
public const UInt16 OES_CNTRL_CMD_SET_VPFE_GC = 0x0008; // Set Gamma correction
public const UInt16 OES_CNTRL_CMD_SET_VPFE_ABL = 0x0009;
public const UInt16 OES_CNTRL_CMD_SET_VIDEO_FORMAT = 0x0010;
public const UInt16 OES_CNTRL_CMD_GET_VPFE_SENSOR_CFG = 0x0084;
public const UInt16 OES_CNTRL_CMD_GET_VPFE_CCM = 0x0085;
public const UInt16 OES_CNTRL_CMD_GET_VPFE_AE = 0x0086; // Get Auto Exposure
public const UInt16 OES_CNTRL_CMD_GET_VPFE_AWB = 0x0087; // Get Auto White Balance
public const UInt16 OES_CNTRL_CMD_GET_VPFE_GC = 0x0088; // Get Gamma correction
public const UInt16 OES_CNTRL_CMD_GET_VPFE_ABL = 0x0089;
private static Int32 _tcpControlHeader = Marshal.SizeOf(typeof(tcpControlHeader_s));
private static Int32 _tcpControlStatus = Marshal.SizeOf(typeof(tcpControlStatus_s));
private static Int32 _tcpControlVPFE_SensorCfg = Marshal.SizeOf(typeof(tcpControlVPFE_SensorCfg_s));
private static Int32 _tcpControlVPFE_CCM = Marshal.SizeOf(typeof(tcpControlVPFE_CCM_s));
private static Int32 _VPFE_roi = Marshal.SizeOf(typeof(VPFE_roi_s));
private static Int32 _VPFE_sensorCfg = Marshal.SizeOf(typeof(VPFE_sensorCfg_s));
private static Int32 _VPFE_CCM = 12;
public static (Int32, Int32, Int32) ggg()
{
tcpControlVPFE_SensorCfg_s.
return (_tcpControlVPFE_SensorCfg, _tcpControlVPFE_CCM, _tcpControlStatus);
}
//RTPMsgHeader
private const UInt32 _len_pack = 60;
private const UInt32 _len_head = 20;
private static UInt32 _len_data = _len_pack - _len_head;
private static Byte _VerPXCC = 2;
private static Byte _Ver = 2; // версия протокола (текущая версия 2)
private static Byte _P = 0; // = 0 (не используется заполнение в конце пакета)
private static Byte _X = 0; // = 0 (не используются дополнительные заголовки)
private static Byte _CC = 0; // = 0 (CSRC - идентификаторы не используются);
private static Byte _MPT;
private static Byte _M; // маркерный бит.
private static Byte _PT = 99; // поле идентифицирует формат трафика RTP и определяет его интерпретацию. Задается 99
private static UInt32 _Seqcounter = 0;
private static UInt16 _SeqCounter_Hi;
private static UInt16 _SeqCounter_Low;
private static Byte _rejim_oes;
private static Byte _zahvat;
private static Byte _color;
private static Byte _status;
public static Byte MH_VerPXCC
{
get => _VerPXCC;
set
{
_VerPXCC = value;
_Ver = (Byte)(value & 0x03);
_P = (Byte)((value >> 2) & 0x01);
_X = (Byte)((value >> 3) & 0x01);
_CC = (Byte)((value >> 4) & 0x0F);
}
}
public static Byte MH_MPT
{
get
{
return (Byte)((_PT << 1) | _M);
}
set
{
_MPT = value;
_M = (Byte)(value & 0x01);
_PT = (Byte)((value >> 1) & 0x7F);
}
}
public static Byte MH_M // маркерный бит.
{
get => _M;
set
{
_M = value;
}
}
public static Byte MH_PT // поле идентифицирует формат трафика RTP и определяет его интерпретацию. Задается 99
{
get => _PT;
set
{
_PT = value;
}
}
public static UInt16 MH_SeqCounter_Low // Номер последовательности (младшие 16 бит)
{
get => _SeqCounter_Low;
set
{
_SeqCounter_Low = value;
}
}
public static UInt32 MH_Timestamp; // Метка времени (90 кГц отсчеты), одинакова для всех пакетов кадра
public static UInt32 MH_SSRC; // 12345678 (идентификатор источника информации)
public static UInt16 MH_SeqCounter_Hi // Номер последовательности (старшие 16 бит)
{
get => _SeqCounter_Hi;
set
{
_SeqCounter_Hi = value;
}
}
public static UInt16 MH_DataLen = (UInt16)_len_data; // Количество байт данных строки, включенной в пакет
public static UInt16 MH_RowNumber; // Номер строки
public static UInt16 MH_Offset; // Смещение первого пиксела в строке (= 0)
//RTPVideoSupplementalData
public static UInt16 SD_Width; // Ширина (пиксели)
public static UInt16 SD_Height; // Высота (пиксели)
public static float SD_AzUpr; // (град)
public static float SD_ElUpr; // (град)
public static Int32 SD_Shirota; // Широта БЛА (1е-7 град)
public static Int32 SD_Dolgota; // Долгота БЛА (1е-7 град)
public static Int32 SD_Vysota; // Высота БЛА (0,01 м)
public static Int16 SD_Course; // Курс БЛА (0,01 град)
public static Int16 SD_Roll; // Крен БЛА (0,01 град)
public static Int16 SD_Pitch; // Тангаж БЛА (0,01 град)
public static UInt16 rez0; // координата центра цели в растре изображения по горизонтали
public static UInt16 rez1; //координата центра цели в растре изображения по вертикали
public static UInt16 rez2; //координата центра цели в растре изображения по вертикали
public static Byte rez3; // размер цели в растре эталонного изображения по горизонтали
public static Byte rez4; // размер цели в растре эталонного изображения по вертикали
public static Byte SD_rejim_oes // Режим ОЭС: «0» – Обзор, «1» – АС
{
get => _rejim_oes;
set => _rejim_oes = value;
}
public static Byte SD_zahvat // Захват: «0» – отсутствие захвата, «1» – налачие захвата
{
get => _zahvat;
set => _zahvat = value;
}
public static Byte SD_color // Цвет изображения: «1» – цветное, «0» – монохромное
{
get => _color;
set => _color = value;
}
public static Byte SD_Status
{
get
{
_status = 0;
_status |= (Byte)(_rejim_oes << 0);
_status |= (Byte)(_zahvat << 1);
_status |= (Byte)(_color << 2);
return _status;
}
set
{
_status = value;
_rejim_oes = (Byte)((value >> 0) & 0x01);
_zahvat = (Byte)((value >> 1) & 0x01);
_color = (Byte)((value >> 2) & 0x01);
}
}
public static Byte rez5;
public static UInt32 SeqCounter
{
get
{
return (UInt32)((_SeqCounter_Hi << 16) | _SeqCounter_Low);
}
set
{
_SeqCounter_Low = (UInt16)value;
_SeqCounter_Hi = (UInt16)((value >> 16) & 0xFFFF);
}
}
public static Byte[] DataH0 = new Byte[_len_pack];
//public static Byte[] DataH0 = new Byte[76];
public static Byte[] DataH1 = new Byte[_len_head];
public static void MakeDataH0()
{
Array.Copy(BitConverter.GetBytes(MH_VerPXCC), 0, DataH0, 0, 1); // 0 - 0
Array.Copy(BitConverter.GetBytes(MH_MPT), 0, DataH0, 1, 1); // 1 - 1
Array.Copy(BitConverter.GetBytes(MH_SeqCounter_Low), 0, DataH0, 2, 2); // 2 - 3
Array.Copy(BitConverter.GetBytes(MH_Timestamp), 0, DataH0, 4, 4); // 4 - 7
Array.Copy(BitConverter.GetBytes(MH_SSRC), 0, DataH0, 8, 4); // 8 - 11
Array.Copy(BitConverter.GetBytes(MH_SeqCounter_Hi), 0, DataH0, 12, 2); // 12 - 13
Array.Copy(BitConverter.GetBytes(MH_DataLen), 0, DataH0, 14, 2); // 14 - 15
Array.Copy(BitConverter.GetBytes(MH_RowNumber), 0, DataH0, 16, 2); // 16 - 17
Array.Copy(BitConverter.GetBytes(MH_Offset), 0, DataH0, 18, 2); // 18 - 19
Array.Copy(BitConverter.GetBytes(SD_Width), 0, DataH0, 20, 2); // 20 - 21
Array.Copy(BitConverter.GetBytes(SD_Height), 0, DataH0, 22, 2); // 22 - 23
Array.Copy(BitConverter.GetBytes(SD_AzUpr), 0, DataH0, 24, 4); // 24 - 27
Array.Copy(BitConverter.GetBytes(SD_ElUpr), 0, DataH0, 28, 4); // 28 - 31
Array.Copy(BitConverter.GetBytes(SD_Shirota), 0, DataH0, 32, 4); // 32 - 35
Array.Copy(BitConverter.GetBytes(SD_Dolgota), 0, DataH0, 36, 4); // 36 - 39
Array.Copy(BitConverter.GetBytes(SD_Vysota), 0, DataH0, 40, 4); // 40 - 43
Array.Copy(BitConverter.GetBytes(SD_Course), 0, DataH0, 44, 2); // 44 - 45
Array.Copy(BitConverter.GetBytes(SD_Roll), 0, DataH0, 46, 2); // 46 - 47
Array.Copy(BitConverter.GetBytes(SD_Pitch), 0, DataH0, 48, 2); // 48 - 49
Array.Copy(BitConverter.GetBytes(rez0), 0, DataH0, 50, 2); // 50 - 51
Array.Copy(BitConverter.GetBytes(rez1), 0, DataH0, 52, 2); // 52 - 53
Array.Copy(BitConverter.GetBytes(rez2), 0, DataH0, 54, 2); // 54 - 55
Array.Copy(BitConverter.GetBytes(rez3), 0, DataH0, 56, 1); // 56 - 56
Array.Copy(BitConverter.GetBytes(rez4), 0, DataH0, 57, 1); // 57 - 57
Array.Copy(BitConverter.GetBytes(SD_Status), 0, DataH0, 58, 1); // 58 - 58
Array.Copy(BitConverter.GetBytes(rez5), 0, DataH0, 59, 1); // 59 - 59
}
public static void MakeDataH1()
{
Array.Copy(BitConverter.GetBytes(MH_VerPXCC), 0, DataH1, 0, 1);
Array.Copy(BitConverter.GetBytes(MH_MPT), 0, DataH1, 1, 1);
Array.Copy(BitConverter.GetBytes(MH_SeqCounter_Low), 0, DataH1, 2, 2);
Array.Copy(BitConverter.GetBytes(MH_Timestamp), 0, DataH1, 4, 4);
Array.Copy(BitConverter.GetBytes(MH_SSRC), 0, DataH1, 8, 4);
Array.Copy(BitConverter.GetBytes(MH_SeqCounter_Hi), 0, DataH1, 12, 2);
Array.Copy(BitConverter.GetBytes(MH_DataLen), 0, DataH1, 14, 2);
Array.Copy(BitConverter.GetBytes(MH_RowNumber), 0, DataH1, 16, 2);
Array.Copy(BitConverter.GetBytes(MH_Offset), 0, DataH1, 18, 2);
}
public static void GetDataH0()
{
MH_VerPXCC = DataH0[0];
MH_MPT = DataH0[1];
MH_SeqCounter_Low = BitConverter.ToUInt16(DataH0, 2);
MH_Timestamp = BitConverter.ToUInt32(DataH0, 4);
MH_SSRC = BitConverter.ToUInt32(DataH0, 8);
MH_SeqCounter_Hi = BitConverter.ToUInt16(DataH0, 12);
MH_DataLen = BitConverter.ToUInt16(DataH0, 14);
MH_RowNumber = BitConverter.ToUInt16(DataH0, 16);
MH_Offset = BitConverter.ToUInt16(DataH0, 18);
SD_Width = BitConverter.ToUInt16(DataH0, 20);
SD_Height = BitConverter.ToUInt16(DataH0, 22);
SD_AzUpr = BitConverter.ToSingle(DataH0, 24);
SD_ElUpr = BitConverter.ToSingle(DataH0, 28);
SD_Shirota = BitConverter.ToInt32(DataH0, 32);
SD_Dolgota = BitConverter.ToInt32(DataH0, 36);
SD_Vysota = BitConverter.ToInt32(DataH0, 40);
SD_Course = BitConverter.ToInt16(DataH0, 44);
SD_Roll = BitConverter.ToInt16(DataH0, 46);
SD_Pitch = BitConverter.ToInt16(DataH0, 48);
rez0 = BitConverter.ToUInt16(DataH0, 50);
rez1 = BitConverter.ToUInt16(DataH0, 52);
rez2 = BitConverter.ToUInt16(DataH0, 54);
rez3 = DataH0[56];
rez4 = DataH0[57];
SD_Status = DataH0[58];
rez5 = DataH0[59];
}
public static void GetDataH1()
{
MH_VerPXCC = DataH0[0];
MH_MPT = DataH0[1];
MH_SeqCounter_Low = BitConverter.ToUInt16(DataH0, 2);
MH_Timestamp = BitConverter.ToUInt32(DataH0, 4);
MH_SSRC = BitConverter.ToUInt32(DataH0, 8);
MH_SeqCounter_Hi = BitConverter.ToUInt16(DataH0, 12);
MH_DataLen = BitConverter.ToUInt16(DataH0, 14);
MH_RowNumber = BitConverter.ToUInt16(DataH0, 16);
MH_Offset = BitConverter.ToUInt16(DataH0, 18);
}
private static T BuffToStruct<T>(byte[] arr)
{
GCHandle handle = GCHandle.Alloc(arr, GCHandleType.Pinned);
T stuff = (T)Marshal.PtrToStructure(
handle.AddrOfPinnedObject(), typeof(T));
handle.Free();
return stuff;
}
private static byte[] StructToBuff<T>(T value) where T : struct
{
byte[] arr = new byte[Marshal.SizeOf(value)]; // создать массив
GCHandle gch = GCHandle.Alloc(arr, GCHandleType.Pinned); // зафиксировать в памяти
IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(arr, 0); // и взять его адрес
Marshal.StructureToPtr(value, ptr, true); // копировать в массив
gch.Free(); // снять фиксацию
return arr;
}
}
}

402
tcp.cs

@ -0,0 +1,402 @@ @@ -0,0 +1,402 @@
using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Data;
//using System.Drawing;
//using System.IO.Ports;
//using System.Linq;
//using System.Text;
//using System.Threading;
//using System.Threading.Tasks;
//using System.Windows.Forms;
//using System.Xml.Linq;
//using UDPLIB;
using UTIL;
//using PIV;
//using UDPLIB.CallBack;
//using System.Windows.Forms.VisualStyles.VisualStyleElement.Button;
//using System.Reflection.Emit;
//using System.Drawing.Drawing2D;
//using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Drawing;
//using System.Net.Sockets;
//using System.IO;
//using System.Net.Http;
//using Microsoft.Win32;
namespace nTCP
{
public class TCP
{
public const UInt16 TCP_CONTROL_SIGNATURE = 0x4D58;
public const UInt16 OES_CNTRL_CMD_SET_VPFE_SENSOR_CFG = 0x0004;
public const UInt16 OES_CNTRL_CMD_SET_VPFE_CCM = 0x0005;
public const UInt16 OES_CNTRL_CMD_SET_VPFE_AE = 0x0006; // Set Auto Exposure
public const UInt16 OES_CNTRL_CMD_SET_VPFE_AWB = 0x0007; // Set Auto White Balance
public const UInt16 OES_CNTRL_CMD_SET_VPFE_GC = 0x0008; // Set Gamma correction
public const UInt16 OES_CNTRL_CMD_SET_VPFE_ABL = 0x0009;
public const UInt16 OES_CNTRL_CMD_SET_VIDEO_FORMAT = 0x0010;
public const UInt16 OES_CNTRL_CMD_GET_VPFE_SENSOR_CFG = 0x0084;
public const UInt16 OES_CNTRL_CMD_GET_VPFE_CCM = 0x0085;
public const UInt16 OES_CNTRL_CMD_GET_VPFE_AE = 0x0086; // Get Auto Exposure
public const UInt16 OES_CNTRL_CMD_GET_VPFE_AWB = 0x0087; // Get Auto White Balance
public const UInt16 OES_CNTRL_CMD_GET_VPFE_GC = 0x0088; // Get Gamma correction
public const UInt16 OES_CNTRL_CMD_GET_VPFE_ABL = 0x0089;
private Int32 _tcpControlHeader = 8;
private Int32 _tcpControlStatus = 12;
private Int32 _tcpControlVPFE_SensorCfg = 24;
private Int32 _tcpControlVPFE_CCM = 20;
private Int32 _VPFE_roi = 8;
private Int32 _VPFE_sensorCfg = 16;
private Int32 _VPFE_CCM = 12;
//private tcpControlVPFE_SensorCfg_s pack_SensorCfg = new tcpControlVPFE_SensorCfg_s();
//private tcpControlVPFE_CCM_s pack_VPFE_CCM = new tcpControlVPFE_CCM_s();
//private tcpControlStatus_s pack_Status_s = new tcpControlStatus_s();
public TCP()
{
//pack_SensorCfg.hdr.signature = TCP_CONTROL_SIGNATURE;
}
public Byte[] class2buf(SensorCfg_t c)
{
Byte[] buf = new Byte[_tcpControlVPFE_SensorCfg];
c.length = 16;
Array.Copy(BitConverter.GetBytes(c.signature), 0, buf, 0, 2); // 0 - 0
Array.Copy(BitConverter.GetBytes(c.cmd), 0, buf, 2, 2); // 2 - 2
Array.Copy(BitConverter.GetBytes(c.length), 0, buf, 4, 4); // 4 - 4
Array.Copy(BitConverter.GetBytes(c.expTimeUs), 0, buf, 8, 4); // 8 - 7
Array.Copy(BitConverter.GetBytes(c.framePeriodUs), 0, buf, 12, 4); // 12 - 11
Array.Copy(BitConverter.GetBytes(c.x), 0, buf, 16, 2); // 16 - 13
Array.Copy(BitConverter.GetBytes(c.y), 0, buf, 18, 2); // 18 - 17
Array.Copy(BitConverter.GetBytes(c.width), 0, buf, 20, 2); // 20 - 19
Array.Copy(BitConverter.GetBytes(c.height), 0, buf, 22, 2); // 22 - 21
return buf;
}
public Byte[] class2buf(Status_t c)
{
Byte[] buf = new Byte[_tcpControlStatus];
c.length = 4;
Array.Copy(BitConverter.GetBytes(c.signature), 0, buf, 0, 2); // 0 - 0
Array.Copy(BitConverter.GetBytes(c.cmd), 0, buf, 2, 2); // 2 - 2
Array.Copy(BitConverter.GetBytes(c.length), 0, buf, 4, 4); // 4 - 4
Array.Copy(BitConverter.GetBytes(c.cmd2), 0, buf, 8, 2); // 8 - 7
Array.Copy(BitConverter.GetBytes(c.status), 0, buf, 10, 1); // 8 - 7
Array.Copy(BitConverter.GetBytes(c.ext), 0, buf, 11, 1); // 8 - 7
return buf;
}
public Status_t buf2Status(Byte[] buf)
{
Status_t ret = new Status_t();
ret.signature = BitConverter.ToUInt16(buf, 0);
ret.cmd = BitConverter.ToUInt16(buf, 2);
ret.length = BitConverter.ToUInt32(buf, 4);
ret.cmd2 = BitConverter.ToUInt16(buf, 8);
ret.status = buf[10];
ret.ext = buf[11];
return ret;
}
public SensorCfg_t buf2SensorCfg(Byte[] buf)
{
SensorCfg_t ret = new SensorCfg_t();
ret.signature = BitConverter.ToUInt16(buf, 0);
ret.cmd = BitConverter.ToUInt16(buf, 2);
ret.length = BitConverter.ToUInt32(buf, 4);
ret.expTimeUs = BitConverter.ToUInt32(buf, 8);
ret.framePeriodUs = BitConverter.ToUInt32(buf, 12);
ret.x = BitConverter.ToUInt16(buf, 16);
ret.y = BitConverter.ToUInt16(buf, 18);
ret.width = BitConverter.ToUInt16(buf, 20);
ret.height = BitConverter.ToUInt16(buf, 22);
return ret;
}
public (Int32, Int32, Int32) ggg()
{
return (_tcpControlVPFE_SensorCfg, _tcpControlVPFE_CCM, _tcpControlStatus);
}
/*
//RTPMsgHeader
private const UInt32 _len_pack = 60;
private const UInt32 _len_head = 20;
private UInt32 _len_data = _len_pack - _len_head;
private Byte _VerPXCC = 2;
private Byte _Ver = 2; // версия протокола (текущая версия 2)
private Byte _P = 0; // = 0 (не используется заполнение в конце пакета)
private Byte _X = 0; // = 0 (не используются дополнительные заголовки)
private Byte _CC = 0; // = 0 (CSRC - идентификаторы не используются);
private Byte _MPT;
private Byte _M; // маркерный бит.
private Byte _PT = 99; // поле идентифицирует формат трафика RTP и определяет его интерпретацию. Задается 99
private UInt32 _Seqcounter = 0;
private UInt16 _SeqCounter_Hi;
private UInt16 _SeqCounter_Low;
private Byte _rejim_oes;
private Byte _zahvat;
private Byte _color;
private Byte _status;
public Byte MH_VerPXCC
{
get => _VerPXCC;
set
{
_VerPXCC = value;
_Ver = (Byte)(value & 0x03);
_P = (Byte)((value >> 2) & 0x01);
_X = (Byte)((value >> 3) & 0x01);
_CC = (Byte)((value >> 4) & 0x0F);
}
}
public Byte MH_MPT
{
get
{
return (Byte)((_PT << 1) | _M);
}
set
{
_MPT = value;
_M = (Byte)(value & 0x01);
_PT = (Byte)((value >> 1) & 0x7F);
}
}
public Byte MH_M // маркерный бит.
{
get => _M;
set
{
_M = value;
}
}
public Byte MH_PT // поле идентифицирует формат трафика RTP и определяет его интерпретацию. Задается 99
{
get => _PT;
set
{
_PT = value;
}
}
public UInt16 MH_SeqCounter_Low // Номер последовательности (младшие 16 бит)
{
get => _SeqCounter_Low;
set
{
_SeqCounter_Low = value;
}
}
public UInt32 MH_Timestamp; // Метка времени (90 кГц отсчеты), одинакова для всех пакетов кадра
public UInt32 MH_SSRC; // 12345678 (идентификатор источника информации)
public UInt16 MH_SeqCounter_Hi // Номер последовательности (старшие 16 бит)
{
get => _SeqCounter_Hi;
set
{
_SeqCounter_Hi = value;
}
}
// public UInt16 MH_DataLen = (UInt16)_len_data; // Количество байт данных строки, включенной в пакет
public UInt16 MH_RowNumber; // Номер строки
public UInt16 MH_Offset; // Смещение первого пиксела в строке (= 0)
//RTPVideoSupplementalData
public UInt16 SD_Width; // Ширина (пиксели)
public UInt16 SD_Height; // Высота (пиксели)
public float SD_AzUpr; // (град)
public float SD_ElUpr; // (град)
public Int32 SD_Shirota; // Широта БЛА (1е-7 град)
public Int32 SD_Dolgota; // Долгота БЛА (1е-7 град)
public Int32 SD_Vysota; // Высота БЛА (0,01 м)
public Int16 SD_Course; // Курс БЛА (0,01 град)
public Int16 SD_Roll; // Крен БЛА (0,01 град)
public Int16 SD_Pitch; // Тангаж БЛА (0,01 град)
public UInt16 rez0; // координата центра цели в растре изображения по горизонтали
public UInt16 rez1; //координата центра цели в растре изображения по вертикали
public UInt16 rez2; //координата центра цели в растре изображения по вертикали
public Byte rez3; // размер цели в растре эталонного изображения по горизонтали
public Byte rez4; // размер цели в растре эталонного изображения по вертикали
public Byte SD_rejim_oes // Режим ОЭС: «0» – Обзор, «1» – АС
{
get => _rejim_oes;
set => _rejim_oes = value;
}
public Byte SD_zahvat // Захват: «0» – отсутствие захвата, «1» – налачие захвата
{
get => _zahvat;
set => _zahvat = value;
}
public Byte SD_color // Цвет изображения: «1» – цветное, «0» – монохромное
{
get => _color;
set => _color = value;
}
public Byte SD_Status
{
get
{
_status = 0;
_status |= (Byte)(_rejim_oes << 0);
_status |= (Byte)(_zahvat << 1);
_status |= (Byte)(_color << 2);
return _status;
}
set
{
_status = value;
_rejim_oes = (Byte)((value >> 0) & 0x01);
_zahvat = (Byte)((value >> 1) & 0x01);
_color = (Byte)((value >> 2) & 0x01);
}
}
public Byte rez5;
public UInt32 SeqCounter
{
get
{
return (UInt32)((_SeqCounter_Hi << 16) | _SeqCounter_Low);
}
set
{
_SeqCounter_Low = (UInt16)value;
_SeqCounter_Hi = (UInt16)((value >> 16) & 0xFFFF);
}
}
public Byte[] DataH0 = new Byte[_len_pack];
//public Byte[] DataH0 = new Byte[76];
public Byte[] DataH1 = new Byte[_len_head];
public void MakeDataH0()
{
Array.Copy(BitConverter.GetBytes(MH_VerPXCC), 0, DataH0, 0, 1); // 0 - 0
Array.Copy(BitConverter.GetBytes(MH_MPT), 0, DataH0, 1, 1); // 1 - 1
Array.Copy(BitConverter.GetBytes(MH_SeqCounter_Low), 0, DataH0, 2, 2); // 2 - 3
Array.Copy(BitConverter.GetBytes(MH_Timestamp), 0, DataH0, 4, 4); // 4 - 7
Array.Copy(BitConverter.GetBytes(MH_SSRC), 0, DataH0, 8, 4); // 8 - 11
Array.Copy(BitConverter.GetBytes(MH_SeqCounter_Hi), 0, DataH0, 12, 2); // 12 - 13
// Array.Copy(BitConverter.GetBytes(MH_DataLen), 0, DataH0, 14, 2); // 14 - 15
Array.Copy(BitConverter.GetBytes(MH_RowNumber), 0, DataH0, 16, 2); // 16 - 17
Array.Copy(BitConverter.GetBytes(MH_Offset), 0, DataH0, 18, 2); // 18 - 19
Array.Copy(BitConverter.GetBytes(SD_Width), 0, DataH0, 20, 2); // 20 - 21
Array.Copy(BitConverter.GetBytes(SD_Height), 0, DataH0, 22, 2); // 22 - 23
Array.Copy(BitConverter.GetBytes(SD_AzUpr), 0, DataH0, 24, 4); // 24 - 27
Array.Copy(BitConverter.GetBytes(SD_ElUpr), 0, DataH0, 28, 4); // 28 - 31
Array.Copy(BitConverter.GetBytes(SD_Shirota), 0, DataH0, 32, 4); // 32 - 35
Array.Copy(BitConverter.GetBytes(SD_Dolgota), 0, DataH0, 36, 4); // 36 - 39
Array.Copy(BitConverter.GetBytes(SD_Vysota), 0, DataH0, 40, 4); // 40 - 43
Array.Copy(BitConverter.GetBytes(SD_Course), 0, DataH0, 44, 2); // 44 - 45
Array.Copy(BitConverter.GetBytes(SD_Roll), 0, DataH0, 46, 2); // 46 - 47
Array.Copy(BitConverter.GetBytes(SD_Pitch), 0, DataH0, 48, 2); // 48 - 49
Array.Copy(BitConverter.GetBytes(rez0), 0, DataH0, 50, 2); // 50 - 51
Array.Copy(BitConverter.GetBytes(rez1), 0, DataH0, 52, 2); // 52 - 53
Array.Copy(BitConverter.GetBytes(rez2), 0, DataH0, 54, 2); // 54 - 55
Array.Copy(BitConverter.GetBytes(rez3), 0, DataH0, 56, 1); // 56 - 56
Array.Copy(BitConverter.GetBytes(rez4), 0, DataH0, 57, 1); // 57 - 57
Array.Copy(BitConverter.GetBytes(SD_Status), 0, DataH0, 58, 1); // 58 - 58
Array.Copy(BitConverter.GetBytes(rez5), 0, DataH0, 59, 1); // 59 - 59
}
public void MakeDataH1()
{
Array.Copy(BitConverter.GetBytes(MH_VerPXCC), 0, DataH1, 0, 1);
Array.Copy(BitConverter.GetBytes(MH_MPT), 0, DataH1, 1, 1);
Array.Copy(BitConverter.GetBytes(MH_SeqCounter_Low), 0, DataH1, 2, 2);
Array.Copy(BitConverter.GetBytes(MH_Timestamp), 0, DataH1, 4, 4);
Array.Copy(BitConverter.GetBytes(MH_SSRC), 0, DataH1, 8, 4);
Array.Copy(BitConverter.GetBytes(MH_SeqCounter_Hi), 0, DataH1, 12, 2);
// Array.Copy(BitConverter.GetBytes(MH_DataLen), 0, DataH1, 14, 2);
Array.Copy(BitConverter.GetBytes(MH_RowNumber), 0, DataH1, 16, 2);
Array.Copy(BitConverter.GetBytes(MH_Offset), 0, DataH1, 18, 2);
}
public void GetDataH0()
{
MH_VerPXCC = DataH0[0];
MH_MPT = DataH0[1];
MH_SeqCounter_Low = BitConverter.ToUInt16(DataH0, 2);
MH_Timestamp = BitConverter.ToUInt32(DataH0, 4);
MH_SSRC = BitConverter.ToUInt32(DataH0, 8);
MH_SeqCounter_Hi = BitConverter.ToUInt16(DataH0, 12);
// MH_DataLen = BitConverter.ToUInt16(DataH0, 14);
MH_RowNumber = BitConverter.ToUInt16(DataH0, 16);
MH_Offset = BitConverter.ToUInt16(DataH0, 18);
SD_Width = BitConverter.ToUInt16(DataH0, 20);
SD_Height = BitConverter.ToUInt16(DataH0, 22);
SD_AzUpr = BitConverter.ToSingle(DataH0, 24);
SD_ElUpr = BitConverter.ToSingle(DataH0, 28);
SD_Shirota = BitConverter.ToInt32(DataH0, 32);
SD_Dolgota = BitConverter.ToInt32(DataH0, 36);
SD_Vysota = BitConverter.ToInt32(DataH0, 40);
SD_Course = BitConverter.ToInt16(DataH0, 44);
SD_Roll = BitConverter.ToInt16(DataH0, 46);
SD_Pitch = BitConverter.ToInt16(DataH0, 48);
rez0 = BitConverter.ToUInt16(DataH0, 50);
rez1 = BitConverter.ToUInt16(DataH0, 52);
rez2 = BitConverter.ToUInt16(DataH0, 54);
rez3 = DataH0[56];
rez4 = DataH0[57];
SD_Status = DataH0[58];
rez5 = DataH0[59];
}
public void GetDataH1()
{
MH_VerPXCC = DataH0[0];
MH_MPT = DataH0[1];
MH_SeqCounter_Low = BitConverter.ToUInt16(DataH0, 2);
MH_Timestamp = BitConverter.ToUInt32(DataH0, 4);
MH_SSRC = BitConverter.ToUInt32(DataH0, 8);
MH_SeqCounter_Hi = BitConverter.ToUInt16(DataH0, 12);
// MH_DataLen = BitConverter.ToUInt16(DataH0, 14);
MH_RowNumber = BitConverter.ToUInt16(DataH0, 16);
MH_Offset = BitConverter.ToUInt16(DataH0, 18);
}
*/
public delegate void Event_newmsg();
public Event_newmsg Event_newmsg_Handler;
}
public class Status_t
{
public UInt16 signature = TCP.TCP_CONTROL_SIGNATURE;
public UInt16 cmd = 0;
public UInt32 length = 0;
public UInt16 cmd2 = 0;
public Byte status = 0;
public Byte ext = 0;
}
public class SensorCfg_t
{
public UInt16 signature = TCP.TCP_CONTROL_SIGNATURE;
public UInt16 cmd = 0;
public UInt32 length = 0;
public UInt32 expTimeUs = 0;
public UInt32 framePeriodUs = 0;
public UInt16 x = 0;
public UInt16 y = 0;
public UInt16 width = 0;
public UInt16 height = 0;
}
}

64
udplib.cs

@ -17,7 +17,7 @@ namespace UDPLIB @@ -17,7 +17,7 @@ namespace UDPLIB
{
public class Data
{
public static string Ver = "1.1.2.264";
public static string Ver = "1.1.2.269";
protected static string IPAddr = "192.168.1.2";
protected static Int32 LocalPort = 5004;
protected static Int32 RemotePort = 5006;
@ -31,12 +31,8 @@ namespace UDPLIB @@ -31,12 +31,8 @@ namespace UDPLIB
public class UDPreceive : Data
{
//Int32 localPort = 5004;
//Int32 remotePort = 5006;
Thread UDPreceiveThread = null;
// Thread processFrameThread = null;
Thread sendFrameThread = null;
// Thread processDataFrameThread = null;
Stopwatch fpstimer;
private volatile bool listening = false;
UInt16 iwidth = 0;
@ -79,6 +75,7 @@ namespace UDPLIB @@ -79,6 +75,7 @@ namespace UDPLIB
public void Stop()
{
listening = false;
UDPreceiveThread.Abort();
cnt_frames = 0;
}
public Boolean IsAlive
@ -146,22 +143,12 @@ namespace UDPLIB @@ -146,22 +143,12 @@ namespace UDPLIB
}
if (numrow == 0 && ssrc == 12345678) // Packet 0
{
//iwidth = BitConverter.ToUInt16(data, 20);
//iheight = BitConverter.ToUInt16(data, 22);
blackline = new Byte[iwidth * 3 + 20];
RTP.DataH0 = data;
RTP.GetDataH0();
//Res.Iwidth = iwidth;
//Res.Iheight = iheight;
//Res.AzUpr = BitConverter.ToSingle(data, 24);
//Res.ElUpr = BitConverter.ToSingle(data, 28);
//Res.Course = BitConverter.ToInt16(data, 32);
//Res.Roll = BitConverter.ToInt16(data, 34);
//Res.Pitch = BitConverter.ToInt16(data, 36);
iwidth = RTP.SD_Width;
iheight = RTP.SD_Height;
@ -222,16 +209,25 @@ namespace UDPLIB @@ -222,16 +209,25 @@ namespace UDPLIB
}
catch (Exception ee)
{
#if DEBUG
using (StreamWriter sw = new StreamWriter(System.IO.File.OpenWrite("udplib.log")))
{
sw.WriteLine($"{DateTime.Now.ToString("HH:mm:ss:fff ")} Error dll recv\r\n{ee.Message}");
}
#endif
}
}
receiver.Close();
Res.Fps = 0;
rrr2.Fps = 0;
Res.Lost = 0;
rrr2.Lost = 0;
CallBack.Event_newimg_Handler2(rrr2);
}
void processFrame7(object obj)
{
Int32 lost = 0;
UInt32 lostfix = 0;
try
{
thrdata arr = obj as thrdata;
@ -249,8 +245,27 @@ namespace UDPLIB @@ -249,8 +245,27 @@ namespace UDPLIB
udata.AddRange(udata51);
break;
}
//udata50.Clear();
//udata51.Clear();
iwi = BitConverter.ToUInt16(udata[0], 20);
ihe = BitConverter.ToUInt16(udata[0], 22);
// проверка потерянных строк
lost = 0;
lostfix = 0;
UInt32 ts = BitConverter.ToUInt32(udata[0], 4);
for (int i = 0; i < ihe; i++)
{
//Console.WriteLine($"{i}\t{udata[i].Length}");
if (BitConverter.ToUInt32(udata[i], 4) != ts)
lost++;
if (udata[i].Length == 0)
lostfix++;
}
Res.Lost = (float)lost / (float)ihe;
rrr2.Lost = (float)lost / (float)ihe;
Res.LostFix = lostfix;
rrr2.LostFix = lostfix;
//Console.WriteLine($"-Lost: {(float)lost / (float)ihe * 100:F4}% {lost} {ihe} {udata.Count}");
Bitmap img = new Bitmap(iwi, ihe, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Rectangle rect = new Rectangle(0, 0, iwi, ihe);
@ -310,10 +325,12 @@ namespace UDPLIB @@ -310,10 +325,12 @@ namespace UDPLIB
}
catch (Exception)
{
#if DEBUG
using (StreamWriter sw = new StreamWriter(System.IO.File.OpenWrite("udplib.log")))
{
sw.WriteLine(DateTime.Now.ToString("HH:mm:ss:fff ") + "Error lib process");
}
#endif
}
}
#endregion
@ -328,19 +345,6 @@ namespace UDPLIB @@ -328,19 +345,6 @@ namespace UDPLIB
UInt16 pntlx = 0;
UInt16 pntly = 0;
//public UDPTransmit(String IPaddr, Int32 remotePortUDP, Point p)
//{
// transmitter = new UdpClient();
// endPoint = new IPEndPoint(IPAddress.Parse(IPaddr), remotePortUDP);
// pnt = p;
// pnt.X = Util.minmax((ushort)64, (ushort)576, (ushort)pnt.X);
// pnt.Y = Util.minmax((ushort)64, (ushort)416, (ushort)pnt.Y);
// Bitmap crop = Res.Clearimg.Clone(new Rectangle(pnt.X - 64, pnt.Y - 64, 128, 128), PixelFormat.Format24bppRgb);
// Res.Crop = crop;
// Thread UDPtransmitThread = new Thread(new ThreadStart(UDPtransmitFrame));
// UDPtransmitThread.Start();
//}
public UDPTransmit(String IPaddr, Int32 remotePortUDP, (UInt16, UInt16, UInt16, UInt16) p)
{
transmitter = new UdpClient();
@ -670,6 +674,8 @@ namespace UDPLIB @@ -670,6 +674,8 @@ namespace UDPLIB
public static UInt16 Iheight { set; get; }
public static UInt32 Frames { set; get; }
public static float Fps { set; get; }
public static float Lost { set; get; }
public static UInt32 LostFix { set; get; }
public static float AzUpr { set; get; }
public static float ElUpr { set; get; }
public static Int16 Course { set; get; }
@ -718,6 +724,8 @@ namespace UDPLIB @@ -718,6 +724,8 @@ namespace UDPLIB
public UInt16 Iwidth;
public UInt16 Iheight;
public UInt32 Frames;
public float Lost;
public UInt32 LostFix;
public float Fps;
public float AzUpr;
public float ElUpr;

31
util.cs

@ -251,13 +251,21 @@ namespace UTIL @@ -251,13 +251,21 @@ namespace UTIL
public static class S2B
{
#region Загрузка/выгрузка данных в структуру
//public static T BuffToStruct<T>(byte[] arr)
//{
// GCHandle gch = GCHandle.Alloc(arr, GCHandleType.Pinned);
// IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(arr, 0);
// T ret = (T)Marshal.PtrToStructure(ptr, typeof(T));
// gch.Free();
// return default(T);
//}
public static T BuffToStruct<T>(byte[] arr)
{
GCHandle gch = GCHandle.Alloc(arr, GCHandleType.Pinned);
IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(arr, 0);
T ret = (T)Marshal.PtrToStructure(ptr, typeof(T));
gch.Free();
return default(T);
GCHandle handle = GCHandle.Alloc(arr, GCHandleType.Pinned);
T stuff = (T)Marshal.PtrToStructure(
handle.AddrOfPinnedObject(), typeof(T));
handle.Free();
return stuff;
}
public static T BuffToClass<T>(byte[] arr)
{
@ -576,15 +584,20 @@ namespace UTIL @@ -576,15 +584,20 @@ namespace UTIL
public static String printtime(Boolean ms)
{
if (ms == true)
return DateTime.Now.ToString("HH:mm:ss:fff");
return DateTime.Now.ToString("HH:mm:ss:fff ");
else
return DateTime.Now.ToString("HH:mm:ss");
return DateTime.Now.ToString("HH:mm:ss ");
}
public static String printdatetime(Boolean ms)
{
if (ms == true)
return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff ");
else
return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ");
}
private const int EM_SETTABSTOPS = 0x00CB;
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr h, int msg, int wParam, int[] lParam);
public static void SetTabWidth(TextBox textbox, int tabWidth)
{
Graphics graphics = textbox.CreateGraphics();

Loading…
Cancel
Save