Forum | | | | Uwe Skärke | Hallo ihr lieben XProfaner, jetzt komm ich mal mit einem richtigen Hammerproblem (jedenfalls für mich) und hoffe wir (IHR) bekommen das hin, sonst ist mein ganzes Projekt im Eimer und ich heul mich tod...
Also, wie ja in meiner Vorstellung bereits beschrieben bin ich son verrückter Funkamateur und will folgendes erreichen :
Es gibt im Weltall eine ganze Menge von Amateurfunksatelitten, über die man Funkbetrieb machen kann, u.a auch die ISS. Um zu wissen wo die Dinger gerade rumfliegen, gibt es verschiedene Satelitten-Tracking-Programme, die graphisch zeigen wo der gesuchte Sat gerade rumturnt. Da werden praktisch u.a. die Elevation, Azimut und Entfernung aus den Keplerdaten errechnet und angezeigt,so dass ich dann meine Richtantennen genau auf den Sat zielen kann...
Das war jetzt ein kleiner Exkurs zum Amateurfunkbetrieb über Satelitten... (hats Spass gemacht ??? )
So, nun ist eins dieser Trackingprogramme mit graphischer Darstellung der Umlaufbanen der Sat. das Program Orbitron. Ich will nun meinem Funkgerät über die Serielle Schnittstelle mit einem Profan-PRG die aktuelle Frequenz mitteilen. Diese Frequenz ändert sich laufend (Dopplereffekt) und wird von ORBITRON über die DDE-Schnittstelle zur Verfügung gestellt. Meine Idee war nun, den String mit den Daten aus dem Programm Orbitron auszulesen, zu bearbeiten und dann an das Funkgerät weiter zu geben. Soweit bin ich gekommen, Orbitron wird gestartet, die Verbindung zu DDE ITEM (Tracking) wird auch aufgebaut (x% > 32 und dann war und bin ich am Ende...
DDE-Test
declare x%
x%=@winexec(CrogrammeOrbitronOrbitron.exe,2) ddelink Orbitron,Tracking hier müsste jetzt der String TrackingData aus Orbitron ausgelesen werden... und dann wird dieser String weiterverabeitet...
ddeterminate
END
Das Steuern des Funkgerätes und die Übergabe von Befehlen an das Funkgerät klappen schon ausgezeichnet, nur ich krieg halt die Daten nicht über den DDE-Clienten von Orbitron ausgelesen. Wie mir Roland im Forum schrieb, ist diese Funktion in Profan nicht implementiert (heul), allerdings sollte es über WINDOWS-API gehen, da steh ich allerdings auch im Wald....
Jetzt kommt Alles was ich an Infos noch so habe und dann hoffe ich, dass Ihr mir irgendwie weiterhelfen könnt...
1. Beschreibung DDE-Client Orbitron :
-------------------------------------------------------------------------------- Specification of DDE drivers for Orbitron www.stoff.pl --------------------------------------------------------------------------------
Contents: 1. Introduction 2. Technical data 3. Data format 3.1. TrackingData item 3.2. TrackingDataEx item 4. My DDE Client 5. Let Orbitron support your driver 6. Your driver for all! 7. WiSP DDE Client
-- 1. Introduction -------------------------------------------------------------
Orbitron is working as server in DDE conversations, so you can write your own DDE client that can e.g. control rotor and radio devices. Such programs are called by me Drivers.
-- 2. Technical data -----------------------------------------------------------
Drivers EXE file: Name of drivers EXE file (without .EXE) is displayed on drivers list in Orbitron. Drivers main window title or application title must be the same as EXE file name to let Orbitron check is driver already running.
DDE conversation parameters: Source application : Orbitron Link topic : Tracking Link items : TrackingData item for communication with WiSP DDE Client with basic data (Satscape format) TrackingDataEx item with extended data set Link item is changed by Orbitron each time when current data is recalculated (e.g. 1s, 5s...) and when downlink/uplink frequencies or mode are changed.
-- 3. Data format --------------------------------------------------------------
Please note: - all angles are given as decimal degrees, - decimal separator is . (dot), - TrackingDataEx and TrackingData can be an EMPTY string If NO satellite are tracked, - TrackingDataEx can contain only AOS field if NO satellite are tracked.
-- 3.1. TrackingData item ------------------------------------------------------
Format of string: SNxxx AZxxx.x ELxx.x DNxxxx UPxxxx DMxxxx UMxxxx Fields: SN - tracked satellite name (spaces converted to _) AZ - azimuth in range form 0.0 to 360.0 EL - elevation in range from -90.0 to 90.0 please note possibility of negative values DN - downlink frequency with doppler, [Hz] in range from 0 to N UP - uplink frequency with doppler, [Hz] in range from 0 to N DM - downlink mode (optional field) UM - uplink mode (optional field) Examples: SNISS_ZARYA AZ182.1 EL36.3 DN145800000 UP145800000 UMFM-N SNISS_ZARYA AZ180.3 EL-10.1 DN145800000 UP145800000
-- 3.2. TrackingDataEx item ----------------------------------------------------
Format of string: SNxxx AZxxx.x ELxx.x DNxxxx UPxxxx DMxxxx UMxxxx AOSxxx Fields: SN - tracked satellite name in quotes RA - range [km] RR - range rate [km/s] LO - longitude in range from -180.0000 to 180.000 (W to E) LA - latitude in range from -90.0000 to 90.000 (S to N) AL - altitude [km] TU - UTC time (Format: YYYYMMDDhhmmss) TL - local time (Format: YYYYMMDDhhmmss) AOS - AOS notification for satellite xxx (name in quotes; AOS notification is provided for all tracked objects, not only for active one) Other fields same as in TrackingData item. Examples: SNISS ZARYA AZ182.1 EL36.3 DN145800000 UP145800000 (...) SNISS ZARYA AZ182.1 EL36.3 DN145800000 UP145800000 (...) AOSHST AOSHST
-- 4. My DDE Client ------------------------------------------------------------
My DDE Client is an example of users custom driver for Orbitron with full source code in Delphi 5. It should helps you to write your own driver for rotor or radio hardware. Further information you will find in MAIN.PAS file.
-- 5. Let Orbitron support your driver -----------------------------------------
Please set specific name for your driver program, e.g. SuperRotor.exe. Then you can edit {Orbitron}ConfigSetup.cfg file (*) by adding line to the [Drivers] section (please create it if doesnt exist) with your driver information. Example: [Drivers] SuperRotor=d:My filesSuperRotor.exe SuperRotorTwo= Next time you run Orbitron, your driver will be listed on Rotor/Radio panel. You can launch it there. If no path specified, Orbitron will ask you about your drivers location (drivers located in {Orbitron} directory will be found automatically).
*) {Orbitron} - replace it with directory where Orbitron is installed to, e.g. crogram FilesOrbitron. This path is available in Windows registry: HKEY_CURRENT_USERSoftwareStoffOrbitronPath WARNING: User can define his own location where the Config directory is. This value is stored in registry: HKEY_CURRENT_USERSoftwareStoffOrbitronUserPath So, if this value is specified, you have to use it instead of previous one. HINT: You can check are files definied by: HKEY_CURRENT_USERSoftwareStoffOrbitronPath + ConfigSetup.cfg HKEY_CURRENT_USERSoftwareStoffOrbitronUserPath + ConfigSetup.cfg exists and then add your config line to both.
-- 6. Your driver for all! -----------------------------------------------------
Have you already done your driver? Please, send me it. Ill put it on Orbitron website to share it with all people with same hardware as yours.
-- 7. WiSP DDE Client ----------------------------------------------------------
WiSP DDE Client is an application written by Fernando Mederos, CX6DD and available on [...] It works as DDE Client and support many kinds of hardware and software. To use it with Orbitron, following settings are required: Receive DDE from : Orbitron (or Satscape) Source application : Orbitron Link Topic : Tracking Link Item : TrackingData Query Interval : 1 sec. Orbitron will set these values when you launch WiSP DDE Client from Rotor/Radio panel.
-- Last updated 2005.02.26 -----------------------------------------------------
und zweitens ein Beispielprogram in PASCAL :
{ My DDE Client is an example of users custom driver for Orbitron. version 1.02, released 2003.11.07 1.03, released 2004.09.04 1.04, released 2004.09.10 1.05, released 2005.02.26 (C) 2003-2005 by Sebastian Stoff sebastian@stoff.pl www.stoff.pl
You can use this source to receive tracking data from Orbitron and send it to your rotor/radio hardware via COM/LPT/USB interfaces. Other purposes are also allowed, depending on your invention... To change this source code into the driver, you must write code specific to hardware you have in UpdateRotorAndRadio procedure. Please find it on the end of this file.
Detailed information are available in READ_ME.TXT file.
CHANGING, COMPILING AND FREE DISTRIBUTING OF THIS PROGRAM/SOURCES IS ALLOWED FOR ***ORBITRON*** RELATED PURPOSES WITHOUT MY PERMISSION. }
unit main;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DdeMan, StdCtrls, ExtCtrls, Buttons, Registry, ComCtrls;
type TSatData = record name : String; //satellite name azm,elv : Double; //observation angles upf,dnf : Double; //uplink and downlink frequencies (with doppler shift) upm,dnm : String; //uplink and downlink modes end; TFMain = class(TForm) Tracking: TDdeClientConv; TrackingDataEx: TDdeClientItem; Label1: TLabel; l_st: TLabel; Label3: TLabel; l_dd: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Bevel1: TBevel; l_az: TLabel; l_el: TLabel; l_uf: TLabel; l_df: TLabel; l_um: TLabel; l_dm: TLabel; Bevel2: TBevel; l_na: TLabel; Label4: TLabel; SpeedButton1: TSpeedButton; l_aos: TLabel; Label2: TLabel; procedure TrackingOpen(Sender: TObject); procedure TrackingClose(Sender: TObject); procedure TrackingDataExChange(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure l_ddClick(Sender: TObject); private { Private declarations } public { Public declarations } procedure ParseString(s: String; var data: TSatData); procedure PrintData(data: TSatData); procedure UpdateRotorAndRadio(data: TSatData); end;
var FMain : TFMain; SatData : TSatData; Reg : TRegistry; PathP : String; AOS : String;
implementation
{$R *.DFM}
procedure Replace(var s: String; subs1,subs2: String); var i : Integer; begin if subs1= then Exit; if subs1=subs2 then Exit; i:=Pos(subs1,s); while i>0 do begin Delete(s,i,Length(subs1)); Insert(subs2,s,i); i:=Pos(subs1,s); end; end;
function FieldToReal(s: String):Real; var c : Integer; begin val(s,result,c); if c>0 then result:=0; end;
function GetField(source,field: String):String; var p1,p2 : Integer; quotes : Boolean; s2 : String;
function FindField(source,field: String):Integer; var i : Integer; quotes : Boolean; begin quotes:=False; for i:=1 to Length(source) do begin if source= then begin quotes:=not quotes; Continue; end;
if quotes then source:=-; end; result:=pos(field,source); end;
begin source:= +source; field:=UpperCase(field); field:= +field; p1:=FindField(source,field); if p1=0 then begin result:=; Exit; end;
s2:=; p2:=p1+Length(field); quotes:=False; while p2<=Length(source) do begin if source[p2]= then begin quotes:=not quotes; Inc(p2); Continue; end;
if (source[p2]= ) and not quotes then Break;
s2:=s2+source[p2]; Inc(p2); end; result:=s2; end;
procedure TFMain.ParseString(s: String; var data: TSatData); begin if s= then with data do begin name:=; azm:=0; elv:=0; upf:=0; dnf:=0; upm:=; dnm:=; AOS:=; Exit; end;
s:=UpperCase(s); Replace(s,,,.); with data do begin name:=GetField(s,SN); azm:=FieldToReal(GetField(s,AZ)); elv:=FieldToReal(GetField(s,EL)); upf:=FieldToReal(GetField(s,UP)); dnf:=FieldToReal(GetField(s,DN)); upm:=GetField(s,UM); dnm:=GetField(s,DM); AOS:=GetField(s,AOS); end; end;
procedure TFMain.PrintData(data: TSatData); begin with data do begin l_na.Caption:=name; l_az.Caption:=FloatToStrF(azm,ffFixed,4,1); l_el.Caption:=FloatToStrF(elv,ffFixed,4,1); l_uf.Caption:=FloatToStrF(upf,ffFixed,12,0)+ Hz; l_df.Caption:=FloatToStrF(dnf,ffFixed,12,0)+ Hz; l_um.Caption:=upm; l_dm.Caption:=dnm; end; if AOS<> then l_aos.Caption:=AOS (+AOS+) else l_aos.Caption:=None; end;
procedure TFMain.SpeedButton1Click(Sender: TObject); begin FMain.Close; end;
procedure TFMain.TrackingOpen(Sender: TObject); begin l_dd.Caption:=Opened; end;
procedure TFMain.TrackingClose(Sender: TObject); begin l_dd.Caption:=Closed; l_st.Caption:=No data; ParseString(,SatData); PrintData(SatData); end;
procedure TFMain.TrackingDataExChange(Sender: TObject); var s : String; begin s:=Trim(TrackingDataEx.Text); if s= then l_st.Caption:=No data else l_st.Caption:=s; ParseString(s,SatData);
PrintData(SatData); UpdateRotorAndRadio(SatData); end;
procedure TFMain.FormCreate(Sender: TObject); begin ParseString(,SatData); PrintData(SatData);
PathP:=ExtractFileDir(ParamStr(0)); if PathP[length(PathP)]<> then PathP:=PathP+; ChDir(PathP);
If not FileExists(PathP+Orbitron.exe) then begin Reg:=TRegistry.Create; try if Reg.OpenKey(SoftwareStoffOrbitron,True) then Tracking.ServiceApplication:=Reg.ReadString(Path)+orbitron; finally Reg.CloseKey; Reg.Free; end; end; Tracking.OpenLink; end;
procedure TFMain.l_ddClick(Sender: TObject); begin Tracking.OpenLink; end;
procedure TFMain.UpdateRotorAndRadio(data: TSatData); begin { Please write support for your rotor/radio hardware here.
Use DATA record as source of current tracking data sended by Orbitron.
This procedure will be called by DDE engine after Orbitron made changes into the tracking data (each 1s, 5s, 10s or so). } end;
end.
soooooo, jetzt werde ich warscheinlich schlecht schlafen und alle zwei Minuten reinschauen, wass Ihr so aus diesem Wust so macht...
PS.: wer sich Orbitron mal anschauen möchte, hier die Adresse zum runterladen : www.stoff.pl
LG Uwe |
| | | | |
| | Frank Abbing | Den String, den du auslesen willst. Steht der irgendwo in einem Control? Z.B. einer Editbox? Mach bitte mal einen Screenshot, wo dieser String zu sehen ist. |
| | | | |
| | Uwe Skärke | Hallo Frank, eine mögliche Abbildung ist die : es geht um Azimut und Elevation und um Dopplerfrequenz up und down...
eins Screenshot von einer in Delphi geschriebenen DDE-Anwendung hab ich auch mal reingelegt, da sieht man den gesamten String wie er eben unter TrackingData von Orbitron bereitgestellt wird (oben, und der ändert sich jede sekunde...)
LG UWE |
| | | | |
| | Frank Abbing | Ist doch prima. Wenn irgendwo der String in einem Windows-Control steht kannst du ihn auslesen. Dein Programm könnte den Controlhandle ermitteln und den Text dann auslesen. |
| | | | |
| | Uwe Skärke | ... schönen guten Morgen Frank, ich hoffe Du bist Sonntagsfrühaufsteher ... na ja, ist ja klasse wenn Du es prima findest, aber da ich ja blutiger Anfänger bin, steh ich noch im Regen, mach doch mal nen Vorschlag wie ich das angehen könnte, wie Du an der Uhrzeit sehen kannst, kann ich nicht schlafen...
HELP !!!
LG, Uwe |
| | | | |
| | Uwe Skärke | ... evtl. hilft Dir das noch weiter bei der Lösung meines Problemes !!??
das zeigt Dein WhichLibraries beim Start von Orbitron an :
c:programmeorbitronorbitron.exe (WININET.DLL) c:programmeorbitronorbitron.exe (RASAPI32.DLL) c:programmeorbitronorbitron.exe (RASAPI32.DLL) c:programmeorbitronorbitron.exe (SHELL32.DLL) c:programmeorbitronorbitron.exe (USERENV.DLL) c:programmeorbitronorbitron.exe (SENSAPI.DLL) c:programmeorbitronorbitron.exe (RSAENH.DLL) c:programmeorbitronorbitron.exe (C:WINDOWSSYSTEM32MSWSOCK.DLL) c:programmeorbitronorbitron.exe (RASADHLP.DLL) c:programmeorbitronorbitron.exe (URLMON.DLL) c:programmeorbitronorbitron.exe (WININET.DLL) c:programmeorbitronorbitron.exe (C:WINDOWSSYSTEM32MSWSOCK.DLL) c:programmeorbitronorbitron.exe (DNSAPI.DLL) c:programmeorbitronorbitron.exe (IPHLPAPI.DLL) c:programmeorbitronorbitron.exe (WS2_32.DLL)
..................LG.........................Uwe............... |
| | | | |
| | Frank Abbing | Mit der Dll-Liste ist nichts anzufangen.
Starte mal meinen kleinen Code und gehe mit dem Mauszeiger über den String in deinem Programm. Wird der Text in meinem Fenster bei Fenstertext angezeigt? Wenn ja ist das schon die halbe Miete... KompilierenMarkierenSeparieren(W) 2003 Frank Abbing
Declare sx&,sy&,bereich#,be#,erg&,erg2&,x&,y&,text$
Dim be#,8
Dim bereich#,1024
DEF GetCursorPos(1) !USER32,GetCursorPos
DEF WindowFromPoint(2) !USER32,WindowFromPoint
DEF ChildWindowFromPoint(3) !USER32,ChildWindowFromPoint
Def GetSysColor(1) !USER32,GetSysColor
Def ScreenToClient(2) !USER32,ScreenToClient
Def GetClassName(3) !USER32,GetClassNameA
Def GetWindowText(3) !USER32,GetWindowTextA
DEF NewWindowPos(7) !USER32,SetWindowPos
DEF AllocConsole(0) !KERNEL32,AllocConsole
Proc DText
Parameters xx&,yy&,ttext$
Drawtext xx&,yy&,ttext$
EndProc
Windowtitle Fensterhandles...
windowstyle 26
window (%maxx/2-112),(%maxy/2-80)-224,164
settruecolor 1
cls GetSysColor(15)
NewWindowPos(%hwnd,-1,0,0,0,0,$13)
Usefont MS Sans Serif,13,0,0,0,0
SetDialogFont 1
whilenot %mousepressed=2
Sleep 10
GetCursorPos(be#)
x&=Long(be#,0)
y&=Long(be#,4)
erg&=@WindowFromPoint(x&,y&)
If erg&<>0
ScreenToClient(erg&,be#)
x&=Long(be#,0)
y&=Long(be#,4)
erg2&=@ChildWindowFromPoint(erg&,x&,y&)
EndIf
TextColor 0,GetSysColor(15)
DText 8,8, Maus Position X = +Str$(x&)+
DText 8,21,Maus Position Y = +Str$(y&)+
DText 8,38,Handle eigenes Fenster = $+@Hex$(%hwnd)+
DText 8,55,Handle unter Mauszeiger = $+@Hex$(erg&)+
DText 8,68,Handle unter Mauszeiger (Child) = $+@Hex$(erg2&)+
GetClassname(erg&,bereich#,128)Declare sx&,sy&,text$,x&,y&,bereich#
text$=String$(bereich#,0)
DText 8,85,Klassenname = +text$+
GetWindowText(erg&,bereich#,128)
text$=String$(bereich#,0)
DText 8,98,Fenstername = +text$+
@SendMessage(erg&,13,128,bereich#)
text$=String$(bereich#,0)
DText 8,111,Fenstertext = +text$+
wend
Dispose be#
Dispose bereich#
end
|
| | | | |
| | Uwe Skärke | hallo Frank
du bist da, ist ja klasse, hast aber ganz schön lange geschlafen ...
aber eben hab ich gemerkt, da is was da *freu*
so nun muss ich erst mal lesen was Du erfunden hast...
okay, das verswuch ich mal.. und Funke dich an ...
LG, Uwe |
| | | | |
| | Uwe Skärke | Hi Frank,
Du solltest den XProfan-Community-Nobel-Preis bekommen...
Also zur Auswertung :
Handle unter Mauszeiger unde Mauszeiger (Child) ist immer gleich, aber bei jedem Start von Orbitron anders (z.B. $206DC)
Bei Klassenname erscheint bei den mich interessierenden Boxen immer TEdit Bei Fenstername erscheint nie was, nix, niente, nada
... und das gei.... ist, bei Fenstertext steht genau das was ich brauche, Azimut Elevation,Frequenz ...
jetzt muss ich nur noch versuchen zu verstehen wadduda gemacht hast...
LG, Uwe |
| | | | |
| | Frank Abbing | Hi.
Handle unter Mauszeiger unde Mauszeiger (Child) ist immer gleich, aber bei jedem Start von Orbitron anders (z.B. $206DC)
Ja, das ist so auch logisch.
Bei Klassenname erscheint bei den mich interessierenden Boxen immer TEdit
Ok, kein Windows-übliches Editfeld...
Bei Fenstername erscheint nie was, nix, niente, nada
Auch logisch.
... und das gei.... ist, bei Fenstertext steht genau das was ich brauche, Azimut Elevation,Frequenz ...
Bingo! Somit kannst du dein Vorhaben ausführen.
jetzt muss ich nur noch versuchen zu verstehen wadduda gemacht hast...
Du mußt jetzt überlegen, ob dein Orbitron-Fenster immer am selbem Platz steht und immer im Vordergrund. Wenn ja, kannst feste Positionsangaben verwenden anstelle von Mauskoordinaten. Wenn nein, musst du anders vorgehen. Du mußt Orbitron.exe erkennen (über Prozesshandle oder Windowname), das betreffende Control mit dem Text lokalisieren (Fenstertext und Klassenname) und dann auslesen. Das ist die Methode, die ich verwenden würde. |
| | | | |
| | Uwe Skärke | okay, ...
die zweite Variante würde mir besser gefallen, allerdings brauch ich da noch mal Deine Hilfe
weil ich denke, dass bei verschiedenen Bildschirmauflösungen auch die Positionsdaten unterschiedlich sind und möglicherweise das Orbitron auch mal nicht im Vollbildmodus läuft...
... und immer daran denken, Du hast es hier mit einem Vorschulkind zu tun...
PS: und danke, hoffe ich habe Dir nicht den Sonntag vermasselt |
| | | | |
| | Frank Abbing |
... und immer daran denken, Du hast es hier mit einem Vorschulkind zu tun...
Dafür ist das Thema eigentlich zu schwierig. Ich kann mir denken, dass du dieses Programm benötigst. Besser wäre aber, mit einfacheren Dingen zu beginnen...
Auf den Screenshots meine ich zu erkennen zu erkennen, dass sich die von dir benötigten Informationen in mehreren Controls verstecken. Ist das richtig? Ich müßte genau wissen, welche Information(en) du ständig benötigst. |
| | | | |
|
AntwortenThemenoptionen | 14.438 Betrachtungen |
ThemeninformationenDieses Thema hat 2 Teilnehmer: |