//--------------------------------------------------------------------------- // // SCSI Target Emulator PiSCSI // for Raspberry Pi // // Copyright (C) 2022-2023 Uwe Seimet // // Implementation of a SCSI printer (see SCSI-2 specification for a command description) // //--------------------------------------------------------------------------- #pragma once #include "interfaces/scsi_printer_commands.h" #include "primary_device.h" #include #include #include #include using namespace std; class SCSIPrinter : public PrimaryDevice, private ScsiPrinterCommands { uint64_t file_print_count = 0; uint64_t byte_receive_count = 0; uint64_t print_error_count = 0; uint64_t print_warning_count = 0; static const int NOT_RESERVED = -2; static constexpr const char *PRINTER_FILE_PATTERN = "/piscsi_sclp-XXXXXX"; inline static const string FILE_PRINT_COUNT = "file_print_count"; inline static const string BYTE_RECEIVE_COUNT = "byte_receive_count"; inline static const string PRINT_ERROR_COUNT = "print_error_count"; inline static const string PRINT_WARNING_COUNT = "print_warning_count"; public: explicit SCSIPrinter(int); ~SCSIPrinter() override = default; bool Init(const param_map&) override; void CleanUp() override; param_map GetDefaultParams() const override; vector InquiryInternal() const override; bool WriteByteSequence(span) override; vector GetStatistics() const override; private: void TestUnitReady() override; void ReserveUnit() override { PrimaryDevice::ReserveUnit(); } void ReleaseUnit() override { PrimaryDevice::ReleaseUnit(); } void SendDiagnostic() override { PrimaryDevice::SendDiagnostic(); } void Print() override; void SynchronizeBuffer(); string file_template; string filename; ofstream out; };