using Haukcode.sACN; using LibVLCSharp.Shared; using System.Net; using XboxController; namespace robospot_camera_finder { public partial class StreamViewer : Form { public LibVLC _libVLC; public MediaPlayer _mp; private static readonly Guid acnSourceId = new Guid("{B32625A6-C280-4389-BD25-E0D13F5B50E0}"); private static readonly string acnSourceName = "RoboSpotCamViewer"; static SACNClient sendClient = new SACNClient(senderId: acnSourceId, senderName: acnSourceName, localAddress: SACNCommon.GetFirstBindAddress().IPAddress); string cam_ip = ""; int max_zoom_pulse = 9999; int min_zoom_pulse = 10; byte[] dmx_universe = new byte[512]; Xbox360Controller controller = new Xbox360Controller(); bool preset_rec_mode = false; bool preset_clear_mode = false; bool preset1_exists = false; int preset1_pan; int preset1_tilt; int preset1_zoom; bool preset2_exists = false; int preset2_pan; int preset2_tilt; int preset2_zoom; bool preset3_exists = false; int preset3_pan; int preset3_tilt; int preset3_zoom; bool preset4_exists = false; int preset4_pan; int preset4_tilt; int preset4_zoom; public StreamViewer(string name, string ip, MainForm.Camera camera, MainForm mainForm) { InitializeComponent(); _libVLC = new LibVLC(); _mp = new MediaPlayer(_libVLC); splitContainerMain.Panel2Collapsed = true; cam_ip = ip; this.Text = name; string rtsp_link = "rtsp://" + ip + "/profile2/media.smp"; updateZoomSlider(); tbSerial.Text = camera.camera_serial; tbRtspLink.Text = rtsp_link; videoView.MediaPlayer = _mp; var media = new Media(_libVLC, new Uri(rtsp_link)); media.AddOption(":network-caching=25"); _mp.Play(media); media.Dispose(); } private void updateZoomSlider() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + cam_ip + "/stw-cgi/ptzcontrol.cgi?msubmenu=query&action=view&Query=Zoom"); request.Credentials = new NetworkCredential(MainForm.cam_username, MainForm.cam_password); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string text; using (var sr = new StreamReader(response.GetResponseStream())) { text = sr.ReadToEnd(); } string[] resp_lines = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); string zoom_value = resp_lines[1].Substring(resp_lines[1].LastIndexOf('=') + 1); tbZoom.Value = int.Parse(zoom_value); } private void sendZoomValue(string zoom_pulse) { // clamp values to allowed range if (int.Parse(zoom_pulse) < min_zoom_pulse) { zoom_pulse = min_zoom_pulse.ToString(); } if (int.Parse(zoom_pulse) > max_zoom_pulse) { zoom_pulse = max_zoom_pulse.ToString(); } HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + cam_ip + "/stw-cgi/ptzcontrol.cgi?msubmenu=absolute&action=control&ZoomPulse=" + zoom_pulse); request.Credentials = new NetworkCredential(MainForm.cam_username, MainForm.cam_password); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); } private void sendZoomValueManual(string zoom_value) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + cam_ip + "/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&NormalizedSpeed=True&action=control&Channel=0&Zoom=" + zoom_value); request.Credentials = new NetworkCredential(MainForm.cam_username, MainForm.cam_password); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); } private void StreamViewer_FormClosed(object sender, FormClosedEventArgs e) { _mp.Stop(); _mp.Dispose(); _libVLC.Dispose(); sendClient.Dispose(); } private void tbZoom_KeyUp(object sender, KeyEventArgs e) { sendZoomValue(tbZoom.Value.ToString()); } private void tbZoom_MouseUp(object sender, MouseEventArgs e) { sendZoomValue(tbZoom.Value.ToString()); } private void timerUpdateZoom_Tick(object sender, EventArgs e) { updateZoomSlider(); } private void btnZoomMax_Click(object sender, EventArgs e) { tbZoom.Value = max_zoom_pulse; sendZoomValue(tbZoom.Value.ToString()); } private void btnZoomMin_Click(object sender, EventArgs e) { tbZoom.Value = min_zoom_pulse; sendZoomValue(tbZoom.Value.ToString()); } private void timerDMX_Tick(object sender, EventArgs e) { controller.update(); if (!controller.connected) { cbEnableXboxCtrl.Checked = false; cbEnableXboxCtrl.Enabled = false; } else { cbEnableXboxCtrl.Enabled = true; } if (cbEnableXboxCtrl.Checked) { Point ls = controller.leftThumb; Point rs = controller.rightThumb; bool fast_pt = controller.buttons.LeftStick; if ((tbPan.Value + ls.X) < 0) { tbPan.Value = 0; } else if ((tbPan.Value + ls.X) > 65535) { tbPan.Value = 65535; } else { if (fast_pt) { tbPan.Value += (ls.X) * 5; } else { tbPan.Value += ls.X; } } if ((tbTilt.Value + ls.Y) < 0) { tbTilt.Value = 0; } else if ((tbTilt.Value + ls.Y) > 65535) { tbTilt.Value = 65535; } else { if (fast_pt) { tbTilt.Value += (ls.Y) * 5; } else { tbTilt.Value += ls.Y; } } sendZoomValueManual(rs.Y.ToString()); if (controller.buttons.LB) { tbZoom.Value = min_zoom_pulse; sendZoomValue(tbZoom.Value.ToString()); } if (controller.buttons.RB) { tbZoom.Value = max_zoom_pulse; sendZoomValue(tbZoom.Value.ToString()); } } byte[] pan = BitConverter.GetBytes(tbPan.Value); byte[] tilt = BitConverter.GetBytes(tbTilt.Value); int dmx_addr = int.Parse(numDMXAddr.Value.ToString()); dmx_universe[dmx_addr - 1] = pan[1]; dmx_universe[dmx_addr] = pan[0]; dmx_universe[dmx_addr + 1] = tilt[1]; dmx_universe[dmx_addr + 2] = tilt[0]; sendClient.SendMulticast(Convert.ToUInt16(numUniv.Value.ToString()), dmx_universe); } private void numDMXAddr_ValueChanged(object sender, EventArgs e) { tbPan.Value = 32767; tbTilt.Value = 32767; for (int i = 0; i < dmx_universe.Length; i++) { dmx_universe[i] = 0; } } private void cbEnableSACN_CheckedChanged(object sender, EventArgs e) { if (cbEnableSACN.Checked) { timerDMX.Start(); tbPan.Enabled = true; tbTilt.Enabled = true; numDMXAddr.Enabled = true; numUniv.Enabled = true; btnPreset1.Enabled = true; btnPreset2.Enabled = true; btnPreset3.Enabled = true; btnPreset4.Enabled = true; btnPresetClr.Enabled = true; btnPresetRec.Enabled = true; } else { timerDMX.Stop(); tbPan.Enabled = false; tbTilt.Enabled = false; numDMXAddr.Enabled = false; numUniv.Enabled = false; cbEnableXboxCtrl.Checked = false; cbEnableXboxCtrl.Enabled = false; btnPreset1.Enabled = false; btnPreset2.Enabled = false; btnPreset3.Enabled = false; btnPreset4.Enabled = false; btnPresetClr.Enabled = false; btnPresetRec.Enabled = false; } } private void btnSidePanel_Click(object sender, EventArgs e) { if (splitContainerMain.Panel2Collapsed) { splitContainerMain.Panel2Collapsed = false; } else { splitContainerMain.Panel2Collapsed = true; } } private void btnPresetRec_Click(object sender, EventArgs e) { rec_mode_toggle(); } private void rec_mode_toggle() { if (preset_clear_mode) { preset_clear_mode = false; btnPresetClr.ForeColor = default(Color); } if (preset_rec_mode) { preset_rec_mode = false; btnPresetRec.ForeColor = default(Color); } else { preset_rec_mode = true; btnPresetRec.ForeColor = Color.Red; } } private void btnPresetClr_Click(object sender, EventArgs e) { clear_mode_toggle(); } private void clear_mode_toggle() { if (preset_rec_mode) { preset_rec_mode = false; btnPresetRec.ForeColor = default(Color); } if (preset_clear_mode) { preset_clear_mode = false; btnPresetClr.ForeColor = default(Color); } else { preset_clear_mode = true; btnPresetClr.ForeColor = Color.Red; } } private void btnPreset1_Click(object sender, EventArgs e) { if (preset_rec_mode) { preset1_exists = true; preset1_pan = tbPan.Value; preset1_tilt = tbTilt.Value; preset1_zoom = tbZoom.Value; btnPreset1.ForeColor = Color.Blue; rec_mode_toggle(); } else if (preset_clear_mode) { preset1_exists = false; preset1_pan = 0; preset1_tilt = 0; preset1_zoom = 0; btnPreset1.ForeColor = default(Color); clear_mode_toggle(); } else if (preset1_exists) { tbPan.Value = preset1_pan; tbTilt.Value = preset1_tilt; tbZoom.Value = preset1_zoom; sendZoomValue(tbZoom.Value.ToString()); } } private void btnPreset2_Click(object sender, EventArgs e) { if (preset_rec_mode) { preset2_exists = true; preset2_pan = tbPan.Value; preset2_tilt = tbTilt.Value; preset2_zoom = tbZoom.Value; btnPreset2.ForeColor = Color.Blue; rec_mode_toggle(); } else if (preset_clear_mode) { preset2_exists = false; preset2_pan = 0; preset2_tilt = 0; preset2_zoom = 0; btnPreset2.ForeColor = default(Color); clear_mode_toggle(); } else if (preset2_exists) { tbPan.Value = preset2_pan; tbTilt.Value = preset2_tilt; tbZoom.Value = preset2_zoom; sendZoomValue(tbZoom.Value.ToString()); } } private void btnPreset3_Click(object sender, EventArgs e) { if (preset_rec_mode) { preset3_exists = true; preset3_pan = tbPan.Value; preset3_tilt = tbTilt.Value; preset3_zoom = tbZoom.Value; btnPreset3.ForeColor = Color.Blue; rec_mode_toggle(); } else if (preset_clear_mode) { preset3_exists = false; preset3_pan = 0; preset3_tilt = 0; preset3_zoom = 0; btnPreset3.ForeColor = default(Color); clear_mode_toggle(); } else if (preset3_exists) { tbPan.Value = preset3_pan; tbTilt.Value = preset3_tilt; tbZoom.Value = preset3_zoom; sendZoomValue(tbZoom.Value.ToString()); } } private void btnPreset4_Click(object sender, EventArgs e) { if (preset_rec_mode) { preset4_exists = true; preset4_pan = tbPan.Value; preset4_tilt = tbTilt.Value; preset4_zoom = tbZoom.Value; btnPreset4.ForeColor = Color.Blue; rec_mode_toggle(); } else if (preset_clear_mode) { preset4_exists = false; preset4_pan = 0; preset4_tilt = 0; preset4_zoom = 0; btnPreset4.ForeColor = default(Color); clear_mode_toggle(); } else if (preset4_exists) { tbPan.Value = preset4_pan; tbTilt.Value = preset4_tilt; tbZoom.Value = preset4_zoom; sendZoomValue(tbZoom.Value.ToString()); } } } }