Subversion Repositories Projects

Rev

Rev 90 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.312
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using Microsoft.Ccr.Core;
using Microsoft.Dss.Core;
using Microsoft.Dss.Core.Attributes;
using Microsoft.Dss.ServiceModel.Dssp;
using Microsoft.Dss.ServiceModel.DsspServiceBase;
using Microsoft.Dss.Core.DsspHttp;
using System;
using System.Collections.Generic;
using System.Security.Permissions;
using System.ComponentModel;
using System.Xml;
using roboboard = Robotics.RoboBoard;
using submgr = Microsoft.Dss.Services.SubscriptionManager;
using Roboboard = Robotics.Serial;
using Microsoft.Ccr.Adapters.WinForms;
using soap = W3C.Soap;
using dssp = Microsoft.Dss.ServiceModel.Dssp;
using xml = System.Xml;
using W3C.Soap;


namespace Robotics.RoboBoard
{
    /// <summary>
    /// Implementation class for RoboBoard
    /// </summary>
    [DisplayName("RoboBoard")]
    [Description("The RoboBoard Service")]
    [Contract(Contract.Identifier)]
    public class RoboBoardService : DsspServiceBase
    {
        RoboBoardForm _rbForm;
        RoboBoardEvents _eventsPort = new RoboBoardEvents();

        bool subs = false;
        bool isloaded = false;

        private Roboboard.SerialCom sc = new Robotics.Serial.SerialCom();
        /// <summary>
        /// _state
        /// </summary>
        private RoboBoardState _state = new RoboBoardState();
        /// <summary>
        /// _main Port
        /// </summary>
        [ServicePort("/roboboard", AllowMultipleInstances=false)]
        private RoboBoardOperations _mainPort = new RoboBoardOperations();

        [Partner("SubMgr", Contract = submgr.Contract.Identifier, CreationPolicy = PartnerCreationPolicy.CreateAlways)]
        private submgr.SubscriptionManagerPort _submgrPort = new submgr.SubscriptionManagerPort();

        //---------------------------------------------------------------------
        /// <summary>
        /// Default Service Constructor
        /// </summary>
        public RoboBoardService(DsspServiceCreationPort creationPort) :
                base(creationPort)
        {
        }
       
        /// <summary>
        /// Service Start
        /// </summary>
        protected override void Start()
        {
            Activate(Arbiter.Interleave(
                new TeardownReceiverGroup
                (
                ),
                new ExclusiveReceiverGroup
                (
                    Arbiter.ReceiveWithIterator<OnLoad>(true, _eventsPort, OnLoadHandler)
                ),
                new ConcurrentReceiverGroup
                (
                )
            ));
           
            base.Start();
            LogInfo("Init Service..");
                        // Add service specific initialization here.
           
            // Open Status and Debug Dialog
            WinFormsServicePort.Post(new RunForm(CreateForm));

            Roboboard.SerialCom.BotEvent +=new Robotics.Serial.SerialCom.BotEventHandler(sc_BotEvent);
        }

        System.Windows.Forms.Form CreateForm()
        {
            return new RoboBoardForm(_eventsPort);
        }


        //---------------------------------------------------------------------
        /// <summary>
        /// Get Handler
        /// </summary>
        /// <param name="get"></param>
        /// <returns></returns>
        [ServiceHandler(ServiceHandlerBehavior.Concurrent)]
        public virtual IEnumerator<ITask> GetHandler(Get get)
        {
            get.ResponsePort.Post(_state);
            yield break;
        }

        //---------------------------------------------------------------------
        /// <summary>
        /// Http Get Handler
        /// </summary>
        [ServiceHandler(ServiceHandlerBehavior.Concurrent)]
        public IEnumerator<ITask> HttpGetHandler(HttpGet httpGet)
        {
            httpGet.ResponsePort.Post(new HttpResponseType(_state));
            yield break;
        }

        //---------------------------------------------------------------------
        /// <summary>
        /// Replace Handler
        /// </summary>
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public IEnumerator<ITask> ReplaceHandler(Replace replace)
        {
            _state = replace.Body;

//            #region CODECLIP 04-1
//            base.SendNotification(_submgrPort, replace);
//            #endregion

            replace.ResponsePort.Post(DefaultReplaceResponseType.Instance);
            yield break;
        }

        //---------------------------------------------------------------------
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public IEnumerator<ITask> InitComplete(InitComplete initComplete)
        {
            LogInfo("Init");
            LogInfo("Command:" + initComplete.Body.Command);
            yield break;
        }

        //---------------------------------------------------------------------
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public IEnumerator<ITask> SetComPortHandler(SetComPort setComPort)
        {
            LogInfo("Set Port Name ("+setComPort.Body.PortName+")");
            if ((setComPort.Body.PortName == sc.ComPort)&&(sc.isOpen==true))
            {
                LogInfo("no need to change com port");
                // port name equals the old port name - no action
            }
            else
            {
                // port name is different, close the old port and open the new one
                if(sc.isOpen==true) {
                    LogInfo("closing Port");
                    sc.ClosePort();
                }
                sc.ComPort = setComPort.Body.PortName;
                if (_rbForm != null)
                {
                    if (sc.InitPort() == 0)
                    {
                        LogInfo("Init Port succseeded");
                        WinFormsServicePort.FormInvoke(delegate()
                        { _rbForm.UpdateStatus("Port Open (" + sc.ComPort + ")"); });
                    }
                    else
                    {
                        LogInfo("Init Port failed");
                        WinFormsServicePort.FormInvoke(delegate()
                        { _rbForm.UpdateStatus("Can't open communication port (" + sc.ComPort + ")"); });
                    }
                }
                else
                {
                    LogInfo("Board communication not ready! Setport Ignored");
                }
            }
            LogInfo("Exit Set Comport");
            yield break;
        }

        //---------------------------------------------------------------------
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public IEnumerator<ITask> IncrementTickHandler(IncrementTick incrementTick)
        {
            LogInfo("Tick: ");
            LogInfo("Command:" + incrementTick.Body.Command);
       
            base.SendNotification(_submgrPort,  incrementTick);

            incrementTick.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }

        //---------------------------------------------------------------------
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public IEnumerator<ITask> ReceiveCommandHandler(ReceiveCommand receiveCommand)
        {
            LogInfo("Receive ");
            LogInfo("Command:" + receiveCommand.Body.Command);

            base.SendNotification(_submgrPort, receiveCommand);

            receiveCommand.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }

        //---------------------------------------------------------------------
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public IEnumerator<ITask> SendCommandHandler(SendCommand sendCommand)
        {
            LogInfo("Send ");
            LogInfo("Command:" + sendCommand.Body.Command);

            MKRequestTunnelMessage(sendCommand.Body.Command);
                       
            base.SendNotification(_submgrPort, sendCommand);
            sendCommand.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }

        //---------------------------------------------------------------------
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public IEnumerator<ITask> LevelHandler(Level level)
        {
            LogInfo("Level ");
            LogInfo("Nick:"+level.Body.Nick+"Roll:"+level.Body.Roll);
            base.SendNotification(_submgrPort, level);
            level.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }

        //---------------------------------------------------------------------
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public IEnumerator<ITask> SetAltituteHandler(SetAltitute setaltitute)
        {
            LogInfo("SetAltitute ");
            LogInfo("Altitute:" + setaltitute.Body.Altitute);
            if (_rbForm != null)
            {
                _rbForm.Control_alt = (Int16)setaltitute.Body.Altitute;
            }
            //TODO: send alt control to MK
            base.SendNotification(_submgrPort, setaltitute);
            setaltitute.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }

        //---------------------------------------------------------------------
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public IEnumerator<ITask> SetGierHandler(SetGier setgier)
        {
            LogInfo("SetGier ");
            LogInfo("SetGier:" + setgier.Body.Gier);
            Int16 igier = (Int16)(((float)128 * setgier.Body.Gier) / (float)1000);
            if (_rbForm != null)
            {
                _rbForm.Control_gier = igier;
            }

            if (MK_latest_gier != igier)
            {
                MK_latest_gier = igier;
                MKRequestControl(MK_latest_nick, MK_latest_roll, MK_latest_gier, MK_latest_gas);
            }
            base.SendNotification(_submgrPort, setgier);
            setgier.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }

        //---------------------------------------------------------------------
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public IEnumerator<ITask> SetGasHandler(SetGas setgas)
        {
            LogInfo("SetGas ");
            LogInfo("SetGas:" + setgas.Body.Gas);
            Int16 igas = (Int16)(((float)128 * setgas.Body.Gas) / (float)1000);
            if (_rbForm != null)
            {
               _rbForm.Control_gas = igas;
            }

            if (MK_latest_gas != igas)
            {
                MK_latest_gas = igas;
                MKRequestControl(MK_latest_nick, MK_latest_roll, MK_latest_gier, MK_latest_gas);
            }

            base.SendNotification(_submgrPort, setgas);
            setgas.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }

        //---------------------------------------------------------------------
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
     
        public IEnumerator<ITask> ControlHandler(Control control)
        {
            LogInfo("Control ");
            LogInfo("Nick:" + control.Body.Nick + " Roll:" +control.Body.Roll);

            Int16 inick = (Int16)(((float)128 * control.Body.Nick) / (float)(-1000));
            Int16 iroll = (Int16)(((float)128 * control.Body.Roll) / (float)(-1000));

            if (_rbForm != null)
            {
                _rbForm.Control_nick = inick;
                _rbForm.Control_roll = iroll;
            }

            if ((MK_latest_roll != iroll) || (MK_latest_nick != inick))
            {
                MK_latest_nick = inick;
                MK_latest_roll = iroll;
                MKRequestControl(MK_latest_nick, MK_latest_roll, MK_latest_gier, MK_latest_gas);
            }

            base.SendNotification(_submgrPort, control);
            control.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }

        //---------------------------------------------------------------------
        [ServiceHandler(ServiceHandlerBehavior.Concurrent)]
        public IEnumerator<ITask> SubscribeHandler(Subscribe subscribe)
        {
            SubscribeRequestType request = subscribe.Body;
            LogInfo("Subscribe request from: " + request.Subscriber);

            yield return Arbiter.Choice(
                SubscribeHelper(_submgrPort, request, subscribe.ResponsePort),
                delegate(SuccessResult success)
                {
                    base.SendNotification<Replace>(_submgrPort, request.Subscriber, _state);
                },
                delegate(Exception e)
                {
                    LogError(null, "Subscribe failed", e);
                }
            );
            if (isloaded)
            {
                base.SendNotification(_submgrPort, new InitComplete("OK"));
            }
            subs = true;
            yield break;
        }

        //---------------------------------------------------------------------
        IEnumerator<ITask> OnLoadHandler(OnLoad onLoad)
        {
            _rbForm = onLoad.RoboBoardForm;
            LogInfo("Loaded Form");
            sc.ComPort = "COM7";
            if (_rbForm != null)
            {
                if (sc.InitPort() == 0)
                {
                    LogInfo("Port Open");
                    WinFormsServicePort.FormInvoke(delegate()
                    {_rbForm.UpdateStatus("Port Open (" + sc.ComPort + ")");});
                }
                else
                {
                    LogInfo("Port failed to Open");
                    WinFormsServicePort.FormInvoke(delegate()
                    {_rbForm.UpdateStatus("Can't open communication port (" + sc.ComPort + ")");});
                }
            }
            //request version
            MKRequestVersion();
            if (subs)
            {
                base.SendNotification(_submgrPort, new InitComplete("OK"));
            }
            isloaded = true;
            yield break;
        }

        //---------------------------------------------------------------------
        void MKRequestTunnelMessage(string message)
        {
            message = sc.CreateMessage((char)'X', (char)0, message);
            sc.SerialWrite(message);
        }

        //---------------------------------------------------------------------
        bool MKRequestSend = false;
        Int16 MK_old_roll = 0;
        Int16 MK_old_nick = 0;
        Int16 MK_old_gier = 0;
        Int16 MK_old_gas = 0;

        Int16 MK_latest_roll = 0;
        Int16 MK_latest_nick = 0;
        Int16 MK_latest_gier = 0;
        Int16 MK_latest_gas = 0;

        void MKRequestControl(Int16 nick, Int16 roll, Int16 gier, Int16 gas)
        {
            string message = "";
            if ((MK_old_gas == gas) &&
                (MK_old_gier == gier) &&
                (MK_old_nick == nick) &&
                (MK_old_roll == roll))
            {
                LogInfo("no update");
                return;
            }
            if (MKRequestSend == true) return;
            LogInfo("Send");
            if (_rbForm != null)
            {
                WinFormsServicePort.FormInvoke(delegate()
                { _rbForm.MonitorMKSensorUpdate(); });
            }
            message = sc.MessageAddInt16(roll, message);
            MK_old_roll = roll;
            message = sc.MessageAddInt16(nick, message);
            MK_old_nick = nick;
            message = sc.MessageAddInt16(gier, message);
            MK_old_gier = gier;
            message = sc.MessageAddInt16(gas, message);
            MK_old_gas = gas;
            message = sc.CreateMessage((char)'C', (char)0, message);
            MKRequestSend = true;
            sc.SerialWrite(message);
        }

        void MKDecodeControl()
        {
            LogInfo("Control OK");
            MKRequestSend = false;
            MKRequestControl(MK_latest_nick, MK_latest_roll, MK_latest_gier, MK_latest_gas);
        }
       
        //---------------------------------------------------------------------
        void MKRequestVersion()
        {
            LogInfo("MK RequestVersion");
            string message = "";
            message=sc.CreateMessage((char)'v', (char)0, message);
            if (sc.isOpen)
            {
                LogInfo("Version Send");
                sc.SerialWrite(message);
            }
        }

        string MKDecodeVersion(string message)
        {
            string Versionstring = "";
            Versionstring += "Version: "+sc.MessageReadByte(message).ToString();
            message=message.Substring(1);
            sc.MessageReadByte(message);
            Versionstring += "." + sc.MessageReadByte(message).ToString();
            message = message.Substring(1);
            sc.MessageReadByte(message);
            Versionstring += " (STEP:" + sc.MessageReadByte(message).ToString()+")";
            if (_rbForm != null)
            {
                WinFormsServicePort.FormInvoke(delegate()
                { _rbForm.UpdateStatus(Versionstring); });
            }
            return Versionstring;
        }

        //---------------------------------------------------------------------
        void MKDecodeDebugData(string message)
        {
            Int16[] analog = new Int16[32];
            byte[] digital = new byte[2];
            int i = 0;
            for (i = 0; i < 2; i++)
            {
                digital[i]=sc.MessageReadByte(message);
                message = message.Substring(1);
            }
            for (i = 0; i < 32; i++)
            {
                analog[i] = sc.MessageReadInt16(message);

                Int16 analogx = (Int16)analog[i];
                if (_rbForm != null)
                {
                    _rbForm.MK_analog[i]= analog[i];
                    _rbForm.Mk_analog_name[i] = "Analog" + i.ToString();
                        //WinFormsServicePort.FormInvoke(delegate()
                        //{ _rbForm.MonitorMKSensor(i,analogx,"Analog"+i.ToString()); });
                }
                message = message.Substring(2);
            }
            if (_rbForm != null)
            {
                WinFormsServicePort.FormInvoke(delegate()
                { _rbForm.MonitorMKSensorUpdate(); });
            }
            base.SendNotification(_submgrPort, new Level((int)analog[0], (int)analog[1]));
        }

        //---------------------------------------------------------------------
        void sc_BotEvent(object sender, EventArgs ev)
        {

            string message = "";
            char cmd = (char)0;
            char adr = (char)0;
            if (sc.IsMessageValid() == true)
            {
                message = sc.GetLastMessage();
                cmd = sc.GetMessageCmd();
                adr = sc.GetMessageAdr();
                    if (cmd.CompareTo((char)'V')==0)
                    {
                        MKDecodeVersion(message);
                        base.SendNotification(_submgrPort, new ReceiveCommand("V"+message));
                    }
                else
                    if (cmd.CompareTo((char)'D') == 0)
                    {
                        MKDecodeDebugData(message);
                        //base.SendNotification(_submgrPort, new ReceiveCommand("D"+message));
                    }
                else
                    if (cmd.CompareTo((char)'X') == 0)
                    {
                        base.SendNotification(_submgrPort, new ReceiveCommand(message));
                    }
                else
                    if (cmd.CompareTo((char)'C') == 0)
                    {
                        MKDecodeControl();                      
                    }

                sc.InvalidateMessage();
            }

            if (_rbForm != null)
            {
                WinFormsServicePort.FormInvoke(delegate()
                { _rbForm.MonitorCommand(message); });
            }
        }
    }
}