Beschreibung

Mit diesen Skripten könnt Ihr Daten von einem Antenne zu einer oder vielen anderen übertragen.

Dabei gibt es ein Sender, der per Skript eine Nachricht an alle befreundeten Antennen in Reichweite verschickt. Jede befreundete Antenne erhält diese Nachricht, wenn dort ein Programmierbarer Block "angeschlossen" ist, kann dieser die Nachricht auswerten bzw verarbeiten.

Skriptablauf:

In diesem Beispiel sendet eine Drohne ein "Signal" an die Basis, abhängig davon ob ein Feind in der Nähe ist oder nicht.

Wenn ein Feind entdeckt wurde übermittelt es alle verfügbaren Daten, inklusive der Position des Eindringlings.

Ist kein Feind in der Nähe gibt sie jedeglich ein "Alles Ok" zurück.

Einstellungen:

Der Sender muss den Programmierbaren Block mittels Zeitsschaltuhr immer wieder ausführen. Außerdem benötigt er eine Antenne. Beachte das diese nur Senden kann wenn sie in Reichweite des Empfängers ist.

Der Empfänger benötigt eine Antenne der ein Porgrammierbarer Block zugeordnet wird (Über das Terminal). Dort muss dann Empfängerskript eingebunden sein.

Benötigt:

Sender:

1x Programmierbarer Block

1x Antenne

1x Zeitschaltuhr

Empfänger:

1x Programmierbarer Block

1x Antenne

1x LCD

 

Screenshots

Ausgabe am Bildschirm

Das Programm läuft auch auf mehreren Wachtürmen. Die könen mit dem Skript genauso Feedback senden wie eine Drohne.

Ausgabe am Bildschirm in der Basis

Wenn ein Feind entdeckt wurde erscheint eine entsprechende Meldung am LCD-Bildschirm. Dabei wird Name, Position, Typ und ID des Eindringlings Angezeigt.

Source Code


Source-Code

// Transmitter Script

 

String antennaName = "Antenne";
String sensorName = "Sensor";
IMySensorBlock sensor = null;
IMyRadioAntenna antenna = null;
        
public void Main(string argument)
{

     // Name of Sender is set in CustomData field of this Programmable Block
     String droneName = Me.CustomData;
     // set sensor
     sensor = GridTerminalSystem.GetBlockWithName(sensorName) as IMySensorBlock;
     // set antenna
     antenna = GridTerminalSystem.GetBlockWithName(antennaName) as IMyRadioAntenna;
           
     // if sensor is active
     if (sensor.IsActive)
     {
          //Vector3D position = sensor.LastDetectedEntity.Position;
          MyDetectedEntityInfo entity = sensor.LastDetectedEntity;
          String entityInfo = saveEntityToString(entity);
          this.transmit("DroneFeedback|EnemyDetected|" + droneName + "|" +entityInfo, antenna);
     }
     // or is inactive
     else
     {
          this.transmit("DroneFeedback|NothingDetected|" + droneName, antenna);
     }           

}

/*
 *  Creates a string to transmit, separate Infos with #
 *  0 = name
 *  1 = Position
 *  2 = TimeStamp
 *  3 = Type
 *  4 = EntityId
 */
public string saveEntityToString(MyDetectedEntityInfo entity)
{
    String output = "";
    output += entity.Name;
    output += "#";
    output += entity.Position.ToString();
    output += "#";
    output += entity.TimeStamp.ToString();
    output += "#";
    output += entity.Type.ToString();
    output += "#";
    output += entity.EntityId;
    return output;
}

/*
 * Send message via antenna
 */
public bool transmit(string message,IMyRadioAntenna antenna)
{
    return antenna.TransmitMessage(message, MyTransmitTarget.Owned);
}

 

// Receiver Script

 

String lcdName = "LCD 1 Hangar See";

IMyTextPanel lcd = null;
       
public void Main(string argument)
{
    lcd = GridTerminalSystem.GetBlockWithName(lcdName) as IMyTextPanel;

    String arg = "";
    String val = "";
    String val2 = "";
    String nameOfTransmitter = "";

    // Split argument parameter in argument ( and value(s) )
    string[] args = argument.Split('|');
    if (args.Length == 2)
    {
        arg = args[0];
        val = args[1];
     }
     else if (args.Length == 3)
     {
         arg = args[0];
         val = args[1];
         nameOfTransmitter = args[2];
      }
      else if (args.Length == 4)
      {
          arg = args[0];
          val = args[1];
          nameOfTransmitter = args[2];
          val2 = args[3];
       }
       else if (args.Length == 1)
       {
           arg = args[0];
       }

       if (arg == "DroneFeedback")
       {
           if (val == "EnemyDetected")
           {
                    DateTime time = DateTime.Now;
                    String text = this.formatEntityInfo(val2,nameOfTransmitter);
                    this.output(text, 1);
            }
            else if (val == "NothingDetected")
            {
                 DateTime time = DateTime.Now;
                 String text = time.ToLongTimeString() + " > Drone: " + nameOfTransmitter + " > Nothing  Detected";
                 this.output(text, 1);
             }

        }

}

/*
 * Output at LCD
 * 
 * modus: 0 = replace [default]
 *        1 = prepend
 *        2 = append
 */
 public void output(string message, int modus = 0)
 {
     String text = "";
     switch (modus)
     {
        default:
        case 0:
            lcd.WritePublicText(message);
            break;
         case 1:
            text = lcd.GetPublicText();
            lcd.WritePublicText(message + Environment.NewLine + text);
            break;
         case 2:
             text = lcd.GetPublicText();
             lcd.WritePublicText(text + Environment.NewLine + message);
             break;
       }
}

/*
 * Format EntityInfo for output at LCD
 */
public string formatEntityInfo(string input,string transmitter)
{
    string[] infos = input.Split('#');
    String formatText = "";
    // Create DateTime form info timestamp
    long tst = Convert.ToInt64(infos[2]);
    DateTime tstamp = this.UnixTimeStampToDateTime(tst);
    formatText += tstamp.ToShortTimeString() + " > Drone: " + transmitter + " > Enemy Detected: " + infos[0];
    formatText += Environment.NewLine;
    formatText += "Position: " + infos[1];
    formatText += Environment.NewLine;
    formatText += "Type: " + infos[3];
    formatText += Environment.NewLine;
    formatText += "ID: " + infos[4];
    return formatText;
}

 

/*
 * Get DateTime from unix timestamp
 */
public DateTime UnixTimeStampToDateTime(double unixTimeStamp)
{
    // Unix timestamp is seconds past epoch
    System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
    dtDateTime = dtDateTime.AddSeconds(unixTimeStamp).ToLocalTime();
    return dtDateTime;
 }

© 2018 SpaceEngineering.de
Dies ist keine offizielle Seite von Keen Software House oder Steam