Example #1
0
        /// <inheritdoc />
        /// <summary>
        /// This command is processed in real time. The reply to this command is sent
        /// whenever it is received and does not wait for previous ESC/POS commands to be executed first.
        /// If there is no response or an invalid response, IsValidReport will be set to false
        /// </summary>
        /// <remarks>Phoenix does not support Error or Movement status request type</remarks>
        /// <param name="type">StatusRequest type</param>
        /// <returns>Instance of PhoenixStatus</returns>
        public override StatusReport GetStatus(StatusTypes type)
        {
            ReturnCode ret;

            // Translate generic status to phoenix status
            PhoenixStatusRequests r;

            switch (type)
            {
            case StatusTypes.PrinterStatus:
                r = PhoenixStatusRequests.Status;
                break;

            case StatusTypes.OfflineStatus:
                r = PhoenixStatusRequests.OffLineStatus;
                break;

            case StatusTypes.ErrorStatus:
                return(StatusReport.Invalid());;
                break;

            case StatusTypes.PaperStatus:
                r = PhoenixStatusRequests.PaperRollStatus;
                break;

            case StatusTypes.MovementStatus:
                // Not supported on Phoenix
                return(StatusReport.Invalid());;

            case StatusTypes.FullStatus:
                r = PhoenixStatusRequests.FullStatus;
                break;

            default:
                // Unknown status type
                return(StatusReport.Invalid());
            }

            var rts = new StatusReport();

            if (r == PhoenixStatusRequests.FullStatus)
            {
                ret = internalGetStatus(PhoenixStatusRequests.Status, rts);
                ret = ret != ReturnCode.Success ? ret : internalGetStatus(PhoenixStatusRequests.PaperRollStatus, rts);
                ret = ret != ReturnCode.Success ? ret : internalGetStatus(PhoenixStatusRequests.OffLineStatus, rts);

                // Not supported PP-82
                //ret = ret != ReturnCode.Success ? ret : internalGetStatus(PhoenixStatusRequests.ErrorStatus, rts);
            }
            else
            {
                ret = internalGetStatus(r, rts);
            }

            // Return null status object on error
            return(ret == ReturnCode.Success ? rts : StatusReport.Invalid());
        }
        /// <inheritdoc />
        /// <summary>
        /// This command is processed in real time. The reply to this command is sent
        /// whenever it is received and does not wait for previous ESC/POS commands to be executed first.
        /// If there is no response or an invalid response, If there is a read timeout or comm failure, the
        /// result will have the IsValidReport set to false.
        /// </summary>
        /// <param name="type">StatusRequest type</param>
        /// <returns>Instance of RelianceStatus</returns>
        public override StatusReport GetStatus(StatusTypes type)
        {
            // Translate generic status to phoenix status
            RelianceStatusRequests r;

            switch (type)
            {
            case StatusTypes.PrinterStatus:
                r = RelianceStatusRequests.Status;
                break;

            case StatusTypes.OfflineStatus:
                r = RelianceStatusRequests.OffLineStatus;
                break;

            case StatusTypes.ErrorStatus:
                r = RelianceStatusRequests.ErrorStatus;
                break;

            case StatusTypes.PaperStatus:
                r = RelianceStatusRequests.PaperRollStatus;
                break;

            case StatusTypes.MovementStatus:
                r = RelianceStatusRequests.PrintStatus;
                break;

            case StatusTypes.FullStatus:
                r = RelianceStatusRequests.FullStatus;
                break;

            default:
                // Unknown status type
                return(StatusReport.Invalid());
            }

            // Send the real time status command, r is the argument
            var command = new byte[] { 0x10, 0x04, (byte)r };
            var respLen = (r == RelianceStatusRequests.FullStatus) ? 6 : 1;

            var data = new byte[0];

            try
            {
                Connection.Open();

                var written = Connection.Write(command);

                System.Threading.Thread.Sleep(250);

                // Collect the response
                data = Connection.Read(respLen);
            }
            catch
            { /* Do nothing */ }
            finally
            {
                Connection.Close();
            }

            // Invalid response
            if (data.Length != respLen)
            {
                return(StatusReport.Invalid());
            }

            var rts = new StatusReport();

            switch (r)
            {
            case RelianceStatusRequests.Status:
                // bit 3: 0- online, 1- offline
                rts.IsOnline = (data[0] & 0x08) == 0;
                break;

            case RelianceStatusRequests.OffLineStatus:
                // bit 2: 0- no error, 1- error
                rts.IsCoverClosed = (data[0] & 0x04) == 0;

                // bit 3: 0- no error, 1- error
                rts.IsNormalFeed = (data[0] & 0x08) == 0;

                // bit 5: 0- no error, 1- error
                rts.IsPaperPresent = (data[0] & 0x20) == 0;

                // bit 6: 0- no error, 1- error
                rts.HasError = (data[0] & 0x40) == 0x40;

                break;

            case RelianceStatusRequests.ErrorStatus:
                // bit 3: 0- okay, 1- Not okay
                rts.IsCutterOkay = (data[0] & 8) == 0;

                // bit 5: 0- No fatal (non-recoverable) error, 1- Fatal error
                rts.HasFatalError = (data[0] & 0x20) == 0x20;

                // bit 6: 0- No recoverable error, 1- Recoverable error
                rts.HasRecoverableError = (data[0] & 0x40) == 0x40;
                break;

            case RelianceStatusRequests.PaperRollStatus:
                // bit 2,3: 0- okay, 12- Not okay
                rts.IsPaperLevelOkay = (data[0] & 0x0C) == 0;

                // bit 5,6: 0- okay, 96- Not okay
                rts.IsPaperPresent = (data[0] & 0x60) == 0;
                break;

            case RelianceStatusRequests.PrintStatus:
                // bit 2: 0- motor off, 1: motor on
                rts.IsPaperMotorOff = (data[0] & 4) == 0;
                // bit 5: 0- paper present, 1: motor stopped because out of paper

                rts.IsPaperPresent = (data[0] & 4) == 0;
                break;

            case RelianceStatusRequests.FullStatus:

                rts.IsPaperPresent          = (data[2] & 0x01) == 0;
                rts.IsPaperLevelOkay        = (data[2] & 0x04) == 0;
                rts.IsTicketPresentAtOutput = (data[2] & 0x20) == 0x20;

                // Custom specs duplicates these so if EITHER
                // are set to open, report open. 0: closed, 1: open
                var covera = (data[3] & 0x01) == 0;
                var coverb = (data[3] & 0x02) == 0;

                rts.IsCoverClosed = covera && coverb;

                rts.IsPaperMotorOff      = (data[3] & 0x08) == 0;
                rts.IsDiagButtonReleased = (data[3] & 0x20) == 0;

                rts.IsHeadTemperatureOkay    = (data[4] & 0x01) == 0;
                rts.IsCommsOkay              = (data[4] & 02) == 0;
                rts.IsPowerSupplyVoltageOkay = (data[4] & 0x08) == 0;
                rts.IsPaperPathClear         = (data[4] & 0x40) == 0;

                rts.IsCutterOkay = (data[5] & 0x01) == 0;
                break;

            default:
                rts.IsInvalidReport = true;
                break;
            }

            return(rts);
        }