diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/A8SDK.cs b/Windows/CS/Framework4.0/Toprie/Toprie/A8SDK.cs index 9096ad8..df57999 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/A8SDK.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/A8SDK.cs @@ -652,6 +652,18 @@ namespace JoyD.Windows.CS.Toprie v8Instance.SetImageMode(mode); } + // 获取视频模式 + public int GetVideoMode() + { + return v8Instance.GetVideoMode(); + } + + // 设置视频模式 + public void SetVideoMode(int mode) + { + v8Instance.SetVideoMode(mode); + } + // 获取图像数据 public byte[] GetImageData() { diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.Designer.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.Designer.cs index 7cba02f..12526d9 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.Designer.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.Designer.cs @@ -1,4 +1,4 @@ -namespace JoyD.Windows.CS.Toprie +namespace JoyD.Windows.CS.Toprie { partial class Camera { @@ -18,6 +18,14 @@ this.components = new System.ComponentModel.Container(); this.imageBox = new System.Windows.Forms.PictureBox(); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.imageModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.thermalModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.visibleModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fusionMode1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fusionMode2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fusionMode3ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fusionMode4ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fusionMode5ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.colorModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.whiteHotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.blackHotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -45,9 +53,73 @@ // contextMenuStrip1 // this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.imageModeToolStripMenuItem, this.colorModeToolStripMenuItem}); this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(161, 48); + this.contextMenuStrip1.Size = new System.Drawing.Size(161, 74); + // + // imageModeToolStripMenuItem + // + this.imageModeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.thermalModeToolStripMenuItem, + this.visibleModeToolStripMenuItem, + this.fusionMode1ToolStripMenuItem, + this.fusionMode2ToolStripMenuItem, + this.fusionMode3ToolStripMenuItem, + this.fusionMode4ToolStripMenuItem, + this.fusionMode5ToolStripMenuItem}); + this.imageModeToolStripMenuItem.Name = "imageModeToolStripMenuItem"; + this.imageModeToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.imageModeToolStripMenuItem.Text = "图像模式"; + // + // thermalModeToolStripMenuItem + // + this.thermalModeToolStripMenuItem.Name = "thermalModeToolStripMenuItem"; + this.thermalModeToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.thermalModeToolStripMenuItem.Text = "红外模式"; + this.thermalModeToolStripMenuItem.Click += new System.EventHandler(this.thermalModeToolStripMenuItem_Click); + // + // visibleModeToolStripMenuItem + // + this.visibleModeToolStripMenuItem.Name = "visibleModeToolStripMenuItem"; + this.visibleModeToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.visibleModeToolStripMenuItem.Text = "自然模式"; + this.visibleModeToolStripMenuItem.Click += new System.EventHandler(this.visibleModeToolStripMenuItem_Click); + // + // fusionMode1ToolStripMenuItem + // + this.fusionMode1ToolStripMenuItem.Name = "fusionMode1ToolStripMenuItem"; + this.fusionMode1ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.fusionMode1ToolStripMenuItem.Text = "融合模式1"; + this.fusionMode1ToolStripMenuItem.Click += new System.EventHandler(this.fusionMode1ToolStripMenuItem_Click); + // + // fusionMode2ToolStripMenuItem + // + this.fusionMode2ToolStripMenuItem.Name = "fusionMode2ToolStripMenuItem"; + this.fusionMode2ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.fusionMode2ToolStripMenuItem.Text = "融合模式2"; + this.fusionMode2ToolStripMenuItem.Click += new System.EventHandler(this.fusionMode2ToolStripMenuItem_Click); + // + // fusionMode3ToolStripMenuItem + // + this.fusionMode3ToolStripMenuItem.Name = "fusionMode3ToolStripMenuItem"; + this.fusionMode3ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.fusionMode3ToolStripMenuItem.Text = "融合模式3"; + this.fusionMode3ToolStripMenuItem.Click += new System.EventHandler(this.fusionMode3ToolStripMenuItem_Click); + // + // fusionMode4ToolStripMenuItem + // + this.fusionMode4ToolStripMenuItem.Name = "fusionMode4ToolStripMenuItem"; + this.fusionMode4ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.fusionMode4ToolStripMenuItem.Text = "融合模式4"; + this.fusionMode4ToolStripMenuItem.Click += new System.EventHandler(this.fusionMode4ToolStripMenuItem_Click); + // + // fusionMode5ToolStripMenuItem + // + this.fusionMode5ToolStripMenuItem.Name = "fusionMode5ToolStripMenuItem"; + this.fusionMode5ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.fusionMode5ToolStripMenuItem.Text = "融合模式5"; + this.fusionMode5ToolStripMenuItem.Click += new System.EventHandler(this.fusionMode5ToolStripMenuItem_Click); // // colorModeToolStripMenuItem // @@ -149,5 +221,13 @@ private System.Windows.Forms.ToolStripMenuItem ironGrayToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem redHotToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem rainbow2ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem imageModeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem thermalModeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem visibleModeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fusionMode1ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fusionMode2ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fusionMode3ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fusionMode4ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fusionMode5ToolStripMenuItem; } } diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs index 5fa9365..635c09b 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs @@ -977,7 +977,16 @@ namespace JoyD.Windows.CS.Toprie { try { - // 首先清除所有菜单项的选中状态 + // 清除视频模式菜单项的选中状态 + thermalModeToolStripMenuItem.Checked = false; + visibleModeToolStripMenuItem.Checked = false; + fusionMode1ToolStripMenuItem.Checked = false; + fusionMode2ToolStripMenuItem.Checked = false; + fusionMode3ToolStripMenuItem.Checked = false; + fusionMode4ToolStripMenuItem.Checked = false; + fusionMode5ToolStripMenuItem.Checked = false; + + // 清除色彩模式菜单项的选中状态 whiteHotToolStripMenuItem.Checked = false; blackHotToolStripMenuItem.Checked = false; ironRedToolStripMenuItem.Checked = false; @@ -1028,6 +1037,40 @@ namespace JoyD.Windows.CS.Toprie { Console.WriteLine("获取当前色彩模式失败: " + ex.Message); } + + // 更新视频模式菜单项的选中状态 + try + { + int currentMode = _deviceManager.GetCurrentVideoMode(); + switch (currentMode) + { + case 0: + thermalModeToolStripMenuItem.Checked = true; + break; + case 1: + visibleModeToolStripMenuItem.Checked = true; + break; + case 2: + fusionMode1ToolStripMenuItem.Checked = true; + break; + case 3: + fusionMode2ToolStripMenuItem.Checked = true; + break; + case 4: + fusionMode3ToolStripMenuItem.Checked = true; + break; + case 5: + fusionMode4ToolStripMenuItem.Checked = true; + break; + case 6: + fusionMode5ToolStripMenuItem.Checked = true; + break; + } + } + catch (Exception ex) + { + Console.WriteLine("获取当前视频模式失败: " + ex.Message); + } } } catch (Exception ex) @@ -1192,6 +1235,150 @@ namespace JoyD.Windows.CS.Toprie #endregion + #region 视频模式切换方法 + + /// + /// 红外模式 + /// + private void thermalModeToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + if (_deviceManager != null) + { + Console.WriteLine("切换到红外模式"); + _deviceManager.SetVideoMode(0); + } + } + catch (Exception ex) + { + Console.WriteLine("切换到红外模式失败: " + ex.Message); + ShowError("切换到红外模式失败"); + } + } + + /// + /// 自然模式 + /// + private void visibleModeToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + if (_deviceManager != null) + { + Console.WriteLine("切换到自然模式"); + _deviceManager.SetVideoMode(1); + } + } + catch (Exception ex) + { + Console.WriteLine("切换到自然模式失败: " + ex.Message); + ShowError("切换到自然模式失败"); + } + } + + /// + /// 融合模式1 + /// + private void fusionMode1ToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + if (_deviceManager != null) + { + Console.WriteLine("切换到融合模式1"); + _deviceManager.SetVideoMode(2); + } + } + catch (Exception ex) + { + Console.WriteLine("切换到融合模式1失败: " + ex.Message); + ShowError("切换到融合模式1失败"); + } + } + + /// + /// 融合模式2 + /// + private void fusionMode2ToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + if (_deviceManager != null) + { + Console.WriteLine("切换到融合模式2"); + _deviceManager.SetVideoMode(3); + } + } + catch (Exception ex) + { + Console.WriteLine("切换到融合模式2失败: " + ex.Message); + ShowError("切换到融合模式2失败"); + } + } + + /// + /// 融合模式3 + /// + private void fusionMode3ToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + if (_deviceManager != null) + { + Console.WriteLine("切换到融合模式3"); + _deviceManager.SetVideoMode(4); + } + } + catch (Exception ex) + { + Console.WriteLine("切换到融合模式3失败: " + ex.Message); + ShowError("切换到融合模式3失败"); + } + } + + /// + /// 融合模式4 + /// + private void fusionMode4ToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + if (_deviceManager != null) + { + Console.WriteLine("切换到融合模式4"); + _deviceManager.SetVideoMode(5); + } + } + catch (Exception ex) + { + Console.WriteLine("切换到融合模式4失败: " + ex.Message); + ShowError("切换到融合模式4失败"); + } + } + + /// + /// 融合模式5 + /// + private void fusionMode5ToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + if (_deviceManager != null) + { + Console.WriteLine("切换到融合模式5"); + _deviceManager.SetVideoMode(6); + } + } + catch (Exception ex) + { + Console.WriteLine("切换到融合模式5失败: " + ex.Message); + ShowError("切换到融合模式5失败"); + } + } + + #endregion + /// /// 清理资源 /// diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs index 3bbbb09..fb40335 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs @@ -2229,6 +2229,98 @@ namespace JoyD.Windows.CS.Toprie CurrentImageMode = mode; } + /// + /// 设置视频模式 + /// + /// 视频模式(0:红外,1:自然,2-6:融合模式1-5) + public void SetVideoMode(int videoMode) + { + // 验证参数范围 + if (videoMode < 0 || videoMode > 6) + { + throw new ArgumentOutOfRangeException("videoMode", "视频模式必须在0-6范围内"); + } + + // 调用SDK设置视频模式 + SendVideoModeCommand(videoMode); + } + + /// + /// 获取当前视频模式 + /// + /// 当前视频模式值(0-6) + public int GetCurrentVideoMode() + { + lock (_sdkOperationLock) + { + // 验证连接状态 + if (_connectionStatus != ConnectionStatus.Connected || _a8Sdk == null) + { + throw new InvalidOperationException("设备未连接"); + } + + // 调用SDK获取视频模式 + return _a8Sdk.GetVideoMode(); + } + } + + /// + /// 发送视频模式变更命令到设备 + /// + /// 视频模式值 + private void SendVideoModeCommand(int videoMode) + { + lock (_sdkOperationLock) + { + const int maxRetries = 3; + const int retryDelayMs = 100; + + for (int attempt = 0; attempt < maxRetries; attempt++) + { + try + { + // 检查对象状态和连接状态 + if (_a8Sdk == null || _connectionStatus != ConnectionStatus.Connected) + { + Log($"视频模式切换失败: {(attempt > 0 ? "重试中" : "")}SDK实例为空或设备未连接"); + Thread.Sleep(retryDelayMs); + continue; + } + + // 调用SDK设置视频模式 + _a8Sdk.SetVideoMode(videoMode); + + // 短暂延迟,确保设置生效 + Thread.Sleep(50); + + // 简单验证:尝试读取视频模式确认设置成功 + int currentMode = _a8Sdk.GetVideoMode(); + if (currentMode == videoMode) + { + Log($"视频模式切换成功,当前模式: {videoMode}"); + return; + } + else + { + Log($"视频模式验证失败,期望: {videoMode},实际: {currentMode}"); + } + } + catch (Exception ex) + { + Log($"视频模式切换异常 (尝试 {attempt + 1}/{maxRetries}): {ex.Message}"); + } + + // 重试前短暂延迟 + if (attempt < maxRetries - 1) + { + Thread.Sleep(retryDelayMs); + } + } + + throw new Exception($"视频模式切换失败,已重试 {maxRetries} 次"); + } + } + // 用于保护SDK操作的线程锁 private readonly object _sdkOperationLock = new object(); diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs b/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs index 076db3b..3d9a0e3 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs @@ -35,6 +35,7 @@ namespace JoyD.Windows.CS.Toprie SET_AUTO_SHUTTER = 1, // 保持为1,不要与其他命令冲突 SET_MIRROR_VIDEO = 3, SET_VIDEO_MODE = 4, + GET_VIDEO_MODE = 28, SET_AREA_POS = 5, SET_SPOT_POS = 6, SET_LINE_POS = 7, @@ -2247,6 +2248,33 @@ namespace JoyD.Windows.CS.Toprie } } + // 获取视频模式 + public int GetVideoMode() + { + try + { + return Video_mode; + } + catch (Exception ex) + { + Console.WriteLine($"获取视频模式失败: {ex.Message}"); + return 0; + } + } + + // 设置视频模式 + public void SetVideoMode(int mode) + { + try + { + Video_mode = mode; + } + catch (Exception ex) + { + Console.WriteLine($"设置视频模式失败: {ex.Message}"); + } + } + // 新增方法:获取图像数据 public byte[] GetImageData() {