From a0321aa6ff763458c42cda6f74267860b18051a9 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 11 Jun 2019 17:47:24 -0400 Subject: [PATCH] Starts sketching out an emulator interface for mice. --- Inputs/Mouse.hpp | 47 ++++++++++ Inputs/QuadratureMouse/QuadratureMouse.cpp | 9 ++ Inputs/QuadratureMouse/QuadratureMouse.hpp | 89 +++++++++++++++++++ Machines/MouseMachine.hpp | 23 +++++ .../Clock Signal.xcodeproj/project.pbxproj | 14 ++- 5 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 Inputs/Mouse.hpp create mode 100644 Inputs/QuadratureMouse/QuadratureMouse.cpp create mode 100644 Inputs/QuadratureMouse/QuadratureMouse.hpp create mode 100644 Machines/MouseMachine.hpp diff --git a/Inputs/Mouse.hpp b/Inputs/Mouse.hpp new file mode 100644 index 000000000..2d6fe7a82 --- /dev/null +++ b/Inputs/Mouse.hpp @@ -0,0 +1,47 @@ +// +// Mouse.hpp +// Clock Signal +// +// Created by Thomas Harte on 11/06/2019. +// Copyright © 2019 Thomas Harte. All rights reserved. +// + +#ifndef Mouse_h +#define Mouse_h + +namespace Inputs { + +/*! + Models a classic-era mouse: something that provides 2d relative motion plus + some quantity of buttons. +*/ +class Mouse { + public: + /*! + Indicates a movement of the mouse. + */ + virtual void move(int x, int y) {} + + /*! + @returns the number of buttons on this mouse. + */ + virtual int get_number_of_buttons() { + return 1; + } + + /*! + Indicates that button @c index is now either pressed or unpressed. + The intention is that @c index be semantic, not positional: + 0 for the primary button, 1 for the secondary, 2 for the tertiary, etc. + */ + virtual void set_button_pressed(int index, bool is_pressed) {} + + /*! + Releases all depressed buttons. + */ + virtual void reset_all_buttons() {} +}; + +} + +#endif /* Mouse_h */ diff --git a/Inputs/QuadratureMouse/QuadratureMouse.cpp b/Inputs/QuadratureMouse/QuadratureMouse.cpp new file mode 100644 index 000000000..111c62ec5 --- /dev/null +++ b/Inputs/QuadratureMouse/QuadratureMouse.cpp @@ -0,0 +1,9 @@ +// +// QuadratureMouse.cpp +// Clock Signal +// +// Created by Thomas Harte on 11/06/2019. +// Copyright © 2019 Thomas Harte. All rights reserved. +// + +#include "QuadratureMouse.hpp" diff --git a/Inputs/QuadratureMouse/QuadratureMouse.hpp b/Inputs/QuadratureMouse/QuadratureMouse.hpp new file mode 100644 index 000000000..3099c10d3 --- /dev/null +++ b/Inputs/QuadratureMouse/QuadratureMouse.hpp @@ -0,0 +1,89 @@ +// +// QuadratureMouse.hpp +// Clock Signal +// +// Created by Thomas Harte on 11/06/2019. +// Copyright © 2019 Thomas Harte. All rights reserved. +// + +#ifndef QuadratureMouse_hpp +#define QuadratureMouse_hpp + +#include "../Mouse.hpp" +#include + +namespace Inputs { + +/*! + Provides a simple implementation of a Mouse, designed for simple + thread-safe feeding to a machine that accepts quadrature-encoded input. +*/ +class QuadratureMouse: public Mouse { + public: + QuadratureMouse(int number_of_buttons) : + number_of_buttons_(number_of_buttons) {} + + /* + Inputs, to satisfy the Mouse interface. + */ + void move(int x, int y) override { + // Accumulate all provided motion. + axes_[0] += x; + axes_[1] += y; + } + + int get_number_of_buttons() override { + return number_of_buttons_; + } + + void set_button_pressed(int index, bool is_pressed) override { + if(is_pressed) + button_flags_ |= (1 << index); + else + button_flags_ &= ~(1 << index); + } + + void reset_all_buttons() override { + button_flags_ = 0; + } + + /* + Outputs. + */ + + /*! + Gets and removes a single step from the current accumulated mouse + movement for @c axis — axis 0 is x, axis 1 is y. + + @returns 0 if no movement is outstanding, -1 if there is outstanding + negative movement, +1 if there is outstanding positive movement. + */ + int get_step(int axis) { + if(!axes_[axis]) return 0; + + if(axes_[axis] > 0) { + -- axes_[axis]; + return 1; + } else { + ++ axes_[axis]; + return -1; + } + } + + /*! + @returns a bit mask of the currently pressed buttons. + */ + int get_button_mask() { + return button_flags_; + } + + private: + int number_of_buttons_ = 0; + std::atomic button_flags_; + std::atomic axes_[2]; + +}; + +} + +#endif /* QuadratureMouse_hpp */ diff --git a/Machines/MouseMachine.hpp b/Machines/MouseMachine.hpp new file mode 100644 index 000000000..ef2029359 --- /dev/null +++ b/Machines/MouseMachine.hpp @@ -0,0 +1,23 @@ +// +// MouseMachine.hpp +// Clock Signal +// +// Created by Thomas Harte on 11/06/2019. +// Copyright © 2019 Thomas Harte. All rights reserved. +// + +#ifndef MouseMachine_hpp +#define MouseMachine_hpp + +#include "../Inputs/Mouse.hpp" + +namespace MouseMachine { + +class Machine { + public: + virtual Mouse *get_mouse() = 0; +}; + +} + +#endif /* MouseMachine_hpp */ diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 15bd6a6e1..ed7eee384 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -295,6 +295,8 @@ 4B8FE21D1DA19D5F0090D3CE /* QuickLoadCompositeOptions.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B8FE2171DA19D5F0090D3CE /* QuickLoadCompositeOptions.xib */; }; 4B8FE2221DA19FB20090D3CE /* MachinePanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B8FE2211DA19FB20090D3CE /* MachinePanel.swift */; }; 4B8FE2271DA1DE2D0090D3CE /* NSBundle+DataResource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B8FE2261DA1DE2D0090D3CE /* NSBundle+DataResource.m */; }; + 4B92294722B0554800A1458F /* QuadratureMouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B92294522B0554800A1458F /* QuadratureMouse.cpp */; }; + 4B92294822B0554800A1458F /* QuadratureMouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B92294522B0554800A1458F /* QuadratureMouse.cpp */; }; 4B924E991E74D22700B76AF1 /* AtariStaticAnalyserTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B924E981E74D22700B76AF1 /* AtariStaticAnalyserTests.mm */; }; 4B9252CE1E74D28200B76AF1 /* Atari ROMs in Resources */ = {isa = PBXBuildFile; fileRef = 4B9252CD1E74D28200B76AF1 /* Atari ROMs */; }; 4B92EACA1B7C112B00246143 /* 6502TimingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B92EAC91B7C112B00246143 /* 6502TimingTests.swift */; }; @@ -1042,6 +1044,10 @@ 4B8FE2211DA19FB20090D3CE /* MachinePanel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MachinePanel.swift; sourceTree = ""; }; 4B8FE2251DA1DE2D0090D3CE /* NSBundle+DataResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSBundle+DataResource.h"; sourceTree = ""; }; 4B8FE2261DA1DE2D0090D3CE /* NSBundle+DataResource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSBundle+DataResource.m"; sourceTree = ""; }; + 4B92294222B04A3D00A1458F /* MouseMachine.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = MouseMachine.hpp; sourceTree = ""; }; + 4B92294422B04ACB00A1458F /* Mouse.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Mouse.hpp; sourceTree = ""; }; + 4B92294522B0554800A1458F /* QuadratureMouse.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = QuadratureMouse.cpp; path = QuadratureMouse/QuadratureMouse.cpp; sourceTree = ""; }; + 4B92294622B0554800A1458F /* QuadratureMouse.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = QuadratureMouse.hpp; path = QuadratureMouse/QuadratureMouse.hpp; sourceTree = ""; }; 4B924E981E74D22700B76AF1 /* AtariStaticAnalyserTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AtariStaticAnalyserTests.mm; sourceTree = ""; }; 4B9252CD1E74D28200B76AF1 /* Atari ROMs */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "Atari ROMs"; sourceTree = ""; }; 4B92EAC91B7C112B00246143 /* 6502TimingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 6502TimingTests.swift; sourceTree = ""; }; @@ -2300,8 +2306,11 @@ isa = PBXGroup; children = ( 4B86E2591F8C628F006FAA45 /* Keyboard.cpp */, - 4B86E25A1F8C628F006FAA45 /* Keyboard.hpp */, 4B70412A1F92C2A700735E45 /* Joystick.hpp */, + 4B86E25A1F8C628F006FAA45 /* Keyboard.hpp */, + 4B92294422B04ACB00A1458F /* Mouse.hpp */, + 4B92294522B0554800A1458F /* QuadratureMouse.cpp */, + 4B92294622B0554800A1458F /* QuadratureMouse.hpp */, ); name = Inputs; path = ../../Inputs; @@ -2955,6 +2964,7 @@ 4B7041271F92C26900735E45 /* JoystickMachine.hpp */, 4B8E4ECD1DCE483D003716C3 /* KeyboardMachine.hpp */, 4BA9C3CF1D8164A9002DDB61 /* MediaTarget.hpp */, + 4B92294222B04A3D00A1458F /* MouseMachine.hpp */, 4BDCC5F81FB27A5E001220C5 /* ROMMachine.hpp */, 4B38F3491F2EC12000D9235D /* AmstradCPC */, 4BCE0048227CE8CA000CA200 /* Apple */, @@ -3811,6 +3821,7 @@ 4B055ACB1FAE9AFB0060FFFF /* SerialBus.cpp in Sources */, 4B055AA41FAE85E50060FFFF /* DigitalPhaseLockedLoop.cpp in Sources */, 4B055A9B1FAE85DA0060FFFF /* AcornADF.cpp in Sources */, + 4B92294822B0554800A1458F /* QuadratureMouse.cpp in Sources */, 4B0E04F11FC9EA9500F43484 /* MSX.cpp in Sources */, 4B055AD51FAE9B0B0060FFFF /* Video.cpp in Sources */, 4B894521201967B4007DE474 /* StaticAnalyser.cpp in Sources */, @@ -4027,6 +4038,7 @@ 4BCE0060227D39AB000CA200 /* Video.cpp in Sources */, 4B4518A51F75FD1C00926311 /* SSD.cpp in Sources */, 4B55CE5F1C3B7D960093A61B /* MachineDocument.swift in Sources */, + 4B92294722B0554800A1458F /* QuadratureMouse.cpp in Sources */, 4B2B3A4C1F9B8FA70062DABF /* MemoryFuzzer.cpp in Sources */, 4B7913CC1DFCD80E00175A82 /* Video.cpp in Sources */, 4B4518831F75E91A00926311 /* PCMTrack.cpp in Sources */,