Example #1
0
        public virtual IEnumerator<ITask> HttpPostHandler(HttpPost httpPost)
        {
            Fault fault = null;
            NameValueCollection parameters = new NameValueCollection();

            ReadFormData readForm = new ReadFormData(httpPost);
            _httpUtilities.Post(readForm);

            // Wait for result
            yield return Arbiter.Choice(
                readForm.ResultPort,
                delegate(NameValueCollection col)
                {
                    parameters = col;
                },
                delegate(Exception e)
                {
                    fault = Fault.FromException(e);
                }
            );

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

            if (!string.IsNullOrEmpty(parameters["NewMode"]))
            {
                int mod = int.Parse(parameters["NewMode"]);
                _biclops.setMode(mod);
            }

            if(!string.IsNullOrEmpty(parameters["pos1"]))
            {
                double newr = double.Parse(parameters["pos1"]);
                _biclops.setJointPosition(0, newr);
            }

            if(!string.IsNullOrEmpty(parameters["pos2"]))
            {
                double newr = double.Parse(parameters["pos2"]);
                _biclops.setJointPosition(1, newr);
            }

            HttpResponseType rsp = new HttpResponseType(HttpStatusCode.OK, _state, _transform);
            httpPost.ResponsePort.Post(rsp);

            SaveState(_state);
        }
        public virtual IEnumerator<ITask> HttpPostHandler(HttpPost httpPost)
        {
            string ErrorMessage = String.Empty;
            Fault fault = null;
            NameValueCollection parameters = new NameValueCollection();

            // use helper to read from data
            ReadFormData readForm = new ReadFormData(httpPost);
            _httpUtilities.Post(readForm);

            //wait for result
            yield return Arbiter.Choice(
                readForm.ResultPort,
                delegate(NameValueCollection col)
                {
                    parameters = col;
                },
                delegate(Exception e)
                {
                    fault = Fault.FromException(e);
                    LogError(null, "Error Processing from data", fault);
                    ErrorMessage += e;
                }
            );

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

            bool validDelta = false;
            double[] _delta = new double[2];

            if (!string.IsNullOrEmpty(parameters["delta"]))
            {
                try
                {
                    _delta[0] = double.Parse(parameters["delta"]);
                    _delta[1] = double.Parse(parameters["delta"]);
                    validDelta = true;
                }
                catch (Exception e)
                {
                    string msg = "Could not parse Desired MaxDelta ref value: " + e.Message;
                    LogError(msg);
                    ErrorMessage += msg;
                }
            }
            if (validDelta)
            {
                _state.MaxDelta.dat[0] = _delta[0];
                _state.MaxDelta.dat[1] = _delta[1];
            }

            double[] _ref = new double[2];
            bool validValues = true;

            if (!string.IsNullOrEmpty(parameters["DesPan"]))
            {
                try
                {
                    _ref[0] = double.Parse(parameters["DesPan"]);
                }
                catch (Exception e)
                {
                    string msg = "Could not parse Desired Pan ref value: " + e.Message;
                    LogError(msg);
                    ErrorMessage += msg;
                    validValues = validValues && false;
                }
            }
            if (!string.IsNullOrEmpty(parameters["DesTilt"]))
            {
                try
                {
                    _ref[1] = double.Parse(parameters["DesTilt"]);
                }
                catch (Exception e)
                {
                    string msg = "Could not parse Desired Tilt ref value: " + e.Message;
                    LogError(msg);
                    ErrorMessage += msg;
                    validValues = validValues && false;
                }
            }

            if (!string.IsNullOrEmpty(parameters["lock"]))
            {
                try
                {
                    _state.Lock = true;
                }
                catch (Exception e)
                {
                    string msg = "Could not parse Lock check: " + e.Message;
                    LogError(msg);
                    ErrorMessage += msg;
                }
            }
            else
            {
                Console.WriteLine("Lock set to false");
                _state.Lock = false;
                newDesiredJointPositions = true;
            }

            if (validValues)
            {
                // scale down here...
                _state.DesiredJointAngles.dat[0] = _ref[0];
                _state.DesiredJointAngles.dat[1] = _ref[1];
            }

            if (!string.IsNullOrEmpty(parameters["Home"]))
            {
                /*
                Console.WriteLine("BiclopsRightCameraJointConfiguration::Home()");
                _biclopsPort.Post(new biclops.Home());
                _state.Lock = true;
                Activate(
                Arbiter.Choice(
                    _biclopsPort.Home(new biclops.HomeRequest()),
                    delegate(DefaultUpdateResponseType response)
                    {
                        LogError(LogGroups.Console, "got response from Bicops.Home");
                        //Console.WriteLine("got response from Biclops.Home");
                    },
                    delegate(W3C.Soap.Fault failure)
                    {
                        LogError(LogGroups.Console, "Fault posting Bicops.Home");
                        //Console.WriteLine("Fault posting SetJointPositionReference");
                    }));
                 */
            }
            if (!string.IsNullOrEmpty(parameters["Park"]))
            {
                /*
                Console.WriteLine("BiclopsRightCameraJointConfiguration::Park()");
                _biclopsPort.Post(new biclops.Park());
                 */
            }

            if (ErrorMessage == string.Empty)
            {
                httpPost.ResponsePort.Post(new HttpResponseType(HttpStatusCode.OK, _state, _transform));
            }
            else
            {
                fault = Fault.FromCodeSubcodeReason(FaultCodes.Receiver,
                                                    DsspFaultCodes.OperationFailed,
                                                    ErrorMessage);
                httpPost.ResponsePort.Post(new Fault());
            }
            yield break;
        }
Example #3
0
        public IEnumerator<ITask> HttpPostHandler(HttpPost httpPost)
        {
            // Use helper to read form data
            ReadFormData readForm = new ReadFormData(httpPost);
            _httpUtilities.Post(readForm);

            // Wait for result
            Activate(Arbiter.Choice(readForm.ResultPort,
                delegate(NameValueCollection parameters)
                {
                    if (!string.IsNullOrEmpty(parameters["Action"])
                        && parameters["Action"] == "MicrosoftGpsConfig"
                        )
                    {
                        if (parameters["buttonOk"] == "Search")
                        {
                            FindGpsConfig findConfig = new FindGpsConfig();
                            _mainPort.Post(findConfig);
                            Activate(
                                Arbiter.Choice(
                                    Arbiter.Receive<MicrosoftGpsConfig>(false, findConfig.ResponsePort,
                                        delegate(MicrosoftGpsConfig response)
                                        {
                                            HttpPostSuccess(httpPost);
                                        }),
                                    Arbiter.Receive<Fault>(false, findConfig.ResponsePort,
                                        delegate(Fault f)
                                        {
                                            HttpPostFailure(httpPost, f);
                                        })
                                )
                            );

                        }
                        else if (parameters["buttonOk"] == "Connect and Update")
                        {

                            MicrosoftGpsConfig config = (MicrosoftGpsConfig)_state.MicrosoftGpsConfig.Clone();
                            int port;
                            if (int.TryParse(parameters["CommPort"], out port) && port >= 0)
                            {
                                config.CommPort = port;
                                config.PortName = "COM" + port.ToString();
                            }

                            int baud;
                            if (int.TryParse(parameters["BaudRate"], out baud) && GpsConnection.ValidBaudRate(baud))
                            {
                                config.BaudRate = baud;
                            }

                            config.CaptureHistory = ((parameters["CaptureHistory"] ?? "off") == "on");
                            config.CaptureNmea = ((parameters["CaptureNmea"] ?? "off") == "on");
                            config.RetrackNmea = ((parameters["RetrackNmea"] ?? "off") == "on");

                            Console.WriteLine(string.Format("Switches: CaptureHistory={0}   CaptureNmea={1}   RetrackNmea={2}", config.CaptureHistory, config.CaptureNmea, config.RetrackNmea));

                            Configure configure = new Configure(config);
                            _mainPort.Post(configure);
                            Activate(
                                Arbiter.Choice(
                                    Arbiter.Receive<DefaultUpdateResponseType>(false, configure.ResponsePort,
                                        delegate(DefaultUpdateResponseType response)
                                        {
                                            HttpPostSuccess(httpPost);
                                        }),
                                    Arbiter.Receive<Fault>(false, configure.ResponsePort,
                                        delegate(Fault f)
                                        {
                                            HttpPostFailure(httpPost, f);
                                        })
                                )
                            );
                        }

                    }
                    else
                    {
                        HttpPostFailure(httpPost, null);
                    }
                },
                delegate(Exception Failure)
                {
                    LogError(Failure.Message);
                })
            );
            yield break;
        }
        public IEnumerator<ITask> HttpPostHandler(HttpPost httpPost)
        {
            // Use helper to read form data
            ReadFormData readForm = new ReadFormData(httpPost);
            _httpUtilities.Post(readForm);

            // Wait for result
            Activate(Arbiter.Choice(readForm.ResultPort,
                delegate(NameValueCollection parameters)
                {
                    if (!string.IsNullOrEmpty(parameters["Action"])
                        && parameters["Action"] == "ChrUm6OrientationSensorConfig"
                        )
                    {
                        if (parameters["buttonOk"] == "Search")
                        {
                            FindChrConfig findConfig = new FindChrConfig();
                            _mainPort.Post(findConfig);
                            Activate(
                                Arbiter.Choice(
                                    Arbiter.Receive<ChrUm6OrientationSensorConfig>(false, findConfig.ResponsePort,
                                        delegate(ChrUm6OrientationSensorConfig response)
                                        {
                                            HttpPostSuccess(httpPost);
                                        }),
                                    Arbiter.Receive<Fault>(false, findConfig.ResponsePort,
                                        delegate(Fault f)
                                        {
                                            HttpPostFailure(httpPost, f);
                                        })
                                )
                            );

                        }
                        else if (parameters["buttonOk"] == "Connect")
                        {
                            ChrUm6OrientationSensorConfig config = (ChrUm6OrientationSensorConfig)_state.ChrUm6OrientationSensorConfig.Clone();
                            int port;
                            if (int.TryParse(parameters["CommPort"], out port) && port >= 0)
                            {
                                config.CommPort = port;
                                config.PortName = "COM" + port.ToString();
                            }

                            int baud;
                            if (int.TryParse(parameters["BaudRate"], out baud) && ChrConnection.ValidBaudRate(baud))
                            {
                                config.BaudRate = baud;
                            }

                            Configure configure = new Configure(config);
                            _mainPort.Post(configure);
                            Activate(
                                Arbiter.Choice(
                                    Arbiter.Receive<DefaultUpdateResponseType>(false, configure.ResponsePort,
                                        delegate(DefaultUpdateResponseType response)
                                        {
                                            HttpPostSuccess(httpPost);
                                        }),
                                    Arbiter.Receive<Fault>(false, configure.ResponsePort,
                                        delegate(Fault f)
                                        {
                                            HttpPostFailure(httpPost, f);
                                        })
                                )
                            );
                        }
                        else if (parameters["buttonOk"] == "Refresh Data")
                        {
                            HttpPostSuccess(httpPost);
                        }
                        else if (parameters["buttonOk"] == "Set Accelerometer Reference Vector")
                        {
                            ChrUm6OrientationSensorCommand cmd = new ChrUm6OrientationSensorCommand() { Command = "SetAccelRefVector" };
                            SendChrUm6OrientationSensorCommand sCmd = new SendChrUm6OrientationSensorCommand(cmd);

                            _mainPort.Post(sCmd);
                            Activate(
                                Arbiter.Choice(
                                    Arbiter.Receive<DefaultUpdateResponseType>(false, sCmd.ResponsePort,
                                        delegate(DefaultUpdateResponseType response)
                                        {
                                            HttpPostSuccess(httpPost);
                                        }),
                                    Arbiter.Receive<Fault>(false, sCmd.ResponsePort,
                                        delegate(Fault f)
                                        {
                                            HttpPostFailure(httpPost, f);
                                        })
                                )
                            );
                        }
                        else if (parameters["buttonOk"] == "Set Magnetometer Reference Vector")
                        {
                            ChrUm6OrientationSensorCommand cmd = new ChrUm6OrientationSensorCommand() { Command = "SetMagnRefVector" };
                            SendChrUm6OrientationSensorCommand sCmd = new SendChrUm6OrientationSensorCommand(cmd);

                            _mainPort.Post(sCmd);
                            Activate(
                                Arbiter.Choice(
                                    Arbiter.Receive<DefaultUpdateResponseType>(false, sCmd.ResponsePort,
                                        delegate(DefaultUpdateResponseType response)
                                        {
                                            HttpPostSuccess(httpPost);
                                        }),
                                    Arbiter.Receive<Fault>(false, sCmd.ResponsePort,
                                        delegate(Fault f)
                                        {
                                            HttpPostFailure(httpPost, f);
                                        })
                                )
                            );
                        }
                        else if (parameters["buttonOk"] == "Zero Rate Gyros")
                        {
                            ChrUm6OrientationSensorCommand cmd = new ChrUm6OrientationSensorCommand() { Command = "ZeroRateGyros" };
                            SendChrUm6OrientationSensorCommand sCmd = new SendChrUm6OrientationSensorCommand(cmd);

                            _mainPort.Post(sCmd);
                            Activate(
                                Arbiter.Choice(
                                    Arbiter.Receive<DefaultUpdateResponseType>(false, sCmd.ResponsePort,
                                        delegate(DefaultUpdateResponseType response)
                                        {
                                            HttpPostSuccess(httpPost);
                                        }),
                                    Arbiter.Receive<Fault>(false, sCmd.ResponsePort,
                                        delegate(Fault f)
                                        {
                                            HttpPostFailure(httpPost, f);
                                        })
                                )
                            );
                        }
                    }
                    else
                    {
                        HttpPostFailure(httpPost, null);
                    }
                },
                delegate(Exception Failure)
                {
                    LogError(Failure.Message);
                })
            );
            yield break;
        }
Example #5
0
        public IEnumerator <ITask> HttpPostHandler(HttpPost httpPost)
        {
            // Use helper to read form data
            ReadFormData readForm = new ReadFormData(httpPost.Body.Context);

            _httpUtilities.Post(readForm);

            // Wait for result
            Activate(Arbiter.Choice(readForm.ResultPort,
                                    delegate(NameValueCollection parameters)
            {
                if (!string.IsNullOrEmpty(parameters["Action"]) &&
                    parameters["Action"] == "ScribblerConfig")
                {
                    if (parameters["buttonOk"] == "Change" && _state.Connected)
                    {
                        SetNameBody newname    = new SetNameBody(parameters["Name"]);
                        SetName newnamemessage = new SetName(newname);
                        _mainPort.Post(newnamemessage);
                        Activate(
                            Arbiter.Choice(
                                Arbiter.Receive <DefaultUpdateResponseType>(false, newnamemessage.ResponsePort,
                                                                            delegate(DefaultUpdateResponseType response)
                        {
                            HttpPostSuccess(httpPost);
                        }),
                                Arbiter.Receive <Fault>(false, newnamemessage.ResponsePort,
                                                        delegate(Fault f)
                        {
                            HttpPostFailure(httpPost, f.Reason[0].Value);
                        })
                                )
                            );
                    }
                    else if (parameters["buttonOk"] == "Connect" && _state.Connected)
                    {
                        //close down this connection to make a new connection below

                        PollTimer.Close();

                        System.Threading.Thread.Sleep(100);

                        _scribblerCom.Close();

                        _state.Connected = false;
                    }

                    if (parameters["buttonOk"] == "Connect" && !_state.Connected)
                    {
                        int port = 0;
                        int.TryParse(parameters["ComPort"], out port);
                        string name = parameters["Name"];
                        if (!string.IsNullOrEmpty(name) && name.Length > 8)
                        {
                            name = name.Substring(0, 8);
                        }

                        _state.ComPort   = port;
                        _state.RobotName = name;

                        //open Scribbler Communications port
                        if (ConnectToScribbler())
                        {
                            // Listen for a single Serial port request with an acknowledgement
                            Activate(Arbiter.ReceiveWithIterator <SendScribblerCommand>(false, _scribblerComPort, SendScribblerCommandHandler));

                            PollTimer           = new System.Timers.Timer();
                            PollTimer.Interval  = TimerDelay;
                            PollTimer.AutoReset = true;
                            PollTimer.Elapsed  += new System.Timers.ElapsedEventHandler(PollTimer_Elapsed);
                            PollTimer.Start();

                            //play startup tone
                            PlayToneBody startTone   = new PlayToneBody(200, 1000, 2000);
                            PlayTone playToneMessage = new PlayTone(startTone);
                            _mainPort.Post(playToneMessage);

                            Activate(
                                Arbiter.Choice(
                                    Arbiter.Receive <DefaultUpdateResponseType>(false, playToneMessage.ResponsePort,
                                                                                delegate(DefaultUpdateResponseType response)
                            {
                                HttpPostSuccess(httpPost);
                            }),
                                    Arbiter.Receive <Fault>(false, playToneMessage.ResponsePort,
                                                            delegate(Fault f)
                            {
                                HttpPostFailure(httpPost, f.Reason[0].Value);
                            })
                                    )
                                );
                        }
                        else
                        {
                            HttpPostFailure(httpPost, "Connection to Scribbler failed");
                        }
                    }
                }
                else if (!string.IsNullOrEmpty(parameters["Action"]) &&
                         parameters["Action"] == "ScribblerSensors")
                {
                    if (parameters["buttonOk"] == "Poll" && _state.Connected)
                    {
                        ScribblerCommand cmd         = new ScribblerCommand((byte)ScribblerHelper.Commands.GET_ALL);
                        SendScribblerCommand sendcmd = new SendScribblerCommand(cmd);
                        _scribblerComPort.Post(sendcmd);
                        Activate(
                            Arbiter.Choice(
                                Arbiter.Receive <ScribblerResponse>(false, sendcmd.ResponsePort,
                                                                    delegate(ScribblerResponse response)
                        {
                            HttpPostSuccess(httpPost);
                        }),
                                Arbiter.Receive <Fault>(false, sendcmd.ResponsePort,
                                                        delegate(Fault f)
                        {
                            HttpPostFailure(httpPost, f.Reason[0].Value);
                        })
                                )
                            );
                    }
                }
                else if (!string.IsNullOrEmpty(parameters["Action"]) &&
                         parameters["Action"] == "ScribblerMotors")
                {
                    if (parameters["buttonOk"] == "Set" && _state.Connected)
                    {
                        int left  = _state.MotorLeft;
                        int right = _state.MotorRight;
                        int.TryParse(parameters["LeftMotor"], out left);
                        int.TryParse(parameters["RightMotor"], out right);

                        SetMotorsBody setMotorsBody = new SetMotorsBody(left, right);
                        SetMotors setMotorsRequest  = new SetMotors(setMotorsBody);

                        _mainPort.Post(setMotorsRequest);

                        Activate(
                            Arbiter.Choice(
                                Arbiter.Receive <DefaultUpdateResponseType>(false, setMotorsRequest.ResponsePort,
                                                                            delegate(DefaultUpdateResponseType response)
                        {
                            HttpPostSuccess(httpPost);
                        }),
                                Arbiter.Receive <Fault>(false, setMotorsRequest.ResponsePort,
                                                        delegate(Fault f)
                        {
                            HttpPostFailure(httpPost, f.Reason[0].Value);
                        })
                                )
                            );
                    }
                    else if (parameters["buttonOk"] == "All Stop" && _state.Connected)
                    {
                        SetMotorsBody setMotorsBody = new SetMotorsBody(100, 100);
                        SetMotors setMotorsRequest  = new SetMotors(setMotorsBody);

                        _mainPort.Post(setMotorsRequest);

                        Activate(
                            Arbiter.Choice(
                                Arbiter.Receive <DefaultUpdateResponseType>(false, setMotorsRequest.ResponsePort,
                                                                            delegate(DefaultUpdateResponseType response)
                        {
                            HttpPostSuccess(httpPost);
                        }),
                                Arbiter.Receive <Fault>(false, setMotorsRequest.ResponsePort,
                                                        delegate(Fault f)
                        {
                            HttpPostFailure(httpPost, f.Reason[0].Value);
                        })
                                )
                            );
                    }
                }
                else if (!string.IsNullOrEmpty(parameters["Action"]) &&
                         parameters["Action"] == "ScribblerLEDs")
                {
                    if (parameters["buttonOk"] == "Set" && _state.Connected)
                    {
                        bool left   = ((parameters["LeftLED"] ?? "off") == "on");
                        bool center = ((parameters["CenterLED"] ?? "off") == "on");
                        bool right  = ((parameters["RightLED"] ?? "off") == "on");

                        SetAllLedsBody leds   = new SetAllLedsBody(left, center, right);
                        SetAllLEDs setAllLeds = new SetAllLEDs(leds);
                        _mainPort.Post(setAllLeds);

                        Activate(
                            Arbiter.Choice(
                                Arbiter.Receive <DefaultUpdateResponseType>(false, setAllLeds.ResponsePort,
                                                                            delegate(DefaultUpdateResponseType response)
                        {
                            HttpPostSuccess(httpPost);
                        }),
                                Arbiter.Receive <Fault>(false, setAllLeds.ResponsePort,
                                                        delegate(Fault f)
                        {
                            HttpPostFailure(httpPost, f.Reason[0].Value);
                        })
                                )
                            );
                    }
                }
                else if (!string.IsNullOrEmpty(parameters["Action"]) &&
                         parameters["Action"] == "ScribblerSpeaker")
                {
                    if (parameters["buttonOk"] == "Play" && _state.Connected)
                    {
                        int tone1    = 0;
                        int tone2    = 0;
                        int duration = 0;
                        int.TryParse(parameters["Tone1"], out tone1);
                        int.TryParse(parameters["Tone2"], out tone2);
                        int.TryParse(parameters["Duration"], out duration);

                        PlayToneBody playTone    = new PlayToneBody(duration, tone1, tone2);
                        PlayTone playToneMessage = new PlayTone(playTone);
                        _mainPort.Post(playToneMessage);

                        Activate(
                            Arbiter.Choice(
                                Arbiter.Receive <DefaultUpdateResponseType>(false, playToneMessage.ResponsePort,
                                                                            delegate(DefaultUpdateResponseType response)
                        {
                            HttpPostSuccess(httpPost);
                        }),
                                Arbiter.Receive <Fault>(false, playToneMessage.ResponsePort,
                                                        delegate(Fault f)
                        {
                            HttpPostFailure(httpPost, f.Reason[0].Value);
                        })
                                )
                            );
                    }
                }
                else
                {
                    HttpPostFailure(httpPost, "Unknown Http Post");
                }
            },
                                    delegate(Exception Failure)
            {
                LogError(Failure.Message);
            })
                     );
            yield break;
        }
Example #6
0
        public IEnumerator <ITask> HttpPostHandler(HttpPost httpPost)
        {
            // Use helper to read form data
            ReadFormData readForm = new ReadFormData(httpPost);

            _httpUtilities.Post(readForm);

            // Wait for result
            Activate(Arbiter.Choice(readForm.ResultPort,
                                    delegate(NameValueCollection parameters)
            {
                if (!string.IsNullOrEmpty(parameters["Action"]) &&
                    parameters["Action"] == "ChrUm6OrientationSensorConfig"
                    )
                {
                    if (parameters["buttonOk"] == "Search")
                    {
                        FindChrConfig findConfig = new FindChrConfig();
                        _mainPort.Post(findConfig);
                        Activate(
                            Arbiter.Choice(
                                Arbiter.Receive <ChrUm6OrientationSensorConfig>(false, findConfig.ResponsePort,
                                                                                delegate(ChrUm6OrientationSensorConfig response)
                        {
                            HttpPostSuccess(httpPost);
                        }),
                                Arbiter.Receive <Fault>(false, findConfig.ResponsePort,
                                                        delegate(Fault f)
                        {
                            HttpPostFailure(httpPost, f);
                        })
                                )
                            );
                    }
                    else if (parameters["buttonOk"] == "Connect")
                    {
                        ChrUm6OrientationSensorConfig config = (ChrUm6OrientationSensorConfig)_state.ChrUm6OrientationSensorConfig.Clone();
                        int port;
                        if (int.TryParse(parameters["CommPort"], out port) && port >= 0)
                        {
                            config.CommPort = port;
                            config.PortName = "COM" + port.ToString();
                        }

                        int baud;
                        if (int.TryParse(parameters["BaudRate"], out baud) && ChrConnection.ValidBaudRate(baud))
                        {
                            config.BaudRate = baud;
                        }

                        Configure configure = new Configure(config);
                        _mainPort.Post(configure);
                        Activate(
                            Arbiter.Choice(
                                Arbiter.Receive <DefaultUpdateResponseType>(false, configure.ResponsePort,
                                                                            delegate(DefaultUpdateResponseType response)
                        {
                            HttpPostSuccess(httpPost);
                        }),
                                Arbiter.Receive <Fault>(false, configure.ResponsePort,
                                                        delegate(Fault f)
                        {
                            HttpPostFailure(httpPost, f);
                        })
                                )
                            );
                    }
                    else if (parameters["buttonOk"] == "Refresh Data")
                    {
                        HttpPostSuccess(httpPost);
                    }
                    else if (parameters["buttonOk"] == "Set Accelerometer Reference Vector")
                    {
                        ChrUm6OrientationSensorCommand cmd = new ChrUm6OrientationSensorCommand()
                        {
                            Command = "SetAccelRefVector"
                        };
                        SendChrUm6OrientationSensorCommand sCmd = new SendChrUm6OrientationSensorCommand(cmd);

                        _mainPort.Post(sCmd);
                        Activate(
                            Arbiter.Choice(
                                Arbiter.Receive <DefaultUpdateResponseType>(false, sCmd.ResponsePort,
                                                                            delegate(DefaultUpdateResponseType response)
                        {
                            HttpPostSuccess(httpPost);
                        }),
                                Arbiter.Receive <Fault>(false, sCmd.ResponsePort,
                                                        delegate(Fault f)
                        {
                            HttpPostFailure(httpPost, f);
                        })
                                )
                            );
                    }
                    else if (parameters["buttonOk"] == "Set Magnetometer Reference Vector")
                    {
                        ChrUm6OrientationSensorCommand cmd = new ChrUm6OrientationSensorCommand()
                        {
                            Command = "SetMagnRefVector"
                        };
                        SendChrUm6OrientationSensorCommand sCmd = new SendChrUm6OrientationSensorCommand(cmd);

                        _mainPort.Post(sCmd);
                        Activate(
                            Arbiter.Choice(
                                Arbiter.Receive <DefaultUpdateResponseType>(false, sCmd.ResponsePort,
                                                                            delegate(DefaultUpdateResponseType response)
                        {
                            HttpPostSuccess(httpPost);
                        }),
                                Arbiter.Receive <Fault>(false, sCmd.ResponsePort,
                                                        delegate(Fault f)
                        {
                            HttpPostFailure(httpPost, f);
                        })
                                )
                            );
                    }
                    else if (parameters["buttonOk"] == "Zero Rate Gyros")
                    {
                        ChrUm6OrientationSensorCommand cmd = new ChrUm6OrientationSensorCommand()
                        {
                            Command = "ZeroRateGyros"
                        };
                        SendChrUm6OrientationSensorCommand sCmd = new SendChrUm6OrientationSensorCommand(cmd);

                        _mainPort.Post(sCmd);
                        Activate(
                            Arbiter.Choice(
                                Arbiter.Receive <DefaultUpdateResponseType>(false, sCmd.ResponsePort,
                                                                            delegate(DefaultUpdateResponseType response)
                        {
                            HttpPostSuccess(httpPost);
                        }),
                                Arbiter.Receive <Fault>(false, sCmd.ResponsePort,
                                                        delegate(Fault f)
                        {
                            HttpPostFailure(httpPost, f);
                        })
                                )
                            );
                    }
                }
                else
                {
                    HttpPostFailure(httpPost, null);
                }
            },
                                    delegate(Exception Failure)
            {
                LogError(Failure.Message);
            })
                     );
            yield break;
        }
        public IEnumerator <ITask> HttpPostHandler(HttpPost httpPost)
        {
            ReadFormData readForm = new ReadFormData(httpPost);

            _utilities.Post(readForm);

            PortSet <NameValueCollection, Exception> readFormResponsePort = readForm.ResultPort;

            yield return((Choice)readFormResponsePort);

            Exception exception = (Exception)readFormResponsePort;

            if (exception != null)
            {
                LogError(exception);
                httpPost.ResponsePort.Post(Fault.FromException(exception));
                yield break;
            }

            NameValueCollection collection = (NameValueCollection)readFormResponsePort;
            string voice      = collection["Voice"];
            string rate       = collection["Rate"];
            string volume     = collection["Volume"];
            string speechText = collection["SpeechText"];

            PortSet <DefaultUpdateResponseType, Fault> responsePort = null;

            if (!string.IsNullOrEmpty(voice))
            {
                SetVoice setVoice = new SetVoice(new SetVoiceRequest(voice));
                SpawnIterator(setVoice, SetVoiceHandler);

                responsePort = setVoice.ResponsePort;
            }
            else if (!string.IsNullOrEmpty(rate))
            {
                int rateInt;
                if (int.TryParse(rate, out rateInt))
                {
                    SetRate setRate = new SetRate();
                    setRate.Body.Rate = rateInt;
                    SpawnIterator(setRate, SetRateHandler);

                    responsePort = setRate.ResponsePort;
                }
            }
            else if (!string.IsNullOrEmpty(volume))
            {
                int volumeInt;

                if (int.TryParse(volume, out volumeInt))
                {
                    SetVolume setVolume = new SetVolume();
                    setVolume.Body.Volume = volumeInt;
                    SpawnIterator(setVolume, SetVolumeHandler);

                    responsePort = setVolume.ResponsePort;
                }
            }
            else if (!string.IsNullOrEmpty(speechText))
            {
                SayText sayText = new SayText(new SayTextRequest(speechText));
                SpawnIterator(sayText, SayTextHandler);

                responsePort = sayText.ResponsePort;
            }

            if (responsePort != null)
            {
                yield return((Choice)responsePort);

                Fault fault = (Fault)responsePort;
                if (fault != null)
                {
                    LogError("Unable to perform post operation", fault);
                    httpPost.ResponsePort.Post(fault);
                    yield break;
                }
            }

            httpPost.ResponsePort.Post(new HttpResponseType(
                                           HttpStatusCode.OK,
                                           _state,
                                           base.StateTransformPath // Use the transform declared on the State
                                           ));
            yield break;
        }
Example #8
0
        public IEnumerator <ITask> HttpPostHandler(HttpPost post)
        {
            Fault fault = null;
            NameValueCollection collection = null;

            ReadFormData readForm = new ReadFormData(post);

            _utilitiesPort.Post(readForm);

            yield return(Arbiter.Choice(
                             readForm.ResultPort,
                             delegate(NameValueCollection col)
            {
                collection = col;
            },
                             delegate(Exception e)
            {
                fault = Fault.FromException(e);
                LogError(null, "Error processing form data", fault);
            }
                             ));

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

            if (!string.IsNullOrEmpty(collection["ChangeCamera"]))
            {
                string device = string.Empty;
                try
                {
                    device = collection["Camera"];
                }
                catch (Exception e)
                {
                    fault = Fault.FromException(e);
                    LogError(null, "Error reading form data", fault);
                }

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

                UpdateDeviceRequest request = new UpdateDeviceRequest();
                request.Selected.DevicePath = device;

                UpdateDevice update = new UpdateDevice();
                update.Body = request;

                SpawnIterator(update, UpdateDeviceHandler);

                yield return(Arbiter.Choice(
                                 update.ResponsePort,
                                 delegate(DefaultUpdateResponseType success)
                {
                    SaveState(_state);
                },
                                 delegate(Fault f)
                {
                    fault = f;
                    LogError(null, "Unable to change camera", fault);
                }
                                 ));
            }
            else if (!string.IsNullOrEmpty(collection["ChangeFormat"]))
            {
                int    formatIndex = 0;
                Format format      = null;
                try
                {
                    formatIndex = int.Parse(collection["CaptureFormat"]);
                    format      = _state.Selected.SupportedFormats[formatIndex - 1];
                }
                catch (Exception e)
                {
                    fault = Fault.FromException(e);
                    LogError(null, "Error parsing form data", fault);
                }

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

                UpdateFormat update = new UpdateFormat();
                update.Body = format;

                SpawnIterator(update, UpdateFormatHandler);

                yield return(Arbiter.Choice(
                                 update.ResponsePort,
                                 delegate(DefaultUpdateResponseType success)
                {
                    SaveState(_state);
                },
                                 delegate(Fault f)
                {
                    fault = f;
                    LogError(null, "Unable to change format", fault);
                }
                                 ));
            }

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

            post.ResponsePort.Post(new HttpResponseType(HttpStatusCode.OK, _state, _transform));
            yield break;
        }
Example #9
0
        public IEnumerator <ITask> OnHttpPost(HttpPost httpPost)
        {
            HttpListenerContext context    = httpPost.Body.Context;
            NameValueCollection parameters = null;
            Fault fault = null;

            try
            {
                ReadFormData readForm = new ReadFormData(httpPost);
                _utilitiesPort.Post(readForm);

                yield return(Arbiter.Choice(
                                 readForm.ResultPort,
                                 delegate(NameValueCollection success)
                {
                    parameters = success;
                },
                                 delegate(Exception e)
                {
                    LogError("Error reading form data", e);
                    fault = Fault.FromException(e);
                }
                                 ));

                if (fault != null)
                {
                    yield break;
                }

                string name           = string.Empty;
                string deleteName     = null;
                string expandName     = null;
                int    left           = 0;
                int    top            = 0;
                int    width          = 0;
                int    height         = 0;
                int    deleteY        = 0;
                int    deleteCb       = 0;
                int    deleteCr       = 0;
                double threshold      = 1.0;
                int    minBlobSize    = 0;
                bool   showPartial    = false;
                bool   despeckle      = false;
                bool   updateSettings = false;
                bool   save           = false;

                foreach (string key in parameters.Keys)
                {
                    if (key.StartsWith("Delete."))
                    {
                        string[] segments = key.Split('.');

                        deleteName = segments[1];
                        deleteY    = int.Parse(segments[2]);
                        deleteCb   = int.Parse(segments[3]);
                        deleteCr   = int.Parse(segments[4]);
                    }
                    else if (key.StartsWith("ExpandY."))
                    {
                        string[] segments = key.Split('.');

                        expandName = segments[1];
                        deleteY    = int.Parse(segments[2]);
                        deleteCb   = int.Parse(segments[3]);
                        deleteCr   = int.Parse(segments[4]);
                    }
                    else
                    {
                        switch (key)
                        {
                        case "Save":
                            save = true;
                            break;

                        case "Threshold":
                            threshold = double.Parse(parameters[key]);
                            break;

                        case "ShowPartial":
                            showPartial = parameters[key] == "on";
                            break;

                        case "Despeckle":
                            despeckle = parameters[key] == "on";
                            break;

                        case "UpdateSettings":
                            updateSettings = true;
                            break;

                        case "MinBlobSize":
                            minBlobSize = int.Parse(parameters[key]);
                            break;

                        case "New.Left":
                            left = int.Parse(parameters[key]);
                            break;

                        case "New.Top":
                            top = int.Parse(parameters[key]);
                            break;

                        case "New.Width":
                            width = int.Parse(parameters[key]);
                            break;

                        case "New.Height":
                            height = int.Parse(parameters[key]);
                            break;

                        case "New.Name":
                            name = parameters[key].Trim();
                            break;

                        default:
                            break;
                        }
                    }
                }

                if (save)
                {
                    yield return(Arbiter.Choice(
                                     SaveState(_state.SmallCopy),
                                     EmptyHandler,
                                     EmptyHandler
                                     ));
                }
                else if (!string.IsNullOrEmpty(deleteName))
                {
                    ColorDefinition definition = new ColorDefinition(deleteName, deleteY, deleteCb, deleteCr);

                    RemoveColorDefinition remove = new RemoveColorDefinition(definition);

                    OnRemoveColorDefinition(remove);
                }
                else if (!string.IsNullOrEmpty(expandName))
                {
                    ColorDefinition definition = new ColorDefinition(expandName, deleteY, deleteCb, deleteCr);
                    ColorSet        set        = _state.Colors.Find(definition.Compare);
                    if (set != null)
                    {
                        ColorDefinition existing = set.Colors.Find(definition.CompareColor);

                        definition.SigmaCb = existing.SigmaCb;
                        definition.SigmaCr = existing.SigmaCr;
                        if (existing.SigmaY < 1)
                        {
                            definition.SigmaY = 2;
                        }
                        else
                        {
                            definition.SigmaY = 3 * existing.SigmaY / 2;
                        }
                    }

                    UpdateColorDefinition update = new  UpdateColorDefinition(definition);

                    OnUpdateColorDefinition(update);
                }
                else if (updateSettings)
                {
                    UpdateSettings update = new UpdateSettings(
                        new Settings(
                            threshold,
                            showPartial,
                            despeckle,
                            minBlobSize
                            )
                        );

                    OnUpdateSettings(update);
                }
                else
                {
                    webcam.QueryFrameResponse response = null;

                    yield return(Arbiter.Choice(
                                     _webcamPort.QueryFrame(),
                                     delegate(webcam.QueryFrameResponse success)
                    {
                        response = success;
                    },
                                     delegate(Fault failure)
                    {
                        LogError("Unable to query frame for update", failure);
                    }
                                     ));

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

                    int    right     = left + width;
                    int    bottom    = top + height;
                    byte[] data      = response.Frame;
                    int    stride    = data.Length / response.Size.Height;
                    int    rowOffset = left * 3;
                    int    offset;

                    int    r, g, b;
                    int[]  yProjection  = new int[256];
                    int[]  cbProjection = new int[256];
                    int[]  crProjection = new int[256];
                    int    count        = 0;
                    double yMean        = 0;
                    double cbMean       = 0;
                    double crMean       = 0;

                    for (int y = top; y < bottom; y++)
                    {
                        offset = rowOffset + y * stride;

                        for (int x = left; x < right; x++)
                        {
                            b = data[offset++];
                            g = data[offset++];
                            r = data[offset++];

                            ColorDefinition pixel = new ColorDefinition(r, g, b, "pixel");

                            yProjection[pixel.Y]++;
                            cbProjection[pixel.Cb]++;
                            crProjection[pixel.Cr]++;

                            count++;

                            yMean  += pixel.Y;
                            cbMean += pixel.Cb;
                            crMean += pixel.Cr;
                        }
                    }

                    if (count <= 16)
                    {
                        LogError("The area was too small to generalize a color");
                        yield break;
                    }

                    yMean  /= count;
                    cbMean /= count;
                    crMean /= count;

                    double ySigma  = CalculateStdDev(yMean, yProjection, count);
                    double cbSigma = CalculateStdDev(cbMean, cbProjection, count);
                    double crSigma = CalculateStdDev(crMean, crProjection, count);

                    ColorDefinition definition = new ColorDefinition(
                        name,
                        (int)Math.Round(yMean),
                        (int)Math.Round(cbMean),
                        (int)Math.Round(crMean)
                        );
                    definition.SigmaY  = (int)Math.Max(1, Math.Round(2 * ySigma));
                    definition.SigmaCb = (int)Math.Max(1, Math.Round(2 * cbSigma));
                    definition.SigmaCr = (int)Math.Max(1, Math.Round(2 * crSigma));

                    if (!string.IsNullOrEmpty(expandName))
                    {
                        definition.Name = expandName;
                        UpdateColorDefinition update = new UpdateColorDefinition(definition);
                        OnUpdateColorDefinition(update);
                    }
                    else
                    {
                        AddColorDefinition add = new AddColorDefinition(definition);

                        OnAddColorDefinition(add);
                    }
                }
            }
            finally
            {
                httpPost.ResponsePort.Post(new HttpResponseType(HttpStatusCode.OK, _state.SmallCopy, _transform));
            }
        }
Example #10
0
        public IEnumerator <ITask> OnHttpPost(HttpPost post)
        {
            Fault fault = null;

            NameValueCollection parameters = null;

            ReadFormData readForm = new ReadFormData(post);

            _utilities.Post(readForm);
            yield return(Arbiter.Choice(
                             readForm.ResultPort,
                             delegate(NameValueCollection success)
            {
                parameters = success;
            },
                             delegate(Exception e)
            {
                fault = Fault.FromException(e);
            }
                             ));

            string operation = parameters["Operation"];

            if (operation == "UpdateControl")
            {
                UpdateControl message = new UpdateControl();
                FlexControl   update  = message.Body;
                update.Id    = parameters["ID"];
                update.Value = parameters["Value"];
                update.Text  = parameters["Text"];

                FlexControl control = _state.Controls.Find(update.CompareId);

                if (control == null)
                {
                    post.ResponsePort.Post(Fault.FromCodeSubcodeReason(
                                               FaultCodes.Receiver,
                                               DsspFaultCodes.UnknownEntry,
                                               "Cannot find control with ID: " + update.Id
                                               ));
                    yield break;
                }
                update.ControlType = control.ControlType;

                yield return(Arbiter.ExecuteToCompletion(
                                 TaskQueue,
                                 new IterativeTask <UpdateControl>(message, OnUpdateControl)
                                 ));

                post.ResponsePort.Post(new HttpResponseType(DefaultUpdateResponseType.Instance));
            }
            else if (operation == "ButtonPress")
            {
                ButtonPress        message = new ButtonPress();
                ButtonPressRequest request = message.Body;
                request.Id      = parameters["ID"];
                request.Pressed = bool.Parse(parameters["Pressed"]);

                OnButtonPress(message);

                post.ResponsePort.Post(new HttpResponseType(DefaultUpdateResponseType.Instance));
            }
            else
            {
                fault = Fault.FromCodeSubcodeReason(
                    FaultCodes.Receiver,
                    DsspFaultCodes.MessageNotSupported,
                    "Unknown operation: " + operation
                    );
            }

            if (fault != null)
            {
                post.ResponsePort.Post(fault);
                yield break;
            }
        }
Example #11
0
        /// <summary>
        /// Http Post Handler.  Handles http form inputs
        /// </summary>
        //[ServiceHandler(ServiceHandlerBehavior.Concurrent)]
        public IEnumerator<ITask> HttpPostHandler(HttpPost httpPost)
        {
            // Use helper to read form data
            ReadFormData readForm = new ReadFormData(httpPost);
            _httpUtilities.Post(readForm);

            // Read form data
            NameValueCollection parameters = null;
            yield return Arbiter.Choice(readForm.ResultPort,
                delegate(NameValueCollection p) { parameters = p; },
                delegate(Exception e) { throw new Exception("Error reading form data", e); });

            // Act on form data
            if (!string.IsNullOrEmpty(parameters["Action"])
                  && parameters["Action"] == "ScribblerConfig")
            {
                if (parameters["buttonOk"] == "Change" && _state.Connected)
                {
                    SetNameBody newname = new SetNameBody(parameters["Name"]);
                    SetName newnamemessage = new SetName(newname);
                    _mainPort.PostUnknownType(newnamemessage);
                    Activate(
                        Arbiter.Choice(
                            Arbiter.Receive<DefaultUpdateResponseType>(false, newnamemessage.ResponsePort,
                                delegate(DefaultUpdateResponseType response)
                                {
                                    HttpPostSuccess(httpPost);
                                }),
                            Arbiter.Receive<Fault>(false, newnamemessage.ResponsePort,
                                delegate(Fault f)
                                {
                                    HttpPostFailure(httpPost, f.Reason[0].Value);
                                })
                        )
                    );

                }
                else if (parameters["buttonOk"] == "Connect" && _state.Connected)
                {
                    //close down this connection to make a new connection below

                    PollTimer.Close();

                    System.Threading.Thread.Sleep(100);

                    _scribblerCom.Close();

                    _state.Connected = false;

                    //HttpPostSuccess(httpPost);
                }

                if (parameters["buttonOk"] == "Connect" && !_state.Connected)
                {
                    int port = 0;
                    int.TryParse(parameters["ComPort"], out port);
                    string name = parameters["Name"];
                    if (!string.IsNullOrEmpty(name) && name.Length > 8)
                        name = name.Substring(0, 8);

                    _state.ComPort = port;
                    _state.RobotName = name;

                    //open Scribbler Communications port
                    LogInfo("connecting to scribbler...");
                    Reconnect rec = new Reconnect();
                    _mainPort.PostUnknownType(rec);
                    yield return Arbiter.Choice(rec.ResponsePort,
                        delegate(DefaultUpdateResponseType r)
                        {
                            LogInfo("connected, sending http reply");
                            HttpPostSuccess(httpPost);
                            LogInfo("http reply sent");
                        },
                        delegate(Fault f)
                        {
                            httpPost.ResponsePort.Post(f);
                        });
                }
            }
            else if (!string.IsNullOrEmpty(parameters["Action"])
                  && parameters["Action"] == "ScribblerSensors")
            {
                if (parameters["buttonOk"] == "Poll" && _state.Connected)
                {
                    ScribblerCommand cmd = new ScribblerCommand(ScribblerHelper.Commands.GET_ALL);
                    SendScribblerCommand sendcmd = new SendScribblerCommand(cmd);
                    _scribblerComPort.Post(sendcmd);
                    Activate(
                        Arbiter.Choice(
                            Arbiter.Receive<ScribblerResponse>(false, sendcmd.ResponsePort,
                                delegate(ScribblerResponse response)
                                {
                                    HttpPostSuccess(httpPost);
                                }),
                            Arbiter.Receive<Fault>(false, sendcmd.ResponsePort,
                                delegate(Fault f)
                                {
                                    HttpPostFailure(httpPost, f.Reason[0].Value);
                                })
                        )
                    );
                }
            }
            else if (!string.IsNullOrEmpty(parameters["Action"])
                && parameters["Action"] == "ScribblerMotors")
            {
                if (parameters["buttonOk"] == "Set" && _state.Connected)
                {
                    int left = _state.MotorLeft;
                    int right = _state.MotorRight;
                    int.TryParse(parameters["LeftMotor"], out left);
                    int.TryParse(parameters["RightMotor"], out right);

                    SetMotorsBody setMotorsBody = new SetMotorsBody(left, right);
                    SetMotors setMotorsRequest = new SetMotors(setMotorsBody);

                    _mainPort.PostUnknownType(setMotorsRequest);

                    Activate(
                        Arbiter.Choice(
                            Arbiter.Receive<DefaultUpdateResponseType>(false, setMotorsRequest.ResponsePort,
                                delegate(DefaultUpdateResponseType response)
                                {
                                    HttpPostSuccess(httpPost);
                                }),
                            Arbiter.Receive<Fault>(false, setMotorsRequest.ResponsePort,
                                delegate(Fault f)
                                {
                                    HttpPostFailure(httpPost, f.Reason[0].Value);
                                })
                        )
                    );
                }
                else if (parameters["buttonOk"] == "All Stop" && _state.Connected)
                {
                    SetMotorsBody setMotorsBody = new SetMotorsBody(100, 100);
                    SetMotors setMotorsRequest = new SetMotors(setMotorsBody);

                    _mainPort.PostUnknownType(setMotorsRequest);

                    Activate(
                        Arbiter.Choice(
                            Arbiter.Receive<DefaultUpdateResponseType>(false, setMotorsRequest.ResponsePort,
                                delegate(DefaultUpdateResponseType response)
                                {
                                    HttpPostSuccess(httpPost);
                                }),
                            Arbiter.Receive<Fault>(false, setMotorsRequest.ResponsePort,
                                delegate(Fault f)
                                {
                                    HttpPostFailure(httpPost, f.Reason[0].Value);
                                })
                        )
                    );
                }
            }
            else if (!string.IsNullOrEmpty(parameters["Action"])
                && parameters["Action"] == "ScribblerLEDs")
            {
                if (parameters["buttonOk"] == "Set" && _state.Connected)
                {
                    bool left = ((parameters["LeftLED"] ?? "off") == "on");
                    bool center = ((parameters["CenterLED"] ?? "off") == "on");
                    bool right = ((parameters["RightLED"] ?? "off") == "on");

                    SetAllLedsBody leds = new SetAllLedsBody(left, center, right);
                    SetAllLEDs setAllLeds = new SetAllLEDs(leds);
                    _mainPort.PostUnknownType(setAllLeds);

                    Activate(
                        Arbiter.Choice(
                            Arbiter.Receive<DefaultUpdateResponseType>(false, setAllLeds.ResponsePort,
                                delegate(DefaultUpdateResponseType response)
                                {
                                    HttpPostSuccess(httpPost);
                                }),
                            Arbiter.Receive<Fault>(false, setAllLeds.ResponsePort,
                                delegate(Fault f)
                                {
                                    HttpPostFailure(httpPost, f.Reason[0].Value);
                                })
                        )
                    );

                }
            }
            else if (!string.IsNullOrEmpty(parameters["Action"])
                && parameters["Action"] == "ScribblerSpeaker")
            {
                if (parameters["buttonOk"] == "Play" && _state.Connected)
                {
                    int tone1 = 0;
                    int tone2 = 0;
                    int duration = 0;
                    int.TryParse(parameters["Tone1"], out tone1);
                    int.TryParse(parameters["Tone2"], out tone2);
                    int.TryParse(parameters["Duration"], out duration);

                    PlayToneBody playTone = new PlayToneBody(duration, tone1, tone2);
                    PlayTone playToneMessage = new PlayTone(playTone);
                    _mainPort.PostUnknownType(playToneMessage);

                    Activate(
                        Arbiter.Choice(
                            Arbiter.Receive<DefaultUpdateResponseType>(false, playToneMessage.ResponsePort,
                                delegate(DefaultUpdateResponseType response)
                                {
                                    HttpPostSuccess(httpPost);
                                }),
                            Arbiter.Receive<Fault>(false, playToneMessage.ResponsePort,
                                delegate(Fault f)
                                {
                                    HttpPostFailure(httpPost, f.Reason[0].Value);
                                })
                        )
                    );
                }
            }
            else
            {
                HttpPostFailure(httpPost, "Unknown Http Post");
            }
            yield break;
        }