WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Simulationen > Designer Forum

Designer Forum Treffpunkt für Gedankenaustausch von Simmern, die selbst

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 01.07.2003, 19:58   #1
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Frage C Gauge: Der Zeiger des VSI will nicht!!!

Hallo!

Ich bekomm es einfach nicht hin, dass der Zeiger (MAKE_NEEDLE) mir die Vertikalgeschwindigkeit anzeigt! Was ist da los?

Compilen funktioniert, Hintergrund ist auch zu sehen. Aber diese blöde Nadel...

Vielleicht hat einer von euch eine Antwort drauf!

Viele Grüße,
Hari
harry3 ist offline   Mit Zitat antworten
Alt 01.07.2003, 20:26   #2
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Idee Hallo!

Hab den Fehler schon gefunden! Ich hatte die plist Verlinkung vergessen!

MAKE_STATIC( vsi_background,
VSI_BACKGROUND,
&vsi_plist1,
NULL,
IMAGE_USE_ERASE,
0,
{0, 0} )

-----

So bleibt nur noch zu fragen: Was heißt das folgende!!??
Der Anfang ist ja logisch, dass "val" von der Token abhängig ist. Aber was heißt das /=1.30048 Was heißt dieses "/="?

FLOAT64 val=pelement->source_var.var_value.n /= 1.30048;


Und noch was: Wenn ich ein EFIS mache, so dass der Schirm dunkel werden soll, so mache ich das am besten über ein MAKE_ICON, welches sich über das Gauge legt, oder? Gar so einfach wie bei XML gehts nämlich glaub ich nicht, wo man einfach ein
PHP-Code:
<Visisble>Forderung</Visible
festlegt!


Vieole Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Alt 02.07.2003, 07:06   #3
bartels
Jr. Member
 
Registriert seit: 01.10.2002
Alter: 57
Beiträge: 90


Standard

FLOAT64 val=pelement->source_var.var_value.n/=1.30048; ist eine Verkürzung von:

FLOAT64 val=0;
pelement->source_var.var_value.n=pelement->source_var.var_value.n/1.30048; val=pelement->source_var.var_value.n;

an der Stelle hätte es auch wohl

FLOAT64 val=pelement->source_var.var_value.n/1.30048;

getan. Die Umrechnug ist notwendig da VERTICAL_SPEED m/sec*256 ist. Mit der fs2k2gauges.h gibt es einige Umrechnungsmacros, die das ganze etwas übersichtlicher gestalten könen. Abgesehen davon ist ein VSI häufig mit einer nichtlinearen Skala versehen, so dass sich NONLINEARITY tables empfehlen. In die kann man dann schon die Umrechnung stecken, und den Callback weglassen.


Es gibt in C nicht ein so einfaches <Visible> tag, aber dafür das eine oder andere image flag für diesen Zweck (HIDE_IMAGE()/SHOW_IMAGE() HIDE_IMAGE_TREE()/SHOW_IMAGE_TREE usw.). Im sdgauxx.zip Tutorial ist das eine oder andere Beispiel.
Arne Bartels
bartels ist offline   Mit Zitat antworten
Alt 02.07.2003, 07:42   #4
bartels
Jr. Member
 
Registriert seit: 01.10.2002
Alter: 57
Beiträge: 90


Standard

Falls es "nur" um Nichtsichbarkeit im Fehlerfall geht, dafür sind die FAILURE_RECORDs zuständig. Dann muss man nicht mit den image_flags rumhampeln. Die sind eher was für mode selectors und dergleichen.
Arne Bartels
bartels ist offline   Mit Zitat antworten
Alt 02.07.2003, 18:30   #5
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Frage Hallo!

Ich hab es jetzt über ein Icon gelöst. Allerdings gibts da noch ein bisschen Probleme:
Ich habe es zwar schon mal hinbeommen, das Gauge mitsamt dem Icon zu kompilieren, allerdings crashte dann der FS immer.
Warum muss außerdem im Icon, wie auch in den anderen Makros, immer eine Token Variable angegeben werden, obwohl die Informationen eh aus dem Callback stammen! Siehe beim Icon: MASTER_BATTERY, efis_cb,
Einerseits bekommt das Makro Infos aus der Token(Batterie-Token), aber auch aus dem Callback. Wieso das also?
Beim Icon bedeutet als Bitmapzahl 1, dass 2 bmp vorhanden sind?


Viele Grüße,
Harri


MODULE_VAR zustand = {MASTER_BATTERY};
.
.
.
MAKE_ICON( efis_mas,
EFIS_OFF,
NULL,
NULL,
IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,
0,
0, 0,
MASTER_BATTERY, efis_cb,
ICON_SWITCH_TYPE_SET_CUR_ICON,
1,
0,
0 )
.
.
.
FLOAT64 FSAPI efis_cb(PELEMENT_ICON pelement)
{
lookup_var(&zustand);
FLOAT64 ausgabe = zustand.var_value.n;

return ausgabe;

}

Compiler Meldung:

"C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(102) : error C2143: syntax error : missing ';' before 'type'
C:\Programme\Microsoft Visual Studio\MyProjects\vs3\subgauges\vsi_gauge.c(104) : error C2065: 'ausgabe' : undeclared identifier
"
harry3 ist offline   Mit Zitat antworten
Alt 02.07.2003, 22:08   #6
bartels
Jr. Member
 
Registriert seit: 01.10.2002
Alter: 57
Beiträge: 90


Standard

Wenn ich mich recht erinnere, dann muss eine Variablendeklaration IMMER vor allen Rechnungen stehen (zumindestens in C, u.U. in C++ nicht unbedingt). Also

FLOAT64 FSAPI efis_cb(PELEMENT_ICON pelement)
{
FLOAT64 ausgabe = 0;
lookup_var(&zustand);
ausgabe = zustand.var_value.n;
return ausgabe;
}

In diesem Fall tut es aber auch:
FLOAT64 FSAPI efis_cb(PELEMENT_ICON pelement)
{
FLOAT64 ausgabe = pelement->source_var.var_value.n;
return ausgabe;
}
oder
FLOAT64 FSAPI efis_cb(PELEMENT_ICON pelement)
{
return pelement->source_var.var_value.n;
}
in dem Fall kann man auch den Callback ganz weglassen und im MAKE_ICON "NULL" anstelle von "efis_cb" verwenden.
Vielleicht nicht ganz deutlich gemacht, es ist durchaus erlaubt im MAKE_ICON keine Variable (bzw. MODULE_VAR_NONE) zu setzen und dafür eine callback-Funktion zu verwenden, oder eben eine Variable im MAKE_ICON und dann NULL als callback (also keinen) wie oben, oder eine Kombination aus Variable und Callback.
Arne Bartels
bartels ist offline   Mit Zitat antworten
Alt 05.07.2003, 09:04   #7
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Frage Hallo!

Jetzt habe ich da ein bisschen ein eigenartiges Problem, wo ich echt nicht weiß wo anfangen!
Code siehe dazu nächsten Beitrag!
Als Abschluß wollte ich noch einen String auf das Gauge draufsetzen, wo dann obenstehen soll TCAS OFF. (Zu Testzwecken wird jetzt vorerst nur mal TEST ausgegeben)

Natürlich will ich eine solche Meldung nicht ganz vorne am Gauge picken haben, sondern eher hinten in der plist Reihe.

Das Problem ist jetzt nur, dass alle Makros, die überhalb des String Makros stehen(also eine kleinere plist Nummer haben), nicht angezeigt werden. Somit müsste es an erster Stelle stehen, damit alle Makros funktionieren!
Dass kommt für mich aber nicht in Frage, alleine schon weil ich mit dem Make_Icon alles ausblenden will, sobald die Batterie aus ist.

Ich möchte Make_String als vorletztes Element im Gauge haben(also vor dem Hintergeund).

Wenn man bedenkt, wie wenig Code-Zeilen man in XML für das gleiche Gauge bräuchte bräuchte...

Am beigefügten Bild habe ich den String als zweites Element "eingereiht", es funktioniert also alles bis auf das darüberstehende Make_Icon. Eigentlich müsste der EFIS Schirm schwarz sein, da die Batterie aus ist! Funktioniert aber aus den oben genannten Gründen nicht!
Gibts eigentlich in C eine ähnlich praktische Variable wie (A:master general panel on, bool)??? Meiner Meinung nach eine der wichtigsten Variablen für EFIS überhaupt...

Viele Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Alt 05.07.2003, 09:09   #8
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Beitrag vsi_gauge.c

Hier also der code: Mit Kommentaren ausgerüstet; manchmal in deutsch, manchmal in englisch, wie's mich gerade gefreut hat!



//vsi_gauge.c
//by Harald Scheidl (c)2003


char vsi_gauge_name[] = GAUGE_NAME;
extern PELEMENT_HEADER vsi_list;
extern MOUSERECT vsi_mouse_rect[];
GAUGE_CALLBACK vsi_update;
GAUGE_HEADER_FS700(GAUGE_W, vsi_gauge_name, &vsi_list, vsi_mouse_rect, vsi_update, 0,0,0 );

MOUSE_BEGIN( vsi_mouse_rect, 0, 0, 0 )
MOUSE_END

#include
#include "font.h" //definiert die daten zur schrift

#define GAUGE_MAX_FPM 6000
#define GAUGE_MIN_FPM -6000

//---------------------------------------------------------------
//updates
NEEDLE_UPDATE_CALLBACK vsi_set_cb;
NEEDLE_UPDATE_CALLBACK vsi_needle_src_cb;
STRING_UPDATE_CALLBACK vsi_string_cb;

//---------------------------------------------------------------
//Icon macro for showing EFIS/not showing EFIS

MAKE_ICON( efis_black,
EFIS_OFF,
NULL,
NULL,
IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,
0,
0,0,
MASTER_BATTERY, NULL,
ICON_SWITCH_TYPE_SET_CUR_ICON,
2,
0,
0 )

PELEMENT_HEADER vsi_plist1[] =
{
&efis_black.header,
NULL
};
//---------------------------------------------------------------
MAKE_STRING( vsi_string,
NULL,
&vsi_plist1,
IMAGE_USE_ERASE | IMAGE_USE_BRIGHT | IMAGE_USE_TRANSPARENCY,
0,
50, 35,
60, 20,
4,
MODULE_VAR_NONE,
MODULE_VAR_NONE,
MODULE_VAR_NONE,
RGB(255,128,0),
RGB(0,0,0),
RGB(92,92,92),
GAUGE_FONT_DEFAULT,
GAUGE_WEIGHT_DEFAULT,
GAUGE_CHARSET,
0,
DT_CENTER | DT_VCENTER | DT_SINGLELINE,
NULL,
vsi_string_cb )


PELEMENT_HEADER vsi_plist2[] =
{
&vsi_string.header,
NULL
};


//---------------------------------------------------------------



FLOAT64 FSAPI vsi_string_cb(PELEMENT_STRING pelement )
{
FLOAT64 val=pelement->source_var[0].var_value.n;


sprintf(pelement->string, "%s", "TEST");

return val;
}


//Nonlinearity Table for the needle of the VSI

NONLINEARITY vsi_needle_nl[] =

{
{{112, 64}, -6000, 0},
{{104, 85}, -4000, 0},
{{75, 105}, -2000, 0},
{{35, 105 }, -1000, 0},
{{8, 58}, 0, 0},
{{35, 11}, 1000, 0},
{{75, 12}, 2000, 0},
{{104, 31}, 4000, 0},
{{112, 51}, 6000, 0},
};

//---------------------------------------------------------------

//VSI Autopilot Setting

MAKE_NEEDLE( vsi_setting,
VSI_SET,
&vsi_plist2,
NULL,
IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,
0,
60, 59,
0, 5,
AUTOPILOT_VERTICAL_HOLD_VAR,
vsi_set_cb,
vsi_needle_nl,
0 )

PELEMENT_HEADER vsi_plist3[] =
{
&vsi_setting.header,
NULL
};

//---------------------------------------------------------------

FLOAT64 FSAPI vsi_set_cb ( PELEMENT_NEEDLE pelement )

{
FLOAT64 val=pelement->source_var.var_value.n;

if ( val > GAUGE_MAX_FPM ) val = GAUGE_MAX_FPM;
if ( val < GAUGE_MIN_FPM ) val = GAUGE_MIN_FPM;

return val;
}
//---------------------------------------------------------------


//VSI display

MAKE_NEEDLE( vsi_needle,
VSI_NEEDLE,
&vsi_plist3,
NULL,
IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,
0,
60, 59,
0, 5,
VERTICAL_SPEED,
vsi_needle_src_cb,
vsi_needle_nl,
0 )

PELEMENT_HEADER vsi_plist4[] =
{
&vsi_needle.header,
NULL
};

FLOAT64 FSAPI vsi_needle_src_cb ( PELEMENT_NEEDLE pelement )

{
FLOAT64 val=pelement->source_var.var_value.n /= 1.30048;

if ( val > GAUGE_MAX_FPM ) val = GAUGE_MAX_FPM;
if ( val < GAUGE_MIN_FPM ) val = GAUGE_MIN_FPM;

return val;
}

//----------------------------------------------------------------
MAKE_STATIC( vsi_background,
VSI_BACKGROUND,
&vsi_plist4,
NULL,
IMAGE_USE_ERASE,
0,
{0, 0} )

PELEMENT_HEADER vsi_list = &vsi_background.header;


//---------------------------------------------------------------


void FSAPI vsi_update (PGAUGEHDR pgauge, int service_id, UINT32 extra_data)
{
switch(service_id)
{

/* "install_routine()" */

case PANEL_SERVICE_PRE_INSTALL:
break;

/* "initialize_routine()" */

case PANEL_SERVICE_PRE_INITIALIZE:
break;

/* "update_routine()" */

case PANEL_SERVICE_PRE_UPDATE:


/* "draw_routine()" */

case PANEL_SERVICE_PRE_DRAW:
break;

/* "kill_routine()" */

case PANEL_SERVICE_PRE_KILL:
break;



}

}

/////////////////////////////////////////////////////////////////////////////
#undef GAUGE_NAME
#undef GAUGEHDR_VAR_NAME
#undef GAUGE_W
harry3 ist offline   Mit Zitat antworten
Alt 05.07.2003, 09:56   #9
bartels
Jr. Member
 
Registriert seit: 01.10.2002
Alter: 57
Beiträge: 90


Standard

MAKE_STRINGs haben eine leicht andere Reihenfolge in den ersten Parametern (eigentlich nicht, die Resource id fehlt halt).
Du müsstest den zweiten und dritten Parameter tauschen, z.B.

...
MAKE_STRING( vsi_string,
&vsi_plist1,
NULL,
IMAGE_USE_ERASE | IMAGE_USE_BRIGHT | IMAGE_USE_TRANSPARENCY,
0,
50, 35,
60, 20,
4,
MODULE_VAR_NONE,
MODULE_VAR_NONE,
MODULE_VAR_NONE,
RGB(255,128,0),
RGB(0,0,0),
RGB(92,92,92),
GAUGE_FONT_DEFAULT,
GAUGE_WEIGHT_DEFAULT,
GAUGE_CHARSET,
0,
DT_CENTER | DT_VCENTER | DT_SINGLELINE,
NULL,
vsi_string_cb )
...

Ansonsten sieht ja alles gut aus. Ob man noch weiter optimiert ist Geschmackssache: falls Du dir Arbeit ersparen willst, lass den gauge callback weg und ändere die nonlinearity table zu:

NONLINEARITY vsi_needle_nl[] =

{
{{112, 64}, -8000, 0},
{{112, 64}, -6000, 0},
{{104, 85}, -4000, 0},
{{75, 105}, -2000, 0},
{{35, 105 }, -1000, 0},
{{8, 58}, 0, 0},
{{35, 11}, 1000, 0},
{{75, 12}, 2000, 0},
{{104, 31}, 4000, 0},
{{112, 51}, 6000, 0},
{{112, 51}, 8000, 0}
};

dann brauchst Du auch keine min-max Abfrage im needle callback mehr. Welche Zahlen (-8000,8000) da drin stehen ist wurscht, solange die ersten und die letzten beiden Einträge die selben Koordianten haben, und values außerhalb des Bereichs. Ist man nämlich außerhalb der Tabelle wird mit den Randwerten weiter interpoliert, geben die einen Differenzwinkel von 0 (gleiche Koordinaten) hat man da einen effektiven Stop eingebaut.
Arne Bartels
bartels ist offline   Mit Zitat antworten
Alt 05.07.2003, 13:31   #10
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Daumen hoch Hallo!

Danke Arne, der String funktioniert jetzt.

Ich habe nur mal versuchmäßig probiert, statt des normalen Textes die VS in Zahlen auszugeben. Die Berechnung habe ich dazu von der Needle herauskopiert. da ich nur ganze Zahlen haben will, lass ich mir eine int ausgeben (%d).
Irgendetwas passt da aber nicht ganz. Ich hab bei einigen anderen String Gauges Source Codes gesehen, dass da im Callback drinnen steht val =! val. Das hab ich auch mal dazugetan, hat aber auch nichts genutzt. Die Zeile ergibt für mich genausoviel Sinn wie wenn ich hinschreiben würde 1 nicht gleich 1...

FLOAT64 FSAPI vsi_string_cb( PELEMENT_STRING pelement )
{

FLOAT64 val=pelement->source_var[0].var_value.n /= 1.30048;
sprintf(pelement->string, "%d", (FLOAT64)val);

return val;
}


Ist /= eigentlich irgendeine besondere Abkürzung? Du hast sie zwar oben schon beschrieben, aber was heißt es, wenn die beiden Rechenzeichen da so dastehen???


Viele Grüße,
Harri
harry3 ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist an.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:21 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag