public void Set3DPTZPosition(Pos3d pos) { System.Threading.Interlocked.Exchange(ref desired3dPosition, pos); }
public void ptzWorkerLoop(object arg) { bool[] abortFlag = (bool[])arg; Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(Thread.CurrentThread.Name + " Started"); Console.ResetColor(); try { DoLogin(); while (!abortFlag[0]) { try { if (generatePanoramaSourceFrames) { generatePanoramaSourceFrames = false; GeneratePseudoPanorama(true, true); SetNewIdleTime(); } if (generatePseudoPanorama) { generatePseudoPanorama = false; GeneratePseudoPanorama(false, false); SetNewIdleTime(); } FloatVector3 desiredAbsPos = (FloatVector3)Interlocked.Exchange(ref desiredPTZPosition, null); if (desiredAbsPos != null) { SetNewIdleTime(); desiredAbsPos.Y = Util.Clamp(desiredAbsPos.Y, 0, 1); desiredAbsPos.Y = desiredAbsPos.Y * (float)(panoramaVerticalDegrees / 90.0); desiredAbsPos.Z = Util.Clamp(desiredAbsPos.Z, 0, 1); PositionABS_PercentPosition(desiredAbsPos); BroadcastStatusUpdate(); Thread.Sleep(1000); //if ("grapefruit" == false.ToString().ToLower()) //{ // GeneratePseudoPanorama(14, 6, true); //} } double[] desiredZoom = (double[])Interlocked.Exchange(ref desiredZoomPosition, null); if (desiredZoom != null) { SetNewIdleTime(); FloatVector3 percentPos = currentPTZPosition.Copy(); float newZ = (float)Util.Clamp(desiredZoom[0], 0, 1); float diffZ = Math.Abs(newZ - percentPos.Z); percentPos.Z = newZ; PositionABS_PercentPosition(percentPos); BroadcastStatusUpdate(); Thread.Sleep((int)(diffZ * 1000)); } Pos3d desired3d = (Pos3d)Interlocked.Exchange(ref desired3dPosition, null); if (desired3d != null) { SetNewIdleTime(); float x = desired3d.X; float y = desired3d.Y; float w = desired3d.W; float h = desired3d.H; bool zIn = desired3d.zoomIn; float z = Math.Max(w, h); if (!zIn) { z *= -1; } this.Position3D(x, y, z); Broadcast3dPosition(x, y, w, h, zIn); BroadcastStatusUpdate(); Thread.Sleep(500); } Thread.Sleep(10); if (DateTime.Now > willBeIdleAt) { willBeIdleAt = DateTime.MaxValue; desiredAbsPos = new FloatVector3((float)cs.ptz_idleresetpositionX, (float)cs.ptz_idleresetpositionY, (float)cs.ptz_idleresetpositionZ); desiredAbsPos.Y = Util.Clamp(desiredAbsPos.Y, 0, 1); desiredAbsPos.Z = Util.Clamp(desiredAbsPos.Z, 0, 1); PositionABS_PercentPosition(desiredAbsPos); BroadcastStatusUpdate(); Thread.Sleep(1000); } } catch (ThreadAbortException ex) { throw ex; } catch (Exception ex) { Logger.Debug(ex); } } Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(Thread.CurrentThread.Name + " Stopping"); Console.ResetColor(); } catch (ThreadAbortException) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(Thread.CurrentThread.Name + " Aborted"); Console.ResetColor(); } catch (Exception ex) { Logger.Debug(ex); } ptzWorkerThread = null; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(Thread.CurrentThread.Name + " Exiting"); Console.ResetColor(); }