From b020cb2f988f7a2e5dc2538b7ecfbd95bd6f6684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Wed, 1 Jul 2020 15:58:24 +0200 Subject: [PATCH] [ion/simulator] Add haptic feedback --- ion/include/ion/events.h | 1 + ion/src/device/shared/Makefile | 1 + ion/src/device/shared/events.cpp | 10 +++++ ion/src/shared/events_keyboard.cpp | 1 + ion/src/simulator/Makefile | 1 + ion/src/simulator/android/Makefile | 1 + ion/src/simulator/ios/Makefile | 1 + ion/src/simulator/linux/Makefile | 1 + ion/src/simulator/macos/Makefile | 1 + ion/src/simulator/shared/dummy/haptics.cpp | 19 ++++++++++ ion/src/simulator/shared/events.cpp | 13 +++++++ ion/src/simulator/shared/haptics.cpp | 44 ++++++++++++++++++++++ ion/src/simulator/shared/haptics.h | 16 ++++++++ ion/src/simulator/shared/main_sdl.cpp | 9 ++++- ion/src/simulator/web/Makefile | 1 + ion/src/simulator/windows/Makefile | 1 + 16 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 ion/src/device/shared/events.cpp create mode 100644 ion/src/simulator/shared/dummy/haptics.cpp create mode 100644 ion/src/simulator/shared/events.cpp create mode 100644 ion/src/simulator/shared/haptics.cpp create mode 100644 ion/src/simulator/shared/haptics.h diff --git a/ion/include/ion/events.h b/ion/include/ion/events.h index fa7db1e3f..a76a80f0c 100644 --- a/ion/include/ion/events.h +++ b/ion/include/ion/events.h @@ -60,6 +60,7 @@ bool isLockActive(); void setLongRepetition(bool longRepetition); bool isLongRepetition(); void updateModifiersFromEvent(Event e); +void didPressNewKey(); // Used for haptic feedback on simulators // Plain diff --git a/ion/src/device/shared/Makefile b/ion/src/device/shared/Makefile index d13ec99b6..2db3b7db4 100644 --- a/ion/src/device/shared/Makefile +++ b/ion/src/device/shared/Makefile @@ -3,5 +3,6 @@ include ion/src/device/shared/usb/Makefile include ion/src/device/shared/drivers/Makefile ion_device_src += $(addprefix ion/src/device/shared/, \ + events.cpp \ stack.cpp \ ) diff --git a/ion/src/device/shared/events.cpp b/ion/src/device/shared/events.cpp new file mode 100644 index 000000000..6eab2b3fc --- /dev/null +++ b/ion/src/device/shared/events.cpp @@ -0,0 +1,10 @@ +#include + +namespace Ion { +namespace Events { + +void didPressNewKey() { +} + +} +} diff --git a/ion/src/shared/events_keyboard.cpp b/ion/src/shared/events_keyboard.cpp index f9535dae3..ad356b126 100644 --- a/ion/src/shared/events_keyboard.cpp +++ b/ion/src/shared/events_keyboard.cpp @@ -65,6 +65,7 @@ Event getEvent(int * timeout) { if (keysSeenTransitionningFromUpToDown != 0) { sEventIsRepeating = false; resetLongRepetition(); + didPressNewKey(); /* The key that triggered the event corresponds to the first non-zero bit * in "match". This is a rather simple logic operation for the which many * processors have an instruction (ARM thumb uses CLZ). diff --git a/ion/src/simulator/Makefile b/ion/src/simulator/Makefile index 9ea96074d..cab9b80e5 100644 --- a/ion/src/simulator/Makefile +++ b/ion/src/simulator/Makefile @@ -11,6 +11,7 @@ ion_src += $(addprefix ion/src/simulator/shared/, \ console_stdio.cpp:-consoledisplay \ crc32.cpp \ display.cpp:-headless \ + events.cpp \ events_keyboard.cpp:-headless \ events_stdin.cpp:+headless \ framebuffer_base.cpp \ diff --git a/ion/src/simulator/android/Makefile b/ion/src/simulator/android/Makefile index d3fb36236..db1f2c006 100644 --- a/ion/src/simulator/android/Makefile +++ b/ion/src/simulator/android/Makefile @@ -5,6 +5,7 @@ ion_src += $(addprefix ion/src/simulator/android/src/cpp/, \ ion_src += $(addprefix ion/src/simulator/shared/, \ dummy/callback.cpp \ dummy/language.cpp \ + haptics.cpp \ ) ion_src += ion/src/shared/collect_registers.cpp diff --git a/ion/src/simulator/ios/Makefile b/ion/src/simulator/ios/Makefile index 334e1d4d1..fa14dc461 100644 --- a/ion/src/simulator/ios/Makefile +++ b/ion/src/simulator/ios/Makefile @@ -5,6 +5,7 @@ ion_src += $(addprefix ion/src/simulator/ios/, \ ion_src += $(addprefix ion/src/simulator/shared/, \ apple/language.m \ dummy/callback.cpp \ + haptics.cpp \ ) ion_src += ion/src/shared/collect_registers.cpp diff --git a/ion/src/simulator/linux/Makefile b/ion/src/simulator/linux/Makefile index aa8500471..a7bd38c3a 100644 --- a/ion/src/simulator/linux/Makefile +++ b/ion/src/simulator/linux/Makefile @@ -15,6 +15,7 @@ ion_src += $(addprefix ion/src/simulator/linux/, \ ion_src += $(addprefix ion/src/simulator/shared/, \ dummy/callback.cpp \ + dummy/haptics.cpp \ collect_registers_x86_64.s \ collect_registers.cpp \ ) diff --git a/ion/src/simulator/macos/Makefile b/ion/src/simulator/macos/Makefile index b00459f75..4fc46018e 100644 --- a/ion/src/simulator/macos/Makefile +++ b/ion/src/simulator/macos/Makefile @@ -5,6 +5,7 @@ ion_src += $(addprefix ion/src/simulator/macos/, \ ion_src += $(addprefix ion/src/simulator/shared/, \ apple/language.m \ dummy/callback.cpp \ + dummy/haptics.cpp \ collect_registers_x86_64.s \ collect_registers.cpp \ ) diff --git a/ion/src/simulator/shared/dummy/haptics.cpp b/ion/src/simulator/shared/dummy/haptics.cpp new file mode 100644 index 000000000..d0010df7d --- /dev/null +++ b/ion/src/simulator/shared/dummy/haptics.cpp @@ -0,0 +1,19 @@ +#include "haptics.h" + +namespace Ion { +namespace Simulator { +namespace Haptics { + +void init() { +} + +void shutdown() { +} + +void perform() { +} + + +} +} +} diff --git a/ion/src/simulator/shared/events.cpp b/ion/src/simulator/shared/events.cpp new file mode 100644 index 000000000..04e35f9c8 --- /dev/null +++ b/ion/src/simulator/shared/events.cpp @@ -0,0 +1,13 @@ +#include +#include "haptics.h" +#include + +namespace Ion { +namespace Events { + +void didPressNewKey() { + Simulator::Haptics::perform(); +} + +} +} diff --git a/ion/src/simulator/shared/haptics.cpp b/ion/src/simulator/shared/haptics.cpp new file mode 100644 index 000000000..a4f45e31a --- /dev/null +++ b/ion/src/simulator/shared/haptics.cpp @@ -0,0 +1,44 @@ +#include "haptics.h" +#include + +namespace Ion { +namespace Simulator { +namespace Haptics { + +#if !EPSILON_SDL_SCREEN_ONLY +static SDL_Haptic * sSDLHaptic = nullptr; +#endif + +void init() { +#if !EPSILON_SDL_SCREEN_ONLY + if (SDL_Init(SDL_INIT_HAPTIC) == 0) { + sSDLHaptic = SDL_HapticOpen(0); + if (sSDLHaptic) { + if (SDL_HapticRumbleInit(sSDLHaptic) != 0) { + sSDLHaptic = nullptr; + } + } + } +#endif +} + +void shutdown() { +#if !EPSILON_SDL_SCREEN_ONLY + if (sSDLHaptic) { + SDL_HapticClose(sSDLHaptic); + } +#endif +} + +void perform() { +#if !EPSILON_SDL_SCREEN_ONLY + if (sSDLHaptic) { + SDL_HapticRumblePlay(sSDLHaptic, 1.0, 40); + } +#endif +} + + +} +} +} diff --git a/ion/src/simulator/shared/haptics.h b/ion/src/simulator/shared/haptics.h new file mode 100644 index 000000000..1a8f88378 --- /dev/null +++ b/ion/src/simulator/shared/haptics.h @@ -0,0 +1,16 @@ +#ifndef ION_SIMULATOR_HAPTICS_H +#define ION_SIMULATOR_HAPTICS_H + +namespace Ion { +namespace Simulator { +namespace Haptics { + +void init(); +void perform(); +void shutdown(); + +} +} +} + +#endif diff --git a/ion/src/simulator/shared/main_sdl.cpp b/ion/src/simulator/shared/main_sdl.cpp index 241b2495c..c75cdd233 100644 --- a/ion/src/simulator/shared/main_sdl.cpp +++ b/ion/src/simulator/shared/main_sdl.cpp @@ -1,9 +1,10 @@ #include "main.h" #include "display.h" -#include "platform.h" +#include "haptics.h" #if !EPSILON_SDL_SCREEN_ONLY #include "layout.h" #endif +#include "platform.h" #include "telemetry.h" #include "random.h" @@ -27,11 +28,17 @@ int main(int argc, char * argv[]) { arguments.push_back(language); } + // Init #if EPSILON_TELEMETRY Ion::Simulator::Telemetry::init(); #endif Ion::Simulator::Main::init(); + Ion::Simulator::Haptics::init(); + ion_main(arguments.size(), &arguments[0]); + + // Shutdown + Ion::Simulator::Haptics::shutdown(); Ion::Simulator::Main::quit(); #if EPSILON_TELEMETRY Ion::Simulator::Telemetry::shutdown(); diff --git a/ion/src/simulator/web/Makefile b/ion/src/simulator/web/Makefile index 61a7641dc..66f8d8e80 100644 --- a/ion/src/simulator/web/Makefile +++ b/ion/src/simulator/web/Makefile @@ -20,6 +20,7 @@ ion_src += $(addprefix ion/src/simulator/web/, \ ion_src += $(addprefix ion/src/simulator/shared/, \ dummy/language.cpp \ + dummy/haptics.cpp \ ) ion_src += ion/src/shared/collect_registers.cpp diff --git a/ion/src/simulator/windows/Makefile b/ion/src/simulator/windows/Makefile index 50c6396ac..0a1913c6f 100644 --- a/ion/src/simulator/windows/Makefile +++ b/ion/src/simulator/windows/Makefile @@ -6,6 +6,7 @@ ion_src += $(addprefix ion/src/simulator/windows/, \ ion_src += $(addprefix ion/src/simulator/shared/, \ dummy/callback.cpp \ + dummy/haptics.cpp \ ) ion_src += ion/src/shared/collect_registers.cpp