📄 umain.pas
字号:
begin
case dlgSave.FilterIndex of
1: //AUB
begin
dlgSave.FileName := ChangeFileExt(dlgSave.FileName, '.aub');
aub := TFastIniFile.Create(dlgSave.FileName);
try
aub.WriteString('target', 'id', 'aub');
aub.WriteInteger('cfg', 'protocol', cfg.Protocol);
aub.WriteInteger('cfg', 'FrameLen', cfg.FrameLen);
aub.WriteInteger('cfg', 'Timeout', cfg.SendTime);
aub.WriteInteger('cfg', 'BootCnt', cfg.BootCnt);
aub.WriteInteger('cfg', 'FlashSize', cfg.FlashSize);
aub.WriteInteger('cfg', 'KeyMode', cfg.keyMode);
aub.WriteString('cfg', 'KeyASC', cfg.keyASC);
aub.WriteString('cfg', 'KeyHEX', cfg.keyHEX);
aub.WriteString('cfg', 'FillData', cfg.filldata);
aub.WriteBoolean('cfg', 'Fill', cfg.fillunused);
aub.WriteBoolean('cfg', 'AutoSize', cfg.AutoSize);
aub.WriteBoolean('cfg', 'SendRST', cfg.SendRST);
aub.WriteString('cfg', 'CmdRST', cfg.CmdRST);
aub.WriteBoolean('cfg', 'RTS', cfg.RTS);
aub.WriteBoolean('cfg', 'DTR', cfg.DTR);
aub.WriteString('cfg', 'BaudRate', BaudRateToStr(ComPort.BaudRate));
aub.WriteString('cfg', 'DataBits', DataBitsToStr(ComPort.DataBits));
aub.WriteString('cfg', 'StopBits', StopBitsToStr(ComPort.StopBits));
aub.WriteString('cfg', 'Parity', ParityToStr(ComPort.Parity.Bits));
aub.WriteString('cfg', 'FlowControl', FlowControlToStr(ComPort.FlowControl.FlowControl));
mmoBin.SaveToBuffer(DataBuf, mmoBin.DataSize);
s := '';
for i := 0 to mmoBin.DataSize - 1 do
s := s + IntToHex(DataBuf[i], 2);
aub.WriteString('buf', 'data', s);
finally
aub.Free;
end;
end;
2: //HEX
begin
dlgSave.FileName := ChangeFileExt(dlgSave.FileName, '.hex');
mmoHex.Lines.SaveToFile(dlgSave.FileName);
end;
3: //BIN
begin
dlgSave.FileName := ChangeFileExt(dlgSave.FileName, '.bin');
mmoBin.SaveToFile(dlgSave.FileName);
end;
else
//other
mmoBin.SaveToFile(dlgSave.FileName);
end;
mmoBin.Modified := False;
mmoHex.Modified := False;
end;
finally
HWD := frmMain.Handle;
Idle := True;
end;
end;
end;
procedure TfrmMain.dlgSaveShow(Sender: TObject);
begin
HWD := FindWindow(nil, PChar(dlgSave.Title));
clrSmart;
end;
//Download buffer's data to mcu
procedure TfrmMain.btnDownloadClick(Sender: TObject);
var
buf: CBuf;
crc, i, len, cnt: Word;
PackNo: Byte;
s: string;
RtCnt, RtNo: Integer;
begin
//avoid reiteration event
if Idle then
begin
Idle := False;
try
//Disable all buttons and menus except Stop button
for i := 0 to tbMenu.ButtonCount - 1 do
tbMenu.Buttons[i].Enabled := False;
for i := 0 to tbTool.ButtonCount - 1 do
tbTool.Buttons[i].Enabled := False;
btnStop.Enabled := True;
pgctMain.Enabled := False;
pgctMain.ActivePageIndex := 2;
Application.ProcessMessages;
try
//open comport
ComPort.Open;
ComPort.SetDTR(cfg.DTR);
ComPort.SetRTS(cfg.RTS);
except
//Alarm
Application.ProcessMessages;
if cfg.Beep then
for i := 1 to 20 do
Beep.BeepFor(i * 150, 15 + i);
stat.Panels[0].Text := lang.msgOpenComportFail;
loginfo('X ' + lang.msgOpenComportFail);
Exit;
end;
loginfo('');
loginfo('> ' + lang.msgStartDownload);
HRTmr.Calibrate(100);
pbMain.Progress := 0;
pbMain.Visible := True;
//send reset command
if cfg.SendRST then
begin
DownFlag := 101;
FormatHexStr(cfg.CmdRST, buf);
len := (Length(cfg.CmdRST) + 2) div 3;
ComPort.Write(buf, len);
loginfo('$ ' + lang.msgSendRSTCmd + ': [' + cfg.CmdRST + ']');
delay(1000);
end;
//start connect
loginfo('> ' + lang.msgStartConnect);
stat.Panels[0].Text := (lang.msgStartConnect);
DownFlag := 1;
DownCnt := 0;
cnt := 0;
while (DownFlag = 1) do
begin
if (cnt >= cfg.BootCnt) then
begin
if cfg.Beep then
for i := 1 to 20 do
Beep.BeepFor(i * 150, 15 + i);
stat.Panels[0].Text := lang.msgConnectFail;
loginfo('X ' + lang.msgConnectFail);
Exit;
end;
cnt := cnt + 1;
if cfg.keyMode = 0 then
begin
ComPort.WriteStr(cfg.keyASC);
loginfo('$ <' + IntToStr(cnt) + '> ' + lang.msgSendConnectKey + ': ' + cfg.keyASC);
end
else
begin
FormatHexStr(cfg.keyHEX, buf);
len := (Length(cfg.keyHEX) + 2) div 3;
ComPort.Write(buf, len);
loginfo('$ <' + IntToStr(cnt) + '> ' + lang.msgSendConnectKey + ': ' + cfg.keyHEX);
end;
for i := 1 to cfg.SendTime do
begin
delay(1);
//press stop button
if not btnStop.Enabled then
begin
loginfo('X ' + lang.msgUpdateAbort);
loginfo('X ' + lang.msgUpdateFail);
Exit;
end;
end;
end;
loginfo('V ' + lang.msgConnectSuccess);
StaToday.sum := StaToday.sum + 1;
StaSum.sum := StaSum.sum + 1;
mmoBin.SaveToBuffer(DataBuf, mmoBin.DataSize);
TB := Now;
RtCnt := 0;
RtNo := 0;
PackNo := 1;
cnt := 0;
DownFlag := 3;
repeat
ACK := XMODEM_NUL;
//Packag No
buf[0] := XMODEM_SOH;
buf[1] := PackNo;
buf[2] := 255 xor PackNo;
//Data
for i := 0 to 127 do
buf[3 + i] := DataBuf[cnt * cfg.FrameLen + i];
//Checksum
case cfg.Protocol of
0: crc := MaskCrc16(PBuf(@buf[3])^, cfg.FrameLen, $1021, 0);
1: crc := CRCSUM(PBuf(@buf[3])^, cfg.FrameLen, $1021, 0);
else
crc := 0;
end;
buf[cfg.FrameLen + 3] := crc div 256;
buf[cfg.FrameLen + 4] := crc mod 256;
ComPort.Write(buf, cfg.FrameLen + 5);
s := Format(lang.msgPackag + ' [%u/%u], ' + lang.msgData + ' [%.1fk/%.1fk], ' + lang.msgRetry + ' [%u/%u]', [cnt + 1, mmoBin.DataSize div cfg.FrameLen, (cnt + 1) * cfg.FrameLen / 1024, mmoBin.DataSize / 1024, RtCnt, RtNo]);
stat.Panels[0].Text := ' > ' + s;
pbMain.Progress := (cnt * 100) div (mmoBin.DataSize div cfg.FrameLen);
PackNo := PackNo + 1;
//wait respond
for i := 1 to cfg.SendTime do
begin
delay(1);
//press stop button
if not btnStop.Enabled then
begin
StaSum.fail := StaSum.fail + 1;
StaToday.fail := StaToday.fail + 1;
loginfo('X ' + lang.msgUpdateAbort);
loginfo('X ' + lang.msgUpdateFail);
Exit;
end;
case ACK of
XMODEM_NAK: //request resend
begin
RtCnt := RtCnt + 1;
RtNo := RtNo + 1;
Break;
end;
XMODEM_ACK: //send success, next
begin
RtCnt := 0;
cnt := cnt + 1;
Break;
end;
end;
end;
//timeout
if ACK = XMODEM_NUL then
begin
RtCnt := RtCnt + 1;
RtNo := RtNo + 1;
end;
if (RtCnt > 3) or (RtNo > 10) then
begin
if cfg.Beep then
for i := 1 to 20 do
Beep.BeepFor(i * 150, 15 + i);
loginfo('X ' + lang.msgTooManyRetry);
loginfo('X ' + lang.msgUpdateFail);
stat.Panels[0].Text := lang.msgTooManyRetry;
StaSum.fail := StaSum.fail + 1;
StaToday.fail := StaToday.fail + 1;
Exit;
end;
//Send all data?
if cnt >= (mmoBin.DataSize div cfg.FrameLen) then
begin
//send finish
TE := Now;
buf[0] := XMODEM_EOT;
ComPort.Write(buf, 1);
DecodeTime(TE - TB, Hour, Min, Sec, MSec);
len := Hour * 3600 + Min * 60 + Sec;
loginfo('> ' + s);
s := Format(': [%u.%us]', [len, MSec div 100]);
loginfo('V ' + lang.msgUpdateSuccess + ': ' + lang.msgTimeElapse + s + ', ' + lang.msgSpeed + Format(': %.1fk/s.', [mmoBin.DataSize / (1024 * (len + (MSec div 100) / 10))]));
pbMain.Progress := 0;
stat.Panels[0].Text := ' <> ' + lang.msgUpdateSuccess + s;
if cfg.Beep then
Beep.PlayPresetSound(psWelcome);
Exit;
end;
until (False);
finally
//Enable all buttons and menus except Stop button
for i := 0 to tbMenu.ButtonCount - 1 do
tbMenu.Buttons[i].Enabled := True;
for i := 0 to tbTool.ButtonCount - 1 do
tbTool.Buttons[i].Enabled := True;
btnStop.Enabled := False;
pgctMain.Enabled := True;
pbMain.Visible := False;
ComPort.Close;
Idle := True;
end;
end;
end;
//Stop download
procedure TfrmMain.btnStopClick(Sender: TObject);
begin
if btnStop.Enabled then
begin
btnStop.Enabled := False;
end;
end;
procedure TfrmMain.btnOptionClick(Sender: TObject);
begin
//avoid reiteration event
if Idle then
begin
Idle := False;
try
HWD := frmOption.Handle;
clrSmart;
frmOption.ShowModal;
HWD := frmMain.Handle;
finally
Idle := True;
end;
end;
end;
procedure TfrmMain.btnAutoCodeClick(Sender: TObject);
begin
//avoid reiteration event
if Idle then
begin
Idle := False;
try
HWD := frmAutoCode.Handle;
clrSmart;
frmAutoCode.ShowModal;
HWD := frmMain.Handle;
finally
Idle := True;
end;
end;
end;
procedure TfrmMain.btnLanguageClick(Sender: TObject);
begin
//avoid reiteration event
if Idle then
begin
Idle := False;
try
GetCursorPos(mp);
pmLang.Popup(mp.X, mp.Y);
finally
Idle := True;
end;
end;
end;
procedure TfrmMain.btnAboutClick(Sender: TObject);
begin
//avoid reiteration event
if Idle then
begin
Idle := False;
try
HWD := frmAbout.Handle;
clrSmart;
frmAbout.ShowModal;
HWD := frmMain.Handle;
finally
Idle := True;
end;
end;
end;
//Quit software
procedure TfrmMain.btnExitClick(Sender: TObject);
begin
//avoid reiteration event
if Idle then
begin
Idle := False;
try
Close;
finally
Idle := True;
end;
end;
end;
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
Ord('C'):
if Shift = [ssAlt] then
mnComPortSetupClick(Sender);
Ord('M'):
if Shift = [ssAlt] then
mnMCUClick(Sender);
Ord('X'):
if Shift = [ssAlt] then
btnExitClick(Sender);
Ord('O'):
if Shift = [ssCtrl] then
btnLoadClick(Sender);
Ord('S'):
begin
if Shift = [ssCtrl] then
btnSaveClick(Sender);
if Shift = [ssAlt] then
mnSystemClick(Sender);
end;
VK_F1:
if Shift = [] then
mnContentClick(Sender);
VK_F9:
if Shift = [] then
btnDownloadClick(Sender);
VK_F11:
begin
//Autocode
if Shift = [] then
btnAutoCodeClick(Sender);
//toggle debug mode
if Shift = [ssAlt] then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -