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

📄 umain.pas

📁 这个程序的主要目的是为了提供一个具有通用性的 AVR Bootloader
💻 PAS
📖 第 1 页 / 共 5 页
字号:
{
  Project:  AVR Universal Bootloader Download
  File:     uMain.pas
  Describe: Main interface, events, procedures, functions etc.
  Author:   Shaoziyang
  Date:     2008.4
  Version:  4.0
  Web:      http://shaoziyang.googlepages.com
        or  http://shaoziyang.bloger.com.cn (Chinese)
  Email:    shaoziyang@gmail.com
}

unit uMain;

interface

uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  ImgList,
  Buttons,
  Menus,
  ComCtrls,
  ToolWin,
  Gauges,
  ExtCtrls,
  btOdeum,
  CPort,
  SynEdit,
  SynMemo,
  HexEdit,
  FastIniFile,
  HighResTimer,
  StdCtrls,
  XPMan,
  AppEvnts,
  ShellAPI,
  PC1,
  aes;

const
  WM_MyMsg = WM_USER + $1428;
  ATOMSTR = 'AVR Universal Bootloader Download.';

  MaxHisFileCount = 9;
  MAXLOGLINES = 512;

  XMODEM_NUL = 00;
  XMODEM_SOH = $01;
  XMODEM_STX = $02;
  XMODEM_EOT = $04;
  XMODEM_ACK = $06;
  XMODEM_NAK = $15;
  XMODEM_CAN = $18;
  XMODEM_EOF = $1A;
  XMODEM_RWC = $43; //'C'

  FlashSize: array[0..7] of Integer = (2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144);
  BusyChr: array[0..3] of Char = ('-', '\', '|', '/');

{$I tips.pas}

type
  CBuf = array[0..40960] of Byte;
  PBuf = ^CBuf;

  TfrmMain = class(TForm)
    Beep: TbtBeeper;
    ComPort: TComPort;
    HRTmr: THighResTimer;
    N2: TMenuItem;
    dlgOpen: TOpenDialog;
    dlgSave: TSaveDialog;
    ilMenu: TImageList;
    ilTool: TImageList;
    ilToolHot: TImageList;
    mmoBin: THexEdit;
    mmoHex: TSynMemo;
    mmoLog: TSynMemo;
    mnAbout: TMenuItem;
    mnAutoCode: TMenuItem;
    mnLangChinese: TMenuItem;
    mnComPortSetup: TMenuItem;
    mnContent: TMenuItem;
    mnDownLoad: TMenuItem;
    mnLangEnglish: TMenuItem;
    mnExit: TMenuItem;
    mnFile: TMenuItem;
    mnHelp: TMenuItem;
    mnLanguage: TMenuItem;
    mnLoad: TMenuItem;
    mnMCU: TMenuItem;
    mnMain: TMainMenu;
    mnOperate: TMenuItem;
    mnOption: TMenuItem;
    mnSave: TMenuItem;
    mnSystem: TMenuItem;
    pbMain: TGauge;
    pgctMain: TPageControl;
    pmHisFile: TPopupMenu;
    pmLang: TPopupMenu;
    pmLangChinese: TMenuItem;
    pmLangEnglish: TMenuItem;
    pnlMain: TPanel;
    tmrClock: TTimer;
    tmrSmartMouse: TTimer;
    tsBin: TTabSheet;
    tsHex: TTabSheet;
    tsLog: TTabSheet;
    Panel8: TPanel;
    stat: TStatusBar;
    pmImportHis: TPopupMenu;
    tsVer: TTabSheet;
    mmoVer: TSynMemo;
    Panel9: TPanel;
    Panel10: TPanel;
    Panel11: TPanel;
    Panel12: TPanel;
    XPManifest: TXPManifest;
    tbTool: TToolBar;
    Panel1: TPanel;
    btnLoad: TToolButton;
    btnSave: TToolButton;
    Panel3: TPanel;
    btnDownload: TToolButton;
    btnStop: TToolButton;
    Panel4: TPanel;
    btnOption: TToolButton;
    btnAutoCode: TToolButton;
    Panel7: TPanel;
    Panel6: TPanel;
    btnAbout: TToolButton;
    Panel5: TPanel;
    btnExit: TToolButton;
    tbMenu: TToolBar;
    Panel2: TPanel;
    btnMenuFile: TToolButton;
    btnMenuOperate: TToolButton;
    btnMenuOption: TToolButton;
    btnMenuHelp: TToolButton;
    btnDebug: TToolButton;
    Panel13: TPanel;
    btnLanguage: TSpeedButton;
    btnEncrypt: TToolButton;
    btnDecrypt: TToolButton;
    Panel14: TPanel;
    ApplicationEvents: TApplicationEvents;
    N3: TMenuItem;
    mnWeb: TMenuItem;
    mnGroup: TMenuItem;
    mnEmail: TMenuItem;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormResize(Sender: TObject);
    procedure btnAboutClick(Sender: TObject);
    procedure btnAutoCodeClick(Sender: TObject);
    procedure btnDebugClick(Sender: TObject);
    procedure btnDownloadClick(Sender: TObject);
    procedure btnExitClick(Sender: TObject);
    procedure btnLanguageClick(Sender: TObject);
    procedure btnLoadClick(Sender: TObject);
    procedure btnLoadHisClick(Sender: TObject);
    procedure btnOptionClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
    procedure mmoBinChange(Sender: TObject);
    procedure mnComPortSetupClick(Sender: TObject);
    procedure mnContentClick(Sender: TObject);
    procedure mnMCUClick(Sender: TObject);
    procedure mnSystemClick(Sender: TObject);
    procedure pmLangEnglishClick(Sender: TObject);
    procedure statMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure tbMenuMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure tmrClockTimer(Sender: TObject);
    procedure tmrSmartMouseTimer(Sender: TObject);
    procedure ComPortRxChar(Sender: TObject; Count: Integer);
    procedure dlgOpenShow(Sender: TObject);
    procedure dlgSaveShow(Sender: TObject);
    procedure mmoLogMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure pgctMainChange(Sender: TObject);
    procedure btnEncryptClick(Sender: TObject);
    procedure btnDecryptClick(Sender: TObject);
    procedure ApplicationEventsActivate(Sender: TObject);
    procedure mnWebClick(Sender: TObject);
    procedure mnEmailClick(Sender: TObject);
    procedure mnGroupClick(Sender: TObject);
  private
    { Private declarations }
    procedure HisFileClick(Sender: TObject);
  public
    { Public declarations }
    procedure clrSmart;
    procedure loadcfg;
    procedure savecfg;
    procedure loginfo(Msg: string);
    procedure OpenFile(FileName: string);
    procedure loadlanguage(langname: string);
    procedure delay(dt: Integer);
    procedure ImportHisClick(Sender: TObject);
    procedure UpdateHex;
    function UpdateBin(FileName: string): Boolean;
  end;

type
  DownLoadStatics = record
    sum: Cardinal;
    fail: Cardinal;
  end;

  TSystemConfig = record
    RTS, DTR: Boolean;
    SmartMouse: Boolean;
    Beep: Boolean;
    reload: Boolean;
    keyASC, keyHEX: string;
    CmdRST: string;
    keyMode: Byte;
    Protocol: Byte;
    BootCnt, SendTime: Integer;
    run: Integer;
    SendRST: Boolean;
    AutoSize: Boolean;
    FrameLen: Integer;
    FlashSize: Integer;
    fillunused: Boolean;
    filldata: string;
    Language: string;
    FontName: string;
    FontSize: Integer;
  end;

  TLangMsg = record
    msgError: string;
    msgWarning: string;
    msgOpenComportFail: string;
    msgSendRSTCmd: string;
    msgStartDownload: string;
    msgStopDownload: string;
    msgStartConnect: string;
    msgSendConnectKey: string;
    msgConnectSuccess: string;
    msgConnectFail: string;
    msgLines: string;
    msgChecksum: string;
    msgLength: string;
    msgTooManyRetry: string;
    msgLoadFileFail: string;
    msgUnsupport32BitAddress: string;
    msgLoadFileSuccess: string;
    msgFileLength: string;
    msgFlashSize: string;
    msgBufferOverflow: string;
    msgBufferSize: string;
    msgQueryClearStat: string;
    msgUpdateSuccess: string;
    msgUpdateFail: string;
    msgUpdateAbort: string;
    msgSpeed: string;
    msgTimeElapse: string;
    msgPackag: string;
    msgData: string;
    msgRetry: string;
    msgFmtErr: string;
    msgCrcErr: string;
    msgKey: string;
    msgAlgorithm: string;
    msgSetCryptOption: string;
  end;

function CRCSUM(buf: array of Byte; len: Integer; Mask, Init: Word): Word;
function MaskCrc16(buf: array of Byte; len: Integer; Mask, Init: Word): Word;
function CharToByte(c1, c2: Char): Byte;
function CharToDigit(c: Char): Byte;
function DateToChar(d: Byte): Char;
function EncryptInt(d: Integer): string;
function DecryptInt(ks: string): Integer;
function FormatHexStr(hs: string; var buf: array of Byte): string;
function TokenStr(var lns: string): string;
function FileModify(var sr: TSearchRec): Boolean;

var
  frmMain: TfrmMain;
  StaSum, StaToday: DownLoadStatics;
  cfg: TSystemConfig;
  lang: TLangMsg;
  RxBuf: CBuf;
  RxPtr, RxLen: Integer;
  DownFlag, DownCnt, ACK: Byte;
  EDBuf, DataBuf: array[0..65536 * 16] of Byte;
  DataSize, MaxDataSize: Integer;
  Debug: Boolean = False;
  TS, TB, TE: TDateTime;
  Hour, Min, Sec, MSec: Word;
  mp: TPoint;
  ini: TFastIniFile;
  msx, msy: Integer;
  Idle: Boolean = True;
  ClockCnt: ShortInt;
  HWD: THandle;
  sr: TSearchRec;

implementation

uses
  uOption,
  uAbout,
  uAutoCode;

{$R *.DFM}

//User define functions start

function FileModify(var sr: TSearchRec): Boolean;
var
  sr_new: TSearchRec;
begin
  Result := False;
  if sr.Name = '' then
    Exit;
  FindFirst(sr.Name, faAnyFile, sr_new);
  if (sr_new.Time <> sr.Time) or (sr_new.Size <> sr.Size) then
  begin
    Result := True;
    sr.Time := sr_new.Time;
    sr.Size := sr_new.Size;
  end
  else
    Result := False;
end;

function CharToByte(c1, c2: Char): Byte;
begin
  Result := CharToDigit(c1) * 16 + CharToDigit(c2);
end;

function CharToDigit(c: Char): Byte;
begin
  case c of
    '0'..'9': Result := Ord(c) - 48;
    'A'..'F': Result := Ord(c) - Ord('A') + 10;
    'a'..'f': Result := Ord(c) - Ord('a') + 10;
  else
    Result := 0;
  end;
end;

function DateToChar(d: Byte): Char;
begin
  case d of
    0..9: Result := Chr(Ord('0') + d);
    10..15: Result := Chr(Ord('A') + d - 10);
  else
    Result := '0';
  end;
end;

//checksum of accumulate

function CRCSUM(buf: array of Byte; len: Integer; Mask, Init: Word): Word;
var
  crc: Word;
  i: Integer;
begin
  crc := Init;
  for i := 0 to len - 1 do
    crc := crc + buf[i];
  Result := crc;
end;

//checksum of CRC16

function MaskCrc16(buf: array of Byte; len: Integer; Mask, Init: Word): Word;
var
  crc: Word;
  i, t: Integer;
begin
  crc := Init;
  for i := 0 to len - 1 do
  begin
    t := buf[i] * 256;
    crc := crc xor t;
    for t := 1 to 8 do
    begin
      if ((crc and $8000) = $8000) then
        crc := (crc * 2) xor Mask
      else
        crc := crc * 2;
    end;
  end;
  Result := crc;
end;

//Encrypt integer to str

function EncryptInt(d: Integer): string;
var
  i: Integer;
  cd: array[0..7] of Byte;
begin
  cd[1] := Random(256);
  cd[4] := Random(cd[1]);
  cd[6] := Random(cd[1] + cd[4]);
  cd[2] := (((d div $10000) mod $100) + cd[1]) xor cd[4];
  cd[3] := (((d div $100) mod $100) - cd[2]) xor (cd[1] - cd[4]);
  cd[5] := ((d mod $100) - cd[6]) xor (cd[1] + cd[3]);
  cd[7] := ((d div $1000000) mod $100) + cd[1] + cd[5];
  cd[0] := ((cd[1] xor cd[2]) xor cd[3]) + (cd[4] or cd[5]) + (cd[6] and cd[7]);
  Result := '';
  for i := 0 to 7 do
    Result := Result + IntToHex(cd[i], 2);
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -