diff --git a/CMakeLists.txt b/CMakeLists.txt index 73af9c0..8994b12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ find_package(Modelec COMPONENTS add_executable(GameController main.cpp - GameControllerHandler.h) + GameControllerHandler.cpp) target_link_libraries(GameController ${SDL2_LIBRARIES}) target_link_libraries(GameController Modelec::TCPClient Modelec::Utils Modelec::CLParser) diff --git a/GameControllerHandler.cpp b/GameControllerHandler.cpp index 86b3f98..1dc9160 100644 --- a/GameControllerHandler.cpp +++ b/GameControllerHandler.cpp @@ -1 +1,129 @@ #include "GameControllerHandler.h" + +GameControllerHandler::GameControllerHandler(const char *ip, int port) : TCPClient(ip, port), controller(nullptr) {} + +bool GameControllerHandler::init() { + if (SDL_Init(SDL_INIT_GAMECONTROLLER) != 0) { + std::cerr << "SDL initialization failed: " << SDL_GetError() << std::endl; + return false; + } + if (!SDL_IsGameController(0)) { + std::cerr << "No compatible controllers connected.\n"; + return false; + } + controller = SDL_GameControllerOpen(0); + if (controller == nullptr) { + std::cerr << "Failed to open game controller: " << SDL_GetError() << std::endl; + return false; + } + return true; +} + +void GameControllerHandler::start() { + TCPClient::start(); + + std::thread t(&GameControllerHandler::handleEvents, this); + t.detach(); + + this->sendMessage("gc;strat;ready;1\n"); +} + +void GameControllerHandler::handleMessage(const std::string &message) { + std::vector tokens = Modelec::split(message, ";"); + + if (tokens[1] == "all" || tokens[1] == "lidar") { + if (tokens[2] == "set range") { + this->lidarDectectionDistance = stod(tokens[3]); + } + } + + if (tokens[1] == "all" || tokens[1] == "gc") { + if (tokens[2] == "stop proximity") { + std::vector args = Modelec::split(tokens[3], ","); + double distance = stod(args[0]); + Uint16 strength; + + if (distance <= 100) { + strength = 0xFFFF; + } else if (distance <= 500) { + double factor = 1 - Modelec::mapValue(distance, 100.0, this->lidarDectectionDistance, 0.0, 1.0); + strength = static_cast(factor * 0xFFFF); + } else { + strength = 0; + } + + if (SDL_GameControllerRumble(controller, strength, strength, 1000) != 0) { + std::cerr << "Erreur lors de l'activation de la vibration : " << SDL_GetError() << std::endl; + } + } + + if (tokens[2] == "ready") { + this->sendMessage("gc;all;game mode;gc\n"); + } + } +} + +void GameControllerHandler::handleEvents() { + while (running) { + SDL_Event event; + while (SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_QUIT: + running = false; + this->sendMessage("gc;strat;disconnect;1\n"); + break; + case SDL_CONTROLLERAXISMOTION: + if (event.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERLEFT) { + // std::cout << "Trigger left moved to " << event.caxis.value << std::endl; + this->sendMessage("gc;strat;trigger;0," + std::to_string(event.caxis.value) + "\n"); + } else if (event.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT) { + // std::cout << "Trigger right moved to " << event.caxis.value << std::endl; + this->sendMessage("gc;strat;trigger;1," + std::to_string(event.caxis.value) + "\n"); + } + else if (event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX) { + // std::cout << "Left X axis moved to " << event.caxis.value << std::endl; + this->sendMessage("gc;strat;axis;0," + std::to_string(event.caxis.value) + "\n"); + } + else if (event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTY) { + std::cout << "Left Y axis moved to " << event.caxis.value << std::endl; + this->sendMessage("gc;strat;axis;1," + std::to_string(event.caxis.value) + "\n"); + } + else if (event.caxis.axis == SDL_CONTROLLER_AXIS_RIGHTX) { + // std::cout << "Right X axis moved to " << event.caxis.value << std::endl; + this->sendMessage("gc;strat;axis;2," + std::to_string(event.caxis.value) + "\n"); + } + else if (event.caxis.axis == SDL_CONTROLLER_AXIS_RIGHTY) { + // std::cout << "Right Y axis moved to " << event.caxis.value << std::endl; + // this->sendMessage("gc;strat;axis;3," + std::to_string(event.caxis.value) + "\n"); + } + break; + case SDL_CONTROLLERBUTTONDOWN: + // std::cout << "Button down " << static_cast(event.cbutton.button) << std::endl; + this->sendMessage("gc;strat;button down;" + std::to_string(event.cbutton.button) + "\n"); + break; + case SDL_CONTROLLERBUTTONUP: + // std::cout << "Button up " << static_cast(event.cbutton.button) << std::endl; + this->sendMessage("gc;strat;button up;" + std::to_string(event.cbutton.button) + "\n"); + break; + default: + break; + } + } + } +} + +void GameControllerHandler::closeController() { + if (controller != nullptr) { + SDL_GameControllerClose(controller); + controller = nullptr; + } +} + +void GameControllerHandler::close() { + closeController(); +} + +GameControllerHandler::~GameControllerHandler() { + close(); + SDL_Quit(); +} \ No newline at end of file diff --git a/GameControllerHandler.h b/GameControllerHandler.h index 33c43b3..789672f 100644 --- a/GameControllerHandler.h +++ b/GameControllerHandler.h @@ -8,131 +8,21 @@ class GameControllerHandler : public TCPClient { public: - explicit GameControllerHandler(const char* ip = "127.0.0.1", int port = 8080) : TCPClient(ip, port), controller(nullptr) {} + explicit GameControllerHandler(const char* ip = "127.0.0.1", int port = 8080); - bool init() { - if (SDL_Init(SDL_INIT_GAMECONTROLLER) != 0) { - std::cerr << "SDL initialization failed: " << SDL_GetError() << std::endl; - return false; - } - if (!SDL_IsGameController(0)) { - std::cerr << "No compatible controllers connected.\n"; - return false; - } - controller = SDL_GameControllerOpen(0); - if (controller == nullptr) { - std::cerr << "Failed to open game controller: " << SDL_GetError() << std::endl; - return false; - } - return true; - } + bool init(); - void start() { - TCPClient::start(); + void start(); - std::thread t(&GameControllerHandler::handleEvents, this); - t.detach(); - } + void handleMessage(const std::string &message) override; - void handleMessage(const std::string &message) override { - std::vector tokens = Modelec::split(message, ";"); + void handleEvents(); - if (tokens[1] == "all" || tokens[1] == "lidar") { - if (tokens[2] == "set range") { - this->lidarDectectionDistance = stod(tokens[3]); - } - } + void closeController(); - if (tokens[1] == "all" || tokens[1] == "gc") { - if (tokens[2] == "stop proximity") { - std::vector args = Modelec::split(tokens[3], ","); - double distance = stod(args[0]); - Uint16 strength; + void close(); - if (distance <= 100) { - strength = 0xFFFF; - } else if (distance <= 500) { - double factor = 1 - Modelec::mapValue(distance, 100.0, this->lidarDectectionDistance, 0.0, 1.0); - strength = static_cast(factor * 0xFFFF); - } else { - strength = 0; - } - - if (SDL_GameControllerRumble(controller, strength, strength, 1000) != 0) { - std::cerr << "Erreur lors de l'activation de la vibration : " << SDL_GetError() << std::endl; - } - } - - if (tokens[2] == "ready") { - this->sendMessage("gc;all;game mode;gc\n"); - } - } - } - - void handleEvents() { - while (running) { - SDL_Event event; - while (SDL_PollEvent(&event)) { - switch (event.type) { - case SDL_QUIT: - running = false; - this->sendMessage("gc;strat;disconnect;1\n"); - break; - case SDL_CONTROLLERAXISMOTION: - if (event.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERLEFT) { - // std::cout << "Trigger left moved to " << event.caxis.value << std::endl; - this->sendMessage("gc;strat;trigger;0," + std::to_string(event.caxis.value) + "\n"); - } else if (event.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT) { - // std::cout << "Trigger right moved to " << event.caxis.value << std::endl; - this->sendMessage("gc;strat;trigger;1," + std::to_string(event.caxis.value) + "\n"); - } - else if (event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX) { - // std::cout << "Left X axis moved to " << event.caxis.value << std::endl; - this->sendMessage("gc;strat;axis;0," + std::to_string(event.caxis.value) + "\n"); - } - else if (event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTY) { - std::cout << "Left Y axis moved to " << event.caxis.value << std::endl; - this->sendMessage("gc;strat;axis;1," + std::to_string(event.caxis.value) + "\n"); - } - else if (event.caxis.axis == SDL_CONTROLLER_AXIS_RIGHTX) { - // std::cout << "Right X axis moved to " << event.caxis.value << std::endl; - this->sendMessage("gc;strat;axis;2," + std::to_string(event.caxis.value) + "\n"); - } - else if (event.caxis.axis == SDL_CONTROLLER_AXIS_RIGHTY) { - // std::cout << "Right Y axis moved to " << event.caxis.value << std::endl; - // this->sendMessage("gc;strat;axis;3," + std::to_string(event.caxis.value) + "\n"); - } - break; - case SDL_CONTROLLERBUTTONDOWN: - // std::cout << "Button down " << static_cast(event.cbutton.button) << std::endl; - this->sendMessage("gc;strat;button down;" + std::to_string(event.cbutton.button) + "\n"); - break; - case SDL_CONTROLLERBUTTONUP: - // std::cout << "Button up " << static_cast(event.cbutton.button) << std::endl; - this->sendMessage("gc;strat;button up;" + std::to_string(event.cbutton.button) + "\n"); - break; - default: - break; - } - } - } - } - - void closeController() { - if (controller != nullptr) { - SDL_GameControllerClose(controller); - controller = nullptr; - } - } - - void close() { - closeController(); - } - - ~GameControllerHandler() { - close(); - SDL_Quit(); - } + ~GameControllerHandler(); private: SDL_GameController* controller; diff --git a/main.cpp b/main.cpp index 3874a43..8c680b2 100644 --- a/main.cpp +++ b/main.cpp @@ -27,8 +27,6 @@ int main(int argc, char* argv[]) { gameControllerHandler.start(); - gameControllerHandler.sendMessage("gc;strat;ready;1\n"); - while (!shouldStop && !gameControllerHandler.shouldStop()) { usleep(500'000); }