Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, AfComPort, ComCtrls, StrUtils, AfDataDispatcher;
  8.  
  9. type TXmodemPaket = class  //entspricht class(TObject)
  10.   private
  11.     SOH:        Byte;                   //Offset 0      SOH = Ascii 01
  12.     BlockNo:    Byte;                   //Offset 1      Block #, start with 1, wrap to 0 after FF
  13.     BlockNoXor: Byte;                   //Offset 2      Ones complement (XOR with 0xFF) of block #
  14.     //Data:       Array[0..127] of Byte;  //Offset 3-130  128 bytes of data
  15.     Data:       Array of Byte;  //Offset 3-130  128 bytes of data
  16.     //CRC:        Array[0..1] of Byte;    //Offset 131    CRC Checksum of bytes  (carry ignored)
  17.     Checksum:   Byte;                   //Offset 131    8Bit Checksum
  18.   end;
  19.  
  20. type
  21.   TForm1 = class(TForm)
  22.     AfComPort1: TAfComPort;
  23.     Button1: TButton;
  24.     Button2: TButton;
  25.     Memo1: TMemo;
  26.     Button3: TButton;
  27.     ProgressBar1: TProgressBar;
  28.     procedure Button1Click(Sender: TObject);
  29.     procedure Button2Click(Sender: TObject);
  30.     procedure Button3Click(Sender: TObject);
  31.     procedure Memo1Change(Sender: TObject);
  32.   private
  33.     { Private-Deklarationen }
  34.   public
  35.     { Public-Deklarationen }
  36.   end;
  37.  
  38.   function Checksum8Bit(Data: Array of Byte): Byte;
  39.   function Split(const fText: String; const fSep: Char; fTrim: Boolean=false; fQuotes: Boolean=false):TStringList;
  40.  
  41. var
  42.   Form1: TForm1;
  43.   XModemPaket: TXmodemPaket;
  44.   GlobalBreak: Boolean;
  45.   Bootloader: String;
  46.   Revision: String;
  47.  
  48.  
  49. implementation
  50.  
  51. {$R *.dfm}
  52.  
  53. function Split(const fText: String; const fSep: Char; fTrim: Boolean=false; fQuotes: Boolean=false):TStringList;
  54. //String Split Funktion
  55. var vI: Integer;
  56.     vBuffer: String;
  57.     vOn: Boolean;
  58. begin
  59.   Result:=TStringList.Create;
  60.   vBuffer:='';
  61.   vOn:=true;
  62.   for vI:=1 to Length(fText) do
  63.   begin
  64.     if (fQuotes and(fText[vI]=fSep)and vOn)or(Not(fQuotes) and (fText[vI]=fSep)) then
  65.     begin
  66.       if fTrim then vBuffer:=Trim(vBuffer);
  67.       if vBuffer[1]=fSep then
  68.         vBuffer:=Copy(vBuffer,2,Length(vBuffer));
  69.       Result.Add(vBuffer);
  70.       vBuffer:='';
  71.     end;
  72.     if fQuotes then
  73.     begin
  74.       if fText[vI]='"' then
  75.       begin
  76.         vOn:=Not(vOn);
  77.         Continue;
  78.       end;
  79.       if (fText[vI]<>fSep)or((fText[vI]=fSep)and(vOn=false)) then
  80.         vBuffer:=vBuffer+fText[vI];
  81.     end else
  82.       if fText[vI]<>fSep then
  83.         vBuffer:=vBuffer+fText[vI];
  84.   end;
  85.   if vBuffer<>'' then
  86.   begin
  87.     if fTrim then vBuffer:=Trim(vBuffer);
  88.     Result.Add(vBuffer);
  89.   end;
  90. end;
  91.  
  92. function Checksum8Bit(Data: Array of Byte): Byte;
  93. var
  94.   Pos: Integer;
  95.   Checksum: Integer;
  96.   ChecksumStr: String;
  97.  
  98. begin
  99.   Checksum:=0;
  100.   for Pos:=0 to SizeOf(Data)-1 do
  101.     begin
  102.       Checksum:=Checksum+Data[Pos];
  103.     end;
  104.   ChecksumStr:=IntToHex(Checksum,2);
  105.   Checksum8Bit:=StrToInt('$'+ChecksumStr);
  106. end;
  107.  
  108. procedure TForm1.Button1Click(Sender: TObject);
  109. var
  110.   Counter: Integer;
  111.   buffer: String;
  112.   BufferStringList: TStringlist;
  113.  
  114. begin
  115.   buffer:='';
  116.   Bootloader:='';
  117.   Revision:='';
  118.   //BufferStringList:=TStringList.Create;
  119.  
  120.   for counter:=1 to 9 do
  121.   begin
  122.     AfComPort1.WriteString('digicom');
  123.     sleep(500);
  124.     Application.ProcessMessages;
  125.     if AfComPort1.InBufUsed>=1 then
  126.       buffer:=buffer+AfComPort1.ReadString;
  127.     if pos('granted!',buffer)>0 then
  128.       break;
  129.     if pos('Now start download',buffer)>0 then
  130.       break;
  131.   end;
  132.   if Counter>=9 then
  133.     exit;
  134.  
  135.   buffer:='';
  136.   for counter:=1 to 9 do
  137.     begin
  138.       AfComPort1.PurgeRX;
  139.       AfComPort1.PurgeTX;
  140.       AfComport1.WriteString(#$AF+#$FE);
  141.       sleep(500);
  142.       Application.ProcessMessages;
  143.       if AfComPort1.InBufUsed>=1 then
  144.         buffer:=buffer+AfComPort1.ReadString;
  145.       if pos('Version',buffer)>0 then
  146.         break;
  147.     end;
  148.   AfComPort1.PurgeRX;
  149.   AfComPort1.PurgeTX;
  150.   if Counter>=9 then
  151.     exit;
  152.  
  153.   sleep(200);
  154.   Application.ProcessMessages;
  155.   buffer:=buffer+AfComPort1.ReadString;
  156.  
  157.   BufferStringList:=Split(buffer,#13,true,true);
  158.   for counter:=0 to BufferStringList.Count-1 do
  159.     begin
  160.       buffer:=BufferStringList.Strings[Counter];
  161.       if pos('Bootloader',buffer)>0 then
  162.         Bootloader:=buffer;
  163.       if pos('Revision',buffer)>0 then
  164.         Revision:=buffer;
  165.     end;
  166.  
  167.   Memo1.Text:=Memo1.Text+#13+#10+Bootloader+#13+#10+Revision;
  168.   //Memo1.Lines.SaveToFile('log.txt');
  169. end;
  170.  
  171. procedure TForm1.Button2Click(Sender: TObject);
  172. var
  173.   PAD: TMemoryStream;
  174.   BlockXMODEM: TMemoryStream;
  175.   Counter: Byte;
  176.   CounterXOR: Byte;
  177.   Buffer: String;
  178.   Start: Integer;
  179.   //DataArray: Array of Byte;
  180.   //ByteLen: Integer;
  181.  
  182. label
  183.   Ende, SendPaket;
  184.  
  185. begin
  186.   GlobalBreak:=false;
  187.   XModemPaket:=TXmodemPaket.Create;
  188.   XModemPaket.SOH:=1;
  189.   Counter:=0;
  190.   PAD:=TMemoryStream.Create();
  191.   PAD.LoadFromFile('fta.pad');
  192.  
  193.   BlockXMODEM:=TMemoryStream.Create();
  194.  
  195.   Memo1.Text:='';
  196.   Button2.Enabled:=false;
  197.   ProgressBar1.Max:=PAD.Size;
  198.   ProgressBar1.Position:=0;
  199.   if PAD.Size>0 then
  200.     begin
  201.       while PAD.Position<PAD.Size do
  202.         begin
  203.           if Counter=255 then
  204.             Counter:=0
  205.           else
  206.             Counter:=Counter+1;
  207.           CounterXOR:=Counter xor $FF;
  208.  
  209.           //XModem Paket zusammenstellen
  210.           XModemPaket.BlockNo:=Counter;
  211.           XModemPaket.BlockNoXor:=CounterXOR;
  212.  
  213.           if PAD.Position+128<PAD.Size then
  214.             begin
  215.               SetLength(XModemPaket.Data,128);
  216.             end
  217.           else
  218.             begin
  219.               SetLength(XModemPaket.Data,PAD.Size-PAD.Position);
  220.             end;
  221.           PAD.ReadBuffer(XModemPaket.Data[0],Length(XModemPaket.Data));
  222.           ProgressBar1.Position:=PAD.Position;
  223.           XModemPaket.Checksum:=Checksum8Bit(XModemPaket.Data);
  224.  
  225. //XModem Paket senden
  226. SendPaket:
  227.           AfComport1.Core.PurgeTX;
  228.           AfComport1.Core.PurgeRX;
  229.           AfComport1.WriteData(XModemPaket.SOH,SizeOf(XModemPaket.SOH));
  230.           AfComport1.WriteData(XModemPaket.BlockNo,SizeOf(XModemPaket.BlockNo));
  231.           AfComport1.WriteData(XModemPaket.BlockNoXor,SizeOf(XModemPaket.BlockNoXor));
  232.           AfComport1.WriteData(XModemPaket.Data,SizeOf(XModemPaket.Data));
  233.           AfComport1.WriteData(XModemPaket.Checksum,SizeOf(XModemPaket.Checksum));
  234.  
  235.           Buffer:='';
  236.           Start:=0;
  237.  
  238.           while AfComPort1.OutBufUsed>0 do
  239.             begin
  240.               sleep(10);
  241.               Application.ProcessMessages;
  242.             end;
  243.  
  244.           while GlobalBreak=false do
  245.             begin
  246.               Application.ProcessMessages;
  247.               sleep(25);
  248.               if AfComport1.InBufUsed>0 then
  249.                 Buffer:=Buffer+AfComport1.ReadString;
  250.  
  251.               if Pos(#$06,buffer)>0 then
  252.                 begin
  253.                   Form1.Memo1.Text:=Form1.Memo1.Text+'+';
  254.                   break;
  255.                 end;
  256.               if Pos(#$15,buffer)>0 then
  257.                 begin
  258.                   Form1.Memo1.Text:=Form1.Memo1.Text+'-';
  259.                   break;
  260.                 end;
  261.  
  262.               if Pos('finish',buffer)>0 then
  263.                 begin
  264.                   Form1.Memo1.Lines.Add(buffer);
  265.                   goto Ende;
  266.                 end;
  267.  
  268.               if GlobalBreak=true then break;
  269.             end;
  270.  
  271.           if GlobalBreak=true then
  272.             goto Ende;
  273.  
  274.           {*
  275.           if LeftStr(Buffer,1)<>#06 then
  276.             begin
  277.               if Counter=255 then
  278.                 Counter:=0
  279.               else
  280.                 Counter:=Counter+1;
  281.               CounterXOR:=Counter xor $FF;
  282.               //XModem Paket zusammenstellen
  283.               XModemPaket.BlockNo:=Counter;
  284.               XModemPaket.BlockNoXor:=CounterXOR;
  285.               //Form1.Memo1.Lines.Add(IntToHex(XModemPaket.BlockNo,2)+' '+IntToStr(PAD.Position));
  286.               Form1.Memo1.Lines.Add('#'+buffer+'#');
  287.               goto SendPaket;
  288.             end
  289.           else
  290.             Form1.Memo1.Lines.Add('OK '+IntToStr(PAD.Position));
  291.           *}
  292.  
  293.           {*
  294.           BlockXMODEM.Write(XModemPaket.SOH,SizeOf(XModemPaket.SOH));
  295.           BlockXMODEM.Write(XModemPaket.BlockNo,SizeOf(XModemPaket.BlockNo));
  296.           BlockXMODEM.Write(XModemPaket.BlockNoXor,SizeOf(XModemPaket.BlockNoXor));
  297.           BlockXMODEM.Write(XModemPaket.Data,SizeOf(XModemPaket.Data));
  298.           BlockXMODEM.Write(XModemPaket.Checksum,SizeOf(XModemPaket.Checksum));
  299.           BlockXMODEM.SaveToFile('block.bin');
  300.           *}
  301.         end;
  302.     end;
  303.  
  304. Ende:
  305.   Memo1.Lines.SaveToFile('log.txt');
  306.   PAD.Free;
  307.   BlockXMODEM.Free;
  308.   Button2.Enabled:=true;
  309. end;
  310.  
  311. procedure TForm1.Button3Click(Sender: TObject);
  312. begin
  313. GlobalBreak:=true;
  314. end;
  315.  
  316. procedure TForm1.Memo1Change(Sender: TObject);
  317. //Textanzeige scrollen
  318. begin
  319.   SendMessage(Memo1.Handle,WM_VSCROLL,SB_PAGEDOWN,0);
  320.   HideCaret(Memo1.Handle);
  321. end;
  322.  
  323. end.
  324.