mirror of
https://github.com/akuker/RASCSI.git
synced 2024-06-05 01:29:29 +00:00
45cd5e58d1
* Fixed buster compile-time issue * Host services inherit from ModePageDevice * Call base class * Visibility update * Updated includes * Updated dispatcher * Added TODOs * Logging update * Code cleanup * Use namespace instead of class for ScsiDefs * Renaming * Cleanup * Use dispatcher template in order to remove duplicate code * Updated all dispatchers * Clean up commands * Removed duplicate code * Removed duplicate code * Updated template definition * Fixed typo * Fixed warning * Code cleanup * Device list must be static * Cleanup * Logging update * Added comments * Cleanup * Base class update * SCSIBR is not a subclass of Disk anymore, but of PrimaryDevice * Updated includes * Fixed compile-time issue on the Pi * Header file cleanup * Interface cleanup * Removed wrong override * include file cleanup * Removed obsolete usage of streams * Removed more stream usages * Stream usage cleanup * Include cleanup * Renaming * Include cleanup * Interface update
68 lines
1.4 KiB
C++
68 lines
1.4 KiB
C++
//---------------------------------------------------------------------------
|
|
//
|
|
// SCSI Target Emulator RaSCSI (*^..^*)
|
|
// for Raspberry Pi
|
|
//
|
|
// Copyright (C) 2022 Uwe Seimet
|
|
//
|
|
// A template for dispatching SCSI commands
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include "log.h"
|
|
#include "scsi.h"
|
|
#include <map>
|
|
|
|
class SASIDEV;
|
|
class SCSIDEV;
|
|
|
|
using namespace std;
|
|
using namespace scsi_defs;
|
|
|
|
template<class T>
|
|
class Dispatcher
|
|
{
|
|
public:
|
|
|
|
Dispatcher() {}
|
|
~Dispatcher()
|
|
{
|
|
for (auto const& command : commands) {
|
|
delete command.second;
|
|
}
|
|
}
|
|
|
|
typedef struct _command_t {
|
|
const char* name;
|
|
void (T::*execute)(SASIDEV *);
|
|
|
|
_command_t(const char* _name, void (T::*_execute)(SASIDEV *)) : name(_name), execute(_execute) { };
|
|
} command_t;
|
|
map<scsi_command, command_t*> commands;
|
|
|
|
void AddCommand(scsi_command opcode, const char* name, void (T::*execute)(SASIDEV *))
|
|
{
|
|
commands[opcode] = new command_t(name, execute);
|
|
}
|
|
|
|
bool Dispatch(T *instance, SCSIDEV *controller)
|
|
{
|
|
SASIDEV::ctrl_t *ctrl = controller->GetCtrl();
|
|
instance->SetCtrl(ctrl);
|
|
|
|
const auto& it = commands.find(static_cast<scsi_command>(ctrl->cmd[0]));
|
|
if (it != commands.end()) {
|
|
LOGDEBUG("%s Executing %s ($%02X)", __PRETTY_FUNCTION__, it->second->name, (unsigned int)ctrl->cmd[0]);
|
|
|
|
(instance->*it->second->execute)(controller);
|
|
|
|
return true;
|
|
}
|
|
|
|
// Unknown command
|
|
return false;
|
|
}
|
|
};
|