RASCSI/src/raspberrypi/devices/primary_device.h
Uwe Seimet 305a7fb99d
Use enums for device type and scsi level (#718)
* Use enums for device type and scsi level

* Renaming

* Use new enum instead of magic values

* Comment update

* Fixed REQUEST SENSE regression
2022-03-02 11:31:42 -06:00

55 lines
1.2 KiB
C++

//---------------------------------------------------------------------------
//
// SCSI Target Emulator RaSCSI (*^..^*)
// for Raspberry Pi
//
// Copyright (C) 2022 Uwe Seimet
//
// A device implementing mandatory SCSI primary commands, to be used for subclassing
//
//---------------------------------------------------------------------------
#pragma once
#include "controllers/scsidev_ctrl.h"
#include "interfaces/scsi_primary_commands.h"
#include "device.h"
#include "dispatcher.h"
#include <string>
using namespace std;
class PrimaryDevice: public Device, virtual public ScsiPrimaryCommands
{
public:
PrimaryDevice(const string&);
virtual ~PrimaryDevice() {}
virtual bool Dispatch(SCSIDEV *);
void TestUnitReady(SASIDEV *);
void RequestSense(SASIDEV *);
void SetCtrl(SASIDEV::ctrl_t *ctrl) { this->ctrl = ctrl; }
bool CheckReady();
virtual vector<BYTE> Inquiry() const = 0;
virtual vector<BYTE> RequestSense(int);
virtual bool WriteBytes(BYTE *, uint32_t);
virtual int GetSendDelay() const { return BUS::SEND_NO_DELAY; }
protected:
vector<BYTE> Inquiry(scsi_defs::device_type, scsi_level, bool) const;
SASIDEV::ctrl_t *ctrl;
private:
Dispatcher<PrimaryDevice, SASIDEV> dispatcher;
void Inquiry(SASIDEV *);
void ReportLuns(SASIDEV *);
};