TauLabs/PicoC: Scripting

cGiesen

Erfahrener Benutzer
#21
Die NAZA zeigt über LED nur z.B. an, ob GPS fertig ist.
Oder im Flug über Farbe welcher FlightMode.

Mehr nicht!

das hätte ich auch gerne, dann muss ich nicht auf die Funke schauen.
Und solange wir unsere FlightModes in der Funke nicht selbst bennen können, nutzt uns auch die Sprachausgabe nix ;)


Wegen verschieben der Nummern.
Wenn die Burchen immer schön hinten dran hängen würden, kein Problem. Aber bei den Modulen würfeln die immer, was nach einem Update immer alles durcheinander bringt.

Edit:
FlightMode habe ich jetzt im Griff.
Jetzt kommt die Qual der Farbe...
Hat da einer eine Idee?
 

ernieift

Erfahrener Benutzer
#22
Bei so vielen Modi, könntest Du ja schon den YUV-Kreis statt RGB nehmen. Oder Du verwendest einfach den Switch. Übrigens kommst irgendwann auch picoC als Mode hinzu.
 

cGiesen

Erfahrener Benutzer
#25
@ernieift

Was ist hier falsch? ich finde es einfach nicht! Der steigt sofort aus, nicht mal die Testvalue wird gesetzt!

Code:
#include "system.h"#include "gpsposition.h"
#include "flightbatterystate.h"
#include "flightstatus.h"


/* WS2812 library */
#define nLED 3
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 */


short LEDupdate=1;
short TMPArmed=2;
short r=0,g=0,b=0;


TestValSet(1);
unsigned long TMPtime=0;


TestValSet(2);
GPSPositionData GPSData;
short TPMGPS=4;


FlightBatteryStateData BatteryData;
short TMPBattery=4;


FlightStatusData StatusData;
short TMPFlightStatus=99;


TestValSet(3);
while(TestValGet() > 0)
{


// Battery
	FlightBatteryStateGet(&BatteryData);
	if ((BatteryData.Voltage < 10.4) && (TMPBattery != 1))
	{
		TMPBattery = 1;
		setLED(0,170,0,0);
		LEDupdate=1;
	}
	if ((BatteryData.Voltage < 10.8) && (BatteryData.Voltage > 10.4) && (TMPBattery != 2))
	{
		TMPBattery = 2;
		setLED(0,170,170,0);
		LEDupdate=1;
	}
	if ((10.8 < BatteryData.Voltage) && (TMPBattery != 3))
	{
		TMPBattery = 3;
		setLED(0,0,170,0);
		LEDupdate=1;
	}


// GPS
	GPSPositionGet(&GPSData);
	if ((GPSData.Satellites < 5) && (TPMGPS != 1))
	{
		TPMGPS = 1;
		setLED(2,170,0,0);
		LEDupdate=1;
	}
	if ((GPSData.Satellites < 7) && (GPSData.Satellites > 4) && (TPMGPS != 2))
	{
		TPMGPS = 2;
		setLED(2,170,170,0);
		LEDupdate=1;
	}
	if ((6 < GPSData.Satellites) && (GPSData.PDOP <= 3.5) && (TPMGPS != 3))
	{
		TPMGPS = 3;
		setLED(2,0,170,0);
		LEDupdate=1;
	}


// Flight Status
	FlightStatusGet(&StatusData);
    switch (StatusData.ControlSource) {
		case 0: //Geofence
        	break;
		case 1: //FailSafe
			TMPtime = (time() % 100);
			if (((TMPtime % 2) == 0) && (TMPFlightStatus != 20)) {
				TMPFlightStatus=20;
				setLED(1,0,0,0);
				LEDupdate=1;        			
			}
			else if (((TMPtime % 2) != 0) && (TMPFlightStatus != 21)) {
				TMPFlightStatus=21;
				setLED(1,170,0,0);
				LEDupdate=1;        			
			}
        	break;
		case 2: //Transmitter
    		switch (StatusData.FlightMode) {
				case 0: //Manual
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 1: //Acro
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=1;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 2: //Leveling
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=2;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 3: //VirtualBar
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 4: //Stabilized1
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 5: //Stabilized2
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 6: //Stabilized3
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 7: //Autotune
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 8: //AltitudeHold
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
						break;
				case9: //VelocityControl
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 10: //PositionHold
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 11: //ReturnToHome
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 12: //PathPlanner
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
				case 13: //TabletControll
					if (StatusData.FlightMode != TMPFlightStatus) {
						TMPFlightStatus=0;
						setLED(1,170,0,0);
						LEDupdate=1;        			
					}
					break;
			}
		case 3: //Tablet


        	break;
    } 


	if (armed() && (TMPArmed != 1))
	{	
		setLED(1,170,0,0);
		TMPArmed = 1;
		LEDupdate=1;
 	} 
	else if (!armed() && (TMPArmed != 0))
	{
		setLED(1,0,170,0);
		TMPArmed = 0;
		LEDupdate=1;
	}


// Set LED
	if (LEDupdate == 1) {
		sendLED();
		LEDupdate = 0;
	}


	delay(500);
}
TestValSet(99);
 

ernieift

Erfahrener Benutzer
#26
Am besten Du machst dazu ein Terminalfenster mit an. Was ich sehe: In der ersten Zeile fehlt ein Return. Was auch noch wichtig ist, wenn Du "gpspositon.h" im picoC verwendest, prüft der Interpreter ob GPS überhaupt aktiviert ist. Falls nicht bricht er beim #include schon ab.
 

cGiesen

Erfahrener Benutzer
#27
ich habe das jetzt soweit eingekreis, das es was mit dem Switch zu tun haben muss.

Code:
     switch (StatusData.ControlSource) {
        case 0: //Geofence
                break;
        case 1: //FailSafe
            TMPtime = (time() / 100);
            if (((TMPtime % 2) == 0) && (TMPFlightStatus != 20)) {
                TMPFlightStatus=20;
                setLED(1,0,0,0);
                LEDupdate=1;                    
            }
            else if (( (TMPtime % 2) != 0) && (TMPFlightStatus != 21)) {
                TMPFlightStatus=21;
                setLED(1,170,0,0);
                LEDupdate=1;                    
            }
                break;
        case 2: //Transmitter
                break;
        case 3: //Tablet
                break;
     }
Hier steckt der Fehler drin!
Ich finde es aber nicht.

der Rest ist sicher gestellt.
Ohne den Switch Code läuft alles
 
Zuletzt bearbeitet:

cGiesen

Erfahrener Benutzer
#29
ein Fehler gefunden und nun der nächste :)
TMPtime = (unsigned long)(time() / 100);
Man muss explizit in unsigned long konvertieren

Kann PicoC kein a % b (Modulo)?
 

cGiesen

Erfahrener Benutzer
#31
Ich habe das so gemacht

Code:
   if (((TMPtime % 2) == 0) && (TMPFlightStatus != 20))
            {
                TMPFlightStatus=20;
                setLED(1,0,0,0);
                LEDupdate=1;                    
            }
 

cGiesen

Erfahrener Benutzer
#32
geht nicht
Code:
     switch (StatusData.ControlSource)    {
        case 0: /*Geofence*/
                break;
        case 1: /*FailSafe*/
             TMPtime = ((unsigned long)(time() / 100) % 2); 
            if ( (TMPtime == 0) && (TMPStatusData != 20) ) 
            {


            }


              break;
        case 2: /*Transmitter*/
                break;
        case 3: /*Tablet*/
                break;
     }
geht
Code:
     switch (StatusData.ControlSource)    {
        case 0: /*Geofence*/
                break;
        case 1: /*FailSafe*/
             TMPtime = ((unsigned long)(time() / 100) % 2); 
            if ( (TMPStatusData != 20) ) 
            {


            }


              break;
        case 2: /*Transmitter*/
                break;
        case 3: /*Tablet*/
                break;
     }
geht
Code:
     switch (StatusData.ControlSource)    {
        case 0: /*Geofence*/
                break;
        case 1: /*FailSafe*/
             TMPtime = ((unsigned long)(time() / 100) % 2); 
            if ( (TMPStatusData != 20) ) 
            {


            }


              break;
        case 2: /*Transmitter*/
                break;
        case 3: /*Tablet*/
                break;
     }
Was ist denn daran falsch:
if ( (TMPtime == 0) && (TMPStatusData != 20) )
 

cGiesen

Erfahrener Benutzer
#33
Wenn sich mal einer der C++ Kundigen mit mir zusammen Telefonieren würde, wäre ich sehr dankbar.

Logisch sind meine Probleme meiner Meinung nach nicht.
Der gleiche Code an einer anderen Stelle klappt.
Kaum packe ich in eine Case noch ein IF dazu, fliegt mir das um die Ohren.
 

cGiesen

Erfahrener Benutzer
#34
Kann es sein, das der Platz für Code in PicoC arg bergrenzt ist?

Ich habe mal den ganzen Code für Batterie und GPS gelöscht, jetzt klappt der Teil den nie gelaufen ist.
 

cGiesen

Erfahrener Benutzer
#38
Der Tipp mit den Stellschrauben hat meinen Tag gerettet.
Jetzt klappt es wie ich wollte.

Was mir aber nicht klar ist, was Du @ernieift mit den Klammern meinst!
 

cGiesen

Erfahrener Benutzer
#40
Kannst du mir ein Beispiel geben? Ich dachte C Programmierer packen immer alles gerne in eine Zeile rein

Bin nicht mehr am Rechner. Gibt es einen Weg den Stack zu ermitteln, der tatsächlich verbraucht worden ist
 
FPV1

Banggood

Oben Unten