ZeichenKette Definieren C#

  • Ersteller Ersteller Armageddon007
  • Erstellt am Erstellt am
A

Armageddon007

Gast
Hallo Leute
Ich bin noch neu auf dem Gebiet daher brauche ich eure Hilfe. Ich habe mit Visual Studio ein Windows Programm geschrieben. Das Programm ermöglicht mir über Drop Down menus einen Code zu generieren.
z.b.
Button , 1

Jetzt möchte ich das daraus ein Arduino Code gemacht wird also im Grunde:

int pushButton = 2;
Serial.begin(9600);
pinMode(pushButton, INPUT);
}
void loop() {
int buttonState = digitalRead(pushButton);
Serial.println(buttonState);
delay(1);
}

Wie sind die Schritte um das zu erreichen? So wie ich das sehe Muss ich die Zeichenfolge erst definieren.
Also Erstes Zeichen = Button
Zweites Zeichen = Pin

Und dann den Lückentext ausfüllen.
Im nächsten Schritt kommt dann die aneinander Reihung der Zeichenfolgen also
Button , 1
Button , 2
.....

Danke für eure Hilfe !
Julian
 
Ich hab mir den Post jetzt ein paar mal durchgelesen und weiß immer noch nicht wie das genau gemeint ist. Eventuell führt das auch zu den Schwierigkeiten das Problem zu lösen, das nicht genau klar ist was wie erreicht werden soll. Das Beispiel finde ich auch verwirrend. Was ist da Button, was ist Pin?

Was möchtest du denn abstrakt gesehen machen? Eine GUI um Arduinoprogramme zu schreiben? Oder die Pinbelegung auszuwählen?

Soweit ich dich verstehe, möchtest du aus dem "Button-Code" (in dem Program?) Sourcecode für Arduino generieren. Also muss da eine Funktion existieren, die einen Button und einen Pin übergeben bekommt und dann den entsprechenden Sourcecode zurück gibt, damit man diesen ausgeben kann oder weiter damit arbeiten kann. Siehe folgenden Pseudocode:

C#:
static String buttonAndPinToArduinoCode(String button, int pin) {
    String code = ...; // Hier den Arduino-Sourcecode zusammenbasteln.
    ...
    return code; // Arduinocode für die Verwendung zurückgeben.
}

Wenn es mehrere "Button-Codes" gibt, kann auch mit einer Schleife über alle gegangen werden und die Funktion für jeden aufgerufen werden.

Aber wie gesagt, meiner Meinung nach solltest du das Problem erst mal umfassend und verständlich beschreiben, möglichst auf einer Ebene die noch nicht technisch ist. Dann kann überlegt werden, welche Möglichkeiten es zur Lösung gibt.
 
Vielen Dank für die Antwort.
Ich versuche nochmal das Programm zu beschreiben:
- über Drop down Menus kann man Einstellen was man an das Arduino anschließen möchte
-folgende Dateneingaben sind möglich:
1. Dropdown:
-Button
-Encoder
-Potentiometer

2. Dropdown
- Pin Belegung von 1-72

- wählt jemand Button und Pin 1 wird das in einer Listbox aufgelistet

Beispiel:
Button 1
Button 2
Encoder 3
Potentiometer 40


Nun Soll diese Liste Zeile für Zeile in einen Programmcode für Arduino umgewandelt werden damit ich diesen auf das Arduino laden kann.
Das Problem was ich habe ist zum einen wie definieren ich die einzelnen string Abschnitte(Danke Schassi ist wohl was ich suche) und zum anderen wie weiß das Programm welchen Teil er z.b. vor void loop packen soll und welchen danach.

Ich hoffe ich hab es jetzt besser erklärt :)
 
Dazu musst du selbst erstmal wissen, was in loop soll und was wo anders hin. Du musst dir also methodisch überlegen, wie denn der Arduino Code auszusehen hat und wie er aus einzelnen Komponenten zusammengesetzt wird. Das ist von deinem C# Programm zunächst noch vollkommen unabhängig.
 
Wo was genau rein soll weiß ich ja. Das ist nicht das Problem sonder wie Ich z.b. definieren kann
packe "int pushButton = PIN NUMBER;" ganz nach oben (bei mehreren pushButton2, pushButton3..........)

dann nur 1 mal"
Serial.begin(9600);

dann so viele Pushbuttons wie ich habe
pinMode(pushButton, INPUT);
"

Jetzt kommt 1 mal Void loop {

und dann
so oft wie es Buttons gibt :

int buttonState = digitalRead(pushButton);
Serial.println(buttonState);
delay(1);
}

Ich hoffe das ist halbwegs verständlich....
Also die Frage ist wie definiere ich die Position der einzelnen Textabschnitte und und wie kann ich die String BUTTON und Int PIN wie in einem lückentext einsetzen?
 
Zwei Möglichkeiten: entweder du baust den kompletten Text nach und nach auf, oder du baust dir einen vorgefertigten String mit Platzhaltern an den Stellen, wo du die entsprechenden Befehle einfügen willst, und ersetzt die Platzhalter dann in Laufe des Programms mit den nötigen Befehlen.

Was von beidem du letztlich wählst hängt davon ab, wie dynamisch dein erzeugenden- und dein erzeugtes Programm letztlich sein soll.

Schau dir mal die csharp String Funktionen an, insbesondere Replace(). Aber auch ein Blick auf grundlegende String concatenation ergibt glaube ich am dieser Stelle Sinn.
 
Hallo,

ich würde das mit einer (oder mehreren) Klasse(n) lösen die den Teil-Code erzeugen.
z.B:
Code:
    private class ArduinoStructure {
        public ArduinoStructure(String button, int pin, String mode) {
            this.Defines = "#define " + button + " " + pin + "\n";
            this.Setup = "pinMode(" + button + ", " + mode + ")\n";
            this.Loop = "int " + button + "State = digitalRead("+ button + ");\nSerial.println(" + button + "State);\n";
        }

        public String Defines { get; }

        public String Setup { get; }

        public String Loop { get; }
    }
Dann in einer Schleife über alle Einträge der Buttons usw und jeweils eine neue Instanz erzeugen:
Code:
ArduinoStructure[] ardStruct = new ArduinoStructure[items.length];
for (int i = 0; i < items.length; i++) {
  ardStruct[i] = new ArduinoStructure(items.ButtonText, items.PinNumber, items.Mode);
}
Mode kann hier INPUT, OUTPUT usw sein ..

Dann bei der eigentlich Codeerzeugung:
Code:
String strOutput = "#include \"FastLED.h\"\n"; // Evtl. vor den #defines eigene includes usw ..
for (int i=0;i<ardStruct.length;i++) {
  strOutput += ardStruct[i].Defines;
}
strOutput += "void setup() {\nSerial.begin(9600);\n";
for (int i=0;i<ardStruct.length;i++) {
  strOutput += ardStruct[i].Setup;
}
strOutput += "}\nvoid loop() {\n";
for (int i=0;i<ardStruct.length;i++) {
  strOutput += ardStruct[i].Loop;
}
strOutput += "\ndelay(1);\n}\n";

Ist natürlich alles nur Pseudo-Code, aber ich hoffe verständlich genug. :D
 
Lynxx Vielen dank für den Code soweit auch verständlich. Jedoch bin ich noch blutiger Anfänger :( Wo muss ich die einzelnen Codeabschnitte einfügen? Für den ersten habe ich eine neue Klasse erzeugt.

Ich habe einen Button "COMPILE" und eine Listbox mit den Einträgen. Wie greife ich dann auf den oben gennaten Code zu?
 
Den Zweiten und Dritten Code-Block in der Button-Clicked-Funktion von "COMPILE", und
das "items" im Zweiten Block muss dann die Items-Liste der Listbox sein.

Du könntest der Listbox auch gleich ArduinoStructure-Instanzen übergeben, dann musst Du noch eine eigene toString()-Funktion schreiben ..
oder alternativ die Einträge der Listbox sofern es nur Strings sind wieder in die einzelnen Bestandteile aufsplitten, z.B wenn "|" das Trennzeichen ist per listBox.Items[0].Split('|') ..
 
Zurück
Oben