Compare commits

...

3 Commits

Author SHA1 Message Date
de4d535edc about menu 2025-06-01 12:20:14 +02:00
c0f6277265 on demand discovery 2025-06-01 12:07:19 +02:00
606b92fd32 comments & typos 2025-06-01 12:06:47 +02:00
4 changed files with 136 additions and 111 deletions

77
MainForm.Designer.cs generated
View File

@@ -33,26 +33,26 @@
statusStripMain = new StatusStrip();
toolStripStatusLabel = new ToolStripStatusLabel();
toolStripStatusDisco = new ToolStripStatusLabel();
menuStrip1 = new MenuStrip();
menuStrip = new MenuStrip();
discoveryToolStripMenuItem = new ToolStripMenuItem();
discoverToolStripMenuItem = new ToolStripMenuItem();
toolStripSeparator2 = new ToolStripSeparator();
manualAddToolStripMenuItem = new ToolStripMenuItem();
toolStripSeparator1 = new ToolStripSeparator();
saveToolStripMenuItem = new ToolStripMenuItem();
loadToolStripMenuItem = new ToolStripMenuItem();
toolStripSeparator2 = new ToolStripSeparator();
discoverToolStripMenuItem = new ToolStripMenuItem();
aboutStripMenuItem = new ToolStripMenuItem();
statusStripMain.SuspendLayout();
menuStrip1.SuspendLayout();
menuStrip.SuspendLayout();
SuspendLayout();
//
// lbMain
//
lbMain.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
lbMain.FormattingEnabled = true;
lbMain.ItemHeight = 15;
lbMain.Location = new Point(12, 23);
lbMain.Location = new Point(12, 38);
lbMain.Name = "lbMain";
lbMain.Size = new Size(776, 394);
lbMain.Size = new Size(776, 379);
lbMain.TabIndex = 0;
lbMain.MouseDoubleClick += lbMain_MouseDoubleClick;
//
@@ -73,17 +73,16 @@
// toolStripStatusDisco
//
toolStripStatusDisco.Name = "toolStripStatusDisco";
toolStripStatusDisco.Size = new Size(111, 17);
toolStripStatusDisco.Text = "";
toolStripStatusDisco.Size = new Size(0, 17);
//
// menuStrip1
// menuStrip
//
menuStrip1.Items.AddRange(new ToolStripItem[] { discoveryToolStripMenuItem });
menuStrip1.Location = new Point(0, 0);
menuStrip1.Name = "menuStrip1";
menuStrip1.Size = new Size(800, 24);
menuStrip1.TabIndex = 2;
menuStrip1.Text = "menuStrip1";
menuStrip.Items.AddRange(new ToolStripItem[] { discoveryToolStripMenuItem, aboutStripMenuItem });
menuStrip.Location = new Point(0, 0);
menuStrip.Name = "menuStrip";
menuStrip.Size = new Size(800, 24);
menuStrip.TabIndex = 2;
menuStrip.Text = "menuStrip1";
//
// discoveryToolStripMenuItem
//
@@ -92,42 +91,51 @@
discoveryToolStripMenuItem.Size = new Size(70, 20);
discoveryToolStripMenuItem.Text = "Discovery";
//
// discoverToolStripMenuItem
//
discoverToolStripMenuItem.Name = "discoverToolStripMenuItem";
discoverToolStripMenuItem.Size = new Size(166, 22);
discoverToolStripMenuItem.Text = "Discover cameras";
discoverToolStripMenuItem.Click += discoverToolStripMenuItem_Click;
//
// toolStripSeparator2
//
toolStripSeparator2.Name = "toolStripSeparator2";
toolStripSeparator2.Size = new Size(163, 6);
//
// manualAddToolStripMenuItem
//
manualAddToolStripMenuItem.Name = "manualAddToolStripMenuItem";
manualAddToolStripMenuItem.Size = new Size(180, 22);
manualAddToolStripMenuItem.Size = new Size(166, 22);
manualAddToolStripMenuItem.Text = "Add manually";
manualAddToolStripMenuItem.Click += manualAddToolStripMenuItem_Click;
//
// toolStripSeparator1
//
toolStripSeparator1.Name = "toolStripSeparator1";
toolStripSeparator1.Size = new Size(177, 6);
toolStripSeparator1.Size = new Size(163, 6);
//
// saveToolStripMenuItem
//
saveToolStripMenuItem.Name = "saveToolStripMenuItem";
saveToolStripMenuItem.Size = new Size(180, 22);
saveToolStripMenuItem.Size = new Size(166, 22);
saveToolStripMenuItem.Text = "Save";
saveToolStripMenuItem.Click += saveToolStripMenuItem_Click;
//
// loadToolStripMenuItem
//
loadToolStripMenuItem.Name = "loadToolStripMenuItem";
loadToolStripMenuItem.Size = new Size(180, 22);
loadToolStripMenuItem.Size = new Size(166, 22);
loadToolStripMenuItem.Text = "Load";
loadToolStripMenuItem.Click += loadToolStripMenuItem_Click;
//
// toolStripSeparator2
// aboutStripMenuItem
//
toolStripSeparator2.Name = "toolStripSeparator2";
toolStripSeparator2.Size = new Size(177, 6);
//
// discoverToolStripMenuItem
//
discoverToolStripMenuItem.Name = "discoverToolStripMenuItem";
discoverToolStripMenuItem.Size = new Size(180, 22);
discoverToolStripMenuItem.Text = "Discover cameras";
aboutStripMenuItem.Alignment = ToolStripItemAlignment.Right;
aboutStripMenuItem.Name = "aboutStripMenuItem";
aboutStripMenuItem.Size = new Size(52, 20);
aboutStripMenuItem.Text = "About";
aboutStripMenuItem.Click += aboutStripMenuItem_Click;
//
// MainForm
//
@@ -135,16 +143,16 @@
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(statusStripMain);
Controls.Add(menuStrip1);
Controls.Add(menuStrip);
Controls.Add(lbMain);
Icon = (Icon)resources.GetObject("$this.Icon");
MainMenuStrip = menuStrip1;
MainMenuStrip = menuStrip;
Name = "MainForm";
Text = "RoboSpot MotionCamera finder";
statusStripMain.ResumeLayout(false);
statusStripMain.PerformLayout();
menuStrip1.ResumeLayout(false);
menuStrip1.PerformLayout();
menuStrip.ResumeLayout(false);
menuStrip.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
@@ -154,7 +162,7 @@
private ListBox lbMain;
private StatusStrip statusStripMain;
private ToolStripStatusLabel toolStripStatusLabel;
private MenuStrip menuStrip1;
private MenuStrip menuStrip;
private ToolStripMenuItem discoveryToolStripMenuItem;
private ToolStripMenuItem saveToolStripMenuItem;
private ToolStripMenuItem loadToolStripMenuItem;
@@ -163,5 +171,6 @@
private ToolStripMenuItem manualAddToolStripMenuItem;
private ToolStripMenuItem discoverToolStripMenuItem;
private ToolStripSeparator toolStripSeparator2;
private ToolStripMenuItem aboutStripMenuItem;
}
}

View File

@@ -14,10 +14,13 @@ namespace robospot_camera_finder
{
public partial class MainForm : Form
{
public string VERSION = "1.1.0";
// Version
public string VERSION = "1.2.0";
// Main list containing all cameras
private BindingList<Camera> all_cameras = new();
// Camera credentials
public static string cam_username = "admin";
public static string cam_password = "RoboSpot10";
@@ -28,29 +31,29 @@ namespace robospot_camera_finder
private const byte DEF_REQ_SCAN = 1;
private const byte RES_REQ_SCAN = 11;
// UDP clients
private UdpClient sendClient;
private UdpClient receiveClient;
private bool isDiscovering = false;
// Camera class
public class Camera
{
public Camera(string name, string ip, string location, string serial)
public Camera(string name, string ip, string id)
{
camera_name = name;
camera_ip = ip;
camera_location = location;
camera_serial = serial;
camera_id = id;
}
public string camera_name { get; set; }
public string camera_ip { get; set; }
public string camera_location { get; set; }
public string camera_serial { get; set; }
public string camera_id { get; set; }
}
// Discovery packet struc
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DataPacketIPv4
{
@@ -139,9 +142,10 @@ namespace robospot_camera_finder
InitializeUdpClients();
// Discover cameras
discover_cameras();
DiscoverCameras();
}
// Inits UDP clients
private void InitializeUdpClients()
{
try
@@ -157,7 +161,8 @@ namespace robospot_camera_finder
}
}
private void add_camera(Camera new_camera)
// Add cameras to the main list
private void AddCamera(Camera new_camera)
{
if (all_cameras.Count == 0)
{
@@ -165,7 +170,7 @@ namespace robospot_camera_finder
}
else
{
Camera find_cam = all_cameras.FirstOrDefault(cam => cam.camera_serial == new_camera.camera_serial);
Camera find_cam = all_cameras.FirstOrDefault(cam => cam.camera_id == new_camera.camera_id);
if (find_cam != null)
{
@@ -179,67 +184,6 @@ namespace robospot_camera_finder
}
}
private void lbMain_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (lbMain.SelectedItem != null)
{
toolStripStatusLabel.Text = "Loading camera...";
Camera camera = all_cameras.FirstOrDefault<Camera>(cam => cam.camera_ip.ToString() == lbMain.SelectedValue.ToString());
Form viewer = new StreamViewer(lbMain.GetItemText(lbMain.SelectedItem), lbMain.SelectedValue.ToString(), camera, this);
viewer.Show();
toolStripStatusLabel.Text = "";
}
}
private void loadToolStripMenuItem_Click(object sender, EventArgs e)
{
string json = "";
OpenFileDialog openFile = new OpenFileDialog();
openFile.Filter = "json file (*.json)|*.json";
openFile.RestoreDirectory = true;
if (openFile.ShowDialog() == DialogResult.OK)
{
json = File.ReadAllText(openFile.FileName);
List<Camera> cameras_in_file = JsonSerializer.Deserialize<List<Camera>>(json);
foreach (Camera new_camera in cameras_in_file)
{
add_camera(new_camera);
}
}
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
string json = JsonSerializer.Serialize<BindingList<Camera>>(all_cameras, new JsonSerializerOptions
{
WriteIndented = true
});
SaveFileDialog saveFile = new SaveFileDialog();
saveFile.Filter = "json file (*.json)|*.json";
saveFile.RestoreDirectory = true;
if (saveFile.ShowDialog() == DialogResult.OK)
{
File.WriteAllText(saveFile.FileName, json);
}
}
private void manualAddToolStripMenuItem_Click(object sender, EventArgs e)
{
Manual_IP_Form manualForm = new Manual_IP_Form();
if (manualForm.ShowDialog(this) == DialogResult.OK)
{
string ipAddress = manualForm.ipAddress;
Camera camera_to_add = new Camera("Camera " + ipAddress, ipAddress, "", "CAM_FINDER_" + DateTime.Now.Ticks.ToString());
add_camera(camera_to_add);
}
}
// Helper method to convert structure to byte array
private byte[] StructureToByteArray(DataPacketIPv4 packet)
{
@@ -423,14 +367,13 @@ namespace robospot_camera_finder
Camera discoveredCamera = new Camera(
$"{deviceName} - ({cameraIP})",
cameraIP,
$"MAC: {macAddress}",
packetId // Using packet_id as serial for uniqueness
packetId
);
// Add camera to list (must be done on UI thread)
this.Invoke(new Action(() =>
{
add_camera(discoveredCamera);
AddCamera(discoveredCamera);
toolStripStatusLabel.Text = $"Found camera: {cameraName} ({cameraIP})";
}));
}
@@ -446,7 +389,7 @@ namespace robospot_camera_finder
}
// Main discovery method
private async void discover_cameras()
private async void DiscoverCameras()
{
if (isDiscovering)
{
@@ -466,6 +409,7 @@ namespace robospot_camera_finder
isDiscovering = true;
toolStripStatusLabel.Text = "Discovering cameras...";
discoverToolStripMenuItem.Enabled = false;
try
{
@@ -491,6 +435,68 @@ namespace robospot_camera_finder
{
isDiscovering = false;
toolStripStatusLabel.Text = $"Discovery complete. Found {all_cameras.Count} cameras.";
discoverToolStripMenuItem.Enabled = true;
}
}
private void lbMain_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (lbMain.SelectedItem != null)
{
toolStripStatusLabel.Text = "Loading camera...";
Camera camera = all_cameras.FirstOrDefault<Camera>(cam => cam.camera_ip.ToString() == lbMain.SelectedValue.ToString());
Form viewer = new StreamViewer(lbMain.GetItemText(lbMain.SelectedItem), lbMain.SelectedValue.ToString(), camera, this);
viewer.Show();
toolStripStatusLabel.Text = "";
}
}
private void loadToolStripMenuItem_Click(object sender, EventArgs e)
{
string json = "";
OpenFileDialog openFile = new OpenFileDialog();
openFile.Filter = "json file (*.json)|*.json";
openFile.RestoreDirectory = true;
if (openFile.ShowDialog() == DialogResult.OK)
{
json = File.ReadAllText(openFile.FileName);
List<Camera> cameras_in_file = JsonSerializer.Deserialize<List<Camera>>(json);
foreach (Camera new_camera in cameras_in_file)
{
AddCamera(new_camera);
}
}
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
string json = JsonSerializer.Serialize<BindingList<Camera>>(all_cameras, new JsonSerializerOptions
{
WriteIndented = true
});
SaveFileDialog saveFile = new SaveFileDialog();
saveFile.Filter = "json file (*.json)|*.json";
saveFile.RestoreDirectory = true;
if (saveFile.ShowDialog() == DialogResult.OK)
{
File.WriteAllText(saveFile.FileName, json);
}
}
private void manualAddToolStripMenuItem_Click(object sender, EventArgs e)
{
Manual_IP_Form manualForm = new Manual_IP_Form();
if (manualForm.ShowDialog(this) == DialogResult.OK)
{
string ipAddress = manualForm.ipAddress;
Camera camera_to_add = new Camera("Camera " + ipAddress, ipAddress, ipAddress);
AddCamera(camera_to_add);
}
}
@@ -508,5 +514,15 @@ namespace robospot_camera_finder
base.OnFormClosing(e);
}
private void discoverToolStripMenuItem_Click(object sender, EventArgs e)
{
DiscoverCameras();
}
private void aboutStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("RoboSpot Camera Finder v" + VERSION, "RoboSpot Camera Finder", MessageBoxButtons.OK);
}
}
}

View File

@@ -120,7 +120,7 @@
<metadata name="statusStripMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>153, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

View File

@@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net9.0-windows7.0</TargetFramework>
<TargetFramework>net9.0-windows</TargetFramework>
<RootNamespace>robospot_camera_finder</RootNamespace>
<Nullable>disable</Nullable>
<UseWindowsForms>true</UseWindowsForms>