Lok24
17.07.2019, 18:50

Editiert von
Lok24
17.07.2019, 19:10

Hilfe bei C# gesucht

Hallo,

ich probiere es nochmal, leider hat das letzte mal keiner angebissen....
Ich suche eigentlich nur die Syntax für genau einen Befehl.....

Grüße

Werner



Lok24
18.07.2019, 15:33

Als Antwort auf den Beitrag von Lok24

Editiert von
Lok24
18.07.2019, 15:41

Re: Hilfe bei C# gesucht

Hallo,

jetzt also hier weiter im Off-topic-Bereich.

Ich benutze das Programm "Brick Automation Project" zur Ansteuerung der PoweredUp-Hubs, es bildet das LEGO-BT-Protokoll ab.

Und so sieht das aus:

[image]



Und es funktioniert auch alles, gefällt mir aber nicht.

Wie man sieht sammelt es die erreichbaren (eingeschalteten) Hubs ein (links).

Dann kann man an zwei Stellen tätig werden:
Zu einen Event (Sensor 1 "rot") einen C# Schnipsel (rechtes
Fenster) schreiben. Und in einem Teil, des sich "Gobal Code" nennt, übergeordnete C- Routinen programmieren.
Läuft, auch bei mir.

Die "Objects" stehen im rechten Fenster ganz oben.

Ich schreibe also im Event (das "level" ausführen soll, aber die Hubs braucht):
progstart(Hub[0],Hub[1],Hub[2]);
level();

und im Global Code:
static void progstart(Hub L2, Hub M1, Hub L1 )
{
// set the Hubs
Lok1 = L1;
Lok2 = L2;
Motor1 = M1;

Dann kann ich z.B. mit Lok2.SetMotorSpeed("A",30) die Loks fahren.

Wo ist dann das Problem?
Nun, wenn die Einschaltsequenz noch ein anderes HUB findet (Austellungen(!)) geraten die Indizes außer Tritt.

Und ich muss dann auch ggf.
progstart(Hub[0],Hub[1],Hub[2],Hub[3]);
übergeben. Das ist nicht änderungsfreundlich, zumal ich diesen String für jeden Event und Programmschnipsel dann anpassen muss.

Aber: "Hub" ist nirgendwo definiert. Es muss also noch eine Stück C# geben, an das ich als User nicht drankomme, die eigentliche Funktionalität.
Und aus diesen Häppchen wird dann das Programm zusammengesetzt und ausgeführt.


Hub[0] kann ich im Global Code nicht nutzen
(Aber evtl "Hub"? Dann könnte ich mir das "progstart" sparen)

Ich würde also gerne das Objekt (?!??) "Hub" übergeben, also:
progstart(Hub);
oder etwa doch
progstart(Hub[]); ???
oder anders? oder gar nicht?

Und dann im Global Code die Länge/Anzahl Elemente dieses Arrays/dieser Liste in einer Schleife abarbeiten.

Ich hoffe das ist halbwegs verständlich.....?
Vielleicht kann man die Frage auch ohne Kenntnis der Black-Box "Hauptprogramm" gar nicht beantworten.

Jede Hilfe ist willkommen!

Grüße

Werner



cimddwc
18.07.2019, 16:11

Als Antwort auf den Beitrag von Lok24

Editiert von
cimddwc
18.07.2019, 16:12

Re: Hilfe bei C# gesucht

Hallo,

ich bin zwar kein C#-Experte (hab mehr mit C/C++ zu tun), aber die Übergabe von Arrays sollte mit
static void progstart(Hub[] hubs)
gehen, aufgerufen mit progstart(Hub); da drin kannst du dann hubs.length abfragen und mit hubs[0] etc. auf die einzelnen Elemente zugreifen.

Inwiefern das dann in dieser speziellen Umgebung auch geht, weiß ich nicht (mich wundert ja schon, dass "Hub" anscheinend sowohl eine Array-Variable als auch eine Klasse bezeichnet...).

Grüße,
Andreas



Andi
18.07.2019, 16:27

Als Antwort auf den Beitrag von Lok24

Re: Hilfe bei C# gesucht

Kannst du nicht ne Schleife laufen lassen, die alle vorhandenen Hubs anspricht? Oder vorher abfragen, wieviele Hubs vorhanden sind?

gruß
Andi



Lok24
18.07.2019, 17:25

Als Antwort auf den Beitrag von cimddwc

Re: Hilfe bei C# gesucht

Hallo Andreas, vielen Dank.

das ergibt das hier beim compilieren von "progstart(Hub);"

Error (CS1503): Argument '1': Konvertierung von 'System.Collections.Generic.List<LegoTrainProject.Hub>' in 'LegoTrainProject.Hub[]' nicht möglich.
Error (CS1998): In dieser Async-Method fehlen die 'await'-Operatoren, weshalb sie synchron ausgeführt wird. Sie sollten die Verwendung des 'await'-Operators oder von 'await Task.Run(...)' in Betracht ziehen, um auf nicht blockierende API-Aufrufe zu warten bzw. CPU-gebundene Aufgaben auf einem Hintergrundthread auszuführen.



Lok24
18.07.2019, 17:25

Als Antwort auf den Beitrag von Andi

Re: Hilfe bei C# gesucht

Andi hat geschrieben:

Kannst du nicht ne Schleife laufen lassen, die alle vorhandenen Hubs anspricht? Oder vorher abfragen, wieviele Hubs vorhanden sind?


Gerne. Wie?



Andi
18.07.2019, 18:51

Als Antwort auf den Beitrag von Lok24

Re: Hilfe bei C# gesucht

Lok24 hat geschrieben:

Andi hat geschrieben:
Kannst du nicht ne Schleife laufen lassen, die alle vorhandenen Hubs anspricht? Oder vorher abfragen, wieviele Hubs vorhanden sind?


Gerne. Wie?


Muss ich googlen. Hab zu lange nicht mehr mit C# programmiert, nur mit PHP



Lok24
18.07.2019, 18:59

Als Antwort auf den Beitrag von Andi

Editiert von
Lok24
18.07.2019, 19:22

Re: Hilfe bei C# gesucht

Andi hat geschrieben:


Muss ich googlen. Hab zu lange nicht mehr mit C# programmiert, nur mit PHP


das Problem ist doch: wenn ich nicht auf "Hub" zugreifen kann, wie bekomme ich dann die Länge (= Zahl der Elemente)?


v = hub.???????;
for (int i = 0; i < v; i++)
{
Console.WriteLine(Hub[i].DeviceId);
}



Mylenium
18.07.2019, 19:27

Als Antwort auf den Beitrag von Lok24

Re: Hilfe bei C# gesuchtn

Ich würd einfach eine statische Liste mit allen deinen DeviceIDs schreiben und dann daraus mit einem Check für isConnected() die eigentliche Hub Funktionalität generieren. Damit könntest du ja eine persistente Sortierung erzwingen, zumindest für die eigenen Devices. Andere Hubs würden dann hinten dran hängen. Wie man die dann dynamisch einbindet, erschließt sich mir aber auch nicht mangels Kenntnis des Systems.

Mylenium


https://myleniumsbrickcorner.wordpress.com


Andi
18.07.2019, 19:44

Als Antwort auf den Beitrag von Lok24

+1Re: Hilfe bei C# gesucht

Lok24 hat geschrieben:

Andi hat geschrieben:

Muss ich googlen. Hab zu lange nicht mehr mit C# programmiert, nur mit PHP


das Problem ist doch: wenn ich nicht auf "Hub" zugreifen kann, wie bekomme ich dann die Länge (= Zahl der Elemente)?


v = hub.???????;
for (int i = 0; i < v; i++)
{
Console.WriteLine(Hub[i].DeviceId);
}


for (int i=0; i < Hub[].length; i++) ?



Carrera124 gefällt das


cimddwc
18.07.2019, 20:42

Als Antwort auf den Beitrag von Lok24

Editiert von
cimddwc
18.07.2019, 20:44

Re: Hilfe bei C# gesucht

Beim ersten Fehler dann vielleicht doch mit progstart (Hub[]) versuchen?

Edit: Oder in der Deklaration der Funktion System.Collections.Generic.List<LegoTrainProject.Hub> hubs statt Hub[] hubs, weil's eben doch kein Array ist.

Ansonsten weiß ich erstmal auch nicht weiter.

Grüße,
Andreas



riepichiep
18.07.2019, 21:51

Als Antwort auf den Beitrag von Lok24

Re: Hilfe bei C# gesucht

Fühle mich gerade wie bei https://stackoverflow.com/



mkolb
18.07.2019, 23:38

Als Antwort auf den Beitrag von Lok24

Re: Hilfe bei C# gesucht

Hallo Werner,

a) haste mal versucht, das Ganze mit Visual Studio aufzurufen und auszuführen ?
Du kannst die Community-Version kostenlos herunterladen. Aktuell Version 2019.

b) Ich würde sowas mal in einem .net-Forum stellen. Das Lego-Forum ist da etwa falsch.
z. B. https://www.mycsharp.de/wbb2/

Tschau
Martin


http://www.born2brick.de

http://www.brick-fans-rm.de


meine Anlagen im Internet:

http://www.martin-kolb.de/bricks

https://www.flickr.com/photos/129377871@N08/albums


Lok24
19.07.2019, 09:07

Als Antwort auf den Beitrag von Andi

Re: Hilfe bei C# gesucht

Hallo,

danke.

for (int i=0; i < Hub[].length; i++)
{
Console.WriteLine(Hub[i].DeviceId);
}

Fehler:
Compiling failed.
Error (CS0443): Syntaxfehler. Wert erwartet.

Mit andern Worten: "Hub[].length" liefert keinen Integer-Wert der Länge von Hub[]
Leider. Genau das ist das Problem.



Lok24
19.07.2019, 09:10

Als Antwort auf den Beitrag von mkolb

Re: Hilfe bei C# gesucht

Hallo Martin,

danke, aber da ich den entscheidenen Teil des Quellcodes ja nicht habe kann ich da nichts editieren.
Visual Studio habe ich installiert, damit kann ich z.B. Python für EV3 programmieren.

Aus diesem Grund scheitert auch die Nachfrage in dieversen Fachforen.

Grüße

Werner



Lok24
19.07.2019, 09:17

Als Antwort auf den Beitrag von Mylenium

Re: Hilfe bei C# gesuchtn

Hallo,

Mylenium hat geschrieben:

Ich würd einfach eine statische Liste mit allen deinen DeviceIDs schreiben und dann daraus mit einem Check für isConnected() die eigentliche Hub Funktionalität generieren. Damit könntest du ja eine persistente Sortierung erzwingen, zumindest für die eigenen Devices.

Ja, genau, das habe ich ja.

Aber: "isConnected()" ist eine Eigenschaft von Hub[i].
Und wie bekomme ich dieses i raus? Oder das Array (wenn's denn eins ist, das war ja auch die Frage) einer Klassenmethode übergeben?


Mylenium hat geschrieben:
Andere Hubs würden dann hinten dran hängen. Wie man die dann dynamisch einbindet, erschließt sich mir aber auch nicht mangels Kenntnis des Systems.


Das ist das Problem
Da hängt nix hintendran, also nicht immer.
Wenn ich das Programm starte sammelt es die vorhandenen Devices ein, kommt ein weiteres hinzu wird es hintendrangehängt. Lade ich ein Projekt sieht das wieder anders aus.


Danke für's Mitdenken.

Grüße

Werner



Lok24
19.07.2019, 09:26

Als Antwort auf den Beitrag von cimddwc

Re: Hilfe bei C# gesucht

Hallo Andreas,

danke.

cimddwc hat geschrieben:

Beim ersten Fehler dann vielleicht doch mit progstart (Hub[]) versuchen?


Compiling failed.
Error (CS0443): Syntaxfehler. Wert erwartet.

cimddwc hat geschrieben:

Edit: Oder in der Deklaration der Funktion System.Collections.Generic.List<LegoTrainProject.Hub> hubs statt Hub[] hubs, weil's eben doch kein Array ist.

An die komme ich ja nicht dran, weil die im versteckten "Hauptprogramm" ist.
Ist's denn ein Array? Oder eine Liste? Kann man das denn sagen?

Grüße

Werner



cimddwc
19.07.2019, 10:36

Als Antwort auf den Beitrag von Lok24

Re: Hilfe bei C# gesucht

Lok24 hat geschrieben:


cimddwc hat geschrieben:

Edit: Oder in der Deklaration der Funktion System.Collections.Generic.List<LegoTrainProject.Hub> hubs statt Hub[] hubs, weil's eben doch kein Array ist.

An die komme ich ja nicht dran, weil die im versteckten "Hauptprogramm" ist.
Ist's denn ein Array? Oder eine Liste? Kann man das denn sagen?

Ich meinte in deiner Funktionsdeklaration
static void progstart(System.Collections.Generic.List<LegoTrainProject.Hub> hubs)
(was man je nach Namespace noch kürzen können sollte), anstelle von meinem ersten Vorschlag mit Array "static void progstart(Hub[] hubs)". Denn laut der Fehlermeldung bei progstart(Hub);
Error (CS1503): Argument '1': Konvertierung von 'System.Collections.Generic.List<LegoTrainProject.Hub>' in 'LegoTrainProject.Hub[]' nicht möglich.

...ist das offenbar eine Liste und kein Array.

Grüße,
Andreas



Lok24
19.07.2019, 12:06

Als Antwort auf den Beitrag von cimddwc

+1Re: Hilfe bei C# gesucht ... so einfach?

Hallo Andreas,

Ach was!

Aufruf:
progstart(Hub);

Im Global Code:

static void progstart(System.Collections.Generic.List<LegoTrainProject.Hub> Hubs)
{
// set the Hubs

MainBoard.WriteLine(Hubs[4].DeviceId);
MainBoard.WriteLine(Hubs[5].DeviceId);
MainBoard.WriteLine(Hubs[6].DeviceId);
MainBoard.WriteLine(Hubs.Count); // wird vorher noch in einen String umgewandelt....


Output:

BluetoothLE#BluetoothLE5c:f3:70:91:c2:c8-00:16:53:af:77:c3
BluetoothLE#BluetoothLE5c:f3:70:91:c2:c8-90:84:2b:10:79:0a
BluetoothLE#BluetoothLE5c:f3:70:91:c2:c8-a4:34:f1:ce:5c:45
7

7 deswegen, weil die ersten (0-3) nicht aktiv sind.

Ganz vielen Dank allen, die geholfen haben!
Ich programmiere da mal ein neues Beispiel zusammen und zeige das nochmal hier.


Grüße

Werner



Andi gefällt das


Andi
19.07.2019, 18:57

Als Antwort auf den Beitrag von Lok24

Re: Hilfe bei C# gesucht

hast du mal nur Hub.length probiert?
Kann sein, dass man dabe keine Klammern braucht



Lok24
19.07.2019, 19:04

Als Antwort auf den Beitrag von Andi

+1Re: Hilfe bei C# gesucht

Hallo,

ja, das geht nicht, es ist eine Liste, kein Array.
Es muss "Count" heißen.

Dennoch vielen Dank.



Andi gefällt das


Lok24
21.07.2019, 17:08

Als Antwort auf den Beitrag von Lok24

+2Re: Hilfe bei C# gesucht ... die Lösung...

Hallo zusammen,

danke nochmal an alle die sich mit dem "Problem" befasst und es der Lösung ein Stück häher gebracht haben.

Hier also der Quellcode:



// define the Hubs
public static Hub Lok1;
public static Hub Lok2;
public static Hub Handset;

// define the addresses
public static string Lok1_adr = "00:16:53:af:77:c3";
public static string Lok2_adr = "90:84:2b:10:79:0a";
public static string Handset_adr = "a4:34:f1:ce:5c:45";

// ----start----------------------------

static void start(List<LegoTrainProject.Hub> HubList)
{
// Show all Device-IDs
log("All Device-IDs");
log("-------------------");
for (int i=0;i<HubList.Count;i++)
{
log(HubList[i].DeviceId);
}

// Show all Conncted and assigned Hubs
log("Assigned Hubs");
log("-------------------");

for (int i=0;i<HubList.Count;i++)
{
if (HubList[i].IsConnected)
{
int p = HubList[i].DeviceId.IndexOf("-")+1;
string MacAdr = HubList[i].DeviceId.Substring(p);
string name = "Not assigned";
if (MacAdr==Lok1_adr){Lok1 = HubList[i];name="Lok1"; }
if (MacAdr==Lok2_adr){Lok2 = HubList[i];name="Lok2";;}
if (MacAdr==Handset_adr){Handset = HubList[i];name="Handset";}
log(String.Concat(name, " " , MacAdr, " from Hub No "),i);
}
}
log("-------------------");
}

// ---Log-----------------------------
static void log(string a="", int i = 99999)
{
if (i == 99999)
{
MainBoard.WriteLine(a);
}
else
{
string tt = Convert.ToString(i);
MainBoard.WriteLine(a+ " "+ tt);
}

}



Andi , JuL gefällt das


Ruppie
20.11.2019, 13:10

Als Antwort auf den Beitrag von Lok24

Re: Hilfe bei C# gesucht

Hallo,
du hast keine allgemeine Fragen zu C#, sondern der Anwendung der "Snippsel" / Scripte / mit der du ein konkretes
gegebenes Programm erweitern kannst.

Um eine lange Rede kurz zu machen:
Der Mench der dir die Fragen beantwortet ist der ersteller des Programmes.


PS:

Für allgemeine C# Fragen welche nicht spezifisch auf dem Programm beruhen kannst du auch gerne mich Fragen.

Gruß

Marc



Lok24
20.11.2019, 13:28

Als Antwort auf den Beitrag von Ruppie

Editiert von
Lok24
20.11.2019, 13:30

Re: Hilfe bei C# gesucht

Hallo Marc,

vielen Dank für das freundliche Angebot.

Die Lösung steht auch im Thread, und das Problem ist nicht mehr so akut, da der Entwickler die passende Funktionalität auf meine Bitten inzwischen selbst implementiert hat.

Das BAP basiert auf C#, ansonsten mache ich mehr Python oder Labview oder programmiere an den LEGO Apps rum.
Ein rechter Zoo

Grüße

Werner



Gesamter Thread: