⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uautocode.pas

📁 这个程序的主要目的是为了提供一个具有通用性的 AVR Bootloader
💻 PAS
📖 第 1 页 / 共 3 页
字号:
{
  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 + -