コード例 #1
0
ファイル: HikvisionPTZ.cs プロジェクト: zyh329/cameraproxy
        public string GetStatusUpdate()
        {
            FloatVector3 cp      = currentPTZPosition.Copy();
            double       maxTilt = cs.ptz_tiltlimit_low - cs.ptz_tiltlimit_high;

            if (maxTilt > 0)
            {
                cp.Y = cp.Y / (float)((panoramaVerticalDegrees * 10) / maxTilt);
            }
            return("newpos " + cp.X + " " + cp.Y + " " + cp.Z);
        }
コード例 #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();
        }