Пример #1
0
 public void Set3DPTZPosition(Pos3d pos)
 {
     System.Threading.Interlocked.Exchange(ref desired3dPosition, pos);
 }
Пример #2
0
        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();
        }