📄 uautocode.pas
字号:
{
Project: AVR Universal Bootloader Download
File: uAutoCode.pas
Describe: Show autocode dialog, auto make bootcfg.h file
Author: Shaoziyang
Date: 2007.6
Version: 4.0
Web: http://shaoziyang.googlepages.com
or http://shaoziyang.bloger.com.cn (Chinese)
Email: shaoziyang@gmail.com
}
unit uAutoCode;
interface
uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
ExtCtrls,
StdCtrls,
Buttons,
ShellAPI,
CPortCtl,
ComCtrls;
type
TfrmAutoCode = class(TForm)
btnCancel: TBitBtn;
btnHypertrm: TBitBtn;
btnMake: TBitBtn;
btnRecommand: TBitBtn;
btnRecover: TBitBtn;
btnSmallest: TBitBtn;
cbbCportBaudRate: TComComboBox;
imgDragon: TImage;
Timer: TTimer;
tmrErr: TTimer;
dlgSave: TSaveDialog;
Label2: TLabel;
pgct: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
lbFCPU: TLabel;
lbBauRate: TLabel;
lbComPortNo: TLabel;
lbBUFFERSIZE: TLabel;
lbtimeclk: TLabel;
lbTimeOutCnt: TLabel;
lbTimeOutCntC: TLabel;
lbInitDelay: TLabel;
lbLEVELMODE: TLabel;
lbchecksum: TLabel;
lbBootStart: TLabel;
Label3: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
btnReload: TSpeedButton;
GroupBox1: TGroupBox;
lbLEDPORT: TLabel;
lbLEDPIN: TLabel;
cbbPortLED: TComboBox;
cbbPINLED: TComboBox;
GroupBox2: TGroupBox;
lbRS485PORT: TLabel;
lbRS485PIN: TLabel;
cbbPortRS485: TComboBox;
cbbPINRS485: TComboBox;
Panel1: TPanel;
lbLEDEn: TLabel;
Panel2: TPanel;
lbRS485En: TLabel;
GroupBox3: TGroupBox;
lbBOOTPORT: TLabel;
lbBOOTPIN: TLabel;
lbBOOTLEVEL: TLabel;
cbbPortLevel: TComboBox;
cbbPINLevel: TComboBox;
cbbBootLevel: TComboBox;
Panel3: TPanel;
imgLED: TImage;
cbbFCPU: TComboBox;
cbbTimeClk: TComboBox;
cbbBootCnt: TComboBox;
cbbFileCnt: TComboBox;
cbbInitDelay: TComboBox;
cbbBootMode: TComboBox;
cbbBootStart: TComboBox;
cbbCRC: TComboBox;
cbbBufferSize: TComboBox;
cbbComPortNo: TComboBox;
cbbBaudRate: TComboBox;
Panel4: TPanel;
Label1: TLabel;
cbbMCU: TComboBox;
cbbByteWord: TComboBox;
lbAlgorithm: TLabel;
cbbAlgorithm: TComboBox;
lbKEY: TLabel;
edtKeyHEX: TEdit;
Label4: TLabel;
Label8: TLabel;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Label9: TLabel;
chkRS485En: TCheckBox;
chkLED: TCheckBox;
GroupBox4: TGroupBox;
chkChipCheck: TCheckBox;
chkWDG: TCheckBox;
chkDecrypt: TCheckBox;
chkVerbose: TCheckBox;
edtEncryptKey: TMemo;
edtDecryptKey: TMemo;
btnRandomKey: TSpeedButton;
procedure chkLEDClick(Sender: TObject);
procedure edtKeyHEXChange(Sender: TObject);
procedure edtKeyHEXClick(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure lbLEDEnClick(Sender: TObject);
procedure lbRS485EnClick(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure btnRecommandClick(Sender: TObject);
procedure btnHypertrmClick(Sender: TObject);
procedure btnSmallestClick(Sender: TObject);
procedure btnMakeClick(Sender: TObject);
procedure tmrErrTimer(Sender: TObject);
procedure dlgSaveShow(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure cbbByteWordChange(Sender: TObject);
procedure cbbMCUChange(Sender: TObject);
procedure cbbTimeClkChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnRandomKeyClick(Sender: TObject);
private
{ Private declarations }
Idle: Boolean;
procedure setedtErr(edt: TEdit);
procedure setcbbErr(cbb: TComboBox);
public
{ Public declarations }
function getAVRType: Integer;
end;
var
frmAutoCode: TfrmAutoCode;
cbbErr: TComboBox;
edtErr: TEdit;
implementation
uses
uMain;
{$R *.DFM}
procedure TfrmAutoCode.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//释放鼠标事件的对象
ReleaseCapture;
PostMessage(handle, wm_SysCommand, $F012, 0);
end;
procedure TfrmAutoCode.TimerTimer(Sender: TObject);
begin
imgLED.Visible := not imgLED.Visible;
end;
procedure TfrmAutoCode.chkLEDClick(Sender: TObject);
begin
cbbTimeClkChange(Sender);
Timer.Enabled := chkLED.Checked;
imgLED.Visible := chkLED.Checked;
end;
procedure TfrmAutoCode.lbRS485EnClick(Sender: TObject);
begin
chkRS485En.Checked := not chkRS485En.Checked;
end;
procedure TfrmAutoCode.lbLEDEnClick(Sender: TObject);
begin
chkLED.Checked := not chkLED.Checked;
chkLEDClick(Sender);
end;
procedure TfrmAutoCode.edtKeyHEXChange(Sender: TObject);
begin
if Sender is TEdit then
begin
if (Length(TEdit(Sender).Text) mod 3) = 0 then
begin
edtKeyHEXClick(Sender);
PostMessage(TEdit(Sender).handle, WM_KEYDOWN, VK_END, 0);
end;
end;
end;
procedure TfrmAutoCode.edtKeyHEXClick(Sender: TObject);
var
buf: CBuf;
begin
if not (Sender is TEdit) then
Exit;
TEdit(Sender).Text := FormatHexStr(TEdit(Sender).Text, buf);
end;
procedure TfrmAutoCode.btnRecommandClick(Sender: TObject);
begin
chkVerbose.Checked := False;
chkWDG.Checked := True;
chkChipCheck.Checked := True;
edtKeyHEX.Text := '41 56 52 55 42';
cbbTimeClk.Text := '200';
cbbBootCnt.Text := '5';
cbbFileCnt.Text := '20';
cbbBootMode.ItemIndex := 0;
chkLED.Checked := True;
cbbBufferSize.Text := '128';
chkLED.Checked := True;
cbbCRC.ItemIndex := 0;
end;
procedure TfrmAutoCode.btnHypertrmClick(Sender: TObject);
begin
chkVerbose.Checked := True;
chkLED.Checked := True;
edtKeyHEX.Text := '64';
cbbBufferSize.Text := '128';
cbbTimeClk.Text := '500';
cbbBootCnt.Text := '10';
cbbFileCnt.Text := '100';
cbbBootMode.ItemIndex := 0;
cbbCRC.ItemIndex := 0;
end;
procedure TfrmAutoCode.btnSmallestClick(Sender: TObject);
begin
chkRS485En.Checked := False;
chkLED.Checked := False;
cbbInitDelay.Text := '0';
cbbBootMode.ItemIndex := 1;
chkChipCheck.Checked := False;
chkWDG.Checked := False;
chkVerbose.Checked := False;
cbbCRC.ItemIndex := 1;
end;
//
procedure TfrmAutoCode.dlgSaveShow(Sender: TObject);
begin
HWD := FindWindow(nil, PChar(dlgSave.Title));
frmMain.clrSmart;
end;
procedure TfrmAutoCode.btnMakeClick(Sender: TObject);
var
f: TextFile;
buf: CBuf;
i: Integer;
t: Double;
b: Boolean;
msg: string;
s: string;
begin
if Idle = False then
Exit;
try
Idle := False;
edtKeyHEXClick(Sender);
if (cbbMCU.Text = '') or (StrLIComp(PChar(cbbMCU.Text), PChar('at'), 2) <> 0) then
begin
Application.MessageBox(PChar(lang.msgError + ': MCU'), PChar(lang.msgError), MB_OK + MB_ICONSTOP);
setcbbErr(cbbMCU);
Exit;
end;
//check value range
if edtKeyHEX.Text = '' then
begin
Application.MessageBox(PChar(lang.msgError + ': KEY[]'), PChar(lang.msgError), MB_OK + MB_ICONSTOP);
setedtErr(edtKeyHEX);
Exit;
end;
try
btnMake.Tag := StrToInt(cbbFCPU.Text);
except
Application.MessageBox(PChar(lang.msgError + ': F_CPU'), PChar(lang.msgError), MB_OK + MB_ICONSTOP);
setcbbErr(cbbFCPU);
Exit;
end;
try
btnMake.Tag := StrToInt(cbbBufferSize.Text);
except
Application.MessageBox(PChar(lang.msgError + ': BUFFERSIZE'), PChar(lang.msgError), MB_OK + MB_ICONSTOP);
setcbbErr(cbbBufferSize);
Exit;
end;
try
btnMake.Tag := StrToInt(cbbTimeClk.Text);
except
Application.MessageBox(PChar(lang.msgError + ': timeclk'), PChar(lang.msgError), MB_OK + MB_ICONSTOP);
setcbbErr(cbbTimeClk);
Exit;
end;
try
btnMake.Tag := StrToInt(cbbBootCnt.Text);
except
Application.MessageBox(PChar(lang.msgError + ': TimeOutCnt'), PChar(lang.msgError), MB_OK + MB_ICONSTOP);
setcbbErr(cbbBootCnt);
Exit;
end;
try
btnMake.Tag := StrToInt(cbbFileCnt.Text);
except
Application.MessageBox(PChar(lang.msgError + ': TimeOutCntC'), PChar(lang.msgError), MB_OK + MB_ICONSTOP);
setcbbErr(cbbFileCnt);
Exit;
end;
try
btnMake.Tag := StrToInt(cbbInitDelay.Text);
except
Application.MessageBox(PChar(lang.msgError + ': InitDelay'), PChar(lang.msgError), MB_OK + MB_ICONSTOP);
setcbbErr(cbbInitDelay);
Exit;
end;
try
btnMake.Tag := StrToInt(cbbBootStart.Text);
except
Application.MessageBox(PChar(lang.msgError + ': BootStart'), PChar(lang.msgError), MB_OK + MB_ICONSTOP);
setcbbErr(cbbBootStart);
Exit;
end;
//Cala baudrate error
t := StrToInt(cbbFCPU.Text) / (StrToInt(cbbBaudRate.Text) * 16);
i := Round(t);
if (100 * abs(t - i) / t) > 2 then
begin
Application.MessageBox(PChar(lang.msgError + ': BaudRate error = [' + FloatToStrF(100 * abs(t - i) / t, ffFixed, 1, 1) + '%] > 2% '), PChar(lang.msgError), MB_OK + MB_ICONSTOP);
setcbbErr(cbbBaudRate);
Exit;
end;
//Write to file
dlgSave.Title := frmMain.mnSave.Caption + ' ';
if dlgSave.Execute then
begin
try
if CompareText(cfg.language, 'CHINESE') = 0 then
b := True
else
b := False;
AssignFile(f, dlgSave.FileName);
Rewrite(f);
Writeln(f, '/*');
Writeln(f, '');
Writeln(f, ' e Y8b Y8b YV4.08P888 88e');
Writeln(f, ' d8b Y8b Y8b Y888P 888 888D');
Writeln(f, ' d888b Y8b Y8b Y8P 888 88"');
Writeln(f, ' d8WuHan888b Y8b Y 888 b,');
Writeln(f, ' d8888888b Y8b Y8P 888 88b,');
Writeln(f, ' 8888 8888 ,e, 888');
Writeln(f, ' 8888 888820088e " Y8b Y888P ,e e, 888,8, dP"Y ,"Y88b888');
Writeln(f, ' 8888 8888888 88b888 Y8b Y8P d88 88b888 " C88b "8" 888888');
Writeln(f, ' 8888 8888888 888888 Y8b " 888 ,888 Y88D,ee 888888');
Writeln(f, ' ''Y88 88P''888 888888 Y8P "YeeP"888 d,dP "88 888888');
Writeln(f, ' 888 88b, d8 888 888');
Writeln(f, ' 888 88P'' e88 88e e88 88e d88 888 e88 88e ,"Y88b e88 888 ,e e, 888,8,');
Writeln(f, ' 888 8K d888 888bd888 8Shaoziyang88d888 888b"8" 888d888 888d88 88b888 "');
Writeln(f, ' 888 88b,Y888 888PY888 888P 888 888Y888 888P,ee 888Y888 888888 ,888');
Writeln(f, ' 888 88P'' "88 88" "88 88" 888 888 "88 88" "88 888 "88 888 "YeeP"888');
Writeln(f, '');
Writeln(f, '');
if b then
Writeln(f, ' Project: AVR 通用 BootLoader')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -