public IEnumerator <ITask> DeleteGrammarEntryHandler(DeleteGrammarEntry delete)
        {
            // Make sure current grammar type is dictionary-style
            if (_state.GrammarType != GrammarType.DictionaryStyle)
            {
                Fault fault = Fault.FromCodeSubcodeReason(
                    FaultCodes.Receiver,
                    DsspFaultCodes.OperationFailed,
                    "Cannot delete entries from grammar dictionary because grammar"
                    + "currently in use is not DictionaryStyle."
                    );
                LogInfo(fault.ToException());
                delete.ResponsePort.Post(fault);
                yield break;
            }

            #region Set up load grammar request and load grammar
            // Set up load grammar request
            LoadGrammarRequest loadRequest = new LoadGrammarRequest();
            loadRequest.GrammarType       = GrammarType.DictionaryStyle;
            loadRequest.DictionaryGrammar = new Dictionary <string, string>(_state.DictionaryGrammar);
            GrammarUtilities.DeleteDictionary(loadRequest.DictionaryGrammar, delete.Body.DictionaryGrammar);

            // Load new grammar
            SuccessFailurePort loadGrammarPort = new SuccessFailurePort();
            SpawnIterator <LoadGrammarRequest, SuccessFailurePort>(
                loadRequest,
                loadGrammarPort,
                LoadGrammar
                );

            // Check loading outcome
            yield return((Choice)loadGrammarPort);

            Exception exception = (Exception)loadGrammarPort;
            if (exception != null)
            {
                LogWarning(exception);
                delete.ResponsePort.Post(Fault.FromCodeSubcodeReason(
                                             FaultCodes.Receiver,
                                             DsspFaultCodes.OperationFailed,
                                             exception.Message
                                             ));
                yield break;
            }
            #endregion

            SaveState(_state);

            // Notify subscribers of state change
            Replace replace = new Replace();
            replace.Body = _state;
            SendNotification <Replace>(_subMgrPort, replace);

            delete.ResponsePort.Post(DefaultDeleteResponseType.Instance);
        }
        public IEnumerator <ITask> UpsertGrammarEntryHandler(UpsertGrammarEntry upsert)
        {
            if (_state.GrammarType != GrammarType.DictionaryStyle)
            {
                // Since we are switching grammar mode make sure there exists a valid,
                // empty dictionary
                if (_state.DictionaryGrammar == null)
                {
                    _state.DictionaryGrammar = new Dictionary <string, string>();
                }
                else
                {
                    _state.DictionaryGrammar.Clear();
                }
            }

            #region Set up load grammar request and load grammar
            // Set up load grammar request
            LoadGrammarRequest loadRequest = new LoadGrammarRequest();
            loadRequest.GrammarType       = GrammarType.DictionaryStyle;
            loadRequest.DictionaryGrammar = new Dictionary <string, string>(_state.DictionaryGrammar);
            GrammarUtilities.UpsertDictionary(loadRequest.DictionaryGrammar, upsert.Body.DictionaryGrammar);

            // Load new grammar
            SuccessFailurePort loadGrammarPort = new SuccessFailurePort();
            SpawnIterator <LoadGrammarRequest, SuccessFailurePort>(
                loadRequest,
                loadGrammarPort,
                LoadGrammar
                );

            // Check loading outcome
            yield return((Choice)loadGrammarPort);

            Exception exception = (Exception)loadGrammarPort;
            if (exception != null)
            {
                LogWarning(exception);
                upsert.ResponsePort.Post(Fault.FromCodeSubcodeReason(
                                             FaultCodes.Receiver,
                                             DsspFaultCodes.OperationFailed,
                                             exception.Message
                                             ));
                yield break;
            }
            #endregion

            SaveState(_state);

            // Notify subscribers of state change
            Replace replace = new Replace();
            replace.Body = _state;
            SendNotification <Replace>(_subMgrPort, replace);

            upsert.ResponsePort.Post(DefaultUpsertResponseType.Instance);
        }
예제 #3
0
 public void UpdateFormatHandler(mdwebcam.UpdateFormat update)
 {
     update.ResponsePort.Post(
         Fault.FromCodeSubcodeReason(
             FaultCodes.Receiver,
             DsspFaultCodes.ActionNotSupported,
             "UpdateFormat is not supported by the webcam replay service"
             )
         );
 }
예제 #4
0
 public void HttpPostHandler(HttpPost httpPost)
 {
     httpPost.ResponsePort.Post(
         Fault.FromCodeSubcodeReason(
             FaultCodes.Receiver,
             DsspFaultCodes.ActionNotSupported,
             "HTTP Post is not supported by the webcam replay service"
             )
         );
 }
 public void ChangeControllerHandler(gc.ChangeController update)
 {
     update.ResponsePort.Post(
         Fault.FromCodeSubcodeReason(
             FaultCodes.Receiver,
             DsspFaultCodes.ActionNotSupported,
             "The Joystick Form Service does not support changing controllers"
             )
         );
 }
 /// <summary>
 /// Posts a HTTP error message with a supplied error message back to the client
 /// </summary>
 /// <param name="post"></param>
 /// <param name="errorMsg"></param>
 private void PostHttpPostParameterError(HttpPost post, string errorMsg)
 {
     post.ResponsePort.Post(new HttpResponseType(
                                HttpStatusCode.OK,
                                Fault.FromCodeSubcodeReason(
                                    FaultCodes.Sender,
                                    DsspFaultCodes.ActionNotSupported,
                                    errorMsg
                                    )
                                ));
 }
예제 #7
0
        void UpdateDeviceInternal(UpdateDevice update)
        {
            CameraInstance selected = update.Body.Selected;
            bool           updated  = false;

            if (_state.Selected != null &&
                _state.Selected.FrameGrabber != null)
            {
                _state.Selected.FrameGrabber.StopCapture();
                _state.Selected.FrameGrabber.Dispose();

                _state.Selected = null;
            }

            foreach (object obj in new vision.CameraCollection())
            {
                using (vision.Camera camera = obj as vision.Camera)
                {
                    if ((!string.IsNullOrEmpty(selected.FriendlyName) && camera.Name == selected.FriendlyName) ||
                        (!string.IsNullOrEmpty(selected.DevicePath) && camera.Path == selected.DevicePath))
                    {
                        selected.FriendlyName               = camera.Name;
                        selected.DevicePath                 = selected.DevicePath;
                        selected.FrameGrabber               = vision.FrameGrabber.FromCamera(camera);
                        selected.SupportedFormats           = ConvertFormats(selected.FrameGrabber.Formats);
                        selected.FrameGrabber.CaptureFrame += OnCaptureFrame;
                        selected.FrameGrabber.StartCapture();
                        selected.Format = new Format(selected.FrameGrabber.Format);

                        updated = true;
                        break;
                    }
                }
            }
            if (updated)
            {
                _state.Selected = selected;

                update.ResponsePort.Post(DefaultUpdateResponseType.Instance);

                SendNotification(_submgrPort, update);
            }
            else
            {
                update.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(FaultCodes.Receiver,
                                                DsspFaultCodes.UnknownEntry,
                                                "Camera not found"
                                                )
                    );
            }
        }
예제 #8
0
        public IEnumerator <ITask> OnUpdateButton(UpdateButton update)
        {
            int index = _state.Buttons.FindIndex(update.Body.CompareId);

            if (index < 0)
            {
                update.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Receiver,
                        DsspFaultCodes.UnknownEntry,
                        "A button with the requested ID does not exist: " + update.Body.Id
                        )
                    );
            }
            else
            {
                bool isInternal = update.GetHeader <InternalUpdate>() != null;

                if (!isInternal)
                {
                    Fault      fault  = null;
                    FormInvoke invoke = new FormInvoke(
                        delegate
                    {
                        _form.UpdateButton(update.Body);
                    }
                        );

                    WinFormsServicePort.Post(invoke);
                    yield return(Arbiter.Choice(
                                     invoke.ResultPort,
                                     EmptyHandler,
                                     delegate(Exception e)
                    {
                        fault = Fault.FromException(e);
                    }
                                     ));

                    if (fault != null)
                    {
                        update.ResponsePort.Post(fault);
                        yield break;
                    }
                }

                _state.Buttons[index] = update.Body;
                update.ResponsePort.Post(DefaultUpdateResponseType.Instance);
                DoSendNotification(update);
            }
        }
예제 #9
0
        public void OnUpdateColorDefinition(UpdateColorDefinition update)
        {
            ColorDefinition def = update.Body;

            if (!def.Validate())
            {
                update.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Receiver,
                        DsspFaultCodes.OperationFailed,
                        "ColorDefinition is not valid."
                        )
                    );
                return;
            }

            ColorSet set = _state.Colors.Find(def.Compare);

            if (set == null)
            {
                update.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Receiver,
                        DsspFaultCodes.UnknownEntry,
                        "ColorSet List does not contain an entry for: " + def.Name
                        )
                    );
                return;
            }

            int index = set.Colors.FindIndex(def.CompareColor);

            if (index >= 0)
            {
                set.Colors[index] = def;
                update.ResponsePort.Post(DefaultUpdateResponseType.Instance);
                _state.UpdateColorSetMap();
                SendNotification(_submgrPort, update, Filter.ColorDefinitions.ToString());
            }
            else
            {
                update.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Receiver,
                        DsspFaultCodes.UnknownEntry,
                        "ColorSet Definition List does not contain an entry for: " + def.Name
                        )
                    );
            }
        }
예제 #10
0
        void HttpGetHandler(HttpGet httpGet)
        {
            HttpListenerRequest  request  = httpGet.Body.Context.Request;
            HttpListenerResponse response = httpGet.Body.Context.Response;

            Stream image = null;

            string path = request.Url.AbsolutePath;

            if (path == _cylinder)
            {
                image = GenerateCylinder();
            }
            else if (path == _top)
            {
                image = GenerateTop(400);
            }
            else if (path.StartsWith(_topw))
            {
                int    width;
                string remain = path.Substring(_topw.Length);

                if (int.TryParse(remain, out width))
                {
                    image = GenerateTop(width);
                }
            }
            else if (path == _root)
            {
                HttpResponseType rsp = new HttpResponseType(HttpStatusCode.OK,
                                                            _state,
                                                            //base.StateTransformPath,
                                                            _transform);
                httpGet.ResponsePort.Post(rsp);
            }



            if (image != null)
            {
                SendJpeg(httpGet.Body.Context, image);
            }
            else
            {
                httpGet.ResponsePort.Post(Fault.FromCodeSubcodeReason(
                                              W3C.Soap.FaultCodes.Receiver,
                                              DsspFaultCodes.OperationFailed,
                                              "Unable to generate Image"));
            }
        }
예제 #11
0
        public void OnAddColorDefinition(AddColorDefinition add)
        {
            ColorDefinition insert = add.Body;

            if (insert.Validate() == false)
            {
                add.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Receiver,
                        DsspFaultCodes.OperationFailed,
                        "ColorDefinition is invalid"
                        )
                    );
                return;
            }

            ColorSet set = _state.Colors.Find(insert.Compare);

            if (set != null)
            {
                if (set.Colors.Exists(insert.CompareColor))
                {
                    add.ResponsePort.Post(
                        Fault.FromCodeSubcodeReason(
                            FaultCodes.Receiver,
                            DsspFaultCodes.DuplicateEntry,
                            "ColorSet Definition List already contains an entry for: " + insert.Name
                            )
                        );
                    return;
                }

                set.Colors.Add(insert);
                _state.UpdateColorSetMap();
                add.ResponsePort.Post(DefaultInsertResponseType.Instance);
            }
            else
            {
                set      = new ColorSet();
                set.Name = insert.Name;
                set.Colors.Add(insert);
                _state.Colors.Add(set);
                _state.UpdateColorSetMap();
                add.ResponsePort.Post(DefaultInsertResponseType.Instance);
            }

            SendNotification(_submgrPort, add, Filter.ColorDefinitions.ToString());
        }
        public IEnumerator <ITask> ReplaceHandler(Replace replace)
        {
            // Use try/catch to respond with meaningful error in case of an exception
            try
            {
                SetRate(replace.Body.Rate);
                SetVolume(replace.Body.Volume);
                SetVoice(replace.Body.Voice);
            }
            catch (ArgumentException e)
            {
                replace.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        W3C.Soap.FaultCodes.Receiver,
                        DsspFaultCodes.OperationFailed,
                        e.Message
                        )
                    );
                yield break;
            }

            DisableAudioOutput(replace.Body.DisableAudioOutput);

            SayText say = new SayText();

            say.Body.SpeechText = replace.Body.SpeechText;
            SpawnIterator(say, SayTextHandler);

            yield return((Choice)say.ResponsePort);

            Fault fault = (Fault)say.ResponsePort;

            if (fault != null)
            {
                replace.ResponsePort.Post(fault);
                yield break;
            }

            SaveState(_state);

            // Notify subscribers of state change
            Replace subscriberReplace = new Replace();

            subscriberReplace.Body = _state;
            SendNotification <Replace>(_subMgrPort, subscriberReplace);

            replace.ResponsePort.Post(DefaultReplaceResponseType.Instance);
        }
예제 #13
0
        public IEnumerator <ITask> OnDeleteButton(DeleteButton delete)
        {
            FlexButton existing = _state.Buttons.Find(delete.Body.CompareId);

            if (existing == null)
            {
                delete.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Receiver,
                        DsspFaultCodes.UnknownEntry,
                        "A button with the requested ID does not exist: " + delete.Body.Id
                        )
                    );
            }
            else
            {
                Fault      fault  = null;
                FormInvoke invoke = new FormInvoke(
                    delegate
                {
                    _form.DeleteButton(delete.Body);
                }
                    );

                WinFormsServicePort.Post(invoke);
                yield return(Arbiter.Choice(
                                 invoke.ResultPort,
                                 EmptyHandler,
                                 delegate(Exception e)
                {
                    fault = Fault.FromException(e);
                }
                                 ));

                if (fault != null)
                {
                    delete.ResponsePort.Post(fault);
                }
                else
                {
                    _state.Buttons.Remove(existing);
                    delete.ResponsePort.Post(DefaultDeleteResponseType.Instance);
                    DoSendNotification(delete);
                }
            }
        }
        /// <summary>
        /// SeakCompleted handler, called by speech synthesizer
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        void SpeakCompletedHandler(object sender, SpeakCompletedEventArgs args)
        {
            Fault fault = null;

            if (args.Error != null)
            {
                string errorStr = "Asynchronous speech synthesis failed: "
                                  + args.Error.ToString();

                LogWarning(LogGroups.Console, errorStr);

                fault = Fault.FromCodeSubcodeReason(
                    FaultCodes.Receiver,
                    DsspFaultCodes.OperationFailed,
                    errorStr
                    );
            }

            SayTextSynch sayText;

            lock (_sayTextSynchDictionary)
            {
                if (_sayTextSynchDictionary.TryGetValue(args.Prompt, out sayText))
                {
                    _sayTextSynchDictionary.Remove(args.Prompt);

                    if (fault != null)
                    {
                        sayText.ResponsePort.Post(fault);
                    }
                    else
                    {
                        sayText.ResponsePort.Post(DefaultUpdateResponseType.Instance);
                    }
                }
                else
                {
                    if (fault != null)
                    {
                        FaultNotify notifyMsg = new FaultNotify();
                        notifyMsg.Body = fault;
                        SendNotification <FaultNotify>(_subMgrPort, notifyMsg);
                    }
                }
            }
        }
예제 #15
0
        public IEnumerator <ITask> OnInsertButton(InsertButton insert)
        {
            if (_state.Buttons.Exists(insert.Body.CompareId) ||
                _state.Controls.Exists(insert.Body.CompareId))
            {
                insert.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Receiver,
                        DsspFaultCodes.DuplicateEntry,
                        "A button with the same ID already exists: " + insert.Body.Id
                        )
                    );
            }
            else
            {
                Fault      fault  = null;
                FormInvoke invoke = new FormInvoke(
                    delegate
                {
                    _form.InsertButton(insert.Body);
                }
                    );

                WinFormsServicePort.Post(invoke);
                yield return(Arbiter.Choice(
                                 invoke.ResultPort,
                                 EmptyHandler,
                                 delegate(Exception e)
                {
                    fault = Fault.FromException(e);
                }
                                 ));

                if (fault != null)
                {
                    insert.ResponsePort.Post(fault);
                }
                else
                {
                    _state.Buttons.Add(insert.Body);
                    insert.ResponsePort.Post(DefaultUpdateResponseType.Instance);
                    DoSendNotification(insert);
                }
            }
        }
        public IEnumerator <ITask> EmulateRecognizeHandler(EmulateRecognize speech)
        {
            if (string.IsNullOrEmpty(speech.Body.Text))
            {
                Fault fault = Fault.FromCodeSubcodeReason(
                    FaultCodes.Sender,
                    DsspFaultCodes.OperationFailed,
                    "Text of speech to be emulated cannot be empty"
                    );
                LogInfo(fault.ToException());
                speech.ResponsePort.Post(fault);
                yield break;
            }

            this.state.Recognizer.EmulateRecognizeAsync(speech.Body.Text);
            speech.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }
예제 #17
0
        public void OnSetFrameRate(SetFrameRate update)
        {
            var rate = update.Body.FrameRate;

            if (rate > KinectState.MaxFrameRate)
            {
                update.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Sender,
                        DsspFaultCodes.OperationFailed,
                        Resources.FrameRateOutOfRange));
            }
            else
            {
                this.state.FrameRate = rate;
                update.ResponsePort.Post(DefaultUpdateResponseType.Instance);
                SendNotification(this.submgrPort, update);
            }
        }
예제 #18
0
        public void OnRemoveColorDefinition(RemoveColorDefinition remove)
        {
            ColorDefinition delete = remove.Body;
            ColorSet        set    = _state.Colors.Find(delete.Compare);

            if (set != null)
            {
                ColorDefinition existing = set.Colors.Find(delete.CompareColor);

                if (existing != null)
                {
                    set.Colors.Remove(existing);
                    if (set.Colors.Count == 0)
                    {
                        _state.Colors.Remove(set);
                    }
                    _state.UpdateColorSetMap();
                    remove.ResponsePort.Post(DefaultDeleteResponseType.Instance);
                    SendNotification(_submgrPort, remove, Filter.ColorDefinitions.ToString());
                }
                else
                {
                    remove.ResponsePort.Post(
                        Fault.FromCodeSubcodeReason(
                            FaultCodes.Receiver,
                            DsspFaultCodes.UnknownEntry,
                            "Color Definition List does not contain an entry for: " + delete.Name
                            )
                        );
                }
            }
            else
            {
                remove.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Receiver,
                        DsspFaultCodes.UnknownEntry,
                        "Color Set List does not contain an entry for: " + delete.Name
                        )
                    );
            }
        }
예제 #19
0
 public IEnumerator <ITask> InitControllerHandler(InitController init)
 {
     try
     {
         if (Srv1Controller == null)
         {
             InitControllerInternal();
         }
         init.ResponsePort.Post(new DefaultSubmitResponseType());
     }
     catch
     {
         init.ResponsePort.Post(
             Fault.FromCodeSubcodeReason(FaultCodes.Receiver,
                                         DsspFaultCodes.OperationFailed,
                                         "Invalid COM port")
             );
     }
     yield break;
 }
예제 #20
0
        void SensorUpdateHandler(SensorUpdate sensorUpdate)
        {
            int sensorID = sensorUpdate.sensorID;

            if ((sensorID > 0) && (sensorID <= 4))
            {
                //LogInfo("--- Sensor State Updated " + sensorUpdate.value.ToString());
                _state.Sensors[sensorID - 1].value = sensorUpdate.value;
                _subMgrPort.Post(new submgr.Submit(_state, DsspActions.ReplaceRequest));
                sensorUpdate.ResponsePort.Post(new DefaultUpdateResponseType());
            }
            else
            {
                sensorUpdate.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(FaultCodes.Receiver,
                                                DsspFaultCodes.OperationFailed,
                                                "Bad Index")
                    );
            }
        }
        public IEnumerator <ITask> SetSrgsGrammarFileHandler(SetSrgsGrammarFile setSrgsGrammarFile)
        {
            #region Set up load grammar request and load grammar
            // Set up load grammar request
            LoadGrammarRequest loadRequest = new LoadGrammarRequest();
            loadRequest.GrammarType      = GrammarType.Srgs;
            loadRequest.SrgsFileLocation = setSrgsGrammarFile.Body.FileLocation;

            // Load new grammar
            SuccessFailurePort loadGrammarPort = new SuccessFailurePort();
            SpawnIterator <LoadGrammarRequest, SuccessFailurePort>(
                loadRequest,
                loadGrammarPort,
                LoadGrammar
                );

            // Check loading outcome
            yield return((Choice)loadGrammarPort);

            Exception exception = (Exception)loadGrammarPort;
            if (exception != null)
            {
                LogWarning(exception);
                setSrgsGrammarFile.ResponsePort.Post(Fault.FromCodeSubcodeReason(
                                                         FaultCodes.Receiver,
                                                         DsspFaultCodes.OperationFailed,
                                                         exception.Message
                                                         ));
                yield break;
            }
            #endregion

            SaveState(this.state);

            // Notify subscribers of state change
            Replace replace = new Replace();
            replace.Body = this.state;
            SendNotification <Replace>(this.subMgrPort, replace);

            setSrgsGrammarFile.ResponsePort.Post(DefaultUpdateResponseType.Instance);
        }
예제 #22
0
        public IEnumerator <ITask> OnFindColorDefinition(FindColorDefinition find)
        {
            ColorDefinition query    = find.Body;
            ColorSet        existing = _state.Colors.Find(query.Compare);

            if (existing != null)
            {
                find.ResponsePort.Post(existing);
            }
            else
            {
                find.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Receiver,
                        DsspFaultCodes.UnknownEntry,
                        "Color Definition List does not contain an entry for: " + query.Name
                        )
                    );
            }
            yield break;
        }
        public IEnumerator <ITask> HttpQueryHandler(HttpQuery query)
        {
            HttpQueryRequestType request    = query.Body;
            NameValueCollection  parameters = request.Query;
            string cmd = parameters["cmd"];

            if (cmd != null)
            {
                cmd = cmd.ToLowerInvariant();
                switch (cmd)
                {
                case "events":
                    yield return(new IterativeTask(delegate
                    {
                        return EventsHttpQueryHandler(query, parameters);
                    }));

                    yield break;

                case "speechrecognizerstate":
                    yield return(new IterativeTask(delegate
                    {
                        return SpeechRecognizerStateHttpQueryHandler(query);
                    }));

                    yield break;
                }
            }

            // Unknown query
            query.ResponsePort.Post(new HttpResponseType(
                                        HttpStatusCode.BadRequest,
                                        Fault.FromCodeSubcodeReason(
                                            FaultCodes.Sender,
                                            DsspFaultCodes.ActionNotSupported,
                                            "Unknown query"
                                            )
                                        ));
            yield break;
        }
예제 #24
0
        public void UpdateTiltHandler(UpdateTilt update)
        {
            var tilt = update.Body.Tilt;

            // need constants
            if (tilt > (short)kinectSensor.MaxElevationAngle ||
                tilt < (short)kinectSensor.MinElevationAngle)
            {
                update.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Sender,
                        DsspFaultCodes.OperationFailed,
                        Resources.InvalidTiltAngle));
            }
            else
            {
                this.SetKinectTiltAngle((int)tilt);
                this.UpdateTiltAngle(this.state.TiltDegrees);
                update.ResponsePort.Post(DefaultUpdateResponseType.Instance);
                SendNotification(this.submgrPort, update);
            }
        }
예제 #25
0
        /// <summary>
        /// Internal handler, not on public port
        /// </summary>
        /// <param name="sensorConfiguration"></param>
        void SensorConfigurationHandler(SensorConfiguration sensorConfiguration)
        {
            int            sensorID = sensorConfiguration.sensorID;
            string         name     = sensorConfiguration.name;
            Srv1SensorType type     = (Srv1SensorType)sensorConfiguration.type;

            if ((sensorID > 0) && (sensorID <= 4))
            {
                _state.Sensors[sensorID - 1].type = type;
                _state.Sensors[sensorID - 1].name = name;

                sensorConfiguration.ResponsePort.Post(new DefaultUpdateResponseType());
                _subMgrPort.Post(new submgr.Submit(_state, DsspActions.ReplaceRequest));
            }
            else
            {
                sensorConfiguration.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(FaultCodes.Receiver,
                                                DsspFaultCodes.OperationFailed,
                                                "Bad Index")
                    );
            }
        }
예제 #26
0
        public IEnumerator <ITask> ReplaceHandler(bumper.Replace replace)
        {
            if (_subscribed)
            {
                throw new InvalidOperationException("Already subscribed");
            }
            else if (ValidState(replace.Body))
            {
                _bumperConfigState.ContactSensorArrayState = replace.Body;
                SaveState(_bumperConfigState);

                Port <bool> subscribeDonePort = new Port <bool>();
                SpawnIterator <Port <bool> >(subscribeDonePort, SubscribeToNXT);
                yield return(Arbiter.Receive <bool>(false, subscribeDonePort,
                                                    delegate(bool success)
                {
                    if (success)
                    {
                        replace.ResponsePort.Post(DefaultReplaceResponseType.Instance);
                    }
                    else
                    {
                        replace.ResponsePort.Post(
                            Fault.FromCodeSubcodeReason(FaultCodes.Receiver,
                                                        DsspFaultCodes.OperationFailed,
                                                        "LegoNxtBumper service subscription to LEGO NXT Brick failed")
                            );
                    }
                }));
            }
            else
            {
                throw new InvalidOperationException("Invalid State");
            }

            yield break;
        }
예제 #27
0
        public IEnumerator <ITask> LogHandler(Log log)
        {
#if URT_MINCLR
            if (log.Body.Base == 0 ||
                log.Body.Base == math.E)
            {
                log.ResponsePort.Post(new Response(math.Log(log.Body.A)));
            }
            else if (log.Body.Base == 10)
            {
                log.ResponsePort.Post(new Response(math.Log10(log.Body.A)));
            }
            else
            {
                log.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        FaultCodes.Receiver,
                        DsspFaultCodes.ActionNotSupported,
                        "Only natural logarithms and logarithms in base 10 are supported."
                        )
                    );
            }
#else
            double logbase;

            if (log.Body.Base == 0)
            {
                logbase = math.E;
            }
            else
            {
                logbase = log.Body.Base;
            }
            log.ResponsePort.Post(new Response(math.Log(log.Body.A, logbase)));
#endif
            yield break;
        }
예제 #28
0
        void UpdateFormatInternal(UpdateFormat update)
        {
            Format format = update.Body;

            if (_state.Selected != null &&
                _state.Selected.FrameGrabber != null)
            {
                vision.FrameGrabber grabber = _state.Selected.FrameGrabber;

                grabber.StopCapture();
                grabber.Format = (vision.Format)format;
                grabber.StartCapture();
                _state.Selected.Format = new Format(grabber.Format);
                update.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            }
            else
            {
                update.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(FaultCodes.Receiver,
                                                DsspFaultCodes.OperationFailed,
                                                "No camera is currently selected")
                    );
            }
        }
예제 #29
0
        public IEnumerator <ITask> UpdateFormatHandler(UpdateFormat update)
        {
            Format format = update.Body;

            if (_state.Selected != null &&
                _state.Selected.Started)
            {
                yield return((Choice)StopCapture());

                yield return((Choice)SetFormat(format));

                yield return((Choice)StartCapture());

                _state.Selected.Format = format;
                if (format.MaxFramesPerSecond > 0)
                {
                    _state.Selected.Format.MaxFramesPerSecond = format.MaxFramesPerSecond;
                }
                if (format.MinFramesPerSecond > 0)
                {
                    _state.Selected.Format.MinFramesPerSecond = format.MinFramesPerSecond;
                }
                _state.ImageSize = new physics.Vector2(format.Width, format.Height);
                update.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            }
            else
            {
                update.ResponsePort.Post(
                    Fault.FromCodeSubcodeReason(
                        W3C.Soap.FaultCodes.Receiver,
                        DsspFaultCodes.OperationFailed,
                        "No camera is currently selected"
                        )
                    );
            }
        }
        public IEnumerator <ITask> OnRotateSingle(pantilt.Rotate rotate)
        {
            // Just convert this to a kinect tilt operation
            if (rotate.Body.RotatePanRequest != null &&
                rotate.Body.RotatePanRequest.TargetRotationAngleInRadians != 0)
            {
                rotate.ResponsePort.Post(Fault.FromCodeSubcodeReason(
                                             FaultCodes.Receiver,
                                             DsspFaultCodes.ActionNotSupported,
                                             Resources.PanNotSupported));
                yield break;
            }

            if (rotate.Body.RotateTiltRequest == null)
            {
                // no-op
                rotate.ResponsePort.Post(DefaultUpdateResponseType.Instance);
                yield break;
            }

            if (rotate.Body.RotateTiltRequest.IsMotionCompletionRequiredForResponse != false)
            {
                rotate.ResponsePort.Post(Fault.FromCodeSubcodeReason(
                                             FaultCodes.Receiver,
                                             DsspFaultCodes.ActionNotSupported,
                                             Resources.ResponseOnMotionCompletedNotSupported));
                yield break;
            }

            if (rotate.Body.RotateTiltRequest.TargetAccelerationInRadiansPerSecondSecond != 0)
            {
                LogWarning(Resources.AccelerationIgnored);
            }

            if (rotate.Body.RotateTiltRequest.MaxSpeedInRadiansPerSecond != 0)
            {
                LogWarning(Resources.SpeedIgnored);
            }

            double targetTiltInDegrees;

            if (rotate.Body.RotateTiltRequest.IsRelative)
            {
                targetTiltInDegrees =
                    this.state.TiltDegrees + (rotate.Body.RotateTiltRequest.TargetRotationAngleInRadians * DegreesPerRadian);
            }
            else
            {
                targetTiltInDegrees = rotate.Body.RotateTiltRequest.TargetRotationAngleInRadians * DegreesPerRadian;
            }

            this.panTiltState.TiltState.JointCommand.TargetAngleInRadians = targetTiltInDegrees / DegreesPerRadian;

            var updateTilt = new UpdateTilt
            {
                Body         = { Tilt = targetTiltInDegrees },
                ResponsePort = rotate.ResponsePort
            };

            this.mainPort.Post(updateTilt);

            yield break;
        }