mirror of
https://github.com/modelec/GameController.git
synced 2026-01-18 16:47:32 +01:00
Usage of .cpp file
This commit is contained in:
@@ -15,7 +15,7 @@ find_package(Modelec COMPONENTS
|
|||||||
|
|
||||||
add_executable(GameController
|
add_executable(GameController
|
||||||
main.cpp
|
main.cpp
|
||||||
GameControllerHandler.h)
|
GameControllerHandler.cpp)
|
||||||
|
|
||||||
target_link_libraries(GameController ${SDL2_LIBRARIES})
|
target_link_libraries(GameController ${SDL2_LIBRARIES})
|
||||||
target_link_libraries(GameController Modelec::TCPClient Modelec::Utils Modelec::CLParser)
|
target_link_libraries(GameController Modelec::TCPClient Modelec::Utils Modelec::CLParser)
|
||||||
|
|||||||
@@ -1 +1,129 @@
|
|||||||
#include "GameControllerHandler.h"
|
#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<std::string> 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<std::string> 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<Uint16>(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<int>(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<int>(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();
|
||||||
|
}
|
||||||
@@ -8,131 +8,21 @@
|
|||||||
|
|
||||||
class GameControllerHandler : public TCPClient {
|
class GameControllerHandler : public TCPClient {
|
||||||
public:
|
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() {
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
void start() {
|
void start();
|
||||||
TCPClient::start();
|
|
||||||
|
|
||||||
std::thread t(&GameControllerHandler::handleEvents, this);
|
void handleMessage(const std::string &message) override;
|
||||||
t.detach();
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleMessage(const std::string &message) override {
|
void handleEvents();
|
||||||
std::vector<std::string> tokens = Modelec::split(message, ";");
|
|
||||||
|
|
||||||
if (tokens[1] == "all" || tokens[1] == "lidar") {
|
void closeController();
|
||||||
if (tokens[2] == "set range") {
|
|
||||||
this->lidarDectectionDistance = stod(tokens[3]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tokens[1] == "all" || tokens[1] == "gc") {
|
void close();
|
||||||
if (tokens[2] == "stop proximity") {
|
|
||||||
std::vector<std::string> args = Modelec::split(tokens[3], ",");
|
|
||||||
double distance = stod(args[0]);
|
|
||||||
Uint16 strength;
|
|
||||||
|
|
||||||
if (distance <= 100) {
|
~GameControllerHandler();
|
||||||
strength = 0xFFFF;
|
|
||||||
} else if (distance <= 500) {
|
|
||||||
double factor = 1 - Modelec::mapValue(distance, 100.0, this->lidarDectectionDistance, 0.0, 1.0);
|
|
||||||
strength = static_cast<Uint16>(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<int>(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<int>(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();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SDL_GameController* controller;
|
SDL_GameController* controller;
|
||||||
|
|||||||
2
main.cpp
2
main.cpp
@@ -27,8 +27,6 @@ int main(int argc, char* argv[]) {
|
|||||||
|
|
||||||
gameControllerHandler.start();
|
gameControllerHandler.start();
|
||||||
|
|
||||||
gameControllerHandler.sendMessage("gc;strat;ready;1\n");
|
|
||||||
|
|
||||||
while (!shouldStop && !gameControllerHandler.shouldStop()) {
|
while (!shouldStop && !gameControllerHandler.shouldStop()) {
|
||||||
usleep(500'000);
|
usleep(500'000);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user