Commit 00094f06 by liulongfei

1. Tally 开发

2. NDI流优化
parent 1b9cbf6f
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
<ResourceDictionary Source="/VIZ.Framework.Common;component/Widgets/ColorPickButton/ColorPickButton.xaml"></ResourceDictionary> <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/LabelValue/LabelValue.xaml"></ResourceDictionary>
<ResourceDictionary Source="/VIZ.Framework.Common;component/Widgets/HotkeyBox/HotkeyBox.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.MergedDictionaries>
</ResourceDictionary> </ResourceDictionary>
...@@ -138,6 +138,10 @@ ...@@ -138,6 +138,10 @@
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
<Page Include="Widgets\GPIOPinTestControl\GPIOPinTestControl.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Widgets\HotkeyBox\HotkeyBox.xaml"> <Page Include="Widgets\HotkeyBox\HotkeyBox.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
...@@ -253,6 +257,7 @@ ...@@ -253,6 +257,7 @@
<Compile Include="Widgets\ColorPickButton\ColorPickButton.cs" /> <Compile Include="Widgets\ColorPickButton\ColorPickButton.cs" />
<Compile Include="Widgets\DebugBorder\DebugBorder.cs" /> <Compile Include="Widgets\DebugBorder\DebugBorder.cs" />
<Compile Include="Widgets\DragWindowBar\DragWindowBar.cs" /> <Compile Include="Widgets\DragWindowBar\DragWindowBar.cs" />
<Compile Include="Widgets\GPIOPinTestControl\GPIOPinTestControl.cs" />
<Compile Include="Widgets\HotkeyBox\HotkeyBox.cs" /> <Compile Include="Widgets\HotkeyBox\HotkeyBox.cs" />
<Compile Include="Widgets\HotkeyBox\HotkeyHelper.cs" /> <Compile Include="Widgets\HotkeyBox\HotkeyHelper.cs" />
<Compile Include="Widgets\HotkeyBox\HotkeyPropertyAttribute.cs" /> <Compile Include="Widgets\HotkeyBox\HotkeyPropertyAttribute.cs" />
......
...@@ -69,7 +69,7 @@ namespace VIZ.Framework.Common ...@@ -69,7 +69,7 @@ namespace VIZ.Framework.Common
if (this.old_video_timestamp == frame.timestamp) if (this.old_video_timestamp == frame.timestamp)
{ {
NDIlib.framesync_free_video(this.Stream.RecvSyncInstancePtr, ref frame); NDIlib.framesync_free_video(this.Stream.RecvSyncInstancePtr, ref frame);
Thread.Sleep(1); Thread.Sleep(10);
return; return;
} }
...@@ -81,7 +81,7 @@ namespace VIZ.Framework.Common ...@@ -81,7 +81,7 @@ namespace VIZ.Framework.Common
if (frame.timestamp == 0 || frame.p_data == IntPtr.Zero || frame.p_data == null) if (frame.timestamp == 0 || frame.p_data == IntPtr.Zero || frame.p_data == null)
{ {
NDIlib.framesync_free_video(this.Stream.RecvSyncInstancePtr, ref frame); NDIlib.framesync_free_video(this.Stream.RecvSyncInstancePtr, ref frame);
Thread.Sleep(1); Thread.Sleep(10);
return; return;
} }
...@@ -110,7 +110,7 @@ namespace VIZ.Framework.Common ...@@ -110,7 +110,7 @@ namespace VIZ.Framework.Common
// 尝试释放帧数据 // 尝试释放帧数据
NDIlib.framesync_free_video(this.Stream.RecvSyncInstancePtr, ref frame); 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 ...@@ -38,7 +38,7 @@ namespace VIZ.Framework.Core
/// <param name="propertyName">属性名</param> /// <param name="propertyName">属性名</param>
public void RaisePropertySaveChanging(string propertyName) 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)); this.PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(propertyName));
...@@ -66,7 +66,7 @@ namespace VIZ.Framework.Core ...@@ -66,7 +66,7 @@ namespace VIZ.Framework.Core
/// <param name="propertyName">属性名</param> /// <param name="propertyName">属性名</param>
public void RaisePropertySaveChanged(string propertyName) 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)); 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; ...@@ -8,9 +8,9 @@ using System.Threading.Tasks;
namespace VIZ.Framework.Core namespace VIZ.Framework.Core
{ {
/// <summary> /// <summary>
/// GPI设备USB驱动 信息 /// USB设备信息结构
/// </summary> /// </summary>
public struct GPI_USB_DEVICE_INFO public struct USBDeviceStruct
{ {
/// <summary> /// <summary>
/// 固件名称字符串 /// 固件名称字符串
...@@ -45,86 +45,4 @@ namespace VIZ.Framework.Core ...@@ -45,86 +45,4 @@ namespace VIZ.Framework.Core
/// </summary> /// </summary>
public UInt32 Functions; 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.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 @@ ...@@ -102,9 +102,6 @@
<Compile Include="Core\Net\NetHelperMacInfo.cs" /> <Compile Include="Core\Net\NetHelperMacInfo.cs" />
<Compile Include="Core\Safe\ApplicationMacCheckAttribute.cs" /> <Compile Include="Core\Safe\ApplicationMacCheckAttribute.cs" />
<Compile Include="Core\Safe\ApplicationTimeCheckAttribute.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\ImageHelperExpand.cs" />
<Compile Include="Core\Image\ImageHelper.cs" /> <Compile Include="Core\Image\ImageHelper.cs" />
<Compile Include="Core\Converter\Bitmap2ImageSourceConverter.cs" /> <Compile Include="Core\Converter\Bitmap2ImageSourceConverter.cs" />
...@@ -123,6 +120,16 @@ ...@@ -123,6 +120,16 @@
<Compile Include="Core\Message\IMessageManager.cs" /> <Compile Include="Core\Message\IMessageManager.cs" />
<Compile Include="Core\Message\MessageInfo.cs" /> <Compile Include="Core\Message\MessageInfo.cs" />
<Compile Include="Core\Message\MessageManager.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\IMonitorManager.cs" />
<Compile Include="Expand\Monitor\IMonitorProvider.cs" /> <Compile Include="Expand\Monitor\IMonitorProvider.cs" />
<Compile Include="Expand\Monitor\IMonitorTrigger.cs" /> <Compile Include="Expand\Monitor\IMonitorTrigger.cs" />
......
...@@ -33,7 +33,7 @@ namespace VIZ.Framework.Storage ...@@ -33,7 +33,7 @@ namespace VIZ.Framework.Storage
/// <summary> /// <summary>
/// 跟踪框边框宽度(单位:像素) /// 跟踪框边框宽度(单位:像素)
/// </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; } public string VIDEO_TRACKING_BOX_BORDER_WIDTH { get; set; }
/// <summary> /// <summary>
...@@ -43,6 +43,18 @@ namespace VIZ.Framework.Storage ...@@ -43,6 +43,18 @@ namespace VIZ.Framework.Storage
public string VIDEO_TRACKING_BOX_BORDER_COLOR { get; set; } public string VIDEO_TRACKING_BOX_BORDER_COLOR { get; set; }
/// <summary> /// <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> /// </summary>
[Ini(Section = "Video", DefaultValue = "4", Type = typeof(int))] [Ini(Section = "Video", DefaultValue = "4", Type = typeof(int))]
...@@ -97,6 +109,18 @@ namespace VIZ.Framework.Storage ...@@ -97,6 +109,18 @@ namespace VIZ.Framework.Storage
public string VIDEO_CLIP_BOX_CENTER_AXIS_OPACITY { get; set; } public string VIDEO_CLIP_BOX_CENTER_AXIS_OPACITY { get; set; }
/// <summary> /// <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> /// </summary>
[Ini(Section = "Video", DefaultValue = "0.15", Type = typeof(double))] [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 @@ ...@@ -70,6 +70,7 @@
<Reference Include="System.Core" /> <Reference Include="System.Core" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="GPIOTest.cs" />
<Compile Include="JsonTest.cs" /> <Compile Include="JsonTest.cs" />
<Compile Include="MonitorTask.cs" /> <Compile Include="MonitorTask.cs" />
<Compile Include="NetTest.cs" /> <Compile Include="NetTest.cs" />
......
...@@ -8,6 +8,6 @@ ...@@ -8,6 +8,6 @@
mc:Ignorable="d" WindowStartupLocation="CenterScreen" WindowState="Maximized" mc:Ignorable="d" WindowStartupLocation="CenterScreen" WindowState="Maximized"
Title="MainWindow" Height="800" Width="1200"> Title="MainWindow" Height="800" Width="1200">
<Grid> <Grid>
<local:OpenCVVideoTest></local:OpenCVVideoTest> <local:TallyTest></local:TallyTest>
</Grid> </Grid>
</Window> </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 @@ ...@@ -142,6 +142,10 @@
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
<Page Include="TallyTest\TallyTest.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="VideoRender\OpenCVVideoTest.xaml"> <Page Include="VideoRender\OpenCVVideoTest.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
...@@ -166,6 +170,9 @@ ...@@ -166,6 +170,9 @@
<Compile Include="NumberBoxTest\NumberBoxTest.xaml.cs"> <Compile Include="NumberBoxTest\NumberBoxTest.xaml.cs">
<DependentUpon>NumberBoxTest.xaml</DependentUpon> <DependentUpon>NumberBoxTest.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="TallyTest\TallyTest.xaml.cs">
<DependentUpon>TallyTest.xaml</DependentUpon>
</Compile>
<Compile Include="VideoRender\OpenCVVideoTest.xaml.cs"> <Compile Include="VideoRender\OpenCVVideoTest.xaml.cs">
<DependentUpon>OpenCVVideoTest.xaml</DependentUpon> <DependentUpon>OpenCVVideoTest.xaml</DependentUpon>
</Compile> </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