添加1x和6x按钮功能

This commit is contained in:
uu
2025-06-24 19:40:32 +08:00
parent 0ca4ecf5fc
commit c62f21a4f8
8 changed files with 249 additions and 28 deletions

View File

@@ -187,7 +187,6 @@
this.lbl_Refresh_ID = new System.Windows.Forms.Label();
this.tim_IO_Refresh = new System.Windows.Forms.Timer(this.components);
this.rit_Coord = new System.Windows.Forms.RichTextBox();
this.test = new System.Windows.Forms.TabPage();
this.tac_MainForm.SuspendLayout();
this.tap_Axis.SuspendLayout();
this.grb_R.SuspendLayout();
@@ -236,7 +235,6 @@
this.tac_MainForm.Controls.Add(this.tap_Cam);
this.tac_MainForm.Controls.Add(this.tap_tempCtrl);
this.tac_MainForm.Controls.Add(this.tabPage1);
this.tac_MainForm.Controls.Add(this.test);
this.tac_MainForm.Dock = System.Windows.Forms.DockStyle.Fill;
this.tac_MainForm.Location = new System.Drawing.Point(0, 0);
this.tac_MainForm.Name = "tac_MainForm";
@@ -1774,10 +1772,10 @@
//
// cam_zoom
//
this.cam_zoom.Location = new System.Drawing.Point(527, 29);
this.cam_zoom.Location = new System.Drawing.Point(289, 39);
this.cam_zoom.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.cam_zoom.Name = "cam_zoom";
this.cam_zoom.Size = new System.Drawing.Size(245, 162);
this.cam_zoom.Size = new System.Drawing.Size(481, 390);
this.cam_zoom.TabIndex = 6;
this.cam_zoom.TabStop = false;
this.cam_zoom.Click += new System.EventHandler(this.cam_zoom_Click);
@@ -1948,16 +1946,6 @@
this.rit_Coord.Text = "";
this.rit_Coord.TextChanged += new System.EventHandler(this.rit_Coord_TextChanged);
//
// test
//
this.test.Location = new System.Drawing.Point(4, 22);
this.test.Name = "test";
this.test.Padding = new System.Windows.Forms.Padding(3);
this.test.Size = new System.Drawing.Size(807, 502);
this.test.TabIndex = 7;
this.test.Text = "tabPage2";
this.test.UseVisualStyleBackColor = true;
//
// ShowForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
@@ -2183,7 +2171,6 @@
private System.Windows.Forms.PictureBox cam_zoom;
private System.Windows.Forms.Label label33;
private System.Windows.Forms.Label label32;
private System.Windows.Forms.TabPage test;
}
}

View File

@@ -1476,7 +1476,7 @@ namespace HitBotCSharpDemo
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
tempControl.OnFormClosing();
//zoomControl?.OnFormClosing();
zoomControl?.OnFormClosing();
}
private void groupBox1_Enter(object sender, EventArgs e)
@@ -1657,26 +1657,42 @@ namespace HitBotCSharpDemo
button10.Enabled = false;
button12.Enabled = false;
}
// 启用变焦按钮
//public void EnableZoomButtons()
//{
// if (isZoomPortOpen && !string.IsNullOrEmpty(label30.Text))
// {
// button6.Enabled = true;
// button8.Enabled = true;
// button10.Enabled = true;
// button12.Enabled = true;
// }
//}
// 添加运动完成后启用按钮的方法
public void EnableZoomButtonsAfterMove()
{
if (isZoomPortOpen && zoomControl.IsSerialPortOpen())
{
button6.Enabled = true;
button8.Enabled = true;
button10.Enabled = true;
button12.Enabled = true;
}
}
private void button12_Click(object sender, EventArgs e)
{
// 检查串口是否打开
if (!isZoomPortOpen || !zoomControl.IsSerialPortOpen())
{
MessageBox.Show("串口未打开,无法移动镜头");
return;
}
// 移动到脉冲为9的位置
zoomControl.MoveTo(9);
}
private void button10_Click(object sender, EventArgs e)
{
// 检查串口是否打开
if (!isZoomPortOpen || !zoomControl.IsSerialPortOpen())
{
MessageBox.Show("串口未打开,无法移动镜头");
return;
}
// 移动到脉冲为16498的位置
zoomControl.MoveTo(16498);
}
}

View File

@@ -21,6 +21,7 @@ namespace HitBotCSharpDemo
[System.Runtime.InteropServices.DllImport("PMSOpticalDlld.dll",
CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)]
private static extern bool PMSOptical_Close(ref IntPtr pHandle);
[System.Runtime.InteropServices.DllImport("PMSOpticalDlld.dll",
CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)]
private static extern bool PMSOptical_IsOpened(IntPtr pHandle, out bool bIsOpened);
@@ -29,12 +30,21 @@ namespace HitBotCSharpDemo
CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)]
private static extern bool PMSOptical_GetPos(IntPtr pHandle, out int nCurrentPulse);
//获取设备运动状态
[System.Runtime.InteropServices.DllImport("PMSOpticalDlld.dll",
CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)]
private static extern bool PMSOptical_GetStatus(IntPtr pHandle, out int status);
//绝对运动至指定脉冲位置
[System.Runtime.InteropServices.DllImport("PMSOpticalDlld.dll",
CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)]
private static extern bool PMSOptical_MoveTo(IntPtr pHandle, int nPulse);
private IntPtr deviceHandle = IntPtr.Zero;
private SerialPort serialPort;
private ShowForm parentForm;
private StringBuilder receiveBuffer = new StringBuilder();
private ZoomMoveController moveController;
public ZoomControl(ShowForm form)
{
parentForm = form;
@@ -132,6 +142,8 @@ namespace HitBotCSharpDemo
if (bIsOpened)
{
// 关闭设备
moveController?.Dispose();
moveController = null;
PMSOptical_Close(ref deviceHandle);
deviceHandle = IntPtr.Zero;
UpdateUIStatus(false, button, comboBox);
@@ -152,6 +164,7 @@ namespace HitBotCSharpDemo
if (deviceHandle != IntPtr.Zero)
{
// 再次验证设备是否真正打开
moveController = new ZoomMoveController(deviceHandle, parentForm);
bool finalCheck = PMSOptical_IsOpened(deviceHandle, out bIsOpened);
if (finalCheck && bIsOpened)
{
@@ -300,5 +313,210 @@ namespace HitBotCSharpDemo
}
return false;
}
public void OnFormClosing()
{
try
{
moveController?.Dispose();
if (deviceHandle != IntPtr.Zero)
{
PMSOptical_Close(ref deviceHandle);
deviceHandle = IntPtr.Zero;
}
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Close();
}
}
catch (Exception ex)
{
Console.WriteLine($"关闭变焦控制时发生错误: {ex.Message}");
}
}
public void MoveTo(int targetPulse)
{
if (moveController == null && deviceHandle != IntPtr.Zero)
{
moveController = new ZoomMoveController(deviceHandle, parentForm);
}
moveController?.MoveTo(targetPulse);
}
public class ZoomMoveController
{
private IntPtr deviceHandle;
private ShowForm parentForm;
private System.Threading.Timer statusTimer;
private bool isMoving = false;
private object moveLock = new object();
public ZoomMoveController(IntPtr handle, ShowForm form)
{
deviceHandle = handle;
parentForm = form;
}
public void MoveTo(int targetPulse)
{
lock (moveLock)
{
if (deviceHandle == IntPtr.Zero)
{
MessageBox.Show("设备未连接", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// 获取当前脉冲位置
int currentPulse;
bool getCurrentResult = PMSOptical_GetPos(deviceHandle, out currentPulse);
if (!getCurrentResult)
{
MessageBox.Show("获取当前位置失败", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// 如果当前位置已经是目标位置,不执行移动
if (currentPulse == targetPulse)
{
return;
}
try
{
// 禁用按钮
parentForm.DisableZoomButtons();
// 开始移动
int pulseToMove = targetPulse;
bool moveResult = PMSOptical_MoveTo(deviceHandle,pulseToMove);
if (moveResult)
{
isMoving = true;
// 启动状态监控定时器每500ms检查一次
StartStatusMonitoring();
}
else
{
MessageBox.Show("移动命令发送失败", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
// 重新启用按钮
parentForm.EnableZoomButtonsAfterMove();
}
}
catch (Exception ex)
{
MessageBox.Show($"移动时发生错误: {ex.Message}", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
// 重新启用按钮
parentForm.EnableZoomButtonsAfterMove();
}
}
}
private void StartStatusMonitoring()
{
// 如果已有定时器在运行,先停止
statusTimer?.Dispose();
// 创建新的定时器每500ms检查一次运动状态
statusTimer = new System.Threading.Timer(CheckMovementStatus, null, 500, 500);
}
private void CheckMovementStatus(object state)
{
try
{
if (deviceHandle == IntPtr.Zero || !isMoving)
{
StopStatusMonitoring();
return;
}
int status;
bool result = PMSOptical_GetStatus(deviceHandle, out status);
if (result)
{
// 根据API文档返回值 0为正在变焦1为空闲状态2为错误状态
if (status == 1) // 空闲状态,移动完成
{
isMoving = false;
StopStatusMonitoring();
// 在UI线程中启用按钮
parentForm.Invoke(new Action(() =>
{
parentForm.EnableZoomButtonsAfterMove();
// 通过父窗体的公共方法更新当前脉冲显示
UpdateCurrentPulseAfterMove();
}));
}
else if (status == 2) // 错误状态
{
isMoving = false;
StopStatusMonitoring();
parentForm.Invoke(new Action(() =>
{
MessageBox.Show("镜头移动过程中发生错误", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
parentForm.EnableZoomButtonsAfterMove();
}));
}
// status == 0 表示正在移动,继续监控
}
else
{
// 查询状态失败
isMoving = false;
StopStatusMonitoring();
parentForm.Invoke(new Action(() =>
{
MessageBox.Show("查询运动状态失败", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
parentForm.EnableZoomButtonsAfterMove();
}));
}
}
catch (Exception ex)
{
isMoving = false;
StopStatusMonitoring();
parentForm.Invoke(new Action(() =>
{
MessageBox.Show($"监控运动状态时发生错误: {ex.Message}", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
parentForm.EnableZoomButtonsAfterMove();
}));
}
}
private void UpdateCurrentPulseAfterMove()
{
try
{
int currentPulse;
bool result = PMSOptical_GetPos(deviceHandle, out currentPulse);
if (result)
{
// 直接更新显示
parentForm.UpdateCurrentPulseDisplay(currentPulse.ToString());
}
}
catch (Exception ex)
{
Console.WriteLine($"更新当前脉冲显示时发生错误: {ex.Message}");
}
}
private void StopStatusMonitoring()
{
statusTimer?.Dispose();
statusTimer = null;
}
public void Dispose()
{
StopStatusMonitoring();
}
}
}
}