Program Listing for File RTFunctionRegister.cpp

Return to documentation for file (include/input/linux/RT/RTFunctionRegister.cpp)

#include "Common_Features.hpp"
#include "Input_State.hpp"
#include "PDJE_Input_Device_Data.hpp"
#include "RTSocket.hpp"
#include <filesystem>
#include <iconv.h>
#include <iostream>
#include <string>
#include <unistd.h>

namespace fs = std::filesystem;
void
RTSocket::RegisterFunctions()
{
    functionRegistry["GET_DEV"] = [this](const data_body &data) {
        auto      devs = ListDevices();
        data_body db;
        for (const auto &dev : devs) {
            db.push_back(dev.Name);
            // db.push_back(dev.Type);
            // todo- change this
        }

        int sendFlag = Common_Features::LPSend(
            importants.host_socket, Common_Features::MakeMSG("GET_DEV", db));
        if (sendFlag < 0) {
            return sendFlag;
        }
        return 0;
    };

    functionRegistry["END_SOCKET"] = [this](const data_body &data) {
        std::cout << "got end socket" << std::endl;
        Common_Features::LPSend(
            importants.host_socket,
            Common_Features::MakeMSG("END_SOCKET", "Ended Ready Loop"));
        return 1;
    };

    functionRegistry["SET_DEV"] = [this](const data_body &data) {
        if (data.empty()) {
            return int(PDJE_RT_ERROR::FAILED_TO_SET_DEV__INVALID_DATA);
        }
        for (auto &name : data) {
            rtev->Add(stored_dev_path[name]);
        }

        Common_Features::LPSend(
            importants.host_socket,
            Common_Features::MakeMSG("SET_DEV", "Added Device."));
        return 0;
    };
    functionRegistry["RESET_DEV"] = [this](const data_body &data) {
        rtev->Reset();

        Common_Features::LPSend(
            importants.host_socket,
            Common_Features::MakeMSG("RESET_DEV", "Reset Added Devices."));
        return 0;
    };
}

DEV_LIST
RTSocket::ListDevices()
{
    DEV_LIST lsdev;
    fs::path device_root("/dev/input/");
    for (const auto &dev : fs::directory_iterator(device_root)) {
        if (!dev.is_character_file()) {
            continue;
        }

        const std::string dev_path = dev.path().string();
        if (dev_path.find("event") == std::string::npos) {
            continue;
        }

        int FD = open(dev_path.c_str(), O_RDONLY | O_NONBLOCK);

        if (FD < 0) {
            continue;
        }
        libevdev  *info = nullptr;
        DeviceData dd;
        if (libevdev_new_from_fd(FD, &info) == 0) {
            const char *dev_name = libevdev_get_name(info);
            if (dev_name) {

                dd.Name = std::string(dev_name);

                if (!stored_dev_path.contains(dd.Name)) {
                    stored_dev_path[dd.Name] = dev.path();
                }

                if (libevdev_has_event_type(info, EV_KEY) &&
                    libevdev_has_event_code(info, EV_KEY, KEY_A) &&
                    libevdev_has_event_code(info, EV_KEY, KEY_SPACE) &&
                    libevdev_has_event_code(info, EV_KEY, KEY_ENTER)) {
                    dd.Type = PDJE_Dev_Type::KEYBOARD;
                } else if (libevdev_has_event_type(info, EV_REL) &&
                           libevdev_has_event_code(info, EV_REL, REL_X) &&
                           libevdev_has_event_code(info, EV_REL, REL_Y)) {
                    dd.Type = PDJE_Dev_Type::MOUSE;
                } else if (libevdev_has_event_type(info, EV_ABS) &&
                           (libevdev_has_event_code(
                                info, EV_KEY, BTN_GAMEPAD) ||
                            libevdev_has_event_code(
                                info, EV_KEY, BTN_JOYSTICK))) {
                    dd.Type = PDJE_Dev_Type::HID;
                } else if (libevdev_has_event_type(info, EV_ABS) &&
                           libevdev_has_event_code(info, EV_KEY, BTN_TOUCH)) {
                    dd.Type = PDJE_Dev_Type::MOUSE;
                } else {
                    dd.Type = PDJE_Dev_Type::HID;
                }
                lsdev.push_back(dd);
            }
            libevdev_free(info);
            close(FD);
        } else {
            close(FD);
            continue;
        }
    }
    return lsdev;
}