/**
* @param int $type The type of status to request. May be any of the Printer::STATUS_* constants
* @return stdClass Class containing requested status, or null if either no status was received, or your print connector is unable to read from the printer.
*/
function getPrinterStatus($type = self::STATUS_PRINTER)
{
self::validateIntegerMulti($type, array(array(1, 4), array(6, 8)), __FUNCTION__);
// Determine which flags we are looking for
$statusFlags = array(self::STATUS_PRINTER => array(4 => "pulseHigh", 8 => "offline", 32 => "waitingForOnlineRecovery", 64 => "feedButtonPressed"), self::STATUS_OFFLINE_CAUSE => array(4 => "coverOpen", 8 => "paperManualFeed", 32 => "paperEnd", 64 => "errorOccurred"), self::STATUS_ERROR_CAUSE => array(4 => "recoverableError", 8 => "autocutterError", 32 => "unrecoverableError", 64 => "autorecoverableError"), self::STATUS_PAPER_ROLL => array(4 => "paperNearEnd", 32 => "paperNotPresent"), self::STATUS_INK_A => array(4 => "inkNearEnd", 8 => "inkEnd", 32 => "inkNotPresent", 64 => "cleaning"), self::STATUS_INK_B => array(4 => "inkNearEnd", 8 => "inkEnd", 32 => "inkNotPresent"), self::STATUS_PEELER => array(4 => "labelWaitingForRemoval", 32 => "labelPaperNotDetected"));
$flags = $statusFlags[$type];
// Clear any previous statuses which haven't been read yet
$f = $this->connector->read(1);
// Make request
$reqC = chr($type);
switch ($type) {
// Special cases: These are two-character requests
case self::STATUS_INK_A:
$reqC = chr(7) . chr(1);
break;
case self::STATUS_INK_B:
$reqC = chr(7) . chr(2);
break;
case self::STATUS_PEELER:
$reqC = chr(8) . chr(3);
break;
}
$this->connector->write(self::DLE . self::EOT . $reqC);
// Wait for single-character response
$f = $this->connector->read(1);
$i = 0;
while (($f === false || strlen($f) == 0) && $i < 50000) {
usleep(100);
$f = $this->connector->read(1);
$i++;
}
if ($f === false || strlen($f) == 0) {
// Timeout
return null;
}
$ret = new \stdClass();
foreach ($flags as $num => $name) {
$ret->{$name} = (ord($f) & $num) != 0;
}
return $ret;
}