From 8f7eac4fde8596499430d3cc1824be9769125f3d Mon Sep 17 00:00:00 2001 From: Miku AuahDark Date: Mon, 5 Dec 2022 13:31:47 +0800 Subject: [PATCH] Initial sensor module. --- CMakeLists.txt | 25 ++++++ src/common/Module.h | 1 + src/modules/sensor/Sensor.cpp | 37 ++++++++ src/modules/sensor/Sensor.h | 81 +++++++++++++++++ src/modules/sensor/sdl/Sensor.cpp | 134 +++++++++++++++++++++++++++++ src/modules/sensor/sdl/Sensor.h | 63 ++++++++++++++ src/modules/sensor/wrap_Sensor.cpp | 19 ++++ src/modules/sensor/wrap_Sensor.h | 37 ++++++++ 8 files changed, 397 insertions(+) create mode 100644 src/modules/sensor/Sensor.cpp create mode 100644 src/modules/sensor/Sensor.h create mode 100644 src/modules/sensor/sdl/Sensor.cpp create mode 100644 src/modules/sensor/sdl/Sensor.h create mode 100644 src/modules/sensor/wrap_Sensor.cpp create mode 100644 src/modules/sensor/wrap_Sensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 996d9bc6f..c4ee78f68 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -907,6 +907,30 @@ set(LOVE_SRC_MODULE_PHYSICS source_group("modules\\physics" FILES ${LOVE_SRC_MODULE_PHYSICS_ROOT}) source_group("modules\\physics\\box2d" FILES ${LOVE_SRC_MODULE_PHYSICS_BOX2D}) +# +# love.sensor +# + +set(LOVE_SRC_MODULE_SENSOR_ROOT + src/modules/sensor/Sensor.cpp + src/modules/sensor/Sensor.h + src/modules/sensor/wrap_Sensor.cpp + src/modules/sensor/wrap_Sensor.h +) + +set(LOVE_SRC_MODULE_SENSOR_SDL + src/modules/sensor/sdl/Sensor.cpp + src/modules/sensor/sdl/Sensor.h +) + +set(LOVE_SRC_MODULE_SENSOR + ${LOVE_SRC_MODULE_SENSOR_ROOT} + ${LOVE_SRC_MODULE_SENSOR_SDL} +) + +source_group("modules\\sensor" FILES ${LOVE_SRC_MODULE_SENSOR_ROOT}) +source_group("modules\\sensor\\sdl" FILES ${LOVE_SRC_MODULE_SENSOR_SDL}) + # # love.sound # @@ -1881,6 +1905,7 @@ set(LOVE_LIB_SRC ${LOVE_SRC_MODULE_MATH} ${LOVE_SRC_MODULE_MOUSE} ${LOVE_SRC_MODULE_PHYSICS} + ${LOVE_SRC_MODULE_SENSOR} ${LOVE_SRC_MODULE_SOUND} ${LOVE_SRC_MODULE_SYSTEM} ${LOVE_SRC_MODULE_THREAD} diff --git a/src/common/Module.h b/src/common/Module.h index c7cd4ca0a..013b3e6e2 100644 --- a/src/common/Module.h +++ b/src/common/Module.h @@ -51,6 +51,7 @@ public: M_MATH, M_MOUSE, M_PHYSICS, + M_SENSOR, M_SOUND, M_SYSTEM, M_THREAD, diff --git a/src/modules/sensor/Sensor.cpp b/src/modules/sensor/Sensor.cpp new file mode 100644 index 000000000..f6a56ac95 --- /dev/null +++ b/src/modules/sensor/Sensor.cpp @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2006-2022 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +// LOVE +#include "Sensor.h" + +namespace love +{ +namespace sensor +{ + +STRINGMAP_CLASS_BEGIN(Sensor, Sensor::SensorType, Sensor::SENSOR_MAX_ENUM, sensorType) +{ + { "accelerometer", Sensor::SENSOR_ACCELEROMETER }, + { "gyroscope", Sensor::SENSOR_GYROSCOPE }, +} +STRINGMAP_CLASS_END(Sensor, Sensor::SensorType, Sensor::SENSOR_MAX_ENUM, sensorType) + +} // sensor +} // love diff --git a/src/modules/sensor/Sensor.h b/src/modules/sensor/Sensor.h new file mode 100644 index 000000000..9b6b64cff --- /dev/null +++ b/src/modules/sensor/Sensor.h @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2006-2022 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_SENSOR_H +#define LOVE_SENSOR_H + + // LOVE +#include "common/Module.h" +#include "common/StringMap.h" + +namespace love +{ +namespace sensor +{ + +class Sensor: public Module +{ +public: + + enum SensorType + { + SENSOR_ACCELEROMETER, + SENSOR_GYROSCOPE, + SENSOR_MAX_ENUM + }; + + virtual ~Sensor() {} + + // Implements Module. + ModuleType getModuleType() const override { return M_SENSOR; } + + /** + * Check the availability of the sensor. + **/ + virtual bool isAvailable(SensorType type) = 0; + + /** + * Check if the sensor is enabled. + **/ + virtual bool isEnabled(SensorType type) = 0; + + /** + * Enable or disable a sensor. + **/ + virtual void setEnabled(SensorType type, bool enabled) = 0; + + /** + * Get data from sensor. + **/ + virtual std::vector getData(SensorType type) = 0; + + /** + * Get backend-dependent handle of sensor. + **/ + virtual std::vector getHandles() = 0; + + STRINGMAP_CLASS_DECLARE(SensorType); + +}; // Sensor + +} // sensor +} // love + +#endif diff --git a/src/modules/sensor/sdl/Sensor.cpp b/src/modules/sensor/sdl/Sensor.cpp new file mode 100644 index 000000000..d49c21d26 --- /dev/null +++ b/src/modules/sensor/sdl/Sensor.cpp @@ -0,0 +1,134 @@ +/** + * Copyright (c) 2006-2022 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +// LOVE +#include "Sensor.h" + +// SDL +#include +#include + +namespace love +{ +namespace sensor +{ +namespace sdl +{ + +Sensor::Sensor() +: sensors() +{ + if (SDL_InitSubSystem(SDL_INIT_SENSOR) < 0) + throw love::Exception("Could not initialize SDL sensor subsystem (%s)", SDL_GetError()); +} + +Sensor::~Sensor() +{ + SDL_QuitSubSystem(SDL_INIT_SENSOR); +} + +bool Sensor::isAvailable(SensorType type) +{ + for (int i = 0; i < SDL_NumSensors(); i++) + { + if (convert(SDL_SensorGetDeviceType(i)) == type) + return true; + } + + return false; +} + +bool Sensor::isEnabled(SensorType type) +{ + return sensors[type]; // nullptr is default +} + +void Sensor::setEnabled(SensorType type, bool enable) +{ + if (sensors[type] && !enable) + { + SDL_SensorClose(sensors[type]); + sensors[type] = nullptr; + } + else if (sensors[type] == nullptr && enable) + { + for (int i = 0; i < SDL_NumSensors(); i++) + { + if (convert(SDL_SensorGetDeviceType(i)) == type) + { + SDL_Sensor *sensorHandle = SDL_SensorOpen(i); + + if (sensorHandle == nullptr) + { + const char *name = nullptr; + getConstant(type, name); + + throw love::Exception("Could not open \"%s\" SDL sensor (%s)", name, SDL_GetError()); + } + + sensors[type] = sensorHandle; + } + } + } +} + +std::vector Sensor::getData(SensorType type) +{ + if (sensors[type] == nullptr) + { + const char *name = nullptr; + getConstant(type, name); + + throw love::Exception("\"%s\" sensor is not enabled", name); + } + + std::vector values; + values.resize(3); + + SDL_SensorGetData(sensors[type], values.data(), 3); + return values; +} + +std::vector Sensor::getHandles() +{ + std::vector nativeSensor; + + for (const std::pair &data: sensors) + nativeSensor.push_back(data.second); + + return nativeSensor; +} + +Sensor::SensorType Sensor::convert(SDL_SensorType type) +{ + switch (type) + { + case SDL_SENSOR_ACCEL: + return SENSOR_ACCELEROMETER; + case SDL_SENSOR_GYRO: + return SENSOR_GYROSCOPE; + default: + return SENSOR_MAX_ENUM; + } +} + +} +} +} diff --git a/src/modules/sensor/sdl/Sensor.h b/src/modules/sensor/sdl/Sensor.h new file mode 100644 index 000000000..6f443c99c --- /dev/null +++ b/src/modules/sensor/sdl/Sensor.h @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2006-2022 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_SENSOR_SDL_SENSOR_H +#define LOVE_SENSOR_SDL_SENSOR_H + +// LOVE +#include "sensor/Sensor.h" + +// SDL +#include + +// std +#include + +namespace love +{ +namespace sensor +{ +namespace sdl +{ + +class Sensor : public love::sensor::Sensor +{ +public: + Sensor(); + ~Sensor() override; + + bool isAvailable(SensorType type) override; + bool isEnabled(SensorType type) override; + void setEnabled(SensorType type, bool enable) override; + std::vector getData(SensorType type) override; + std::vector getHandles() override; + +private: + std::map sensors; + + static SensorType convert(SDL_SensorType type); + +}; // Sensor + +} // sdl +} // sensor +} // love + +#endif diff --git a/src/modules/sensor/wrap_Sensor.cpp b/src/modules/sensor/wrap_Sensor.cpp new file mode 100644 index 000000000..135de3e6f --- /dev/null +++ b/src/modules/sensor/wrap_Sensor.cpp @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2006-2022 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ diff --git a/src/modules/sensor/wrap_Sensor.h b/src/modules/sensor/wrap_Sensor.h new file mode 100644 index 000000000..05d9f49d0 --- /dev/null +++ b/src/modules/sensor/wrap_Sensor.h @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2006-2022 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_WRAP_SENSOR_H +#define LOVE_WRAP_SENSOR_H + + // LOVE +#include "common/runtime.h" + +namespace love +{ +namespace sensor +{ + +extern "C" LOVE_EXPORT int luaopen_love_sensor(lua_State *L); + +} // sensor +} // love + +#endif