| 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 | |