Commit 4a487a06 authored by 潘栩锋's avatar 潘栩锋 🚴

1.

Merge remote-tracking branch 'origin/feature-AdvTrendData-20191123' into dev6.0

2. getsample界面通过容器获取gageinfo
parents 419b7d69 bf850c30
......@@ -40,22 +40,11 @@ namespace FLY.Thick.Base.UI
/// <summary>
/// 初始化
/// </summary>
/// <param name="dynAreaService"></param>
/// <param name="initParam"></param>
/// <param name="gageService"></param>
/// <param name="warningReasonWindow"></param>
/// <param name="container">容器</param>
[InjectionMethod]
public void Init(
IDynAreaService dynAreaService,
IInitParamService initParam,
ITDGageService gageService,
WarningReasonWindow warningReasonWindow)
public void Init(IUnityContainer container)
{
viewModel.Init(
dynAreaService.DynArea,
initParam,
gageService,
warningReasonWindow);
container.BuildUp(viewModel);
}
}
/// <summary>
......
......@@ -11,6 +11,7 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
using Unity;
namespace FLY.Thick.Base.UI
{
......@@ -79,15 +80,23 @@ namespace FLY.Thick.Base.UI
});
}
/// <summary>
/// 初始化
/// </summary>
/// <param name="dynAreaService"></param>
/// <param name="initParam"></param>
/// <param name="gageService"></param>
/// <param name="warningReasonWindow"></param>
[InjectionMethod]
public void Init(
DynArea dynArea,
IDynAreaService dynAreaService,
IInitParamService initParam,
ITDGageService gageService,
WarningReasonWindow warningReasonWindow)
{
mTDGageService = gageService;
mDynArea = dynArea;
mDynArea = dynAreaService.DynArea;
mInitParam = initParam;
mWindow = warningReasonWindow;
......
......@@ -59,6 +59,10 @@
<TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="CRC" />
<ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding HasCRC}"/>
</StackPanel>
<StackPanel Orientation="Vertical" Margin="5">
<TextBlock Style="{StaticResource ResourceKey=TextBlockStyle_FieldHeaderEditable}" Text="不使用AD盒速度" />
<ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding IsCalSpeed}" HorizontalAlignment="Left"/>
</StackPanel>
<StackPanel Orientation="Vertical" Margin="5" >
<TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="脉冲/数据格" />
<TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding PosOfGrid}" />
......
......@@ -7,44 +7,17 @@
xmlns:sys="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
d:DesignHeight="1200" d:DesignWidth="1024"
Background="White"
Title="Page_GetSample">
Background="White">
<Page.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/>
<ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Converter/Dictionary_MyConv.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="{x:Type ToggleButton}" x:Key="ToggleButtonStyle_12" >
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Canvas x:Name="canvas" Height="45" Width="106" Background="#FF3B3B3B">
<Rectangle x:Name="Path_block" Fill="#FFFFFFFF" Height="36" Canvas.Left="5" Canvas.Top="5" Width="24"/>
<TextBlock x:Name="TextBlock_No" Text="斜率" Foreground ="White" Canvas.Left="35" FontSize="30" />
</Canvas>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="TextBlock_No" Property="Text" Value="平移"/>
<Setter TargetName="TextBlock_No" Property="Canvas.Left" Value="10"/>
<Setter TargetName="Path_block" Property="Canvas.Left" Value="77"/>
<Setter TargetName="canvas" Property="Background" Value="#FF008BE5"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<local:GetSampleVmUt x:Key="unittest"/>
<local:Item2IndexConverter x:Key="i2iConv"/>
<local:Item2DirectionConverter x:Key="i2dConv"/>
</ResourceDictionary>
</Page.Resources>
<Grid d:DataContext="{StaticResource unittest}" >
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="496*" />
......@@ -57,7 +30,7 @@
<ScrollViewer PanningMode="Both" Grid.Row="1" >
<StackPanel >
<StackPanel Orientation="Horizontal" >
<Border Style="{StaticResource BorderStyle_paramSection}" >
<Border Style="{StaticResource BorderStyle_paramSection}">
<TextBlock Text="基本" />
</Border>
<StackPanel>
......@@ -110,24 +83,47 @@
</StackPanel>
<StackPanel Orientation="Horizontal">
<!--<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="采样周期" />
<TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="{DynamicResource strSampleInterval}" />
<StackPanel Orientation="Horizontal">
<TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Interval}" />
<TextBlock Style="{StaticResource TextBlockStyle_FieldContent_mm}" Text="min"/>
</StackPanel>
</StackPanel>-->
<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="移动滤波" />
<StackPanel Orientation="Horizontal">
<TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Window}" />
<TextBlock Style="{StaticResource TextBlockStyle_FieldContent_mm}" Text="次"/>
<TextBlock Style="{StaticResource TextBlockStyle_FieldContent_mm}" Text="min"/>
</StackPanel>
</StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="按%判断异常" />
<ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding IsCheckByPercent}" HorizontalAlignment="Left"/>
</StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}" Visibility="{Binding IsCheckByPercent,Converter={StaticResource visbilityconv}, ConverterParameter=Collapsed}">
<TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="异常比例" />
<StackPanel Orientation="Horizontal">
<TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding ErrPercent,StringFormat={}{0:F1}}" />
<TextBlock Style="{StaticResource TextBlockStyle_FieldContent_mm}" Text="%"/>
</StackPanel>
</StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}" Visibility="{Binding IsCheckByPercent,Converter={StaticResource visbilityconv}, ConverterParameter=CollapsedWhenTrue}">
<TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="异常值" />
<StackPanel Orientation="Horizontal">
<TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding ErrValue}" />
</StackPanel>
</StackPanel>
<Button Style="{StaticResource ButtonStyle2}" Click="button_getorgad_Click" FontSize="27">
<TextBlock Text="计算&#x0a;原始AD值"/>
<StackPanel>
<TextBlock Text="计算"/>
<TextBlock Text="原始AD值"/>
</StackPanel>
</Button>
<Button Style="{StaticResource ButtonStyle2}" Click="button_gageinfo_Click" FontSize="27">
<TextBlock Text="机架信息"/>
<StackPanel>
<TextBlock Text="机架信息"/>
</StackPanel>
</Button>
</StackPanel>
</StackPanel>
......@@ -146,22 +142,21 @@
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</StackPanel.Resources>
<Border Style="{StaticResource BorderStyle_paramSection}" >
<TextBlock Text="样品"/>
<Border Width="150" Background="{StaticResource Brush_theme_bar}" Margin="0,5,5,5">
<TextBlock Style="{StaticResource TextBlockStyle_ItemHeader}">
<Run Text="样品"/>
</TextBlock>
</Border>
<StackPanel >
<StackPanel.Resources>
<CollectionViewSource Source="{Binding Samples}" x:Key="samplesViewSource" />
</StackPanel.Resources>
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource TextBlockStyle_header_no}" Text="序号" />
<TextBlock Style="{StaticResource TextBlockStyle_header}" Text="使能" />
<TextBlock Style="{StaticResource TextBlockStyle_header}" Text="不标定" />
<TextBlock Style="{StaticResource TextBlockStyle_header}" Text="原始AD" />
<TextBlock Style="{StaticResource TextBlockStyle_header}" Text="原始AD" />
<TextBlock Style="{StaticResource TextBlockStyle_header}" Text="位置" />
</StackPanel>
<ItemsControl x:Name="itemcontrol" ItemsSource="{Binding Source={StaticResource samplesViewSource}}">
<ItemsControl x:Name="itemcontrol" ItemsSource="{Binding Samples}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
......@@ -173,7 +168,7 @@
<Rectangle Height="2" Fill="Gray"/>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource TextBlockStyle_FieldContent}" Width="{StaticResource column0_width}" Margin="0">
<Run Text="{Binding Path=., Mode=OneWay, Converter={StaticResource i2iConv}, ConverterParameter={StaticResource samplesViewSource}}"/>
<Run Text="{Binding Index}"/>
</TextBlock>
<ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding Enable}" Width="{StaticResource column_width}" Margin="0"/>
<ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding JustForCheck}" Width="{StaticResource column_width}" Margin="0"/>
......@@ -191,12 +186,12 @@
<Run Text="mm" />
</TextBlock>
</StackPanel>
</StackPanel>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
......@@ -205,13 +200,13 @@
<StackPanel Orientation="Horizontal">
<Border Style="{StaticResource BorderStyle_paramSection}">
<TextBlock Text="位置&#x0a;修正" />
<Border Background="{StaticResource Brush_theme_bar}" Margin="0,5,5,5" Width="150">
<TextBlock Style="{StaticResource TextBlockStyle_ItemHeader}" Text="位置修正" />
</Border>
<StackPanel >
<StackPanel>
<StackPanel Orientation="Horizontal">
<StackPanel Margin="{StaticResource ControlMargin}" >
<StackPanel Margin="{StaticResource ControlMargin}" Orientation="Vertical">
<TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="查找范围" />
<StackPanel Orientation="Horizontal">
<TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Search}" />
......@@ -227,7 +222,7 @@
</StackPanel>
</StackPanel>
</StackPanel>
<StackPanel >
<StackPanel>
<StackPanel.Resources>
<sys:Double x:Key="column0_width">50</sys:Double>
<sys:Double x:Key="column_width">150</sys:Double>
......@@ -240,26 +235,25 @@
<Setter Property="Width" Value="{StaticResource column_width}"/>
<Setter Property="TextAlignment" Value="Center"/>
</Style>
<CollectionViewSource Source="{Binding Features}" x:Key="featuresViewSource" />
</StackPanel.Resources>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource TextBlockStyle_header_no}" Text="特征" />
<TextBlock Style="{StaticResource TextBlockStyle_header}" Text="使能" />
<TextBlock Style="{StaticResource TextBlockStyle_header}" Text="位置" />
</StackPanel>
<ItemsControl ItemsSource="{Binding Source={StaticResource featuresViewSource}}">
<ItemsControl ItemsSource="{Binding Features}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel >
<StackPanel>
<Rectangle Height="2" Fill="Gray"/>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource TextBlockStyle_FieldContent}" FontSize="20" Width="{StaticResource column0_width}" Margin="0" VerticalAlignment="Center">
<Run Text="{Binding Path=., Mode=OneWay, Converter={StaticResource i2dConv},ConverterParameter={StaticResource featuresViewSource}}"/>
<Run Text="{Binding Name}"/>
</TextBlock>
<ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding Enable}" Width="{StaticResource column_width}" Margin="0"/>
......@@ -298,6 +292,37 @@
</StackPanel>
</StackPanel>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Style="{StaticResource ButtonStyle3}" MinHeight="100" Margin="0,5,5,5" Width="150" Click="btnGetTempDatasClick" >
<TextBlock Style="{StaticResource TextBlockStyle_ItemHeader}" Text="获取采集&#x0a;过程" />
</Button>
<StackPanel Orientation="Horizontal">
<ItemsControl x:Name="tempdatas" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding .}" IsReadOnly="True" Margin="{StaticResource ControlMargin}" AutoGenerateColumns="False" Width="400" TextBlock.FontSize="12" TextBlock.FontWeight="Normal"
>
<DataGrid.Columns>
<DataGridTextColumn Header="时间" Binding="{Binding Time,StringFormat={}{0:HH:mm:ss}}" FontSize="10" Width="100"/>
<DataGridTextColumn Header="AD" Binding="{Binding Ad}" Width="100"/>
<DataGridTextColumn Header="滤波AD" Binding="{Binding FilterAd}" Width="100"/>
<DataGridTextColumn Header="异常" Binding="{Binding IsReset}" Width="100"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</StackPanel>
</StackPanel>
</ScrollViewer>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" >
......
using System;
using FLY.Thick.Base.IService;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
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;
using System.Net;
using FLY.Thick.Base.IService;
using FLY.Thick.Base.UI;
using Unity;
using System.ComponentModel;
namespace FLY.Thick.Base.UI
{
/// <summary>
......@@ -40,10 +29,10 @@ namespace FLY.Thick.Base.UI
}
[InjectionMethod]
public void Init(
IUnityContainer container,
IUnityContainer container,
IGetSampleService getSampleService,
IInitParamService initParamService,
IGageInfoService gageInfoService)
IGageInfoService gageInfoService)
{
this.getSampleService = getSampleService;
......@@ -95,7 +84,7 @@ namespace FLY.Thick.Base.UI
FLY.ControlLibrary.Window_Tip.Show("应用成功",
null,
TimeSpan.FromSeconds(2));
}
private void button_getorgad_Click(object sender, RoutedEventArgs e)
......@@ -146,33 +135,35 @@ namespace FLY.Thick.Base.UI
TimeSpan.FromSeconds(2));
return;
}
sampleCell.OrgAD = (ad1+ad2)/2;
sampleCell.OrgAD = (ad1 + ad2) / 2;
}
}
FLY.ControlLibrary.Window_Tip.Show("设置完成",
null,
TimeSpan.FromSeconds(2));
}
private void button_gageinfo_Click(object sender, RoutedEventArgs e)
{
if (container.IsRegistered<Page>("pgGageInfo"))
{
var p = container.Resolve<Page>("pgGageInfo");
NavigationService.Navigate(p);
}
else
{
var p = container.Resolve<PgGageInfo>();
//PgGageInfo p = new PgGageInfo();
//container.BuildUp(p);
NavigationService.Navigate(p);
}
Page p = (container.IsRegistered<Page>("pgGageInfo")) ? container.Resolve<Page>("pgGageInfo") : new PgGageInfo();
container.BuildUp(p);
NavigationService.Navigate(p);
}
private void btnGetTempDatasClick(object sender, RoutedEventArgs e)
{
getSampleService.GetTempFilterDatas((asyncContext, retData) =>
{
var ll = retData as List<List<TempFilterData>>;
tempdatas.ItemsSource = ll;
FLY.ControlLibrary.Window_Tip.Show("加载完成",
$"共加载{ll.Count()}列数据",
TimeSpan.FromSeconds(2));
}, null);
}
}
public class GetSampleVm : INotifyPropertyChanged
......@@ -245,7 +236,7 @@ namespace FLY.Thick.Base.UI
public bool IsChanged { get; set; }
}
public class GetSampleVmUt:INotifyPropertyChanged
public class GetSampleVmUt : INotifyPropertyChanged
{
public GetSampleVmUt()
{
......@@ -327,8 +318,8 @@ namespace FLY.Thick.Base.UI
#endregion
}
/// <summary>
/// 列表转序号
......@@ -381,7 +372,7 @@ namespace FLY.Thick.Base.UI
//在 设计模式中, View为null, 所以下面必须判断
if (cv != null)
{
switch (cv.IndexOf(value))
switch (cv.IndexOf(value))
{
case 0:
return "正向";
......
......@@ -42,6 +42,10 @@ namespace FLY.Thick.Base.Client
}
}
}
/// <summary>
/// 通过脉冲计算速度,不使用AD盒的输出
/// </summary>
public bool IsCalSpeed { get; set; } = true;
public int PosLen { get; set; }
......@@ -82,7 +86,8 @@ namespace FLY.Thick.Base.Client
posoffset = PosOffset,
jogvelocity = JogVelocity,
hasCRC = HasCRC,
gridsmooth = GridSmooth
gridsmooth = GridSmooth,
IsCalSpeed = IsCalSpeed
};
string json = Newtonsoft.Json.JsonConvert.SerializeObject(p);
......@@ -189,6 +194,7 @@ namespace FLY.Thick.Base.Client
Ratio02 = p.ratio02;
HasCRC = p.hasCRC;
GridSmooth = p.gridsmooth;
IsCalSpeed = p.IsCalSpeed;
} break;
}
}
......
......@@ -72,6 +72,22 @@ namespace FLY.Thick.Base.Client
[JsonProperty]
public int Window { get; set; }
/// <summary>
/// 使用%方式检查异常
/// </summary>
[JsonProperty]
public bool IsCheckByPercent { get; set; } = true;
/// <summary>
/// 异常% 单位%
/// </summary>
[JsonProperty]
public double ErrPercent { get; set; } = 2;
/// <summary>
/// 异常值
/// </summary>
[JsonProperty]
public int ErrValue { get; set; } = 200;
/// <summary>
/// 样品
/// </summary>
......@@ -109,6 +125,9 @@ namespace FLY.Thick.Base.Client
velocity = Velocity,
range = Range,
window = Window,
IsCheckByPercent = IsCheckByPercent,
ErrPercent =ErrPercent,
ErrValue = ErrValue,
search = Search,
samples = from sample in Samples
select
......@@ -175,7 +194,10 @@ namespace FLY.Thick.Base.Client
Range = p.range;
Velocity = p.velocity;
Window = p.window;
Search = p.search;
IsCheckByPercent = p.IsCheckByPercent;
ErrPercent = p.ErrPercent;
ErrValue = p.ErrValue;
for (int i = 0; i < Samples.Count() && i < p.samples.Count(); i++)
{
var sample_src = p.samples.ElementAt(i);
......@@ -186,6 +208,7 @@ namespace FLY.Thick.Base.Client
sample_desp.OrgAD = sample_src.orgad;
sample_desp.Position = sample_src.position;
}
Search = p.search;
for (int i = 0; i < Features.Count() && i < p.features.Count(); i++)
{
var feature_src = p.features.ElementAt(i);
......@@ -230,6 +253,23 @@ namespace FLY.Thick.Base.Client
{
PushGetValue(from, srcid, infoid, infodata);
}
public override void PushCallFunction(IFConn from, uint srcid, uint magic, ushort funcid, byte[] retdata, object AsyncDelegate, object AsyncState)
{
switch (funcid) {
case GETSAMPLE_OBJ_INTERFACE.CALL_GET_TEMPDATAS:
{
string json = Misc.Converter.BytesToString(retdata);
var reponse = Newtonsoft.Json.JsonConvert.DeserializeObject<List<List<TempFilterData>>>(json);
(AsyncDelegate as AsyncCBHandler)(AsyncState, reponse);
}
break;
}
}
public void GetTempFilterDatas(AsyncCBHandler asyncCB, object asyncContext)
{
CurrObjSys.CallFunctionEx(mConn, mServerID, ID, GETSAMPLE_OBJ_INTERFACE.CALL_GET_TEMPDATAS, null, asyncCB, asyncContext);
}
}
}
......@@ -6,9 +6,13 @@ using FLY.Thick.Base.Common;
using System.ComponentModel;
using Newtonsoft.Json;
using PropertyChanged;
using FObjBase;
namespace FLY.Thick.Base.IService
{
/// <summary>
///
/// </summary>
public interface IGetSampleService:INotifyPropertyChanged
{
/// <summary>
......@@ -36,7 +40,18 @@ namespace FLY.Thick.Base.IService
/// </summary>
int Window { get; set; }
/// <summary>
/// 使用%方式检查异常
/// </summary>
bool IsCheckByPercent { get; set; }
/// <summary>
/// 异常%
/// </summary>
double ErrPercent { get; set; }
/// <summary>
/// 异常值
/// </summary>
int ErrValue { get; set; }
/// <summary>
/// 参数:样品点参数
/// </summary>
......@@ -60,6 +75,36 @@ namespace FLY.Thick.Base.IService
/// 应用
/// </summary>
void Apply();
/// <summary>
/// 返回 List(List(TempFilterData))
/// </summary>
/// <param name="asyncCB"></param>
/// <param name="asyncContext"></param>
void GetTempFilterDatas(AsyncCBHandler asyncCB, object asyncContext);
}
/// <summary>
/// 采样记录
/// </summary>
public class TempFilterData
{
/// <summary>
/// 采集时间
/// </summary>
public DateTime Time { get; set; }
/// <summary>
/// Ad值
/// </summary>
public int Ad { get; set; }
/// <summary>
/// 滤波后的AD值
/// </summary>
public int FilterAd { get; set; }
/// <summary>
/// 复位
/// </summary>
public bool IsReset { get; set; }
}
/// <summary>
......
......@@ -24,6 +24,7 @@ namespace FLY.Thick.Base.OBJ_INTERFACE
public UInt32 jogvelocity;
public bool hasCRC;
public int gridsmooth;
public bool IsCalSpeed;
}
......
......@@ -31,6 +31,9 @@ namespace FLY.Thick.Base.OBJ_INTERFACE
public UInt32 velocity;
public int range;
public int window;
public bool IsCheckByPercent;
public double ErrPercent;
public int ErrValue;
public IEnumerable<Pack_Params_SampleCell> samples;
public int search;
public IEnumerable<Pack_Params_SampleFeature> features;
......@@ -74,5 +77,13 @@ namespace FLY.Thick.Base.OBJ_INTERFACE
public const UInt16 PUSH_PARAMS = 0;
public const UInt16 PUSH_STATE = 1;
#endregion
#region CallFunction
/// <summary>
/// request:null
/// reponse:List(List(TempFilterData))
/// </summary>
public const UInt16 CALL_GET_TEMPDATAS = 0;
#endregion
}
}
......@@ -36,6 +36,7 @@ namespace FLY.Thick.Base.Server.OBJProxy
if ((e.PropertyName == "LocalEP") ||
(e.PropertyName == "HasCRC") ||
(e.PropertyName == "GridSmooth") ||
(e.PropertyName == "IsCalSpeed") ||
(e.PropertyName == "PosOfGrid") ||
(e.PropertyName == "PosLen") ||
(e.PropertyName == "MotorType") ||
......@@ -69,6 +70,7 @@ namespace FLY.Thick.Base.Server.OBJProxy
ep = mFlyAD.LocalEP.ToString(),
hasCRC = mFlyAD.HasCRC,
gridsmooth = mFlyAD.GridSmooth,
IsCalSpeed = mFlyAD.IsCalSpeed,
posofgrid = mFlyAD.PosOfGrid,
motortype = (MOTORTYPE) mFlyAD.MotorType,
poslen = mFlyAD.PosLen,
......@@ -98,6 +100,7 @@ namespace FLY.Thick.Base.Server.OBJProxy
mFlyAD.HasCRC = p.hasCRC;
mFlyAD.GridSmooth = p.gridsmooth;
mFlyAD.IsCalSpeed = p.IsCalSpeed;
var ep = Misc.StringConverter.ToIPEndPoint(p.ep);
if(!mFlyAD.LocalEP.Equals(ep))
mFlyAD.Connect(ep);
......
......@@ -97,7 +97,9 @@ namespace FLY.Thick.Base.Server.OBJProxy
(e.PropertyName == "Velocity") ||
(e.PropertyName == "Range") ||
(e.PropertyName == "Window") ||
(e.PropertyName == "OnePointIsOffset") ||
(e.PropertyName == "IsCheckByPercent") ||
(e.PropertyName == "ErrPercent") ||
(e.PropertyName == "ErrValue") ||
(e.PropertyName == "Search"))
{
push_params();
......@@ -122,25 +124,31 @@ namespace FLY.Thick.Base.Server.OBJProxy
range = mGetSampleService.Range,
velocity = mGetSampleService.Velocity,
window = mGetSampleService.Window,
search = mGetSampleService.Search,
samples = from sample in mGetSampleService.Samples
IsCheckByPercent = mGetSampleService.IsCheckByPercent,
ErrPercent = mGetSampleService.ErrPercent,
ErrValue = mGetSampleService.ErrValue,
search = mGetSampleService.Search
};
p.samples = (from sample in mGetSampleService.Samples
select
new GETSAMPLE_OBJ_INTERFACE.Pack_Params_SampleCell()
{
enable = sample.Enable,
justForCheck = sample.JustForCheck,
orgad = sample.OrgAD,
position = sample.Position
});
p.features = (from feature in mGetSampleService.Features
select
new GETSAMPLE_OBJ_INTERFACE.Pack_Params_SampleCell()
new GETSAMPLE_OBJ_INTERFACE.Pack_Params_SampleFeature()
{
enable = sample.Enable,
justForCheck = sample.JustForCheck,
orgad = sample.OrgAD,
position = sample.Position
},
features = from feature in mGetSampleService.Features
select
new GETSAMPLE_OBJ_INTERFACE.Pack_Params_SampleFeature()
{
enable = feature.Enable,
startpos = feature.StartPos,
endpos = feature.EndPos
}
};
enable = feature.Enable,
startpos = feature.StartPos,
endpos = feature.EndPos
});
string json = Newtonsoft.Json.JsonConvert.SerializeObject(p);
infodata = Misc.Converter.StringToBytes(json);
} break;
......@@ -188,6 +196,9 @@ namespace FLY.Thick.Base.Server.OBJProxy
mGetSampleService.Range = p.range;
mGetSampleService.Velocity = p.velocity;
mGetSampleService.Window = p.window;
mGetSampleService.IsCheckByPercent = p.IsCheckByPercent;
mGetSampleService.ErrPercent = p.ErrPercent;
mGetSampleService.ErrValue = p.ErrValue;
mGetSampleService.Search = p.search;
for(int i=0;i<mGetSampleService.Samples.Count() && i<p.samples.Count();i++)
......@@ -215,5 +226,20 @@ namespace FLY.Thick.Base.Server.OBJProxy
} break;
}
}
public override void CallFunction(IFConn from, uint srcid, uint magic, ushort funcid, byte[] infodata)
{
switch (funcid) {
case GETSAMPLE_OBJ_INTERFACE.CALL_GET_TEMPDATAS:
{
mGetSampleService.GetTempFilterDatas((context,retdata) =>
{
string json = Newtonsoft.Json.JsonConvert.SerializeObject(retdata);
CurrObjSys.PushCallFunctionEx(from, srcid, ID, magic, funcid, Misc.Converter.StringToBytes(json));
}, null);
}break;
}
}
}
}
......@@ -15,6 +15,11 @@ namespace FLY.Thick.Base.Server
/// </summary>
public class BorderSearch : IBorderSearchService, INotifyPropertyChanged, Misc.ISaveToXml
{
/// <summary>
/// 报警测试
/// </summary>
public static FLY.OBJComponents.Common.ERRNO BORDER_ERRNO_NOFILM = new FLY.OBJComponents.Common.ERRNO() { Code = 50, Descrption = "边界异常,没有被测物" };
#region 延时执行,Markno
public const int MARKNO_SAVE = 1;
#endregion
......@@ -124,6 +129,7 @@ namespace FLY.Thick.Base.Server
#endregion
OBJComponents.Server.WarningSystem warningSystem;
private string param_path = "bordersearch.xml";
public BorderSearch()
{
......@@ -151,6 +157,11 @@ namespace FLY.Thick.Base.Server
};
Load();
}
public void Init(OBJComponents.Server.WarningSystem warningSystem)
{
this.warningSystem = warningSystem;
}
void Default()
{
Enable = false;
......@@ -589,8 +600,10 @@ namespace FLY.Thick.Base.Server
int borderend_grid;//validend_grid;
if (!FindFilm_Threshold(dat, validbegin_grid, validend_grid, TempAD, TempRange, out borderbegin_grid, out borderend_grid))
{
warningSystem.Add(BORDER_ERRNO_NOFILM.Code, BORDER_ERRNO_NOFILM.Descrption, OBJComponents.Common.ERR_STATE.ON);
return false;
}
//N2 只是用来判断一下膜够不够宽而已,没用
int N2_grid = (N2*3+SensorWidth) / posOfGrid;
......@@ -605,9 +618,8 @@ namespace FLY.Thick.Base.Server
FindFilm_Break(dat, sensor_grid, filter_grid, ref borderbegin_grid, ref borderend_grid);
}
int idx = 0;
if (direction == DIRECTION.BACKWARD)
idx = 1;
int idx = (direction == DIRECTION.FORWARD) ? 0 : 1;
//转为 脉冲
border[idx].Begin = (borderbegin_grid + gridBegin) * posOfGrid;
border[idx].End = (borderend_grid +gridBegin) * posOfGrid;
......
......@@ -18,7 +18,7 @@ using static Misc.ReverserInfo;
namespace FLY.Thick.Base.Server
{
[JsonObject(MemberSerialization.OptIn)]
public class GSample : IGetSampleService, Misc.ISaveToXml
public class GSample : IGetSampleService
{
#region IGetSampleService 接口
......@@ -55,11 +55,25 @@ namespace FLY.Thick.Base.Server
/// <summary>
/// 滤波窗口
/// 滤波窗口,单位 min
/// </summary>
[JsonProperty]
public int Window { get; set; } = 3;
public int Window { get; set; }
/// <summary>
/// 使用%方式检查异常
/// </summary>
[JsonProperty]
public bool IsCheckByPercent { get; set; } = true;
/// <summary>
/// 异常% 单位%
/// </summary>
[JsonProperty]
public double ErrPercent { get; set; } = 2;
/// <summary>
/// 异常值
/// </summary>
[JsonProperty]
public int ErrValue { get; set; } = 200;
/// <summary>
/// 样品
......@@ -87,83 +101,79 @@ namespace FLY.Thick.Base.Server
#endregion
List<TempFilter> tempFilters = new List<TempFilter>();
List<DIRECTION> directions = new List<DIRECTION>();
TempFilter2[] tempFilters;
DIRECTION[] directions;
IGageInfoService mGageInfo;
FlyAD7 flyad;
public event SampleChangedEventHandler SampleChangedEvent;
private string param_path;
public GSample(FlyAD7 flyad):this(flyad,"gsample.xml")
public GSample(FlyAD7 flyad):this(flyad,"gsample.json")
{
}
public GSample(FlyAD7 flyad, string param_path)
public GSample(FlyAD7 flyad, string param_path)
{
this.param_path = param_path;
this.flyad = flyad;
Misc.BindingOperations.SetBinding(flyad, "PosOfGrid", this, "PosOfGrid");
for (int i = 0; i < 3; i++)
{
TempFilter tempFilter = new TempFilter();
tempFilter.SetWindow(Window);
tempFilters.Add(tempFilter);
Samples = new SampleCell[3];
Features = new SampleFeature[2];
tempFilters = new TempFilter2[Samples.Count()];
directions = new DIRECTION[Samples.Count()];
directions.Add(DIRECTION.BACKWARD);
}
for (int i = 0; i < Samples.Count(); i++)
tempFilters[i] = new TempFilter2();
this.PropertyChanged += new PropertyChangedEventHandler(GSample_PropertyChanged);
Load();
if (Samples == null || Samples.Count() != 3)
Enable = true;
Interval = 5;//采样间隔
Range = 100;//样品范围
Velocity = 200;//取样速度
Window = 3;//移动窗口
IsCheckByPercent = true;
ErrPercent = 2;
ErrValue = 200;
Samples[0] = new SampleCell()
{
Samples = new SampleCell[3];
Samples[0] = new SampleCell()
{
Enable = true,
Position = 0,
OrgAD = 0
};
Samples[1] = new SampleCell()
{
Enable = false,
Position = 2006,
OrgAD = 30000
};
Samples[2] = new SampleCell()
{
Enable = false,
Position = 0,
OrgAD = 0
};
}
if (Features == null || Features.Count() != 2)
Enable = true,
Position = 0,
OrgAD = 0
};
directions[0] = DIRECTION.BACKWARD;
Samples[1] = new SampleCell()
{
Features = new SampleFeature[2];
Features[0] = new SampleFeature();
Features[1] = new SampleFeature();
}
}
Enable = false,
Position = 2006,
OrgAD = 30000
};
directions[1] = DIRECTION.FORWARD;
Samples[2] = new SampleCell()
{
Enable = false,
Position = 0,
OrgAD = 0
};
directions[2] = DIRECTION.FORWARD;
Search = 100;
Features[0] = new SampleFeature() { StartPos = 0, EndPos = 0 };
Features[1] = new SampleFeature() { StartPos = 2000, EndPos = 2100 };
Load();
}
public void Init(IGageInfoService gageInfo)
{
this.mGageInfo = gageInfo;
}
void GSample_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Window")
{
for (int i = 0; i < 3; i++)
{
tempFilters[i].SetWindow(Window);
}
}
}
public bool Load()
{
try
......@@ -180,6 +190,9 @@ namespace FLY.Thick.Base.Server
return true;
}
/// <summary>
/// 保存
/// </summary>
public void Save()
{
try
......@@ -201,28 +214,30 @@ namespace FLY.Thick.Base.Server
/// <param name="scanend"></param>
public virtual void Init(int scanbegin, int scanend)
{
for(int i=0;i<3;i++)
{
for (int i = 0; i < Samples.Count(); i++) {
SampleCell sample = Samples[i];
int pos = sample.Position;
if (Math.Abs(pos - scanbegin) < Math.Abs(pos - scanend))
directions[i] = Misc.DIRECTION.BACKWARD;
else
directions[i] = Misc.DIRECTION.FORWARD;
directions[i] = (Math.Abs(pos - scanbegin) < Math.Abs(pos - scanend)) ? Misc.DIRECTION.BACKWARD : Misc.DIRECTION.FORWARD;
sample.AD = -1;
tempFilters[i].ResetSampleFailure();
tempFilters[i].Reset();
}
Timer = Interval;
}
/// <summary>
///
/// </summary>
public void Init()
{
for (int i = 0; i < 3; i++)
for (int i = 0; i < Samples.Count(); i++)
{
SampleCell sample = Samples[i];
sample.AD = -1;
tempFilters[i].ResetSampleFailure();
tempFilters[i].Reset();
}
Timer = Interval;
}
......@@ -277,9 +292,7 @@ namespace FLY.Thick.Base.Server
end = 0;
bool valid = false;
int b=0, e=0;
int r_idx = 0;
if (direction == Misc.DIRECTION.BACKWARD)
r_idx = 1;
int r_idx = (direction == Misc.DIRECTION.FORWARD) ? 0 : 1;
if (Features[r_idx].Enable)
{
......@@ -288,11 +301,10 @@ namespace FLY.Thick.Base.Server
valid = true;
}
for(int i=0;i<3;i++)
for(int i=0;i< Samples.Count(); i++)
{
SampleCell sample = Samples[i];
var sample_direction = directions[i];
if ((sample.Enable) && (sample_direction == direction))
if ((sample.Enable) && (directions[i] == direction))
{
int _b = sample.Position - Range;
int _e = sample.Position + Range;
......@@ -371,28 +383,29 @@ namespace FLY.Thick.Base.Server
}
/// <summary>
/// 样品取样,推送给thickm, 参数一定合法,不用检测
/// </summary>
/// <param name="direction"></param>
/// <param name="direction">方向</param>
/// <param name="grid_start">开始grid序号</param>
/// <param name="buf">grid数据</param>
public virtual void Do(Misc.DIRECTION direction, int grid_start, int[] buf)
{
bool isFailure = false;//取样失败了
//取样结果,isFailure=true, 取样失败,全部复位!!!
bool isFailure = false;
if(CheckParamIsValid() == false)
return;
int grid_offset = 0;//经过相识性计算后的偏移量
//在这里处理gsample->m_timer
int dir_idx = 0;
if (direction == Misc.DIRECTION.FORWARD)
dir_idx = 0;
else
dir_idx = 1;
int dir_idx = (direction == Misc.DIRECTION.FORWARD) ? 0 : 1;
//数据在 gsample -> gagedata[0]
SampleFeature psr = Features[dir_idx] as SampleFeature;
//这个方向的特征查找使能了,位置修正!!!!!!
if (psr.Enable)
{
//检测机架数据,当为空时,不能作相识性计算
......@@ -407,18 +420,15 @@ namespace FLY.Thick.Base.Server
int grid2 = pos2 / posOfGrid;
int grid_searchtol = Search / posOfGrid;
int[] gagedata;
if (direction == Misc.DIRECTION.FORWARD)
gagedata = mGageInfo.ForwData.ToArray();
else
gagedata = mGageInfo.BackwData.ToArray();
//获取相同方向的机架信息数据
int[] gagedata = ((direction == Misc.DIRECTION.FORWARD) ? mGageInfo.ForwData : mGageInfo.BackwData).ToArray();
//合格,查找最大相识性的点
int grid_b = grid1 - grid_searchtol;
int grid_e = grid2 + grid_searchtol;
int grid_len = grid_e - grid_b + 1;
psr.ScanData = new int[grid_len];
psr.ScanData = new int[grid_len];//这个方向的需要 特征查找范围内的数据,不用考虑 buf 不够 grid_len
Array.Copy(buf, grid_b - grid_start, psr.ScanData, 0, grid_len);
double max_relvency = 0;
......@@ -437,7 +447,7 @@ namespace FLY.Thick.Base.Server
psr.MaxOffset = max_grid_offset * posOfGrid;
if (max_relvency > 0.8) //相识度必须高于0.8
grid_offset = max_grid_offset;
grid_offset = max_grid_offset;//位置修正
else
{
//相似性太低,取样失败!!!
......@@ -450,12 +460,11 @@ namespace FLY.Thick.Base.Server
for (int i = 0; i < Samples.Count(); i++)
{
SampleCell sample = Samples[i] as SampleCell;
TempFilter tempre = tempFilters[i];
var sample_direction = directions[i];
if ((sample_direction == direction) && (sample.Enable) )
var tempre = tempFilters[i];
if ((directions[i] == direction) && (sample.Enable) )
{
ad=-1;
if (!isFailure)
if (!isFailure)//不修要位置修正
{
//获取grid 数据
int posOfGrid = flyad.PosOfGrid;
......@@ -475,27 +484,45 @@ namespace FLY.Thick.Base.Server
}
else
{
ad = tempre.CalSampleAD(ad);//ad filter
if (tempre.IsSampleFailure())//AD突变。。。异常,复位
int orgAd = ad;
ad = tempre.CalSampleAD(orgAd, TimeSpan.FromMinutes(Window));//ad 滤波
int diff = Math.Abs(orgAd - ad);
if (IsCheckByPercent)
{
isFailure = true;
if (diff == 0)
{
}
else if (ad == 0)
{
isFailure = true;
}
else if (diff / ad >= ErrPercent*0.01) //大于2% 异常
{
isFailure = true;
}
}
else {
if (diff >= ErrValue)
{
isFailure = true;
}
}
}
}
if (isFailure)
{
tempre.ResetSampleFailure();
tempre.Reset();
ad = -1;
}
sample.AD = ad;
else
{
sample.AD = ad;
}
}
}
if (SampleChangedEvent != null)
SampleChangedEvent(this);
SampleChangedEvent?.Invoke(this);
if (isFailure)//样品获取失败,下次继续!!!
......@@ -528,7 +555,8 @@ namespace FLY.Thick.Base.Server
/// <summary>
/// 获取N秒的数据,
/// </summary>
/// <param name="buf"></param>
/// <param name="idx">序号</param>
/// <param name="buf">数据</param>
/// <returns></returns>
public void DoFix(int idx, int[] buf)
{
......@@ -538,11 +566,11 @@ namespace FLY.Thick.Base.Server
return;
int avg = Misc.MyMath.Avg(buf);
SampleCell sample = Samples[idx] as SampleCell;
SampleCell sample = Samples[idx];
sample.AD = avg;
if (SampleChangedEvent != null)
SampleChangedEvent(this);
SampleChangedEvent?.Invoke(this);
//只有当所有都成功,Timer=0
......@@ -562,22 +590,6 @@ namespace FLY.Thick.Base.Server
//}
#region ISaveToXml 成员
public string[] GetSavePropertyNames()
{
return new string[]{
"Enable",
"Interval",
"Range",
"Window",
"Samples",
"Search",
"Features"
};
}
#endregion
public event PropertyChangedEventHandler PropertyChanged;
......@@ -586,6 +598,26 @@ namespace FLY.Thick.Base.Server
//通知上层
Save();
}
/// <summary>
/// 返回 List(List(TempFilterData))
/// </summary>
/// <param name="asyncCB"></param>
/// <param name="asyncContext"></param>
public void GetTempFilterDatas(AsyncCBHandler asyncCB, object asyncContext)
{
List<List<TempFilterData>> ret = new List<List<TempFilterData>>();
for (int i = 0; i < Samples.Count(); i++) {
SampleCell sample = Samples[i];
if (sample.Enable)
ret.Add(tempFilters[i].GetDatas());
else
ret.Add(null);
}
asyncCB(asyncContext, ret);
}
}
public delegate void SampleChangedEventHandler(GSample gsample);
......
......@@ -38,6 +38,11 @@ namespace FLY.Thick.Base.Server
/// </summary>
public int FLYAD7_GridSmooth { get; set; } = 0;
/// <summary>
/// 电脑计算速度,不通过AD盒获取
/// </summary>
public bool FLYAD7_IsCalSpeed { get; set; } = true;
#endregion
private string param_path = "sysparam.xml";
......@@ -58,7 +63,8 @@ namespace FLY.Thick.Base.Server
return;
if ((e.PropertyName == "FLYAD7EP")||
(e.PropertyName == "FLYAD7_HasCRC")||
(e.PropertyName == "FLYAD7_GridSmooth")
(e.PropertyName == "FLYAD7_GridSmooth")||
(e.PropertyName == "FLYAD7_IsCalSpeed")
)
{
Save();
......@@ -91,7 +97,7 @@ namespace FLY.Thick.Base.Server
"FLYAD7EP",
"FLYAD7_HasCRC",
"FLYAD7_GridSmooth",
"DBPath"
"FLYAD7_IsCalSpeed"
};
}
}
......
using System;
using FLY.Thick.Base.IService;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace FLY.Thick.Base.Server
{
/// <summary>
/// 样品修正 滤波
/// </summary>
public class TempFilter
{
DateTime sampleTime;
int sampleFailure;
int swfilterCnt;
/// <summary>
/// 滤波器
/// </summary>
class SWFilter
{
/// <summary>
/// 缓存区
/// </summary>
int[] buffer;
/// <summary>
/// 缓存区大小
/// </summary>
int bufferSize;
/// <summary>
/// 队列尾
/// </summary>
int lastData;
/// <summary>
/// 默认值
/// </summary>
int initvalue;
public SWFilter(int buffersize)
......@@ -44,7 +63,7 @@ namespace FLY.Thick.Base.Server
window--;
}
if (cnt == 0) return initvalue;
return (int)(sum / cnt + 0.5);
return (int)Math.Round(sum / cnt);
}
public void Clear(int initvalue)
......@@ -65,7 +84,7 @@ namespace FLY.Thick.Base.Server
public void SetSize(int buffersize)
{
if (buffersize != this.bufferSize)
if (this.bufferSize != buffersize)
{
this.bufferSize = buffersize;
......@@ -78,8 +97,14 @@ namespace FLY.Thick.Base.Server
SWFilter swfilter;
int tempBIndex;
int[] tempBuf = new int[3];
/// <summary>
/// 前一个AD值
/// </summary>
int preValue;
/// <summary>
///
/// </summary>
public TempFilter()
{
sampleFailure = 0;
......@@ -90,20 +115,40 @@ namespace FLY.Thick.Base.Server
preValue = -1;
}
/// <summary>
/// 复位失败次数
/// </summary>
public void ResetSampleFailure()
{
sampleFailure = 0;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public bool IsSampleFailure()
{
if (sampleFailure < 0) return true;
return false;
}
/// <summary>
/// 输入原始AD值,输出滤波后AD值
/// </summary>
/// <param name="ad"></param>
/// <returns></returns>
public int CalSampleAD(int ad)
{
int originAD;
return CalSampleAD(ad, out originAD);
return CalSampleAD(ad, out int originAD);
}
/// <summary>
/// 输入原始AD值,输出滤波后AD值
/// </summary>
/// <param name="ad"></param>
/// <param name="originAD"></param>
/// <returns></returns>
public int CalSampleAD(int ad, out int originAD)
{
originAD = 0;
......@@ -137,7 +182,7 @@ namespace FLY.Thick.Base.Server
if (delta > 0.01 * Math.Abs(preValue))//跳到超过 1% ,有问题
{
if (tempBIndex < 1) // Sudden Changed! Need 3 times to confirm.
if (tempBIndex < 1) // 突变!! 需要2次确认 因为可能只是很大的噪声
{
tempBIndex++;
tempBuf[tempBIndex] = ad;
......@@ -173,10 +218,93 @@ namespace FLY.Thick.Base.Server
preValue = swfilter.CalValue(swfilterCnt);
return preValue;
}
/// <summary>
/// 移动滤波窗口大小
/// </summary>
/// <param name="window"></param>
public void SetWindow(int window)
{
if (window < 50)
swfilterCnt = window;
}
}
/// <summary>
/// 样品修正 滤波, 返回N分钟内数据的均值。
/// 如果波动较大,提示异常
/// </summary>
public class TempFilter2
{
List<TempFilterData> Datas = new List<TempFilterData>();
TimeSpan keepTime = TimeSpan.FromMinutes(6);
/// <summary>
///
/// </summary>
public TempFilter2()
{
}
/// <summary>
///
/// </summary>
/// <param name="ad">原始AD</param>
/// <param name="filterTime">滤波时间</param>
/// <returns>滤波后Ad</returns>
public int CalSampleAD(int ad, TimeSpan filterTime)
{
if (filterTime.TotalSeconds <= 0)
{
filterTime = TimeSpan.Zero;
}
keepTime = TimeSpan.FromMinutes(Math.Max(6, filterTime.TotalMinutes * 3));
var now = DateTime.Now;
Datas.RemoveAll(d => d.Time < now - keepTime);
Datas.Add(new TempFilterData()
{
Ad = ad,
FilterAd = ad,
Time = now
});
double sum = 0;
int cnt = 0;
for (int i = 0; i < Datas.Count(); i++)
{
var d = Datas[Datas.Count()-1-i];
if (d.Time >= (now - filterTime) && d.IsReset == false)
{
sum += d.Ad;
cnt++;
}
else {
break;
}
}
if (cnt > 0)
{
Datas.Last().FilterAd = (int)Math.Round(sum / cnt);
}
return Datas.Last().FilterAd;
}
/// <summary>
///
/// </summary>
public void Reset()
{
var now = DateTime.Now;
Datas.RemoveAll(d => d.Time < now - keepTime);
Datas.Add(new TempFilterData() { IsReset = true, Time = DateTime.Now });
}
public List<TempFilterData> GetDatas()
{
return Datas;
}
}
}
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