📄 umain.pas
字号:
{
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 + -