Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. unit Unit1;
  2.  
  3. //Pause entweder mit SLEEP oder GetTickCount realisieren
  4. {$DEFINE GetTickCount}
  5.  
  6. //nur zeitlich begrenzte Benutzung erlauben
  7. //{$DEFINE TIMELOCK}
  8.  
  9. interface
  10.  
  11. uses
  12.   StrUtils,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  13.   Dialogs, AfComPort, StdCtrls, AfDataDispatcher, ExtCtrls, Buttons, DateUtils,
  14.   ComCtrls;
  15.  
  16. {$IFDEF TIMELOCK}
  17. const
  18.   //Sperr Datum
  19.   LockDate: String='03.02.2006';
  20.   //maximale Gültigkeit in Monaten gerechnet vom Kompilierungsdatum an
  21.   MaxLockMonth: Integer=2;
  22. {$ENDIF}
  23.  
  24. type
  25.   TForm1 = class(TForm)
  26.     AfComPort1: TAfComPort;
  27.     Label1: TLabel;
  28.     Label2: TLabel;
  29.     Label3: TLabel;
  30.     Button1: TButton;
  31.     ProgressBar1: TProgressBar;
  32.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  33.     procedure FormCreate(Sender: TObject);
  34.     procedure Button1Click(Sender: TObject);
  35.   private
  36.     { Private-Deklarationen }
  37.   public
  38.     { Public-Deklarationen }
  39.   end;
  40.  
  41.   procedure CloseControls;
  42.   procedure OpenControls;
  43.   procedure Status(Status: String);
  44.   procedure Status2(Status: String);
  45.   procedure Modus(Modus: String);
  46.   procedure About; stdcall;
  47.   function Version (): ShortString; stdcall;
  48.   function GetVersion(Datei: string): string;
  49.   {$IFDEF TIMELOCK}
  50.   function CheckTimer(): Boolean;
  51.   {$ENDIF}
  52.  
  53.  
  54.   function Split(const fText: String; const fSep: Char; fTrim: Boolean=false; fQuotes: Boolean=false):TStringList;
  55.  
  56.   function GetPaket(buffer: String): String;
  57.   function MakePaket(Paket: String):String;
  58.   function CalcPaketChksum(Paket: String): Integer;
  59.  
  60.   function GetSeriesFromReceiver(COM: Integer): Integer; stdcall;
  61.   function GetModelFromReceiver(COM: Integer): ShortString; stdcall;
  62.   function GetModelFromFile(SettingsFile: ShortString): ShortString; stdcall;
  63.  
  64.   function Upload(SettingsFile: ShortString; COM: Integer; Series: Integer): Boolean; stdcall;
  65.   function Download(SettingsFile: ShortString; COM: Integer; Series: Integer): Boolean; stdcall;
  66.  
  67.   function AutoUpload(SettingsFile: ShortString; COM: Integer; IgnoreHardwareCheck: Boolean): Boolean; stdcall;
  68.   function AutoDownload(SettingsFile: ShortString; COM: Integer): Boolean; stdcall;
  69.  
  70.   function Convert(Settings: ShortString; Settings_old: ShortString): Boolean; stdcall;
  71.   function XML(Settings: ShortString; Settings_xml: ShortString): Boolean; stdcall;
  72.   function CSV(Settings: ShortString; Settings_csv: ShortString): Boolean; stdcall;
  73.   procedure FlashReset(COM: Integer); stdcall;
  74.   function PortExists(COM: Integer): Boolean; stdcall
  75.   function GetImageLinkTimeStamp(const FileName: string): DWORD;
  76.  
  77. var
  78.   Form1: TForm1;
  79.   GlobalBreak: Boolean;
  80.  
  81. implementation
  82.  
  83. {$R *.dfm}
  84.  
  85. {$IFDEF TIMELOCK}
  86. function CheckTimer(): Boolean;
  87. var
  88.   actualDate : TDateTime;
  89.  
  90. begin
  91.   //actualDate := StrToDate('13.12.2005');
  92.   actualDate:=Date;
  93.  
  94.   //Aktuelles Datum nach Sperrdatum -> Lock aktiv
  95.   //Aktuelles Datum vor Erstellungsdatum -> gefaktes PC Datum
  96.   if (StrToDate(DateToStr(actualDate))>StrToDate(LockDate))
  97.       or (StrToDate(DateToStr(actualDate))<StrToDate(DateToStr(UnixToDateTime(GetImageLinkTimeStamp('TSAPI.dll')))))
  98.       or (StrToDate(LockDate)>IncMonth(StrToDate(DateToStr(UnixToDateTime(GetImageLinkTimeStamp('TSAPI.dll')))),MaxLockMonth))
  99.       then
  100.     CheckTimer:=true
  101.   else
  102.     CheckTimer:=false;
  103. end;
  104. {$ENDIF}
  105.  
  106. procedure Delay(ATime:Integer);
  107. //Pause
  108. {$IFDEF GetTickCount}
  109. var
  110.   Start : Integer;
  111.  
  112. begin
  113.   Start:=GetTickCount;
  114.   repeat
  115.     Application.ProcessMessages;
  116.   {$WARNINGS OFF}
  117.   until GetTickCount-Start > ATime;
  118.   {$WARNINGS ON}
  119. {$ELSE}
  120. begin
  121.   sleep(ATime);
  122. {$ENDIF}
  123. end;
  124.  
  125. function GetImageLinkTimeStamp(const FileName: string): DWORD;
  126. // Get the 'link time stamp' of an portable executable image file (PE32)
  127. const
  128.   INVALID_SET_FILE_POINTER = DWORD(-1);
  129.   BorlandMagicTimeStamp = $2A425E19;  // Delphi 4-6 (and above?)
  130.   FileTime1970: TFileTime = (dwLowDateTime:$D53E8000; dwHighDateTime:$019DB1DE);
  131. type
  132.   PImageSectionHeaders = ^TImageSectionHeaders;
  133.   TImageSectionHeaders = array [Word] of TImageSectionHeader;
  134. type
  135.   PImageResourceDirectory = ^TImageResourceDirectory;
  136.   TImageResourceDirectory = packed record
  137.     Characteristics: DWORD;
  138.     TimeDateStamp: DWORD;
  139.     MajorVersion: Word;
  140.     MinorVersion: Word;
  141.     NumberOfNamedEntries: Word;
  142.     NumberOfIdEntries: Word;
  143.   end;
  144. var
  145.   FileHandle: THandle;
  146.   BytesRead: DWORD;
  147.   ImageDosHeader: TImageDosHeader;
  148.   ImageNtHeaders: TImageNtHeaders;
  149.   SectionHeaders: PImageSectionHeaders;
  150.   Section: Word;
  151.   ResDirRVA: DWORD;
  152.   ResDirSize: DWORD;
  153.   ResDirRaw: DWORD;
  154.   ResDirTable: TImageResourceDirectory;
  155.   FileTime: TFileTime;
  156. begin
  157.   Result := 0;
  158.   // Open file for read access
  159.   FileHandle := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil,
  160.     OPEN_EXISTING, 0, 0);
  161.   if (FileHandle <> INVALID_HANDLE_VALUE) then
  162.   try
  163.     // Read MS-DOS header to get the offset of the PE32 header
  164.     // (not required on WinNT based systems - but mostly available)
  165.     if not ReadFile(FileHandle, ImageDosHeader, SizeOf(TImageDosHeader),
  166.       BytesRead, nil) or (BytesRead <> SizeOf(TImageDosHeader)) or
  167.       (ImageDosHeader.e_magic <> IMAGE_DOS_SIGNATURE) then
  168.     begin
  169.       ImageDosHeader._lfanew := 0;
  170.     end;
  171.     // Read PE32 header (including optional header
  172.     if (SetFilePointer(FileHandle, ImageDosHeader._lfanew, nil, FILE_BEGIN) =
  173.       INVALID_SET_FILE_POINTER) then
  174.     begin
  175.       Exit;
  176.     end;
  177.     if not(ReadFile(FileHandle, ImageNtHeaders, SizeOf(TImageNtHeaders),
  178.       BytesRead, nil) and (BytesRead = SizeOf(TImageNtHeaders))) then
  179.     begin
  180.       Exit;
  181.     end;
  182.     // Validate PE32 image header
  183.     if (ImageNtHeaders.Signature <> IMAGE_NT_SIGNATURE) then
  184.     begin
  185.       Exit;
  186.     end;
  187.     // Seconds since 1970 (UTC)
  188.     Result := ImageNtHeaders.FileHeader.TimeDateStamp;
  189.  
  190.     // Check for Borland's magic value for the link time stamp
  191.     // (we take the time stamp from the resource directory table)
  192.     if (ImageNtHeaders.FileHeader.TimeDateStamp = BorlandMagicTimeStamp) then
  193.     with ImageNtHeaders, FileHeader, OptionalHeader do
  194.     begin
  195.       // Validate Optional header
  196.       if (SizeOfOptionalHeader < IMAGE_SIZEOF_NT_OPTIONAL_HEADER) or
  197.         (Magic <> IMAGE_NT_OPTIONAL_HDR_MAGIC) then
  198.       begin
  199.         Exit;
  200.       end;
  201.       // Read section headers
  202.       SectionHeaders :=
  203.         GetMemory(NumberOfSections * SizeOf(TImageSectionHeader));
  204.       if Assigned(SectionHeaders) then
  205.       try
  206.         if (SetFilePointer(FileHandle,
  207.           SizeOfOptionalHeader - IMAGE_SIZEOF_NT_OPTIONAL_HEADER, nil,
  208.           FILE_CURRENT) = INVALID_SET_FILE_POINTER) then
  209.         begin
  210.           Exit;
  211.         end;
  212.         if not(ReadFile(FileHandle, SectionHeaders^, NumberOfSections *
  213.           SizeOf(TImageSectionHeader), BytesRead, nil) and (BytesRead =
  214.           NumberOfSections * SizeOf(TImageSectionHeader))) then
  215.         begin
  216.           Exit;
  217.         end;
  218.         // Get RVA and size of the resource directory
  219.         with DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE] do
  220.         begin
  221.           ResDirRVA := VirtualAddress;
  222.           ResDirSize := Size;
  223.         end;
  224.         // Search for section which contains the resource directory
  225.         ResDirRaw := 0;
  226.         for Section := 0 to NumberOfSections - 1 do
  227.         with SectionHeaders[Section] do
  228.           if (VirtualAddress <= ResDirRVA) and
  229.             (VirtualAddress + SizeOfRawData >= ResDirRVA + ResDirSize) then
  230.           begin
  231.             ResDirRaw := PointerToRawData - (VirtualAddress - ResDirRVA);
  232.             Break;
  233.           end;
  234.         // Resource directory table found?
  235.         if (ResDirRaw = 0) then
  236.         begin
  237.           Exit;
  238.         end;
  239.         // Read resource directory table
  240.         if (SetFilePointer(FileHandle, ResDirRaw, nil, FILE_BEGIN) =
  241.           INVALID_SET_FILE_POINTER) then
  242.         begin
  243.           Exit;
  244.         end;
  245.         if not(ReadFile(FileHandle, ResDirTable,
  246.           SizeOf(TImageResourceDirectory), BytesRead, nil) and
  247.           (BytesRead = SizeOf(TImageResourceDirectory))) then
  248.         begin
  249.           Exit;
  250.         end;
  251.         // Convert from DosDateTime to SecondsSince1970
  252.         if DosDateTimeToFileTime(HiWord(ResDirTable.TimeDateStamp),
  253.           LoWord(ResDirTable.TimeDateStamp), FileTime) then
  254.         begin
  255.           // FIXME: Borland's linker uses the local system time
  256.           // of the user who linked the executable image file.
  257.           // (is that information anywhere?)
  258.           Result := (ULARGE_INTEGER(FileTime).QuadPart -
  259.             ULARGE_INTEGER(FileTime1970).QuadPart) div 10000000;
  260.         end;
  261.       finally
  262.         FreeMemory(SectionHeaders);
  263.       end;
  264.     end;
  265.   finally
  266.     CloseHandle(FileHandle);
  267.   end;
  268. end;
  269.  
  270. function PortExists(COM: Integer): Boolean; stdcall
  271. //COM Port Existenz überprüfen
  272. var
  273.   DeviceHandle: THandle;
  274.  
  275. begin
  276.   DeviceHandle:=0;
  277.   try
  278.     DeviceHandle := CreateFile(PChar('COM'+IntToStr(COM)), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
  279.     if DeviceHandle = INVALID_HANDLE_VALUE then
  280.       PortExists:=false
  281.     else
  282.       PortExists:=true;
  283.   finally
  284.     CloseHandle(DeviceHandle);
  285.   end;
  286. end;
  287.  
  288. procedure About; stdcall;
  289. var
  290.   Backup: String;
  291.  
  292. begin
  293.   CloseControls;
  294.   //Status
  295.   Modus('TS API Info');
  296.   Status('© 2004-2006 by Lostech');
  297.   //Status2('www.lostech.de.vu');
  298.   {$IFDEF TIMELOCK}
  299.   Status2('Version : '+Version+'    Datum: '+DateTimeToStr(UnixToDateTime(GetImageLinkTimeStamp('TSAPI.dll'))));
  300.   {$ELSE}
  301.   Status2('Version: '+Version+'    Datum: '+DateTimeToStr(UnixToDateTime(GetImageLinkTimeStamp('TSAPI.dll'))));
  302.   {$ENDIF}
  303.   Backup:=Form1.Button1.Caption;
  304.   Form1.Button1.Caption:='OK';
  305.   Form1.Label1.Alignment:=taCenter;
  306.   Form1.Label2.Alignment:=taCenter;
  307.  
  308.   while GlobalBreak=false do
  309.     Application.ProcessMessages;
  310.  
  311.   Form1.Button1.Caption:=Backup;
  312.   Form1.Label1.Alignment:=taLeftJustify;
  313.   Form1.Label2.Alignment:=taLeftJustify;
  314.   GlobalBreak:=false;
  315.   OpenControls;
  316. end;
  317.  
  318. procedure Modus(Modus: String);
  319. //Statusanzeige Modus
  320. begin
  321.   Form1.Label3.Caption:=Modus;
  322.   Form1.Label3.Refresh;
  323. end;
  324.  
  325. procedure Status(Status: String);
  326. //Statusanzeige
  327. begin
  328.   Form1.Label1.Caption:=Status;
  329.   Form1.Label1.Refresh;
  330. end;
  331.  
  332. procedure Status2(Status: String);
  333. //Statusanzeige 2
  334. begin
  335.   Status:=StringReplace(Status,#10,'',[rfReplaceAll, rfIgnoreCase]);
  336.   Status:=StringReplace(Status,#13,'',[rfReplaceAll, rfIgnoreCase]);
  337.   //Form1.BringToFront;
  338.   Form1.Label2.Caption:=Status;
  339.   Form1.Label2.Refresh;
  340. end;
  341.  
  342. function GetVersion(Datei: string): string;
  343. //Dateiversion aus EXE auslesen
  344. var  aFileName: array [0..MAX_PATH] of Char;
  345.   pdwHandle: DWORD;
  346.   nInfoSize: DWORD;
  347.   pFileInfo: Pointer;
  348.   pFixFInfo: PVSFixedFileInfo;
  349.   nFixFInfo: DWORD;
  350.  
  351. begin
  352.   //Gibt Versionsnummer zurück
  353.   StrPCopy(aFileName,Datei);
  354.   pdwHandle := 0;
  355.   nInfoSize := GetFileVersionInfoSize(aFileName, pdwHandle);
  356.   result:='0';
  357.   if nInfoSize <> 0 then
  358.     pFileInfo := GetMemory(nInfoSize)
  359.   else
  360.     pFileInfo := nil;
  361.   if Assigned(pFileInfo) then
  362.   begin
  363.     try
  364.       if GetFileVersionInfo(aFileName, pdwHandle, nInfoSize, pFileInfo) then
  365.       begin
  366.         pFixFInfo := nil;
  367.         nFixFInfo := 0;
  368.         if VerQueryValue(pFileInfo, '\', Pointer(pFixFInfo), nFixFInfo) then
  369.         begin
  370.           {
  371.           result := Format('%d.%d.%d.%d',[HiWord(pFixFInfo^.dwFileVersionMS),
  372.           LoWord(pFixFInfo^.dwFileVersionMS),HiWord(pFixFInfo^.dwFileVersionLS),
  373.           LoWord(pFixFInfo^.dwFileVersionLS)]);
  374.           }
  375.           result := Format('%d.%d',[HiWord(pFixFInfo^.dwFileVersionMS),LoWord(pFixFInfo^.dwFileVersionLS)]);
  376.  
  377.         end;
  378.       end;
  379.     finally
  380.       FreeMemory(pFileInfo);
  381.     end;
  382.   end;
  383. end;
  384.  
  385. procedure FlashReset(COM: Integer); stdcall;
  386. //Reset
  387. begin
  388.   //Bedienung sperren
  389.   CloseControls;
  390.  
  391.   //Modus Status
  392.   Modus('FlashReset COM'+IntToStr(COM));
  393.  
  394.   //Status
  395.   Status('Bitte warten...');
  396.  
  397.   //COM Port setzen
  398.   Form1.AfComPort1.ComNumber:=COM;
  399.   Form1.Button1.Visible:=false;
  400.  
  401.   //Reset ohne Parität senden
  402.   Form1.AfComPort1.Parity:=paNone;
  403.   Application.ProcessMessages;
  404.   Form1.AfComPort1.Open;
  405.   Form1.AfComPort1.WriteString('dbinvlimg');
  406.   Form1.AfComPort1.Close;
  407.   delay(1000);
  408.  
  409.   //Reset mit Parität senden
  410.   Form1.AfComPort1.Parity:=paEven;
  411.   Application.ProcessMessages;
  412.   Form1.AfComPort1.Open;
  413.   Form1.AfComPort1.WriteString('dbinvlimg');
  414.   Form1.AfComPort1.Close;
  415.   delay(1000);
  416.  
  417.   //Bedienung freigeben
  418.   Form1.Button1.Visible:=true;
  419.   OpenControls;
  420.  
  421. end;
  422.  
  423. function GetModelFromReceiver(COM: Integer): ShortString; stdcall;
  424. //Receivermodell aus Gerät auslesen
  425. var
  426.   Paket: AnsiString;
  427.   Receiver: String;
  428.   buffer: String;
  429.   Counter: Integer;
  430.   InBufferUsed: Integer;
  431.   CheckSum1: String;
  432.   CheckSum2: String;
  433.   BasicSettings: Boolean;
  434.  
  435. begin
  436.   //Bedienung sperren
  437.   CloseControls;
  438.  
  439.   //Modus Status
  440.   Modus('Suche Receivertyp an COM'+IntToStr(COM));
  441.  
  442.   //Grundeinstellungen setzen
  443.   Counter:=0;
  444.   GlobalBreak:=false;
  445.  
  446.   //Receiver Serie ermitteln für COM Port Einstellung
  447.   if GetSeriesFromReceiver(COM)=1 then
  448.     Form1.AfComPort1.Parity:=paEven
  449.   else
  450.     Form1.AfComPort1.Parity:=paNone;
  451.  
  452.   //COM Port setzen
  453.   Form1.AfComPort1.ComNumber:=COM;
  454.  
  455.   //COM Port definiert öffnen
  456.   Form1.AfComPort1.Close;
  457.   Form1.AfComPort1.Open;
  458.  
  459.   //COM Port Puffer leeren
  460.   Form1.AfComPort1.PurgeRX;
  461.   Form1.AfComPort1.PurgeTX;
  462.  
  463.   //Datenbank auslesen
  464.   Form1.AfComPort1.WriteString('dbdump');
  465.  
  466.   //[database] Abschnitt finden
  467.   while (Counter<100) and (GlobalBreak=false) do
  468.     begin
  469.       delay(5);
  470.       Application.ProcessMessages;
  471.       buffer:=Form1.AfComPort1.ReadString;
  472.       Paket:=Paket+buffer;
  473.       if AnsiPos('[database]',GetPaket(Paket))>0 then
  474.         break
  475.       else
  476.         Counter:=Counter+1;
  477.     end;
  478.  
  479.   //bei Fehler oder Abbruch Funktion verlassen
  480.   if (Counter>99) or (GlobalBreak=true) then
  481.     begin
  482.       Form1.AfComPort1.Close;
  483.       GetModelFromReceiver:='';
  484.       OpenControls;
  485.       exit;
  486.     end;
  487.  
  488.   //COM Port Puffer leeren
  489.   Form1.AfComPort1.PurgeRX;
  490.   Form1.AfComPort1.PurgeTX;
  491.  
  492.   //nächstes Paket anfordern
  493.   BasicSettings:=false;
  494.   Counter:=0;
  495.   Receiver:='';
  496.   Form1.AfComPort1.WriteString(#1);
  497.   while (Counter<100) and (GlobalBreak=false) do
  498.     begin
  499.       delay(1);
  500.       InBufferUsed:=0;
  501.       buffer:='';
  502.       //warten bis Empfangspuffer sich nicht mehr füllt
  503.       while Form1.AfComPort1.InBufUsed<>InBufferUsed do
  504.         begin
  505.           InBufferUsed:=Form1.AfComPort1.InBufUsed;
  506.           delay(1)
  507.         end;
  508.       Application.ProcessMessages;
  509.       buffer:=Form1.AfComPort1.ReadString;
  510.  
  511.       //wenn Receiver die Übertragung beendet Schleife verlassen
  512.       if buffer=#85+#85+#0+#0 then break;
  513.  
  514.       //Puffer Checksummen festlegen
  515.       //Checksumme 1 -> IST Checksumme des Paketes
  516.       //Checksumme 2 -> SOLL Checksumme des Paketes
  517.       if Length(buffer)>0 then
  518.         begin
  519.           //Sonderfall wenn 2 x 0A Bytes gesendet werden -> Checksumme SOLL = 10
  520.           if AnsiPos(#10+#10,buffer)>0 then
  521.             begin
  522.             {
  523.               if AnsiPos('UU',buffer)>0 then
  524.                 begin
  525.                   CheckSum1:=MidStr(buffer,AnsiPos('UU',buffer)+3,length(buffer)-AnsiPos('UU',buffer)-4);
  526.                 end
  527.               else
  528.                 CheckSum1:=MidStr(buffer,4,length(buffer)-3);
  529.               CheckSum1:=LeftStr(CheckSum1,AnsiPos(#10,CheckSum1));
  530.               CheckSum1:=IntToHex(CalcPaketChkSum(CheckSum1)+10,1);
  531.               CheckSum2:='0A';
  532.               }
  533.               CheckSum1:='0A';
  534.               CheckSum2:='0A';
  535.             end
  536.           //Normalfall
  537.           else
  538.             begin
  539.               CheckSum1:=IntToHex(CalcPaketChkSum(AnsiMidStr(buffer,AnsiPos('UU',buffer)+3,LastDelimiter(Chr(10),buffer)-(AnsiPos('UU',buffer)+3)))+10,1);
  540.               CheckSum2:=IntToHex(Ord(AnsiMidStr(buffer,LastDelimiter(Chr(10),buffer)+1,1)[1]),1);
  541.             end;
  542.         end
  543.       else  //Fehler bei der Checksummenberechnung mit 2 unterschiedlichen Checksummen quittieren
  544.         begin
  545.           CheckSum1:='01';
  546.           CheckSum2:='02';
  547.         end;
  548.  
  549.       //Checksummen formatieren
  550.       CheckSum1:=RightStr(CheckSum1,2);
  551.       CheckSum2:=RightStr(CheckSum2,2);
  552.       CheckSum1:=StringOfChar('0',2-Length(CheckSum1))+CheckSum1;
  553.       CheckSum2:=StringOfChar('0',2-Length(CheckSum2))+CheckSum2;
  554.  
  555.       //COM Port Puffer leeren
  556.       Form1.AfComPort1.PurgeRX;
  557.       Form1.AfComPort1.PurgeTX;
  558.  
  559.       //Checksumme des Pakets überprüfen
  560.       if CheckSum1=CheckSum2 then      //korrektes Paket
  561.         begin
  562.           //innerhalb [0x6 basicSettings] das Receiver Modell raussuchen
  563.           if AnsiPos('[0x6',buffer)>0 then BasicSettings:=true;
  564.           if BasicSettings=true then
  565.             begin
  566.               if LeftStr(GetPaket(buffer),3)='R0=' then
  567.                 begin
  568.                   Receiver:=Split(buffer,#9)[4];
  569.                   Receiver:=StringReplace(Receiver,'"','',[rfReplaceAll, rfIgnoreCase]);
  570.                   break;
  571.                 end;
  572.             end;
  573.           Form1.AfComPort1.WriteString(#1);
  574.           Counter:=0;
  575.         end
  576.       else          //fehlerhaftes Paket
  577.         begin
  578.           Form1.AfComPort1.WriteString(#0);
  579.           Counter:=Counter+1;
  580.         end;
  581.     end;
  582.  
  583.   //Status
  584.   Status('Receivertyp: '+Receiver);
  585.  
  586.   //Receiver Modell melden
  587.   GetModelFromReceiver:=Receiver;
  588.  
  589.   //COM Port schließen
  590.   Form1.AfComPort1.Close;
  591.  
  592.   //Bedienung entsperren
  593.   OpenControls;
  594.  
  595. end;
  596.  
  597. function GetSeriesFromReceiver(COM: Integer): Integer; stdcall;
  598. //Receiverserie aus Gerät auslesen
  599. var
  600.   buffer: String;
  601.   Counter: Integer;
  602.   ReceiverSeries: Integer;
  603.  
  604. label
  605.   Series;
  606.  
  607. begin
  608.   //Bedienung sperren
  609.   CloseControls;
  610.  
  611.   //Modus Status
  612.   Modus('Receiver Serie an COM'+IntToStr(COM));
  613.  
  614.   //Grundeinstellungen setzen
  615.   GlobalBreak:=false;
  616.   ReceiverSeries:=0;
  617.  
  618.   //COM Einstellungen setzen
  619.   Form1.AfComPort1.ComNumber:=COM;
  620.  
  621.   //mit verschiedenen COM Port Einstellungen versuchen
  622.   //den [database] Abschnitt zu lesen und somit
  623.   //die Receiverserie ermitteln
  624.   //
  625.   //Mögliche Receiverserien:
  626.   //0 = DigiBox / DIGIT / Digital / DigiCorder / DigiPal Serie
  627.   //1 = Digity Serie
  628.  
  629. Series: //Sprungpunkt um die Schleife ein noch einmal für die nächste Receiverserie ablaufen zu lassen
  630.   Counter:=0;
  631.   if (ReceiverSeries=0) then
  632.     Form1.AfComPort1.Parity:=paNone;
  633.   if (ReceiverSeries=1) then
  634.     Form1.AfComPort1.Parity:=paEven;
  635.  
  636.   while (Counter<75) and (GlobalBreak=false) do
  637.   begin
  638.     Application.ProcessMessages;
  639.     delay(5);
  640.  
  641.     //Port öffnen und Receiver auslesen
  642.     Form1.AfComPort1.Close;
  643.     Form1.AfComPort1.Open;
  644.     Form1.AfComPort1.PurgeRX;
  645.     Form1.AfComPort1.PurgeTX;
  646.     Form1.AfComPort1.WriteString('dbdump');
  647.     Application.ProcessMessages;
  648.     delay(100);
  649.     buffer:='';
  650.     buffer:=Form1.AfComPort1.ReadString;
  651.     //Form1.AfComPort1.WriteString('dbdump');
  652.  
  653.     //Stop-Signal schicken
  654.     Form1.AfComPort1.WriteString(#85+#85+#0+#0);
  655.     Form1.AfComPort1.WriteString(#85+#85+#0+#0);
  656.     Form1.AfComPort1.WriteString(#85+#85+#0+#0);
  657.     Form1.AfComPort1.WriteString(#85+#85+#0+#0);
  658.     Form1.AfComPort1.WriteString(#85+#85+#0+#0);
  659.            
  660.     Form1.AfComPort1.PurgeRX;
  661.     Form1.AfComPort1.PurgeTX;
  662.     Form1.AfComPort1.Close;
  663.  
  664.     //empfangenes Paket auf verwertbaren [database] Text auswerten
  665.     if (AnsiContainsStr(buffer, '[database]')=true) then
  666.       break
  667.     else
  668.       inc(Counter);
  669.   end;
  670.  
  671.   //Ermittelte Receiverserie festlegen
  672.   {
  673.   if (AnsiContainsStr(buffer, '[database]')=true) then
  674.     GetSeriesFromReceiver:=ReceiverSeries
  675.   else
  676.     begin
  677.       inc(ReceiverSeries);
  678.       if (ReceiverSeries=1) then goto Series;
  679.       GetSeriesFromReceiver:=-1;
  680.     end;
  681.   }
  682.   if (AnsiContainsStr(buffer, '[database]')=false) then
  683.     begin
  684.       inc(ReceiverSeries);
  685.       if (ReceiverSeries=1) then goto Series;
  686.       ReceiverSeries:=-1;
  687.     end;
  688.  
  689.   //Fehler abfangen
  690.   if (ReceiverSeries>1) then ReceiverSeries:=0;
  691.  
  692.   //Status
  693.   if ReceiverSeries=0 then
  694.     begin
  695.       Status('DigiBox/Digit/DigiCorder/DigiPal + kompatible STB');
  696.       Status2('COM'+IntToStr(COM)+' -> 115200/8/N/1                    Bitte warten...');
  697.     end;
  698.   if ReceiverSeries=1 then
  699.     begin
  700.       Status('DigiBox/Digity + kompatible STB');
  701.       Status2('COM'+IntToStr(COM)+' -> 115200/8/E/1                    Bitte warten...');
  702.     end;
  703.  
  704.   {*
  705.   Status('Receiver Serie '+IntToStr(ReceiverSeries));
  706.   if ReceiverSeries=0 then
  707.     Status2('DigiBox/Digit/DigiCorder/DigiPal + kompatible STB');
  708.   if ReceiverSeries=1 then
  709.     Status2('DigiBox/Digity + kompatible STB');
  710.   *}
  711.  
  712.   //Sicherheitspause
  713.   if ((GlobalBreak=false) and (ReceiverSeries >-1)) then
  714.     begin
  715.       counter:=0;
  716.       while (Counter<70) do
  717.         begin
  718.           Application.ProcessMessages;
  719.           delay(300);
  720.           if GlobalBreak=true then break;
  721.           inc(Counter);
  722.         end;
  723.     end;
  724.  
  725.   //GlobalBreak abfangen
  726.   if (GlobalBreak=true) then
  727.     ReceiverSeries:=-1;
  728.   GetSeriesFromReceiver:=ReceiverSeries;
  729.  
  730.   //Bedienung wieder freigeben
  731.   OpenControls;
  732. end;
  733.  
  734. procedure OpenControls;
  735. begin
  736.   Form1.ProgressBar1.Visible:=false;
  737.   Form1.Hide;
  738.   Application.ProcessMessages;
  739. end;
  740.  
  741. procedure CloseControls;
  742. begin
  743.   if Form1=nil then
  744.     begin
  745.       Form1:=TForm1.Create(nil);
  746.       Form1.Caption:=Form1.Caption+'     Version '+Version;
  747.     end;
  748.   Form1.Label1.Caption:='';
  749.   Form1.Label2.Caption:='';
  750.   Form1.Show;
  751.   Application.ProcessMessages;
  752. end;
  753.  
  754. function GetPaket(buffer: String): String;
  755. //Paket aus Lesepuffer ausschneiden
  756. var
  757.   Paket: String;
  758.   Paketstart: Integer;
  759.  
  760. begin
  761.   Paket:='';
  762.  
  763.   //Paketanfang ermitteln
  764.   Paketstart:=AnsiPos('UU',buffer);
  765.   if Paketstart=0 then
  766.     begin
  767.       GetPaket:='';
  768.       exit;
  769.     end;
  770.   Paket:=RightStr(buffer,length(buffer)-Paketstart-2);
  771.  
  772.   if (AnsiContainsStr(Paket, #10)=true) then
  773.     begin
  774.       Paket:=AnsiMidStr(Paket,1,LastDelimiter(Chr(10),Paket));
  775.       Paket:=StringReplace(Paket,#10#10,#10,[rfReplaceAll, rfIgnoreCase]);
  776.       Paket:=StringReplace(Paket,#10,#13#10,[rfReplaceAll, rfIgnoreCase]);
  777.       //Sonderzeichen rausfiltern
  778.       Paket:=StringReplace(Paket,#5,'',[rfReplaceAll, rfIgnoreCase]);
  779.       if (AnsiContainsStr(Paket, '=')=true) and (AnsiContainsStr(Paket, 'Version')=false) then
  780.         begin
  781.           if (AnsiContainsStr(Paket, '[')=false) and (AnsiContainsStr(Paket, ']')=false) then
  782.             if (LeftStr(Paket,1)<>'R') and (LeftStr(Paket,1)<>'I') then Paket:='R'+Paket;
  783.         end;
  784.       GetPaket:=Paket;
  785.     end
  786.   else
  787.     GetPaket:='';
  788. end;
  789.  
  790. function CalcPaketChksum(Paket: String): Integer;
  791. //Checksumme eines empfangenen Pakets berechnen
  792. var
  793.   Pos: Integer;
  794.   CheckSum: Integer;
  795.   HexCheckSum: String;
  796.  
  797. begin
  798.   //Summen-Checksumme berechnen
  799.   Checksum:=0;
  800.   for Pos:=1 to Length(Paket) do
  801.     begin
  802.       CheckSum:=CheckSum+Ord(MidStr(Paket,Pos,1)[1]);
  803.     end;
  804.  
  805.   //Checksumme nur für 8Bit/1Byte berechnen berechnen
  806.   HexCheckSum:=RightStr(IntToHex(CheckSum,2),2);
  807.  
  808.   //Ergebnis
  809.   CalcPaketChksum:=StrToInt('$'+HexChecksum);
  810. end;
  811.  
  812. function MakePaket(Paket: String):String;
  813. //Sendepaket erstellen
  814. var
  815.   buffer: String;
  816.   ZeichenBuffer: Char;
  817.   Checksumme: Integer;
  818.   Pos: Integer;
  819.  
  820. begin
  821.   if (Length(Paket)=0) then exit;
  822.   Checksumme:=0;
  823.   buffer:='UU'+Chr(Length(Paket)+1)+Paket+#10;
  824.   for Pos:=4 to Length(buffer) do
  825.     begin
  826.       //Zeichen:=AnsiMidStr(buffer,Pos,1);
  827.       ZeichenBuffer:=AnsiMidStr(buffer,Pos,1)[1];//Zeichen[1];
  828.       Checksumme:=Checksumme+Ord(ZeichenBuffer);
  829.       //ZeichenBuffer:=#0;
  830.     end;
  831.  
  832.   Checksumme:=StrToInt('$'+RightStr(IntToHex(Checksumme,4),2));
  833.   buffer:=buffer+Chr(StrToInt('$'+RightStr(IntToHex(Checksumme,4),2))); //Checksumme);
  834.   MakePaket:=buffer;
  835. end;
  836.  
  837. function Split(const fText: String; const fSep: Char; fTrim: Boolean=false; fQuotes: Boolean=false):TStringList;
  838. //String Split Funktion
  839. var vI: Integer;
  840.     vBuffer: String;
  841.     vOn: Boolean;
  842. begin
  843.   Result:=TStringList.Create;
  844.   vBuffer:='';
  845.   vOn:=true;
  846.   for vI:=1 to Length(fText) do
  847.   begin
  848.     if (fQuotes and(fText[vI]=fSep)and vOn)or(Not(fQuotes) and (fText[vI]=fSep)) then
  849.     begin
  850.       if fTrim then vBuffer:=Trim(vBuffer);
  851.       if vBuffer[1]=fSep then
  852.         vBuffer:=Copy(vBuffer,2,Length(vBuffer));
  853.       Result.Add(vBuffer);
  854.       vBuffer:='';
  855.     end;
  856.     if fQuotes then
  857.     begin
  858.       if fText[vI]='"' then
  859.       begin
  860.         vOn:=Not(vOn);
  861.         Continue;
  862.       end;
  863.       if (fText[vI]<>fSep)or((fText[vI]=fSep)and(vOn=false)) then
  864.         vBuffer:=vBuffer+fText[vI];
  865.     end else
  866.       if fText[vI]<>fSep then
  867.         vBuffer:=vBuffer+fText[vI];
  868.   end;
  869.   if vBuffer<>'' then
  870.   begin
  871.     if fTrim then vBuffer:=Trim(vBuffer);
  872.     Result.Add(vBuffer);
  873.   end;
  874. end;
  875.  
  876. function CSV(Settings: ShortString; Settings_csv: ShortString): Boolean; stdcall;
  877. //Settings (SET/Dump) in CSV Datei konvertieren
  878. var
  879.   SettingsIn: Text;
  880.   SettingsOut: Text;
  881.   BufferIn: String;
  882.  
  883. begin
  884.   //Pfadangaben überprüfen
  885.   if (Settings='') or (Settings_csv='') or (Settings=Settings_csv) or (FileExists(Settings)=false) then
  886.     begin
  887.       CSV:=false;
  888.       exit;
  889.     end;
  890.  
  891.   //Bedienung sperren
  892.   CloseControls;
  893.   Form1.Button1.Visible:=false;
  894.  
  895.   //Modus Status
  896.   Modus('CSV Settings Konverter');
  897.  
  898.   //Status
  899.   Status('Konvertiere "'+ExtractFileName(Settings)+'" in CSV Datei');
  900.   Status2('Bitte warten...');
  901.  
  902.   //Settings einlesen
  903.   assign(SettingsIn,Settings);
  904.   reset(SettingsIn);
  905.  
  906.   //CSV Datei erzeugen
  907.   assign(SettingsOut,Settings_csv);
  908.   rewrite(SettingsOut);
  909.  
  910.   //Settings einlesen und als CSV formatiert wieder ausgeben
  911.   while not EOF(SettingsIn) do
  912.     begin
  913.       readln(SettingsIn,BufferIn);
  914.       BufferIn:=StringReplace(BufferIn,#9,';',[rfReplaceAll, rfIgnoreCase]);
  915.       writeln(SettingsOut,BufferIn);
  916.     end;
  917.  
  918.   //CSV Dokument abschliessen
  919.   close(SettingsIn);
  920.   close(SettingsOut);
  921.  
  922.   //Rückgabewert der Funktion
  923.   if FileExists(Settings_csv) then
  924.     CSV:=true
  925.   else
  926.     CSV:=false;
  927.  
  928.   //Bedienung freigeben
  929.   Form1.Button1.Visible:=true;
  930.   OpenControls;
  931. end;
  932.  
  933. function XML(Settings: ShortString; Settings_xml: ShortString): Boolean; stdcall;
  934. //Settings (SET/Dump) in XML Datei konvertieren
  935. var
  936.   SettingsIn: Text;
  937.   SettingsOut: Text;
  938.   BufferIn: String;
  939.   Section: String;
  940.   Item: String;
  941.  
  942. begin
  943.   //Pfadangaben überprüfen
  944.   if (Settings='') or (Settings_xml='') or (Settings=Settings_xml) or (FileExists(Settings)=false) then
  945.     begin
  946.       XML:=false;
  947.       exit;
  948.     end;
  949.  
  950.   //Bedienung sperren
  951.   CloseControls;
  952.   Form1.Button1.Visible:=false;
  953.  
  954.   //Modus Status
  955.   Modus('XML Settings Konverter');
  956.  
  957.   //Status
  958.   Status('Konvertiere "'+ExtractFileName(Settings)+'" in XML Datei');
  959.   Status2('Bitte warten...');
  960.  
  961.   //Settings einlesen
  962.   assign(SettingsIn,Settings);
  963.   reset(SettingsIn);
  964.  
  965.   //XML Datei erzeugen
  966.   assign(SettingsOut,Settings_xml);
  967.   rewrite(SettingsOut);
  968.  
  969.   //XML Header schreiben
  970.   writeln(SettingsOut,'<?xml version="1.0" encoding="ISO-8859-1"?>');
  971.   writeln(SettingsOut,'<settings>');
  972.  
  973.   //Settings einlesen und als XML formatiert weider ausgeben
  974.   Section:='';
  975.   Item:='';
  976.   while not EOF(SettingsIn) do
  977.     begin
  978.       readln(SettingsIn,BufferIn);
  979.       //Sektionen schreiben
  980.       if (LeftStr(BufferIn,1)='[') then
  981.         begin
  982.           if Section<>BufferIn then
  983.             begin
  984.               if (Section<>'') then
  985.                   writeln(SettingsOut,'</section>');
  986.               writeln(SettingsOut,'<section>');
  987.               //Daten maskieren
  988.               Section:='<![CDATA['+BufferIn+']]>';
  989.               writeln(SettingsOut,'<name>'+Section+'</name>');
  990.             end;
  991.         end
  992.       //Items schreiben
  993.       else
  994.         begin
  995.           Item:='<![CDATA['+BufferIn+']]>';
  996.           writeln(SettingsOut,'<item>'+Item+'</item>');
  997.         end;
  998.     end;
  999.  
  1000.   //XML Dokument abschliessen
  1001.   writeln(SettingsOut,'</section>');
  1002.   writeln(SettingsOut,'</settings>');
  1003.   close(SettingsIn);
  1004.   close(SettingsOut);
  1005.  
  1006.   //Rückgabewert der Funktion
  1007.   if FileExists(Settings_xml) then
  1008.     XML:=true
  1009.   else
  1010.     XML:=false;
  1011.  
  1012.   //Bedienung freigeben
  1013.   Form1.Button1.Visible:=true;
  1014.   OpenControls;
  1015. end;
  1016.  
  1017. function Convert(Settings: ShortString; Settings_old: ShortString): Boolean; stdcall;
  1018. //Settings (SET/Dump) in das alte Technisat Programmlistenformat (DAT/TXT) konvertieren
  1019. var
  1020.   SettingsIn: Text;
  1021.   SettingsOut: Text;
  1022.   SettingsTemp: Text;
  1023.   SettingsTemp2: Text;
  1024.   SettingsTemp3: Text;
  1025.   BufferIn: String;
  1026.   BufferOut: String;
  1027.   Buffer: String;
  1028.   Satellit: String;
  1029.   Programmname: String;
  1030.   Frequenz: String;
  1031.   Symbolrate: String;
  1032.   FEC: String;
  1033.   Polaritaet: String;
  1034.   ServiceID: String;
  1035.   PCRPID: String;
  1036.   AudioPID: String;
  1037.   VideoPID: String;
  1038.   SFI: String;
  1039.   ProvID: String;
  1040.   Prov: String;
  1041.   Service: TStringList;
  1042.   Transponder: TStringList;
  1043.   Sat: TStringList;
  1044.   Schleife: Integer;
  1045.   FTA: Boolean;
  1046.   SFI_Marker: Boolean;
  1047.   Antwort: Integer;
  1048.  
  1049. begin
  1050.   //Pfadangaben überprüfen
  1051.   if (Settings='') or (Settings_old='') or (Settings=Settings_old) or (FileExists(Settings)=false) then
  1052.     begin
  1053.       convert:=false;
  1054.       exit;
  1055.     end;
  1056.  
  1057.   //Bedienung sperren
  1058.   CloseControls;
  1059.   Form1.Button1.Visible:=false;
  1060.  
  1061.   //Modus Status
  1062.   Modus('Settings Konverter');
  1063.   //Status
  1064.   Status('Konvertiere "'+ExtractFileName(Settings)+'"');
  1065.   Status2('Bitte warten...');
  1066.  
  1067.   //MessageBox in den Vordergrund bringen
  1068.   Application.NormalizeTopMosts;
  1069.  
  1070.   //FTA Filter
  1071.   Antwort:=Application.MessageBox(PChar('Filter für Programme verwenden, die als verschlüsselt markiert sind?'+#13+#10+#13+#10+'(Wählen Sie "ja" damit die API versucht nur freie FTA Programme zu konvertieren - wählen Sie "nein" um alle Programme zu konvertieren)'),PChar('Info'),4);
  1072.   if (Antwort=7) then
  1073.     FTA:=false
  1074.   else
  1075.     FTA:=true;
  1076.  
  1077.   //SFI Marker Filter
  1078.   Antwort:=Application.MessageBox(PChar('Sollen vorhandene EPG/SFI Marker konvertiert werden?'+#13+#10+#13+#10+'(Wählen Sie "ja" damit alle EPG/SFI Marker übernommen werden - wählen Sie "nein" wenn keines der konvertierten Programme einen EPG/SFI Marker erhalten soll)'),PChar('Info'),4);
  1079.   if (Antwort=7) then
  1080.     SFI_Marker:=false
  1081.   else
  1082.     SFI_Marker:=true;
  1083.  
  1084.   //Formulare wieder in den Vordergrund bringen
  1085.   Application.RestoreTopMosts;
  1086.  
  1087.   Application.ProcessMessages;
  1088.  
  1089.   try
  1090.  
  1091.   //[0x1 SATELLITE] Satellitenliste in temporäre Datei auslagern
  1092.   assign(SettingsIn,Settings);
  1093.   reset(SettingsIn);
  1094.   while not EOF(SettingsIn) do
  1095.     begin
  1096.       readln(SettingsIn,BufferIn);
  1097.       if (BufferIn='[0x1 SATELLITE]') then
  1098.         begin
  1099.           assign(SettingsTemp,ExtractFilePath(Application.ExeName)+'/sat.tmp');
  1100.           rewrite(SettingsTemp);
  1101.           while not EOF(SettingsIn) do
  1102.             begin
  1103.               readln(SettingsIn,BufferIn);
  1104.               if (LeftStr(BufferIn,1)='R') then
  1105.                 begin
  1106.                   writeln(SettingsTemp,BufferIn);
  1107.                 end;
  1108.               if (LeftStr(BufferIn,1)='[') then
  1109.                 begin
  1110.                   BufferIn:='';
  1111.                   break;
  1112.                 end;
  1113.             end;
  1114.           close(SettingsTemp);
  1115.         end;
  1116.       if (BufferIn='') then break;
  1117.     end;
  1118.   close(SettingsIn);
  1119.  
  1120.   //[0x2 transportStream] Transponderliste in temporäre Datei auslagern
  1121.   assign(SettingsIn,Settings);
  1122.   reset(SettingsIn);
  1123.   while not EOF(SettingsIn) do
  1124.     begin
  1125.       readln(SettingsIn,BufferIn);
  1126.       if (BufferIn='[0x2 transportStream]') then
  1127.         begin
  1128.           assign(SettingsTemp,ExtractFilePath(Application.ExeName)+'/tp.tmp');
  1129.           rewrite(SettingsTemp);
  1130.           while not EOF(SettingsIn) do
  1131.             begin
  1132.               readln(SettingsIn,BufferIn);
  1133.               if (LeftStr(BufferIn,1)='R') then
  1134.                 begin
  1135.                   writeln(SettingsTemp,BufferIn);
  1136.                 end;
  1137.               if (LeftStr(BufferIn,1)='[') then
  1138.                 begin
  1139.                   BufferIn:='';
  1140.                   break;
  1141.                 end;
  1142.             end;
  1143.           close(SettingsTemp);
  1144.         end;
  1145.       if (BufferIn='') then break;
  1146.     end;
  1147.   close(SettingsIn);
  1148.  
  1149.   //[0x3 serviceList] Serviceliste in temporäre Datei auslagern
  1150.   assign(SettingsIn,Settings);
  1151.   reset(SettingsIn);
  1152.   while not EOF(SettingsIn) do
  1153.     begin
  1154.       readln(SettingsIn,BufferIn);
  1155.       if (BufferIn='[0x3 serviceList]') then
  1156.         begin
  1157.           assign(SettingsTemp,ExtractFilePath(Application.ExeName)+'/srv.tmp');
  1158.           rewrite(SettingsTemp);
  1159.           while not EOF(SettingsIn) do
  1160.             begin
  1161.               readln(SettingsIn,BufferIn);
  1162.               if (LeftStr(BufferIn,1)='R') then
  1163.                 begin
  1164.                   writeln(SettingsTemp,BufferIn);
  1165.                 end;
  1166.               if (LeftStr(BufferIn,1)='[') then
  1167.                 begin
  1168.                   BufferIn:='';
  1169.                   break;
  1170.                 end;
  1171.             end;
  1172.           close(SettingsTemp);
  1173.         end;
  1174.       if (BufferIn='') then break;
  1175.     end;
  1176.   close(SettingsIn);
  1177.  
  1178.   //[0x10005 <!1>] TV Favoriten in temporäre Datei auslagern
  1179.   assign(SettingsIn,Settings);
  1180.   reset(SettingsIn);
  1181.   while not EOF(SettingsIn) do
  1182.     begin
  1183.       readln(SettingsIn,BufferIn);
  1184.       if (BufferIn='[0x10005 <!1>]') then
  1185.         begin
  1186.           assign(SettingsTemp,ExtractFilePath(Application.ExeName)+'/tv.tmp');
  1187.           rewrite(SettingsTemp);
  1188.           while not EOF(SettingsIn) do
  1189.             begin
  1190.               readln(SettingsIn,BufferIn);
  1191.               if (LeftStr(BufferIn,1)='R') then
  1192.                 begin
  1193.                   writeln(SettingsTemp,BufferIn);
  1194.                 end;
  1195.               if (LeftStr(BufferIn,1)='[') then
  1196.                 begin
  1197.                   BufferIn:='';
  1198.                   break;
  1199.                 end;
  1200.             end;
  1201.           close(SettingsTemp);
  1202.         end;
  1203.       if (BufferIn='') then break;
  1204.     end;
  1205.   close(SettingsIn);
  1206.  
  1207.   //[0x5 <!0>] Radio Favoriten in temporäre Datei auslagern
  1208.   assign(SettingsIn,Settings);
  1209.   reset(SettingsIn);
  1210.   while not EOF(SettingsIn) do
  1211.     begin
  1212.       readln(SettingsIn,BufferIn);
  1213.       if (BufferIn='[0x5 <!0>]') then
  1214.         begin
  1215.           assign(SettingsTemp,ExtractFilePath(Application.ExeName)+'/rad.tmp');
  1216.           rewrite(SettingsTemp);
  1217.           while not EOF(SettingsIn) do
  1218.             begin
  1219.               readln(SettingsIn,BufferIn);
  1220.               if (LeftStr(BufferIn,1)='R') then
  1221.                 begin
  1222.                   writeln(SettingsTemp,BufferIn);
  1223.                 end;
  1224.               if (LeftStr(BufferIn,1)='[') then
  1225.                 begin
  1226.                   BufferIn:='';
  1227.                   break;
  1228.                 end;
  1229.             end;
  1230.           close(SettingsTemp);
  1231.         end;
  1232.       if (BufferIn='') then break;
  1233.     end;
  1234.   close(SettingsIn);
  1235.  
  1236.   //Ausgabe Datei anlegen
  1237.   assign(SettingsOut,Settings_old);
  1238.   rewrite(SettingsOut);
  1239.  
  1240.   //Favoritenlisten öffnen und TV Favoriten zuerst auslesen
  1241.   for Schleife:=0 to 1 do
  1242.   begin
  1243.     If (Schleife=0) then
  1244.       begin
  1245.         assign(SettingsTemp,ExtractFilePath(Application.ExeName)+'/tv.tmp');
  1246.         reset(SettingsTemp);
  1247.       end
  1248.     else
  1249.       begin
  1250.         assign(SettingsTemp,ExtractFilePath(Application.ExeName)+'/rad.tmp');
  1251.         reset(SettingsTemp);
  1252.       end;
  1253.  
  1254.   while not EOF(SettingsTemp) do
  1255.     begin
  1256.       //Favoriten der Reihe nach auslesen
  1257.       readln(SettingsTemp,BufferIn);
  1258.       Buffer:=RightStr(BufferIn,Length(BufferIn)-AnsiPos('=',BufferIn));
  1259.  
  1260.       //Programmdaten eines Programmes auslesen
  1261.       assign(SettingsTemp2,ExtractFilePath(Application.ExeName)+'/srv.tmp');
  1262.       reset(SettingsTemp2);
  1263.       while not EOF(SettingsTemp2) do
  1264.         begin
  1265.           readln(SettingsTemp2,BufferIn);
  1266.           if (AnsiContainsStr(BufferIn,'='+Buffer)=true) then
  1267.             begin
  1268.               Service:=Split(BufferIn,#9);
  1269.  
  1270.               //Programmname
  1271.               Programmname:=Service[1];
  1272.               //Ungewollte Steuerzeichen aus Programmnamen ausfiltern
  1273.               Programmname:=StringReplace(Programmname,#5,'',[rfReplaceAll, rfIgnoreCase]);
  1274.               Programmname:=StringReplace(Programmname,'"','',[rfReplaceAll, rfIgnoreCase]);
  1275.               //Shareware Hinweis
  1276.               //if (Registration=false) then Programmname:='"GammaLoader unregistered"';
  1277.               //Anführungszeichen gezielt nur am Anfang und Ende des Namens setzen
  1278.               Programmname:='"'+Programmname+'"';
  1279.               //wenn nur FTA verschlüsselte Services löschen
  1280.               if (Service[10]='1') and (FTA=true) then
  1281.                 Programmname:='';
  1282.  
  1283.               //Service ID
  1284.               ServiceID:=IntToStr(StrToInt('$'+StringReplace(Service[4],'0x','',[rfReplaceAll, rfIgnoreCase])));
  1285.  
  1286.               //PCR PID
  1287.               PCRPID:=IntToStr(StrToInt('$'+StringReplace(Service[5],'0x','',[rfReplaceAll, rfIgnoreCase])));;
  1288.  
  1289.               //Audio PId
  1290.               AudioPID:=IntToStr(StrToInt('$'+StringReplace(Service[6],'0x','',[rfReplaceAll, rfIgnoreCase])));;
  1291.  
  1292.               //Video PID
  1293.               VideoPID:=IntToStr(StrToInt('$'+StringReplace(Service[7],'0x','',[rfReplaceAll, rfIgnoreCase])));;
  1294.  
  1295.               //SFI Marker
  1296.               SFI:=Service[8];
  1297.               if(SFI_Marker=false) then
  1298.                 SFI:='0';
  1299.  
  1300.               //Transponderdaten auslesen
  1301.               assign(SettingsTemp3,ExtractFilePath(Application.ExeName)+'/tp.tmp');
  1302.               reset(SettingsTemp3);
  1303.               while not EOF(SettingsTemp3) do
  1304.                 begin
  1305.                   readln(SettingsTemp3,BufferIn);
  1306.                   if (AnsiContainsStr(BufferIn,'='+Service[2])=true) then
  1307.                     begin
  1308.                       Transponder:=Split(BufferIn,#9);
  1309.  
  1310.                       //Frequenz
  1311.                       Frequenz:=Transponder[5];
  1312.  
  1313.                       //Symbolrate
  1314.                       Symbolrate:=Transponder[6];
  1315.  
  1316.                       //Polarität
  1317.                       if (Transponder[7]='0') then
  1318.                         Polaritaet:='v'
  1319.                       else
  1320.                         Polaritaet:='h';
  1321.  
  1322.                       //FEC
  1323.                       FEC:=Transponder[8];
  1324.  
  1325.                       //Satellit Eintrag zwischenspeichern
  1326.                       buffer:=Transponder[10];
  1327.  
  1328.                       break;
  1329.                     end;
  1330.                 end;
  1331.               Close(SettingsTemp3);
  1332.  
  1333.               //Satellitendaten auslesen
  1334.               assign(SettingsTemp3,ExtractFilePath(Application.ExeName)+'/sat.tmp');
  1335.               reset(SettingsTemp3);
  1336.               while not EOF(SettingsTemp3) do
  1337.                 begin
  1338.                   readln(SettingsTemp3,BufferIn);
  1339.                   if (AnsiContainsStr(BufferIn,'='+buffer)=true) then
  1340.                     begin
  1341.                       Sat:=Split(BufferIn,#9);
  1342.                       Satellit:='';
  1343.                       //42,0° Ost
  1344.                       if (Sat[2]='0x8420') then
  1345.                         Satellit:='Türksat 8420';
  1346.                       //36,0° Ost
  1347.                       if (Sat[2]='0x8360') then
  1348.                         Satellit:='EutelSat 8360';
  1349.                       //31,3° Ost
  1350.                       if (Sat[2]='0x8313') then
  1351.                         Satellit:='Türksat 8313';
  1352.                       //28,2° Ost
  1353.                       if (Sat[2]='0x8282') then
  1354.                         Satellit:='ASTRA/Eubird 8282';
  1355.                       //23,5° Ost
  1356.                       if (Sat[2]='0x8235') then
  1357.                         Satellit:='Kopernikus 8235';
  1358.                       //19,2° Ost
  1359.                       if (Sat[2]='0x8192') then
  1360.                         Satellit:='ASTRA 8192';
  1361.                       //16,0°Ost
  1362.                       if (Sat[2]='0x8160') then
  1363.                         Satellit:='EutelSat 8160';
  1364.                       //13,0° Ost
  1365.                       if (Sat[2]='0x8130') then
  1366.                         Satellit:='EutelSat 8130';
  1367.                       //10,0° Ost
  1368.                       if (Sat[2]='0x8100') then
  1369.                         Satellit:='EutelSat 8100';
  1370.                       //5,0° Ost
  1371.                       if (Sat[2]='0x8050') then
  1372.                         Satellit:='Sirius 8050';
  1373.                       //1,0° West
  1374.                       if (Sat[2]='0x10') then
  1375.                         Satellit:='Thor/Intelsat 10';
  1376.                       //4,0° West
  1377.                       if (Sat[2]='0x40') then
  1378.                         Satellit:='Amos 40';
  1379.                       //5,0° West
  1380.                       if (Sat[2]='0x50') then
  1381.                         Satellit:='Telecom 50';
  1382.                       //7,0° West
  1383.                       if (Sat[2]='0x70') then
  1384.                         Satellit:='Nilesat 70';
  1385.                       //30,0° West
  1386.                       if (Sat[2]='0x300') then
  1387.                         Satellit:='Hispasat 300';
  1388.                       //37,5° West
  1389.                       if (Sat[2]='0x375') then
  1390.                         Satellit:='Orion 375';
  1391.                       //43,0° West
  1392.                       if (Sat[2]='0x430') then
  1393.                         Satellit:='PanamSat 430';
  1394.                       //User1
  1395.                       if (Sat[2]='"User 1"') then
  1396.                         Satellit:='User-1 ffffffff';
  1397.                       //User2
  1398.                       if (Sat[2]='"User 2"') then
  1399.                         Satellit:='User-2 ffffffff';
  1400.                       //User3
  1401.                       if (Sat[2]='"User 3"') then
  1402.                         Satellit:='User-3 ffffffff';
  1403.                       //User4
  1404.                       if (Sat[2]='"User 4"') then
  1405.                         Satellit:='User-4 ffffffff';
  1406.                       //User5
  1407.                       if (Sat[2]='"User 5"') then
  1408.                         Satellit:='User-5 ffffffff';
  1409.                       //User6
  1410.                       if (Sat[2]='"User 6"') then
  1411.                         Satellit:='User-6 ffffffff';
  1412.                       //User7
  1413.                       if (Sat[2]='"User 7"') then
  1414.                         Satellit:='User-7 ffffffff';
  1415.                       //User8
  1416.                       if (Sat[2]='"User 8"') then
  1417.                         Satellit:='User-8 ffffffff';
  1418.                       //User9
  1419.                       if (Sat[2]='"User 9"') then
  1420.                         Satellit:='User-9 ffffffff';
  1421.                       //User10
  1422.                       if (Sat[2]='"User10"') then
  1423.                         Satellit:='User10 ffffffff';
  1424.                       //User11
  1425.                       if (Sat[2]='"User11"') then
  1426.                         Satellit:='User11 ffffffff';
  1427.                       //User12
  1428.                       if (Sat[2]='"User12"') then
  1429.                         Satellit:='User12 ffffffff';
  1430.                       //User13
  1431.                       if (Sat[2]='"User13"') then
  1432.                         Satellit:='User13 ffffffff';
  1433.                       //User14
  1434.                       if (Sat[2]='"User14"') then
  1435.                         Satellit:='User14 ffffffff';
  1436.                       //User15
  1437.                       if (Sat[2]='"User15"') then
  1438.                         Satellit:='User15 ffffffff';
  1439.                       //User1 falls keine Sat Position zugeordnet werden konnte
  1440.                       if (Satellit='') then
  1441.                         Satellit:='User-1 ffffffff';
  1442.                       break;
  1443.                     end;
  1444.                 end;
  1445.               Close(SettingsTemp3);
  1446.  
  1447.               //Shareware Hinweis
  1448.               {
  1449.               if (Registration=false) then
  1450.                 begin
  1451.                   ProvID:='1';
  1452.                   Prov:='"Unregistered"';
  1453.                 end
  1454.               else
  1455.                 begin
  1456.                   ProvID:='0';
  1457.                   Prov:='""';
  1458.                 end;
  1459.               }
  1460.               ProvID:='0';
  1461.               Prov:='""';
  1462.  
  1463.               //Neue Programmdatenzeile zusammensetzen und in Datei schreiben
  1464.               if (Programmname<>'') then
  1465.                 begin
  1466.                   BufferOut:=Satellit+' '+Frequenz+'000 '+Polaritaet;
  1467.                   BufferOut:=BufferOut+StringOfChar(' ',6-Length(Symbolrate))+Symbolrate+'   '+FEC;
  1468.                   BufferOut:=BufferOut+StringOfChar(' ',6-Length(ServiceID))+ServiceID;
  1469.                   BufferOut:=BufferOut+StringOfChar(' ',6-Length(PCRPID))+PCRPID;
  1470.                   BufferOut:=BufferOut+StringOfChar(' ',6-Length(AudioPID))+AudioPID;
  1471.                   BufferOut:=BufferOut+StringOfChar(' ',6-Length(VideoPID))+VideoPID;
  1472.                   BufferOut:=BufferOut+' 1 '+SFI+' '+Programmname+' '+ProvID+' '+Prov;
  1473.                   writeln(SettingsOut,BufferOut);
  1474.                   if (Satellit='ASTRA/Eubird 8282') then
  1475.                     begin
  1476.                       BufferOut:=StringReplace(BufferOut,Satellit,'ASTRA 8282',[rfReplaceAll, rfIgnoreCase]);
  1477.                       writeln(SettingsOut,BufferOut);
  1478.                     end;
  1479.                 end;
  1480.               Application.ProcessMessages;
  1481.               break;
  1482.             end;
  1483.         end;
  1484.       close(SettingsTemp2);
  1485.     end;
  1486.   close(SettingsTemp);
  1487.   end;
  1488.  
  1489.   //Ausgabedatei schließen
  1490.   close(SettingsOut);
  1491.   convert:=true;
  1492.  
  1493.   except
  1494.     convert:=false;
  1495.   end;
  1496.  
  1497.   //Temporäre Dateien löschen
  1498.   if (FileExists(ExtractFilePath(Application.ExeName)+'/sat.tmp')=true) then DeleteFile(ExtractFilePath(Application.ExeName)+'/sat.tmp');
  1499.   if (FileExists(ExtractFilePath(Application.ExeName)+'/tv.tmp')=true) then DeleteFile(ExtractFilePath(Application.ExeName)+'/tv.tmp');
  1500.   if (FileExists(ExtractFilePath(Application.ExeName)+'/tp.tmp')=true) then DeleteFile(ExtractFilePath(Application.ExeName)+'/tp.tmp');
  1501.   if (FileExists(ExtractFilePath(Application.ExeName)+'/rad.tmp')=true) then DeleteFile(ExtractFilePath(Application.ExeName)+'/rad.tmp');
  1502.   if (FileExists(ExtractFilePath(Application.ExeName)+'/srv.tmp')=true) then DeleteFile(ExtractFilePath(Application.ExeName)+'/srv.tmp');
  1503.  
  1504.   //Bedienung freigeben
  1505.   Form1.Button1.Visible:=true;
  1506.   OpenControls;
  1507. end;
  1508.  
  1509. function Version (): ShortString; stdcall;
  1510. begin
  1511. //  Version:=GetVersion(Application.ExeName);
  1512.   Version:=GetVersion('TSAPI.DLL');
  1513. end;
  1514.  
  1515. function GetModelFromFile(SettingsFile: ShortString): ShortString; stdcall;
  1516. //Receivermodell aus Settingsdatei auslesen
  1517. var
  1518.   Datei: TextFile;
  1519.   buffer: String;
  1520.   Receiver: String;
  1521.   BasicSettings: Boolean;
  1522.  
  1523. begin
  1524.   //Pfadangabe überprüfen
  1525.   if (SettingsFile='') or (FileExists(SettingsFile)=false) then
  1526.     begin
  1527.       GetModelFromFile:='';
  1528.       exit;
  1529.     end;
  1530.  
  1531.   //Grundeinstellungen setzen
  1532.   GlobalBreak:=false;
  1533.   BasicSettings:=false;
  1534.  
  1535.   //Bedienung sperren
  1536.   CloseControls;
  1537.  
  1538.   //Modus Status
  1539.   Modus('Suche Receivertyp in "'+ExtractFileName(SettingsFile)+'"');
  1540.  
  1541.   //Settings Datei öffnen
  1542.   Assign(Datei, SettingsFile);
  1543.   Reset(Datei);
  1544.  
  1545.   //Settings nach Receivermodell auswerten
  1546.   Application.ProcessMessages;
  1547.   while not EOF(Datei) or (GlobalBreak=true) do
  1548.     begin
  1549.       buffer:='';
  1550.       readln(Datei,buffer);
  1551.  
  1552.       //[0x6 basicSettings] Abschnitt auswerten
  1553.       if (AnsiContainsStr(buffer, '[0x6 basic')=true) then BasicSettings:=true;
  1554.  
  1555.       //Receivernamen in Abschnitt [0x6 basicSettings] rausfiltern
  1556.       if (BasicSettings=true) then
  1557.         begin
  1558.           if (AnsiContainsStr(buffer, '"')=true) then
  1559.             begin
  1560.               Receiver:=MidStr(buffer,AnsiPos('"',buffer)+1,LastDelimiter('"',buffer)-AnsiPos('"',buffer)-1);
  1561.               break;
  1562.             end;
  1563.           //Abbruch wenn nachfolgender Abschnitt erreicht ist
  1564.           if (AnsiContainsStr(buffer, '[0x')=true) then
  1565.         end;
  1566.     end;
  1567.  
  1568.   //Settingsdatei schließen
  1569.   Close(Datei);
  1570.  
  1571.   //Status
  1572.   Status('Receivertyp: '+Receiver);
  1573.  
  1574.   //Bedienung wieder entriegeln
  1575.   OpenControls;
  1576.  
  1577.   //Receivertyp zurückmelden
  1578.   GetModelFromFile:=Receiver;
  1579. end;
  1580.  
  1581. function AutoDownload(SettingsFile: ShortString; COM: Integer): Boolean; stdcall;
  1582. //Download mit automatischer Bestimmung der Receiver Serie
  1583. var
  1584.   Series: Integer;
  1585.  
  1586. begin
  1587.   if PortExists(COM)=false then
  1588.     begin
  1589.       AutoDownload:=false;
  1590.       exit;
  1591.     end;
  1592.   Series:=GetSeriesFromReceiver(COM);
  1593.   if ((GlobalBreak=true) or (Series<0)) then
  1594.     begin
  1595.       GlobalBreak:=false;
  1596.       AutoDownload:=false;
  1597.       exit;
  1598.     end;
  1599.   delay(1000);
  1600.   AutoDownload:=Download(SettingsFile,COM,Series);
  1601. end;
  1602.  
  1603. function AutoUpload(SettingsFile: ShortString; COM: Integer; IgnoreHardwareCheck: Boolean): Boolean; stdcall;
  1604. var
  1605.   Series: Integer;
  1606.   ModelFromFile: String;
  1607.   ModelFromReceiver: String;
  1608.  
  1609. begin
  1610.   if PortExists(COM)=false then
  1611.     begin
  1612.       AutoUpload:=false;
  1613.       exit;
  1614.     end;
  1615.  
  1616.   Series:=0;
  1617.   if IgnoreHardwareCheck=true then
  1618.     begin
  1619.       Series:=GetSeriesFromReceiver(COM);
  1620.       Application.ProcessMessages;
  1621.       if Series<0 then
  1622.         begin
  1623.           AutoUpload:=false;
  1624.           exit;
  1625.         end;
  1626.     end
  1627.   else
  1628.     begin
  1629.       ModelFromReceiver:=GetModelFromReceiver(COM);
  1630.       Application.ProcessMessages;
  1631.       if GlobalBreak=true then
  1632.         begin
  1633.           GlobalBreak:=false;
  1634.           AutoUpload:=false;
  1635.           exit;
  1636.         end;
  1637.       ModelFromFile:=GetModelFromFile(SettingsFile);
  1638.       Application.ProcessMessages;
  1639.       if GlobalBreak=true then
  1640.         begin
  1641.           GlobalBreak:=false;
  1642.           AutoUpload:=false;
  1643.           exit;
  1644.         end;
  1645.       if ModelFromReceiver<>ModelFromFile then
  1646.         begin
  1647.           AutoUpload:=false;
  1648.           exit;
  1649.         end;
  1650.     end;
  1651.  
  1652.   if GlobalBreak=true then
  1653.     begin
  1654.       GlobalBreak:=false;
  1655.       AutoUpload:=false;
  1656.       exit;
  1657.     end;
  1658.   Application.ProcessMessages;
  1659.   delay(1000);
  1660.   Application.ProcessMessages;
  1661.   AutoUpload:=Upload(SettingsFile,COM,Series);
  1662. end;
  1663.  
  1664. function Upload(SettingsFile: ShortString; COM: Integer; Series: Integer): Boolean; stdcall;
  1665. //Settings von PC in Receiver einspielen
  1666. var
  1667.   buffer: String;
  1668.   buffer2: String;
  1669.   Counter: Integer;
  1670.   Counter2: Integer;
  1671.   Counter3: Integer;
  1672.   dbload: Boolean;
  1673.   Datei: Textfile;
  1674.   DataBase: Boolean;
  1675.  
  1676. begin
  1677.   {$IFDEF TIMELOCK}
  1678.   if CheckTimer=true then
  1679.     begin
  1680.       upload:=false;
  1681.       exit;
  1682.     end;
  1683.   {$ENDIF}
  1684.  
  1685.   //Pfadangabe überprüfen
  1686.   if (SettingsFile='') or (FileExists(SettingsFile)=false) then
  1687.     begin
  1688.       Upload:=false;
  1689.       exit;
  1690.     end;
  1691.  
  1692.   //Grundeinstellungen definiert setzen
  1693.   GlobalBreak:=false;
  1694.   DataBase:=false;
  1695.  
  1696.   //COM Port Einstellungen übernehmen
  1697.   //COM Schnittstelle
  1698.   if (COM>0) then
  1699.     begin
  1700.       Form1.AfComPort1.ComNumber:=COM;
  1701.     end
  1702.   else
  1703.     begin
  1704.       upload:=false;
  1705.       exit;
  1706.     end;
  1707.   //Parity
  1708.   if (Series=1)then
  1709.     Form1.AfComPort1.Parity:=paEven
  1710.   else
  1711.     Form1.AfComPort1.Parity:=paNone;
  1712.  
  1713.   //Bedienung sperren
  1714.   CloseControls;
  1715.  
  1716.   //ProgressBar einblenden
  1717.   Form1.ProgressBar1.Visible:=true;
  1718.   Form1.ProgressBar1.Max:=0;
  1719.  
  1720.   //Modus
  1721.   Modus('Upload COM'+IntToStr(COM));
  1722.  
  1723.   //COM Port öffnen
  1724.   Form1.AfComPort1.Close;
  1725.   Form1.AfComPort1.Open;
  1726.  
  1727.   //Settings Datei öffnen
  1728.   //FileMode := fmOpenRead;
  1729.   Assign(Datei,SettingsFile);
  1730.   Reset(Datei);
  1731.  
  1732.   //Startzeit:=Time;
  1733.   Counter:=0;
  1734.  
  1735.   while (Counter<100) and (GlobalBreak=false) do
  1736.     begin
  1737.       Application.ProcessMessages;
  1738.       Form1.AfComPort1.PurgeRX;
  1739.       Form1.AfComPort1.PurgeTX;
  1740.       Form1.AfComPort1.WriteString('dbload');
  1741.       delay(100);
  1742.       buffer2:='';
  1743.       buffer2:=Form1.AfComPort1.ReadString;
  1744.       if (LeftStr(buffer2,1)=#1) then
  1745.         begin
  1746.           Counter:=0;
  1747.           break;
  1748.         end
  1749.       else
  1750.         Counter:=Counter+1;
  1751.     end;
  1752.  
  1753.   //Statusanzeige
  1754.   Status('[database]');
  1755.   while (GlobalBreak=false) and (Counter<100) do
  1756.     begin
  1757.       //Zeile aus Datenbank einlesen und Sendepaket erzeugen
  1758.       buffer:='';
  1759.       readln(Datei,buffer);
  1760.       if length(buffer)=0 then break;
  1761.  
  1762. //      if (AnsiContainsStr(buffer, '[0x')=true) and (AnsiContainsStr(buffer, ']')=true) and (AnsiContainsStr(buffer, '0x')=true) or (AnsiContainsStr(buffer, '[database]')=true) then
  1763.         //Form1.JvStatusBar1.Panels[0].Text:=MidStr(buffer,AnsiPos('[',buffer)+1,AnsiPos(']',buffer)-AnsiPos('[',buffer)-1);
  1764.         //Form1.Caption:=MidStr(buffer,AnsiPos('[',buffer)+1,AnsiPos(']',buffer)-AnsiPos('[',buffer)-1);
  1765.       buffer:=StringReplace(buffer,#10,'',[rfReplaceAll, rfIgnoreCase]);
  1766.       buffer:=StringReplace(buffer,#13,'',[rfReplaceAll, rfIgnoreCase]);
  1767.  
  1768.       //DigiCorder S2 Anpassung für Abschnitt [0x6 basicSettings] Eintrag RF0=
  1769.       if LeftStr(buffer,2)='RF' then
  1770.         buffer:=StringReplace(buffer,'RF','F',[]);
  1771.  
  1772.       //[database] Abschnitt Auswertung
  1773.       if (LeftStr(buffer,1)='[') and (DataBase=true) then
  1774.         begin
  1775.           DataBase:=false;
  1776.         end;
  1777.       if LeftStr(buffer,10)='[database]' then
  1778.         DataBase:=true;
  1779.       if (DataBase=true) and (LeftStr(buffer,1)='I') then
  1780.         begin
  1781.           try
  1782.           Form1.ProgressBar1.Max:=Form1.ProgressBar1.Max+1+StrToInt(MidStr(buffer,LastDelimiter('=',buffer)+1,Length(buffer)-LastDelimiter('=',buffer)));
  1783.           if Form1.ProgressBar1.Position<Form1.ProgressBar1.Max then
  1784.             Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;
  1785.           finally
  1786.           //
  1787.           end;
  1788.         end;
  1789.  
  1790.       //Abschnitte zählen
  1791.       if (LeftStr(buffer,1)='R') and (DataBase=false) and (Form1.ProgressBar1.Position<Form1.ProgressBar1.Max) then
  1792.         Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;
  1793.  
  1794.       //Statusanzeige
  1795.       if AnsiPos('[0x',buffer)>0 then
  1796.         begin
  1797.           Status(MidStr(buffer,AnsiPos('[',buffer),AnsiPos(']',buffer)-AnsiPos('[',buffer)+1));
  1798.         end;
  1799.       Status2(buffer);
  1800.  
  1801.       buffer:=MakePaket(buffer);
  1802.  
  1803.       //Paket senden
  1804.       Form1.AfComPort1.WriteString(buffer);
  1805.  
  1806.       buffer2:='';
  1807.       while Counter<100 do
  1808.         begin
  1809.           //Antwort von Receiver empfangen
  1810.           //delay(50);
  1811.           buffer2:=buffer2+Form1.AfComPort1.ReadString;
  1812.           Application.ProcessMessages;
  1813.  
  1814.           if GlobalBreak=true then break;
  1815.           if EOF(Datei) then break;
  1816.  
  1817.           //Paket von Receiver bestätigt
  1818.           if ((RightStr(buffer2,1)=#1) or (RightStr(buffer2,1)=#3)) then
  1819.             begin
  1820.               buffer2:='';
  1821.               Counter:=0;
  1822.               break;
  1823.             end
  1824.           else
  1825.             begin
  1826.               delay(5);
  1827.               Counter:=Counter+1;
  1828.             end;
  1829.         end;
  1830.     end;
  1831.  
  1832.   //Stop-Signal schicken
  1833.   Status('Beende Verbindung an COM'+IntToStr(COM)+'...');
  1834.   Status2('');
  1835.   Counter3:=0;
  1836.   for Counter2:=1 to 7 do
  1837.   begin
  1838.  
  1839.    while (Counter3<100) and (GlobalBreak=false) do
  1840.     begin
  1841.       Application.ProcessMessages;
  1842.       delay(25);
  1843.       buffer2:='';
  1844.       buffer2:=Form1.AfComPort1.ReadString;
  1845.       if (LeftStr(buffer2,1)=#1) then
  1846.         begin
  1847.           Counter3:=0;
  1848.           break;
  1849.         end
  1850.       else
  1851.         Counter3:=Counter3+1;
  1852.     end;
  1853.  
  1854.   while (Counter3<100) and (GlobalBreak=false) do
  1855.     begin
  1856.       Application.ProcessMessages;
  1857.       Form1.AfComPort1.PurgeRX;
  1858.       Form1.AfComPort1.PurgeTX;
  1859.       Form1.AfComPort1.WriteString(#85+#85+#0+#0);
  1860.       delay(25);
  1861.       buffer2:='';
  1862.       buffer2:=Form1.AfComPort1.ReadString;
  1863.       if (LeftStr(buffer2,1)=#1) then
  1864.         begin
  1865.           Form1.AfComPort1.WriteString(#1);
  1866.           Counter3:=0;
  1867.           break;
  1868.         end
  1869.       else
  1870.         Counter3:=Counter3+1;
  1871.     end;
  1872.   end;
  1873.  
  1874.   //Datei und COM Port schließen
  1875.   Form1.AfComPort1.Close;
  1876.   close(Datei);
  1877.  
  1878.   //Auswertung ob der Upload erfolgreich war
  1879.   if (GlobalBreak=true) or (Counter>99) then
  1880.     dbload:=false
  1881.   else
  1882.     dbload:=true;
  1883.  
  1884.   //Rückgabewert der Funktion setzen
  1885.   Upload:=dbload;
  1886.  
  1887.   //Bedienung freigeben
  1888.   OpenControls;
  1889. end;
  1890.  
  1891. function Download(SettingsFile: ShortString; COM: Integer; Series: Integer): Boolean; stdcall;
  1892. //Settings aus Gerät auslesen
  1893. var
  1894.   Paket: AnsiString;
  1895.   buffer: String;
  1896.   Counter: Integer;
  1897.   InBufferUsed: Integer;
  1898.   CheckSum1: String;
  1899.   CheckSum2: String;
  1900.   Settings: Text;
  1901.   DataBase: Boolean;
  1902.  
  1903. begin
  1904.   {$IFDEF TIMELOCK}
  1905.   if CheckTimer=true then
  1906.     begin
  1907.       Download:=false;
  1908.       exit;
  1909.     end;
  1910.   {$ENDIF}
  1911.  
  1912.   //Bedienung sperren
  1913.   CloseControls;
  1914.  
  1915.   //Modus Status
  1916.   Modus('Download COM'+IntToStr(COM));
  1917.  
  1918.   //Grundeinstellungen setzen
  1919.   Counter:=0;
  1920.   GlobalBreak:=false;
  1921.   DataBase:=false;
  1922.   Form1.ProgressBar1.Position:=0;
  1923.   Form1.ProgressBar1.Visible:=true;
  1924.  
  1925.   //Anhand von Receiver Serie COM Port Einstellung setzen
  1926.   if Series=1 then
  1927.     Form1.AfComPort1.Parity:=paEven
  1928.   else
  1929.     Form1.AfComPort1.Parity:=paNone;
  1930.  
  1931.   //COM Port setzen
  1932.   Form1.AfComPort1.ComNumber:=COM;
  1933.  
  1934.   //COM Port definiert öffnen
  1935.   Form1.AfComPort1.Close;
  1936.   Form1.AfComPort1.Open;
  1937.  
  1938.   //Settings Datei erzeugen
  1939.   if (FileExists(SettingsFile)=true) then DeleteFile(SettingsFile);
  1940.   assign(Settings,SettingsFile);
  1941.   rewrite(Settings);
  1942.  
  1943.   //COM Port Puffer leeren
  1944.   Form1.AfComPort1.PurgeRX;
  1945.   Form1.AfComPort1.PurgeTX;
  1946.  
  1947.   //Datenbank auslesen
  1948.   Form1.AfComPort1.WriteString('dbdump');
  1949.  
  1950.   //[database] Abschnitt finden
  1951.   while (Counter<200) and (GlobalBreak=false) do
  1952.     begin
  1953.       delay(25);
  1954.       Application.ProcessMessages;
  1955.       buffer:=Form1.AfComPort1.ReadString;
  1956.       Paket:=Paket+buffer;
  1957.  
  1958.       if AnsiPos('[database]',GetPaket(Paket))>0 then
  1959.         begin
  1960.           Status('[database]');
  1961.  
  1962.           //markieren das Schleife in [database] Abschnitt ist
  1963.           DataBase:=true;
  1964.  
  1965.           if GetPaket(buffer)='' then
  1966.             begin
  1967.               buffer:=LeftStr(Buffer,Length(buffer)-1);
  1968.               buffer:=RightStr(Buffer,Length(buffer)-4);
  1969.               buffer:=StringReplace(buffer,#10,#13+#10,[rfReplaceAll, rfIgnoreCase]);
  1970.             end
  1971.           else
  1972.             buffer:=GetPaket(buffer);
  1973.  
  1974.           if Length(RightStr(Buffer,Length(buffer)-LastDelimiter('[',buffer)+1))>0 then
  1975.             buffer:=RightStr(Buffer,Length(buffer)-LastDelimiter('[',buffer)+1);
  1976.           //Application.MessageBox(PChar(buffer),PChar('DEBUG'));
  1977.  
  1978.           //if ((AnsiPos('[database]',buffer)=1) and (AnsiPos('FrontEnd',buffer)>1))then
  1979.           if (AnsiPos('[database]',buffer)=1)then
  1980.             begin
  1981.               write(Settings,buffer);
  1982.               break;
  1983.             end
  1984.           else
  1985.             begin
  1986.               Counter:=Counter+1;
  1987.               buffer:='';
  1988.             end;
  1989.         end
  1990.       else
  1991.         Counter:=Counter+1;
  1992.     end;
  1993.  
  1994.   //bei Fehler oder Abbruch Funktion verlassen
  1995.   if (Counter>199) or (GlobalBreak=true) then
  1996.     begin
  1997.       Form1.AfComPort1.Close;
  1998.       OpenControls;
  1999.       Close(Settings);
  2000.       Download:=false;
  2001.       exit;
  2002.     end;
  2003.  
  2004.   //COM Port Puffer leeren
  2005.   Form1.AfComPort1.PurgeRX;
  2006.   Form1.AfComPort1.PurgeTX;
  2007.  
  2008.   //nächstes Paket anfordern
  2009.   Counter:=0;
  2010.   Form1.AfComPort1.WriteString(#1);
  2011.   while (Counter<200) and (GlobalBreak=false) do
  2012.     begin
  2013.       delay(3);
  2014.       InBufferUsed:=0;
  2015.       buffer:='';
  2016.       //warten bis Empfangspuffer sich nicht mehr füllt
  2017.       while Form1.AfComPort1.InBufUsed<>InBufferUsed do
  2018.         begin
  2019.           InBufferUsed:=Form1.AfComPort1.InBufUsed;
  2020.           delay(3)
  2021.         end;
  2022.       Application.ProcessMessages;
  2023.       buffer:=Form1.AfComPort1.ReadString;
  2024.  
  2025.       //wenn Receiver die Übertragung beendet Schleife verlassen
  2026.       if buffer=#85+#85+#0+#0 then break;
  2027.  
  2028.       //Puffer Checksummen festlegen
  2029.       //Checksumme 1 -> IST Checksumme des Paketes
  2030.       //Checksumme 2 -> SOLL Checksumme des Paketes
  2031.       if buffer<>'' then
  2032.         begin
  2033.           //Sonderfall wenn 2 x 0A Bytes gesendet werden -> Checksumme SOLL = 10
  2034.           if AnsiPos(#10+#10,buffer)>0 then
  2035.             begin
  2036.               {
  2037.               if AnsiPos('UU',buffer)>0 then
  2038.                 begin
  2039.                   CheckSum1:=MidStr(buffer,AnsiPos('UU',buffer)+3,length(buffer)-AnsiPos('UU',buffer)-4);
  2040.                 end
  2041.               else
  2042.                 CheckSum1:=MidStr(buffer,4,length(buffer)-3);
  2043.               CheckSum1:=LeftStr(CheckSum1,AnsiPos(#10,CheckSum1));
  2044.               //CheckSum1:=IntToHex(CalcPaketChkSum(CheckSum1)+10,1);
  2045.               }
  2046.               CheckSum1:='0A';
  2047.               CheckSum2:='0A';
  2048.             end
  2049.           //Normalfall
  2050.           else
  2051.             begin
  2052.               CheckSum1:=IntToHex(CalcPaketChkSum(AnsiMidStr(buffer,AnsiPos('UU',buffer)+3,LastDelimiter(Chr(10),buffer)-(AnsiPos('UU',buffer)+3)))+10,1);
  2053.               CheckSum2:=IntToHex(Ord(AnsiMidStr(buffer,LastDelimiter(Chr(10),buffer)+1,1)[1]),1);
  2054.             end;
  2055.         end
  2056.       else  //Fehler bei der Checksummenberechnung mit 2 unterschiedlichen Checksummen quittieren
  2057.         begin
  2058.           CheckSum1:='01';
  2059.           CheckSum2:='02';
  2060.         end;
  2061.  
  2062.       //Checksummen formatieren
  2063.       CheckSum1:=RightStr(CheckSum1,2);
  2064.       CheckSum2:=RightStr(CheckSum2,2);
  2065.       CheckSum1:=StringOfChar('0',2-Length(CheckSum1))+CheckSum1;
  2066.       CheckSum2:=StringOfChar('0',2-Length(CheckSum2))+CheckSum2;
  2067.  
  2068.       //COM Port Puffer leeren
  2069.       Form1.AfComPort1.PurgeRX;
  2070.       Form1.AfComPort1.PurgeTX;
  2071.  
  2072.       //Statusanzeige
  2073.       //Paket:=StringReplace(Paket,#5,'',[rfReplaceAll, rfIgnoreCase]);
  2074.       try
  2075.       if AnsiPos('[0x',buffer)>0 then
  2076.         begin
  2077.           Status(StringReplace(MidStr(buffer,AnsiPos('[',buffer),AnsiPos(']',buffer)-AnsiPos('[',buffer)+1),#5,'',[rfReplaceAll, rfIgnoreCase]));
  2078.         end;
  2079.       Status2(GetPaket(buffer));
  2080.       finally
  2081.       //
  2082.       end;
  2083.  
  2084.       //Checksumme des Pakets überprüfen
  2085.       if CheckSum1=CheckSum2 then      //korrektes Paket
  2086.         begin
  2087.           //DigiCorder S2 Anpassung für Abschnitt [0x6 basicSettings] Eintrag RF0=
  2088.           buffer:=GetPaket(buffer);
  2089.           if LeftStr(buffer,2)='RF' then
  2090.             buffer:=StringReplace(buffer,'RF','F',[]);
  2091.  
  2092.           //[database] Abschnitt Auswertung
  2093.           if (LeftStr(buffer,2)='[0') and (DataBase=true) then
  2094.             begin
  2095.               DataBase:=false;
  2096.             end;
  2097.           if (DataBase=true) and (LeftStr(buffer,1)='I') then
  2098.             begin
  2099.               try
  2100.               if (LeftStr(buffer,1)='2') then
  2101.                 ShowMessage('"'+MidStr(buffer,LastDelimiter('=',buffer)+1,Length(buffer)-2-Pos('=',buffer))+'"');
  2102.               Form1.ProgressBar1.Max:=Form1.ProgressBar1.Max+1+StrToInt(MidStr(buffer,LastDelimiter('=',buffer)+1,Length(buffer)-2-LastDelimiter('=',buffer)));
  2103.               if Form1.ProgressBar1.Position<Form1.ProgressBar1.Max then
  2104.                 Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;
  2105.               finally
  2106.               //
  2107.               end;
  2108.             end;
  2109.  
  2110.           //Abschnitte zählen
  2111.           if (LeftStr(buffer,1)='R') and (DataBase=false) and (Form1.ProgressBar1.Position<Form1.ProgressBar1.Max) then
  2112.             Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;
  2113.  
  2114.           write(Settings,buffer);
  2115.           //write(Settings,GetPaket(buffer));
  2116.           Form1.AfComPort1.WriteString(#1);
  2117.           Counter:=0;
  2118.         end
  2119.       else          //fehlerhaftes Paket
  2120.         begin
  2121.           //write(Settings,'-->'+CheckSum1+' '+CheckSum2+#13+#10+'-->'+buffer+'<--'+#13+#10);
  2122.           Form1.AfComPort1.WriteString(#0);
  2123.           Counter:=Counter+1;
  2124.         end;
  2125.     end;
  2126.  
  2127.   //Settings Datei schließen
  2128.   Close(Settings);
  2129.  
  2130.   //COM Port schließen
  2131.   Form1.AfComPort1.Close;
  2132.  
  2133.   //Erfolg melden
  2134.   if ((GlobalBreak=false) and (Counter<200)) then
  2135.     Download:=true
  2136.   else
  2137.     Download:=false;
  2138.  
  2139.   //Bedienung entsperren
  2140.   //Application.MessageBox(PChar(IntToStr(Counter)+' '+BoolToStr(GlobalBreak)),PChar('DEBUG'));
  2141.   OpenControls;
  2142. end;
  2143.  
  2144. exports
  2145.   Version,
  2146.   About,
  2147.   Convert,
  2148.   XML,
  2149.   CSV,
  2150.   GetSeriesFromReceiver,
  2151.   GetModelFromFile,
  2152.   GetModelFromReceiver,
  2153.   Download,
  2154.   Upload,
  2155.   AutoDownload,
  2156.   AutoUpload,
  2157.   FlashReset,
  2158.   PortExists;
  2159.  
  2160. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  2161. begin
  2162.   Action:=caFree;
  2163.   Self.Free;
  2164. end;
  2165.  
  2166. procedure TForm1.FormCreate(Sender: TObject);
  2167. //API Formular immer im Vordergrund halten
  2168. begin
  2169.   with Self do {Form1,...}
  2170.   SetWindowPos(Handle, // handle to window
  2171.                HWND_TOP, // placement-order handle {*}
  2172.                Left,  // horizontal position
  2173.                Top,   // vertical position
  2174.                Width,
  2175.                Height,
  2176.                // window-positioning options
  2177.                SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
  2178.  
  2179. {* Other Values:
  2180. HWND_BOTTOM     Places the window at the bottom of the Z order.
  2181. HWND_NOTOPMOST  Places the window above all non-topmost windows
  2182. HWND_TOP        Places the window at the top of the Z order.
  2183. HWND_TOPMOST    Places the window above all non-topmost windows.
  2184. The window maintains its topmost position even when it is deactivated.
  2185. }
  2186.  
  2187. end;
  2188.  
  2189. procedure TForm1.Button1Click(Sender: TObject);
  2190. //Abbruch
  2191. begin
  2192.   GlobalBreak:=true;
  2193. end;
  2194.  
  2195. {$IFDEF TIMELOCK}
  2196. initialization
  2197. if CheckTimer=true then halt;
  2198.  
  2199. finalization
  2200. {$ENDIF}
  2201.  
  2202. end.
  2203.