unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, AfComPort, ComCtrls, StrUtils, AfDataDispatcher;
type TXmodemPaket = class //entspricht class(TObject)
private
SOH: Byte; //Offset 0 SOH = Ascii 01
BlockNo: Byte; //Offset 1 Block #, start with 1, wrap to 0 after FF
BlockNoXor: Byte; //Offset 2 Ones complement (XOR with 0xFF) of block #
//Data: Array[0..127] of Byte; //Offset 3-130 128 bytes of data
Data: Array of Byte; //Offset 3-130 128 bytes of data
//CRC: Array[0..1] of Byte; //Offset 131 CRC Checksum of bytes (carry ignored)
Checksum: Byte; //Offset 131 8Bit Checksum
end;
type
TForm1 = class(TForm)
AfComPort1: TAfComPort;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Button3: TButton;
ProgressBar1: TProgressBar;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Memo1Change(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
function Checksum8Bit(Data: Array of Byte): Byte;
function Split(const fText: String; const fSep: Char; fTrim: Boolean=false; fQuotes: Boolean=false):TStringList;
var
Form1: TForm1;
XModemPaket: TXmodemPaket;
GlobalBreak: Boolean;
Bootloader: String;
Revision: String;
implementation
{$R *.dfm}
function Split(const fText: String; const fSep: Char; fTrim: Boolean=false; fQuotes: Boolean=false):TStringList;
//String Split Funktion
var vI: Integer;
vBuffer: String;
vOn: Boolean;
begin
Result:=TStringList.Create;
vBuffer:='';
vOn:=true;
for vI:=1 to Length(fText) do
begin
if (fQuotes and(fText[vI]=fSep)and vOn)or(Not(fQuotes) and (fText[vI]=fSep)) then
begin
if fTrim then vBuffer:=Trim(vBuffer);
if vBuffer[1]=fSep then
vBuffer:=Copy(vBuffer,2,Length(vBuffer));
Result.Add(vBuffer);
vBuffer:='';
end;
if fQuotes then
begin
if fText[vI]='"' then
begin
vOn:=Not(vOn);
Continue;
end;
if (fText[vI]<>fSep)or((fText[vI]=fSep)and(vOn=false)) then
vBuffer:=vBuffer+fText[vI];
end else
if fText[vI]<>fSep then
vBuffer:=vBuffer+fText[vI];
end;
if vBuffer<>'' then
begin
if fTrim then vBuffer:=Trim(vBuffer);
Result.Add(vBuffer);
end;
end;
function Checksum8Bit(Data: Array of Byte): Byte;
var
Pos: Integer;
Checksum: Integer;
ChecksumStr: String;
begin
Checksum:=0;
for Pos:=0 to SizeOf(Data)-1 do
begin
Checksum:=Checksum+Data[Pos];
end;
ChecksumStr:=IntToHex(Checksum,2);
Checksum8Bit:=StrToInt('$'+ChecksumStr);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Counter: Integer;
buffer: String;
BufferStringList: TStringlist;
begin
buffer:='';
Bootloader:='';
Revision:='';
//BufferStringList:=TStringList.Create;
for counter:=1 to 9 do
begin
AfComPort1.WriteString('digicom');
sleep(500);
Application.ProcessMessages;
if AfComPort1.InBufUsed>=1 then
buffer:=buffer+AfComPort1.ReadString;
if pos('granted!',buffer)>0 then
break;
if pos('Now start download',buffer)>0 then
break;
end;
if Counter>=9 then
exit;
buffer:='';
for counter:=1 to 9 do
begin
AfComPort1.PurgeRX;
AfComPort1.PurgeTX;
AfComport1.WriteString(#$AF+#$FE);
sleep(500);
Application.ProcessMessages;
if AfComPort1.InBufUsed>=1 then
buffer:=buffer+AfComPort1.ReadString;
if pos('Version',buffer)>0 then
break;
end;
AfComPort1.PurgeRX;
AfComPort1.PurgeTX;
if Counter>=9 then
exit;
sleep(200);
Application.ProcessMessages;
buffer:=buffer+AfComPort1.ReadString;
BufferStringList:=Split(buffer,#13,true,true);
for counter:=0 to BufferStringList.Count-1 do
begin
buffer:=BufferStringList.Strings[Counter];
if pos('Bootloader',buffer)>0 then
Bootloader:=buffer;
if pos('Revision',buffer)>0 then
Revision:=buffer;
end;
Memo1.Text:=Memo1.Text+#13+#10+Bootloader+#13+#10+Revision;
//Memo1.Lines.SaveToFile('log.txt');
end;
procedure TForm1.Button2Click(Sender: TObject);
var
PAD: TMemoryStream;
BlockXMODEM: TMemoryStream;
Counter: Byte;
CounterXOR: Byte;
Buffer: String;
Start: Integer;
//DataArray: Array of Byte;
//ByteLen: Integer;
label
Ende, SendPaket;
begin
GlobalBreak:=false;
XModemPaket:=TXmodemPaket.Create;
XModemPaket.SOH:=1;
Counter:=0;
PAD:=TMemoryStream.Create();
PAD.LoadFromFile('fta.pad');
BlockXMODEM:=TMemoryStream.Create();
Memo1.Text:='';
Button2.Enabled:=false;
ProgressBar1.Max:=PAD.Size;
ProgressBar1.Position:=0;
if PAD.Size>0 then
begin
while PAD.Position<PAD.Size do
begin
if Counter=255 then
Counter:=0
else
Counter:=Counter+1;
CounterXOR:=Counter xor $FF;
//XModem Paket zusammenstellen
XModemPaket.BlockNo:=Counter;
XModemPaket.BlockNoXor:=CounterXOR;
if PAD.Position+128<PAD.Size then
begin
SetLength(XModemPaket.Data,128);
end
else
begin
SetLength(XModemPaket.Data,PAD.Size-PAD.Position);
end;
PAD.ReadBuffer(XModemPaket.Data[0],Length(XModemPaket.Data));
ProgressBar1.Position:=PAD.Position;
XModemPaket.Checksum:=Checksum8Bit(XModemPaket.Data);
//XModem Paket senden
SendPaket:
AfComport1.Core.PurgeTX;
AfComport1.Core.PurgeRX;
AfComport1.WriteData(XModemPaket.SOH,SizeOf(XModemPaket.SOH));
AfComport1.WriteData(XModemPaket.BlockNo,SizeOf(XModemPaket.BlockNo));
AfComport1.WriteData(XModemPaket.BlockNoXor,SizeOf(XModemPaket.BlockNoXor));
AfComport1.WriteData(XModemPaket.Data,SizeOf(XModemPaket.Data));
AfComport1.WriteData(XModemPaket.Checksum,SizeOf(XModemPaket.Checksum));
Buffer:='';
Start:=0;
while AfComPort1.OutBufUsed>0 do
begin
sleep(10);
Application.ProcessMessages;
end;
while GlobalBreak=false do
begin
Application.ProcessMessages;
sleep(25);
if AfComport1.InBufUsed>0 then
Buffer:=Buffer+AfComport1.ReadString;
if Pos(#$06,buffer)>0 then
begin
Form1.Memo1.Text:=Form1.Memo1.Text+'+';
break;
end;
if Pos(#$15,buffer)>0 then
begin
Form1.Memo1.Text:=Form1.Memo1.Text+'-';
break;
end;
if Pos('finish',buffer)>0 then
begin
Form1.Memo1.Lines.Add(buffer);
goto Ende;
end;
if GlobalBreak=true then break;
end;
if GlobalBreak=true then
goto Ende;
{*
if LeftStr(Buffer,1)<>#06 then
begin
if Counter=255 then
Counter:=0
else
Counter:=Counter+1;
CounterXOR:=Counter xor $FF;
//XModem Paket zusammenstellen
XModemPaket.BlockNo:=Counter;
XModemPaket.BlockNoXor:=CounterXOR;
//Form1.Memo1.Lines.Add(IntToHex(XModemPaket.BlockNo,2)+' '+IntToStr(PAD.Position));
Form1.Memo1.Lines.Add('#'+buffer+'#');
goto SendPaket;
end
else
Form1.Memo1.Lines.Add('OK '+IntToStr(PAD.Position));
*}
{*
BlockXMODEM.Write(XModemPaket.SOH,SizeOf(XModemPaket.SOH));
BlockXMODEM.Write(XModemPaket.BlockNo,SizeOf(XModemPaket.BlockNo));
BlockXMODEM.Write(XModemPaket.BlockNoXor,SizeOf(XModemPaket.BlockNoXor));
BlockXMODEM.Write(XModemPaket.Data,SizeOf(XModemPaket.Data));
BlockXMODEM.Write(XModemPaket.Checksum,SizeOf(XModemPaket.Checksum));
BlockXMODEM.SaveToFile('block.bin');
*}
end;
end;
Ende:
Memo1.Lines.SaveToFile('log.txt');
PAD.Free;
BlockXMODEM.Free;
Button2.Enabled:=true;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
GlobalBreak:=true;
end;
procedure TForm1.Memo1Change(Sender: TObject);
//Textanzeige scrollen
begin
SendMessage(Memo1.Handle,WM_VSCROLL,SB_PAGEDOWN,0);
HideCaret(Memo1.Handle);
end;
end.