Модуль "P2KApi" (часть 65) - TP2KAPI.MakeDumpToFile

Рубрика: Исходники
Среда, 21 апреля 2010 г.
Просмотров: 43
последняя версия: 3.0.9 build 961 beta
от 07 декабря 2007 г.
function TP2KAPI.MakeDumpToFile(AFileName: TFileName;  ADumpType: TFlashDumpType; StartAddr, EndAddr: DWord; AfrmProgress: TfrmProgress): Boolean;
var Cmd_temp: array[0..19] of char;
    HexAddr:string[8];
    HexSize:string[4];
    ProgressPercent:Integer;
    Cmd_Ans:array[0..266] of char;
    //Cmd_Ans:array[0..522] of char;
    BufPos, Count:Integer;
    Addr, xSize, End1:DWord;
    xx: dword;
    Buffer: pbytearray;
    mStream: TStream;
    pFilesData: Pointer;
    i: integer;

begin
{
DUMP, XXXXXXXX
READ XXXXXXXX,YYYY
x - адрес
Y - размер
}
 i:= 0;
 Result:= TelStatus;
 result:= true;
 if not TelStatus then exit;
 Addr:=StartAddr;
 End1:=EndAddr-StartAddr;
 Count:=0;
 BufPos:=0;
 AfrmProgress.AdvProgressBar1.MinValue:= 0;
 AfrmProgress.AdvProgressBar1.Value:= 0;
 AfrmProgress.AdvProgressBar1.MaxValue:= 100;
 mStream:=  TFileStream.Create(AFileName, fmCreate);
 pFilesData:= AllocMem((EndAddr-StartAddr)+1);
 //xSize:= $100;
 while Addr<EndAddr do begin
  ProgressPercent:=Round((Addr-StartAddr)/(End1)*100);
  HexAddr:=IntToHex(Addr,8);
  xx:= 1024;
  Cmd_temp[0]:=#02;
  Cmd_temp[5]:=#$1E;
  Cmd_temp[6]:=HexAddr[1];  Cmd_temp[7]:=HexAddr[2];  Cmd_temp[8]:=HexAddr[3];  Cmd_temp[9]:=HexAddr[4];
  Cmd_temp[10]:=HexAddr[5];  Cmd_temp[11]:=HexAddr[6];  Cmd_temp[12]:=HexAddr[7];  Cmd_temp[13]:=HexAddr[8];
  case ADumpType of
    fdDUMP : begin
               xSize:= $100;
              Cmd_temp[1]:='D'; Cmd_temp[2]:='U'; Cmd_temp[3]:='M'; Cmd_temp[4]:='P';
              Cmd_temp[14]:=#03;
              USB_WriteDataEx(@Cmd_temp, 15,2,xFlashTimeOut);
             end;
    fdREAD : begin
              //check size to read
              xSize:= $100;
              //xSize:= $200;
              if (EndAddr-Addr) < xSize then xSize:= (EndAddr-Addr)+1; 
              HexSize:=IntToHex(xSize, 4);
              Cmd_temp[1]:='R'; Cmd_temp[2]:='E'; Cmd_temp[3]:='A'; Cmd_temp[4]:='D'; Cmd_temp[14]:= ',';
              Cmd_temp[15]:= HexSize[1]; Cmd_temp[16]:= HexSize[2]; Cmd_temp[17]:= HexSize[3]; Cmd_temp[18]:= HexSize[4];
              Cmd_temp[19]:= #03;
              USB_WriteDataEx(@Cmd_temp, 20,2,xFlashTimeOut);
             end;
  end;
  USB_ReadDataEx(@Cmd_ans, xx, 2, xFlashTimeOut);
  case ADumpType of
    fdDUMP : begin
               move(cmd_ans[0], pFilesData^, xSize);
             end;
    fdREAD : begin
                move(cmd_ans[8], pFilesData^, xSize);
             end;
  end;
  mStream.Write(pFilesData^, xSize);
  i:= i + xSize;
  if xSize mod 8 = 0
    then begin
           AfrmProgress.AdvProgressBar1.Value:= ProgressPercent;
           Application.ProcessMessages;
         end;
  Inc(Addr,xSize);
 end;
 mStream.Free;
 FreeMem(pFilesData);
 pFilesData:= nil;
end;
Rambler's Top100