Beispiel #1
0
            void BaseBroadcastHandler(MyIGCMessage msg)
            {
                // NOTE: called on ALL received messages; not just 'our' tag

                if (msg.Tag != sIGCBaseAnnounceTag)
                {
                    return; // not our message
                }
                if (msg.Data is string)
                {
                    _program.Echo("Base Response");
                    string   sMessage = (string)msg.Data;
                    string[] aMessage = sMessage.Trim().Split(':');

                    double x1, y1, z1;
                    int    iOffset = 0;
                    string sName   = aMessage[iOffset++];

                    long id = 0;
                    long.TryParse(aMessage[iOffset++], out id);

                    x1 = Convert.ToDouble(aMessage[iOffset++]);
                    y1 = Convert.ToDouble(aMessage[iOffset++]);
                    z1 = Convert.ToDouble(aMessage[iOffset++]);
                    Vector3D vPosition = new Vector3D(x1, y1, z1);

                    bool bJumpCapable = _program.stringToBool(aMessage[iOffset++]);

                    BaseAdd(id, sName, vPosition, bJumpCapable);
                }
            }
Beispiel #2
0
 public void DoOnDirectMsg(MyIGCMessage msg)
 {
     if (IsFromMyMaster(msg))
     {
         DoOnDirectMasterMsg(msg);
     }
 }
Beispiel #3
0
            public void ProcessDockingRequest()
            {
                Drone.LogToLcd($"\nLogging: {DateTime.Now}");

                MyIGCMessage message = this.Drone.NetworkService.GetBroadcastListenerForChannel(DockingRequestChannel).AcceptMessage();

                if (message.Data == null)
                {
                    Drone.LogToLcd($"\nNo Message");
                }

                IMyShipConnector dockingPort = Drone.Grid().GetBlockWithName("Docking Port 1") as IMyShipConnector;

                if (dockingPort == null)
                {
                    Drone.LogToLcd("\nDocking Port 1 not found.");
                }
                else
                {
                    Vector3D        approachPoint = Vector3D.Add(dockingPort.GetPosition(), Vector3D.Multiply(dockingPort.WorldMatrix.Forward, 50));
                    List <Vector3D> dockingPath   = new List <Vector3D> {
                        approachPoint, dockingPort.GetPosition()
                    };
                    Drone.LogToLcd($"Sending message: {dockingPort.WorldMatrix.Forward},{dockingPath[0].ToString()},{dockingPath[1].ToString()}");
                    this.Drone.NetworkService.BroadcastMessage(
                        DockingRequestChannel,
                        $"{dockingPort.WorldMatrix.Forward},{dockingPath[0].ToString()},{dockingPath[1].ToString()}"
                        );
                }
            }
Beispiel #4
0
        /// <summary>
        /// Tries handling an IGC message, whether sent via broadcast or unicast
        /// </summary>
        /// <param name="msg">Message</param>
        /// <returns>Did the handling succeed?</returns>
        private bool TryHandle(MyIGCMessage msg)
        {
            if (!CommandParsers.ContainsKey(msg.Tag))
            {
                logger($"Can't find parser for tag {msg.Tag}");
                return(false);
            }
            var cmd = CommandParsers[msg.Tag](msg.Data);

            if (cmd == null)
            {
                logger($"Failed to parse message of tag {msg.Tag}, whose data is {msg.Data}");
                return(false);
            }
            if (!CommandHandlers.ContainsKey(msg.Tag))
            {
                logger($"Parsed message of tag {msg.Tag} but couldn't find handler");
                return(false);
            }
            var handled = CommandHandlers[msg.Tag].tryHandle(cmd, msg.Source);

            if (!handled)
            {
                logger($"Command handler couldn't handle message of tag {msg.Tag} whose inner data is {msg.Data}");
                return(false);
            }
            return(true);
        }
Beispiel #5
0
    public void Process(string callbackString = "")
    {
        List<Action<MyIGCMessage>> callbacks;

        foreach (var kv in this.listeners) {
            string channel = kv.Key;
            IMyBroadcastListener listener = kv.Value;

            if (listener.HasPendingMessage && this.handlers.TryGetValue(channel, out callbacks)) {
                while (listener.HasPendingMessage) {
                    MyIGCMessage msg = listener.AcceptMessage();
                    foreach (Action<MyIGCMessage> handle in callbacks) {
                        handle(msg);
                    }
                }
            }
        }

        if (this.unicastListener != null) {
            if (this.unicastListener.HasPendingMessage) {
                while (this.unicastListener.HasPendingMessage) {
                    MyIGCMessage msg = this.unicastListener.AcceptMessage();
                    if (this.unicastHandlers.TryGetValue(msg.Tag, out callbacks)) {
                        foreach (Action<MyIGCMessage> handle in callbacks) {
                            handle(msg);
                        }
                    }
                }
            }
        }
    }
Beispiel #6
0
            public override void DoOnDirectMasterMsg(MyIGCMessage msg)
            {
                p.Echo("Getting msg from master");
                if (msg.Tag == ShipFormationMaster.TAG_FORMATION)
                {
                    GPS center = new GPS(msg.Data.ToString());
                    p.Echo("Getting formation msg from master : ");

                    IMyRemoteControl r = GetRemote();

                    r.ClearWaypoints();

                    int    nbWP     = 18;
                    double angleTmp = 0;
                    double angleDeg = 360 / nbWP;
                    for (int i = 0; i < nbWP; ++i)
                    {
                        GPS            wp   = center.ComputeCoordinate(ShipFormationMaster.DISTANCE, DegreeToRadian(angleTmp));
                        MyWaypointInfo dest = new MyWaypointInfo("WP_" + i, wp.x, wp.y, wp.z);
                        r.AddWaypoint(dest);
                        angleTmp += angleDeg;
                    }

                    GetLight().SetValue("Color", new Color(0, 255, 0));

                    r.FlightMode = FlightMode.Circle;
                    r.SetCollisionAvoidance(false);
                    r.SetAutoPilotEnabled(true);
                }
            }
            void BroadcastHandler(MyIGCMessage msg)
            {
                // NOTE: called on ALL received messages; not just 'our' tag
                if (msg.Tag == sAsteroidTag)
                {
                    if (msg.Data is string)
                    {
                        string[] aMessage = ((string)msg.Data).Trim().Split(':');
                        double   x1, y1, z1;

                        int iOffset = 0;

                        long id = 0;
                        long.TryParse(aMessage[iOffset++], out id);

                        long asteroidID = 0;
                        long.TryParse(aMessage[iOffset++], out asteroidID);

                        x1 = Convert.ToDouble(aMessage[iOffset++]);
                        y1 = Convert.ToDouble(aMessage[iOffset++]);
                        z1 = Convert.ToDouble(aMessage[iOffset++]);
                        Vector3D vMin = new Vector3D(x1, y1, z1);

                        x1 = Convert.ToDouble(aMessage[iOffset++]);
                        y1 = Convert.ToDouble(aMessage[iOffset++]);
                        z1 = Convert.ToDouble(aMessage[iOffset++]);
                        Vector3D vMax = new Vector3D(x1, y1, z1);

                        BoundingBoxD box = new BoundingBoxD(vMin, vMax);
                        AsteroidAdd(asteroidID, box, false);
                    }
                }
            }
 public void Main(string argument, UpdateType updateType)
 {
     while (hangarBroadcastListener.HasPendingMessage)
     {
         MyIGCMessage igc_message = hangarBroadcastListener.AcceptMessage();
         ShipIGC      ship_igc;
         if (shipIGCs.ContainsKey(igc_message.Source))
         {
             ship_igc = shipIGCs[igc_message.Source];
         }
         else
         {
             ship_igc = new ShipIGC(igc_message.Source, IGC);
             shipIGCs.Add(igc_message.Source, ship_igc);
         }
         try
         {
             string igc_message_data = igc_message.As <string>();
             if (igc_message_data != null)
             {
                 shipCommands.Parse(igc_message_data, ship_igc);
             }
         }
         catch (Exception e)
         {
             Echo(e.ToString());
         }
     }
 }
            /// <summary>
            /// Wico Unicast Handler for Wico Main
            /// </summary>
            /// <param name="msg"></param>
            public void WicoConfigUnicastListener(MyIGCMessage msg)
            {
                var tag = msg.Tag;
                var src = msg.Source;

                if (tag == YouAreSub)
                {
                    bIAmMain = false;
                }
                else if (tag == UnicastAnnounce)
                {
                    // another block announces themselves as one of our collective
                    if (_WicoMainSubscribers.Contains(src))
                    {
                        // already in the list
                    }
                    else
                    {
                        // not in the list
//                        _program.Echo("Adding new");
                        _WicoMainSubscribers.Add(src);
                    }
                    bIAmMain = true; // assume we are the main module
                    foreach (var other in _WicoMainSubscribers)
                    {
                        // if somebody has a lower ID, use them instead.
                        if (other < thisProgram.Me.EntityId)
                        {
                            bIAmMain = false;
//                            _program.Echo("Found somebody lower");
                        }
                    }
                }
                else if (tag == UnicastTagTrigger)
                {
                    // we are being informed that we were wanted to run for some reason (misc)
                    thisProgram.Echo("Trigger Received" + msg.Data);
                }
                else if (tag == MODECHANGETAG)
                {
                    string[] aLines = ((string)msg.Data).Split('\n');
                    // 0=old mode 1=old state. 2=new mode 3=new state
                    int theNewMode  = Convert.ToInt32(aLines[2]);
                    int theNewState = Convert.ToInt32(aLines[3]);

                    if (_bDebug)
                    {
                        thisProgram.ErrorLog("IGCS M=" + theNewMode + " S=" + theNewState + " OM=" + IMode + " OS=" + _iState);
                    }
                    if (_iMode != theNewMode)
                    {
                        HandleModeChange(_iMode, _iState, theNewMode, theNewState);
                    }

                    _iMode  = theNewMode;
                    _iState = theNewState;
                }
                // TODO: add more messages as needed
            }
Beispiel #10
0
            private void ProcessUniCommsMessage(MyIGCMessage message)
            {
                P.Echo($"Processing UNICOMMS: {message.Tag}");

                if (commands.ContainsKey(message.Tag))
                {
                    commands[message.Tag]?.Invoke(message.Data);
                }
            }
Beispiel #11
0
            private void UpdateStatus(MyIGCMessage message)
            {
                long  droneID = message.Source;
                Drone drone;

                if (drones.TryGetValue(droneID, out drone))
                {
                    drone.UpdateStatus(message.Data);
                }
            }
Beispiel #12
0
            public override void Perform()
            {
                if (!UseCallbacks)
                {
                    if (Drone.NetworkService.GetUnicastListener().HasPendingMessage)
                    {
                        MyIGCMessage message = Drone.NetworkService.GetUnicastListener().AcceptMessage();
                        ParseUnicast(message);
                    }
                }

                Drone.Log("Checking for messages");
                if (Drone.NetworkService.GetBroadcastListenerForChannel(channel).HasPendingMessage)
                {
                    MyIGCMessage message = Drone.NetworkService.GetBroadcastListenerForChannel(channel).AcceptMessage();
                    Drone.Log(message.Data.ToString());
                    Drone.Log(message.Source.ToString());
                }

                if (Sender)
                {
                    if (MessageType == "Vector3D")
                    {
                        MyTuple <bool, Vector3D> payload = new MyTuple <bool, Vector3D>();
                        payload.Item1 = true;
                        payload.Item2 = Drone.Remote.GetPosition();

                        Drone.Log($"Sending Position to miner1: {Drone.NetworkService.UnicastRecipients["miner1"]}");
                        long address = Drone.NetworkService.UnicastRecipients["miner1"];
                        Drone.Program.IGC.SendUnicastMessage <MyTuple <bool, Vector3D> >(address, "vector", payload);
                        //Drone.NetworkService.UnicastMessage("tester1", "vector", payload);
                    }
                    else if (MessageType == "EntityId")
                    {
                        MyTuple <bool, long> payload = new MyTuple <bool, long>();
                        payload.Item1 = true;
                        payload.Item2 = Drone.Program.Me.EntityId;

                        Drone.NetworkService.UnicastMessage("tester1", "entity_id", payload);
                        payload.Item1 = false;
                        Drone.NetworkService.UnicastMessage("tester2", "entity_id", payload);
                    }
                    else if (MessageType == channel)
                    {
                        Drone.NetworkService.BroadcastMessage(channel, $"My address is: {Drone.Program.Me.EntityId}");
                    }
                    else
                    {
                        throw new Exception("Message type not recognized");
                    }
                }

                //Else do nothing, wait for callbacks
            }
Beispiel #13
0
            public void ProcessClearance(MyIGCMessage clearance)
            {
                //=================================
                //TODO:  use the connectors bounding box to compute an offset?
                //=================================
                MyTuple <Vector3D, Vector3D, Vector3D> messageTuple = (MyTuple <Vector3D, Vector3D, Vector3D>)clearance.Data;

                ApproachPath[0] = messageTuple.Item1;
                ApproachPath[1] = messageTuple.Item2;
                State           = "Approaching Dock";
            }
 public void DoOnDirectMsg(MyIGCMessage msg)
 {
     if (msg.Tag == AbstractSlaveSystem.TAG_SLAVE_ACCEPTATION)
     {
         p.Echo("Adding slave " + msg.Source);
         AddContact(msg.Source);
     }
     else if (IsFromMySlave(msg))
     {
         DoOnDirectSlaveMsg(msg);
     }
 }
Beispiel #15
0
        void TestBroadcastHandler(MyIGCMessage msg)
        {
            // NOTE: called on ALL received messages; not just 'our' tag

            // if (msg.Tag!=sBroadCastTag) return; // not our message
            Echo("Received Test Message");
            var src = msg.Source;

            Echo(" Source=" + src.ToString("X"));
            Echo(" Data=\"" + msg.Data + "\"");
            Echo(" Tag=" + msg.Tag);
        }
Beispiel #16
0
        void Main(string argument, UpdateType updateSource)
        {
            if (updateSource == UpdateType.Update1 || updateSource == UpdateType.Update10 || updateSource == UpdateType.Update100)
            {
                // Main code
                Clock.Update();
                if (Clock.Runtime == startRuntime)
                {
                    Echo("Starting.");
                    Start();
                }
                else if (startRuntime != -1)
                {
                    Echo("Waiting to start:");
                    double sec = startDelay - Clock.GetSeconds(0);
                    Echo(sec.ToString("0.0") + 's');
                    return;
                }

                Echo("Running.");
                Detect();
                Echo("Has target: " + detected);
                Echo("Known location: " + lastEnemy.HasValue);
                double secSince = Clock.GetSeconds(contactTime);
                if (secSince > 0 && secSince < timeout)
                {
                    Echo("Time since contact: " + secSince.ToString("0.00"));
                }

                Move();
            }
            else if (updateSource == UpdateType.IGC)
            {
                if (helpListener != null && receiveHelpMsgs && !detected && helpListener.HasPendingMessage && !rc.IsAutoPilotEnabled)
                {
                    MyIGCMessage msg = helpListener.AcceptMessage();
                    if (msg.Data is Vector3D)
                    {
                        Vector3D pos   = (Vector3D)msg.Data;
                        double   dist2 = Vector3D.DistanceSquared(rc.GetPosition(), pos);
                        if (dist2 < replyToHelpRange * replyToHelpRange)
                        {
                            lastEnemy = null;
                            GoTo(pos, "HelpCall");
                        }
                    }
                }
            }
            else
            {
                Command(argument);
            }
        }
 protected void ReadChanelMsgs(Action <MyIGCMessage, string> actionOnMessage)
 {
     foreach (IMyBroadcastListener l in listGroupListener)
     {
         while (l.HasPendingMessage)
         {
             MyIGCMessage msg = l.AcceptMessage();
             if (p.IGC.Me != msg.Source)
             {
                 actionOnMessage(msg, GetSubTag(msg.Tag));
             }
         }
     }
 }
Beispiel #18
0
 public void TryRegisterMaster(MyIGCMessage msg)
 {
     if (msg.Tag == AbstractMasterSystem.TAG_MASTER_RESERVATION)
     {
         p.Echo("Getting master reservation from " + msg.Source);
         // Don't change Master
         if (!HasMaster())
         {
             p.Echo("Adding master " + msg.Source);
             AddContact(msg.Source);
             SendToContact(msg.Source, TAG_SLAVE_ACCEPTATION, "");
         }
     }
 }
Beispiel #19
0
 private void ProcessMessages()
 {
     while (Listener.HasPendingMessage)
     {
         MyIGCMessage msg  = Listener.AcceptMessage();
         string       data = msg.Data.ToString();
         if (DroneID == 0)
         {
             CheckForID(data);
         }
         Echo(data);
         WriteOnScreen(data);
     }
 }
Beispiel #20
0
        public void Main(string argument, UpdateType updateSource)
        {
            Echo(String.Format("UPDATE CALLED FROM {0}", updateSource.ToString()));

            // Get message from listener
            MyIGCMessage message = listener.AcceptMessage();
            Dictionary <string, object> messageData = DecodeMessage((string)message.Data);
            long requestSource = message.Source;

            Echo(messageData["shipID"].ToString());
            long   shipID  = (long)messageData["shipID"];
            string request = messageData["request"].ToString().Trim();

            Echo(string.Format("ID: {0}, request: {1}", shipID.ToString(), request));

            Log(shipID, request);
            Hangar dock;
            bool   accepted = false;

            switch (request)
            {
            case "DOCK":
                Echo(string.Format("DOCK REQUEST RECEIVED FROM SHIP: {0}", shipID.ToString("X")));
                dock = GetAvailableDock();

                if (dock != null)
                {
                    dock.RunProgram("DOCK");
                    accepted = true;
                }
                TransmitMessage(requestSource, shipID, dock, "DOCK", accepted);
                break;

            case "UNDOCK":
                Echo(string.Format("UNDOCK REQUEST RECEIVED FROM SHIP: {0}", shipID.ToString("X")));
                dock = GetDockOfShip(shipID);

                if (dock != null)
                {
                    dock.RunProgram("UNDOCK");
                    accepted = true;
                }
                TransmitMessage(requestSource, shipID, dock, "UNDOCK", accepted);
                break;

            default:
                return;
            }
        }
Beispiel #21
0
 void ProcessUnicast()
 {
     while (IGC.UnicastListener.HasPendingMessage)
     {
         MyIGCMessage msg = IGC.UnicastListener.AcceptMessage();
         if (msg.Tag == "command" && msg.Data is string)
         {
             string command = msg.Data as string;
             if (command != "process_message")
             {
                 ProcessCommand(command);
             }
         }
     }
 }
Beispiel #22
0
 public void Main(string argument, UpdateType updateSource)
 {
     Echo(updateSource.ToString() + " arg:" + argument);
     if ((updateSource & UpdateType.IGC) > 0)
     {
         if (listener.HasPendingMessage)
         {
             MyIGCMessage message = listener.AcceptMessage();
             if (message.Data is string)
             {
                 Echo(message.Data.ToString());
             }
         }
     }
 }
Beispiel #23
0
            public bool Listen()
            {
                bool res = false;

                if (listeners[0].HasPendingMessage)
                {
                    MyIGCMessage message = listeners[0].AcceptMessage();
                    if (message.Data is Vector3D)
                    {
                        targetpos = (Vector3D)message.Data;
                        res       = true;
                    }
                }
                return(res);
            }
Beispiel #24
0
            private void ReturnKeepAlive(MyIGCMessage message)
            {
                long  droneID = (long)message.Data;
                Drone drone;

                if (drones.TryGetValue(droneID, out drone))
                {
                    drone.ReturnKeepAlive(droneID, time.Time);
                }
                else
                {
                    drone           = new Drone(droneID, this);
                    drones[droneID] = drone;
                }
            }
 void TestUnicastHandler(MyIGCMessage msg)
 {
     // NOTE: Called for ALL received unicast messages
     if (msg.Tag != _unicastTag)
     {
         return; // not our message
     }
     if (msg.Data is string)
     {
         Echo("Received Acknowledge Message");
         Echo(" Source=" + msg.Source.ToString("X"));
         Echo(" Data=\"" + msg.Data + "\"");
         Echo(" Tag=" + msg.Tag);
     }
 }
 void HandlePing(MyIGCMessage message)
 {
     if (message.Source == IGC.Me)
     {
         return;
     }
     if (message.As <bool>() == true)
     {
         return;                 // Recieved Pong
     }
     if (respondToPing)
     {
         SendPong(message.Source);
     }
 }
Beispiel #27
0
 void RadioInput()
 {
     while (ProgramInstance.IGC.UnicastListener.HasPendingMessage)
     {
         MyIGCMessage message = ProgramInstance.IGC.UnicastListener.AcceptMessage();
         if (message.Tag == "ROUTE")
         {
             RouteData = message.Data.ToString();
         }
         if (message.Tag == "COMMAND")
         {
             NewInstructions(message.Data.ToString());
         }
     }
 }
        // Handler for the test broadcast messages.
        void TestBroadcastHandler(MyIGCMessage msg)
        {
            // NOTE: called on ALL received messages; not just 'our' tag

            if (msg.Tag != _broadCastTag)
            {
                return; // not our message
            }
            if (msg.Data is string)
            {
                Echo("Received Test Message");
                Echo(" Source=" + msg.Source.ToString("X"));
                Echo(" Data=\"" + msg.Data + "\"");
                Echo(" Tag=" + msg.Tag);
            }
        }
Beispiel #29
0
        public void Main(string argument, UpdateType updateSource)
        {
            // Calculate and Output for informational purposes
            _runcount++;
            Echo(_runcount.ToString() + ":" + updateSource.ToString());

            if (
                (updateSource & (UpdateType.Trigger | UpdateType.Terminal)) > 0 || // run by a terminal action
                (updateSource & (UpdateType.Mod)) > 0 || // script run by a mod
                (updateSource & (UpdateType.Script)) > 0 // this pb run by another script (PB)
                )
            {                                            // script was run because of an action
                if (argument != "")
                {
                    // if we are given an argument, send it out over our broadcast channel
                    IGC.SendBroadcastMessage(_broadCastTag, argument);
                    Echo("Sending message:\n" + argument);
                }
            }

            if ((updateSource & UpdateType.IGC) > 0)
            { // script was run because of incoming IGC message
                while (_myBroadcastListener.HasPendingMessage)
                {
                    MyIGCMessage myIGCMessage = _myBroadcastListener.AcceptMessage();
                    if (myIGCMessage.Tag == _broadCastTag)
                    { // This is our tag
                        if (myIGCMessage.Data is string)
                        {
                            string str = myIGCMessage.Data.ToString();
                            Echo("Received IGC Public Message");
                            Echo("Tag=" + myIGCMessage.Tag);
                            Echo("Data=" + myIGCMessage.Data.ToString());
                            Echo("Source=" + myIGCMessage.Source.ToString("X"));
                        }
                        else // if(msg.Data is XXX)
                        {
                            // handle other data types here...
                        }
                    }
                    else
                    {
                        // handle other tags here
                    }
                }
            }
        }
Beispiel #30
0
 public void Main(string argument, UpdateType updateSource)
 {
     Echo(updateSource.ToString() + " arg:" + argument);
     if ((updateSource & UpdateType.IGC) > 0)
     {
         if (listener.HasPendingMessage)
         {
             MyIGCMessage message = listener.AcceptMessage();
             if (message.Data is string)
             {
                 Echo(message.Data.ToString());
                 // отправляем ответное сообщение
                 IGC.SendUnicastMessage <string>(message.Source, TAG, "result message");
             }
         }
     }
 }