| 1 | //============================================================================ | 
|---|
| 2 | // | 
|---|
| 3 | //   SSSS    tt          lll  lll | 
|---|
| 4 | //  SS  SS   tt           ll   ll | 
|---|
| 5 | //  SS     tttttt  eeee   ll   ll   aaaa | 
|---|
| 6 | //   SSSS    tt   ee  ee  ll   ll      aa | 
|---|
| 7 | //      SS   tt   eeeeee  ll   ll   aaaaa  --  "An Atari 2600 VCS Emulator" | 
|---|
| 8 | //  SS  SS   tt   ee      ll   ll  aa  aa | 
|---|
| 9 | //   SSSS     ttt  eeeee llll llll  aaaaa | 
|---|
| 10 | // | 
|---|
| 11 | // Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony | 
|---|
| 12 | // and the Stella Team | 
|---|
| 13 | // | 
|---|
| 14 | // See the file "License.txt" for information on usage and redistribution of | 
|---|
| 15 | // this file, and for a DISCLAIMER OF ALL WARRANTIES. | 
|---|
| 16 | //============================================================================ | 
|---|
| 17 |  | 
|---|
| 18 | #ifndef EVENT_HXX | 
|---|
| 19 | #define EVENT_HXX | 
|---|
| 20 |  | 
|---|
| 21 | #include <mutex> | 
|---|
| 22 | #include <set> | 
|---|
| 23 |  | 
|---|
| 24 | #include "bspf.hxx" | 
|---|
| 25 | #include "StellaKeys.hxx" | 
|---|
| 26 |  | 
|---|
| 27 | /** | 
|---|
| 28 | @author  Stephen Anthony, Christian Speckner, Thomas Jentzsch | 
|---|
| 29 | */ | 
|---|
| 30 | class Event | 
|---|
| 31 | { | 
|---|
| 32 | public: | 
|---|
| 33 | /** | 
|---|
| 34 | Enumeration of all possible events in Stella, including both | 
|---|
| 35 | console and controller event types as well as events that aren't | 
|---|
| 36 | technically part of the emulation core. | 
|---|
| 37 | */ | 
|---|
| 38 | enum Type | 
|---|
| 39 | { | 
|---|
| 40 | NoType = 0, | 
|---|
| 41 | ConsoleColor, ConsoleBlackWhite, | 
|---|
| 42 | ConsoleLeftDiffA, ConsoleLeftDiffB, | 
|---|
| 43 | ConsoleRightDiffA, ConsoleRightDiffB, | 
|---|
| 44 | ConsoleSelect, ConsoleReset, | 
|---|
| 45 | ConsoleLeftDiffToggle, ConsoleRightDiffToggle, ConsoleColorToggle, | 
|---|
| 46 | Console7800Pause, | 
|---|
| 47 |  | 
|---|
| 48 | JoystickZeroUp, JoystickZeroDown, JoystickZeroLeft, JoystickZeroRight, | 
|---|
| 49 | JoystickZeroFire, JoystickZeroFire5, JoystickZeroFire9, | 
|---|
| 50 | JoystickOneUp, JoystickOneDown, JoystickOneLeft, JoystickOneRight, | 
|---|
| 51 | JoystickOneFire, JoystickOneFire5, JoystickOneFire9, | 
|---|
| 52 |  | 
|---|
| 53 | PaddleZeroDecrease, PaddleZeroIncrease, PaddleZeroAnalog, PaddleZeroFire, | 
|---|
| 54 | PaddleOneDecrease, PaddleOneIncrease, PaddleOneAnalog, PaddleOneFire, | 
|---|
| 55 | PaddleTwoDecrease, PaddleTwoIncrease, PaddleTwoAnalog, PaddleTwoFire, | 
|---|
| 56 | PaddleThreeDecrease, PaddleThreeIncrease, PaddleThreeAnalog, PaddleThreeFire, | 
|---|
| 57 |  | 
|---|
| 58 | KeyboardZero1, KeyboardZero2, KeyboardZero3, | 
|---|
| 59 | KeyboardZero4, KeyboardZero5, KeyboardZero6, | 
|---|
| 60 | KeyboardZero7, KeyboardZero8, KeyboardZero9, | 
|---|
| 61 | KeyboardZeroStar, KeyboardZero0, KeyboardZeroPound, | 
|---|
| 62 |  | 
|---|
| 63 | KeyboardOne1, KeyboardOne2, KeyboardOne3, | 
|---|
| 64 | KeyboardOne4, KeyboardOne5, KeyboardOne6, | 
|---|
| 65 | KeyboardOne7, KeyboardOne8, KeyboardOne9, | 
|---|
| 66 | KeyboardOneStar, KeyboardOne0, KeyboardOnePound, | 
|---|
| 67 |  | 
|---|
| 68 | Combo1, Combo2, Combo3, Combo4, Combo5, Combo6, Combo7, Combo8, | 
|---|
| 69 | Combo9, Combo10, Combo11, Combo12, Combo13, Combo14, Combo15, Combo16, | 
|---|
| 70 |  | 
|---|
| 71 | MouseAxisXValue, MouseAxisYValue, | 
|---|
| 72 | MouseButtonLeftValue, MouseButtonRightValue, | 
|---|
| 73 |  | 
|---|
| 74 | ChangeState, LoadState, SaveState, TakeSnapshot, Quit, | 
|---|
| 75 | TogglePauseMode, , , TimeMachineMode, DebuggerMode, ExitMode, | 
|---|
| 76 | Fry, VolumeDecrease, VolumeIncrease, SoundToggle, VidmodeDecrease, VidmodeIncrease, | 
|---|
| 77 | RewindPause, UnwindPause, | 
|---|
| 78 |  | 
|---|
| 79 | UIUp, UIDown, UILeft, UIRight, UIHome, UIEnd, UIPgUp, UIPgDown, | 
|---|
| 80 | UISelect, UINavPrev, UINavNext, UIOK, UICancel, UIPrevDir, | 
|---|
| 81 | UITabPrev, UITabNext, | 
|---|
| 82 |  | 
|---|
| 83 | ToggleFullScreen, | 
|---|
| 84 | VidmodeStd, VidmodeRGB, VidmodeSVideo, VidModeComposite, VidModeBad, VidModeCustom, | 
|---|
| 85 | PreviousAttribute, NextAttribute, DecreaseAttribute, IncreaseAttribute, | 
|---|
| 86 | ScanlinesDecrease, ScanlinesIncrease, | 
|---|
| 87 |  | 
|---|
| 88 | ToggleP0Collision, ToggleP0Bit, ToggleP1Collision, ToggleP1Bit, | 
|---|
| 89 | ToggleM0Collision, ToggleM0Bit, ToggleM1Collision, ToggleM1Bit, | 
|---|
| 90 | ToggleBLCollision, ToggleBLBit, TogglePFCollision, TogglePFBit, | 
|---|
| 91 | ToggleCollisions, ToggleBits, ToggleFixedColors, | 
|---|
| 92 |  | 
|---|
| 93 | DecreasePhosphor, IncreasePhosphor, TogglePhosphor, ToggleJitter, | 
|---|
| 94 | ToggleFrameStats, ToggleTimeMachine, | 
|---|
| 95 | ToggleContSnapshots, ToggleContSnapshotsFrame, | 
|---|
| 96 | ToggleColorLoss, TogglePalette, | 
|---|
| 97 |  | 
|---|
| 98 | HandleMouseControl, ToggleGrabMouse, ToggleSAPortOrder, | 
|---|
| 99 | DecreaseFormat, IncreaseFormat, ReloadConsole, | 
|---|
| 100 |  | 
|---|
| 101 | , , , | 
|---|
| 102 | , , , | 
|---|
| 103 |  | 
|---|
| 104 | StartPauseMode, SaveAllStates, LoadAllStates, | 
|---|
| 105 | DecreaseOverscan, IncreaseOverScan, | 
|---|
| 106 |  | 
|---|
| 107 | ToggleAutoSlot, | 
|---|
| 108 |  | 
|---|
| 109 | CompuMateFunc, CompuMateShift, | 
|---|
| 110 | CompuMate0, CompuMate1, CompuMate2, CompuMate3, CompuMate4, | 
|---|
| 111 | CompuMate5, CompuMate6, CompuMate7, CompuMate8, CompuMate9, | 
|---|
| 112 | CompuMateA, CompuMateB, CompuMateC, CompuMateD, CompuMateE, | 
|---|
| 113 | CompuMateF, CompuMateG, CompuMateH, CompuMateI, CompuMateJ, | 
|---|
| 114 | CompuMateK, CompuMateL, CompuMateM, CompuMateN, CompuMateO, | 
|---|
| 115 | CompuMateP, CompuMateQ, CompuMateR, CompuMateS, CompuMateT, | 
|---|
| 116 | CompuMateU, CompuMateV, CompuMateW, CompuMateX, CompuMateY, | 
|---|
| 117 | CompuMateZ, | 
|---|
| 118 | CompuMateComma, CompuMatePeriod, CompuMateEnter, CompuMateSpace, | 
|---|
| 119 | CompuMateQuestion, CompuMateLeftBracket, CompuMateRightBracket, CompuMateMinus, | 
|---|
| 120 | CompuMateQuote, CompuMateBackspace, CompuMateEquals, CompuMatePlus, | 
|---|
| 121 | CompuMateSlash, | 
|---|
| 122 |  | 
|---|
| 123 | LastType | 
|---|
| 124 |  | 
|---|
| 125 | }; | 
|---|
| 126 |  | 
|---|
| 127 | // Event categorizing groups | 
|---|
| 128 | enum Group | 
|---|
| 129 | { | 
|---|
| 130 | , Emulation, | 
|---|
| 131 | Misc, AudioVideo, States, Console, Joystick, Paddles, Keyboard, | 
|---|
| 132 | Debug, Combo, | 
|---|
| 133 | LastGroup | 
|---|
| 134 | }; | 
|---|
| 135 |  | 
|---|
| 136 | // Event list version, update if the id of existing event types changed | 
|---|
| 137 | static constexpr Int32 VERSION = 1; | 
|---|
| 138 |  | 
|---|
| 139 | using EventSet = std::set<Event::Type>; | 
|---|
| 140 |  | 
|---|
| 141 | public: | 
|---|
| 142 | /** | 
|---|
| 143 | Create a new event object. | 
|---|
| 144 | */ | 
|---|
| 145 | Event() { clear(); } | 
|---|
| 146 |  | 
|---|
| 147 | public: | 
|---|
| 148 | /** | 
|---|
| 149 | Get the value associated with the event of the specified type. | 
|---|
| 150 | */ | 
|---|
| 151 | Int32 get(Type type) const { | 
|---|
| 152 | std::lock_guard<std::mutex> lock(myMutex); | 
|---|
| 153 |  | 
|---|
| 154 | return myValues[type]; | 
|---|
| 155 | } | 
|---|
| 156 |  | 
|---|
| 157 | /** | 
|---|
| 158 | Set the value associated with the event of the specified type. | 
|---|
| 159 | */ | 
|---|
| 160 | void set(Type type, Int32 value) { | 
|---|
| 161 | std::lock_guard<std::mutex> lock(myMutex); | 
|---|
| 162 |  | 
|---|
| 163 | myValues[type] = value; | 
|---|
| 164 | } | 
|---|
| 165 |  | 
|---|
| 166 | /** | 
|---|
| 167 | Clears the event array (resets to initial state). | 
|---|
| 168 | */ | 
|---|
| 169 | void clear() | 
|---|
| 170 | { | 
|---|
| 171 | std::lock_guard<std::mutex> lock(myMutex); | 
|---|
| 172 |  | 
|---|
| 173 | for(Int32 i = 0; i < LastType; ++i) | 
|---|
| 174 | myValues[i] = Event::NoType; | 
|---|
| 175 | } | 
|---|
| 176 |  | 
|---|
| 177 | /** | 
|---|
| 178 | Tests if a given event represents continuous or analog values. | 
|---|
| 179 | */ | 
|---|
| 180 | static bool isAnalog(Type type) | 
|---|
| 181 | { | 
|---|
| 182 | switch(type) | 
|---|
| 183 | { | 
|---|
| 184 | case Event::PaddleZeroAnalog: | 
|---|
| 185 | case Event::PaddleOneAnalog: | 
|---|
| 186 | case Event::PaddleTwoAnalog: | 
|---|
| 187 | case Event::PaddleThreeAnalog: | 
|---|
| 188 | return true; | 
|---|
| 189 | default: | 
|---|
| 190 | return false; | 
|---|
| 191 | } | 
|---|
| 192 | } | 
|---|
| 193 |  | 
|---|
| 194 | private: | 
|---|
| 195 | // Array of values associated with each event type | 
|---|
| 196 | Int32 myValues[LastType]; | 
|---|
| 197 |  | 
|---|
| 198 | mutable std::mutex myMutex; | 
|---|
| 199 |  | 
|---|
| 200 | private: | 
|---|
| 201 | // Following constructors and assignment operators not supported | 
|---|
| 202 | Event(const Event&) = delete; | 
|---|
| 203 | Event(Event&&) = delete; | 
|---|
| 204 | Event& operator=(const Event&) = delete; | 
|---|
| 205 | Event& operator=(Event&&) = delete; | 
|---|
| 206 | }; | 
|---|
| 207 |  | 
|---|
| 208 | // Hold controller related events | 
|---|
| 209 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
|---|
| 210 | static const Event::EventSet LeftJoystickEvents = { | 
|---|
| 211 | Event::JoystickZeroUp, Event::JoystickZeroDown, Event::JoystickZeroLeft, Event::JoystickZeroRight, | 
|---|
| 212 | Event::JoystickZeroFire, Event::JoystickZeroFire5, Event::JoystickZeroFire9, | 
|---|
| 213 | }; | 
|---|
| 214 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
|---|
| 215 | static const Event::EventSet RightJoystickEvents = { | 
|---|
| 216 | Event::JoystickOneUp, Event::JoystickOneDown, Event::JoystickOneLeft, Event::JoystickOneRight, | 
|---|
| 217 | Event::JoystickOneFire, Event::JoystickOneFire5, Event::JoystickOneFire9 | 
|---|
| 218 | }; | 
|---|
| 219 |  | 
|---|
| 220 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
|---|
| 221 | static const Event::EventSet LeftPaddlesEvents = { | 
|---|
| 222 | Event::PaddleZeroDecrease, Event::PaddleZeroIncrease, Event::PaddleZeroAnalog, Event::PaddleZeroFire, | 
|---|
| 223 | Event::PaddleOneDecrease, Event::PaddleOneIncrease, Event::PaddleOneAnalog, Event::PaddleOneFire, | 
|---|
| 224 | }; | 
|---|
| 225 |  | 
|---|
| 226 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
|---|
| 227 | static const Event::EventSet RightPaddlesEvents = { | 
|---|
| 228 | Event::PaddleTwoDecrease, Event::PaddleTwoIncrease, Event::PaddleTwoAnalog, Event::PaddleTwoFire, | 
|---|
| 229 | Event::PaddleThreeDecrease, Event::PaddleThreeIncrease, Event::PaddleThreeAnalog, Event::PaddleThreeFire, | 
|---|
| 230 | }; | 
|---|
| 231 |  | 
|---|
| 232 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
|---|
| 233 | static const Event::EventSet LeftKeypadEvents = { | 
|---|
| 234 | Event::KeyboardZero1, Event::KeyboardZero2, Event::KeyboardZero3, | 
|---|
| 235 | Event::KeyboardZero4, Event::KeyboardZero5, Event::KeyboardZero6, | 
|---|
| 236 | Event::KeyboardZero7, Event::KeyboardZero8, Event::KeyboardZero9, | 
|---|
| 237 | Event::KeyboardZeroStar, Event::KeyboardZero0, Event::KeyboardZeroPound, | 
|---|
| 238 | }; | 
|---|
| 239 |  | 
|---|
| 240 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
|---|
| 241 | static const Event::EventSet RightKeypadEvents = { | 
|---|
| 242 | Event::KeyboardOne1, Event::KeyboardOne2, Event::KeyboardOne3, | 
|---|
| 243 | Event::KeyboardOne4, Event::KeyboardOne5, Event::KeyboardOne6, | 
|---|
| 244 | Event::KeyboardOne7, Event::KeyboardOne8, Event::KeyboardOne9, | 
|---|
| 245 | Event::KeyboardOneStar, Event::KeyboardOne0, Event::KeyboardOnePound, | 
|---|
| 246 | }; | 
|---|
| 247 |  | 
|---|
| 248 | #endif | 
|---|
| 249 |  | 
|---|