![]() |
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 |
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 |
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 |
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 |
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; |
ok, muchas gracias, das mit dem format hab ich immernochned verstanden...aber das is genau das was ich gesucht habe, vielen dank
|
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 |
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 |
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. |
hajo klar stück für stück, aber stück für stück wird eben die liste abgearbeitet....*G*
|
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 |
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!!! |
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:
|
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
|
â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 |
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.
|
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*)
|
also die werte vom fsuipc sind vom typ extended und den kann ich nicht bearbeiten...wie kann ich extended in real umwandeln????
|
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...
|
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 |
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???
|
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 |
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 |
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 |
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 |
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 |
hi, ist das java? werde es mal versuchen so zu machen...grüssle
|
äääää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
|
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 |
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. ;) |
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 |
> 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 |
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...
|
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. |
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 |
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 |
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
|
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 |
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 |
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