Exemple #1
0
        private void VesselControls()
        {
            CPacket = (ControlPacket)ByteArrayToStructure(buffer, CPacket);

            VControls.SAS           = BitMathByte(CPacket.MainControls, 7);
            VControls.RCS           = BitMathByte(CPacket.MainControls, 6);
            VControls.Lights        = BitMathByte(CPacket.MainControls, 5);
            VControls.Gear          = BitMathByte(CPacket.MainControls, 4);
            VControls.Brakes        = BitMathByte(CPacket.MainControls, 3);
            VControls.Precision     = BitMathByte(CPacket.MainControls, 2);
            VControls.Abort         = BitMathByte(CPacket.MainControls, 1);
            VControls.Stage         = BitMathByte(CPacket.MainControls, 0);
            VControls.Pitch         = (float)CPacket.Pitch / 1000.0F;
            VControls.Roll          = (float)CPacket.Roll / 1000.0F;
            VControls.Yaw           = (float)CPacket.Yaw / 1000.0F;
            VControls.TX            = (float)CPacket.TX / 1000.0F;
            VControls.TY            = (float)CPacket.TY / 1000.0F;
            VControls.TZ            = (float)CPacket.TZ / 1000.0F;
            VControls.WheelSteer    = (float)CPacket.WheelSteer / 1000.0F;
            VControls.Throttle      = (float)CPacket.Throttle / 1000.0F;
            VControls.WheelThrottle = (float)CPacket.WheelThrottle / 1000.0F;
            VControls.SASMode       = (int)CPacket.SASMode;

            for (int j = 1; j <= 10; j++)
            {
                VControls.ControlGroup[j] = BitMathUshort(CPacket.ControlGroup, j);
            }

            ControlReceived = true;
            //Debug.Log("KSPSerialIO: ControlPacket received");
        }
        public void send(ControlPacket packet)
        {
            //ControlPacket packet = new ControlPacket(ControlInterface.CALL_REQUEST, 0, resourceIdentifier);
            string data = JMessage.Serialize(JMessage.FromValue(packet));

            writer.Write(data);
        }
Exemple #3
0
        public static VesselControls CPToVC(ControlPacket cp)
        {
            VesselControls vc = new VesselControls
            {
                SAS    = (cp.MainControls & (1 << 0)) != 0,
                RCS    = (cp.MainControls & (1 << 1)) != 0,
                Lights = (cp.MainControls & (1 << 2)) != 0,
                Gear   = (cp.MainControls & (1 << 3)) != 0,
                Brakes = (cp.MainControls & (1 << 4)) != 0,
                Abort  = (cp.MainControls & (1 << 5)) != 0,
                Stage  = (cp.MainControls & (1 << 6)) != 0,

                SASMode   = (int)cp.SASMode,
                SpeedMode = (int)cp.SpeedMode,

                targetHeading = cp.targetHeading,
                targetPitch   = cp.targetPitch,
                targetRoll    = cp.targetRoll,

                timeWarpRateIndex = cp.timeWarpRateIndex,

                ActionGroups = new Boolean[10],
            };

            for (int j = 0; j < 10; j++)
            {
                vc.ActionGroups[j] = (cp.ActionGroups & (1 << j)) != 0;
            }
            return(vc);
        }
Exemple #4
0
        public static AxisControls CPToAC(ControlPacket cp)
        {
            AxisControls ac = new AxisControls
            {
                SASTol = cp.SASTol,

                RotMode = cp.ControlerMode & 0b00000011,
                Pitch   = (float)cp.Pitch / 1000.0F,
                Roll    = (float)cp.Roll / 1000.0F,
                Yaw     = (float)cp.Yaw / 1000.0F,

                TransMode = (cp.ControlerMode & 0b00001100) >> 2,
                TX        = (float)cp.TX / 1000.0F,
                TY        = (float)cp.TY / 1000.0F,
                TZ        = (float)cp.TZ / 1000.0F,

                ThrottleMode = (cp.ControlerMode & 0b00110000) >> 4,
                Throttle     = (float)cp.Throttle / 1000.0F,

                WheelMode     = (cp.ControlerMode & 0b11000000) >> 6,
                WheelSteer    = (float)cp.WheelSteer / 1000.0F,
                WheelThrottle = (float)cp.WheelThrottle / 1000.0F,
            };

            return(ac);
        }
 protected void NotifyCPacketReceived(ControlPacket CPacket)
 {
     foreach (IPacketHandlerListener l in listeners)
     {
         l.ControlPacketReceived(CPacket);
     }
 }
Exemple #6
0
        public void sendRequest(string clientName, int speed)
        {
            ControlPacket packet = new ControlPacket(ControlInterface.CALL_REQUEST, ControlPacket.IN_PROGRESS, speed, clientName, clientWindowHandler.virtualIP, 0);
            string        data   = JMessage.Serialize(JMessage.FromValue(packet));

            writer.Write(data);
            clientWindowHandler.Log2("CONTROL", " CPCC -> NCC Send Call Request");
        }
Exemple #7
0
        public void sendRelease(int id, string to)
        {
            ControlPacket packet = new ControlPacket(ControlInterface.CALL_RELEASE_IN, ControlPacket.IN_PROGRESS, 0, to, clientWindowHandler.virtualIP, id);
            string        data   = JMessage.Serialize(JMessage.FromValue(packet));

            writer.Write(data);
            clientWindowHandler.Log2("CONTROL", "CPCC -> NCC Send Call Release");
        }
Exemple #8
0
        public void sendInit()
        {
            Address       address = new Address(clientWindowHandler.virtualIP);
            int           cpccID  = address.type + address.domain + address.subnet + address.space;
            ControlPacket packet  = new ControlPacket(ControlInterface.INIT_CPCC_CONNECTION, ControlPacket.IN_PROGRESS, 0, "", clientWindowHandler.virtualIP, cpccID);
            string        data    = JMessage.Serialize(JMessage.FromValue(packet));

            writer.Write(data);
            clientWindowHandler.Log2("CONTROL", "Init CPCC <-> NCC connection");
        }
Exemple #9
0
        /*
         * private static T ReadUsingMarshalUnsafe<T>(byte[] data) where T : struct
         * {
         * unsafe
         * {
         * fixed (byte* p = &data[0])
         * {
         * return (T)Marshal.PtrToStructure(new IntPtr(p), typeof(T));
         * }
         * }
         * }
         */
        void initializeDataPackets()
        {
            VData    = new VesselData();
            VData.id = VDid;

            HPacket    = new HandShakePacket();
            HPacket.id = HSPid;
            HPacket.M1 = 1;
            HPacket.M2 = 2;
            HPacket.M3 = 3;

            CPacket = new ControlPacket();

            VControls.ControlGroup    = new Boolean[11];
            VControlsOld.ControlGroup = new Boolean[11];
        }
        /// <summary>
        /// Handle received packet.
        /// </summary>
        /// <param name="packet">Packet data starting with packet id</param>
        private void InboundPacketHandler(byte[] packet)
        {
            switch (packet[0])
            {
            //Save if correct HS was received
            case HSPid:
                //Debug.Log("[KSPEthernetIO]: HandshakePacket received");
                HandshakePacket HPacket = new HandshakePacket();
                HPacket = (HandshakePacket)ByteArrayToStructure(packet, HPacket);
                _dataReceiveMutex.WaitOne();
                //Check hard coded HS values
                if ((HPacket.M1 == 3) && (HPacket.M2 == 1) && (HPacket.status == 4))
                {
                    Debug.Log("[KSPEthernetIO]: Handshake complete");
                    _handshakeReceived = true;
                }
                else
                {
                    _handshakeReceived = false;
                }
                _dataReceiveMutex.ReleaseMutex();
                break;

            //Stack received ControlPackets
            case Cid:
                //Debug.Log("[KSPEthernetIO]: ControlPacket received");
                _dataReceiveMutex.WaitOne();
                if (_cPacketStack.Count < 256 && _enableControl)
                {
                    ControlPacket cPacket = new ControlPacket();
                    cPacket = (ControlPacket)ByteArrayToStructure(packet, cPacket);
                    _cPacketStack.Push(cPacket);
                    if (_cPacketStack.Count >= 256)
                    {
                        Debug.LogWarning("[KSPEthernetIO]: ControlPacket buffer overflow!");
                    }
                }
                _dataReceiveMutex.ReleaseMutex();
                break;

            default:
                Debug.LogWarning("[KSPEthernetIO]: Packet ID " + packet[0] + " unknown");
                break;
            }
        }
Exemple #11
0
        private void RunRecieve()
        {
            IntPtr ptr = Marshal.AllocHGlobal(256);

            while (Connected)
            {
                // Debug.Log("recieving");
                try
                {
                    Marshal.Copy(ReadBytes(Marshal.SizeOf(typeof(Header))), 0, ptr, Marshal.SizeOf(typeof(Header)));
                    Header header = (Header)Marshal.PtrToStructure(ptr, typeof(Header));

                    if (header.type == 1)
                    {
                        Marshal.Copy(ReadBytes(Marshal.SizeOf(typeof(ControlPacket))), 0, ptr, Marshal.SizeOf(typeof(ControlPacket)));
                        ControlPacket cp = (ControlPacket)Marshal.PtrToStructure(ptr, typeof(ControlPacket));
                        if (cp.ID > lastCPID)
                        {
                            lastCPID = cp.ID;
                            VCList.Enqueue(CPToVC(cp));
                            axisControls = CPToAC(cp);
                        }
                    }
                    else if (header.type == 2)
                    {
                        Marshal.Copy(ReadBytes(Marshal.SizeOf(typeof(ManChangePacket))), 0, ptr, Marshal.SizeOf(typeof(ManChangePacket)));
                        ManChangePacket mcp = (ManChangePacket)Marshal.PtrToStructure(ptr, typeof(ManChangePacket));
                        MCPList.Enqueue(mcp);
                    }
                    else
                    {
                        Debug.Log("Incorrect header");
                    }
                }
                catch (IOException)
                {
                    Debug.Log("Error Recieving");
                    Connected = false;
                }
            }
            Marshal.FreeHGlobal(ptr);
        }
        /// <summary>
        /// Has to be called in the Update() routine. Checks for new Packets in the PacketStack
        /// and creates an Event if new data is avaiable. Event can be received from the PacketHandler
        /// by IPacketHandlerListeners.
        /// </summary>
        public void CheckForNewPacket()
        {
            ControlPacket cPacket    = new ControlPacket();
            bool          newcpacket = false;

            _dataReceiveMutex.WaitOne();

            if (_cPacketStack.Count > 0)
            {
                newcpacket = true;
                cPacket    = _cPacketStack.Pop();
            }

            _dataReceiveMutex.ReleaseMutex();

            if (newcpacket)
            {
                NotifyCPacketReceived(cPacket);
            }
        }
Exemple #13
0
        /// <summary>
        /// Callback for ControlData received event
        /// </summary>
        /// <param name="CPacket">New ControlData</param>
        public void ControlPacketReceived(ControlPacket CPacket)
        {
            //Output for debugging
            packetCounter++;
            double time = Time.unscaledTime;
            double dt   = time - lastUpdateTime;

            if (KSPEthernetIO.Server.ClientConnected && dt > 30)
            {
                lastUpdateTime = time;
                Debug.Log("[KSPEthernetIO]: " + packetCounter + " ControlPackets received [" + 1000 * dt / packetCounter + "ms]");
                packetCounter = 0;
            }
            if (!KSPEthernetIO.Server.ClientConnected)
            {
                lastUpdateTime = Time.unscaledTime;
                packetCounter  = 0;
            }

            //Handle received packet
            control.ControlsReceived(CPacket, data.getVesselSync());
        }
        private void Listen()
        {
            try
            {
                client = new TcpClient("127.0.0.1", this.port);
                BinaryReader reader = new BinaryReader(client.GetStream());
                writer = new BinaryWriter(client.GetStream());
                while (true)
                {
                    string received_data   = reader.ReadString();
                    JSON   received_object = JSON.Deserialize(received_data);
                    Management.ManagmentProtocol received_Protocol = received_object.Value.ToObject <Management.ManagmentProtocol>();
                    if (received_object.Type == typeof(Management.ManagmentProtocol))
                    {
                        Management.ManagmentProtocol management_packet = received_object.Value.ToObject <Management.ManagmentProtocol>();
                        if (management_packet.State == Management.ManagmentProtocol.TOOTHERNCC)
                        {
                            foreach (int port in management_packet.ConnectionToOtherNcc)
                            {
                                TcpClient connection             = new TcpClient("127.0.0.1", port);
                                ControlConnectionService service = new ControlConnectionService(connection, control);
                                Thread.Sleep(500);
                                ControlPacket packetToNCC = new ControlPacket(ControlInterface.NETWORK_CALL_COORDINATION_IN, ControlPacket.IN_PROGRESS, 0, "", "", control.domainNumber);
                                service.send(packetToNCC);
                            }
                        }
                        else if (management_packet.State == Management.ManagmentProtocol.SOFTPERNAMENT)
                        {
                            control.consoleWriter("[NCC <- Management] Soft pernament from " + management_packet.NodeStart + " to " + management_packet.NodeEnd);
                            int     RequestID = control.generateRequestID();
                            Address address   = new Address(management_packet.NodeStart);
                            int     cpccID    = address.type + address.domain + address.subnet + address.space;
                            control.addCpccRequest(RequestID, cpccID);

                            ControlPacket packetToCPCC = new ControlPacket(ControlInterface.CALL_INDICATION_CPCC, ControlPacket.IN_PROGRESS, management_packet.Speed, management_packet.NodeEnd, management_packet.NodeStart, RequestID);
                            packetToCPCC.Vc11 = 1;
                            packetToCPCC.Vc12 = 1;
                            packetToCPCC.Vc13 = 1;
                            ControlConnectionService cpccService = control.getCpccServiceByAddr(management_packet.NodeEnd);
                            cpccService.send(packetToCPCC);
                            control.consoleWriter("[NCC -> CPCC] Send Call Indication");
                        }
                        else if (management_packet.State == Management.ManagmentProtocol.RELEASESOFTPERNAMENT)
                        {
                            int id = management_packet.Connection;
                            control.consoleWriter("[NCC <- CPCC] Call release id: " + id);

                            if (!control.checkIfInterdomainRequest(id))
                            {
                                control.consoleWriter("[NCC -> CC]Send connection release");
                                CCtoNCCSingallingMessage packetToCC = new CCtoNCCSingallingMessage();
                                packetToCC.State     = CCtoNCCSingallingMessage.NCC_RELEASE_WITH_ID;
                                packetToCC.RequestID = id;
                                ControlConnectionService CCService = control.getCCService();
                                CCService.sendCCRequest(packetToCC);
                            }
                            else
                            {
                                control.consoleWriter("[NCC -> CC]Send connection release");
                                CCtoNCCSingallingMessage packetToCC = new CCtoNCCSingallingMessage();
                                packetToCC.State     = CCtoNCCSingallingMessage.NCC_RELEASE_WITH_ID;
                                packetToCC.RequestID = id;
                                ControlConnectionService CCService = control.getCCService();
                                CCService.sendCCRequest(packetToCC);
                            }
                        }
                    }
                }
            }
            catch (SocketException e)
            {
            }
            catch (IOException e)
            {
                Thread.Sleep(1000);
                Environment.Exit(1);
            }
        }
Exemple #15
0
        private void callThread()
        {
            writer = new BinaryWriter(connection.GetStream());
            reader = new BinaryReader(connection.GetStream());

            while (true)
            {
                try
                {
                    string   received_data   = reader.ReadString();
                    JMessage received_object = JMessage.Deserialize(received_data);
                    if (received_object.Type == typeof(ControlPacket))
                    {
                        ControlPacket packet = received_object.Value.ToObject <ControlPacket>();
                        if (packet.virtualInterface == ControlInterface.CALL_ACCEPT)
                        {
                            if (packet.state == ControlPacket.ACCEPT)
                            {
                                clientWindowHandler.addToConnectionCombobox(packet.RequestID, packet.destinationIdentifier);
                                clientWindowHandler.slots.Clear();
                                if (packet.Vc11 != 0)
                                {
                                    clientWindowHandler.slots.Add(11);
                                }
                                if (packet.Vc12 != 0)
                                {
                                    clientWindowHandler.slots.Add(12);
                                }
                                if (packet.Vc13 != 0)
                                {
                                    clientWindowHandler.slots.Add(13);
                                }

                                clientWindowHandler.Log2("CONTROL", "CPCC <- NCC Call Request Accepted");
                            }
                            else
                            {
                                clientWindowHandler.Log2("CONTROL", "CPCC <- NCC Call Request Rejected");
                            }
                        }
                        else if (packet.virtualInterface == ControlInterface.INIT_CPCC_CONNECTION_CONFIRM)
                        {
                            clientWindowHandler.Log2("CONTROL", "CPCC <-> NCC connection established");
                        }
                        else if (packet.virtualInterface == ControlInterface.CALL_INDICATION_CPCC)
                        {
                            clientWindowHandler.Log2("CPCC <- NCC", "Receive Call Indication");
                            ControlPacket packetToNCC = new ControlPacket(ControlInterface.CALL_INDICATION_CPCC_ACCEPT, packet.state, packet.speed, packet.destinationIdentifier, packet.originIdentifier, packet.RequestID);
                            packetToNCC.Vc11 = packet.Vc11;
                            packetToNCC.Vc12 = packet.Vc12;
                            packetToNCC.Vc13 = packet.Vc13;
                            string data = JMessage.Serialize(JMessage.FromValue(packetToNCC));
                            writer.Write(data);
                            clientWindowHandler.Log2("CPCC -> NCC", "Send Call Indication Confirmation");
                        }
                    }
                    else
                    {
                        clientWindowHandler.Log2("CONTROL", "Wrong control packet format");
                    }
                }
                catch (IOException e)
                {
                    clientWindowHandler.Log2("CONTROL", "CPCC <-> NCC Connection closed");
                    break;
                }
            }
        }
        private void ListenThread(Object client)
        {
            TcpClient    clienttmp = (TcpClient)client;
            BinaryReader reader    = new BinaryReader(clienttmp.GetStream());

            writer = new BinaryWriter(clienttmp.GetStream());
            while (true)
            {
                try
                {
                    string   received_data   = reader.ReadString();
                    JMessage received_object = JMessage.Deserialize(received_data);
                    if (received_object.Type == typeof(ControlPacket))
                    {
                        ControlPacket packet = received_object.Value.ToObject <ControlPacket>();
                        if (packet.virtualInterface == ControlInterface.CALL_REQUEST)
                        {
                            //request service cpcc
                            int requestID = handlerNCC.generateRequestID();
                            handlerNCC.addCpccRequest(requestID, myServiceID);
                            handlerNCC.consoleWriter("[NCC <- CPCC] Receive Call Request for " + packet.destinationIdentifier);
                            handlerNCC.consoleWriter("[NCC -> DIRECTORY] Send Directory Request");
                            if (handlerNCC.checkIfInDirectory(packet.destinationIdentifier))
                            {
                                handlerNCC.consoleWriter("[NCC <- DIRECTORY] Receive Local Name");
                                handlerNCC.consoleWriter("[NCC -> POLICY] Send Policy Out");
                                handlerNCC.consoleWriter("[NCC <- POLICY] Call Accept");
                                ControlPacket packetToCPCC = new ControlPacket(ControlInterface.CALL_INDICATION_CPCC, packet.state, packet.speed, packet.destinationIdentifier, packet.originIdentifier, requestID);
                                packetToCPCC.Vc11 = 1;
                                packetToCPCC.Vc12 = 1;
                                packetToCPCC.Vc13 = 1;
                                ControlConnectionService cpccService = handlerNCC.getCpccServiceByAddr(packet.destinationIdentifier);
                                cpccService.send(packetToCPCC);
                                handlerNCC.consoleWriter("[NCC -> CPCC] Send Call Indication");
                            }
                            else
                            {
                                handlerNCC.consoleWriter("[NCC <- DIRECTORY] Directory Request Reject");
                                Address address = new Address(packet.destinationIdentifier);
                                ControlConnectionService serviceToNCC = handlerNCC.getService(address.domain);
                                handlerNCC.addCNAddressesForInterdomainCalls(requestID, packet.originIdentifier);

                                Address       addressFromOtherDomain = new Address(packet.destinationIdentifier);
                                List <string> borderGWAddresses      = new List <string>();
                                borderGWAddresses = handlerNCC.returnBorderGateway(addressFromOtherDomain.domain);
                                string borderGWAddress = borderGWAddresses.First();
                                handlerNCC.initInterdomanCallTask(requestID, borderGWAddress);
                                ControlPacket packetToNCC = new ControlPacket(ControlInterface.CALL_INDICATION, ControlPacket.IN_PROGRESS, packet.speed, packet.destinationIdentifier, borderGWAddress, requestID);
                                packetToNCC.domain = handlerNCC.domainNumber;
                                packetToNCC.Vc11   = 1;
                                packetToNCC.Vc12   = 1;
                                packetToNCC.Vc13   = 1;
                                serviceToNCC.send(packetToNCC);
                                handlerNCC.consoleWriter("[NCC -> NCC]Send Call Coordination: " + packet.destinationIdentifier + " origin(BG address): " + borderGWAddress);
                            }
                        }
                        else if (packet.virtualInterface == ControlInterface.INIT_CPCC_CONNECTION)
                        {
                            handlerNCC.addService(packet.RequestID, this);
                            this.myServiceID = packet.RequestID;
                            ControlPacket packetToCpcc = new ControlPacket(ControlInterface.INIT_CPCC_CONNECTION_CONFIRM, 0, 0, "", "", 0);
                            send(packetToCpcc);
                        }
                        else if (packet.virtualInterface == ControlInterface.CALL_RELEASE_IN)
                        {
                            //RELEASE
                            int id = packet.RequestID;
                            handlerNCC.consoleWriter("[NCC <- CPCC] Call release id: " + id);

                            if (!handlerNCC.checkIfInterdomainRequest(id))
                            {
                                handlerNCC.consoleWriter("[NCC -> CC]Send connection release");
                                CCtoNCCSingallingMessage packetToCC = new CCtoNCCSingallingMessage();
                                packetToCC.State     = CCtoNCCSingallingMessage.NCC_RELEASE_WITH_ID;
                                packetToCC.RequestID = packet.RequestID;
                                ControlConnectionService CCService = this.handlerNCC.getCCService();
                                CCService.sendCCRequest(packetToCC);
                            }
                            else
                            {
                                handlerNCC.consoleWriter("[NCC -> CC]Send connection release");
                                CCtoNCCSingallingMessage packetToCC = new CCtoNCCSingallingMessage();
                                packetToCC.State     = CCtoNCCSingallingMessage.NCC_RELEASE_WITH_ID;
                                packetToCC.RequestID = packet.RequestID;
                                ControlConnectionService CCService = this.handlerNCC.getCCService();
                                CCService.sendCCRequest(packetToCC);
                            }
                        }

                        else if (packet.virtualInterface == ControlInterface.NETWORK_CALL_COORDINATION_IN)
                        {
                            handlerNCC.consoleWriter("[NCC <- NCC] Receive NCC invitation from NCC in domain" + packet.RequestID);
                            handlerNCC.addService(packet.RequestID, this);
                            ControlPacket packetToNCCResponse = new ControlPacket(ControlInterface.NETWORK_CALL_COORDINATION_OUT, ControlPacket.IN_PROGRESS, 0, "", "", handlerNCC.domainNumber);
                            send(packetToNCCResponse);
                            handlerNCC.consoleWriter("[NCC -> NCC] Send invitation response to NCC in domain" + packetToNCCResponse.RequestID);
                        }
                        else if (packet.virtualInterface == ControlInterface.NETWORK_CALL_COORDINATION_OUT)
                        {
                            handlerNCC.consoleWriter("[NCC <- NCC] NCC handshake completed with NCC in doman" + packet.RequestID);
                            handlerNCC.addService(packet.RequestID, this);
                        }
                        else if (packet.virtualInterface == ControlInterface.CALL_INDICATION)
                        {
                            if (packet.state == ControlPacket.IN_PROGRESS)
                            {
                                handlerNCC.consoleWriter("[NCC <- NCC] Recived Call Coordination " + packet.originIdentifier + " to: " + packet.destinationIdentifier);
                                if (handlerNCC.interdomainRequests.ContainsKey(packet.RequestID))
                                {
                                    //Console.WriteLine("KOLEJNA PROBA Z INNYM GW: " + packet.originIdentifier);
                                }
                                else
                                {
                                    handlerNCC.addInterdomainRequest(packet.RequestID, packet.domain);
                                }
                                // ZAKLADAMY TU ZE KAZDE NCC MA HANDLER NA INNE, INACZEJ SPRAWDZ DOMENE CZY TWOJA, NIE TO SLIJ DALEJ
                                handlerNCC.consoleWriter("[NCC -> DIRECTORY] Send Directory Request");
                                handlerNCC.consoleWriter("[NCC <- DIRECTORY] Receive Local Name");
                                handlerNCC.consoleWriter("[NCC -> POLICY] Send Policy Out");
                                handlerNCC.consoleWriter("[NCC <- POLICY] Call Accept");
                                ControlPacket packetToCPCC = new ControlPacket(ControlInterface.CALL_INDICATION_CPCC, packet.state, packet.speed, packet.destinationIdentifier, packet.originIdentifier, packet.RequestID);
                                packetToCPCC.Vc11 = packet.Vc11;
                                packetToCPCC.Vc12 = packet.Vc12;
                                packetToCPCC.Vc13 = packet.Vc13;
                                ControlConnectionService cpccService = handlerNCC.getCpccServiceByAddr(packet.destinationIdentifier);
                                cpccService.send(packetToCPCC);
                                handlerNCC.consoleWriter("[NCC -> CPCC] Send Call Indication");
                            }
                            else if (packet.state == ControlPacket.REJECT)
                            {
                                handlerNCC.consoleWriter("[NCC <- NCC] Receive Call Release, from previous NCC");
                                CCtoNCCSingallingMessage packetToCC = new CCtoNCCSingallingMessage();
                                packetToCC.State     = CCtoNCCSingallingMessage.NCC_RELEASE_WITH_ID;
                                packetToCC.RequestID = packet.RequestID;
                                ControlConnectionService CCService = handlerNCC.getCCService();
                                CCService.sendCCRequest(packetToCC);
                            }
                        }
                        else if (packet.virtualInterface == ControlInterface.CALL_INDICATION_CPCC_ACCEPT)
                        {
                            handlerNCC.consoleWriter("[NCC <- CPCC] Call Indication Confirmed");
                            handlerNCC.consoleWriter("[NCC -> CC]Send Connection Request");
                            CCtoNCCSingallingMessage packetToCC = new CCtoNCCSingallingMessage();
                            packetToCC.State    = CCtoNCCSingallingMessage.NCC_SET_CONNECTION;
                            packetToCC.NodeFrom = packet.originIdentifier;
                            packetToCC.NodeTo   = packet.destinationIdentifier;
                            handlerNCC.rejectedDestinations.Add(packet.RequestID, packet.destinationIdentifier);
                            packetToCC.Rate      = packet.speed;
                            packetToCC.RequestID = packet.RequestID;
                            packetToCC.Vc11      = packet.Vc11;
                            packetToCC.Vc12      = packet.Vc12;
                            packetToCC.Vc13      = packet.Vc13;
                            ControlConnectionService CCService = this.handlerNCC.getCCService();
                            CCService.sendCCRequest(packetToCC);
                        }
                        else if (packet.virtualInterface == ControlInterface.CALL_REQUEST_ACCEPT)
                        {
                            // ZAKLADAMY TU ZE KAZDE NCC MA HANDLER NA INNE, INACZEJ SPRAWDZ DOMENE CZY TWOJA, NIE TO ODESLIJ DALEJ
                            if (packet.state == ControlPacket.ACCEPT)
                            {
                                handlerNCC.consoleWriter("[NCC <- NCC] Call Coordination Accept");

                                CCtoNCCSingallingMessage packetToCC = new CCtoNCCSingallingMessage();
                                packetToCC.State    = CCtoNCCSingallingMessage.NCC_SET_CONNECTION;
                                packetToCC.NodeFrom = handlerNCC.getCNAddressesForInterdomainCalls(packet.RequestID);
                                packetToCC.NodeTo   = packet.destinationIdentifier;
                                handlerNCC.consoleWriter("[NCC->CC]Send Connection Request, from: " + packetToCC.NodeFrom + " to: " + packetToCC.NodeTo);
                                packetToCC.Rate      = packet.speed;
                                packetToCC.RequestID = packet.RequestID;
                                packetToCC.Vc11      = packet.Vc11;
                                packetToCC.Vc12      = packet.Vc12;
                                packetToCC.Vc13      = packet.Vc13;
                                ControlConnectionService CCService = this.handlerNCC.getCCService();
                                CCService.sendCCRequest(packetToCC);
                            }
                            else
                            {
                                //counter--;
                                //if (counter < 0)
                                //    break;
                                handlerNCC.consoleWriter("[NCC <- NCC] Call Coordination Rejected");
                                // handlerNCC.showInterdomainAttemptsForRequestID(packet.RequestID);
                                // Console.WriteLine("Szukam borderow dla ip: " + packet.destinationIdentifier);
                                String anotherBorderGWAddress = handlerNCC.getAnotherBorderGatewayAddress(packet.RequestID, packet.originIdentifier);
                                //Console.WriteLine("Znaleziony border GW: " + anotherBorderGWAddress);
                                if (anotherBorderGWAddress == null)
                                {
                                    //wez service odpowiedni
                                    ControlConnectionService cpccCallService = handlerNCC.getService(handlerNCC.getCpccService(packet.RequestID));
                                    ControlPacket            packetToCPCC    = new ControlPacket(ControlInterface.CALL_ACCEPT, ControlPacket.REJECT, packet.speed, packet.originIdentifier, handlerNCC.getCNAddressesForInterdomainCalls(packet.RequestID), packet.RequestID);
                                    cpccCallService.send(packetToCPCC);
                                    handlerNCC.consoleWriter("[NCC -> CPCC] Call Request Reject");
                                    handlerNCC.clearCNAddressesForInterdomainCalls(packet.RequestID);
                                    handlerNCC.clearInterdomainCallAttempt(packet.RequestID);
                                    handlerNCC.removeCpccRequest(packet.RequestID);
                                    //NIE UDALO SIE U NAS, WYSLAC DO TAMTEGO NCC NIECH ROZLACZY JEDNAK
                                    //W DOMAIN Z TMATEGO NCC JEGO DOMAIN, ZEBY ODESLAC MU NIECH ROZLACZY
                                    // ControlConnectionService nccCallService = handlerNCC.getService(packet.domain);
                                    // ControlPacket packetToNCC = new ControlPacket(ControlInterface.CALL_INDICATION, ControlPacket.REJECT, packet.speed, "BORDER_GATEWAY", packet.destinationIdentifier, packet.RequestID);
                                    //nccCallService.send(packetToNCC);
                                }
                                else
                                {
                                    //Console.WriteLine("Znalazłem nowy border wyjsciowy: " + anotherBorderGWAddress);
                                    handlerNCC.addIntrerdomainCallsAttempts(packet.RequestID, anotherBorderGWAddress);
                                    Address address = new Address(packet.originIdentifier);
                                    ControlConnectionService serviceToNCC = handlerNCC.getService(address.domain);
                                    ControlPacket            packetToNCC  = new ControlPacket(ControlInterface.CALL_INDICATION, ControlPacket.IN_PROGRESS, packet.speed, packet.originIdentifier, anotherBorderGWAddress, packet.RequestID);
                                    packetToNCC.domain = handlerNCC.domainNumber;
                                    packetToNCC.Vc11   = 1;
                                    packetToNCC.Vc12   = 1;
                                    packetToNCC.Vc13   = 1;
                                    packetToNCC.speed  = packet.speed;
                                    handlerNCC.consoleWriter("[NCC -> NCC] Send Call Coordination with another border GW, destination: " + packetToNCC.destinationIdentifier + " borderGW: " + anotherBorderGWAddress);
                                    serviceToNCC.send(packetToNCC);
                                }
                            }
                        }
                    }
                    else if (received_object.Type == typeof(CCtoNCCSingallingMessage))
                    {
                        CCtoNCCSingallingMessage packet = received_object.Value.ToObject <CCtoNCCSingallingMessage>();
                        if (packet.State == CCtoNCCSingallingMessage.INIT_FROM_CC)
                        {
                            handlerNCC.consoleWriter("[NCC <- CC]Connection established");
                            handlerNCC.setCCService(this);
                        }
                        else if (packet.State == CCtoNCCSingallingMessage.CC_CONFIRM)

                        {
                            handlerNCC.consoleWriter("[NCC <- CC] Receive Connection Request Confirm");

                            if (handlerNCC.rejectedDestinations.ContainsKey(packet.RequestID))
                            {
                                handlerNCC.rejectedDestinations.Remove(packet.RequestID);
                            }
                            if (handlerNCC.checkIfInterdomainRequest(packet.RequestID))
                            {
                                ControlConnectionService NCCService = handlerNCC.getService(handlerNCC.getDomainService(packet.RequestID));
                                //Console.WriteLine("[CC]Border gateway to previous ncc: " + packet.NodeTo);
                                //Nodeto GW, NodeFrom CN in other domain address
                                ControlPacket packetToNCC = new ControlPacket(ControlInterface.CALL_REQUEST_ACCEPT, ControlPacket.ACCEPT, packet.Rate, packet.NodeTo, packet.NodeFrom, packet.RequestID);
                                packetToNCC.domain = handlerNCC.domainNumber;
                                packetToNCC.Vc11   = packet.Vc11;
                                packetToNCC.Vc12   = packet.Vc12;
                                packetToNCC.Vc13   = packet.Vc13;
                                NCCService.send(packetToNCC);
                                handlerNCC.clearCNAddressesForInterdomainCalls(packet.RequestID);
                                handlerNCC.consoleWriter("[NCC -> NCC] Send Call Coordination Confirm");
                            }
                            else
                            {
                                ControlConnectionService cpccCallService = handlerNCC.getService(handlerNCC.getCpccService(packet.RequestID));
                                ControlPacket            packetToCPCC    = new ControlPacket(ControlInterface.CALL_ACCEPT, ControlPacket.ACCEPT, packet.Rate, packet.NodeTo, packet.NodeTo, packet.RequestID);
                                List <int> slots = new List <int>();
                                if (packet.Vc11 != 0)
                                {
                                    packetToCPCC.Vc11 = 1;
                                    slots.Add(11);
                                }
                                if (packet.Vc12 != 0)
                                {
                                    packetToCPCC.Vc12 = 1;
                                    slots.Add(12);
                                }
                                if (packet.Vc13 != 0)
                                {
                                    packetToCPCC.Vc13 = 1;
                                    slots.Add(13);
                                }
                                cpccCallService.send(packetToCPCC);
                                handlerNCC.management.send(packet.RequestID, packet.NodeTo);
                                handlerNCC.consoleWriter("[NCC -> CPCC] Send Call Request Accept");
                            }
                        }
                        else if (packet.State == CCtoNCCSingallingMessage.CC_REJECT)
                        {
                            handlerNCC.consoleWriter("[NCC <- CC] Receive Connection Request Reject");
                            if (handlerNCC.checkIfInterdomainRequest(packet.RequestID))
                            {
                                ControlConnectionService NCCService = handlerNCC.getService(handlerNCC.getDomainService(packet.RequestID));
                                //Nodeto GW, NodeFrom CN in other domain address
                                // Console.WriteLine("[CC]Destination node to previous ncc: " + handlerNCC.rejectedDestinations[packet.RequestID]);
                                ControlPacket packetToNCC = new ControlPacket(ControlInterface.CALL_REQUEST_ACCEPT, ControlPacket.REJECT, packet.Rate, packet.NodeTo, handlerNCC.rejectedDestinations[packet.RequestID], packet.RequestID);
                                packetToNCC.domain = handlerNCC.domainNumber;
                                NCCService.send(packetToNCC);
                                handlerNCC.rejectedDestinations.Remove(packet.RequestID);
                                handlerNCC.consoleWriter("[NCC -> NCC] Send Call Coordination Reject");
                            }
                            else
                            {
                                ControlConnectionService cpccCallService = handlerNCC.getService(handlerNCC.getCpccService(packet.RequestID));
                                ControlPacket            packetToCPCC    = new ControlPacket(ControlInterface.CALL_ACCEPT, ControlPacket.REJECT, packet.Rate, packet.NodeTo, packet.NodeTo, packet.RequestID);
                                handlerNCC.consoleWriter("[NCC -> CPCC] Send Call Request Reject");
                                cpccCallService.send(packetToCPCC);
                            }
                        }
                        else if (packet.State == CCtoNCCSingallingMessage.BORDER_NODE)
                        {
                            handlerNCC.consoleWriter("[NCC <- CC]Get border node address: " + packet.BorderNode + " to domain: " + packet.BorderDomain);
                            handlerNCC.addBorderGateway(packet.BorderDomain, packet.BorderNode);
                        }
                    }
                    else
                    {
                        handlerNCC.consoleWriter("Wrong control packet format");
                    }
                }
                catch (IOException e)
                {
                    handlerNCC.consoleWriter("Connection closed");
                    break;
                }
            }
        }
Exemple #17
0
        /**
         * receiver algorithm
         * see specification P11.
         */
        public void ReceiverAlgorithm()
        {
            //check ACK timer
            long currentTime = Util.getCurrentTime();

            if (nextACK < currentTime)
            {
                nextACK = currentTime + ackTimerInterval;
                ProcessACKEvent(true);
            }
            //check NAK timer
            if (nextNAK < currentTime)
            {
                nextNAK = currentTime + nakTimerInterval;
                ProcessNAKEvent();
            }

            //check EXP timer
            if (nextEXP < currentTime)
            {
                nextEXP = currentTime + expTimerInterval;
                ProcessEXPEvent();
            }
            //perform time-bounded UDP receive
            IUDTPacket packet = null;

            handoffQueue.TryTake(out packet, (int)Util.GetSYNTime());
            if (packet != null)
            {
                //reset exp count to 1
                expCount = 1;
                //If there is no unacknowledged data packet, or if this is an
                //ACK or NAK control packet, reset the EXP timer.
                bool needEXPReset = false;
                if (packet.IsControlPacket())
                {
                    ControlPacket cp     = (ControlPacket)packet;
                    int           cpType = cp.GetControlPacketType();
                    if (cpType == (int)ControlPacketType.ACK || cpType == (int)ControlPacketType.NAK)
                    {
                        needEXPReset = true;
                    }
                }
                if (needEXPReset)
                {
                    nextEXP = Util.getCurrentTime() + expTimerInterval;
                }
                if (storeStatistics)
                {
                    processTime.Begin();
                }

                ProcessUDTPacket(packet);

                if (storeStatistics)
                {
                    processTime.End();
                }
            }

            Thread.Yield();
        }
Exemple #18
0
        public void Update()
        {
            if (conn != null)
            {
                if (!conn.GetConnected())
                {
                    msg("YARK: client disconneted");
                    conn = null;
                }
                else
                {
                    if (SceneManager.GetActiveScene().buildIndex == 7) //in flight?
                    {
                        currentTime = (UInt32)Planetarium.GetUniversalTime();
                        if (inFlight != 1 || AV.id != FlightGlobals.ActiveVessel.id || lastTime > currentTime)
                        {
                            inFlight = 1;
                            if (AV != null)
                            {
                                AV.OnPostAutopilotUpdate -= AxisInput.Callback;
                            }
                            AV = FlightGlobals.ActiveVessel;
                            AV.OnPostAutopilotUpdate += AxisInput.Callback;

                            //sync inputs on vessel switch
                            ControlPacket cp = new ControlPacket
                            {
                                MainControls      = CalcMainControls(),
                                ActionGroups      = CalcActionGroups(),
                                SASMode           = GetSASMode(true),
                                SpeedMode         = (byte)(FlightGlobals.speedDisplayMode + 1),
                                timeWarpRateIndex = GetTimeWarpIndex()
                            };
                            cp.targetHeading = cp.targetPitch = cp.targetRoll = cp.WheelSteer = cp.WheelThrottle = cp.Throttle = cp.Pitch = cp.Roll = cp.Yaw = cp.TX = cp.TY = cp.TZ = 0;

                            conn.SyncControls(CPToVC(cp));

                            msg("rysync");

                            UpdateSP();
                            conn.SendStatusPacket(SP);
                        }
                        lastTime = currentTime;

                        if (AxisInput.holdTargetVector) //custom SAS vectoring WIP
                        {
                            Quaternion relativeOrientation = Quaternion.identity * Quaternion.Euler((-AxisInput.targetHeading + 90) * new Vector3(1, 0, 0));
                            relativeOrientation = relativeOrientation * Quaternion.Euler((AxisInput.targetPitch) * new Vector3(0, 0, 1));
                            relativeOrientation = relativeOrientation * Quaternion.Euler((AxisInput.targetRoll + 90) * new Vector3(0, 1, 0));

                            Quaternion goalOrientation = Quaternion.LookRotation(north, east) * relativeOrientation;

                            Quaternion currentOrientation = AV.Autopilot.SAS.lockedRotation;
                            float      delta = Quaternion.Angle(goalOrientation, currentOrientation);
                            float      slurp;
                            slurp = (float)(Math.Log(delta + 1) / Math.Log(90) * 0.3);

                            AV.Autopilot.SAS.LockRotation(Quaternion.Slerp(currentOrientation, goalOrientation, slurp));
                        }

                        float time = Time.unscaledTime;
                        VP.deltaTime = time - TimeOFLastSend;
                        if (Config.UpdatesPerSecond == 0 || ((VP.deltaTime) > (1.0f / (float)(Config.UpdatesPerSecond)))) //Limit send rate to config rate
                        {
                            TimeOFLastSend = time;
                            UpdateVP();
                            conn.SendVesselPacket(VP);
                            OrbitPlanSkipRateC++;
                            if ((Config.OrbitPlanSkipRate == 0) || ((OrbitPlanSkipRateC % Config.OrbitPlanSkipRate) == 0))
                            {
                                conn.SendFlightPlanPacket(GenerateRawOrbitPlanData());
                            }
                        }
                        if (conn != null)
                        {
                            while (conn.HaveVCPackets())
                            {
                                VCDifference vcDiff = conn.GetVC();
                                UpdateControls(vcDiff.oldVC, vcDiff.newVC);
                            }
                            while (conn.HaveMCPPackets())
                            {
                                ManChangePacket mcp = conn.GetMCP();
                                switch (mcp.mode)
                                {
                                case 0:     //set
                                    AV.patchedConicSolver.maneuverNodes[mcp.manID].OnGizmoUpdated(new Vector3d(mcp.X, mcp.Y, mcp.Z), mcp.UT);
                                    break;

                                case 1:     //new
                                    AV.patchedConicSolver.AddManeuverNode(mcp.UT);
                                    break;

                                case 2:     //delete
                                    AV.patchedConicSolver.maneuverNodes[mcp.manID].RemoveSelf();
                                    break;
                                }
                            }
                        }
                    }
                    else
                    {
                        if (inFlight != 0)
                        {
                            msg("switched to NOT FLYING");
                            inFlight = 0;
                            UpdateSP();
                            conn.SendStatusPacket(SP);
                        }
                        if (conn != null)
                        {
                            while (conn.HaveVCPackets())
                            {
                                conn.GetVC(); //ignore results
                            }
                        }
                    }
                }
            }
            else if (server.Pending())
            {
                msg("YARK: Client connected");
                conn = new Connection(server.AcceptTcpClient());

                UpdateSP();
                conn.SendStatusPacket(SP);

                inFlight = SP.status;

                TimeOFLastSend = Time.unscaledTime;
            }
        }
Exemple #19
0
        /// <summary>
        /// Send new control data to the active vessel.
        /// Checks the vesselSync value to prevent using old ControlPackets after vessel change.
        /// </summary>
        /// <param name="CPacket">Control data</param>
        /// <param name="sync">Current VesselData sync value</param>
        public void ControlsReceived(ControlPacket CPacket, byte sync)
        {
            if (CPacket.vesselSync == sync)
            {
                //Detect vessel change
                _vControls.vesselSync = CPacket.vesselSync;
                bool vesselChanged = _vControls.vesselSync != _vControlsOld.vesselSync;
                _vControlsOld.vesselSync = _vControls.vesselSync;


                _vControls.SAS           = BitMathByte(CPacket.MainControls, 7);
                _vControls.RCS           = BitMathByte(CPacket.MainControls, 6);
                _vControls.Lights        = BitMathByte(CPacket.MainControls, 5);
                _vControls.Gear          = BitMathByte(CPacket.MainControls, 4);
                _vControls.Brakes        = BitMathByte(CPacket.MainControls, 3);
                _vControls.Precision     = BitMathByte(CPacket.MainControls, 2);
                _vControls.Abort         = BitMathByte(CPacket.MainControls, 1);
                _vControls.Stage         = BitMathByte(CPacket.MainControls, 0);
                _vControls.Pitch         = (float)CPacket.Pitch / 1000.0F;
                _vControls.Roll          = (float)CPacket.Roll / 1000.0F;
                _vControls.Yaw           = (float)CPacket.Yaw / 1000.0F;
                _vControls.TX            = (float)CPacket.TX / 1000.0F;
                _vControls.TY            = (float)CPacket.TY / 1000.0F;
                _vControls.TZ            = (float)CPacket.TZ / 1000.0F;
                _vControls.WheelSteer    = (float)CPacket.WheelSteer / 1000.0F;
                _vControls.Throttle      = (float)CPacket.Throttle / 1000.0F;
                _vControls.WheelThrottle = (float)CPacket.WheelThrottle / 1000.0F;
                _vControls.SASMode       = (int)CPacket.NavballSASMode & 0x0F;
                _vControls.SpeedMode     = (int)(CPacket.NavballSASMode >> 4);
                _vControls.UiMode        = (int)CPacket.Mode & 0x0F;
                _vControls.CameraMode    = (int)(CPacket.Mode >> 4);
                _vControls.OpenMenu      = BitMathByte(CPacket.AdditionalControlByte1, 0);
                _vControls.OpenMap       = BitMathByte(CPacket.AdditionalControlByte1, 1);

                for (int j = 1; j <= 10; j++)
                {
                    _vControls.ControlGroup[j] = BitMathUshort(CPacket.ControlGroup, j);
                }


                //if (FlightInputHandler.RCSLock != VControls.RCS)
                if (_vControls.RCS != _vControlsOld.RCS || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.RCS, _vControls.RCS);
                    _vControlsOld.RCS = _vControls.RCS;
                    //ScreenMessages.PostScreenMessage("RCS: " + VControls.RCS.ToString(), 10f, KSPIOScreenStyle);
                }

                //if (ActiveVessel.ctrlState.killRot != VControls.SAS)
                if (_vControls.SAS != _vControlsOld.SAS || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.SAS, _vControls.SAS);
                    _vControlsOld.SAS = _vControls.SAS;
                    //ScreenMessages.PostScreenMessage("SAS: " + VControls.SAS.ToString(), 10f, KSPIOScreenStyle);
                }

                if (_vControls.Lights != _vControlsOld.Lights || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Light, _vControls.Lights);
                    _vControlsOld.Lights = _vControls.Lights;
                }

                if (_vControls.Gear != _vControlsOld.Gear || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Gear, _vControls.Gear);
                    _vControlsOld.Gear = _vControls.Gear;
                }

                if (_vControls.Brakes != _vControlsOld.Brakes || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Brakes, _vControls.Brakes);
                    _vControlsOld.Brakes = _vControls.Brakes;
                }

                if (_vControls.Abort != _vControlsOld.Abort || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Abort, _vControls.Abort);
                    _vControlsOld.Abort = _vControls.Abort;
                }

                if (_vControls.Stage != _vControlsOld.Stage || vesselChanged)
                {
                    if (_vControls.Stage)
                    {
                        StageManager.ActivateNextStage();
                    }

                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Stage, _vControls.Stage);
                    _vControlsOld.Stage = _vControls.Stage;
                }

                //================ control groups

                if (_vControls.ControlGroup[1] != _vControlsOld.ControlGroup[1] || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Custom01, _vControls.ControlGroup[1]);
                    _vControlsOld.ControlGroup[1] = _vControls.ControlGroup[1];
                }

                if (_vControls.ControlGroup[2] != _vControlsOld.ControlGroup[2] || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Custom02, _vControls.ControlGroup[2]);
                    _vControlsOld.ControlGroup[2] = _vControls.ControlGroup[2];
                }

                if (_vControls.ControlGroup[3] != _vControlsOld.ControlGroup[3] || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Custom03, _vControls.ControlGroup[3]);
                    _vControlsOld.ControlGroup[3] = _vControls.ControlGroup[3];
                }

                if (_vControls.ControlGroup[4] != _vControlsOld.ControlGroup[4] || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Custom04, _vControls.ControlGroup[4]);
                    _vControlsOld.ControlGroup[4] = _vControls.ControlGroup[4];
                }

                if (_vControls.ControlGroup[5] != _vControlsOld.ControlGroup[5] || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Custom05, _vControls.ControlGroup[5]);
                    _vControlsOld.ControlGroup[5] = _vControls.ControlGroup[5];
                }

                if (_vControls.ControlGroup[6] != _vControlsOld.ControlGroup[6] || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Custom06, _vControls.ControlGroup[6]);
                    _vControlsOld.ControlGroup[6] = _vControls.ControlGroup[6];
                }

                if (_vControls.ControlGroup[7] != _vControlsOld.ControlGroup[7] || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Custom07, _vControls.ControlGroup[7]);
                    _vControlsOld.ControlGroup[7] = _vControls.ControlGroup[7];
                }

                if (_vControls.ControlGroup[8] != _vControlsOld.ControlGroup[8] || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Custom08, _vControls.ControlGroup[8]);
                    _vControlsOld.ControlGroup[8] = _vControls.ControlGroup[8];
                }

                if (_vControls.ControlGroup[9] != _vControlsOld.ControlGroup[9] || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Custom09, _vControls.ControlGroup[9]);
                    _vControlsOld.ControlGroup[9] = _vControls.ControlGroup[9];
                }

                if (_vControls.ControlGroup[10] != _vControlsOld.ControlGroup[10] || vesselChanged)
                {
                    _activeVessel.ActionGroups.SetGroup(KSPActionGroup.Custom10, _vControls.ControlGroup[10]);
                    _vControlsOld.ControlGroup[10] = _vControls.ControlGroup[10];
                }

                //Set sas mode
                if (_vControls.SASMode != _vControlsOld.SASMode || vesselChanged)
                {
                    if (_vControls.SASMode != 0 && _vControls.SASMode < 11)
                    {
                        if (!_activeVessel.Autopilot.CanSetMode((VesselAutopilot.AutopilotMode)(_vControls.SASMode - 1)))
                        {
                            ScreenMessages.PostScreenMessage("[KSPEthernetIO]: SAS mode " + _vControls.SASMode.ToString() + " not avalible");
                        }
                        else
                        {
                            _activeVessel.Autopilot.SetMode((VesselAutopilot.AutopilotMode)_vControls.SASMode - 1);
                        }
                    }
                    _vControlsOld.SASMode = _vControls.SASMode;
                }

                //set navball mode
                if (_vControls.SpeedMode != _vControlsOld.SpeedMode || vesselChanged)
                {
                    if (!((_vControls.SpeedMode == 0) || ((_vControls.SpeedMode == 3) && !TargetExists())))
                    {
                        FlightGlobals.SetSpeedMode((FlightGlobals.SpeedDisplayModes)(_vControls.SpeedMode - 1));
                    }
                    _vControlsOld.SpeedMode = _vControls.SpeedMode;
                }


                if (Math.Abs(_vControls.Pitch) > Settings.SASTol ||
                    Math.Abs(_vControls.Roll) > Settings.SASTol ||
                    Math.Abs(_vControls.Yaw) > Settings.SASTol)
                {
                    if ((_activeVessel.ActionGroups[KSPActionGroup.SAS]) && (_wasSASOn == false))
                    {
                        _wasSASOn = true;
                        _activeVessel.ActionGroups.SetGroup(KSPActionGroup.SAS, false);
                    }
                }
                else
                {
                    if (_wasSASOn == true)
                    {
                        _wasSASOn = false;
                        _activeVessel.ActionGroups.SetGroup(KSPActionGroup.SAS, true);
                    }
                }

                if (_vControlsOld.UiMode != _vControls.UiMode || vesselChanged)
                {
                    if (FlightUIModeController.Instance != null)
                    {
                        switch (_vControls.UiMode)
                        {
                        case 0:
                            FlightUIModeController.Instance.SetMode(FlightUIMode.STAGING);
                            break;

                        case 1:
                            FlightUIModeController.Instance.SetMode(FlightUIMode.DOCKING);
                            break;

                        case 2:
                            FlightUIModeController.Instance.SetMode(FlightUIMode.MAPMODE);
                            break;

                        default:
                            break;
                        }
                        _vControlsOld.UiMode = _vControls.UiMode;
                    }
                }

                if (_vControlsOld.CameraMode != _vControls.CameraMode || vesselChanged)
                {
                    if (FlightCamera.fetch != null)
                    {
                        switch (_vControls.CameraMode)
                        {
                        case 0:
                            FlightCamera.fetch.setMode(FlightCamera.Modes.AUTO);
                            break;

                        case 1:
                            FlightCamera.fetch.setMode(FlightCamera.Modes.FREE);
                            break;

                        case 2:
                            FlightCamera.fetch.setMode(FlightCamera.Modes.ORBITAL);
                            break;

                        case 3:
                            FlightCamera.fetch.setMode(FlightCamera.Modes.CHASE);
                            break;

                        case 4:
                            FlightCamera.fetch.setMode(FlightCamera.Modes.LOCKED);
                            break;

                        default:
                            break;
                        }
                        _vControlsOld.CameraMode = _vControls.CameraMode;
                    }
                }

                if (_vControlsOld.OpenMenu != _vControls.OpenMenu || vesselChanged)
                {
                    if (_vControls.OpenMenu)
                    {
                        PauseMenu.Display();
                    }
                    else
                    {
                        PauseMenu.Close();
                    }
                    _vControlsOld.OpenMenu = _vControls.OpenMenu;
                }

                if (_vControlsOld.OpenMap != _vControls.OpenMap || vesselChanged)
                {
                    if (_vControls.OpenMap)
                    {
                        MapView.EnterMapView();
                    }
                    else
                    {
                        MapView.ExitMapView();
                    }
                    _vControlsOld.OpenMap = _vControls.OpenMap;
                }
            }
        }