Commit 97495615 authored by 潘栩锋's avatar 潘栩锋 🚴

优化 边界查找界面图更新问题

parent 1abec169
...@@ -30,4 +30,29 @@ namespace FObjBase ...@@ -30,4 +30,29 @@ namespace FObjBase
} }
public delegate void AsyncCBHandler(object asyncContext, object retData); public delegate void AsyncCBHandler(object asyncContext, object retData);
/// <summary>
/// 异步回调
/// </summary>
public class AsyncCbAttribute : Attribute {
/// <summary>
/// 返回的数据类型
/// </summary>
public Type RetType { get; private set; }
/// <summary>
/// 无数据返回
/// </summary>
public AsyncCbAttribute()
{
}
/// <summary>
///
/// </summary>
/// <param name="retType"></param>
public AsyncCbAttribute(Type retType) {
RetType = retType;
}
}
} }
...@@ -5,9 +5,11 @@ ...@@ -5,9 +5,11 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:Chr="clr-namespace:System.Windows.Forms.DataVisualization.Charting;assembly=System.Windows.Forms.DataVisualization" xmlns:Chr="clr-namespace:System.Windows.Forms.DataVisualization.Charting;assembly=System.Windows.Forms.DataVisualization"
xmlns:local ="clr-namespace:FLY.Thick.Base.UI" xmlns:local ="clr-namespace:FLY.Thick.Base.UI"
xmlns:misc="clr-namespace:Misc;assembly=MISC"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="727" d:DesignWidth="1280" d:DesignHeight="727" d:DesignWidth="1280"
d:DataContext="{d:DesignInstance local:PgBorderSearchVm}" d:DataContext="{d:DesignInstance local:PgBorderSearchVm}"
x:Name="root"
Background="WhiteSmoke" Background="WhiteSmoke"
Title="Page_BorderSearch"> Title="Page_BorderSearch">
<Page.Resources> <Page.Resources>
...@@ -203,7 +205,17 @@ ...@@ -203,7 +205,17 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<WrapPanel Grid.Column="1" Orientation="Horizontal"> <WrapPanel Grid.Column="1" Orientation="Horizontal">
<StackPanel Margin="5"> <StackPanel Margin="5">
<TextBlock Style="{StaticResource TextBlockStyle_FieldHeader}" Text="正向边界" /> <TextBlock Text="正向边界" >
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldHeader}">
<Style.Triggers>
<DataTrigger Binding="{Binding DataContext.Direction,ElementName=root}" Value="{x:Static misc:DIRECTION.FORWARD}">
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource TextBlockStyle_FieldContent}"> <TextBlock Style="{StaticResource TextBlockStyle_FieldContent}">
<Run Text="{Binding Border_Forw.Begin, Converter={StaticResource intconv}, Mode=OneWay}"/> <Run Text="{Binding Border_Forw.Begin, Converter={StaticResource intconv}, Mode=OneWay}"/>
...@@ -232,7 +244,17 @@ ...@@ -232,7 +244,17 @@
</StackPanel> </StackPanel>
<StackPanel Margin="5"> <StackPanel Margin="5">
<TextBlock Style="{StaticResource TextBlockStyle_FieldHeader}" Text="反向边界" /> <TextBlock Text="反向边界" >
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldHeader}">
<Style.Triggers>
<DataTrigger Binding="{Binding DataContext.Direction,ElementName=root}" Value="{x:Static misc:DIRECTION.BACKWARD}">
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource TextBlockStyle_FieldContent}"> <TextBlock Style="{StaticResource TextBlockStyle_FieldContent}">
<Run Text="{Binding Border_Backw.Begin, Converter={StaticResource intconv}, Mode=OneWay}"/> <Run Text="{Binding Border_Backw.Begin, Converter={StaticResource intconv}, Mode=OneWay}"/>
......
...@@ -21,6 +21,7 @@ using FLY.Thick.Base.IService; ...@@ -21,6 +21,7 @@ using FLY.Thick.Base.IService;
using System.ComponentModel; using System.ComponentModel;
using Misc; using Misc;
using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight.Command;
using FLY.Thick.Base.Server;
namespace FLY.Thick.Base.UI namespace FLY.Thick.Base.UI
{ {
...@@ -175,10 +176,10 @@ namespace FLY.Thick.Base.UI ...@@ -175,10 +176,10 @@ namespace FLY.Thick.Base.UI
} }
[InjectionMethod] [InjectionMethod]
public void Init(IBorderSearchService borderSearchService, IInitParamService initParamService) public void Init(IBorderSearchService borderSearchService, IInitParamService initParamService,IDynAreaService dynAreaService)
{ {
viewModel = new PgBorderSearchVm(); viewModel = new PgBorderSearchVm();
viewModel.Init(borderSearchService, initParamService,chart1); viewModel.Init(borderSearchService, initParamService, dynAreaService, chart1);
this.DataContext = viewModel; this.DataContext = viewModel;
} }
...@@ -189,6 +190,7 @@ namespace FLY.Thick.Base.UI ...@@ -189,6 +190,7 @@ namespace FLY.Thick.Base.UI
#region 延时推送 MARKNO #region 延时推送 MARKNO
const int MARKNO_UPDATE_BORDER = 0; const int MARKNO_UPDATE_BORDER = 0;
const int MARKNO_UPDATE_DATAS = 1; const int MARKNO_UPDATE_DATAS = 1;
#endregion #endregion
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
...@@ -255,8 +257,11 @@ namespace FLY.Thick.Base.UI ...@@ -255,8 +257,11 @@ namespace FLY.Thick.Base.UI
public RelayCommand ApplyCmd { get; private set; } public RelayCommand ApplyCmd { get; private set; }
#endregion #endregion
public Misc.DIRECTION Direction { get; private set; } = DIRECTION.FIX;
public IBorderSearchService BorderSearchService { get; private set; } public IBorderSearchService BorderSearchService { get; private set; }
public IInitParamService InitParamService { get; private set; } public IInitParamService InitParamService { get; private set; }
IDynAreaService dynAreaService;
BorderSearchGetViewReponse getViewReponse;
System.Windows.Forms.DataVisualization.Charting.Chart chart1; System.Windows.Forms.DataVisualization.Charting.Chart chart1;
public PgBorderSearchVm() public PgBorderSearchVm()
...@@ -268,10 +273,12 @@ namespace FLY.Thick.Base.UI ...@@ -268,10 +273,12 @@ namespace FLY.Thick.Base.UI
public void Init( public void Init(
IBorderSearchService borderSearchService, IBorderSearchService borderSearchService,
IInitParamService initParamService, IInitParamService initParamService,
IDynAreaService dynAreaService,
System.Windows.Forms.DataVisualization.Charting.Chart chart) System.Windows.Forms.DataVisualization.Charting.Chart chart)
{ {
BorderSearchService = borderSearchService; BorderSearchService = borderSearchService;
InitParamService = initParamService; InitParamService = initParamService;
this.dynAreaService = dynAreaService;
chart1 = chart; chart1 = chart;
Misc.BindingOperations.SetBinding(BorderSearchService, "Enable",this,"Enable"); Misc.BindingOperations.SetBinding(BorderSearchService, "Enable",this,"Enable");
...@@ -300,10 +307,13 @@ namespace FLY.Thick.Base.UI ...@@ -300,10 +307,13 @@ namespace FLY.Thick.Base.UI
UpdateBorder, this, MARKNO_UPDATE_BORDER); UpdateBorder, this, MARKNO_UPDATE_BORDER);
}; };
InitParamService.PropertyChanged += MInitParamService_PropertyChanged; InitParamService.PropertyChanged += MInitParamService_PropertyChanged;
UpdateX(); UpdateX();
chart1.PrePaint += Chart1_PrePaint; chart1.PrePaint += Chart1_PrePaint;
getView();
} }
private void MInitParamService_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) private void MInitParamService_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
...@@ -315,12 +325,10 @@ namespace FLY.Thick.Base.UI ...@@ -315,12 +325,10 @@ namespace FLY.Thick.Base.UI
private void MBorderSearchService_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) private void MBorderSearchService_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
if (e.PropertyName == "Datas")
if (e.PropertyName == "UpdateTime")
{ {
FObjBase.PollModule.Current.Poll_JustOnce( getView();
UpdateDatas, this, MARKNO_UPDATE_DATAS);
FObjBase.PollModule.Current.Poll_JustOnce(
UpdateBorder, this, MARKNO_UPDATE_BORDER);
} }
else if ((e.PropertyName == "TempAD") || else if ((e.PropertyName == "TempAD") ||
(e.PropertyName == "TempRange")) (e.PropertyName == "TempRange"))
...@@ -328,7 +336,15 @@ namespace FLY.Thick.Base.UI ...@@ -328,7 +336,15 @@ namespace FLY.Thick.Base.UI
chart1.Invalidate(); chart1.Invalidate();
} }
} }
void getView() {
BorderSearchService.GetView((asyncContext, retData) =>
{
this.getViewReponse = retData as BorderSearchGetViewReponse;
UpdateDatas();
FObjBase.PollModule.Current.Poll_JustOnce(
UpdateBorder, this, MARKNO_UPDATE_BORDER);
}, this);
}
private void Chart1_PrePaint(object sender, ChartPaintEventArgs e) private void Chart1_PrePaint(object sender, ChartPaintEventArgs e)
{ {
if (e.ChartElement is ChartArea) if (e.ChartElement is ChartArea)
...@@ -399,7 +415,9 @@ namespace FLY.Thick.Base.UI ...@@ -399,7 +415,9 @@ namespace FLY.Thick.Base.UI
} }
void UpdateY() void UpdateY()
{ {
int[] grid = BorderSearchService.Datas; if (getViewReponse == null)
return;
int[] grid = getViewReponse.dat;
if (grid == null) if (grid == null)
return; return;
...@@ -417,13 +435,13 @@ namespace FLY.Thick.Base.UI ...@@ -417,13 +435,13 @@ namespace FLY.Thick.Base.UI
else else
{ {
chart1.ChartAreas[0].AxisY.Minimum = 0; chart1.ChartAreas[0].AxisY.Minimum = 0;
chart1.ChartAreas[0].AxisY.Maximum = 60000; chart1.ChartAreas[0].AxisY.Maximum = dynAreaService.DynArea.ADMax;
} }
} }
else else
{ {
chart1.ChartAreas[0].AxisY.Minimum = 0; chart1.ChartAreas[0].AxisY.Minimum = 0;
chart1.ChartAreas[0].AxisY.Maximum = 60000; chart1.ChartAreas[0].AxisY.Maximum = dynAreaService.DynArea.ADMax;
} }
if (chart1.ChartAreas[0].AxisY.Minimum == chart1.ChartAreas[0].AxisY.Maximum) if (chart1.ChartAreas[0].AxisY.Minimum == chart1.ChartAreas[0].AxisY.Maximum)
...@@ -442,15 +460,18 @@ namespace FLY.Thick.Base.UI ...@@ -442,15 +460,18 @@ namespace FLY.Thick.Base.UI
System.Windows.Forms.DataVisualization.Charting.Series series = chart1.Series["series_datas"]; System.Windows.Forms.DataVisualization.Charting.Series series = chart1.Series["series_datas"];
series.Points.Clear(); series.Points.Clear();
if (getViewReponse == null)
return;
int[] grid = BorderSearchService.Datas; this.Direction = getViewReponse.direction;
int[] grid = getViewReponse.dat;
if (grid == null) if (grid == null)
return; return;
int posOfGrid = InitParamService.PosOfGrid; int posOfGrid = getViewReponse.posOfGrid;
for (int i = 0; i < grid.Length; i++) for (int i = 0; i < grid.Length; i++)
{ {
series.Points.AddXY(i * posOfGrid, grid[i]); series.Points.AddXY((i+ getViewReponse.gridBegin) * posOfGrid, grid[i]);
if (!Misc.MyBase.ISVALIDATA(grid[i])) if (!Misc.MyBase.ISVALIDATA(grid[i]))
{ {
series.Points[i].IsEmpty = true; series.Points[i].IsEmpty = true;
...@@ -465,13 +486,16 @@ namespace FLY.Thick.Base.UI ...@@ -465,13 +486,16 @@ namespace FLY.Thick.Base.UI
System.Windows.Forms.DataVisualization.Charting.Series series, System.Windows.Forms.DataVisualization.Charting.Series series,
int pos) int pos)
{ {
int[] grid = BorderSearchService.Datas; if (getViewReponse == null)
return false;
int[] grid = getViewReponse.dat;
if (grid == null) if (grid == null)
return false; return false;
int posOfGrid = InitParamService.PosOfGrid; int posOfGrid = getViewReponse.posOfGrid;
int grid_idx = pos / posOfGrid; int grid_idx = pos / posOfGrid - getViewReponse.gridBegin;
if (grid_idx < 0) if (grid_idx < 0)
return false; return false;
if (grid_idx >= grid.Length) if (grid_idx >= grid.Length)
......
...@@ -22,6 +22,7 @@ namespace FLY.Thick.Base.UI ...@@ -22,6 +22,7 @@ namespace FLY.Thick.Base.UI
IGageInfoService gageInfo = null; IGageInfoService gageInfo = null;
IGetSampleService getSample = null; IGetSampleService getSample = null;
IBorderSearchService borderSearch = null; IBorderSearchService borderSearch = null;
IDynAreaService dynAreaService = null;
IUnityContainer container; IUnityContainer container;
public PgGageInfo() public PgGageInfo()
{ {
...@@ -33,12 +34,14 @@ namespace FLY.Thick.Base.UI ...@@ -33,12 +34,14 @@ namespace FLY.Thick.Base.UI
IUnityContainer container, IUnityContainer container,
IGageInfoService gageInfoService, IGageInfoService gageInfoService,
IGetSampleService getSample, IGetSampleService getSample,
IBorderSearchService borderSearch IBorderSearchService borderSearch,
IDynAreaService dynAreaService
) )
{ {
this.gageInfo = gageInfoService; this.gageInfo = gageInfoService;
this.getSample = getSample; this.getSample = getSample;
this.borderSearch = borderSearch; this.borderSearch = borderSearch;
this.dynAreaService = dynAreaService;
this.container = container; this.container = container;
container.BuildUp(mircoGage); container.BuildUp(mircoGage);
} }
...@@ -300,8 +303,8 @@ namespace FLY.Thick.Base.UI ...@@ -300,8 +303,8 @@ namespace FLY.Thick.Base.UI
if (chart1.ChartAreas[0].AxisY.Minimum < 0) if (chart1.ChartAreas[0].AxisY.Minimum < 0)
chart1.ChartAreas[0].AxisY.Minimum = 0; chart1.ChartAreas[0].AxisY.Minimum = 0;
if (chart1.ChartAreas[0].AxisY.Maximum > 60000) if (chart1.ChartAreas[0].AxisY.Maximum > dynAreaService.DynArea.ADMax)
chart1.ChartAreas[0].AxisY.Maximum = 60000; chart1.ChartAreas[0].AxisY.Maximum = dynAreaService.DynArea.ADMax;
} }
chart1.ChartAreas[0].AxisX.Minimum = 0; chart1.ChartAreas[0].AxisX.Minimum = 0;
chart1.ChartAreas[0].AxisX.Maximum = gageInfo.PosLen; chart1.ChartAreas[0].AxisX.Maximum = gageInfo.PosLen;
......
...@@ -42,25 +42,28 @@ namespace FLY.Thick.Base.Client ...@@ -42,25 +42,28 @@ namespace FLY.Thick.Base.Client
[PropertyChanged.DoNotCheckEquality] [PropertyChanged.DoNotCheckEquality]
public Range Valid { get; set; } = new Range(); public Range Valid { get; set; } = new Range();
[PropertyChanged.DoNotCheckEquality] [PropertyChanged.DoNotCheckEquality]
public Range Border_Backw { get; private set; } = new Range(); public Range Border_Backw { get; set; } = new Range();
[PropertyChanged.DoNotCheckEquality] [PropertyChanged.DoNotCheckEquality]
public Range Border_Forw { get; private set; } = new Range(); public Range Border_Forw { get; set; } = new Range();
[PropertyChanged.DoNotCheckEquality] [PropertyChanged.DoNotCheckEquality]
public Range Border { get; private set; } = new Range(); public Range Border { get; set; } = new Range();
/// <summary> /// <summary>
/// 当前膜宽,测量出来的,单位是 脉冲 /// 当前膜宽,测量出来的,单位是 脉冲
/// </summary> /// </summary>
public int Width { get; protected set; } public int Width { get; set; }
/// <summary> /// <summary>
/// 膜中间位置 单位 脉冲 /// 膜中间位置 单位 脉冲
/// </summary> /// </summary>
public int Mid { get; protected set; } public int Mid { get; set; }
/// <summary>
/// 调试数据更新时间
/// </summary>
public DateTime UpdateTime { get; set; }
/// <summary> /// <summary>
/// 手动设置温修AD值 /// 手动设置温修AD值
/// </summary> /// </summary>
...@@ -93,30 +96,28 @@ namespace FLY.Thick.Base.Client ...@@ -93,30 +96,28 @@ namespace FLY.Thick.Base.Client
public int N3 { get; set; } public int N3 { get; set; }
/// <summary>
/// 用于调试, 进入到边界查找的数据
/// </summary>
[PropertyChanged.DoNotCheckEquality]
public int[] Datas { get; protected set; } = null;
#endregion #endregion
public void GetView(AsyncCBHandler asyncDelegate, object asyncContext)
{
CurrObjSys.CallFunctionEx(mConn, mServerID, ID, BORDERSEARCH_OBJ_INTERFACE.CALL_GETVIEW, null, asyncDelegate, asyncContext);
}
public void Apply() public void Apply()
{ {
var p = new BORDERSEARCH_OBJ_INTERFACE.Pack_Params(); var p = new BORDERSEARCH_OBJ_INTERFACE.Pack_Params();
p.enable = Enable; p.Enable = Enable;
p.tempADBySet = TempADBySet; p.TempADBySet = TempADBySet;
p.tempad = TempAD; p.TempAD = TempAD;
p.temprange = TempRange; p.TempRange = TempRange;
p.n = N; p.N = N;
p.n2 = N2; p.N2 = N2;
p.n3 = N3; p.N3 = N3;
p.valid = Valid; p.Valid = Valid;
p.sensorwidth = SensorWidth; p.SensorWidth = SensorWidth;
p.isBreakDetect = IsBreakDetect; p.IsBreakDetect = IsBreakDetect;
p.isTempRangeByPercent = IsTempRangeByPercent; p.IsTempRangeByPercent = IsTempRangeByPercent;
p.tempRangePercent = TempRangePercent; p.TempRangePercent = TempRangePercent;
string json = Newtonsoft.Json.JsonConvert.SerializeObject(p); string json = Newtonsoft.Json.JsonConvert.SerializeObject(p);
//获取所有数据,设置推送 //获取所有数据,设置推送
...@@ -137,10 +138,7 @@ namespace FLY.Thick.Base.Client ...@@ -137,10 +138,7 @@ namespace FLY.Thick.Base.Client
BORDERSEARCH_OBJ_INTERFACE.GET_PARAMS); BORDERSEARCH_OBJ_INTERFACE.GET_PARAMS);
CurrObjSys.GetValueEx( CurrObjSys.GetValueEx(
mConn, mServerID, ID, mConn, mServerID, ID,
BORDERSEARCH_OBJ_INTERFACE.GET_RESULT); BORDERSEARCH_OBJ_INTERFACE.GET_STATE);
CurrObjSys.GetValueEx(
mConn, mServerID, ID,
BORDERSEARCH_OBJ_INTERFACE.GET_DATAS);
CurrObjSys.SenseConfigEx( CurrObjSys.SenseConfigEx(
mConn, mServerID, ID, 0xffffffff, SENSE_CONFIG.ADD); mConn, mServerID, ID, 0xffffffff, SENSE_CONFIG.ADD);
} }
...@@ -152,44 +150,13 @@ namespace FLY.Thick.Base.Client ...@@ -152,44 +150,13 @@ namespace FLY.Thick.Base.Client
case BORDERSEARCH_OBJ_INTERFACE.GET_PARAMS: case BORDERSEARCH_OBJ_INTERFACE.GET_PARAMS:
{ {
string json = Misc.Converter.BytesToString(infodata); string json = Misc.Converter.BytesToString(infodata);
Newtonsoft.Json.JsonConvert.PopulateObject(json, this);
var p = Newtonsoft.Json.JsonConvert.DeserializeObject<BORDERSEARCH_OBJ_INTERFACE.Pack_Params>(json);
Enable = p.enable;
Valid = p.valid;
TempADBySet = p.tempADBySet;
TempAD = p.tempad;
TempRange = p.temprange;
N=p.n;
SensorWidth = p.sensorwidth;
N2=p.n2;
N3=p.n3;
IsBreakDetect = p.isBreakDetect;
IsTempRangeByPercent = p.isTempRangeByPercent;
TempRangePercent = p.tempRangePercent;
} break; } break;
case BORDERSEARCH_OBJ_INTERFACE.GET_RESULT: case BORDERSEARCH_OBJ_INTERFACE.GET_STATE:
{ {
string json = Misc.Converter.BytesToString(infodata); string json = Misc.Converter.BytesToString(infodata);
Newtonsoft.Json.JsonConvert.PopulateObject(json, this);
var p = Newtonsoft.Json.JsonConvert.DeserializeObject<BORDERSEARCH_OBJ_INTERFACE.Pack_Result>(json);
Border_Forw = p.borderForw;
Border_Backw = p.borderBackw;
Border = p.border;
Width = p.width;
Mid = p.mid;
} break; } break;
case BORDERSEARCH_OBJ_INTERFACE.GET_DATAS:
{
string json = Misc.Converter.BytesToString(infodata);
var p = Newtonsoft.Json.JsonConvert.DeserializeObject<BORDERSEARCH_OBJ_INTERFACE.Pack_Data>(json);
Datas = p.data;
}
break;
} }
} }
public override void PushInfo(IFConn from, uint srcid, ushort infoid, byte[] infodata) public override void PushInfo(IFConn from, uint srcid, ushort infoid, byte[] infodata)
...@@ -197,6 +164,19 @@ namespace FLY.Thick.Base.Client ...@@ -197,6 +164,19 @@ namespace FLY.Thick.Base.Client
PushGetValue(from, srcid, infoid, infodata); 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 BORDERSEARCH_OBJ_INTERFACE.CALL_GETVIEW:
{
string json = Misc.Converter.BytesToString(retdata);
var reponse = Newtonsoft.Json.JsonConvert.DeserializeObject<BorderSearchGetViewReponse>(json);
((AsyncCBHandler)AsyncDelegate)?.Invoke(AsyncState, reponse);
}
break;
}
}
} }
} }
...@@ -5,16 +5,20 @@ using System.Text; ...@@ -5,16 +5,20 @@ using System.Text;
using FLY.Thick.Base.Common; using FLY.Thick.Base.Common;
using System.ComponentModel; using System.ComponentModel;
using Misc; using Misc;
using FObjBase;
namespace FLY.Thick.Base.IService namespace FLY.Thick.Base.IService
{ {
/// <summary>
///
/// </summary>
public interface IBorderSearchService:INotifyPropertyChanged public interface IBorderSearchService:INotifyPropertyChanged
{ {
#region 参数
/// <summary> /// <summary>
/// 启动与否 /// 启动与否
/// </summary> /// </summary>
bool Enable{get;set;} bool Enable {get;set;}
/// <summary> /// <summary>
/// 边界拐点检测,找到的边界更加精确 /// 边界拐点检测,找到的边界更加精确
...@@ -25,26 +29,7 @@ namespace FLY.Thick.Base.IService ...@@ -25,26 +29,7 @@ namespace FLY.Thick.Base.IService
/// 有限范围 /// 有限范围
/// </summary> /// </summary>
Range Valid{ get; set; } Range Valid{ get; set; }
/// <summary>
/// 反向边界
/// </summary>
Range Border_Backw{ get; }
/// <summary>
/// 正向边界
/// </summary>
Range Border_Forw{ get; }
/// <summary>
/// 边界
/// </summary>
Range Border { get; }
/// <summary>
/// 当前膜宽,测量出来的,单位是 脉冲
/// </summary>
int Width { get; }
/// <summary>
/// 膜中间位置 单位 脉冲
/// </summary>
int Mid { get; }
/// <summary> /// <summary>
/// 手动设置温修AD值 /// 手动设置温修AD值
/// </summary> /// </summary>
...@@ -52,12 +37,12 @@ namespace FLY.Thick.Base.IService ...@@ -52,12 +37,12 @@ namespace FLY.Thick.Base.IService
/// <summary> /// <summary>
/// 温修AD值 /// 温修AD值
/// </summary> /// </summary>
int TempAD{get;set;} int TempAD { get; set; }
/// <summary> /// <summary>
/// AD超过了范围, 就认为开始找到边界 /// AD超过了范围, 就认为开始找到边界
/// </summary> /// </summary>
int TempRange{get;set;} int TempRange { get; set; }
/// <summary> /// <summary>
/// 温修范围是温修的百分比 /// 温修范围是温修的百分比
/// </summary> /// </summary>
...@@ -70,32 +55,72 @@ namespace FLY.Thick.Base.IService ...@@ -70,32 +55,72 @@ namespace FLY.Thick.Base.IService
/// <summary> /// <summary>
/// 有滤波器,只有非空的连续N个pos以上,才开始算边界开始 /// 有滤波器,只有非空的连续N个pos以上,才开始算边界开始
/// </summary> /// </summary>
int N{get;set;} int N { get; set; }
/// <summary> /// <summary>
/// 探头直径,单位脉冲, 膜宽 = 边界范围 - 探头直径 /// 探头直径,单位脉冲, 膜宽 = 边界范围 - 探头直径
/// </summary> /// </summary>
int SensorWidth { get; set; } int SensorWidth { get; set; }
/// <summary> /// <summary>
/// 找到边界后,边界 + 探头半径 + N2个脉冲。 这个是数据有效的开始 /// 找到边界后,边界 + 探头半径 + N2个脉冲。 这个是数据有效的开始
/// </summary> /// </summary>
int N2{get;set;} int N2 { get; set; }
/// <summary> /// <summary>
/// 记录两个边界以后扫描,以它们再外扩N3个脉冲,作为扫描范围 /// 记录两个边界以后扫描,以它们再外扩N3个脉冲,作为扫描范围
/// </summary> /// </summary>
int N3{get;set;} int N3 { get; set; }
#endregion
#region 状态
/// <summary>
/// 反向边界
/// </summary>
Range Border_Backw { get; }
/// <summary>
/// 正向边界
/// </summary>
Range Border_Forw{ get; }
/// <summary>
/// 边界
/// </summary>
Range Border { get; }
/// <summary>
/// 当前膜宽,测量出来的,单位是 脉冲
/// </summary>
int Width { get; }
/// <summary>
/// 膜中间位置 单位 脉冲
/// </summary>
int Mid { get; }
/// <summary> /// <summary>
/// 用于调试, 进入到边界查找的数据 /// 数据更新时间
/// </summary> /// </summary>
int[] Datas { get; } DateTime UpdateTime { get; }
#endregion
/// <summary>
/// 获取混合后的横向数据;没有把横向留白剔除;只把纵向留白剔除。
/// 数据单位 mm
/// </summary>
/// <param name="asyncDelegate"></param>
/// <param name="asyncContext"></param>
[AsyncCb(typeof(BorderSearchGetViewReponse))]
void GetView(AsyncCBHandler asyncDelegate, object asyncContext);
/// <summary> /// <summary>
/// 应该 及 保存 /// 应该 及 保存
/// </summary> /// </summary>
void Apply(); void Apply();
} }
public class BorderSearchGetViewReponse
{
public DIRECTION direction;
public int posOfGrid;
public int gridBegin;
public int[] dat;
}
} }
...@@ -5,41 +5,44 @@ using System.Text; ...@@ -5,41 +5,44 @@ using System.Text;
using FObjBase; using FObjBase;
using FLY.Thick.Base.Common; using FLY.Thick.Base.Common;
using Misc; using Misc;
using AutoMapper;
using FLY.Thick.Base.IService;
namespace FLY.Thick.Base.OBJ_INTERFACE namespace FLY.Thick.Base.OBJ_INTERFACE
{ {
public class BORDERSEARCH_OBJ_INTERFACE public class BORDERSEARCH_OBJ_INTERFACE
{ {
public static Mapper Mapper { get; } = new AutoMapper.Mapper(new MapperConfiguration(c =>
{
c.CreateMap<IBorderSearchService, Pack_Params>();
c.CreateMap<IBorderSearchService, Pack_State>();
}));
#region Pack #region Pack
public class Pack_Params public class Pack_Params
{ {
public bool enable; public bool Enable;
public Range valid; public Range Valid;
public bool tempADBySet; public bool TempADBySet;
public int tempad; public int TempAD;
public int temprange; public int TempRange;
public int n; public int N;
public int sensorwidth; public int SensorWidth;
public int n2; public int N2;
public int n3; public int N3;
public bool isBreakDetect; public bool IsBreakDetect;
public bool isTempRangeByPercent; public bool IsTempRangeByPercent;
public double tempRangePercent; public double TempRangePercent;
} }
public class Pack_Result public class Pack_State
{ {
public Range borderForw; public Range Border_Forw;
public Range borderBackw; public Range Border_Backw;
public Range border; public Range Border;
public int width; public int Width;
public int mid; public int Mid;
public DateTime UpdateTime;
} }
public class Pack_Data
{
public int[] data;
}
#endregion #endregion
#region GetValue #region GetValue
/// <summary> /// <summary>
...@@ -47,33 +50,31 @@ namespace FLY.Thick.Base.OBJ_INTERFACE ...@@ -47,33 +50,31 @@ namespace FLY.Thick.Base.OBJ_INTERFACE
/// </summary> /// </summary>
public const UInt16 GET_PARAMS = 0; public const UInt16 GET_PARAMS = 0;
/// <summary> /// <summary>
/// Pack_Result /// Pack_State
/// </summary> /// </summary>
public const UInt16 GET_RESULT = 1; public const UInt16 GET_STATE = 1;
/// <summary>
/// Pack_Data
/// </summary>
public const UInt16 GET_DATAS = 2;
#endregion #endregion
#region SetValue #region SetValue
/// <summary> /// <summary>
/// Pack_GetParam /// Pack_Params
/// </summary> /// </summary>
public const UInt16 SET_PARAMS = 0; public const UInt16 SET_PARAMS = 0;
#endregion #endregion
#region PushMsg #region PushMsg
/// <summary> /// <summary>
/// Pack_GetParam /// Pack_Params
/// </summary> /// </summary>
public const UInt16 PUSH_PARAMS = 0; public const UInt16 PUSH_PARAMS = 0;
/// <summary> /// <summary>
/// Pack_GetResult /// Pack_State
/// </summary> /// </summary>
public const UInt16 PUSH_RESULT = 1; public const UInt16 PUSH_STATE = 1;
#endregion
#region Call
/// <summary> /// <summary>
/// Pack_Data ///
/// </summary> /// </summary>
public const UInt16 PUSH_DATAS = 2; public const UInt16 CALL_GETVIEW = 0;
#endregion #endregion
} }
} }
...@@ -12,9 +12,15 @@ namespace FLY.Thick.Base.Server.OBJProxy ...@@ -12,9 +12,15 @@ namespace FLY.Thick.Base.Server.OBJProxy
{ {
#region 延时推送 MARKNO #region 延时推送 MARKNO
const int MARKNO_PUSH_PARAMS = 0; const int MARKNO_PUSH_PARAMS = 0;
const int MARKNO_PUSH_RESULT = 1; const int MARKNO_PUSH_STATE = 1;
const int MARKNO_PUSH_DATAS = 2;
#endregion #endregion
private static string[] propertyname_params = new string[] {
"Enable","Valid","TempADBySet","TempAD","TempRange","TempRangePercent","IsTempRangeByPercent",
"SensorWidth","N","N2","N3","IsDetectBreak"
};
private static string[] propertyname_state = new string[] {
"Border_Backw","Border_Forw","Border","Width","Mid","UpdateTime"
};
IBorderSearchService mBorderSearch; IBorderSearchService mBorderSearch;
public BorderSearch_OBJProxy(int objsys_idx, UInt32 id, IBorderSearchService borderSearch) :base(objsys_idx) public BorderSearch_OBJProxy(int objsys_idx, UInt32 id, IBorderSearchService borderSearch) :base(objsys_idx)
...@@ -27,19 +33,7 @@ namespace FLY.Thick.Base.Server.OBJProxy ...@@ -27,19 +33,7 @@ namespace FLY.Thick.Base.Server.OBJProxy
void mBorderSearch_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) void mBorderSearch_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
if ((e.PropertyName == "Enable") || if (propertyname_params.Contains(e.PropertyName))
(e.PropertyName == "Valid") ||
(e.PropertyName == "TempADBySet") ||
(e.PropertyName == "TempAD") ||
(e.PropertyName == "TempRange") ||
(e.PropertyName == "TempRangePercent") ||
(e.PropertyName == "IsTempRangeByPercent") ||
(e.PropertyName == "SensorWidth") ||
(e.PropertyName == "N") ||
(e.PropertyName == "N2") ||
(e.PropertyName == "N3") ||
(e.PropertyName == "IsDetectBreak")
)
{ {
FObjBase.PollModule.Current.Poll_JustOnce( FObjBase.PollModule.Current.Poll_JustOnce(
...@@ -52,33 +46,17 @@ namespace FLY.Thick.Base.Server.OBJProxy ...@@ -52,33 +46,17 @@ namespace FLY.Thick.Base.Server.OBJProxy
buf); buf);
}), this, MARKNO_PUSH_PARAMS); }), this, MARKNO_PUSH_PARAMS);
} }
else if ( else if (propertyname_state.Contains(e.PropertyName))
(e.PropertyName == "Border_Backw") ||
(e.PropertyName == "Border_Forw") ||
(e.PropertyName == "Width") ||
(e.PropertyName == "Mid"))
{ {
FObjBase.PollModule.Current.Poll_JustOnce( FObjBase.PollModule.Current.Poll_JustOnce(
new PollModule.PollHandler(delegate () new PollModule.PollHandler(delegate ()
{ {
byte[] buf; byte[] buf;
GetValue(null, 0, BORDERSEARCH_OBJ_INTERFACE.GET_RESULT, out buf); GetValue(null, 0, BORDERSEARCH_OBJ_INTERFACE.GET_STATE, out buf);
CurrObjSys.PushObjInfoEx( CurrObjSys.PushObjInfoEx(
this, BORDERSEARCH_OBJ_INTERFACE.PUSH_RESULT, this, BORDERSEARCH_OBJ_INTERFACE.PUSH_STATE,
buf); buf);
}), this, MARKNO_PUSH_RESULT); }), this, MARKNO_PUSH_STATE);
}
else if (e.PropertyName == "Datas")
{
FObjBase.PollModule.Current.Poll_JustOnce(
new PollModule.PollHandler(delegate ()
{
byte[] buf;
GetValue(null, 0, BORDERSEARCH_OBJ_INTERFACE.GET_DATAS, out buf);
CurrObjSys.PushObjInfoEx(
this, BORDERSEARCH_OBJ_INTERFACE.PUSH_DATAS,
buf);
}), this, MARKNO_PUSH_DATAS);
} }
} }
...@@ -89,46 +67,16 @@ namespace FLY.Thick.Base.Server.OBJProxy ...@@ -89,46 +67,16 @@ namespace FLY.Thick.Base.Server.OBJProxy
{ {
case BORDERSEARCH_OBJ_INTERFACE.GET_PARAMS: case BORDERSEARCH_OBJ_INTERFACE.GET_PARAMS:
{ {
BORDERSEARCH_OBJ_INTERFACE.Pack_Params p = new BORDERSEARCH_OBJ_INTERFACE.Pack_Params() var p = BORDERSEARCH_OBJ_INTERFACE.Mapper.Map<BORDERSEARCH_OBJ_INTERFACE.Pack_Params>(mBorderSearch);
{
enable = mBorderSearch.Enable,
valid = mBorderSearch.Valid,
tempADBySet = mBorderSearch.TempADBySet,
tempad = mBorderSearch.TempAD,
temprange = mBorderSearch.TempRange,
n = mBorderSearch.N,
sensorwidth = mBorderSearch.SensorWidth,
n2 = mBorderSearch.N2,
n3 = mBorderSearch.N3,
isBreakDetect = mBorderSearch.IsBreakDetect,
isTempRangeByPercent = mBorderSearch.IsTempRangeByPercent,
tempRangePercent = mBorderSearch.TempRangePercent
};
string json = Newtonsoft.Json.JsonConvert.SerializeObject(p); string json = Newtonsoft.Json.JsonConvert.SerializeObject(p);
infodata = Misc.Converter.StringToBytes(json); infodata = Misc.Converter.StringToBytes(json);
} break; } break;
case BORDERSEARCH_OBJ_INTERFACE.GET_RESULT: case BORDERSEARCH_OBJ_INTERFACE.GET_STATE:
{ {
BORDERSEARCH_OBJ_INTERFACE.Pack_Result p = new BORDERSEARCH_OBJ_INTERFACE.Pack_Result() var p = BORDERSEARCH_OBJ_INTERFACE.Mapper.Map<BORDERSEARCH_OBJ_INTERFACE.Pack_State>(mBorderSearch);
{
borderForw = mBorderSearch.Border_Forw,
borderBackw = mBorderSearch.Border_Backw,
width = mBorderSearch.Width,
mid = mBorderSearch.Mid
};
string json = Newtonsoft.Json.JsonConvert.SerializeObject(p); string json = Newtonsoft.Json.JsonConvert.SerializeObject(p);
infodata = Misc.Converter.StringToBytes(json); infodata = Misc.Converter.StringToBytes(json);
} break; } break;
case BORDERSEARCH_OBJ_INTERFACE.GET_DATAS:
{
BORDERSEARCH_OBJ_INTERFACE.Pack_Data p = new BORDERSEARCH_OBJ_INTERFACE.Pack_Data()
{
data = mBorderSearch.Datas
};
string json = Newtonsoft.Json.JsonConvert.SerializeObject(p);
infodata = Misc.Converter.StringToBytes(json);
}
break;
default: default:
infodata = null; infodata = null;
break; break;
...@@ -141,27 +89,28 @@ namespace FLY.Thick.Base.Server.OBJProxy ...@@ -141,27 +89,28 @@ namespace FLY.Thick.Base.Server.OBJProxy
case BORDERSEARCH_OBJ_INTERFACE.SET_PARAMS: case BORDERSEARCH_OBJ_INTERFACE.SET_PARAMS:
{ {
string json = Misc.Converter.BytesToString(infodata); string json = Misc.Converter.BytesToString(infodata);
var p = Newtonsoft.Json.JsonConvert.DeserializeObject<BORDERSEARCH_OBJ_INTERFACE.Pack_Params>(json); Newtonsoft.Json.JsonConvert.PopulateObject(json, mBorderSearch);
mBorderSearch.Enable = p.enable;
mBorderSearch.Valid = p.valid;
mBorderSearch.TempRange = p.temprange;
mBorderSearch.TempADBySet = p.tempADBySet;
mBorderSearch.TempAD = p.tempad;
mBorderSearch.N = p.n;
mBorderSearch.SensorWidth = p.sensorwidth;
mBorderSearch.N2 = p.n2;
mBorderSearch.N3 = p.n3;
mBorderSearch.IsBreakDetect = p.isBreakDetect;
mBorderSearch.IsTempRangeByPercent = p.isTempRangeByPercent;
mBorderSearch.TempRangePercent = p.tempRangePercent;
mBorderSearch.Apply(); mBorderSearch.Apply();
} break; } break;
} }
} }
public override void CallFunction(IFConn from, uint srcid, uint magic, ushort funcid, byte[] infodata)
{
switch (funcid)
{
case BORDERSEARCH_OBJ_INTERFACE.CALL_GETVIEW:
{
mBorderSearch.GetView((asyncContext, retData) =>
{
string json = Newtonsoft.Json.JsonConvert.SerializeObject(retData);
CurrObjSys.PushCallFunctionEx(from, srcid, ID, magic, funcid, Misc.Converter.StringToBytes(json));
}, null);
}
break;
}
}
} }
} }
...@@ -6,6 +6,7 @@ using System.ComponentModel; ...@@ -6,6 +6,7 @@ using System.ComponentModel;
using Misc; using Misc;
using FLY.Thick.Base.Common; using FLY.Thick.Base.Common;
using FLY.Thick.Base.IService; using FLY.Thick.Base.IService;
using FObjBase;
namespace FLY.Thick.Base.Server namespace FLY.Thick.Base.Server
{ {
...@@ -35,6 +36,9 @@ namespace FLY.Thick.Base.Server ...@@ -35,6 +36,9 @@ namespace FLY.Thick.Base.Server
/// </summary> /// </summary>
public bool IsBreakDetect { get; set; } = true; public bool IsBreakDetect { get; set; } = true;
/// <summary>
/// 正反向边界数据
/// </summary>
protected Range[] border = new Range[2] { new Range(), new Range() }; protected Range[] border = new Range[2] { new Range(), new Range() };
/// <summary> /// <summary>
...@@ -121,15 +125,21 @@ namespace FLY.Thick.Base.Server ...@@ -121,15 +125,21 @@ namespace FLY.Thick.Base.Server
/// </summary> /// </summary>
public int N3 { get; set; } public int N3 { get; set; }
/// <summary> /// <summary>
/// 用于调试, 进入到边界查找的数据 /// 数据更新时间
/// </summary> /// </summary>
public int[] Datas { get; set; } = null; public DateTime UpdateTime { get; protected set; }
#endregion #endregion
OBJComponents.Server.WarningSystem warningSystem; OBJComponents.Server.WarningSystem warningSystem;
/// <summary>
/// 用于调试, 进入到边界查找的数据
/// </summary>
protected BorderSearchGetViewReponse getViewReponse;
private string param_path = "bordersearch.xml"; private string param_path = "bordersearch.xml";
public BorderSearch() public BorderSearch()
{ {
...@@ -182,6 +192,7 @@ namespace FLY.Thick.Base.Server ...@@ -182,6 +192,7 @@ namespace FLY.Thick.Base.Server
TempRange = 500; TempRange = 500;
TempRangePercent = 500.0 / 50000; TempRangePercent = 500.0 / 50000;
IsTempRangeByPercent = true; IsTempRangeByPercent = true;
UpdateTime = DateTime.MinValue;
} }
...@@ -565,6 +576,7 @@ namespace FLY.Thick.Base.Server ...@@ -565,6 +576,7 @@ namespace FLY.Thick.Base.Server
borderend_grid = eg; borderend_grid = eg;
return true; return true;
} }
/// <summary> /// <summary>
/// 放入grid数据,分析边界 /// 放入grid数据,分析边界
/// </summary> /// </summary>
...@@ -576,21 +588,14 @@ namespace FLY.Thick.Base.Server ...@@ -576,21 +588,14 @@ namespace FLY.Thick.Base.Server
public virtual bool FindFilm(DIRECTION direction, int posOfGrid, int gridBegin, int[] dat) public virtual bool FindFilm(DIRECTION direction, int posOfGrid, int gridBegin, int[] dat)
{ {
//把数据记录下来 //把数据记录下来
if ((Datas == null)|| (Datas.Length < (dat.Length + gridBegin))) getViewReponse = new BorderSearchGetViewReponse()
{ {
int len = dat.Length + gridBegin; direction = direction,
Datas = new int[len]; posOfGrid = posOfGrid,
} gridBegin = gridBegin,
for (int i = 0; i < Datas.Length; i++) dat = dat
{ };
if (i < gridBegin)//清空前面 UpdateTime = DateTime.Now;
Datas[i] = Misc.MyBase.NULL_VALUE;
else if (i < (gridBegin + dat.Length))
Datas[i] = dat[i - gridBegin];
else//清空后面
Datas[i] = Misc.MyBase.NULL_VALUE;
}
NotifyPropertyChanged("Datas");
//转为 dat 的序号 //转为 dat 的序号
int validbegin_grid = Valid.Begin / posOfGrid - gridBegin; int validbegin_grid = Valid.Begin / posOfGrid - gridBegin;
...@@ -755,6 +760,19 @@ namespace FLY.Thick.Base.Server ...@@ -755,6 +760,19 @@ namespace FLY.Thick.Base.Server
GetBoltRange2(direction, out b, out e); GetBoltRange2(direction, out b, out e);
return new Range() { Begin = b, End = e }; return new Range() { Begin = b, End = e };
} }
/// <summary>
/// 获取混合后的横向数据;没有把横向留白剔除;只把纵向留白剔除。
/// 数据单位 mm
/// </summary>
/// <param name="asyncDelegate"></param>
/// <param name="asyncContext"></param>
[AsyncCb(typeof(BorderSearchGetViewReponse))]
public void GetView(AsyncCBHandler asyncDelegate, object asyncContext)
{
asyncDelegate?.Invoke(asyncContext, getViewReponse);
}
public bool Load() public bool Load()
{ {
return Misc.SaveToXmlHepler.Load(param_path, this); return Misc.SaveToXmlHepler.Load(param_path, this);
......
using Misc; using FLY.Thick.Base.IService;
using Misc;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
...@@ -27,21 +28,13 @@ namespace FLY.Thick.Base.Server ...@@ -27,21 +28,13 @@ namespace FLY.Thick.Base.Server
public override bool FindFilm(DIRECTION direction, int posOfGrid, int gridBegin, int[] dat) public override bool FindFilm(DIRECTION direction, int posOfGrid, int gridBegin, int[] dat)
{ {
//把数据记录下来 //把数据记录下来
if ((Datas == null) || (Datas.Length < (dat.Length + gridBegin))) getViewReponse = new BorderSearchGetViewReponse()
{ {
int len = dat.Length + gridBegin; posOfGrid = posOfGrid,
Datas = new int[len]; gridBegin = gridBegin,
} dat = dat
for (int i = 0; i < Datas.Length; i++) };
{ UpdateTime = DateTime.Now;
if (i < gridBegin)//清空前面
Datas[i] = Misc.MyBase.NULL_VALUE;
else if (i < (gridBegin + dat.Length))
Datas[i] = dat[i - gridBegin];
else//清空后面
Datas[i] = Misc.MyBase.NULL_VALUE;
}
NotifyPropertyChanged("Datas");
//这些是AD值 //这些是AD值
//转为 dat 的序号 //转为 dat 的序号
......
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