TauLabs/PicoC: Scripting

cGiesen

Erfahrener Benutzer
#62
@ernieift
Kannst Du mal erklären wir
[TABLE="width: 640"]
[TR="bgcolor: #F8F8F8"]
[TD="align: left"]void sync(int)[/TD]
[TD="align: left"]like delay, but synchronized with last call. 0 resets interval
[/TD]
[/TR]
[/TABLE]
funktioniert?
 

odwquad

Erfahrener Benutzer
#63
so ich bin auch gerade wieder am verzweifeln :D

ein paar Probleme:
  1. Ich kann mein komplett geschriebenes Programm nicht komplett in PicoC reinschieben. Wenn ich die Daten wieder aus der Quanton auslese, dann wird nur ein Teil des Programms wieder angezeigt. Den Buffer (MaxFileSize) habe ich schon etwas erhöht. Wie weit kann man diesen erhöhen ohne Probleme zu bekommen?
  2. Wenn ich eine abgespeckte Variante meines Programmes hochlade, dann kommt sehr oft eine Fehlermeldung: "PicoC modul doesn't respond. Command timed out. " Danach muss ich die GSC neustarten, dass ich weiter Arbeiten kann.
  3. das Terminalprogramm findet öfter mal den COM Port nicht. Obwohl er im Gerätemanager angezeigt wird :confused:

Anbei mein erstes Testprogramm:
(nicht wundern, ich habe einiges auch hier aus dem Forum kopiert ^^)

Code:
/* Beleuchtungssteuerung:
/* Steuert die Beleuchtung des Quadrocopters

/*Pinbelegung Quanton:
/*RS232 Schnittstelle = WS2812 LEDs
/*PWM Out 10 = LEDs
/*PWM Out 11 = Summer

#include "system.h"
#include "flightbatterystate.h"



/* Variablen Deklarieren:
short LEDupdate=1;
short TMPArmed=2;
short r=0,g=0,b=0;
int Summervar=0;
short LEDblOn=0;
Short WS2812On=0;


/* WS2812 library */
#define nLED 10
unsigned char bufLED[nLED*3];


void setLED(unsigned short n, unsigned char r, unsigned char g, unsigned char b) {
	if (n < nLED) {
		unsigned short offset = 3*n;
		bufLED[offset++] = r;
		bufLED[offset++] = g;
		bufLED[offset++] = b;
	}
}


void sendLED() {
	ChangeBaud(9600);
	SendBuffer(bufLED, sizeof(bufLED));
}
/* end of RGB-LED library */


/*Batteriestatus:
FlightBatteryStateData BatteryData;
short TMPBattery=4;

void batterystatus()
{
	FlightBatteryStateGet(&BatteryData);
	if ((BatteryData.Voltage < 10.4) && (TMPBattery != 1))
	{
		TMPBattery = 1;
		Summervar=2000;
	}
	if ((BatteryData.Voltage < 10.8) && (BatteryData.Voltage > 10.4) && (TMPBattery != 2))
	{
		TMPBattery = 2;
		Summervar=1000;
	}
	if ((10.8 > BatteryData.Voltage) && (TMPBattery != 3))
	{
		TMPBattery = 3;
		Summervar=0;
	}
	PWMOutSet(11,Summervar);
}

/*WS2812 LEDs schalten (Farben definieren): setLED(n,r,g,b);
void PosLEDs()
{
	int n=1
	while(n<3)
	{
		setLED(n,255,0,0);
		n=n+1;
	}
	while(n<5)
	{
		setLED(n,0,255,0);
		n=n+1;
	}
	while(n<7)
	{
		setLED(n,0,0,255);
		n=n+1;
	}
	while(n<10)
	{
		setLED(n,0,255,255);
		n=n+1;
	}
}
void PosLEDsAus()
{
	int n=1
	while(n<3)
	{
		setLED(n,0,0,0);
		n=n+1;
	}
	while(n<5)
	{
		setLED(n,0,0,0);
		n=n+1;
	}
	while(n<7)
	{
		setLED(n,0,0,0);
		n=n+1;
	}
	while(n<10)
	{
		setLED(n,0,255,0);
		n=n+1;
	}
}


TestValSet(1);


TestValSet(2);
while(TestValGet() > 0)
{
	batterystatus();
	printf("Summerstatus: ");
	printf(Summervar);
	printf(" \n");


	if (armed() && (TMPArmed != 1))
	{	
		PosLEDs();
		LEDblOn = 1;
		TMPArmed = 1;
		LEDupdate=1;
 	} 
	else if (!armed() && (TMPArmed != 0))
	{
		PosLEDsAus();
		LEDblOn = 0;
		TMPArmed = 0;
		LEDupdate=1;
	}



	/* BlinkLEDs ein-/ausschalten
	if (LEDblOn == 1)
	{
		PWMOutSet(10,2000);
	}
	else
		PWMOutSet(10,0);
	}

	

	if (LEDupdate == 1) {
		sendLED();
		LEDupdate = 0;
	}

	delay(500);
}
TestValSet(99);
 

cGiesen

Erfahrener Benutzer
#64
Willkommen in der Hölle.
Ich hab schon gedacht es liegt an mir dass es da so viele Probleme gibt.

Den File Speicher habe ich auf 6KB gesetzt. Das ist im Prinzip kein Problem. Ich hoffe die GUI verhindert falsche Werte
 

odwquad

Erfahrener Benutzer
#65
Oki also scheint das picoc noch nicht so ausgereift zu sein.

Ich werde heute abend mal bisl weiter experimentieren. Aber gibt es eigentlich eine Möglichkeit den code auf Fehler zu überprüfen? Zb wenn man ne klammer vergessen hat oder so. Ähnlich wie beim vb Compiler.
 

ernieift

Erfahrener Benutzer
#66
Picoc ist ziemlich gut. Die Resourcen auf dem Copter sind aber begrenzt. Daher habe ich das Modul parametrierbar gemacht. Das ist ein Interpreter und kein Compiler. D.h. wenn du einen Fehler gemacht hast, merkt er es beim Ausführen. Über den PicoC USART bzw. USB wird PicoC gesprächig. Ich würde auch nichts drauflos programmieren und dann in die Luft gehen. Ohne entsprechenden Accesslevel geht aber auch nichts kaputt. Das einzige, was man verhindern sollte, sind Endlosschleifen ohne Sync oder Delay. Und ewig tiefe Rekursionen sollte man auch vermeiden.
Sagen wir es mal so: wenn der Enkel die Pistole vom Urgroßvater aus WK2 findet, sollte er besser die Finger davon lassen wenn er die gefährlich findet. Ansonsten kann man damit schon beinahe jeden Kram anstellen. Ist wie überall. Ich will alles machen können, aber bevor etwas schief geht, soll sich das System um die Grenzen kümmern ;).
 

cGiesen

Erfahrener Benutzer
#67
Oki also scheint das picoc noch nicht so ausgereift zu sein.
Jens hat ja schon eine Menge dazu gesagt. Allerdings ist der auch ein Crack!
Ich tue mich auch immer wieder schwer, aber eigentlich nur, weil ich an die Grenzen komme und es mir schwer fällt zu erkennen, warum ich das tue. Aber das sit wie bei allem eine Frage der Erfahrung.

Ich habe angefangen, meine Scripte mit Notepad 2 zu schreiben. Der hat Syntaxhighlighting für C++ und der erkennt Klammern.
Mit dem Plus welches dann davor kommt, kann man diese Zweige dann zusammen klappen.
Und wenn das nicht so aussieht wie ich es gedacht habe, dann stimmt wohl was mit einer Klammer nicht.
Ob es eine solche Möglichkeit als Editor (nicht als IDE!) in QT gibt weiß ich nicht!

Ich bin aber jetzt auch schon ein paar Tage, dann einem Tool, mit dem ich PicoC auf meinem Rechner laufen lassen kann, in der Hoffnung der Zeigt mir die Zeile, wo Ende war!
Da habe ich aber noch nichts gefunden.

Was mich aber mehr nervt, dass ich vieles einfach nicht weiß!
SYNC() z.B. ich habe eine grobe Idee, wofür das ist. Aber was der Parameter bewirkt
[TABLE="width: 640"]
[TR="bgcolor: #F8F8F8"]
[TD="align: left"]void sync(int)[/TD]
[TD="align: left"]like delay, but synchronized with last call. 0 resets interval[/TD]
[/TR]
[/TABLE]
Ist das auch in Millisekunden seit dem Sync(0)?
 

ernieift

Erfahrener Benutzer
#68
Sync und Delay verzörgern in Millisekunden. Delay verzörgern um x bei Aufruf. Sync 0 synchronisiert zunächst die interne Timervariable mit der Systemzeit. Ein späterer Aufruf macht nur soviel Delay wie nötig ist um das Intervall zum letzten Sync vollzukriegen. Wenn du also eine Schleife mit unterschiedlichen Berechnungen durchführen willst aber am Ende eine LED im Sekundentakt refreshed werden soll, nimm Sync.
 

cGiesen

Erfahrener Benutzer
#71
Aber mich erstmal verzweifeln lassen :(
Das ist gemein, aber lehrreich...

Edit:
Code gerade umgebaut. Klappt. GEIL

Edit2:
Jetzt müssen wir nur noch klären, warum der Upload so oft klemmt!
 
Zuletzt bearbeitet:

ernieift

Erfahrener Benutzer
#72
Das ist ja das schöne beim programmieren. Jeder hat einen eigenen Stil. Mit PicoC kann man schon einiges probieren und lernen. Die Skripte können ja auch einfach nur eine Liste von Anweisungen sein.
Ich hoffe ja, wir kriegen mal so eine Art Bibliothek zusammen.
 

cGiesen

Erfahrener Benutzer
#73
Eine Bibliothek wäre wirklich eine gute Lösung. Ich habe im anderen Forum mal danach gefragt. Aber ein Feedback oder gar eine Idee ist bis jetzt noch nicht gekommen.
Es reicht ja nicht Einfach nur irgendwelche Skripte zu speichern, sondern man muss ja auch beschreiben wie die Voraussetzungen sind, Beispiel RGB LED.
 

cGiesen

Erfahrener Benutzer
#78
Man könnte den doch aber via UAV beim Klick auf Run auf 0 setzen.
Mache ich im Moment ständig, da man sonst nicht erkennt ob den Script läuft oder nicht.

Dieser ist jetzt aber fertig und macht genau das was ich immer gewollt habe
 

odwquad

Erfahrener Benutzer
#79
Picoc ist ziemlich gut. Die Resourcen auf dem Copter sind aber begrenzt. Daher habe ich das Modul parametrierbar gemacht. Das ist ein Interpreter und kein Compiler. D.h. wenn du einen Fehler gemacht hast, merkt er es beim Ausführen. Über den PicoC USART bzw. USB wird PicoC gesprächig. Ich würde auch nichts drauflos programmieren und dann in die Luft gehen. Ohne entsprechenden Accesslevel geht aber auch nichts kaputt. Das einzige, was man verhindern sollte, sind Endlosschleifen ohne Sync oder Delay. Und ewig tiefe Rekursionen sollte man auch vermeiden.
Sagen wir es mal so: wenn der Enkel die Pistole vom Urgroßvater aus WK2 findet, sollte er besser die Finger davon lassen wenn er die gefährlich findet. Ansonsten kann man damit schon beinahe jeden Kram anstellen. Ist wie überall. Ich will alles machen können, aber bevor etwas schief geht, soll sich das System um die Grenzen kümmern ;).
Ja gut das ist mir klar, dass man bevor man in die Luft steigt, das PicoC Skript am sicheren Boden gut durchtesten sollte. Mir ging es einfach nur darum, dass man ja bekanntermaßen sehr leicht Klammern oder Semikolone vergisst beim tippen. Und diese "Fehler" bekommt man ja nicht wirklich mit. Außer dass eben der Code nicht so funktioniert wie er soll, bzw. erst gar nicht gestartet wird. Daher wäre es schön, wenn wie bei Compiler Syntaxfehler erkannt und angezeigt werden würde. Aber ich denke das ist einfach sehr aufwändig.

...
Ich habe angefangen, meine Scripte mit Notepad 2 zu schreiben. Der hat Syntaxhighlighting für C++ und der erkennt Klammern.
Mit dem Plus welches dann davor kommt, kann man diese Zweige dann zusammen klappen.
Und wenn das nicht so aussieht wie ich es gedacht habe, dann stimmt wohl was mit einer Klammer nicht.
Ob es eine solche Möglichkeit als Editor (nicht als IDE!) in QT gibt weiß ich nicht!
...
genau sowas suche ich eigentlich für PicoC. Da muss ich mal mir das Notepad 2 downloaden und damit das Program vorschreiben. Aktuell mache ich das einfach in Word :D

Ich werde jetzt auf jeden Fall noch etwas weiter herumexperimentieren und testen, und lernen und hoffentlich verstehen :D
 

ernieift

Erfahrener Benutzer
#80
Der Editor in der gcs macht nur Text. Syntaxhighlighting u.ä. erfordert mehr Programmieraufwand. Unter Mac empfehle ich sublime für sowas.
 
FPV1

Banggood

Oben Unten