qrg = Steuerung eines Funkgeräts

Vorstellungen von Programmen, welche mit Lazarus erstellt wurden.
Antworten
yodi
Beiträge: 22
Registriert: So 11. Jan 2015, 06:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: bei Göttingen
Kontaktdaten:

qrg = Steuerung eines Funkgeräts

Beitrag von yodi »

Moin,

Erst mal Danke an die Forengemeinde weil ohne eure Hilfe hätte ich es nicht geschaft.
Nun zum Programm. Funkamateure und Rodio höhrer drehen gerne über die Mittelwellen bzw. Kurzwellen Bänder. Es ist schon spannend wen aus dem Rauschen plötzlich eine Radiostaton auftaucht. Und manchmal vergist man die Frequenz. Dafür habe ich eine Webseite erstellt http://www.qrg-liste.de.vu
Jeder kann in die Liste Frequenzen eintragen. Beim Anzeigen der Frequenzen kann ein bestimmter Link (qrg://004.470.000;000.000.000;AM;; z.B für Radio Togo ) geklickt werden. Der Browser soll dann mein Programm aufrufen. :D

Mein Programm prüft beim Start ob ein Parameter übergeben wurde. Wenn Ja dann wird geprüft ob eine INI-Datei vorhanden ist. Wenn nicht dann wird sie angelegt. In der Datei steht der Port, Geschwindigkeit und die Nummer des Funkgerätes.

Wird das Programm mit einer Frequenzangabe z.B. qrg://004.470.000;000.000.000;AM;; oder mit dem Parameter -l aufgerufen dann wird
das Programm rigctl.exe ausgeführt. rigctl ist im Softwarepaket Hamlib enthalten. http://sourceforge.net/projects/hamlib/
Der Parameter -l listet alle verfügbare Geräte auf. bei einer Frequenzangabe wird dann das Funkgerät auf die Frequenz eingestellt.
Moderne Funkgeräte bzw. Empfänger haben eine Spezielle Schnittstelle (cat) für diese Zwecke.

Da Das Programm Kurz ist hier der Code:

Code: Alles auswählen

 
program qrg;
/////////////////////////////////////////////////////////////////////////////////////
/// qrg ein Programm um bei einen Empfänger/Sender die Frequenz (qrg) zu stellen ///
/// qrg.exe wertet ein übergebenen Link (qrg://Frequenz1;Frequenz2;Mode;;) aus   ///
/// und ruft das Programm rigctl.exe auf welches den Sendeempfänger einstellt   ///////////
/// rigctl.exe ist in dem Programmpaket HamLib http://sourceforge.net/projects/hamlib/  ///
///                                                                                    ///
///  (c) Dirk Unverzagt   yodi at gmx.net  http://www.qrg-liste.de.vu                 ///
///  qrg.exe darf für Private zwecke Kostenlos verwendet und weitergegeben werden    ///
///  Jeglicher gewerblicher Nutzung bedart der schriftlichen zustimmung             ///
//////////////////////////////////////////////////////////////////////////////////////
 
 
{$mode objfpc}{$H+}
 //http://www.qrg-liste.de.vu/
uses
{$ifdef Unix}
  BaseUnix, Classes, sysutils, Process;
{$else}
  Dialogs,sysutils, Process,Classes,Windows;
{$endif}
 
 
type
  TStringArray = array of string;
 
 
 // function strsplit(S: string): TStringArray;
 
var
     Datei: Text;       (* Dateizeiger *)
     zeile: string;     (*      *)
     trx:   string;     (* funkgerät *)
     speed: string;     (* Baudrate für serielle Schnittstelle     *)
     port:  string;     (* Serielle schnittstelle     *)
     Position : integer;(* Position im String    *)
     PositionA : integer;
     PositionB : integer;
     parameter: string;
     wert: String;
     AProcess: TProcess;
     AStringList: TStringList;
     zeilennr: integer;
     befstr: string;
     VFOa: string;
     VFOb: String;
     TRXMode: String;
     rigctlpath : string;
     outputstring,rigbinary:ansistring;
     argumenten: array of string;
     trxarray: array of string;
     ok: boolean;
 
     function strsplit(S,t: string): TStringArray;
        var
           tmparray: array of string;
           z : integer;
           z2 : integer;
 
        begin
             //writeln(s);
             z2:=0;
             SetLength(tmparray, 5); // Das Array wird auf eine Größe von 5 Elementen geändert
 
             for z := 1 to Length(s) do
                 begin
                      if s[z] <> t then
                         begin
                             tmparray[z2] := tmparray[z2] +  s[z] ;
                         end
                      else
                         begin
                            inc(z2)// um 1 erhöhen
                         end;
                 end;
             result:=tmparray;
        end;
begin
 
 
 
       rigctlpath := 'c:\Program Files (x86)\hamlib-win32-1.2.15.3\bin\'; // Hier sollte sie liegen bei wondows7
       if FileExists(rigctlpath+'
rigctl.exe') then
       begin
          if not FileExists('
qrg.ini') then
              begin
                   //Datei existiert nicht --> erstellen
                    assignfile(Datei, '
qrg.ini');
                    rewrite(Datei);
                    WriteLn (Datei, '
#########################################');
                    WriteLn (Datei, '
# Ini Datei für das Programm qrg        #');
                    WriteLn (Datei, '
# qrg dient zum wechseln einer Frequenz #');
                    WriteLn (Datei, '
# mittels HamLib bei ein Transceiver    #');
                    WriteLn (Datei, '
# (c) by Dirk Unverzagt, DL8AAX         #');
                    WriteLn (Datei, '
#########################################');
                    WriteLn (Datei, '
# Serielle Schnittstelle');
                    WriteLn (Datei, '
# port=/dev/ttyUSB0');
                    WriteLn (Datei, '
#port=/dev/ttyS0  ');
                    WriteLn (Datei, '
# für windos');
                    WriteLn (Datei, '
port=com1 ');
                    WriteLn (Datei, '
');
                    WriteLn (Datei, '
# Baudrate');
                    WriteLn (Datei, '
speed=4800 ');
                    WriteLn (Datei, '
');
                    WriteLn (Datei, '
# TRX=Nr. Die Nummer deines TRX ');
                    WriteLn (Datei, '
# Abfragen kannst du die Nr.mir rigctl -');
                    WriteLn (Datei, '
trx=1  ');
                    WriteLn (Datei, '
');
                    WriteLn (Datei, '
# Pfad zu rigctl.exe');
                    WriteLn (Datei, '
rigctlpath=c:"\Program Files (x86)"\hamlib-win32-1.2.15.3\bin\');
 
                    closefile(Datei);
              end
          else
              begin
                    // Datei existiert
                    Assign (Datei, '
qrg.ini');     (* Pfad festlegen *)
                    Reset (Datei);    (* Datei zum Lesen oeffnen *)
 
                    REPEAT
                          ReadLn (Datei, zeile);   (* eine Zeile lesen *)
 
                          if zeile[1]='
#' then // beginnt die Zeile mit ein #
                              else
                              begin    // nein
                                    //WriteLn (zeile);   (* eine Zeile am Bildschirm ausgeben *)
                                    Position := Pos('
=', AnsiLowerCase(zeile));
                                    if Position <> 0 then   // ein = ist vorhanden also parameter zeile
                                      begin
                                           parameter := Trim(Copy(zeile, 1,Position-1 )); // Text bis zum =
                                           wert :=  Trim(Copy(zeile, Position+1, Length(zeile))); // Text bis zum =
                                           case LowerCase(parameter) of
                                                '
port':
                                                     port := wert;
                                                '
speed':
                                                     speed := wert;
                                                '
trx':
                                                     trx := wert;
                                                '
rigctlpath':
                                                     rigctlpath :=wert;
                                           end;
                                      end;
                              end;
                    UNTIL EOF (Datei);  (* Abbruch, wenn das Zeilenende erreicht ist; also wenn EOF TRUE liefert *)
 
                    Close (Datei);  (* Datei schliessen *)
              end; // datei einlesen
       //Paremeter übergabe
       if ParamCount > 0 then
                            begin
                                 case LowerCase(ParamStr(1)) of
                                      '
-l':
                                           begin
                                                writeln('
Unterstuetzte Transceiver');
                                                setlength(argumenten,1); //
                                                argumenten[0]:='
-l';
                                                rigbinary:=IncludeTrailingPathDelimiter(rigctlpath)+'
rigctl.exe';
                                             //    rigbinary:=IncludeTrailingPathDelimiter(rigctlpath)+'
test.bat';
                                           //end;
                                                ok:=fileexists(rigbinary);
                                                writeln('
fileexist'); writeln(ok);
                                                if ok then
                                                       begin
                                                          ok:= RunCommand(rigbinary,argumenten,outputstring);
                                                          if ok then
                                                                begin
                                                                       writeln(outputstring);
                                                                end
                                                          else
                                                              begin
                                                                  writeln('
Error: Befehl geht nicht');
                                                              end;
                                                       end;
 
 
 
 
                                           end;
                                      '
-h','-help','--help':
                                         begin
                                              writeln('
');
                                              writeln('
Hilfe ');
                                              {$IFDEF WIN32}
                                              writeln('
Programmaufruf: qrg.exe VFOa;VFOb;mode ');
                                              writeln('
oder ');
                                              writeln('
qrg.exe -l fuer eine liste der verfuegbaren TRX');
                                              writeln('
qrg.exe -h fuer diese hilfe');
                                              {$ENDIF}
                                              {$IFDEF LINUX}
                                              writeln('
Programmaufruf: qrg VFOa;VFOb;mode ');
                                              writeln('
oder ');
                                              writeln('
qrg -l für eine liste der verfügbaren TRX');
                                              writeln('
qrg -h für diese hilfe');
                                              {$ENDIF}
                                              writeln('
');
                                              writeln('
Die Datei qrg.ini mus angepast werden');
                                              writeln('
Port, Geschwindigkeit, TRX Nr. siehe qrg -l');
                                              writeln('
');
                                         end;
                                     else
                                         begin    // qrg Parameter= qrg://003.556.000;;CW;; oder qrg://028.780.000;000.000.000;USB;;
                                         zeile := ParamStr(1);
                                         zeile := StringReplace(zeile, '
qrg://', '', [rfReplaceAll]);  //qrg:// entfernen
                                         trxarray:=strsplit(zeile,';');
                                          VFOa := trxarray[0];
                                          VFOb := trxarray[1];
                                          TRXMode := trxarray[2];
                                          befstr :='rigctl -m ' + trx + ' -s '+speed+' -r '+port+' F ' + VFOa + ' m '+ TRXMode;
                                        // RIGCTL aufrufen
                                        setlength(argumenten,7); // 0..6 = 7 Elementen
                                        argumenten[0]:='-m';
                                        argumenten[1]:=trx ;
                                        argumenten[2]:='-s';
                                        argumenten[3]:=speed;
                                        argumenten[4]:='-r';
                                        argumenten[5]:=port;
                                        argumenten[6]:='F';
                                        // usw, immer ein Argument per Linie.  -s speed sind zwei Argumenten.
                                        rigbinary:=IncludeTrailingPathDelimiter(rigctlpath)+'rigctl.exe';
                                        ok:=fileexists(rigbinary) and RunCommand(rigbinary,argumenten, outputstring);
                                        if ok then
                                              begin
                                                 writeln(outputstring);
                                              end;
 
                                         end;
 
                                 end;// ende case
                            end
                            else
                                begin
                                    writeln('Falscer Programmaufruf ');
                                    writeln('qrg.exe -h fuer Hilfe');
                                end;
          end
       else
           begin
           writeln('Kann  c:\Program Files (x86)\hamlib-win32-1.2.15.3\bin\rigctl.exe nicht finden');
 
           end;
end.
 
 
 


Als Nächstes will ich noch eine Installationsprogramm dafür schreiben.

Flotte Grüße
--------

Antworten