From: <m97...@us...> - 2006-09-18 21:16:12
|
Revision: 5663 http://svn.sourceforge.net/openmsx/?rev=5663&view=rev Author: m9710797 Date: 2006-09-18 14:15:55 -0700 (Mon, 18 Sep 2006) Log Message: ----------- use events for disk changing (see ChangeLog) Modified Paths: -------------- openmsx/trunk/ChangeLog openmsx/trunk/src/PluggingController.cc openmsx/trunk/src/events/Event.hh openmsx/trunk/src/events/InputEventFactory.cc openmsx/trunk/src/events/InputEvents.cc openmsx/trunk/src/events/InputEvents.hh openmsx/trunk/src/fdc/DiskChanger.cc openmsx/trunk/src/fdc/DiskChanger.hh openmsx/trunk/src/fdc/DiskDrive.cc openmsx/trunk/src/fdc/DiskDrive.hh openmsx/trunk/src/fdc/MSXFDC.cc Modified: openmsx/trunk/ChangeLog =================================================================== --- openmsx/trunk/ChangeLog 2006-09-18 20:13:19 UTC (rev 5662) +++ openmsx/trunk/ChangeLog 2006-09-18 21:15:55 UTC (rev 5663) @@ -3,6 +3,10 @@ 2006-09-16 Wouter Vermaelen <wou...@sc...> * Use events for (un)plug command: makes (un)plug recordable + * use events for disk changing: + TODO: - do the same for cassetteplayer + - use different string representation for events because at + the moment the paths can't contain ':' characters 2006-09-16 Wouter Vermaelen <wou...@sc...> * Added 'extensions' and 'machines' info topics Modified: openmsx/trunk/src/PluggingController.cc =================================================================== --- openmsx/trunk/src/PluggingController.cc 2006-09-18 20:13:19 UTC (rev 5662) +++ openmsx/trunk/src/PluggingController.cc 2006-09-18 21:15:55 UTC (rev 5663) @@ -186,9 +186,9 @@ break; } case OPENMSX_UNPLUG_EVENT: { - const PlugEvent* plugEvent = - checked_cast<const PlugEvent*>(event.get()); - const std::string& connectorName = plugEvent->getConnector(); + const UnplugEvent* unplugEvent = + checked_cast<const UnplugEvent*>(event.get()); + const std::string& connectorName = unplugEvent->getConnector(); Connector* connector = getConnector(connectorName); if (connector == NULL) { throw CommandException("No such connector: " + Modified: openmsx/trunk/src/events/Event.hh =================================================================== --- openmsx/trunk/src/events/Event.hh 2006-09-18 20:13:19 UTC (rev 5662) +++ openmsx/trunk/src/events/Event.hh 2006-09-18 21:15:55 UTC (rev 5663) @@ -27,6 +27,11 @@ OPENMSX_PLUG_EVENT, OPENMSX_UNPLUG_EVENT, + /** Send by the various media change commands (diska, + * cassetteplayer, ..). Is Implemented as an event to make it + * recordable. */ + OPENMSX_MEDIA_CHANGE_EVENT, + /** Sent when VDP (V99x8 or V9990) reaches the end of a frame */ OPENMSX_FINISH_FRAME_EVENT, Modified: openmsx/trunk/src/events/InputEventFactory.cc =================================================================== --- openmsx/trunk/src/events/InputEventFactory.cc 2006-09-18 20:13:19 UTC (rev 5662) +++ openmsx/trunk/src/events/InputEventFactory.cc 2006-09-18 21:15:55 UTC (rev 5663) @@ -141,6 +141,16 @@ return EventPtr(new UnplugEvent(components[1])); } +static EventPtr parseMediaEvent( + const string& str, const vector<string>& components) +{ + if (components.size() < 2) { + throw CommandException("Invalid media event: " + str); + } + vector<string> args(components.begin() + 2, components.end()); + return EventPtr(new MediaChangeEvent(components[1], args)); +} + EventPtr createInputEvent(const string& str) { vector<string> components; @@ -164,6 +174,8 @@ return parsePlugEvent(str, components); } else if (components[0] == "unplug") { return parseUnplugEvent(str, components); + } else if (components[0] == "media") { + return parseMediaEvent(str, components); } else { // fall back return parseKeyEvent(components[0]); Modified: openmsx/trunk/src/events/InputEvents.cc =================================================================== --- openmsx/trunk/src/events/InputEvents.cc 2006-09-18 20:13:19 UTC (rev 5662) +++ openmsx/trunk/src/events/InputEvents.cc 2006-09-18 21:15:55 UTC (rev 5663) @@ -8,6 +8,7 @@ #include <cassert> using std::string; +using std::vector; namespace openmsx { @@ -391,7 +392,7 @@ } -// class PlugEvent +// class UnplugEvent UnplugEvent::UnplugEvent(const string& connector_) : InputEvent(OPENMSX_UNPLUG_EVENT) @@ -417,6 +418,46 @@ } +// class MediaChangeEvent + +MediaChangeEvent::MediaChangeEvent( + const string& media_, const vector<string>& args_) + : InputEvent(OPENMSX_MEDIA_CHANGE_EVENT) + , media(media_), args(args_) +{ +} + +const string& MediaChangeEvent::getMedia() const +{ + return media; +} + +const vector<string>& MediaChangeEvent::getArgs() const +{ + return args; +} + +string MediaChangeEvent::toString() const +{ + // TODO use TCL list format + string result = "media:" + getMedia(); + for (vector<string>::const_iterator it = args.begin(); + it != args.end(); ++it) { + result += ':' + *it; + } + return result; +} + +bool MediaChangeEvent::lessImpl(const InputEvent& other) const +{ + const MediaChangeEvent* otherMediaChangeEvent = + checked_cast<const MediaChangeEvent*>(&other); + return (getMedia() != otherMediaChangeEvent->getMedia()) + ? (getMedia() < otherMediaChangeEvent->getMedia()) + : (getArgs () < otherMediaChangeEvent->getArgs ()); +} + + // class ConsoleEvent ConsoleEvent::ConsoleEvent(EventType type) Modified: openmsx/trunk/src/events/InputEvents.hh =================================================================== --- openmsx/trunk/src/events/InputEvents.hh 2006-09-18 20:13:19 UTC (rev 5662) +++ openmsx/trunk/src/events/InputEvents.hh 2006-09-18 21:15:55 UTC (rev 5663) @@ -7,6 +7,7 @@ #include "Event.hh" #include "Keys.hh" #include <string> +#include <vector> namespace openmsx { @@ -228,6 +229,21 @@ }; +class MediaChangeEvent : public InputEvent +{ +public: + MediaChangeEvent(const std::string& media, + const std::vector<std::string>& args); + const std::string& getMedia() const; + const std::vector<std::string>& getArgs() const; + virtual std::string toString() const; +private: + virtual bool lessImpl(const InputEvent& other) const; + const std::string media; + const std::vector<std::string> args; +}; + + /** * Used for console on/off events. * These events tell a lower layer (the MSX keyboard) that key down/up events Modified: openmsx/trunk/src/fdc/DiskChanger.cc =================================================================== --- openmsx/trunk/src/fdc/DiskChanger.cc 2006-09-18 20:13:19 UTC (rev 5662) +++ openmsx/trunk/src/fdc/DiskChanger.cc 2006-09-18 21:15:55 UTC (rev 5663) @@ -8,6 +8,9 @@ #include "DSKDiskImage.hh" #include "CommandController.hh" #include "Command.hh" +#include "MSXEventDistributor.hh" +#include "InputEvents.hh" +#include "Scheduler.hh" #include "FileManipulator.hh" #include "FileContext.hh" #include "FileException.hh" @@ -15,6 +18,8 @@ #include "CliComm.hh" #include "GlobalSettings.hh" #include "TclObject.hh" +#include "EmuTime.hh" +#include "checked_cast.hh" using std::set; using std::string; @@ -37,18 +42,29 @@ DiskChanger::DiskChanger(const string& driveName_, CommandController& commandController, - FileManipulator& manipulator_) - : driveName(driveName_), manipulator(manipulator_) + FileManipulator& manipulator_, + MSXEventDistributor* msxEventDistributor_, + Scheduler* scheduler_) + : driveName(driveName_) + , manipulator(manipulator_) , diskCommand(new DiskCommand(commandController, *this)) , cliComm(commandController.getCliComm()) , globalSettings(commandController.getGlobalSettings()) + , msxEventDistributor(msxEventDistributor_) + , scheduler(scheduler_) { ejectDisk(); manipulator.registerDrive(*this, driveName); + if (msxEventDistributor) { + msxEventDistributor->registerEventListener(*this); + } } DiskChanger::~DiskChanger() { + if (msxEventDistributor) { + msxEventDistributor->unregisterEventListener(*this); + } manipulator.unregisterDrive(*this, driveName); } @@ -84,10 +100,46 @@ return dynamic_cast<SectorAccessibleDisk*>(disk.get()); } -void DiskChanger::insertDisk(const string& diskImage, - const vector<string>& patches) +void DiskChanger::sendChangeDiskEvent(const vector<string>& args) { + // note: might throw MSXException + MSXEventDistributor::EventPtr event( + new MediaChangeEvent(getDriveName(), args)); + if (msxEventDistributor) { + msxEventDistributor->distributeEvent( + event, scheduler->getCurrentTime()); + } else { + signalEvent(event, EmuTime::zero); + } +} + +void DiskChanger::signalEvent( + shared_ptr<const Event> event, const EmuTime& /*time*/) +{ + switch (event->getType()) { + case OPENMSX_MEDIA_CHANGE_EVENT: { + const MediaChangeEvent* mediaChangeEvent = + checked_cast<const MediaChangeEvent*>(event.get()); + if (mediaChangeEvent->getMedia() == getDriveName()) { + const vector<string>& args = mediaChangeEvent->getArgs(); + if (args.empty()) { + ejectDisk(); + } else { + insertDisk(args); + } + } + break; + } + default: + // nothing + break; + } +} + +void DiskChanger::insertDisk(const vector<string>& args) +{ std::auto_ptr<Disk> newDisk; + const string& diskImage = args[0]; if (diskImage == "-ramdsk") { newDisk.reset(new RamDSKDiskImage()); } else { @@ -109,9 +161,8 @@ } } } - for (vector<string>::const_iterator it = patches.begin(); - it != patches.end(); ++it) { - disk->applyPatch(*it); + for (unsigned i = 1; i < args.size(); ++i) { + disk->applyPatch(args[i]); } // no errors, only now replace original disk @@ -163,24 +214,26 @@ } } else if (tokens[1]->getString() == "-ramdsk") { - vector<string> nopatchfiles; - diskChanger.insertDisk(tokens[1]->getString(), nopatchfiles); + vector<string> args; + args.push_back(tokens[1]->getString()); + diskChanger.sendChangeDiskEvent(args); } else if (tokens[1]->getString() == "-eject") { - diskChanger.ejectDisk(); + vector<string> args; + diskChanger.sendChangeDiskEvent(args); } else if (tokens[1]->getString() == "eject") { - diskChanger.ejectDisk(); + vector<string> args; + diskChanger.sendChangeDiskEvent(args); result.setString( "Warning: use of 'eject' is deprecated, instead use '-eject'"); } else { try { UserFileContext context(getCommandController()); - vector<string> patches; - for (unsigned i = 2; i < tokens.size(); ++i) { - patches.push_back(context.resolve( + vector<string> args; + for (unsigned i = 1; i < tokens.size(); ++i) { + args.push_back(context.resolve( tokens[i]->getString())); } - diskChanger.insertDisk( - context.resolve(tokens[1]->getString()), patches); + diskChanger.sendChangeDiskEvent(args); } catch (FileException& e) { throw CommandException(e.getMessage()); } Modified: openmsx/trunk/src/fdc/DiskChanger.hh =================================================================== --- openmsx/trunk/src/fdc/DiskChanger.hh 2006-09-18 20:13:19 UTC (rev 5662) +++ openmsx/trunk/src/fdc/DiskChanger.hh 2006-09-18 21:15:55 UTC (rev 5663) @@ -4,6 +4,7 @@ #define DISKCHANGER_HH #include "DiskContainer.hh" +#include "MSXEventListener.hh" #include <vector> #include <string> #include <memory> @@ -11,18 +12,22 @@ namespace openmsx { class CommandController; +class MSXEventDistributor; +class Scheduler; class FileManipulator; class Disk; class DiskCommand; class CliComm; class GlobalSettings; -class DiskChanger : public DiskContainer +class DiskChanger : public DiskContainer, private MSXEventListener { public: DiskChanger(const std::string& driveName, CommandController& commandController, - FileManipulator& manipulator); + FileManipulator& manipulator, + MSXEventDistributor* msxEventDistributor = NULL, + Scheduler* scheduler = NULL); ~DiskChanger(); const std::string& getDriveName() const; @@ -35,11 +40,15 @@ virtual SectorAccessibleDisk* getSectorAccessibleDisk(); private: - void insertDisk(const std::string& disk, - const std::vector<std::string>& patches); + void insertDisk(const std::vector<std::string>& args); void ejectDisk(); void changeDisk(std::auto_ptr<Disk> newDisk); + void sendChangeDiskEvent(const std::vector<std::string>& args); + // MSXEventListener + virtual void signalEvent(shared_ptr<const Event> event, + const EmuTime& time); + std::string driveName; FileManipulator& manipulator; std::auto_ptr<Disk> disk; @@ -49,6 +58,8 @@ const std::auto_ptr<DiskCommand> diskCommand; CliComm& cliComm; GlobalSettings& globalSettings; + MSXEventDistributor* msxEventDistributor; + Scheduler* scheduler; }; } // namespace openmsx Modified: openmsx/trunk/src/fdc/DiskDrive.cc =================================================================== --- openmsx/trunk/src/fdc/DiskDrive.cc 2006-09-18 20:13:19 UTC (rev 5662) +++ openmsx/trunk/src/fdc/DiskDrive.cc 2006-09-18 21:15:55 UTC (rev 5663) @@ -146,6 +146,7 @@ RealDrive::RealDrive(CommandController& commandController, EventDistributor& eventDistributor_, + MSXEventDistributor& msxEventDistributor, Scheduler& scheduler, FileManipulator& fileManipulator, const EmuTime& time) : Schedulable(scheduler) @@ -173,8 +174,8 @@ CliComm::HARDWARE, driveName, "add" ); changer.reset(new DiskChanger( - driveName, commandController, fileManipulator - )); + driveName, commandController, fileManipulator, + &msxEventDistributor, &scheduler)); } RealDrive::~RealDrive() @@ -358,11 +359,12 @@ SingleSidedDrive::SingleSidedDrive( CommandController& commandController, EventDistributor& eventDistributor, + MSXEventDistributor& msxEventDistributor, Scheduler& scheduler, FileManipulator& fileManipulator, const EmuTime& time) - : RealDrive(commandController, eventDistributor, scheduler, - fileManipulator, time) + : RealDrive(commandController, eventDistributor, + msxEventDistributor, scheduler, fileManipulator, time) { } @@ -424,11 +426,12 @@ DoubleSidedDrive::DoubleSidedDrive( CommandController& commandController, EventDistributor& eventDistributor, + MSXEventDistributor& msxEventDistributor, Scheduler& scheduler, FileManipulator& fileManipulator, const EmuTime& time) - : RealDrive(commandController, eventDistributor, scheduler, - fileManipulator, time) + : RealDrive(commandController, eventDistributor, msxEventDistributor, + scheduler, fileManipulator, time) { side = 0; } Modified: openmsx/trunk/src/fdc/DiskDrive.hh =================================================================== --- openmsx/trunk/src/fdc/DiskDrive.hh 2006-09-18 20:13:19 UTC (rev 5662) +++ openmsx/trunk/src/fdc/DiskDrive.hh 2006-09-18 21:15:55 UTC (rev 5663) @@ -12,6 +12,7 @@ class DiskChanger; class CommandController; class EventDistributor; +class MSXEventDistributor; class Scheduler; class FileManipulator; class ThrottleManager; @@ -174,6 +175,7 @@ RealDrive(CommandController& commandController, EventDistributor& eventDistributor, + MSXEventDistributor& msxEventDistributor, Scheduler& scheduler, FileManipulator& fileManipulator, const EmuTime& time); @@ -232,6 +234,7 @@ public: SingleSidedDrive(CommandController& commandController, EventDistributor& eventDistributor, + MSXEventDistributor& msxEventDistributor, Scheduler& scheduler, FileManipulator& fileManipulator, const EmuTime& time); @@ -258,6 +261,7 @@ public: DoubleSidedDrive(CommandController& commandController, EventDistributor& eventDistributor, + MSXEventDistributor& msxEventDistributor, Scheduler& scheduler, FileManipulator& fileManipulator, const EmuTime& time); Modified: openmsx/trunk/src/fdc/MSXFDC.cc =================================================================== --- openmsx/trunk/src/fdc/MSXFDC.cc 2006-09-18 20:13:19 UTC (rev 5662) +++ openmsx/trunk/src/fdc/MSXFDC.cc 2006-09-18 21:15:55 UTC (rev 5663) @@ -27,6 +27,7 @@ drives[i].reset(new SingleSidedDrive( getMotherBoard().getCommandController(), getMotherBoard().getEventDistributor(), + getMotherBoard().getMSXEventDistributor(), getMotherBoard().getScheduler(), getMotherBoard().getFileManipulator(), time)); @@ -34,6 +35,7 @@ drives[i].reset(new DoubleSidedDrive( getMotherBoard().getCommandController(), getMotherBoard().getEventDistributor(), + getMotherBoard().getMSXEventDistributor(), getMotherBoard().getScheduler(), getMotherBoard().getFileManipulator(), time)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |