Commit 00094f06 by liulongfei

1. Tally 开发

2. NDI流优化
parent 1b9cbf6f
......@@ -11,6 +11,7 @@
<ResourceDictionary Source="/VIZ.Framework.Common;component/Widgets/ColorPickButton/ColorPickButton.xaml"></ResourceDictionary>
<ResourceDictionary Source="/VIZ.Framework.Common;component/Widgets/LabelValue/LabelValue.xaml"></ResourceDictionary>
<ResourceDictionary Source="/VIZ.Framework.Common;component/Widgets/HotkeyBox/HotkeyBox.xaml"></ResourceDictionary>
<ResourceDictionary Source="/VIZ.Framework.Common;component/Widgets/GPIOPinTestControl/GPIOPinTestControl.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
......@@ -138,6 +138,10 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Widgets\GPIOPinTestControl\GPIOPinTestControl.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Widgets\HotkeyBox\HotkeyBox.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
......@@ -253,6 +257,7 @@
<Compile Include="Widgets\ColorPickButton\ColorPickButton.cs" />
<Compile Include="Widgets\DebugBorder\DebugBorder.cs" />
<Compile Include="Widgets\DragWindowBar\DragWindowBar.cs" />
<Compile Include="Widgets\GPIOPinTestControl\GPIOPinTestControl.cs" />
<Compile Include="Widgets\HotkeyBox\HotkeyBox.cs" />
<Compile Include="Widgets\HotkeyBox\HotkeyHelper.cs" />
<Compile Include="Widgets\HotkeyBox\HotkeyPropertyAttribute.cs" />
......
......@@ -69,7 +69,7 @@ namespace VIZ.Framework.Common
if (this.old_video_timestamp == frame.timestamp)
{
NDIlib.framesync_free_video(this.Stream.RecvSyncInstancePtr, ref frame);
Thread.Sleep(1);
Thread.Sleep(10);
return;
}
......@@ -81,7 +81,7 @@ namespace VIZ.Framework.Common
if (frame.timestamp == 0 || frame.p_data == IntPtr.Zero || frame.p_data == null)
{
NDIlib.framesync_free_video(this.Stream.RecvSyncInstancePtr, ref frame);
Thread.Sleep(1);
Thread.Sleep(10);
return;
}
......@@ -110,7 +110,7 @@ namespace VIZ.Framework.Common
// 尝试释放帧数据
NDIlib.framesync_free_video(this.Stream.RecvSyncInstancePtr, ref frame);
Thread.Sleep(5);
Thread.Sleep(10);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace VIZ.Framework.Common
{
/// <summary>
/// GPIO引脚测试控件
/// </summary>
public class GPIOPinTestControl : Control
{
static GPIOPinTestControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(GPIOPinTestControl), new FrameworkPropertyMetadata(typeof(GPIOPinTestControl)));
}
}
}
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:VIZ.Framework.Common"
xmlns:core="clr-namespace:VIZ.Framework.Core;assembly=VIZ.Framework.Core">
<core:Bool2SolidColorBrushConverter x:Key="Bool2SolidColorBrushConverter"
TrueBrush="Red" FalseBrush="Transparent" NoneBrush="Transparent"></core:Bool2SolidColorBrushConverter>
<Style TargetType="local:GPIOPinTestControl">
<Setter Property="FocusVisualStyle" Value="{x:Null}"></Setter>
<Setter Property="BorderBrush" Value="#ff0e131e"></Setter>
<Setter Property="MinWidth" Value="300"></Setter>
<Setter Property="MinHeight" Value="80"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:GPIOPinTestControl">
<Grid Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="White"></Setter>
<Setter Property="FontSize" Value="12"></Setter>
<Setter Property="HorizontalAlignment" Value="Center"></Setter>
<Setter Property="VerticalAlignment" Value="Center"></Setter>
</Style>
<Style TargetType="Border">
<Setter Property="Margin" Value="10"></Setter>
<Setter Property="Background" Value="Transparent"></Setter>
</Style>
</Grid.Resources>
<Rectangle Height="4" Fill="{TemplateBinding BorderBrush}" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4"
VerticalAlignment="Top"></Rectangle>
<Rectangle Height="4" Fill="{TemplateBinding BorderBrush}" Grid.Row="0" Grid.Column="6" Grid.ColumnSpan="4"
VerticalAlignment="Top"></Rectangle>
<Rectangle Height="4" Fill="{TemplateBinding BorderBrush}" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="10"
VerticalAlignment="Bottom"></Rectangle>
<Rectangle Width="4" Fill="{TemplateBinding BorderBrush}" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2"
HorizontalAlignment="Left"></Rectangle>
<Rectangle Width="4" Fill="{TemplateBinding BorderBrush}" Grid.Row="0" Grid.Column="9" Grid.RowSpan="2"
HorizontalAlignment="Right"></Rectangle>
<!-- -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="0" Grid.Column="0">
<TextBlock Foreground="White" FontSize="14" Text=""></TextBlock>
</Border>
<!-- 0 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="0" Grid.Column="1">
<TextBlock Foreground="White" FontSize="14" Text="15"></TextBlock>
</Border>
<!-- 2 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="0" Grid.Column="2">
<TextBlock Foreground="White" FontSize="14" Text="14"></TextBlock>
</Border>
<!-- 3 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="0" Grid.Column="3">
<TextBlock Foreground="White" FontSize="14" Text="13"></TextBlock>
</Border>
<!-- 4 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="0" Grid.Column="4">
<TextBlock Foreground="White" FontSize="14" Text="12"></TextBlock>
</Border>
<!-- 5 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="0" Grid.Column="5">
<TextBlock Foreground="White" FontSize="14" Text="11"></TextBlock>
</Border>
<!-- 6 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="0" Grid.Column="6">
<TextBlock Foreground="White" FontSize="14" Text="10"></TextBlock>
</Border>
<!-- 7 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="0" Grid.Column="7">
<TextBlock Foreground="White" FontSize="14" Text="9"></TextBlock>
</Border>
<!-- 8 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="0" Grid.Column="8">
<TextBlock Foreground="White" FontSize="14" Text="8"></TextBlock>
</Border>
<!-- 9 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="0" Grid.Column="9">
<TextBlock Foreground="White" FontSize="14" Text=""></TextBlock>
</Border>
<!-- 10 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="1" Grid.Column="0">
<TextBlock Foreground="White" FontSize="14" Text="GND"></TextBlock>
</Border>
<!-- 11 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="1" Grid.Column="1">
<TextBlock Foreground="White" FontSize="14" Text="7"></TextBlock>
</Border>
<!-- 12 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="1" Grid.Column="2">
<TextBlock Foreground="White" FontSize="14" Text="6"></TextBlock>
</Border>
<!-- 13 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="1" Grid.Column="3">
<TextBlock Foreground="White" FontSize="14" Text="5"></TextBlock>
</Border>
<!-- 14 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="1" Grid.Column="4">
<TextBlock Foreground="White" FontSize="14" Text="4"></TextBlock>
</Border>
<!-- 15 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="1" Grid.Column="5">
<TextBlock Foreground="White" FontSize="14" Text="3"></TextBlock>
</Border>
<!-- 16 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="1" Grid.Column="6">
<TextBlock Foreground="White" FontSize="14" Text="2"></TextBlock>
</Border>
<!-- 17 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="1" Grid.Column="7"
Background="Red">
<TextBlock Foreground="White" FontSize="14" Text="1"></TextBlock>
</Border>
<!-- 18 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="1" Grid.Column="8">
<TextBlock Foreground="White" FontSize="14" Text="0"></TextBlock>
</Border>
<!-- 19 -->
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="2" Grid.Row="1" Grid.Column="9">
<TextBlock Foreground="White" FontSize="14" Text=""></TextBlock>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.Framework.Core
{
/// <summary>
/// 任务信息
/// </summary>
public class TaskInfo
{
/// <summary>
/// 是否取消任务
/// </summary>
public bool IsCancel { get; set; }
}
}
......@@ -38,7 +38,7 @@ namespace VIZ.Framework.Core
/// <param name="propertyName">属性名</param>
public void RaisePropertySaveChanging(string propertyName)
{
if (Application.Current.Dispatcher.CheckAccess())
if (Application.Current == null || Application.Current.Dispatcher.CheckAccess())
{
this.PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(propertyName));
......@@ -66,7 +66,7 @@ namespace VIZ.Framework.Core
/// <param name="propertyName">属性名</param>
public void RaisePropertySaveChanged(string propertyName)
{
if (Application.Current.Dispatcher.CheckAccess())
if (Application.Current == null || Application.Current.Dispatcher.CheckAccess())
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.Framework.Core
{
/// <summary>
/// GPI设备管理器
/// </summary>
public static class GPIManager
{
/// <summary>
/// 设备个数
/// </summary>
public static int DevCount { get; private set; }
/// <summary>
/// 设备句柄
/// </summary>
public static IntPtr[] DevHandles { get; private set; } = new IntPtr[20];
/// <summary>
/// 初始化设备
/// </summary>
public static void Initialize()
{
DevCount = GPI_USB_DEVICE.USB_ScanDevice(DevHandles);
}
/// <summary>
/// 打开设备
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <returns>执行结果 true:成功,false:失败</returns>
public static bool OpenDevice(IntPtr DevHandle)
{
bool state = GPI_USB_DEVICE.USB_OpenDevice(DevHandle);
if (!state)
{
Console.WriteLine("Open device error!" + DevHandle.ToString("X8"));
}
else
{
//初始化输入 IN0~IN3
GPI_USB2GPI_DEVICE.GPIO_SetInput(DevHandle, 0x03C0, 0);
}
return state;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.Framework.Core
{
/// <summary>
/// GPI设备 USB到GPI设备驱动 返回值
/// </summary>
public static class GPI_USB2GPI_DEVICE_RESULT
{
/// <summary>
/// 函数执行成功
/// </summary>
public const Int32 GPIO_SUCCESS = 0;
/// <summary>
/// 适配器不支持该函数
/// </summary>
public const Int32 GPIO_ERR_NOT_SUPPORT = -1;
/// <summary>
/// USB写数据失败
/// </summary>
public const Int32 GPIO_ERR_USB_WRITE_FAIL = -2;
/// <summary>
/// USB读数据失败
/// </summary>
public const Int32 GPIO_ERR_USB_READ_FAIL = -3;
/// <summary>
/// 命令执行失败
/// </summary>
public const Int32 GPIO_ERR_CMD_FAIL = -4;
}
/// <summary>
/// GPI设备 USB到GPI设备驱动
/// </summary>
public static class GPI_USB2GPI_DEVICE
{
/// <summary>
/// 将GPIO引脚设置为输入模式
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <param name="PinMask">需要设置为输入模式的引脚,每个bit位代表一个引脚,对应bit位为1时改引脚对设置有效,最低位为P0</param>
/// <param name="PuPd">0-浮空输入,无上拉或者下拉,1-上拉输入,2-下拉输入</param>
/// <returns>函数执行状态,小于0函数执行出错<see cref="GPI_USB2GPI_DEVICE_RESULT"/></returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 GPIO_SetInput(IntPtr DevHandle, UInt32 PinMask, Byte PuPd);
/// <summary>
/// 将GPIO引脚设置为输出模式
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <param name="PinMask">需要设置为输入模式的引脚,每个bit位代表一个引脚,对应bit位为1时改引脚对设置有效,最低位为P0</param>
/// <param name="PuPd">0-浮空输入,无上拉或者下拉,1-上拉输入,2-下拉输入</param>
/// <returns>函数执行状态,小于0函数执行出错<see cref="GPI_USB2GPI_DEVICE_RESULT"/></returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 GPIO_SetOutput(IntPtr DevHandle, UInt32 PinMask, Byte PuPd);
/// <summary>
/// 将GPIO引脚设置为开漏模式,该模式下可作为双向引脚
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <param name="PinMask">需要设置为输入模式的引脚,每个bit位代表一个引脚,对应bit位为1时改引脚对设置有效,最低位为P0</param>
/// <param name="PuPd">0-浮空输入,无上拉或者下拉,1-上拉输入,2-下拉输入</param>
/// <returns>函数执行状态,小于0函数执行出错<see cref="GPI_USB2GPI_DEVICE_RESULT"/></returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 GPIO_SetOpenDrain(IntPtr DevHandle, UInt32 PinMask, Byte PuPd);
/// <summary>
/// 设置GPIO引脚的输出状态
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <param name="PinMask">需要设置为输入模式的引脚,每个bit位代表一个引脚,对应bit位为1时改引脚对设置有效,最低位为P0</param>
/// <param name="PinValue">对应引脚的状态,每个bit位代表一个引脚,对应bit位为1输出高电平,为0输出低电平,最低位对应P0</param>
/// <returns>函数执行状态,小于0函数执行出错<see cref="GPI_USB2GPI_DEVICE_RESULT"/></returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 GPIO_Write(IntPtr DevHandle, UInt32 PinMask, UInt32 PinValue);
/// <summary>
/// 设置GPIO引脚的输出状态
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <param name="PinMask">需要设置为输入模式的引脚,每个bit位代表一个引脚,对应bit位为1时改引脚对设置有效,最低位为P0</param>
/// <param name="pPinValue">对应引脚的状态,每个bit位代表一个引脚,对应bit位为1引脚为高电平,为0引脚为低电平,最低位对应P0</param>
/// <returns>函数执行状态,小于0函数执行出错<see cref="GPI_USB2GPI_DEVICE_RESULT"/></returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 GPIO_Read(IntPtr DevHandle, UInt32 PinMask, ref UInt32 pPinValue);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace VIZ.Framework.Core
{
/// <summary>
/// USB转GPIO
/// </summary>
public class USB2GPIO
{
/// <summary>
/// 将GPIO引脚设置为输入模式
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <param name="PinMask">需要设置为输入模式的引脚,每个bit位代表一个引脚,对应bit位为1时改引脚对设置有效,最低位为P0</param>
/// <param name="PuPd">PuPd 0-浮空输入,无上拉或者下拉,1-上拉输入,2-下拉输入</param>
/// <returns>函数执行状态,小于0函数执行出错<see cref="GPIOResult"/></returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 GPIO_SetInput(Int32 DevHandle, UInt32 PinMask, Byte PuPd);
/// <summary>
/// 将GPIO引脚设置为输出模式
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <param name="PinMask">需要设置为输出模式的引脚,每个bit位代表一个引脚,对应bit位为1时改引脚对设置有效,最低位对应P0</param>
/// <param name="PuPd">PuPd 0-推挽输出,无上拉或者下拉,1-上拉输出,2-下拉输出</param>
/// <returns>函数执行状态,小于0函数执行出错<see cref="GPIOResult"/></returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 GPIO_SetOutput(Int32 DevHandle, UInt32 PinMask, Byte PuPd);
/// <summary>
/// 将GPIO引脚设置为开漏模式,该模式下可作为双向引脚
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <param name="PinMask">需要设置为开漏模式的引脚,每个bit位代表一个引脚,对应bit位为1时改引脚对设置有效,最低位对应P0</param>
/// <param name="PuPd"> PuPd 0-内部无上拉或者下拉,1-使能上拉,2-使能下拉</param>
/// <returns>函数执行状态,小于0函数执行出错<see cref="GPIOResult"/></returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 GPIO_SetOpenDrain(Int32 DevHandle, UInt32 PinMask, Byte PuPd);
/// <summary>
/// 设置GPIO引脚的输出状态
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <param name="PinMask">需要输出状态的引脚,每个bit位代表一个引脚,对应bit位为1时改引脚对设置有效,最低位对应P0</param>
/// <param name="PinValue">对应引脚的状态,每个bit位代表一个引脚,对应bit位为1输出高电平,为0输出低电平,最低位对应P0</param>
/// <returns>函数执行状态,小于0函数执行出错<see cref="GPIOResult"/></returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 GPIO_Write(Int32 DevHandle, UInt32 PinMask, UInt32 PinValue);
/// <summary>
/// 获取GPIO引脚的输入状态
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <param name="PinMask">需要获取状态的引脚,每个bit位代表一个引脚,对应bit位为1时改引脚对设置有效,最低位对应P0</param>
/// <param name="pPinValue">对应引脚的状态,每个bit位代表一个引脚,对应bit位为1引脚为高电平,为0引脚为低电平,最低位对应P0</param>
/// <returns>函数执行状态,小于0函数执行出错<see cref="GPIOResult"/></returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 GPIO_Read(Int32 DevHandle, UInt32 PinMask, ref UInt32 pPinValue);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.Framework.Core
{
/// <summary>
/// USB设备
/// </summary>
public static class USBDevice
{
/// <summary>
/// 扫描查找设备
/// </summary>
/// <param name="pDevHandle">设备句柄</param>
/// <remarks>pDevHandle数组长度一般为20</remarks>
/// <returns>函数执行状态,小于0函数执行出错</returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 USB_ScanDevice(Int32[] pDevHandle);
/// <summary>
/// 打开设备
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <returns>设备状态,是否可用</returns>
[DllImport("USB2XXX.dll")]
public static extern bool USB_OpenDevice(Int32 DevHandle);
/// <summary>
/// 关闭设备
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <returns>是否成功关闭</returns>
[DllImport("USB2XXX.dll")]
public static extern bool USB_CloseDevice(Int32 DevHandle);
/// <summary>
/// 获取设备信息
/// </summary>
/// <param name="DevHandle">设备句柄</param>
/// <param name="pDevInfo">设备信息</param>
/// <param name="pFunctionStr">功能字符串</param>
/// <returns>是否成功获取</returns>
[DllImport("USB2XXX.dll")]
public static extern bool DEV_GetDeviceInfo(Int32 DevHandle, ref USBDeviceStruct pDevInfo, StringBuilder pFunctionStr);
}
}
......@@ -8,9 +8,9 @@ using System.Threading.Tasks;
namespace VIZ.Framework.Core
{
/// <summary>
/// GPI设备USB驱动 信息
/// USB设备信息结构
/// </summary>
public struct GPI_USB_DEVICE_INFO
public struct USBDeviceStruct
{
/// <summary>
/// 固件名称字符串
......@@ -45,86 +45,4 @@ namespace VIZ.Framework.Core
/// </summary>
public UInt32 Functions;
}
/// <summary>
/// GPI设备USB驱动
/// </summary>
public static class GPI_USB_DEVICE
{
/// <summary>
/// 定义电压输出值 -- 不输出
/// </summary>
public const Byte POWER_LEVEL_NONE = 0;
/// <summary>
/// 定义电压输出值 -- 输出1.8V
/// </summary>
public const Byte POWER_LEVEL_1V8 = 1;
/// <summary>
/// 定义电压输出值 -- 输出2.5V
/// </summary>
public const Byte POWER_LEVEL_2V5 = 2;
/// <summary>
/// 定义电压输出值 -- 输出3.3V
/// </summary>
public const Byte POWER_LEVEL_3V3 = 3;
/// <summary>
/// 定义电压输出值 -- 输出5.0V
/// </summary>
public const Byte POWER_LEVEL_5V0 = 4;
/// <summary>
/// 初始化USB设备,并扫描设备连接数,必须调用
/// </summary>
/// <param name="pDevHandle">每个设备的设备号存储地址</param>
/// <returns>扫描到的设备数量</returns>
[DllImport("USB2XXX.dll")]
public static extern Int32 USB_ScanDevice(IntPtr[] pDevHandle);
/// <summary>
/// 打开设备,必须调用
/// </summary>
/// <param name="DevHandle">设备索引号</param>
/// <returns>打开设备的状态</returns>
[DllImport("USB2XXX.dll")]
public static extern bool USB_OpenDevice(IntPtr DevHandle);
/// <summary>
/// 关闭设备,必须调用
/// </summary>
/// <param name="DevHandle">设备索引号</param>
/// <returns>打开设备的状态</returns>
[DllImport("USB2XXX.dll")]
public static extern bool USB_CloseDevice(IntPtr DevHandle);
/// <summary>
/// 复位设备程序,复位后需要重新调用USB_ScanDevice,USB_OpenDevice函数
/// </summary>
/// <param name="DevHandle">设备索引号</param>
/// <returns>复位设备的状态</returns>
[DllImport("USB2XXX.dll")]
public static extern bool USB_ResetDevice(IntPtr DevHandle);
/// <summary>
/// 获取设备信息,比如设备名称,固件版本号,设备序号,设备功能说明字符串等
/// </summary>
/// <param name="DevHandle">设备索引号</param>
/// <param name="pDevInfo">设备信息存储结构体指针</param>
/// <param name="pFunctionStr">设备功能说明字符串</param>
/// <returns>获取设备信息的状态</returns>
[DllImport("USB2XXX.dll")]
public static extern bool DEV_GetDeviceInfo(IntPtr DevHandle, ref GPI_USB_DEVICE_INFO pDevInfo, StringBuilder pFunctionStr);
/// <summary>
/// 设置可变电压输出引脚输出电压值
/// </summary>
/// <param name="DevHandle">设备索引号</param>
/// <param name="PowerLevel">输出电压值</param>
/// <returns>设置输出电压状态</returns>
[DllImport("USB2XXX.dll")]
public static extern bool DEV_SetPowerLevel(IntPtr DevHandle, byte PowerLevel);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.Framework.Core
{
/// <summary>
/// GPIO 引脚
/// </summary>
public static class GPIOPin
{
/// <summary>
/// PIN 0
/// </summary>
public const uint PIN_0 = 0b0000000010000000;
/// <summary>
/// PIN 1
/// </summary>
public const uint PIN_1 = 0b0000000001000000;
/// <summary>
/// PIN 2
/// </summary>
public const uint PIN_2 = 0b0000000000100000;
/// <summary>
/// PIN 3
/// </summary>
public const uint PIN_3 = 0b0000000000010000;
/// <summary>
/// PIN 4
/// </summary>
public const uint PIN_4 = 0b0000000000001000;
/// <summary>
/// PIN 5
/// </summary>
public const uint PIN_5 = 0b0000000000000100;
/// <summary>
/// PIN 6
/// </summary>
public const uint PIN_6 = 0b0000000000000010;
/// <summary>
/// PIN 7
/// </summary>
public const uint PIN_7 = 0b0000000000000001;
/// <summary>
/// PIN 8
/// </summary>
public const uint PIN_8 = 0b1000000000000000;
/// <summary>
/// PIN 9
/// </summary>
public const uint PIN_9 = 0b0100000000000000;
/// <summary>
/// PIN 10
/// </summary>
public const uint PIN_10 = 0b0010000000000000;
/// <summary>
/// PIN 11
/// </summary>
public const uint PIN_11 = 0b0001000000000000;
/// <summary>
/// PIN 12
/// </summary>
public const uint PIN_12 = 0b0000100000000000;
/// <summary>
/// PIN 13
/// </summary>
public const uint PIN_13 = 0b0000010000000000;
/// <summary>
/// PIN 14
/// </summary>
public const uint PIN_14 = 0b0000001000000000;
/// <summary>
/// PIN 15
/// </summary>
public const uint PIN_15 = 0b0000000100000000;
/// <summary>
/// PIN 0 ~ 7
/// </summary>
public const uint PIN_0_TO_7 = 0b0000000011111111;
/// <summary>
/// PIN 8 ~ 15
/// </summary>
public const uint PIN_8_TO_15 = 0b1111111100000000;
/// <summary>
/// PIN 0 ~ 15
/// </summary>`
public const uint PIN_0_TO_15 = 0b1111111111111111;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.Framework.Core
{
/// <summary>
/// 触发类型
/// </summary>
public enum GPIOPuPd
{
/// <summary>
/// 没有上拉下拉
/// </summary>
NOPULL = 0,
/// <summary>
/// 使能上拉
/// </summary>
UP = 1,
/// <summary>
/// 使能下拉
/// </summary>
DOWN = 2
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.Framework.Core
{
/// <summary>
/// GPIO返回值
/// </summary>
public enum GPIOResult
{
/// <summary>
/// 函数执行成功
/// </summary>
[Description("函数执行成功")]
GPIO_SUCCESS = 0,
/// <summary>
/// 适配器不支持该函数
/// </summary>
[Description("适配器不支持该函数")]
GPIO_ERR_NOT_SUPPORT = -1,
/// <summary>
/// USB写数据失败
/// </summary>
[Description("USB写数据失败")]
GPIO_ERR_USB_WRITE_FAIL = -2,
/// <summary>
/// USB读数据失败
/// </summary>
[Description("USB读数据失败")]
GPIO_ERR_USB_READ_FAIL = -3,
/// <summary>
/// 命令执行失败
/// </summary>
[Description("命令执行失败")]
GPIO_ERR_CMD_FAIL = -4
}
}
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Markup;
namespace VIZ.Framework.Core
{
/// <summary>
/// GPIO管理器
/// </summary>
public static class GPIOManager
{
/// <summary>
/// 日志
/// </summary>
private readonly static ILog log = LogManager.GetLogger(typeof(GPIOManager));
/// <summary>
/// 搜索设备
/// </summary>
/// <returns>设备个数</returns>
public static List<USBDeviceInfo> ScanDevice()
{
List<USBDeviceInfo> infos = new List<USBDeviceInfo>();
//扫描查找设备
int[] devHandles = new int[20];
int devNum = USBDevice.USB_ScanDevice(devHandles);
if (devNum <= 0)
{
return infos;
}
for (int i = 0; i < devNum; ++i)
{
USBDeviceInfo info = new USBDeviceInfo();
info.Handle = devHandles[i];
infos.Add(info);
}
return infos;
}
/// <summary>
/// 模型集合
/// </summary>
public static List<GPIOModel> Models { get; private set; } = new List<GPIOModel>();
}
}
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.Framework.Core
{
/// <summary>
/// USB设备模型
/// </summary>
public class GPIOModel : ModelBase, IDisposable
{
/// <summary>
/// 日志
/// </summary>
private readonly static ILog log = LogManager.GetLogger(typeof(GPIOModel));
/// <summary>
/// 引脚掩码
/// </summary>
private readonly static uint PIN_MASK = GPIOPin.PIN_0_TO_15;
/// <summary>
/// 读取引脚值延时(单位:毫秒)
/// </summary>
private readonly static int READ_PIN_VALUE_DELAY = 200;
/// <summary>
/// 重新打开设备延时
/// </summary>
private readonly static int REOPEN_DEVICE_DELAY = 1000;
/// <summary>
/// USB设备模型
/// </summary>
/// <param name="deviceInfo">USB设备信息</param>
public GPIOModel(USBDeviceInfo deviceInfo)
{
this.Update(deviceInfo);
}
#region Handle -- 句柄
private int handle;
/// <summary>
/// 句柄
/// </summary>
public int Handle
{
get { return handle; }
set { handle = value; this.RaisePropertyChanged(nameof(Handle)); }
}
#endregion
#region USBDeviceInfo -- 设备信息
private USBDeviceInfo deviceInfo;
/// <summary>
/// 设备信息
/// </summary>
public USBDeviceInfo DeviceInfo
{
get { return deviceInfo; }
private set { deviceInfo = value; this.RaisePropertyChanged(nameof(DeviceInfo)); }
}
#endregion
#region PIN_0 -- 引脚0是否接通
private bool pin_0;
/// <summary>
/// 引脚0是否接通
/// </summary>
public bool PIN_0
{
get { return pin_0; }
set { pin_0 = value; this.RaisePropertyChanged(nameof(PIN_0)); }
}
#endregion
#region PIN_1 -- 引脚1是否接通
private bool pin_1;
/// <summary>
/// 引脚1是否接通
/// </summary>
public bool PIN_1
{
get { return pin_1; }
set { pin_1 = value; this.RaisePropertyChanged(nameof(PIN_1)); }
}
#endregion
#region PIN_2 -- 引脚2是否接通
private bool pin_2;
/// <summary>
/// 引脚2是否接通
/// </summary>
public bool PIN_2
{
get { return pin_2; }
set { pin_2 = value; this.RaisePropertyChanged(nameof(PIN_2)); }
}
#endregion
#region PIN_3 -- 引脚3是否接通
private bool pin_3;
/// <summary>
/// 引脚3是否接通
/// </summary>
public bool PIN_3
{
get { return pin_3; }
set { pin_3 = value; this.RaisePropertyChanged(nameof(PIN_3)); }
}
#endregion
#region PIN_4 -- 引脚4是否接通
private bool pin_4;
/// <summary>
/// 引脚4是否接通
/// </summary>
public bool PIN_4
{
get { return pin_4; }
set { pin_4 = value; this.RaisePropertyChanged(nameof(PIN_4)); }
}
#endregion
#region PIN_5 -- 引脚5是否接通
private bool pin_5;
/// <summary>
/// 引脚5是否接通
/// </summary>
public bool PIN_5
{
get { return pin_5; }
set { pin_5 = value; this.RaisePropertyChanged(nameof(PIN_5)); }
}
#endregion
#region PIN_6 -- 引脚6是否接通
private bool pin_6;
/// <summary>
/// 引脚6是否接通
/// </summary>
public bool PIN_6
{
get { return pin_6; }
set { pin_6 = value; this.RaisePropertyChanged(nameof(PIN_6)); }
}
#endregion
#region PIN_7 -- 引脚7是否接通
private bool pin_7;
/// <summary>
/// 引脚7是否接通
/// </summary>
public bool PIN_7
{
get { return pin_7; }
set { pin_7 = value; this.RaisePropertyChanged(nameof(PIN_7)); }
}
#endregion
#region PIN_8 -- 引脚8是否接通
private bool pin_8;
/// <summary>
/// 引脚8是否接通
/// </summary>
public bool PIN_8
{
get { return pin_8; }
set { pin_8 = value; this.RaisePropertyChanged(nameof(PIN_8)); }
}
#endregion
#region PIN_9 -- 引脚9是否接通
private bool pin_9;
/// <summary>
/// 引脚9是否接通
/// </summary>
public bool PIN_9
{
get { return pin_9; }
set { pin_9 = value; this.RaisePropertyChanged(nameof(PIN_9)); }
}
#endregion
#region PIN_10 -- 引脚10是否接通
private bool pin_10;
/// <summary>
/// 引脚10是否接通
/// </summary>
public bool PIN_10
{
get { return pin_10; }
set { pin_10 = value; this.RaisePropertyChanged(nameof(PIN_10)); }
}
#endregion
#region PIN_11 -- 引脚11是否接通
private bool pin_11;
/// <summary>
/// 引脚11是否接通
/// </summary>
public bool PIN_11
{
get { return pin_11; }
set { pin_11 = value; this.RaisePropertyChanged(nameof(PIN_11)); }
}
#endregion
#region PIN_12 -- 引脚12是否接通
private bool pin_12;
/// <summary>
/// 引脚12是否接通
/// </summary>
public bool PIN_12
{
get { return pin_12; }
set { pin_12 = value; this.RaisePropertyChanged(nameof(PIN_12)); }
}
#endregion
#region PIN_13 -- 引脚13是否接通
private bool pin_13;
/// <summary>
/// 引脚13是否接通
/// </summary>
public bool PIN_13
{
get { return pin_13; }
set { pin_13 = value; this.RaisePropertyChanged(nameof(PIN_13)); }
}
#endregion
#region PIN_14 -- 引脚14是否接通
private bool pin_14;
/// <summary>
/// 引脚14是否接通
/// </summary>
public bool PIN_14
{
get { return pin_14; }
set { pin_14 = value; this.RaisePropertyChanged(nameof(PIN_14)); }
}
#endregion
#region PIN_15 -- 引脚15是否接通
private bool pin_15;
/// <summary>
/// 引脚15是否接通
/// </summary>
public bool PIN_15
{
get { return pin_15; }
set { pin_15 = value; this.RaisePropertyChanged(nameof(PIN_15)); }
}
#endregion
#region DeviceState -- 设备状态
private bool deviceState;
/// <summary>
/// 设备状态
/// </summary>
public bool DeviceState
{
get { return deviceState; }
set { deviceState = value; this.RaisePropertySaveChanged(nameof(DeviceState)); }
}
#endregion
/// <summary>
/// 状态读取线程
/// </summary>
private Task readTask;
/// <summary>
/// 状态读取线程信息
/// </summary>
private TaskInfo readTaskInfo;
/// <summary>
/// 更新设备信息
/// </summary>
/// <param name="deviceInfo">设备信息</param>
public void Update(USBDeviceInfo deviceInfo)
{
this.DeviceInfo = deviceInfo;
this.Handle = deviceInfo.Handle;
}
/// <summary>
/// 打开设备
/// </summary>
/// <returns>是否成功打开</returns>
public bool Open()
{
this.DeviceState = false;
if (this.DeviceInfo == null)
return false;
if (!this.DeviceInfo.Close())
return false;
if (!this.DeviceInfo.Open())
return false;
if (!this.DeviceInfo.SetInput(PIN_MASK, GPIOPuPd.NOPULL))
return false;
if (this.readTaskInfo != null)
{
this.readTaskInfo.IsCancel = true;
}
this.DeviceState = true;
if (this.readTask == null)
{
this.readTaskInfo = new TaskInfo();
this.readTask = Task.Run(this.executeRead);
}
return true;
}
/// <summary>
/// 关闭设备
/// </summary>
public void Close()
{
if (this.readTaskInfo != null)
{
this.readTaskInfo.IsCancel = true;
}
this.readTaskInfo = null;
this.readTask = null;
this.deviceInfo.Close();
}
/// <summary>
/// 销毁
/// </summary>
public void Dispose()
{
this.Close();
}
/// <summary>
/// 执行读取
/// </summary>
private void executeRead()
{
TaskInfo taskInfo = this.readTaskInfo;
while (!taskInfo.IsCancel)
{
try
{
// 无设备信息
if (this.DeviceInfo == null)
{
Task.Delay(READ_PIN_VALUE_DELAY).Wait();
continue;
}
// 设备状态不可用时尝试重新初始化设备
if (!this.DeviceState && !this.Open())
{
Task.Delay(REOPEN_DEVICE_DELAY).Wait();
continue;
}
// 每轮尝试5次读取
uint pinValue = 0;
this.DeviceInfo.Read(PIN_MASK, out pinValue);
this.updatePinValue(pinValue);
Task.Delay(READ_PIN_VALUE_DELAY).Wait();
}
catch (Exception ex)
{
log.Error(ex);
}
}
}
/// <summary>
/// 更新引脚值
/// </summary>
/// <param name="pinValue">引脚值</param>
private void updatePinValue(uint pinValue)
{
bool[] state = new bool[16];
state[0] = (GPIOPin.PIN_0 & pinValue) == 1;
state[1] = (GPIOPin.PIN_1 & pinValue) == 1;
state[2] = (GPIOPin.PIN_2 & pinValue) == 1;
state[3] = (GPIOPin.PIN_3 & pinValue) == 1;
state[4] = (GPIOPin.PIN_4 & pinValue) == 1;
state[5] = (GPIOPin.PIN_5 & pinValue) == 1;
state[6] = (GPIOPin.PIN_6 & pinValue) == 1;
state[7] = (GPIOPin.PIN_7 & pinValue) == 1;
state[8] = (GPIOPin.PIN_8 & pinValue) == 1;
state[9] = (GPIOPin.PIN_9 & pinValue) == 1;
state[10] = (GPIOPin.PIN_10 & pinValue) == 1;
state[11] = (GPIOPin.PIN_11 & pinValue) == 1;
state[12] = (GPIOPin.PIN_12 & pinValue) == 1;
state[13] = (GPIOPin.PIN_13 & pinValue) == 1;
state[14] = (GPIOPin.PIN_14 & pinValue) == 1;
state[15] = (GPIOPin.PIN_15 & pinValue) == 1;
WPFHelper.BeginInvoke(() =>
{
this.PIN_0 = state[0];
this.PIN_1 = state[1];
this.PIN_2 = state[2];
this.PIN_3 = state[3];
this.PIN_4 = state[4];
this.PIN_5 = state[5];
this.PIN_6 = state[6];
this.PIN_7 = state[7];
this.PIN_8 = state[8];
this.PIN_9 = state[9];
this.PIN_10 = state[10];
this.PIN_11 = state[11];
this.PIN_12 = state[12];
this.PIN_13 = state[13];
this.PIN_14 = state[14];
this.PIN_15 = state[15];
});
}
}
}
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.Framework.Core
{
/// <summary>
/// USB设备信息
/// </summary>
public class USBDeviceInfo
{
/// <summary>
/// 日志
/// </summary>
private static readonly ILog log = LogManager.GetLogger(typeof(USBDeviceInfo));
/// <summary>
/// 句柄
/// </summary>
public int Handle { get; set; }
/// <summary>
/// 设备信息结构体
/// </summary>
public USBDeviceStruct Struct { get; set; }
// ====================================================================
// 基本信息
/// <summary>
/// 固件名称
/// </summary>
public string FirmwareName { get; set; }
/// <summary>
/// 固件编译时间
/// </summary>
public string BuildDate { get; set; }
/// <summary>
/// 硬件版本号
/// </summary>
public string HardwareVersion { get; set; }
/// <summary>
/// 固件版本号
/// </summary>
public string FirmwareVersion { get; set; }
/// <summary>
/// 适配器序列号
/// </summary>
public string SerialNumber { get; set; }
/// <summary>
/// 适配器当前具备的功能
/// </summary>
public string Functions { get; set; }
/// <summary>
/// 触发类型
/// </summary>
public GPIOPuPd PuPd { get; set; }
// ====================================================================
// 状态信息
/// <summary>
/// 状态
/// </summary>
public bool State { get; set; }
/// <summary>
/// 打开设备
/// </summary>
public bool Open()
{
if (this.Handle <= 0)
return false;
if (!USBDevice.USB_OpenDevice(this.Handle))
{
return false;
}
USBDeviceStruct data = new USBDeviceStruct();
StringBuilder funcStr = new StringBuilder(256);
if (!USBDevice.DEV_GetDeviceInfo(this.Handle, ref data, funcStr))
{
log.Error($"获取USB设备信息失败,编号: {this.Handle}");
return false;
}
this.FirmwareName = Encoding.Default.GetString(data.FirmwareName).Trim();
this.BuildDate = Encoding.Default.GetString(data.BuildDate).Trim();
this.FirmwareVersion = string.Format("{0}.{1}.{2}", (data.FirmwareVersion >> 24) & 0xFF, (data.FirmwareVersion >> 16) & 0xFF, data.FirmwareVersion & 0xFFFF);
this.HardwareVersion = string.Format("{0}.{1}.{2}", (data.HardwareVersion >> 24) & 0xFF, (data.HardwareVersion >> 16) & 0xFF, data.HardwareVersion & 0xFFFF);
this.Functions = funcStr.ToString().Trim();
this.SerialNumber = data.SerialNumber[0].ToString("X8") + data.SerialNumber[1].ToString("X8") + data.SerialNumber[2].ToString("X8");
this.State = true;
return true;
}
/// <summary>
/// 设置输入模式
/// </summary>
/// <param name="pinMask">引脚掩码</param>
/// <param name="pupd">输入输出模式</param>
/// <returns>是否设置成功</returns>
public bool SetInput(uint pinMask, GPIOPuPd pupd)
{
this.PuPd = pupd;
GPIOResult result = GPIOResult.GPIO_SUCCESS;
// 尝试5次设置
for (int i = 0; i < 5; i++)
{
result = (GPIOResult)USB2GPIO.GPIO_SetInput(this.Handle, pinMask, (byte)pupd);
if (result != GPIOResult.GPIO_SUCCESS)
{
continue;
}
break;
}
if (result != GPIOResult.GPIO_SUCCESS)
{
log.Error($"设置USB输入模式失败, handle: {this.Handle} result : {result.GetDescription()}");
this.State = false;
return false;
}
this.State = true;
return true;
}
/// <summary>
/// 读取
/// </summary>
/// <param name="pinMask">引脚掩码</param>
/// <param name="pinValue">引脚值</param>
/// <returns>是否成功读取</returns>
public bool Read(uint pinMask, out uint pinValue)
{
if (!this.State)
{
pinValue = 0;
return false;
}
uint value = 0;
GPIOResult result = (GPIOResult)USB2GPIO.GPIO_Read(this.Handle, pinMask, ref value);
pinValue = value;
if (result != GPIOResult.GPIO_SUCCESS)
{
return false;
}
return true;
}
/// <summary>
/// 关闭设备
/// </summary>
/// <returns>是否成功关闭</returns>
public bool Close()
{
if (this.Handle <= 0)
return false;
if (!USBDevice.USB_CloseDevice(this.Handle))
{
log.Error($"关闭USB设备失败, handle: {this.Handle}");
return false;
}
this.State = false;
return true;
}
}
}
......@@ -102,9 +102,6 @@
<Compile Include="Core\Net\NetHelperMacInfo.cs" />
<Compile Include="Core\Safe\ApplicationMacCheckAttribute.cs" />
<Compile Include="Core\Safe\ApplicationTimeCheckAttribute.cs" />
<Compile Include="Expand\GPI\GPIManager.cs" />
<Compile Include="Expand\GPI\GPI_USB2GPI_DEVICE.cs" />
<Compile Include="Expand\GPI\GPI_USB_DEVICE.cs" />
<Compile Include="Core\Image\ImageHelperExpand.cs" />
<Compile Include="Core\Image\ImageHelper.cs" />
<Compile Include="Core\Converter\Bitmap2ImageSourceConverter.cs" />
......@@ -123,6 +120,16 @@
<Compile Include="Core\Message\IMessageManager.cs" />
<Compile Include="Core\Message\MessageInfo.cs" />
<Compile Include="Core\Message\MessageManager.cs" />
<Compile Include="Core\Task\TaskInfo.cs" />
<Compile Include="Expand\GPIO\Core\USB2GPIO.cs" />
<Compile Include="Expand\GPIO\Core\USBDevice.cs" />
<Compile Include="Expand\GPIO\Core\USBDeviceStruct.cs" />
<Compile Include="Expand\GPIO\Enum\GPIOPin.cs" />
<Compile Include="Expand\GPIO\Enum\GPIOPuPd.cs" />
<Compile Include="Expand\GPIO\Enum\GPIOResult.cs" />
<Compile Include="Expand\GPIO\GPIOManager.cs" />
<Compile Include="Expand\GPIO\USBDeviceInfo.cs" />
<Compile Include="Expand\GPIO\GPIOModel.cs" />
<Compile Include="Expand\Monitor\IMonitorManager.cs" />
<Compile Include="Expand\Monitor\IMonitorProvider.cs" />
<Compile Include="Expand\Monitor\IMonitorTrigger.cs" />
......
......@@ -33,7 +33,7 @@ namespace VIZ.Framework.Storage
/// <summary>
/// 跟踪框边框宽度(单位:像素)
/// </summary>
[Ini(Section = "Video", DefaultValue = "4", Type = typeof(int))]
[Ini(Section = "Video", DefaultValue = "2", Type = typeof(int))]
public string VIDEO_TRACKING_BOX_BORDER_WIDTH { get; set; }
/// <summary>
......@@ -43,6 +43,18 @@ namespace VIZ.Framework.Storage
public string VIDEO_TRACKING_BOX_BORDER_COLOR { get; set; }
/// <summary>
/// 检测边框宽度(单位:像素)
/// </summary>
[Ini(Section = "Video", DefaultValue = "2", Type = typeof(int))]
public string VIDEO_DETECT_BOX_BORDER_WIDTH { get; set; }
/// <summary>
/// 检测框边框颜色(格式:#AARRGGBB)
/// </summary>
[Ini(Section = "Video", DefaultValue = "#FFFF7373", Type = typeof(RawColor4))]
public string VIDEO_DETECT_BOX_BORDER_COLOR { get; set; }
/// <summary>
/// 框选框边框宽度(单位:像素)
/// </summary>
[Ini(Section = "Video", DefaultValue = "4", Type = typeof(int))]
......@@ -97,6 +109,18 @@ namespace VIZ.Framework.Storage
public string VIDEO_CLIP_BOX_CENTER_AXIS_OPACITY { get; set; }
/// <summary>
/// 剪切框自动移动速度(单位:像素/帧)
/// </summary>
[Ini(Section = "Video", DefaultValue = "100", Type = typeof(int))]
public string VIDEO_CLIP_BOX_AUTO_MOVE_SPEED { get; set; }
/// <summary>
/// 剪切框自动移动持续帧数(单位:帧数)
/// </summary>
[Ini(Section = "Video", DefaultValue = "50", Type = typeof(int))]
public string VIDEO_CLIP_BOX_AUTO_MOVE_DURATION_FRAME { get; set; }
/// <summary>
/// 视频边线检测多边形区域透明度
/// </summary>
[Ini(Section = "Video", DefaultValue = "0.15", Type = typeof(double))]
......
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VIZ.Framework.Core;
namespace VIZ.Framework.UnitTest
{
/// <summary>
/// GPIO测试
/// </summary>
[TestClass]
public class GPIOTest
{
/// <summary>
/// 初始化测试
/// </summary>
[TestMethod]
public void InitTest()
{
try
{
List<USBDeviceInfo> list = GPIOManager.ScanDevice();
GPIOModel model = new GPIOModel(list[0]);
model.Open();
}
catch (Exception ex)
{
throw;
}
}
}
}
......@@ -70,6 +70,7 @@
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="GPIOTest.cs" />
<Compile Include="JsonTest.cs" />
<Compile Include="MonitorTask.cs" />
<Compile Include="NetTest.cs" />
......
......@@ -8,6 +8,6 @@
mc:Ignorable="d" WindowStartupLocation="CenterScreen" WindowState="Maximized"
Title="MainWindow" Height="800" Width="1200">
<Grid>
<local:OpenCVVideoTest></local:OpenCVVideoTest>
<local:TallyTest></local:TallyTest>
</Grid>
</Window>
<UserControl x:Class="VIZ.Framework.WpfTest.TallyTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:fcommon="clr-namespace:VIZ.Framework.Common;assembly=VIZ.Framework.Common"
xmlns:local="clr-namespace:VIZ.Framework.WpfTest"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid Background="#ff252b3d">
<fcommon:GPIOPinTestControl Margin="40" Width="700" Height="140"></fcommon:GPIOPinTestControl>
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace VIZ.Framework.WpfTest
{
/// <summary>
/// TallyTest.xaml 的交互逻辑
/// </summary>
public partial class TallyTest : UserControl
{
public TallyTest()
{
InitializeComponent();
}
}
}
......@@ -142,6 +142,10 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="TallyTest\TallyTest.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="VideoRender\OpenCVVideoTest.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
......@@ -166,6 +170,9 @@
<Compile Include="NumberBoxTest\NumberBoxTest.xaml.cs">
<DependentUpon>NumberBoxTest.xaml</DependentUpon>
</Compile>
<Compile Include="TallyTest\TallyTest.xaml.cs">
<DependentUpon>TallyTest.xaml</DependentUpon>
</Compile>
<Compile Include="VideoRender\OpenCVVideoTest.xaml.cs">
<DependentUpon>OpenCVVideoTest.xaml</DependentUpon>
</Compile>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment