463 lines
14 KiB
C#
463 lines
14 KiB
C#
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;
|
|
|
|
updateZoomSlider();
|
|
|
|
tbSerial.Text = camera.camera_serial;
|
|
|
|
videoView.MediaPlayer = _mp;
|
|
var media = new Media(_libVLC, new Uri("rtsp://" + ip + "/profile2/media.smp"));
|
|
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());
|
|
}
|
|
}
|
|
}
|
|
}
|