Ajoutez des fichiers projet.
This commit is contained in:
61
MainForm.Designer.cs
generated
Normal file
61
MainForm.Designer.cs
generated
Normal file
@@ -0,0 +1,61 @@
|
||||
namespace robospot_camera_finder
|
||||
{
|
||||
partial class MainForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
lbMain = new ListBox();
|
||||
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.Name = "lbMain";
|
||||
lbMain.Size = new Size(776, 409);
|
||||
lbMain.TabIndex = 0;
|
||||
lbMain.MouseDoubleClick += lbMain_MouseDoubleClick;
|
||||
//
|
||||
// MainForm
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(800, 450);
|
||||
Controls.Add(lbMain);
|
||||
Name = "MainForm";
|
||||
Text = "RoboSpot MotionCamera finder";
|
||||
FormClosing += MainForm_FormClosing;
|
||||
ResumeLayout(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private ListBox lbMain;
|
||||
}
|
||||
}
|
||||
95
MainForm.cs
Normal file
95
MainForm.cs
Normal file
@@ -0,0 +1,95 @@
|
||||
using System.ComponentModel;
|
||||
using System.Net;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Web;
|
||||
using Tmds.MDns;
|
||||
|
||||
namespace robospot_camera_finder
|
||||
{
|
||||
public partial class MainForm : Form
|
||||
{
|
||||
private readonly ServiceBrowser browser = new();
|
||||
|
||||
private BindingList<Camera> all_cameras = new();
|
||||
|
||||
class Camera
|
||||
{
|
||||
private IPAddress ip;
|
||||
private string name;
|
||||
|
||||
public Camera(string name, IPAddress ip)
|
||||
{
|
||||
this.name = name;
|
||||
this.ip = ip;
|
||||
}
|
||||
|
||||
public string camera_name
|
||||
{
|
||||
get
|
||||
{
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
public IPAddress camera_ip
|
||||
{
|
||||
get
|
||||
{
|
||||
return ip;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public MainForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
browser.StartBrowse("_rtsp._tcp");
|
||||
|
||||
lbMain.DataSource = all_cameras;
|
||||
lbMain.DisplayMember = "camera_name";
|
||||
lbMain.ValueMember = "camera_ip";
|
||||
|
||||
browser.ServiceAdded += (sender, args) =>
|
||||
{
|
||||
foreach (var cam_addr in args.Announcement.Addresses)
|
||||
{
|
||||
if (cam_addr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
|
||||
{
|
||||
Camera camera = new Camera("Camera " + cam_addr.ToString(), cam_addr);
|
||||
all_cameras.Add(camera);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
browser.ServiceRemoved += (sender, args) =>
|
||||
{
|
||||
foreach (var cam_ip in args.Announcement.Addresses)
|
||||
{
|
||||
if (cam_ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
|
||||
{
|
||||
foreach (var camera in all_cameras)
|
||||
{
|
||||
if (cam_ip == camera.camera_ip)
|
||||
{
|
||||
all_cameras.Remove(camera);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
browser.StopBrowse();
|
||||
}
|
||||
|
||||
private void lbMain_MouseDoubleClick(object sender, MouseEventArgs e)
|
||||
{
|
||||
Form viewer = new StreamViewer(lbMain.GetItemText(lbMain.SelectedItem), lbMain.SelectedValue.ToString());
|
||||
viewer.Show();
|
||||
}
|
||||
}
|
||||
}
|
||||
60
MainForm.resx
Normal file
60
MainForm.resx
Normal file
@@ -0,0 +1,60 @@
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
17
Program.cs
Normal file
17
Program.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
namespace robospot_camera_finder
|
||||
{
|
||||
internal static class Program
|
||||
{
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
// To customize application configuration such as set high DPI settings or default font,
|
||||
// see https://aka.ms/applicationconfiguration.
|
||||
ApplicationConfiguration.Initialize();
|
||||
Application.Run(new MainForm());
|
||||
}
|
||||
}
|
||||
}
|
||||
124
StreamViewer.Designer.cs
generated
Normal file
124
StreamViewer.Designer.cs
generated
Normal file
@@ -0,0 +1,124 @@
|
||||
using LibVLCSharp.Forms.Shared;
|
||||
|
||||
namespace robospot_camera_finder
|
||||
{
|
||||
partial class StreamViewer
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
components = new System.ComponentModel.Container();
|
||||
videoView = new LibVLCSharp.WinForms.VideoView();
|
||||
tbZoom = new TrackBar();
|
||||
lblMinZoom = new Label();
|
||||
lblMaxZoom = new Label();
|
||||
timerUpdateZoom = new System.Windows.Forms.Timer(components);
|
||||
((System.ComponentModel.ISupportInitialize)videoView).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)tbZoom).BeginInit();
|
||||
SuspendLayout();
|
||||
//
|
||||
// videoView
|
||||
//
|
||||
videoView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||
videoView.BackColor = Color.Black;
|
||||
videoView.Location = new Point(12, 12);
|
||||
videoView.MediaPlayer = null;
|
||||
videoView.Name = "videoView";
|
||||
videoView.Size = new Size(870, 495);
|
||||
videoView.TabIndex = 0;
|
||||
videoView.Text = "videoView";
|
||||
//
|
||||
// tbZoom
|
||||
//
|
||||
tbZoom.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;
|
||||
tbZoom.LargeChange = 20;
|
||||
tbZoom.Location = new Point(889, 30);
|
||||
tbZoom.Maximum = 9999;
|
||||
tbZoom.Name = "tbZoom";
|
||||
tbZoom.Orientation = Orientation.Vertical;
|
||||
tbZoom.Size = new Size(45, 459);
|
||||
tbZoom.SmallChange = 10;
|
||||
tbZoom.TabIndex = 1;
|
||||
tbZoom.TickFrequency = 300;
|
||||
tbZoom.TickStyle = TickStyle.TopLeft;
|
||||
tbZoom.Value = 10;
|
||||
tbZoom.KeyUp += tbZoom_KeyUp;
|
||||
tbZoom.MouseUp += tbZoom_MouseUp;
|
||||
//
|
||||
// lblMinZoom
|
||||
//
|
||||
lblMinZoom.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
|
||||
lblMinZoom.AutoSize = true;
|
||||
lblMinZoom.Location = new Point(902, 492);
|
||||
lblMinZoom.Name = "lblMinZoom";
|
||||
lblMinZoom.Size = new Size(19, 15);
|
||||
lblMinZoom.TabIndex = 2;
|
||||
lblMinZoom.Text = "1x";
|
||||
//
|
||||
// lblMaxZoom
|
||||
//
|
||||
lblMaxZoom.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
||||
lblMaxZoom.AutoSize = true;
|
||||
lblMaxZoom.Location = new Point(902, 12);
|
||||
lblMaxZoom.Name = "lblMaxZoom";
|
||||
lblMaxZoom.Size = new Size(25, 15);
|
||||
lblMaxZoom.TabIndex = 3;
|
||||
lblMaxZoom.Text = "32x";
|
||||
//
|
||||
// timerUpdateZoom
|
||||
//
|
||||
timerUpdateZoom.Enabled = true;
|
||||
timerUpdateZoom.Interval = 10000;
|
||||
timerUpdateZoom.Tick += timerUpdateZoom_Tick;
|
||||
//
|
||||
// StreamViewer
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(933, 519);
|
||||
Controls.Add(lblMaxZoom);
|
||||
Controls.Add(lblMinZoom);
|
||||
Controls.Add(tbZoom);
|
||||
Controls.Add(videoView);
|
||||
Margin = new Padding(4, 3, 4, 3);
|
||||
Name = "StreamViewer";
|
||||
Text = "LibVLCSharp.WinForms";
|
||||
FormClosed += StreamViewer_FormClosed;
|
||||
((System.ComponentModel.ISupportInitialize)videoView).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)tbZoom).EndInit();
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private LibVLCSharp.WinForms.VideoView videoView;
|
||||
private TrackBar tbZoom;
|
||||
private Label lblMinZoom;
|
||||
private Label lblMaxZoom;
|
||||
private System.Windows.Forms.Timer timerUpdateZoom;
|
||||
}
|
||||
}
|
||||
95
StreamViewer.cs
Normal file
95
StreamViewer.cs
Normal file
@@ -0,0 +1,95 @@
|
||||
using LibVLCSharp.Shared;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.DirectoryServices.ActiveDirectory;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace robospot_camera_finder
|
||||
{
|
||||
public partial class StreamViewer : Form
|
||||
{
|
||||
public LibVLC _libVLC;
|
||||
public MediaPlayer _mp;
|
||||
|
||||
string username = "admin";
|
||||
string password = "RoboSpot10";
|
||||
string cam_ip = "";
|
||||
|
||||
public StreamViewer(string name, string ip)
|
||||
{
|
||||
InitializeComponent();
|
||||
_libVLC = new LibVLC();
|
||||
_mp = new MediaPlayer(_libVLC);
|
||||
cam_ip = ip;
|
||||
|
||||
timerUpdateZoom.Start();
|
||||
updateZoomSlider();
|
||||
|
||||
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();
|
||||
this.Text = name;
|
||||
}
|
||||
|
||||
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(username, 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) < 10)
|
||||
{
|
||||
zoom_pulse = "10";
|
||||
}
|
||||
if (int.Parse(zoom_pulse) > 9999)
|
||||
{
|
||||
zoom_pulse = "9999";
|
||||
}
|
||||
|
||||
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + cam_ip + "/stw-cgi/ptzcontrol.cgi?msubmenu=absolute&action=control&ZoomPulse=" + zoom_pulse);
|
||||
request.Credentials = new NetworkCredential(username, password);
|
||||
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
||||
}
|
||||
|
||||
private void StreamViewer_FormClosed(object sender, FormClosedEventArgs e)
|
||||
{
|
||||
_mp.Stop();
|
||||
_mp.Dispose();
|
||||
_libVLC.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();
|
||||
}
|
||||
}
|
||||
}
|
||||
63
StreamViewer.resx
Normal file
63
StreamViewer.resx
Normal file
@@ -0,0 +1,63 @@
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="timerUpdateZoom.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
20
robospot-camera-finder.csproj
Normal file
20
robospot-camera-finder.csproj
Normal file
@@ -0,0 +1,20 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFramework>net7.0-windows</TargetFramework>
|
||||
<RootNamespace>robospot_camera_finder</RootNamespace>
|
||||
<Nullable>enable</Nullable>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="LibVLCSharp" Version="3.8.2" />
|
||||
<PackageReference Include="LibVLCSharp.Forms" Version="3.8.2" />
|
||||
<PackageReference Include="LibVLCSharp.WinForms" Version="3.8.2" />
|
||||
<PackageReference Include="Tmds.MDns" Version="0.8.0" />
|
||||
<PackageReference Include="VideoLAN.LibVLC.Windows" Version="3.0.20" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
25
robospot-camera-finder.sln
Normal file
25
robospot-camera-finder.sln
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.5.33516.290
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "robospot-camera-finder", "robospot-camera-finder.csproj", "{D68CD277-4F05-4BEC-879C-E2097CC4BEDC}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D68CD277-4F05-4BEC-879C-E2097CC4BEDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D68CD277-4F05-4BEC-879C-E2097CC4BEDC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D68CD277-4F05-4BEC-879C-E2097CC4BEDC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D68CD277-4F05-4BEC-879C-E2097CC4BEDC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {23A9FE53-49F6-4D0C-951F-CF3CA11F091C}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
Reference in New Issue
Block a user