Exemple #1
0
        IEnumerator <ITask> UpdateImage(DateTime dateTime)
        {
            byte[] rgbData = null;
            Size   size    = new Size(0, 0);

            yield return(Arbiter.Choice(_simulatedWebcamServicePort.QueryFrame(),
                                        success =>
            {
                rgbData = success.Frame;
                size = success.Size;
            },
                                        failure =>
            {
                LogError(failure.ToException());
            }));

            if (rgbData != null)
            {
                ComputeGradient(ref rgbData, size);
                UpdateBitmap(rgbData, size);
            }

            Activate(Arbiter.ReceiveWithIterator(false, _dateTimePort, UpdateImage));
            TaskQueue.EnqueueTimer(TimeSpan.FromMilliseconds(60), _dateTimePort);
        }
        IEnumerator <ITask> OnConnectSickLRFHandler(OnConnectSickLRF onConnectSickLRF)
        {
            if (onConnectSickLRF.DriveControl != _driveControl)
            {
                yield break;
            }
            _laserPort     = ServiceForwarder <sicklrf.SickLRFOperations>(onConnectSickLRF.Service);
            _laserShutdown = new Port <Shutdown>();

            sicklrf.ReliableSubscribe subscribe = new sicklrf.ReliableSubscribe(
                new ReliableSubscribeRequestType(5)
                );
            subscribe.NotificationPort         = _laserNotify;
            subscribe.NotificationShutdownPort = _laserShutdown;

            _laserPort.Post(subscribe);

            yield return(Arbiter.Choice(
                             subscribe.ResponsePort,
                             delegate(SubscribeResponseType response)
            {
                LogInfo("Subscribed to " + onConnectSickLRF.Service);
            },
                             delegate(Fault fault)
            {
                _laserShutdown = null;
                LogError(fault);
            }
                             ));
        }
Exemple #3
0
        /// <summary>
        /// This method searches for a primary or alternate contract of the
        /// service that is present in the contracts list.  Requires a
        /// taskQueue to activate tasks on.  Throws NoContractFoundException
        /// in a Fault if one cannot be found.
        /// </summary>
        /// <param name="taskQueue"></param>
        /// <param name="service"></param>
        /// <param name="contracts"></param>
        /// <returns></returns>
        public static PortSet <ServiceInfoType, Fault> FindCompatibleContract(DispatcherQueue taskQueue, Uri service, List <string> contracts)
        {
            PortSet <ServiceInfoType, Fault> returnPort = new PortSet <ServiceInfoType, Fault>();

            PortSet <LookupResponse, Fault> responsePort = new PortSet <LookupResponse, Fault>();

            //Console.WriteLine("RSUtils: Querying " + service);
            DssEnvironment.ServiceForwarderUnknownType(service).PostUnknownType(
                new DsspDefaultLookup()
            {
                Body = new LookupRequestType(), ResponsePort = responsePort
            });
            Arbiter.Activate(taskQueue, Arbiter.Choice <LookupResponse, Fault>(
                                 responsePort,
                                 delegate(LookupResponse resp)
            {
                try
                {
                    //Console.WriteLine("RSUtils: Got response");
                    returnPort.Post(FindCompatibleContract(resp, contracts));
                }
                catch (NoContractFoundException e)
                {
                    returnPort.Post(FaultOfException(e));
                }
            },
                                 delegate(Fault failure)
            {
                returnPort.Post(failure);
            }));

            return(returnPort);
        }
Exemple #4
0
 public virtual void Speak(string message, bool async)
 {
     tts.SayTextRequest streq = new tts.SayTextRequest();
     streq.SpeechText = message;
     if (async)
     {
         ttsPort.SayText(streq);
     }
     else
     {
         AutoResetEvent aevent = new AutoResetEvent(false);
         Arbiter.Activate(DssEnvironment.TaskQueue,
                          Arbiter.Choice(ttsPort.SayText(streq),
                                         delegate(DefaultUpdateResponseType state)
         {
             aevent.Set();
         },
                                         delegate(Fault f)
         {
             aevent.Set();
         }
                                         ));
         aevent.WaitOne(1000, false);
     }
 }
        IEnumerator <ITask> OnConnectHandler(OnConnect onConnect)
        {
            if (onConnect.DriveControl == _driveControl)
            {
                UriBuilder builder = new UriBuilder(onConnect.Service);
                builder.Scheme = new Uri(ServiceInfo.Service).Scheme;

                ds.DirectoryPort port = ServiceForwarder <ds.DirectoryPort>(builder.Uri);
                ds.Get           get  = new ds.Get();

                port.Post(get);
                ServiceInfoType[] list = null;

                yield return(Arbiter.Choice(get.ResponsePort,
                                            delegate(ds.GetResponseType response)
                {
                    list = response.RecordList;
                },
                                            delegate(Fault fault)
                {
                    list = new ServiceInfoType[0];
                    LogError(fault);
                }
                                            ));

                WinFormsServicePort.FormInvoke(
                    delegate()
                {
                    _driveControl.ReplaceDirectoryList(list);
                }
                    );
            }
        }
Exemple #6
0
        void TimerHandler(DateTime signal)
        {
            legoNXT.LegoGetBatteryLevel getBatt = new legoNXT.LegoGetBatteryLevel();
            getBatt.RequireResponse = true;
            Activate(Arbiter.Choice(_legoPort.SendLegoCommand(getBatt),
                                    delegate(legoNXT.LegoResponse status)
            {
                legoNXT.LegoResponseGetBatteryLevel legoResponseGetBatteryLevel = status as legoNXT.LegoResponseGetBatteryLevel;
                if (legoResponseGetBatteryLevel != null && legoResponseGetBatteryLevel.ErrorCode == legoNXT.LegoErrorCode.Success)
                {
                    double voltage             = legoResponseGetBatteryLevel.Voltage;
                    _state.PercentBatteryPower = voltage / 1000.0 / _state.MaxBatteryPower;
                }
            },
                                    delegate(Fault failure)
            {
                LogError(failure);
            }
                                    ));

            //re-call ourselves
            Activate(
                Arbiter.Receive(false, TimeoutPort(_state.PollDelayTime),
                                delegate(DateTime time)
            {
                _timerPort.Post(time);
            }
                                )
                );
        }
Exemple #7
0
        private IEnumerator <ITask> StartIterator(Port <bool> successPort)
        {
            bool success = false;

            InitController init = new InitController();

            _controllerPort.Post(init);
            yield return(Arbiter.Choice(
                             init.ResponsePort,
                             delegate(DefaultSubmitResponseType response)
            {
                // The controller initialized successfully.
                _srv1 = srv1srv.Srv1Service.Srv1Controller;
                success = true;
            },
                             delegate(Fault fault) { }
                             ));

            if (!success)
            {
                successPort.Post(false);
                yield break;
            }

            // Activate service handlers.
            StartBehavior();
            successPort.Post(true);
            yield break;
        }
Exemple #8
0
        public virtual IEnumerator <ITask> ReceiveBluetoothMessageHandler(ReceiveBluetoothMessage query)
        {
            BluetoothMessage response = new BluetoothMessage();
            int inbox = Math.Max(1, Math.Min(10, query.Body.Mailbox)) - 1;

            nxtcmd.LegoMessageRead cmd = new nxtcmd.LegoMessageRead(inbox + 10, inbox, true);
            yield return(Arbiter.Choice(_legoBrickPort.SendNxtCommand(cmd),
                                        delegate(nxtcmd.LegoResponse ok)
            {
                nxtcmd.LegoResponseMessageRead queryResponse = nxtcmd.LegoResponse.Upcast <nxtcmd.LegoResponseMessageRead>(ok);
                if (queryResponse.Success)
                {
                    response.Mailbox = query.Body.Mailbox;
                    response.Message = queryResponse.Message;
                    query.ResponsePort.Post(response);
                }
                else
                {
                    query.ResponsePort.Post(Fault.FromException(new System.IO.IOException(queryResponse.ErrorCode.ToString())));
                }
            },
                                        delegate(Fault fault)
            {
                query.ResponsePort.Post(fault);
            }));

            yield break;
        }
Exemple #9
0
        IEnumerator <ITask> DoStart()
        {
            try
            {
                _utilities = DsspHttpUtilitiesService.Create(Environment);

                RunForm runForm = new RunForm(CreateForm);

                WinFormsServicePort.Post(runForm);
                yield return(Arbiter.Choice(
                                 runForm.pResult,
                                 EmptyHandler,
                                 EmptyHandler
                                 ));

                FormInvoke invoke = new FormInvoke(
                    delegate
                {
                    _form.Initialize(_state);
                }
                    );

                WinFormsServicePort.Post(invoke);
                yield return(Arbiter.Choice(
                                 invoke.ResultPort,
                                 EmptyHandler,
                                 EmptyHandler
                                 ));
            }
            finally
            {
                FinishStarting();
            }
        }
Exemple #10
0
        public virtual IEnumerator <ITask> QueryRunningLegoProgramHandler(QueryRunningProgram query)
        {
            RunningProgramResponse response = new RunningProgramResponse();

            nxtcmd.LegoGetCurrentProgramName cmd = new nxtcmd.LegoGetCurrentProgramName();
            yield return(Arbiter.Choice(_legoBrickPort.SendNxtCommand(cmd),
                                        delegate(nxtcmd.LegoResponse ok)
            {
                nxtcmd.LegoResponseGetCurrentProgramName queryResponse = nxtcmd.LegoResponse.Upcast <nxtcmd.LegoResponseGetCurrentProgramName>(ok);
                if (queryResponse.Success)
                {
                    response.Program = queryResponse.FileName;
                    query.ResponsePort.Post(response);
                }
                else
                {
                    query.ResponsePort.Post(Fault.FromException(new System.IO.FileNotFoundException(queryResponse.ErrorCode.ToString())));
                }
            },
                                        delegate(Fault fault)
            {
                query.ResponsePort.Post(fault);
            }));

            yield break;
        }
Exemple #11
0
        public virtual IEnumerator <ITask> QueryBrickNameHandler(QueryBrickName query)
        {
            BrickNameResponse response = new BrickNameResponse();

            nxtcmd.LegoGetDeviceInfo cmd = new nxtcmd.LegoGetDeviceInfo();
            yield return(Arbiter.Choice(_legoBrickPort.SendNxtCommand(cmd),
                                        delegate(nxtcmd.LegoResponse ok)
            {
                nxtcmd.LegoResponseGetDeviceInfo queryResponse = nxtcmd.LegoResponse.Upcast <nxtcmd.LegoResponseGetDeviceInfo>(ok);
                if (queryResponse.Success)
                {
                    response.BrickName = queryResponse.BrickName;
                    query.ResponsePort.Post(response);
                }
                else
                {
                    query.ResponsePort.Post(Fault.FromException(new System.IO.FileNotFoundException(queryResponse.ErrorCode.ToString())));
                }
            },
                                        delegate(Fault fault)
            {
                query.ResponsePort.Post(fault);
            }));

            yield break;
        }
Exemple #12
0
        public IEnumerator <ITask> IncrementTickHandler(IncrementTick incrementTick)
        {
            _state.Ticks++;
            LogInfo("Tick: " + _state.Ticks);

            // Save the state every 10 ticks
            if (_state.Ticks % 10 == 0)
            {
                LogInfo("Store State");
                #region CODECLIP 03-1
                // SaveState() sends a message so the process is not complete
                // until a response is received. It is good practise to check
                // for a Fault whenever you send a message.
                yield return(Arbiter.Choice(
                                 base.SaveState(_state),
                                 delegate(DefaultReplaceResponseType success) { },
                                 delegate(W3C.Soap.Fault fault)
                {
                    LogError(null, "Unable to store state", fault);
                }
                                 ));

                #endregion
            }

            incrementTick.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }
        public IEnumerator <ITask> IncrementTickHandler(IncrementTick incrementTick)
        {
            _state.Ticks++;
            LogInfo("Tick: " + _state.Ticks);

            #region CODECLIP 04-2
            // Notify all subscribers.
            // The incrementTick message does not contain the tick count.
            base.SendNotification(_submgrPort, incrementTick);
            #endregion

            if (_state.Ticks % 10 == 0)
            {
                LogInfo("Store State");
                yield return(Arbiter.Choice(
                                 base.SaveState(_state),
                                 delegate(DefaultReplaceResponseType success) { },
                                 delegate(W3C.Soap.Fault fault)
                {
                    LogError(null, "Unable to store state", fault);
                }
                                 ));
            }

            incrementTick.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }
Exemple #14
0
        IEnumerator <ITask> UsbDeviceDetached(ProximityBoardUsbDeviceDetached linkDetached)
        {
            Tracer.Trace("TrackRoamerBrickProximityBoardService::UsbDeviceDetached(): " + linkDetached.Description);

            _submgrPort.Post(new submgr.Submit(new ResetType(), DsspActions.SubmitRequest));

            _state.Description = linkDetached.Description;
            _state.LinkState   = "USB Device Detached - closing link to Proximity Board";
            _state.IsConnected = false;

            LogInfo("Closing link to Proximity Board");

            yield return
                (Arbiter.Choice(
                     _pbCommander.Close(),
                     delegate(SuccessResult success)
            {
                _state.LinkState = "USB Device Detached - link to Proximity Board closed";
            },
                     delegate(Exception except)
            {
                _state.LinkState = "USB Device Detached - Error closing link to Proximity Board";
                LogError(except);
            }
                     ));

            _state.LinkState = "USB Device Detached - Proximity Board link closed, waiting 5 seconds";
            LogInfo(_state.LinkState);
            _pbCommander = null;

            SpawnIterator(openDelayMs, StartProximityBoard);

            yield break;
        }
Exemple #15
0
        IEnumerator <ITask> UpdateImage(webcam.WebCamOperations webcamPort, ImageProcessingResultForm webcamForm)
        {
            long timestamp = _stopWatch.ElapsedMilliseconds;

            byte[] rgbData = null;
            Size   size    = new Size(0, 0);

            yield return(Arbiter.Choice(webcamPort.QueryFrame(),
                                        success =>
            {
                rgbData = success.Frame;
                size = success.Size;
            },
                                        failure =>
            {
                LogError(failure.ToException());
            }));

            TaskQueue.Enqueue(new Task(() =>
            {
                if (rgbData != null)
                {
                    ComputeGradient(ref rgbData, size);
                    UpdateBitmap(rgbData, size, webcamForm, timestamp);
                }
            }));
        }
Exemple #16
0
        /// <summary>
        /// Handler called when a particular action on the window is performed
        /// </summary>
        /// <param name="onAction">The action to be performed</param>
        void OnWindowSimulationActionHandler(WindowSimulationSettings.OnAction onAction)
        {
            if (onAction.action == WindowSimulationSettings.OnActionActions.ACTION_BUTTONCLICKED_APPLY)
            {
                // Prepare a request to delete the new multicopter
                var delRequest = new DeleteSimulationEntity(_multicopterEntity);

                // Activate  success / failure handlers
                Activate(
                    Arbiter.Choice <DefaultDeleteResponseType, W3C.Soap.Fault>(
                        delRequest.ResponsePort,
                        // Remove was a success
                        delegate(DefaultDeleteResponseType t)
                {
                    // Create new multicopter based on selection
                    SimulatorAddMulticopterEntity(onAction.multicopterType, onAction.propellerInclination);
                },
                        // Remove failed
                        delegate(W3C.Soap.Fault f)
                {
                    throw new NotImplementedException();
                }
                        )
                    );

                // Remove the old multicopter
                SimulationEngine.GlobalInstancePort.Post(delRequest);
            }
        }
        public virtual IEnumerator <ITask> SpotlightHandler(Spotlight spotlight)
        {
            _state.SpotlightOn = spotlight.Body.SpotlightOn;
            LegoSetInputMode cmd = new LegoSetInputMode(_state.SensorPort, _state.SpotlightOn ? LegoSensorType.LightActive : LegoSensorType.LightInactive, LegoSensorMode.PercentFullScaleMode);

            _legoBrickPort.SendNxtCommand(cmd);

            yield return(Arbiter.Choice(_legoBrickPort.SendNxtCommand(cmd),
                                        delegate(LegoResponse response)
            {
                if (response.Success)
                {
                    spotlight.ResponsePort.Post(DefaultUpdateResponseType.Instance);
                    // Spotlight notifications are only sent to subscribers to the native service
                    SendNotification <Spotlight>(_subMgrPort, spotlight);
                }
                else
                {
                    spotlight.ResponsePort.Post(
                        Fault.FromException(
                            new InvalidOperationException(response.ErrorCode.ToString())));
                }
            },
                                        delegate(Fault fault)
            {
                spotlight.ResponsePort.Post(fault);
            }));

            yield break;
        }
Exemple #18
0
        public IEnumerator <ITask> OnFilteredSubscribe(FilteredSubscribe subscribe)
        {
            FilteredSubscribeRequest request = subscribe.Body;

            submgr.InsertSubscriptionMessage message = new submgr.InsertSubscriptionMessage(request);
            if (request.Filter != Filter.None && request.Filter != Filter.All)
            {
                List <submgr.QueryType> queries = new List <submgr.QueryType>();
                for (int i = 1; i < (int)Filter.All; i <<= 1)
                {
                    Filter filter = (Filter)i;
                    if ((request.Filter & filter) == filter)
                    {
                        queries.Add(new submgr.QueryType(filter.ToString()));
                    }
                }
                message.QueryList = queries.ToArray();
            }
            submgr.InsertSubscription insert = new submgr.InsertSubscription(message);

            yield return(Arbiter.Choice(
                             insert.ResponsePort,
                             subscribe.ResponsePort.Post,
                             subscribe.ResponsePort.Post
                             ));
        }
Exemple #19
0
        private void SetActuator_Value(int actuatorID, float?actuatorValue)
        {
            if (actuatorValue == null)
            {
                return;
            }

            InternalSetActuatorValue update = new InternalSetActuatorValue();

            update.actuatorID   = actuatorID;
            update.value        = (float)actuatorValue;
            update.ResponsePort = new DsspResponsePort <DefaultUpdateResponseType>();

            _updatePort.Post(update);

            Activate(
                Arbiter.Choice(update.ResponsePort,
                               delegate(DefaultUpdateResponseType response)
            {
            },
                               delegate(Fault fault)
            {
                LogError("Failed to send notification");
            }
                               ));
        }
Exemple #20
0
        private IEnumerator <ITask> StreamImage(HttpListenerContext context, Bitmap bitmap)
        {
            HttpListenerResponse response = context.Response;

            using (MemoryStream stream = new MemoryStream())
            {
                bitmap.Save(stream, ImageFormat.Png);
                stream.Position = 0;

                response.AddHeader("Cache-Control", "No-cache");

                WriteResponseFromStream write = new WriteResponseFromStream(
                    context, stream, "image/png"
                    );

                _utilitiesPort.Post(write);

                yield return(Arbiter.Choice(
                                 write.ResultPort,
                                 delegate(Stream res)
                {
                    stream.Close();
                },
                                 delegate(Exception e)
                {
                    stream.Close();
                    LogError(e);
                }
                                 ));
            }
        }
Exemple #21
0
        /// <summary>
        /// Overrides RobotBrain Bind function to implement addition LEDAdapter functions.
        /// </summary>
        protected override void Bind()
        {
            base.Bind();

            //Bind to scribbler specific sensors

            //Specialized LED array
            directory.Query dquery = new directory.Query(new directory.QueryRequestType(
                                                             new Microsoft.Dss.ServiceModel.Dssp.ServiceInfoType("http://www.roboteducation.org/scribblerledarray.html")));
            //Uri direcURI = DssEnvironment.FindService(directory.Contract.Identifier);
            //TODO: remove the line below once the above line works
            Uri direcURI = new Uri("http://localhost:" + httpPort + "/directory");

            directory.DirectoryPort dport = DssEnvironment.ServiceForwarder <directory.DirectoryPort>(direcURI);
            dport.Post(dquery);

            Arbiter.Activate(DssEnvironment.TaskQueue,
                             Arbiter.Choice(dquery.ResponsePort,
                                            delegate(directory.QueryResponseType success)
            {
                sledadapter = new ScribblerLEDArrayAdapter(success.RecordList[0].Service);
            },
                                            delegate(Fault fault) { }
                                            )
                             );
        }
        /// <summary>
        /// Handles Replace notifications from the Laser partner
        /// </summary>
        /// <remarks>Posts a <typeparamref name="LaserRangeFinderUpdate"/> to itself.</remarks>
        /// <param name="replace">notification</param>
        /// <returns>task enumerator</returns>
        IEnumerator <ITask> LaserReplaceNotificationHandler(sicklrf.Replace replace)
        {
            //Tracer.Trace("LaserReplaceNotificationHandler() - Replace");

            // When this handler is called a couple of notifications may
            // have piled up. We only want the most recent one.
            sicklrf.State laserData = GetMostRecentLaserNotification(replace.Body);

            LaserRangeFinderUpdate laserUpdate = new LaserRangeFinderUpdate(laserData);

            _mainPort.Post(laserUpdate);    // calls LaserRangeFinderUpdateHandler() with laserUpdate

            yield return(Arbiter.Choice(
                             laserUpdate.ResponsePort,
                             delegate(DefaultUpdateResponseType response) { },
                             delegate(Fault fault) { }
                             ));

            // Skip messages that have been queued up in the meantime.
            // The notification that are lingering are out of date by now.
            GetMostRecentLaserNotification(laserData);

            // Reactivate the handler.
            Activate(
                Arbiter.ReceiveWithIterator <sicklrf.Replace>(false, _laserNotify, LaserReplaceNotificationHandler)
                );

            yield break;
        }
        /// <summary>
        /// Subscribe to motors on Scribbler base
        /// </summary>
        private void SubscribeToScribblerBase()
        {
            // Create a notification port
            brick.ScribblerOperations _notificationPort = new brick.ScribblerOperations();

            //create a custom subscription request
            brick.MySubscribeRequestType request = new brick.MySubscribeRequestType();

            request.Sensors = new List <string>();
            request.Sensors.Add("MOTORS");

            //Subscribe to the ScribblerBase and wait for a response
            Activate(
                Arbiter.Choice(_scribblerPort.SelectiveSubscribe(request, _notificationPort),
                               delegate(SubscribeResponseType Rsp)
            {
                //update our state with subscription status
                _subscribed = true;

                LogInfo("Backup Monitor subscription success");

                //Subscription was successful, start listening for sensor change notifications
                Activate(
                    Arbiter.Receive <brick.Replace>(true, _notificationPort, MotorNotificationHandler)
                    );
            },
                               delegate(soap.Fault F)
            {
                LogError("Backup Monitor subscription failed");
            }
                               )
                );
        }
Exemple #24
0
        void TimerHandler(DateTime signal)
        {
            brick.SetLedBody heartBeat = new brick.SetLedBody();
            heartBeat.LED = _state.whichLED;

            _state.LEDState = !_state.LEDState; //flip LED

            heartBeat.State = _state.LEDState;

            Activate(Arbiter.Choice(_scribblerPort.SetLED(heartBeat),
                                    delegate(DefaultUpdateResponseType status)
            {
                _state.Connected = true;
            },
                                    delegate(Fault failure)
            {
                _state.Connected = false;
                LogError("ScribblerHeartBeat failed to connect to base service");
            }
                                    ));

            //re-call ourselves
            Activate(
                Arbiter.Receive(false, TimeoutPort(_state.PauseTime),
                                delegate(DateTime time)
            {
                _timerPort.Post(time);
            }
                                )
                );
        }
        IEnumerator <ITask> OnConnectArticulatedArmHandler(OnConnectArticulatedArm onConnect)
        {
            arm.ArticulatedArmState armState = null;

            if (onConnect.DriveControl != _driveControl)
            {
                yield break;
            }

            _articulatedArmPort = ServiceForwarder <arm.ArticulatedArmOperations>(onConnect.Service);
            yield return(Arbiter.Choice(
                             _articulatedArmPort.Get(new GetRequestType()),
                             delegate(arm.ArticulatedArmState state) { armState = state; },
                             delegate(Fault f) { LogError(f); }
                             ));

            if (armState == null)
            {
                yield break;
            }

            WinFormsServicePort.FormInvoke(delegate()
            {
                _driveControl.ReplaceArticulatedArmJointList(armState);
            });

            yield break;
        }
Exemple #26
0
        public IEnumerator <ITask> SubscribeHandler(webcam.Subscribe subscribe)
        {
#if !URT_MINCLR
            yield return(Arbiter.Choice(
                             SubscribeHelper(_submgrPort, subscribe.Body, subscribe.ResponsePort),
                             delegate(SuccessResult success)
            {
                LogInfo("Subscription from: " + subscribe.Body.Subscriber);
            },
                             delegate(Exception e)
            {
                LogError(null, "Subscription failed", e);
            }
                             ));
#else
            string key = subscribe.Body.Subscriber.ToLower();

            if (!_subscribers.ContainsKey(key))
            {
                Port <DsspOperation> notificationPort = ServiceForwarderUnknownType(new Uri(subscribe.Body.Subscriber));
                _subscribers.Add(key, notificationPort);
            }

            subscribe.ResponsePort.Post(new SubscribeResponseType());
            yield break;
#endif
        }
        IEnumerator <ITask> RandomTurn(Port <bool> done)
        {
            // we turn by issuing motor commands, using reverse polarity for left and right
            // We could just issue a Rotate command but since its a higher level function
            // we cant assume (yet) all our implementations of differential drives support it
            double randomPower = _randomGen.NextDouble();

            drive.SetDrivePowerRequest setPower = new drive.SetDrivePowerRequest(randomPower, -randomPower);

            bool success = false;

            yield return
                (Arbiter.Choice(
                     _drivePort.SetDrivePower(setPower),
                     delegate(DefaultUpdateResponseType rsp) { success = true; },
                     delegate(W3C.Soap.Fault failure)
            {
                // report error but report done anyway. we will attempt
                // to do the next step in wander behavior even if turn failed
                LogError("Failed setting drive power");
            }));

            done.Post(success);
            yield break;
        }
Exemple #28
0
        IEnumerator <ITask> OnDemandFrameHandler(Frame frame)
        {
            InternalFrameRequest request;

            using (Bitmap bmp = frame.Image)
            {
                using (var stream = new MemoryStream())
                {
                    while (_frameRequestPort.Test(out request))
                    {
                        if (request.IsHttpRequest)
                        {
                            if (stream.Length == 0)
                            {
                                frame.Image.Save(stream, request.Format);
                            }
                            stream.Position = 0;

                            yield return(Arbiter.Choice(
                                             WriteImageToHttpResponse(request.Context, request.Type, stream),
                                             success => stream.Close(),
                                             exception => { stream.Close(); LogWarning("Writing image to HTTP: " + exception.Message); }
                                             ));
                        }
                        else
                        {
                            ReplyToQueryFrame(request.DsspQuery, bmp);
                        }
                        request.ResponsePort.Post(EmptyValue.SharedInstance);
                    }
                }
            }
        }
Exemple #29
0
        public virtual IEnumerator <ITask> PlayToneHandler(tone.PlayTone request)
        {
            if (request.Body.Frequency < 0 || request.Body.Duration < 0)
            {
                LogError("Improper PlayTone Frequency or Duration");
                request.ResponsePort.Post(new Fault());
                yield break;
            }

            brick.PlayToneBody play = new brick.PlayToneBody();
            play.Frequency1 = request.Body.Frequency;
            play.Frequency2 = 0;
            play.Duration   = request.Body.Duration;

            Activate(Arbiter.Choice(_scribblerPort.PlayTone(play),
                                    delegate(DefaultUpdateResponseType response)
            {
                request.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            },
                                    delegate(Fault fault)
            {
                request.ResponsePort.Post(new Fault());
            }
                                    ));

            yield break;
        }
        /// <summary>
        /// Find sensors on the brick which can be added to
        /// our contact sensor array.
        /// </summary>
        /// <returns></returns>
        private IEnumerator <ITask> FindSensors()
        {
            #region Attach to the NXT Brick

            LegoNxtConnection aggregate = new LegoNxtConnection(LegoNxtPort.Aggregation);
            aggregate.PortOverride = "Contact Sensor Array";
            brick.AttachRequest attachRequest = new brick.AttachRequest(
                new brick.Registration(
                    aggregate,
                    LegoDeviceType.Aggregation,
                    "ContactSensorArray",
                    Contract.Identifier,
                    ServiceInfo.Service,
                    "ContactSensorArray"));

            yield return(Arbiter.Choice(_legoBrickPort.AttachAndSubscribe(attachRequest, _legoBrickNotificationPort),
                                        delegate(brick.AttachResponse rsp)
            {
            },
                                        delegate(Fault fault)
            {
                LogError("Error in LEGO NXT Contact Sensor Array while attaching to brick", fault);
            }));

            #endregion

            PortSet <brick.NxtBrickState, Fault> brickResponse = _legoBrickPort.Get();
            yield return(Arbiter.Choice(
                             Arbiter.ReceiveWithIterator <brick.NxtBrickState>(false, brickResponse, ProcessBrickState),
                             Arbiter.Receive <Fault>(false, brickResponse, EmptyHandler <Fault>)));

            yield break;
        }