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

📄 umain.pas

📁 单片机
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      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 + -