/// <summary>
/// Disconnect from SRV-1 Blackfin robot.
/// </summary>
///
/// <remarks><para>The method disconnects from SRV-1 robot making all other methods
/// unavailable (except <see cref="Connect"/> method). In the case if user
/// obtained instance of camera using <see cref="GetCamera"/> method, the video will
/// be stopped automatically (and those <see cref="SRV1Camera"/> instances should be discarded).
/// </para></remarks>
///
public void Disconnect()
{
lock (sync)
{
if (thread != null)
{
// signal camera to stop
if (camera != null)
{
camera.SignalToStop();
}
// signal worker thread to stop
stopEvent.Set();
requestIsAvailable.Set();
replyIsAvailable.Set();
// finilze the camera
if (camera != null)
{
// wait for aroung 250 ms
for (var i = 0; (i < 5) && (camera.IsRunning); i++)
{
System.Threading.Thread.Sleep(50);
}
// abort camera if it can not be stopped
if (camera.IsRunning)
{
camera.Stop();
}
camera = null;
}
// wait for aroung 1 s
for (var i = 0; (i < 20) && (thread.Join(0) == false); i++)
{
System.Threading.Thread.Sleep(50);
}
// abort thread if it can not be stopped
if (thread.Join(0) == false)
{
thread.Abort();
}
thread = null;
// release events
stopEvent.Close();
stopEvent = null;
requestIsAvailable.Close();
requestIsAvailable = null;
replyIsAvailable.Close();
replyIsAvailable = null;
}
if (socket != null)
{
if (socket.Connected)
{
socket.Disconnect(false);
}
socket.Close();
socket = null;
endPoint = null;
}
}
}