using ivf_tl_CustomControls;
using ivf_tl_Entity.CameraEntitys;
using ivf_tl_Entity.GlobalEnums;
using ivf_tl_Operate.ViewModel;
using ivf_tl_Operate.Windows;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Runtime.ConstrainedExecution;
using System.Security.Cryptography;
using System.Security.Policy;
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.Media.Media3D;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ivf_tl_Operate.View
{
///
/// HouseDebugPageView.xaml 的交互逻辑
///
public partial class HouseDebugPageView : UserControl
{
//private HouseDebugPageViewModel vm { get { return (HouseDebugPageViewModel)DataContext; } }
private HouseDebugPageViewModel vm = null;
///
/// 实时图像打开状态
///
private bool isOpen = false;
private object locker = new object();
//#bdbdbd #bfd87d
public HouseDebugPageView(HouseDebugPageViewModel houseDebugPageViewModel)
{
try
{
InitializeComponent();
vm = houseDebugPageViewModel;
this.DataContext = vm;
Loaded += HouseDebugPageView_Loaded;
}
catch (Exception ex)
{
ExLog(ex, "HouseDebugPageView");
}
}
#region 通用设置
private void HouseDebugPageView_Loaded(object sender, RoutedEventArgs e)
{
vm.MessageEvent += AddMessageInfo;
vm.OpenVideoEvent += OpenVideo;
vm.AddPicEvent += AddPic;
foreach (var item in vm.HouseList)
{
switch (item.houseSn)
{
case 1:
this._houseCCD1.Text = item.ccdId.ToString();
break;
case 2:
this._houseCCD2.Text = item.ccdId.ToString();
break;
case 3:
this._houseCCD3.Text = item.ccdId.ToString();
break;
case 4:
this._houseCCD4.Text = item.ccdId.ToString();
break;
case 5:
this._houseCCD5.Text = item.ccdId.ToString();
break;
case 6:
this._houseCCD6.Text = item.ccdId.ToString();
break;
case 7:
this._houseCCD7.Text = item.ccdId.ToString();
break;
case 8:
this._houseCCD8.Text = item.ccdId.ToString();
break;
case 9:
this._houseCCD9.Text = item.ccdId.ToString();
break;
case 10:
this._houseCCD10.Text = item.ccdId.ToString();
break;
}
}
}
private void RefshInfo()
{
Dispatcher.Invoke(() =>
{
var aa = vm.houseWellSettingList.FirstOrDefault(x => x.houseSn == vm.CurrentHouseId && x.wellSn == vm.CurrentWell);
if (aa == null)
{
this._well_TextBlock.Text = "0";
this._eepromPosition.Text = "0";
}
else
{
this._well_TextBlock.Text = aa.horizontalMotorPosition.ToString();
this._eepromPosition.Text = aa.eepromClearPosition.ToString();
}
var bb = vm.ccdPhoto.FirstOrDefault(x => x.houseSn == vm.CurrentHouseId && x.wellSn == vm.CurrentWell);
if (bb == null)
{
this._autoFocus.Text = "0";
this._ccdOne.Text = "0";
}
else
{
this._autoFocus.Text = bb.autoFocusPosition.ToString();
this._ccdOne.Text = bb.clearestPosition.ToString();
}
});
}
DateTime logTime = DateTime.Now;
private void AddMessageInfo(string message)
{
lock (locker)
{
logTime = DateTime.Now;
message = $"{logTime.ToString("yyyy-MM-dd HH:mm:ss")}.{logTime.Millisecond}{message}";
Dispatcher.Invoke(() =>
{
vm.MessageInfoList.Add(message);
_messageList.ScrollIntoView(message);
});
}
}
private void AddPic(string fileName, int well, int focal)
{
Dispatcher.Invoke(() =>
{
if (!File.Exists(fileName))
{
AddMessageInfo($"图片不存在:{fileName}");
return;
}
string imageUrl = $"file:\\{fileName}";
var imageSource = AppData.Instance.ConvertHelper.StringToBitmapImage(imageUrl);
if (imageSource == null)
{
AddMessageInfo($"图片加载失败:{fileName}");
return;
}
Canvas canvas = new Canvas();
_warpPanelPictures.Children.Add(canvas);
TextBlock text = new TextBlock();
Image image = new Image();
canvas.Children.Add(image);
canvas.Children.Add(text);
canvas.Margin = new Thickness(20, 5, 20, 0);
canvas.Width = 300;
canvas.Height = 330;
text.Text = $"well{well} - {focal}";
text.FontSize = 22;
text.Foreground = new SolidColorBrush(Color.FromRgb(181, 184, 189));
Canvas.SetLeft(text, 80);
Canvas.SetTop(text, 302);
image.Width = 300;
image.Height = 300;
image.Source = imageSource;
image.Tag = imageUrl;
//image.MouseUp += (s, arg) =>
//{
// text.Foreground = new SolidColorBrush(Colors.Red);
// PhotoListWindow win2 = new PhotoListWindow(_warpPanelPictures.Children, image, text);
// win2.ShowDialog();
//};
});
}
///
/// 打开图像
///
private void OpenVideo()
{
try
{
if (isOpen)
{
AddMessageInfo($"图像已打开");
return;
}
IntPtr hwnd = ((System.Windows.Interop.HwndSource)PresentationSource.FromVisual(AppData.Instance.MainWindow)).Handle;
//var a = vm.camera.Usb2Start(hwnd, 328, 865, 800, 600);
var a = vm.StartPreview(hwnd, 328, 805, 800, 600);
AddMessageInfo($"图像打开结果:{a}[注:0表示成功]");
if (a == 0)
{
isOpen = true;
}
}
catch (Exception ex)
{
ExLog(ex, "OpenVideo");
AddMessageInfo($"图像打开异常:{ex.Message}");
}
}
private void CloseVideo()
{
try
{
if (!isOpen)
{
AddMessageInfo($"图像未打开,无需关闭");
return;
}
var a = vm.StopPreview();
AddMessageInfo($"图像关闭结果:{a}[注:0表示成功]");
if (a == 0)
{
isOpen = false;
}
}
catch (Exception ex)
{
ExLog(ex, "CloseVideo");
AddMessageInfo($"图像关闭异常:{ex.Message}");
}
}
private void ExLog(Exception ex, string name)
{
AppData.Instance.LogHelper.ExceptionLog(ex, $"HouseDebugPageView.{name}", LogEnum.RunException);
}
private void ShowMessageDefeat(string mess)
{
Dispatcher.Invoke(() =>
{
MessageBox.Show(mess);
});
//AddMessageInfo(mess);
//new MessagePrompt().ShowCenterOwnerDefeat(AppData.Instance.MainWindow, mess);
}
private void ShowMessage(string mess)
{
}
private void ShowMessageSuccess(string mess)
{
new MessagePrompt().ShowCenterOwnerSuccess(AppData.Instance.MainWindow, mess);
}
#endregion
private void Return_Click(object sender, RoutedEventArgs e)
{
CloseVideo();
vm.ComHouseUnit();
SettingPageView settingPageView = new SettingPageView();
AppData.Instance.MainWindow.LoadPage(settingPageView);
}
private void House_Checked(object sender, RoutedEventArgs e)
{
if (vm == null) return;
if (!(sender is RadioButtonNoFrame radioButtonNoFrame)) return;
vm.CurrentHouseId = int.Parse(radioButtonNoFrame.Tag.ToString());
vm.CurrentHouse = vm.HouseList.First(x => x.houseSn == vm.CurrentHouseId);
}
private void CCD_Checked(object sender, RoutedEventArgs e)
{
if (vm == null) return;
if (!(sender is RadioButtonNoFrame radioButtonNoFrame)) return;
string ccdidString = radioButtonNoFrame.Tag.ToString();
vm.CurrentCCDId = int.Parse(ccdidString);
this._ccdId_TextBlock.Text = ccdidString;
}
///
/// 初始化
///
///
///
private async void Start_Click(object sender, RoutedEventArgs e)
{
try
{
this._house_StackPanel.IsEnabled = false;
this._ccd_StackPanel.IsEnabled = false;
this._startButton.IsEnabled = false;
//await Task.Delay(3000 * 5);
//return;
await vm.ComHouseInit();
RefshInfo();
OpenVideo();
this._button1.IsEnabled = true;
this._button2.IsEnabled = true;
this._button3.IsEnabled = true;
this._button4.IsEnabled = true;
this._button5.IsEnabled = true;
this._button6.IsEnabled = true;
this._button7.IsEnabled = true;
this._button90.IsEnabled = true;
this._button100.IsEnabled = true;
this._stackPanel1.IsEnabled = true;
this._stackPanel2.IsEnabled = true;
this._stackPanel3.IsEnabled = true;
this._stackPanel4.IsEnabled = true;
}
catch (Exception ex)
{
ExLog(ex, "Start_Click");
}
}
///
/// 读E方
///
///
///
private void RedE_Click(object sender, RoutedEventArgs e)
{
}
///
/// 读温度
///
///
///
private void RedTem_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.RedTem();
});
}
///
/// 读压力
///
///
///
private void RedPre_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.RedPre();
});
}
///
/// 读舱门
///
///
///
private void RedDoor_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.RedDoor();
});
}
///
/// 开灯
///
///
///
private void OpenLed_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.OpenLed();
});
}
///
/// 关灯
///
///
///
private void CloseLed_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.CloseLed();
});
}
///
/// 卸载
///
///
///
private void End_Click(object sender, RoutedEventArgs e)
{
if (isOpen)
{
CloseVideo();
}
vm.IsStop = true;
vm.ComHouseUnit();
this._house_StackPanel.IsEnabled = true;
this._ccd_StackPanel.IsEnabled = true;
this._startButton.IsEnabled = true;
this._button1.IsEnabled = false;
this._button2.IsEnabled = false;
this._button3.IsEnabled = false;
this._button4.IsEnabled = false;
this._button5.IsEnabled = false;
this._button6.IsEnabled = false;
this._button7.IsEnabled = false;
this._button90.IsEnabled = false;
this._button100.IsEnabled = false;
this._stackPanel1.IsEnabled = false;
this._stackPanel2.IsEnabled = false;
this._stackPanel3.IsEnabled = false;
this._stackPanel4.IsEnabled = false;
}
///
/// 打开进气阀
///
///
///
private void OpenIntake_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.OpenIntake();
});
}
///
/// 关闭进气阀
///
///
///
private void CloseIntake_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.CloseIntake();
});
}
///
/// 打开排气阀
///
///
///
private void OpenExhaust_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.OpenExhaust();
});
}
///
/// 关闭排气阀
///
///
///
private void CloseExhaust_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.CloseExhaust();
});
}
private void Aeration_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.HouseAeration();
});
}
///
/// 写舱室进气阀时间
///
///
///
private void WriteOpenIntakeTime_Click(object sender, RoutedEventArgs e)
{
try
{
if (vm.CurrentHouse == null)
{
ShowMessageDefeat("未获取到对应的舱室信息");
return;
}
string timeString = this._openIntakeTime_TextBox.Text.Trim();
if (string.IsNullOrEmpty(timeString))
{
ShowMessageDefeat("请输入进气阀打开时间");
return;
}
if (int.TryParse(timeString, out int value) && value >= 0)
{
Task.Run(() =>
{
vm.WriteOpenIntakeTime(value);
if (vm.CurrentHouse != null)
{
vm.CurrentHouse.inletValveOpeningTime = value;
vm.SetHouseInfo();
}
});
}
else
{
ShowMessageDefeat("进气阀打开时间只能输入大于等于0数字");
return;
}
}
catch (Exception ex)
{
ExLog(ex, "WriteOpenIntakeTime_Click");
}
}
///
/// 写曝光时间
///
///
///
private void SetExposure_Click(object sender, RoutedEventArgs e)
{
try
{
if (vm.CurrentHouse == null)
{
ShowMessageDefeat("未获取到对应的舱室信息");
return;
}
if (int.TryParse(this._exposure_TextBox.Text.Trim(), out int newExposure) && newExposure >= 0)
{
vm.SetExposure(newExposure);
if (vm.CurrentHouse != null)
{
vm.CurrentHouse.ccdExposure = newExposure;
vm.SetHouseInfo();
}
return;
}
ShowMessageDefeat("曝光值只能输入大于等于0数字");
return;
}
catch (Exception ex)
{
ExLog(ex, "SetExposure_Click");
}
}
///
/// 水平电机复位
///
///
///
private void HorizontalMotorReset_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.HorizontalMotorReset();
RefshInfo();
});
}
///
/// 保存当前well水平电机位置
///
///
///
private void SaveWellHorizontalMotor_Click(object sender, RoutedEventArgs e)
{
if (vm.CurrentHouse == null)
{
ShowMessageDefeat("未获取到对应的舱室信息");
return;
}
Task.Run(() =>
{
try
{
vm.SaveWellHor();
if (!vm.SetWellMotorPosition())
{
ShowMessageDefeat("数据库保存失败");
return;
}
var aa = vm.houseWellSettingList.FirstOrDefault(x => x.houseSn == vm.CurrentHouseId && x.wellSn == vm.CurrentWell);
if (aa != null)
{
aa.horizontalMotorPosition = vm.CurrentHor;
Dispatcher.Invoke(() =>
{
this._well_TextBlock.Text = aa.horizontalMotorPosition.ToString();
});
}
else
{
ShowMessageDefeat("未获取到well位置");
return;
}
}
catch (Exception ex)
{
ExLog(ex, "SaveWellHorizontalMotor_Click");
}
});
}
///
/// 水平电机正向移动
///
///
///
private void HorizontalMotorForward_Click(object sender, RoutedEventArgs e)
{
string forwardString = this._horizontalMotorForward_TextBox.Text.Trim();
if (string.IsNullOrEmpty(forwardString))
{
MessageBox.Show("请输入正向移动脉冲");
return;
}
if (int.TryParse(forwardString, out int value))
{
Task.Run(() =>
{
vm.HorizontalMotorForward(value);
});
}
else
{
MessageBox.Show("正向移动脉冲只能输入数字");
return;
}
}
///
/// 水平电机反向运动
///
///
///
private void HorizontalMotorBackward_Click(object sender, RoutedEventArgs e)
{
string backwardString = this._horizontalMotorBackward_TextBox.Text.Trim();
if (string.IsNullOrEmpty(backwardString))
{
MessageBox.Show("请输入反向移动脉冲");
return;
}
if (int.TryParse(backwardString, out int value))
{
Task.Run(() =>
{
vm.HorizontalMotorBackward(value);
});
}
else
{
MessageBox.Show("反向移动脉冲只能输入数字");
return;
}
}
///
/// 水平电机移动到指定Well
///
///
///
private void HorizontalMotorToWell_Click(object sender, RoutedEventArgs e)
{
string wellString = this._horizontalMotorToWell_TextBox.Text.Trim();
if (string.IsNullOrEmpty(wellString))
{
ShowMessageDefeat("请输入目标well");
return;
}
if (int.TryParse(wellString, out int value) && value >= 1 && value <= 16)
{
Task.Run(() =>
{
vm.HorizontalMotorToWell(value);
RefshInfo();
});
}
else
{
ShowMessageDefeat("目标well只能输入1-16的数字");
return;
}
}
///
/// 下一well
///
///
///
private void HorizontalMotorNextWell_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.HorizontalMotorToWell(vm.CurrentWell + 1);
RefshInfo();
});
}
///
/// 垂直电机复位
///
///
///
private void VerticalMotorResetWait_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.VerticalMotorReset();
vm.CurrentFocal = 0;
});
}
///
/// 垂直电机正向移动
///
///
///
private void VerticalMotorForward_Click(object sender, RoutedEventArgs e)
{
string forwardString = this._verticalMotorForward_TextBox.Text.Trim();
if (string.IsNullOrEmpty(forwardString))
{
MessageBox.Show("请输入正向移动脉冲");
return;
}
if (int.TryParse(forwardString, out int value))
{
Task.Run(() =>
{
vm.VerticalMotorForward(value);
});
}
else
{
MessageBox.Show("正向移动脉冲只能输入数字");
return;
}
}
///
/// 垂直电机反向运动
///
///
///
private void VerticalMotorBackward_Click(object sender, RoutedEventArgs e)
{
string backwardString = this._verticalMotorBackward_TextBox.Text.Trim();
if (string.IsNullOrEmpty(backwardString))
{
MessageBox.Show("请输入反向移动脉冲");
return;
}
if (int.TryParse(backwardString, out int value))
{
Task.Run(() =>
{
vm.VerticalMotorBackward(value);
});
}
else
{
MessageBox.Show("反向移动脉冲只能输入数字");
return;
}
}
///
/// 垂直电机绝对运动
///
///
///
private void VerticalMotorAbsolute_Click(object sender, RoutedEventArgs e)
{
string absoluteString = this._verticalMotorAbsolute_TextBox.Text.Trim();
if (string.IsNullOrEmpty(absoluteString))
{
MessageBox.Show("请输入目标脉冲");
return;
}
if (int.TryParse(absoluteString, out int value) && value >= 0 && value <= vm.tLSetting.verticalMotorPulseMax)
{
Task.Run(() =>
{
vm.VerticalMotorAbsolute(value);
});
}
else
{
MessageBox.Show($"目标脉冲只能输入0-{vm.tLSetting.verticalMotorPulseMax}的数字");
return;
}
}
///
/// 保存垂直电机间隔脉冲
///
///
///
private void SaveVerSpacePulse_Click(object sender, RoutedEventArgs e)
{
try
{
if (vm.CurrentHouse == null)
{
ShowMessageDefeat("未获取到对应的舱室信息");
return;
}
if (int.TryParse(this._verticalMotorForward_TextBox.Text.Trim(), out int newValue) && newValue > 0 && newValue <= vm.tLSetting.verticalMotorPulseMax)
{
Task.Run(() =>
{
vm.WriteOVerSpace(newValue);
vm.CurrentHouse.verticalMotorSpacePulse = newValue;
vm.SetHouseInfo();
});
}
else
{
AddMessageInfo($"垂直电机间隔脉冲只能输入0-{vm.tLSetting.verticalMotorPulseMax}的数字");
}
}
catch (Exception ex)
{
AddMessageInfo($"保存垂直电机间隔脉冲异常:{ex.Message}");
ExLog(ex, "SaveVerSpacePulse_Click");
}
}
///
/// 清空
///
///
///
private void Clear_Click(object sender, RoutedEventArgs e)
{
vm.MessageInfoList.Clear();
this._warpPanelPictures.Children.Clear();
}
///
/// 一键电机准备
///
///
///
private void Motor_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.MototReady();
});
}
///
/// 单张抓拍
///
///
///
private void GetPic_Click(object sender, RoutedEventArgs e)
{
try
{
if (!isOpen)
{
AddMessageInfo("开启实时图像以后才可以拍照");
return;
}
if (vm.CurrentHouse == null)
{
AddMessageInfo("获取舱室信息失败");
return;
}
string path = AppData.Instance.LogHelper.GetDeBugDanZhangDirectory(vm.CurrentHouse.houseSn, vm.CurrentWell);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string fullName = $"{path}house{vm.CurrentHouse.houseSn}_{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-fff")}_{vm.CurrentHor}-{vm.CurrentVer}.jpg";
if (!vm.SavePic(fullName)) return;
AddPic(fullName, vm.CurrentWell, vm.CurrentFocal);
}
catch (Exception ex)
{
ExLog(ex, "GetPic_Click");
AddMessageInfo($"单张抓拍异常:{ex.Message}");
}
}
///
/// 水平抓拍
///
///
///
private void ShuiPingPic_Click(object sender, RoutedEventArgs e)
{
if (vm.CurrentHouse == null)
{
AddMessageInfo("获取舱室信息失败");
return;
}
if (!isOpen)
{
AddMessageInfo("开启实时图像以后才可以拍照");
return;
}
Task.Run(() =>
{
vm.ShuiPingZhuaPai();
});
}
///
/// 结束抓图
///
///
///
private void EndPic_Click(object sender, RoutedEventArgs e)
{
vm.IsStop = true;
}
///
/// 清晰图层抓图
///
///
///
private async void AutoFocus_Click(object sender, RoutedEventArgs e)
{
try
{
if (vm.CurrentHouse == null)
{
ShowMessageDefeat("获取舱室信息失败");
return;
}
if (int.TryParse(this._autoFocusNum_TextBox.Text.Trim(), out int autoFocusNum) && autoFocusNum > 0 && int.TryParse(this._autoFocus_TextBox.Text.Trim(), out int xun) && xun > 0)
{
this._auto_Button.IsEnabled = false;
await vm.AutoFocusPic(autoFocusNum, xun);
this._auto_Button.IsEnabled = true;
}
else
{
ShowMessageDefeat($"请输入正确的拍摄次数以及循环次数");
}
}
catch (Exception ex)
{
ExLog(ex, "AutoFocus_Click");
AddMessageInfo($"清晰图层抓图异常:{ex.Message}");
}
}
private void CloseVideo_Click(object sender, RoutedEventArgs e)
{
try
{
CloseVideo();
}
catch (Exception ex)
{
ExLog(ex, "CloseVideo_Click");
AddMessageInfo($"图像关闭异常:{ex.Message}");
}
}
///
/// M2-05 场景A 一键全自动标定(沙盒)。对选中 well(默认 16 well)逐个跑四步标定,
/// 合格绿/伪峰红实时显示,结果作出厂基准 scene=0 存档 + 写 calibration.json。
/// 硬件复用调试页已借用并打开的 comBin/camera(经适配器暴露为 HAL 接口),不二次 Open/Init。
///
private async void OneClickCalibrate_Click(object sender, RoutedEventArgs e)
{
try
{
if (vm.CurrentHouse == null)
{
ShowMessageDefeat("获取舱室信息失败,请先初始化舱室");
return;
}
if (vm.IsCalibrating)
{
AddMessageInfo("[一键标定]已在标定中");
return;
}
this._oneClickCalib_Button.IsEnabled = false;
try
{
// 沙盒默认全 16 well 逐个跑(如需勾选子集,传入选中 well 列表即可)。
await vm.OneClickCalibrate(null);
}
finally
{
this._oneClickCalib_Button.IsEnabled = true;
}
}
catch (Exception ex)
{
ExLog(ex, "OneClickCalibrate_Click");
AddMessageInfo($"一键标定异常:{ex.Message}");
}
}
/// M2-05 中止一键标定(当前 well 结束后停止,已完成结果保留)。
private void StopCalibrate_Click(object sender, RoutedEventArgs e)
{
try
{
vm.StopCalibrate();
}
catch (Exception ex)
{
ExLog(ex, "StopCalibrate_Click");
}
}
///
/// M2-07 载入选定 well 当前生效的拍摄层配置(well 级覆盖优先,空则显示继承的设备级值占位),
/// 回填三个手调框并触发一次预览。
///
private void LoadManualTune_Click(object sender, RoutedEventArgs e)
{
try
{
if (vm.CurrentHouse == null)
{
ShowMessageDefeat("获取舱室信息失败,请先初始化舱室");
return;
}
if (vm.ManualTuneWell < 1 || vm.ManualTuneWell > 16)
{
ShowMessageDefeat("well 只能为 1-16");
return;
}
vm.LoadManualLayerSetting(vm.ManualTuneWell);
}
catch (Exception ex)
{
ExLog(ex, "LoadManualTune_Click");
}
}
///
/// M2-07 实时预览:用该 well 标定 FocusZ + 当前手调值调 M2-02 ComputeLayerPositions 算各层 Z(关联 V-045)。
///
private void PreviewManualTune_Click(object sender, RoutedEventArgs e)
{
try
{
if (vm.CurrentHouse == null)
{
ShowMessageDefeat("获取舱室信息失败,请先初始化舱室");
return;
}
vm.PreviewManualLayers();
}
catch (Exception ex)
{
ExLog(ex, "PreviewManualTune_Click");
}
}
///
/// M2-07 存为该 well 默认:校验通过后写 house_well_setting well 级覆盖
/// (focus_layer_spacing_pulse/focus_layer_count + 复用 move_down_layer),留空继承设备级。
///
private void SaveManualTune_Click(object sender, RoutedEventArgs e)
{
try
{
if (vm.CurrentHouse == null)
{
ShowMessageDefeat("获取舱室信息失败,请先初始化舱室");
return;
}
if (vm.SaveManualLayerTune())
{
ShowMessageSuccess("手调拍摄层已存为该 well 默认");
}
else
{
ShowMessageDefeat("手调拍摄层保存失败(见日志,可能为非法值或接口失败)");
}
}
catch (Exception ex)
{
ExLog(ex, "SaveManualTune_Click");
}
}
private void OpenVideo_Click(object sender, RoutedEventArgs e)
{
try
{
OpenVideo();
}
catch (Exception ex)
{
ExLog(ex, "OpenVideo_Click");
AddMessageInfo($"图像打开异常:{ex.Message}");
}
}
///
/// 保存自动对焦起点
///
///
///
private void SaveAutoFocus_Click(object sender, RoutedEventArgs e)
{
try
{
if (vm.SetWellAutoFocus())
{
var bb = vm.ccdPhoto.FirstOrDefault(x => x.houseSn == vm.CurrentHouseId && x.wellSn == vm.CurrentWell);
if (bb != null) bb.autoFocusPosition = vm.CurrentVer;
this._autoFocus.Text = vm.CurrentVer.ToString();
AddMessageInfo($"自动对焦起点保存成功");
}
else
{
AddMessageInfo($"自动对焦起点保存失败");
}
}
catch (Exception ex)
{
ExLog(ex, "SaveAutoFocus_Click");
AddMessageInfo($"保存自动对焦起点异常:{ex.Message}");
}
}
private void _autoFocusNum_TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox passwordBox = sender as TextBox;
if (passwordBox == null) return;
string ss = passwordBox.Text.Trim();
if (string.IsNullOrEmpty(ss))
{
passwordBox.Background = (VisualBrush)this.FindResource("HelpBrush2");
}
else
{
passwordBox.Background = new SolidColorBrush(Colors.White);
}
}
private void _autoFocus_TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox passwordBox = sender as TextBox;
if (passwordBox == null) return;
string ss = passwordBox.Text.Trim();
if (string.IsNullOrEmpty(ss))
{
passwordBox.Background = (VisualBrush)this.FindResource("HelpBrush3");
}
else
{
passwordBox.Background = new SolidColorBrush(Colors.White);
}
}
private void Paiqi_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.HouseVent();
});
}
private void WriteOpenVentTime_Click(object sender, RoutedEventArgs e)
{
try
{
if (vm.CurrentHouse == null)
{
ShowMessageDefeat("未获取到对应的舱室信息");
return;
}
string timeString = this._openVentTime_TextBox.Text.Trim();
if (string.IsNullOrEmpty(timeString))
{
ShowMessageDefeat("请输入排气阀打开时间");
return;
}
if (int.TryParse(timeString, out int value) && value >= 0)
{
Task.Run(() =>
{
vm.WriteOpenVentTime(value);
//if (vm.CurrentHouse != null)
//{
// vm.CurrentHouse.inletValveOpeningTime = value;
// vm.SetHouseInfo();
//}
});
}
else
{
ShowMessageDefeat("排气阀打开时间只能输入大于等于0数字");
return;
}
}
catch (Exception ex)
{
ExLog(ex, "WriteOpenVentTime_Click");
}
}
private void ReadOpenVentTime_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
vm.RedVentTime();
});
}
}
}