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

Рубрика: Исходники
Среда, 21 апреля 2010 г.
Просмотров: 168
последняя версия: 3.0.9 build 961 beta
от 07 декабря 2007 г.
function TP2KAPI.SendCommandZ(Cmd:word; Send_Data:Pointer;Send_Size: word; Recv_Data: Pointer; var Recv_Size: word):boolean;
var
  Packet: TTCIPacket;
  Answer: TTCIAnsw;
  i: word;
  RecvBuf: array[0..$1004]of byte;
  RecvSize: dword;
  Time:dword;

begin
  result:=false;
  Packet.Hdr41:=$41;
  Packet.Hdr02:=$02;
  Packet.Res1:=$0000;
  Packet.IFNum:=$0008;
  Packet.FullSize:=Send_Size+8;
  Packet.ID:=wswap(CurrentPacketID and $FFF);
  Packet.Cmd:=wswap(Cmd and $FFF);
  Packet.CmdSize:=wswap(Send_Size);
  Packet.Res2:=0;
  for i:=0 to 1007 do Packet.CmdData[i]:=0;
  move(Send_Data^,Packet.CmdData[0],Send_Size);
  if not WriteDataZ(HDev, @Packet, Send_Size+$12) then exit;
  Time:=GetTickCount;
  repeat
    for i:=0 to 11 do RecvBuf[i]:=0;
    Answer.HdrC1:=$C1;
    Answer.AnsType:=00;
    Answer.PacketNo:=0;
    Answer.IFNum:=8;
    Answer.Size:=8;
    Answer.Res:=0;
    RecvSize:=$0C;
    Sleep(1);
    if not ReadDataZ( HDev, @Answer, @RecvBuf, RecvSize) then exit;
  until (RecvBuf[5]=1) or (RecvBuf[5]=2) or ((GetTickCount-Time)>=40000);
  if (GetTickCount-Time)>=40000 then
    begin
      Log('USB Time-out');
      exit;
    end;
  Answer.HdrC1:=$C1;
  Answer.AnsType:=01;
  Answer.PacketNo:=RecvBuf[5];
  Answer.IFNum:=8;
  Answer.Size:=RecvBuf[6]*256 + RecvBuf[7] + 4 + RecvBuf[5]*2; // Packet1Size+Packets*2+Hdr, todo - Add all packets size
  RecvSize:=$FA4;
  for i:=0 to 1023 do RecvBuf[i]:=0;
  if not ReadDataZ(HDev, @Answer, @RecvBuf, RecvSize) then exit;
  if RecvBuf[4]<> 1 then exit; // status not ok
  if (RecvBuf[8]*256+RecvBuf[9])<>(RecvBuf[$0E]*256+RecvBuf[$0F]+8) then exit; // full packet and data size mistmatch
  if ((RecvBuf[$0A] and $0F)*256+RecvBuf[$0B])<>CurrentPacketID then exit; // PacketID mistmatch
  if ((RecvBuf[$0C] shr 4) <> 6) and ((RecvBuf[$0C] shr 4) <> 8) then exit; // result code is error - may be translated to err text
  Recv_Size:=RecvBuf[$0E]*256+RecvBuf[$0F];
  move(RecvBuf[$12],Recv_Data^,Recv_Size);
  result:=true;
end;
Rambler's Top100