Add missing ls_recvdata16 to ZMODEM
This commit is contained in:
parent
001d0a054d
commit
ccab973b4a
@ -1066,6 +1066,82 @@ final class Zmodem extends Protocol implements CRCInterface,ZmodemInterface
|
||||
return $crc32 ? $this->ls_zrecvdata32($data,$len,$timeout) : $this->ls_zrecvdata16($data,$len,$timeout);
|
||||
}
|
||||
|
||||
/**
|
||||
* Receive data subframe with CRC16, return frame type or error (may be -- timeout)
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
private function ls_recvdata16(string &$data,int &$len,int $timeout): int
|
||||
{
|
||||
if ($this->DEBUG)
|
||||
Log::debug('+ Start',['m'=>__METHOD__,'d'=>$data]);
|
||||
|
||||
$got = 0; /* Bytes total got */
|
||||
$incrc = self::LSZ_INIT_CRC16; /* Calculated CRC */
|
||||
$crc = 0; /* Received CRC */
|
||||
$frametype = self::LSZ_ERROR; /* Type of frame - ZCRC(G|W|Q|E) */
|
||||
$rcvdata = 1; /* Data is being received NOW (not CRC) */
|
||||
|
||||
while ($rcvdata && (($c = $this->ls_readzdle($timeout)) >= 0)) {
|
||||
if($c < 256) {
|
||||
$data .= chr($c&0xff);
|
||||
|
||||
if (++$got > $this->ls_MaxBlockSize)
|
||||
return self::LSZ_BADCRC;
|
||||
|
||||
$incrc = $this->CRC16USD_UPDATE($c,$incrc);
|
||||
|
||||
} else {
|
||||
switch($c) {
|
||||
case self::LSZ_CRCE:
|
||||
case self::LSZ_CRCG:
|
||||
case self::LSZ_CRCQ:
|
||||
case self::LSZ_CRCW:
|
||||
$rcvdata = 0;
|
||||
$frametype = ($c & 0xff);
|
||||
|
||||
$incrc = $this->CRC16USD_UPDATE($c,$incrc);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return self::LSZ_BADCRC;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* We finish loop by error in ls_readzdle() */
|
||||
if ($rcvdata) {
|
||||
Log::error(sprintf('%s: ? Something strange or timeout [%d]',__METHOD__,$rc));
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
/* Loops ar unrolled */
|
||||
if (($c = $this->ls_readzdle($timeout)) < 0)
|
||||
return $c;
|
||||
|
||||
$crc = $c;
|
||||
if (($c = $this->ls_readzdle($timeout)) < 0)
|
||||
return $c;
|
||||
|
||||
$crc <<= 8;
|
||||
$crc |= $c;
|
||||
|
||||
if ($this->DEBUG)
|
||||
Log::debug(sprintf('CRC%d got %08x - calculated %08x',16,$incrc,$crc),['m'=>__METHOD__]);
|
||||
|
||||
if ($incrc != $crc)
|
||||
return self::LSZ_BADCRC;
|
||||
|
||||
$len = $got;
|
||||
|
||||
if ($this->DEBUG)
|
||||
Log::debug('= End',['m'=>__METHOD__,'frametype'=>$frametype]);
|
||||
|
||||
return $frametype;
|
||||
}
|
||||
|
||||
/**
|
||||
* Receive data subframe with CRC32, return frame type or error (may be -- timeout)
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user