Ejemplo n.º 1
0
        private void WebcamCaptureMenuItem_Click(object sender, EventArgs e)
        {
            var Form = new WebcamCapture();

            Form.Show(this);
            Form.Activate();
        }
Ejemplo n.º 2
0
        private void SetupCapture()
        {
            Capture cap;

            if (this.captureSource == -1)
            {
                cap = new VideoFileCapture(@"..\..\Media\test.avi")
                {
                    Looping = true
                };
            }
            else
            {
                cap = new WebcamCapture(this.captureSource);
            }

            this.ctt = new CaptureToTexture(cap, "vidtex");

            // get video size
            this.ctt.Start();
            while (!cap.IsRunning)
            {
            }
            this.ctt.Stop();
            Size s = new Size(NextPowerOfTwo(cap.Size.Width), NextPowerOfTwo(cap.Size.Height));

            using (TexturePtr tex = TextureManager.Singleton.CreateManual(
                       "vidtex",
                       ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME,
                       TextureType.TEX_TYPE_2D,
                       (uint)s.Width,
                       (uint)s.Height,
                       0,
                       PixelFormat.PF_A8R8G8B8))
            {
                using (MaterialPtr mat = MaterialManager.Singleton.Create("vidmat", ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME))
                {
                    mat.GetTechnique(0).CreatePass().CreateTextureUnitState(tex.Name);
                    Entity e = this.sceneMgr.CreateEntity("cube", "cube.mesh");
                    e.SetMaterial(mat);
                    this.sceneMgr.RootSceneNode.CreateChildSceneNode().AttachObject(e);
                }
            }

            this.ctt.Start();
        }
Ejemplo n.º 3
0
        private HttpStatusCode RespondPost(JsonString requestSubject, JsonString responseSubject, int sensorIndex)
        {
            object dataSync = new object();
            // first read the data from the data array
            JsonString data = requestSubject.GetJsonString("data");

            if (data == null || data.Type != JsonStringType.Array || data.Array.Count < 1)
            {
                return(HttpStatusCode.BadRequest);
            }
            var targetMap = new Dictionary <int, EquipmentSettings>();

            for (int i = 0; i <= 0; i++)
            {
                JsonString sensor = data.GetJsonString(0);
                if (sensor == null)
                {
                    return(HttpStatusCode.BadRequest);
                }
                bool used = JsonString.ParseBool(sensor.GetTerminal("inuse", "false"), false);
                if (used)
                {
                    JsonString jSettings = sensor.GetJsonString("settings");
                    if (jSettings == null)
                    {
                        return(HttpStatusCode.BadRequest);
                    }
                    var settings = EquipmentSettings.FromJson(jSettings, typeof(SensorProperty));
                    targetMap.Add(sensorIndex + i, settings);
                }
            }

            // secondly satisfy the request
            var status      = HttpStatusCode.OK;
            var resultMap   = new Dictionary <int, EquipmentSettings>();
            var readySignal = new ManualResetEvent(false);

            CaptureSystem.Instance.Invoke((object sender, EventArgs args) => {
                var system = (CaptureSystem)sender;
                for (int iSource = sensorIndex; iSource <= sensorIndex; iSource++)
                {
                    // first determine which operations to perform
                    int iTarget     = iSource;
                    bool connect    = false;
                    bool disconnect = false;
                    bool start      = false;
                    bool stop       = false;
                    bool apply      = false;


                    var entry          = data.GetJsonString(0);
                    ISensorBase sensor = system.GetSensor(sensorIndex);
                    EquipmentSettings sourceSettings = null;
                    SensorType sourceType            = SensorType.Webcam;
                    if (sensor != null)
                    {
                        sourceSettings = ((WebcamCapture)sensor).GetSettings();
                        int iType      = sourceSettings.GetInteger(SensorProperty.Type, -1);
                        if (iType > -1)
                        {
                            sourceType = (SensorType)iType;
                        }
                    }
                    EquipmentSettings targetSettings = null;
                    SensorType targetType            = SensorType.Webcam;
                    if (targetMap.TryGetValue(iSource, out targetSettings))
                    {
                        int iType = targetSettings.GetInteger(SensorProperty.Type, -1);
                        if (iType > -1)
                        {
                            targetType = (SensorType)iType;
                        }
                    }
                    if (sourceSettings == null && targetSettings != null)
                    {
                        connect = true;
                    }
                    else if (sourceSettings != null && targetSettings == null)
                    {
                        disconnect = true;
                    }
                    else if (sourceSettings == null && targetSettings == null)
                    {
                        // nothing to do
                    }
                    else
                    {
                        if (sourceType != targetType)
                        {
                            disconnect = true;
                            connect    = true;
                        }
                        apply = true;
                    }
                    if (targetSettings != null)
                    {
                        int iTargetCapturing = targetSettings.GetInteger(SensorProperty.Capturing, -1);
                        if (iTargetCapturing < 0)
                        {
                            // ignore if not available
                        }
                        else if (iTargetCapturing != 0)
                        {
                            start = true;
                        }
                        else
                        {
                            stop = true;
                        }
                    }
                    // TODO make restrictions or otherwise cover remaining possible cases
                    bool success = true;
                    // perform the operations which were activated above
                    if (disconnect && success)
                    {
                        if (system.DisconnectSensor(iSource))
                        {
                            LogManager.Instance.LogMessage(this, "Disconnected sensor " + iSource);
                            sensor = null;
                            // already removed from result map
                        }
                        else
                        {
                            // nothing changed
                            LogManager.Instance.LogError(this, "Failed to disconnect sensor " + iSource);
                            resultMap[iSource] = sourceSettings;
                            success            = false;
                        }
                    }
                    if (connect && success)
                    {
                        sensor    = new WebcamCapture(targetSettings);
                        int iNext = system.ConnectSensor(sensor, iTarget);
                        if (iNext == iTarget)
                        {
                            LogManager.Instance.LogMessage(this, "Connected sensor " + iNext);
                            targetSettings     = ((WebcamCapture)sensor).GetSettings();
                            resultMap[iTarget] = targetSettings;
                        }
                        else if (iNext < 0)
                        {
                            // failed, leave result map entry empty
                            LogManager.Instance.LogError(this, "Failed to connect new sensor");
                            sensor  = null;
                            success = false;
                        }
                        else
                        {
                            LogManager.Instance.LogMessage(this, "Connected sensor " + iNext);
                            // sensor connected with different index, which we can accept
                            iTarget          = iNext;
                            resultMap[iNext] = targetSettings;
                            targetSettings   = ((WebcamCapture)sensor).GetSettings();
                        }
                    }

                    if (stop && success)
                    {
                        if (system.StopSensor(iTarget))
                        {
                            LogManager.Instance.LogMessage(this, "Stopped sensor " + iTarget);
                        }
                        else
                        {
                            targetSettings = ((WebcamCapture)sensor).GetSettings();
                            success        = false;
                            LogManager.Instance.LogError(this, "Failed to stop sensor " + iTarget);
                        }
                        resultMap[iTarget] = targetSettings;
                    }
                    if (apply && success)
                    {
                        if (sensor != null)
                        {
                            if (((WebcamCapture)sensor).ApplySettings(targetSettings))
                            {
                                LogManager.Instance.LogMessage(this, "Applied new settings to sensor " + iTarget);
                            }
                            else
                            {
                                LogManager.Instance.LogError(this, "Failed to apply new settings to sensor " + iTarget);
                            }
                            targetSettings     = ((WebcamCapture)sensor).GetSettings();
                            resultMap[iTarget] = targetSettings;
                        }
                    }

                    if (start && success)
                    {
                        if (system.StartSensor(iSource))
                        {
                            LogManager.Instance.LogMessage(this, "Started sensor " + iSource);
                            targetSettings     = ((WebcamCapture)sensor).GetSettings();
                            resultMap[iTarget] = targetSettings;
                        }
                        else
                        {
                            LogManager.Instance.LogError(this, "Failed to start sensor " + iSource);
                            targetSettings     = ((WebcamCapture)sensor).GetSettings();
                            resultMap[iTarget] = targetSettings;
                            success            = false;
                        }
                    }
                    if (!success)
                    {
                        status = HttpStatusCode.InternalServerError;
                    }
                }
                readySignal.Set();
            });
            // lastly create an update for all clients
            if (!readySignal.WaitOne(10000))
            {
                return(HttpStatusCode.InternalServerError);
            }
            if (status != HttpStatusCode.OK)
            {
                return(status);
            }
            //var responseSubject = new JsonString(subject);
            {
                var updateData = JsonString.CreateArray();
                {
                    for (int i = sensorIndex; i <= sensorIndex; i++)
                    {
                        var entry = JsonString.CreateDict();
                        EquipmentSettings settings;
                        if (resultMap.TryGetValue(i, out settings))
                        {
                            entry.AddTerminal("inuse", "true");
                            entry.AddJsonString("settings", EquipmentSettings.ToJson(settings));
                        }
                        else
                        {
                            entry.AddTerminal("inuse", "false");
                        }
                        updateData.AddJsonString(string.Empty, entry);
                    }
                }
                responseSubject.AddJsonString("data", updateData);
            }
            return(HttpStatusCode.OK);
        }
Ejemplo n.º 4
0
        public Task <bool> ActivateProfile(SetupProfile profile)
        {
            if (profile == null)
            {
                throw new ArgumentNullException("profile");
            }
            var captureSignal = new ManualResetEvent(false);
            var trackerSignal = new ManualResetEvent(false);
            var deviceSignal  = new ManualResetEvent(false);
            var cancel        = new CancellationToken();

            CaptureSystem.Instance.Invoke((object sender, EventArgs args) => {
                var system = (CaptureSystem)sender;
                foreach (int i in profile.VideoCaptureIndexes)
                {
                    var settings = profile.GetVideoCapture(i);
                    var sensor   = new WebcamCapture(settings);
                    int index    = system.ConnectSensor(sensor, i);
                    if (index != i)
                    {
                        LogManager.Instance.LogWarning(this, string.Format("VideoCapture {0} assigned to different index {1}",
                                                                           i, index));
                    }
                }
                captureSignal.Set();
            });

            TrackingSystem.Instance.Invoke(delegate {
                foreach (int i in profile.TrackerIndexes)
                {
                    var settings = profile.GetTracker(i);
                    var tracker  = new P3CapTracker(settings);
                    int index    = TrackingSystem.Instance.StartTracker(tracker);
                }
                trackerSignal.Set();
            });

            VirtualDeviceManager.Instance.Invoke(delegate {
                foreach (int i in profile.DeviceIndexes)
                {
                    var settings = profile.GetDevice(i);
                    var device   = VirtualDevice.CreateFromSettings(settings);
                    int index    = VirtualDeviceManager.Instance.ConnectDevice(device);
                }
                deviceSignal.Set();
            });
            return(Task.Factory.StartNew(delegate {
                captureSignal.WaitOne();
                trackerSignal.WaitOne();
                deviceSignal.WaitOne();
                return true;
            }, cancel));

            // we need to wait for the detection system to update tracker equipment
//			DetectionSystem.Instance.Invoke(delegate {
//				Invoke(delegate {
//					foreach (int iTracker in profile.BindingIndexes) {
//						if (!bindingsFactory.ApplyBindings(iTracker, profile.GetBindings(iTracker))) {
//							LogManager.Instance.LogError(this, "Failed to restore tracker bindings");
//							return;
//						}
//					}
//				});
//			});
        }