//--------------------------------------------------------------------------- // // SCSI Target Emulator PiSCSI // for Raspberry Pi // // Copyright (C) 2022-2023 Uwe Seimet // // Keeps track of and manages the controllers // //--------------------------------------------------------------------------- #pragma once #include "hal/bus.h" #include "controllers/abstract_controller.h" #include #include #include using namespace std; class ScsiController; class PrimaryDevice; class ControllerManager { public: ControllerManager() = default; ~ControllerManager() = default; bool AttachToController(BUS&, int, shared_ptr); bool DeleteController(const AbstractController&); void DeleteAllControllers(); AbstractController::piscsi_shutdown_mode ProcessOnController(int) const; shared_ptr FindController(int) const; bool HasController(int) const; unordered_set> GetAllDevices() const; bool HasDeviceForIdAndLun(int, int) const; shared_ptr GetDeviceForIdAndLun(int, int) const; static int GetScsiIdMax() { return 8; } static int GetScsiLunMax() { return 32; } private: shared_ptr CreateScsiController(BUS&, int) const; // Controllers mapped to their device IDs unordered_map> controllers; };