diff --git a/CMakeLists.txt b/CMakeLists.txt index 54aa180..5bf77b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,13 @@ set(ROGUE_EXECUTABLE_NAME "rogue-enemy") set(STRAY_EXECUTABLE_NAME "stray-ally") set(ALLINONE_EXECUTABLE_NAME "allynone") +find_package(PkgConfig REQUIRED) # Include functions provided by PkgConfig module. + +pkg_check_modules(DBUS REQUIRED dbus-1) # This calls pkgconfig with appropriate arguments +# Use results of pkg_check_modules() call. +include_directories(${DBUS_INCLUDE_DIRS}) +link_directories(${DBUS_LIBRARY_DIRS}) + set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) @@ -64,7 +71,7 @@ add_executable(${ALLINONE_EXECUTABLE_NAME} set_property(TARGET ${ALLINONE_EXECUTABLE_NAME} PROPERTY C_STANDARD 17) -target_link_libraries(${ALLINONE_EXECUTABLE_NAME} PRIVATE Threads::Threads -levdev -ludev -lconfig -lm -lz) +target_link_libraries(${ALLINONE_EXECUTABLE_NAME} PRIVATE Threads::Threads ${DBUS_LIBRARIES} -levdev -ludev -lconfig -lm -lz) set_target_properties(${ALLINONE_EXECUTABLE_NAME} PROPERTIES LINKER_LANGUAGE C) @@ -72,7 +79,7 @@ install(TARGETS ${ALLINONE_EXECUTABLE_NAME} DESTINATION bin) set_property(TARGET ${ROGUE_EXECUTABLE_NAME} PROPERTY C_STANDARD 17) -target_link_libraries(${ROGUE_EXECUTABLE_NAME} PRIVATE Threads::Threads -levdev -ludev -lconfig -lm) +target_link_libraries(${ROGUE_EXECUTABLE_NAME} PRIVATE Threads::Threads ${DBUS_LIBRARIES} -levdev -ludev -lconfig -lm) set_target_properties(${ROGUE_EXECUTABLE_NAME} PROPERTIES LINKER_LANGUAGE C) diff --git a/rog_ally.c b/rog_ally.c index 7de3eea..70843bb 100644 --- a/rog_ally.c +++ b/rog_ally.c @@ -3,8 +3,6 @@ #include "dev_hidraw.h" #include "message.h" #include "xbox360.h" -#include -#include enum rc71l_leds_mode { ROG_ALLY_MODE_STATIC = 0, @@ -49,10 +47,24 @@ typedef struct rc71l_asus_kbd_user_data { struct udev *udev; } rc71l_asus_kbd_user_data_t; +typedef struct rc71l_timer_user_data { + struct rc71l_platform* parent; + +} rc71l_timer_user_data_t; + +rc71l_timer_user_data_t timer_user_data; + typedef struct rc71l_platform { rc71l_asus_kbd_user_data_t* kbd_user_data; rc71l_xbox360_user_data_t* xbox360_user_data; + + rc71l_timer_user_data_t* timer_data; + + DBusError dbus_error; + + DBusConnection * dbus_conn; + } rc71l_platform_t; static rc71l_asus_kbd_user_data_t asus_userdata = {}; @@ -81,6 +93,8 @@ static rc71l_xbox360_user_data_t controller_user_data = { static rc71l_platform_t hw_platform = { .kbd_user_data = &asus_userdata, .xbox360_user_data = &controller_user_data, + .timer_data = &timer_user_data, + .dbus_conn = NULL, }; static char* find_kernel_sysfs_device_path(struct udev *udev) { @@ -1118,6 +1132,7 @@ static int rc71l_platform_init(const dev_in_settings_t *const conf, void** platf // setup asus keyboard(s) user_data platform->kbd_user_data->parent = platform; platform->xbox360_user_data->parent = platform; + platform->timer_data->parent = platform; platform->kbd_user_data->udev = udev_new(); if (platform->kbd_user_data->udev == NULL) { fprintf(stderr, "Unable to initialize udev\n"); @@ -1125,6 +1140,8 @@ static int rc71l_platform_init(const dev_in_settings_t *const conf, void** platf goto rc71l_platform_init_err; } + dbus_error_init(&platform->dbus_error); + res = 0; rc71l_platform_init_err: @@ -1134,8 +1151,13 @@ rc71l_platform_init_err: static void rc71l_platform_deinit(const dev_in_settings_t *const conf, void** platform_data) { rc71l_platform_t *const platform = (rc71l_platform_t *)(*platform_data); - if (platform->kbd_user_data != NULL) { - udev_unref(platform->kbd_user_data->udev); + if (platform_data != NULL) { + if (platform->kbd_user_data != NULL) { + udev_unref(platform->kbd_user_data->udev); + } + + // Close the D-Bus connection + dbus_connection_close(platform->dbus_conn); } *platform_data = NULL; @@ -1148,12 +1170,68 @@ static void rc71l_platform_deinit(const dev_in_settings_t *const conf, void** pl * pub static DBUS_IFACE: &str = "org.asuslinux.Daemon"; */ static int rc71l_platform_leds(const dev_in_settings_t *const conf, uint8_t r, uint8_t g, uint8_t b, void* platform_data) { + rc71l_platform_t *const platform = (rc71l_platform_t*)platform_data; + uint32_t new_brightness = (r << 24) | (g << 16) | (b << 8) | (3); + + if (platform_data == NULL) { + return 0; + } + + // Replace "org.asuslinux.Daemon" and "/org/asuslinux/Aura" with the actual service and object paths + const char *service_name = "org.asuslinux.Daemon"; + const char *object_path = "/org/asuslinux/Aura"; + const char *interface_name = "org.asuslinux.Aura"; + + // Replace "Brightness" with the actual property name + const char *property_name = "Brightness"; + + // Build the D-Bus message to set the property + DBusMessage *const message = dbus_message_new_method_call(service_name, object_path, interface_name, "SetProperty"); + if (!message) { + fprintf(stderr, "Error creating D-Bus message\n"); + return -ENOMEM; + } + + // Append the property name and the new value to the message + dbus_message_append_args(message, DBUS_TYPE_STRING, &property_name, DBUS_TYPE_UINT32, &new_brightness, DBUS_TYPE_INVALID); + + // Send the message + DBusMessage *reply = dbus_connection_send_with_reply_and_block(platform->dbus_conn, message, -1, &platform->dbus_error); + dbus_message_unref(message); + + if (!reply || dbus_error_is_set(&platform->dbus_error)) { + fprintf(stderr, "D-Bus method call error: %s\n", platform->dbus_error.message); + dbus_error_free(&platform->dbus_error); + return -EIO; + } + + // Handle the reply if needed + + return 0; } int rc71l_timer_map(const dev_in_settings_t *const conf, int timer_fd, uint64_t expirations, in_message_t *const messages, size_t messages_len, void* user_data) { + rc71l_timer_user_data_t *const timer_data = (rc71l_timer_user_data_t*)user_data; + rc71l_platform_t *const platform_data = timer_data->parent; + + if (platform_data == NULL) { + return 0; + } + + + // try to connect + if (platform_data->dbus_conn == NULL) { + platform_data->dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, &platform_data->dbus_error); + if (dbus_error_is_set(&platform_data->dbus_error)) { + fprintf(stderr, "DBus error connection : %s -- %s \n", platform_data->dbus_error.name, platform_data->dbus_error.message); + dbus_error_free(&platform_data->dbus_error); + return 0; + } + } + return 0; } @@ -1165,7 +1243,7 @@ input_dev_t timer_dev = { .ticktime_ms = 60, } }, - .user_data = NULL, + .user_data = &timer_user_data, .map = { .timer_callbacks = { .map_fn = rc71l_timer_map, @@ -1181,9 +1259,9 @@ input_dev_composite_t rc71l_composite = { &in_asus_kb_2_dev, &in_asus_kb_3_dev, //&nkey_dev, - //&timer_dev, + &timer_dev, }, - .dev_count = 5, + .dev_count = 6, .init_fn = rc71l_platform_init, .deinit_fn = rc71l_platform_deinit, .leds_fn = rc71l_platform_leds, diff --git a/rogue_enemy.h b/rogue_enemy.h index a01f1f1..5ccb243 100644 --- a/rogue_enemy.h +++ b/rogue_enemy.h @@ -46,6 +46,8 @@ #include +#include + #define LSB_PER_RAD_S_2000_DEG_S ((double)0.001064724) #define LSB_PER_RAD_S_2000_DEG_S_STR "0.001064724"