Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement