WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Designer Forum (http://www.wcm.at/forum/forumdisplay.php?f=61)
-   -   Fsuipc Sdk-delphi (http://www.wcm.at/forum/showthread.php?t=115327)

philharmony 12.11.2003 23:53

Fsuipc Sdk-delphi
 
Hi, hab das zwar schon beim basteln gepostet, aber ich glaube, hier bin ich damit richtiger;o)
...ich bin grade dabei, das AutoflightSystem, also FD,A/T und AP für die 737-400 zu Programieren, dabei is mein problem, dass ich es nicht hinkriege, die flugdaten aus dem FSUIPC auszulesen, ich kapier einfach die readme nicht. Vom Programieren her hab ich mittelmässige ahnung, Objektorientierung komm ich langsam wieder rein, mir fehlt wohl einfach die routine.
Könnte jmd evtl einfach mal den ganzen Queltext (also Interface und Implementation -Teil) posten für ein einfaches Beispiel, sagen wir mal onButtonStartclick soll der Steuerkurs oder sonst was in Edit1.Text stehen. Könnte das jmd machen? einfach dass ich das mal komplett seh und dieses schöne AHAAAA erlebnis bekomme ;o)
Ausserdem hab ich hierzu ein problem:

To interface to FSUIPC (versions 1.998e or later) in your Delphi programs:

* Add "FPCuser" to you uses clause and
* call the appropriate Library routines in your code place "FPCuser.PAS" in a folder
accessible to Delphi (within Delphi's search-path).


also vor allem mit dem roten teil...wohin genau soll ich das kopieren?
in den ordner wo ich mein projekt speichere oder zu den sources von delphi???
grüssle Phil

philharmony 14.11.2003 13:46

ok, habs inzwischen hingekriegt, habe es mal mit offset 02BC grösse:4 versucht: IAS, Indicated Air Speed, as knots * 128, nur bekomme ich keinen vernünftigen wert hin, habe den wert des offsets über format ('%d'[dwresult]) anzeigbar gemacht, und mal ne messreihe aufgenommen, aber die werte stehen in keiner berechenbaren funktion zu den IAS die ich im flusi angezeigt bekomme, schon gar nicht mit 128, weder * noch / 128 funktionieren, wie genau muss ich diese werte umrechnen und formatieren damit sie was bringen?.
ich lasse den wert onTimer abfragen und in ner Edit, komponente anzeigen.
grüssle Phil

ts-abc 15.11.2003 01:42

Hallo Phil,

wenn ich dich jetzt richtig verstanden habe suchst du die Formel zum Umrechnen von Kts in Km/h oder Kts in mi/h.

also Formel (Kilometer/Stunde <-> Knoten)

1km/h = 0,540kts
1kts = 1,852km/h

und Formel (Meile/Stunde <-> Knoten)

1mi/h = 0,86898kts
1kts = 1,15078mi/h

Gruß
Thomas

philharmony 17.11.2003 13:23

nene, den zusammenhang kenn ich*G*
es geht darum: ich kriege wenn ich das (den???) offset für KIAS aus dem FSUIPC mit nem DelphiProgram abfrage, dann muss ich diesen wert ja irgentwie für delphi darstellbar machen, und dazu muss ich den wert erst mal über ne FORMAT-funktion bearbeiten. desweiteren steht in der fsuipc for programmers.doc zu diesem offset eben drin "Indikated Airspeen in KIAS*128" was genau bedeutet das für mich?
grüssle Phil

HansHartmann 17.11.2003 13:40

KIAS * 128 bedeutet, dass FSUIPC Dir den 128-fachen Wert der indicated airspeed liefert. Bei 200 Knoten also 25600. Also:

function GetAirspeed: string;
var
dwResult, dwBuf : DWORD;
begin
FSUIPC_Read($02bc, 4, @dwBuf, dwResult);
FSUIPC_Process(dwResult);
Result := Format('%d', dwBuf div 128);
end;

philharmony 17.11.2003 14:36

ok, muchas gracias, das mit dem format hab ich immernochned verstanden...aber das is genau das was ich gesucht habe, vielen dank

ts-abc 17.11.2003 15:23

Hallo Phil,

Oh Ups da habe ich dich dann natürlich Total Falsch Verstanden.

Ich dächte da Fehlen noch die [] bei der Format Funktion müsst denk ich so sein:
Result := Format('%d', [dwBuf div 128]);

Was die Funktion Format betrifft da bedeutet der Teilstring '%d' das der erste Array wert in den [] eine Ganzzahl sein muss ist der Teilstring zum Beispiel so '%s %d' so muss der erste Array ein String sein und der zweite Array eine Ganzzahl u. s. w.

Gruß
Thomas

philharmony 17.11.2003 17:33

ok, in die format geschichte muss ich mich noahmal einlesen, wer von euch kennt sich denn mit datenbakn anwendungen (BDE und evtl SQL) aus?
bin dabei FD AP AT GPWS FMC TCAS IRS/INS...der 737 3/4/500er serie zu programieren, dabei fehlen mir einfach einige skills....grüssle phil

HansHartmann 17.11.2003 20:30

Ich habe eben mal im Beispiel in der Hilfe nachgeschaut, man braucht die "[" und "]" doch. Ehrlich gesagt, habe ich die Format-Funktion noch nie gebraucht - und ich benutze Delphi seit Version 1.0...

Mit Deiner Liste hast Du Dir ganz schon viel vorgenommen. Willst Du es nicht lieber mal Stück für Stück angehen. Wäre vielleicht eine gute Idee.

philharmony 17.11.2003 23:09

hajo klar stück für stück, aber stück für stück wird eben die liste abgearbeitet....*G*

philharmony 17.11.2003 23:18

Also im moment bin ich am FMC und am ND...ND hab ich halt einfach mal die Canvas.Pixel funktion ausprobiert...funzt ganz gut und sieht auch ned schlecht aus...FMC experimentier ich grade mit BDE, da ich damit noch gar keine erfahrung habe...das hauptproblem sind die datenbanken. Navdata.at hab ich schon angeschrieben ob ich die daten verwenden darf, bzw obs die als BDE oder SQL datenbank gibt, hab aber noch keine antwort bekommen...an sich is der fmc ein ganz schön harter brocken, aber eigentlich ist das meiste aus den performance tabellen zu entnehmen und dann halt zu verfeinern...alles ne zeitfrage, und die hab ich im moment als aushilfskelnernder, aufn zivi wartender abiturient*lach*
grüssle Phil

philharmony 19.11.2003 15:42

hilfe, mien schädel is so voll mit irgentwelchen quelltext-zeilen dass ich langsam gar nix mehr raff :o/
was genau macht denn diese function FORMAT? zB bei V/S oder LAT/LONG gibt das nen fehler, und bei heading kommt irgendein murxwert bei raus...
Wie kann ich denn realzahlen mit komma als string anzeigen, mit z.B. 4 Nachkommastellen? bis jetzt hab ich immer round genommem und dann waren die nur ganzzahlig...
Es is echt schlimm, als wär ich mitten in nem fremden land und die sprache hatte ich vor jahren mal ein bisschen gekonnt!!!

Felax 19.11.2003 23:41

Hui, noch einer, der sich mit der FSUIPC und Delphi rumschlägt. Willkommen bei mir im Klub(gell Hans?:D ) Jetzt ist es zu spät, aber morgen schau ich mir das ganze auch mal an, hab ja alles vom Hans gelernt.:) Hoffe, dass ich mit meinem Wissen das Zeug rauskriege, da ich das später auch noch benötige.:cool:

HansHartmann 20.11.2003 00:02

Format() macht nichts weiter, als eine Zahl in eine Zeichenkette zu wandeln und sie dabei zu formatieren. Natürlich muss der angegebene String zur Variablen passen: %d für Integer, %f für Fließkommazahlen

philharmony 20.11.2003 12:39

âhaaa, das heisst um mit den gegebenen werten zu arbeiten muss ich sie gar nicht formatieren? Wieso benutzt man dann nicht einfach inttostr? in welchem format kommen die werte denn eigentlich vom FSUIPC?
grüssle Phil

HansHartmann 20.11.2003 12:44

Ich benutze immer IntToStr() bzw. FloatToStrF()... deswegen musste ich ja bei Format() auch erst in der Hilfe nachsehen. Aber grundsätzlich ist Format() nur dazu da Zahlen in Texte zu konvertieren. Arbeiten tut man natürlich mit den Zahlen.

philharmony 20.11.2003 13:35

heisst also, das ich den wert aus den offsets direkt nach FSUIPC_Process in ne real-variable speichern kann? (ich steh bei solchen fragen manchmal sowas von aufm schlauch, sorry*G*)

philharmony 20.11.2003 13:55

also die werte vom fsuipc sind vom typ extended und den kann ich nicht bearbeiten...wie kann ich extended in real umwandeln????

philharmony 20.11.2003 14:12

okok, mit jedem kaffee den ich mir reinhau seh ich klarer*G* allerdings klappt das ganze mit LAtitude, Longitude, VS und Heading immernoch nicht so wirklich, da kommen ziemliche murkswete bei raus...

HansHartmann 20.11.2003 14:27

Kaffee hilft immer.

Die Werte, die FSUIPC zurückliefert sind keine Extended (das wären 10 Byte-Variablen). Das sind:
- bei Länge 1: BYTE
- bei Länge 2: WORD
- bei Länge 4: DWORD
- bei Länge 8: REAL

philharmony 20.11.2003 14:54

ok, danke hab ich auch grad rausgefunden, ich kamn auf extended nur durch die fehlermeldung "inkompatible typen string und extended"...ich komm dem ganzen immer näher, nur bei lat und logitude kommt noch irgenden quatsch raus und bei vs hab ich das problem dass der POSITIVE wert immer stimmt, sobald man aber sinkt, also ab -1 ft/min kommt wieder ein POSTIVER 9 oder 10 stelliger wert raus...falsches format???

philharmony 20.11.2003 20:59

hmmm, hab grad noch ein grosses problem entdeckt: ich kann in der Delphi Paintbox einen text (tcanvas.text) nur "richtigrum" also horizontal ausgerichtet schreiben, in der iriginal B737 ist aber ZB um das ND im RoseMode die Gradzahlen tangential zum Kreismittelpunkt ausgerichtet(also bei hdg=0 steh die 180° "auf dem Kopf)...gibts da nen trick das zu realisieren?
grüssle

PIPER28 21.11.2003 11:22

Werte für IAS
 
Hallo Phil,

die Ansteuerung der Servos meiner Analogintrumente programmiere ich in Visual Basic.

Den Wert für die IAS ermittele ich folgendermaßen:

If FSUIPC_Read(&H2BD, 4, VarPtr(speed), dwspeed) Then

If FSUIPC_Process(dwspeed) Then

speedvalue = Format((speed) * (2), "000")
End If
End If
lblias.Caption = Format((speed) * 2, "000")

Funktioniert einwandfrei.

Vielleicht hilft es Dir weiter!

Viele Grüße

Günter

PIPER28 21.11.2003 13:21

Hallo Phil,

mein Beitrag war wohl etwas zu spät. Hans Hartmann hat ja schon in etwa die gleiche Antwort gegeben. Nichts für ungut !

Gruß
Günter

philharmony 21.11.2003 14:11

Jo, IAS hab ich inzwischen, mein Problem sind die werte für VS, Heading (kann ich die noch wo lesen oder nur über die "whiskey compas degrees"??) alle winkelwerte, also auch bank und pitch angle und die Latitude und Longitude.
Grüssle Phil

PIPER28 21.11.2003 15:41

Hdg, VS , Pitch , Bank
 
Hallo Phil,

hier einige Auszüge , die o.g. Werte betreffen:

Heading ins Label schreiben
If FSUIPC_Read(&H583, 4, VarPtr(hdg), dwHeading) Then
If FSUIPC_Process(dwHeading) Then

lblfshdg.Caption = Format((hdg * 1.4117647), "000")
'--------------------------------------------------------------
' Pitch ins Label schreiben
If FSUIPC_Read(&H57A, 4, VarPtr(pitch), dwpitch) Then

If FSUIPC_Process(dwpitch) Then

lblpitch.Caption = Format(pitch * 0.0256 * (-0.25), "00")
'--------------------------------------------------------------
' Bank ins Label schreiben
If FSUIPC_Read(&H57E, 4, VarPtr(bank), dwbank) Then
' "Read" proceeded without any problems

If FSUIPC_Process(dwbank) Then
' "Process" proceeded without any problems
End If
End If
lblbank.Caption = Format((bank * 0.0256 / 4), "00")
'--------------------------------------------------------------
' Vertikal ins Label schreiben
If FSUIPC_Read(&H2C8, 4, VarPtr(vert), dwvert) Then

If FSUIPC_Process(dwvert) Then

lblvsi.Caption = Format((vert * 0.768946845), "0000")
End If
End If




Viele Grüße

Günter

philharmony 21.11.2003 19:41

hi, ist das java? werde es mal versuchen so zu machen...grüssle

philharmony 21.11.2003 21:17

äääääh, wieso "H"??? bei hex werten gehts doch von 0-9 und dann A-F...wo kommen die Hs in den offsets aus deinen beispielen hjer? grüssle Phil

PIPER28 22.11.2003 18:19

Hallo,
die Sprache ist Visual Basic und das "H" vor der Hex Zahl macht dem Programm die Variable als Hex bekannt.
Die eigentliche Variable ist natürlich ohne "H".

Gruß
Günter

MarkusV 23.11.2003 01:59

Hi Phil,

bzgl. negativer Werte (bei der V/S) ... nicht, daß ich wirklich Ahnung von FSUIPC-Programmierung hättte (allerdings von anderen FS- im besonderen den PS1.3-Interfaces), aber mir scheint, du erwartest einen Integer (also einen vorzeichenbehafteten Wert) und bekommst ein Word (DWORD etc ... was auch immer) zurück.
Ein übliches Problem beim Programmieren ... der Computer kennt nur z.B. Bytes mit Werten von 0 bis 255. Ein ShortInt(eger) sei nun eine Variable mit dem Wertebereich -128..127 und sie werde in einem Byte gespeicher. Für Werte von 0..127 ist das einfach, negative Werte werden einfach von oben herab gezählt. 255 entspricht dann - 1, 254 wird zu -2, 253 zu -3 und so weiter. Auf gut Deutsch, das höchste Bit im Byte speichert das Vorzeichen (0 = +, 1 = -1). So wird es womöglich auch bei dir sein.

> in der iriginal B737 ist aber ZB um das ND im RoseMode die Gradzahlen
> tangential zum Kreismittelpunkt ausgerichtet(also bei hdg=0 steh die
> 180° "auf dem Kopf)...gibts da nen trick das zu realisieren?

Vergiss Tcanvas und erfinde das Rat nicht neu. Tcanvas ist vielleicht einfach, aber einfach für ein ND viel zu langsam.
Verwende lieber eine vorhandenen schnelle Grafikschnittstelle wie DirectX oder OpenGL. Für beide gibt es Header und Units für Delphi. ;) Ich persönliche bevorzuge OpenGL für mein ND, weil ich es für eleganter halte...

Markus

p.s.
Hans hat schon recht ... du hast dir viel vorgenommen. Geh es am besten Stück für Stück an. ;)

philharmony 23.11.2003 20:12

OK, kam ja wieder einiges an Info zusammen, danke an alle. Also erstmal zu den "H"s, hätt ich mir denken können das das für hex steht*lach* aber einige der offsets aus deinem besipiel sind dreistellig, sind das die mit "0" am anfang?

@Markus
Canvas is halt das einzige mit dem ich je grafisch programiert habe, was ist open gl und wie funktioniert es?
Und wie kann ich den ne WORD-Variable denn nu so umrechnen oder formatieren dass sie den korrekten wert anzeigt?
grüssle Phil

MarkusV 24.11.2003 10:05

> Canvas is halt das einzige mit dem ich je grafisch programiert habe
> was ist open gl und wie funktioniert es?

Gut, aber Canvas ist einfach für so etwas nicht geeignet, da viel zu langsam und unflexibel. Ich bin vor zwei Jahren den gleichen Weg gegangen und habe nach kürzester Zeit alles verworfen und bin auf OpenGL umgestiegen.

OpenGL ist - wie gesagt - eine Grafikschnittstelle zur Grafikhardware. Im Prinzip also das gleiche wie DirectX. Du sagst der Hardware (bzw. dem Treiber), wo deine Kamera steht, wo die Lichtquellen und wo deine Grafikobjekte und die Grafikkarte berechnet das Bild. Bei einer reinen 2D-Szene wie einem ND ist es sogar noch einfacher - du mußt "nur" die entsprechenden Vektorlinien zeichen.
Infos? http://www.opengl.org
Tutorials gibt es ohne Ende im Netz, ein guter Einstieg ist http://www.delphi3d.net - aber nimm auch google.

> Und wie kann ich den ne WORD-Variable denn nu so umrechnen oder formatieren
> dass sie den korrekten wert anzeigt?

Hatte ich doch auch schon erklärt ... ;)

a = vorzeichenbehafteter Wert
M = Maximaler Wert, den ein Byte / Word etc annehmen kann. (also 256, 65536 usw)
c = Wert ohne Vorzeichen

dann a = c - M bzw c = a + M, also

-10 (vorzeichen) == +65526 (ohne Vorzeichen) sind für den Computer identische Werte.

Markus

philharmony 24.11.2003 10:29

ok, werd mir das nachher nochma in ruhe anschauen, das problem is ja, dass zb der VS-wert sowohl positiv, als auch negativ sein kann, und eine if vs<0 then abfrage geht ja in dem fall nicht, da dieser wert ja nie kleiner 0 wird...

HansHartmann 24.11.2003 10:57

Nimm einfach integer statt dword und schon geht's (Ich hatte bei meiner Liste nicht an die vorzeichenbehafteten Werte gedacht). Hier also die aktualisierte Fassung:

1 Byte o. VZ: Byte
1 Byte m. VZ: Shortint
2 Byte o. VZ: Word
2 Byte m. VZ: Smallint
4 Byte o. VZ: DWord (oder Cardinal oder Longword)
4 Byte m. VZ: Integer
8 Byte: Double

Der FS speichert die Vertical Speed übrigens als 1/256 Meter pro Sekunde ab. Du musst den Ergebniswert also erst durch 1.30048 teilen, bevor Du Fuss pro Minute bekommst.

philharmony 26.11.2003 16:11

also es funktionier alles wunderbar, ausser pitch/bank sowie Lat/long, da kommen immernoch komische werte bei raus,könnte dafür jmd ein beispiel posten? es funzt einfach nicht:

FSUIPC_READ($0560, 8, @dausgabe, dwresult);
FSUIPC_Process(dwresult);
latitude:= dausgabe * 90.0/(10001750.0 * 65536.0 * 65536.0);
edit3.text:= floattostr(latitude);

FSUIPC_READ($0578, 4, @intausgabe, dwresult);
FSUIPC_Process(dwresult);
pitch:= intausgabe * *360/(65536*65536);//hier gibt es auch immer einen "überlauf fehler" habs in mehreren schritten versucht, sowie mit *0.0256+(-0,25); immer mist//
edit6.text:= floattostr(pitch);
ach ja VAR: dausgabe : double, intausgabe : integer;

was mache ich falsch? grüssle Phil

ts-abc 28.11.2003 02:34

Hi Phil,

Versuche es mal so dann müsste der Überlauffehler weg sein da Delphi sich beschwert bei Ergebnissen über 32bit im Integerbereich.

pitch := intausgabe * 360/(65536.0 * 65536.0);

Nach Beschreibung von FSuipc müssten die Rechenwege richtig sein.
Was bekommst du denn für werte raus?

Gruß
Thomas

philharmony 28.11.2003 18:17

entweder kommt "0" raus oder 7 oder 8 stellige, sich dandauernd ändernde werte, also sec1:6687439 sec2: 4509832498 usw. kein zusammenhabng erkennbar, ab und zu aus mit E-8 oder sowas am ende, also *10^-9, den überlauffehler hab ich in den griff gekrieget, indem ich die rechnung step by step durchführen lies, ich weiss nicht mehr weiter, haben sich evtl die offsets für den 2k2 geändert? ich bekomme alle werte raus, heading, altitude, airspeed usw, nur bei den winkel und lat long angaben spinnt alles

philharmony 28.11.2003 18:30

ok, der überlauffehler ist weg, jetzt kommen immer 0,00xyz werte raus, allerdings auch imnmer zwischen + und - wechselnd unabhängig von der fluglage, aber nur zur richtigstellung, pitch ist die fluglage, nose up/dn und Bank die schräglage nach l/r die am künstlichen horizont angezeigt wird oder?
grüssle Phil

ts-abc 05.12.2003 00:03

Hi Phil,

Habe mich jetzt einmal ein bisschen mit FSuipc beschäftig, das mit Pich nose up/down und Bank Schräglage nach l/r ist natürlich Richtig nur was ist hierbei die Formel zum errechnen der Werte?

Ich habe mir einmal die Rohwerte von Pitch angesehen die FSuipc ausspuckt und diese werden bei nose down Plus-Werte und bei nose up Minus-Werte habe nun mal folgendes vor der Formel von FSuipc gesetzt:

Pitch*0.0256*(-0.25)*360/(65536.0*65536.0)

aber das ist mit Sicherheit noch nicht die richtige Formel aber ein Ansatz. Da ich nicht wirklich weiß was für werte am ende Rauskommen müssen kann ich nicht viel dazu sagen.

Was Lat/Lon betrieft da werde ich mir noch einmal die Rohwerte von FSuipc ansehen dann mal sehen denn bei Lat/Lon kommt bei mir grundsätzlich null raus.

Gruß Thomas

philharmony 05.12.2003 14:20

hi, danke für diene hilfe, das proble ist, die formel hab ich auch schon, es kommt einfach da nichts vernünftiges bei raus, viel wichtiger ist in dem fall, in welchen variablen typ muss ich die denn speichern?
also dwresult ist immer dword oder? das ist das was ausm fsuioc kommt, dann das mit dem @davor ist der wert in den die funktion process es dann umwandelt und die muss den richtigen typ aben, korrekt?
grüssle phil


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:24 Uhr.

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