diff options
author | David Härdeman <david@hardeman.nu> | 2015-08-15 22:43:32 +0200 |
---|---|---|
committer | David Härdeman <david@hardeman.nu> | 2015-08-15 22:43:32 +0200 |
commit | c420b38a5a4bac32b1086e0359e5f5646880d9f4 (patch) | |
tree | ffcf65dcc3d2e905665f82f57fcc48bccefa4a58 /rcm-client-hardware-list.c | |
parent | 6d12cb6b9e9d7b67521f6ca999c933e1555a3226 (diff) |
Add basic transmit support (WIP)
Diffstat (limited to 'rcm-client-hardware-list.c')
-rw-r--r-- | rcm-client-hardware-list.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/rcm-client-hardware-list.c b/rcm-client-hardware-list.c index 662dbf3..2c47ee5 100644 --- a/rcm-client-hardware-list.c +++ b/rcm-client-hardware-list.c @@ -6,6 +6,7 @@ #include <gtk/gtk.h> #include "generated.h" +#include "shared.h" #include "rcm-client-main.h" #include "rcm-client-hardware-list.h" #include "rcm-client-receive.h" @@ -84,12 +85,84 @@ hardware_properties_cb(GtkButton *button, gpointer user_data) gtk_widget_hide(dialog); } +static GVariant * +encode_nec(uint32_t scancode_raw) +{ + GVariantBuilder *builder; + GVariant *r; + unsigned i; + uint32_t scancode; + + scancode = ((((scancode_raw >> 24) & 0xff) << 0) | + (((scancode_raw >> 16) & 0xff) << 8) | + (((scancode_raw >> 8) & 0xff) << 16) | + (((scancode_raw >> 0) & 0xff) << 24)); + + builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY); + g_variant_builder_add(builder, "u", 9000); + g_variant_builder_add(builder, "u", 4500); + + for (i = 0; i < 32; i++) { + g_variant_builder_add(builder, "u", 560); + if (scancode & 0x1) + g_variant_builder_add(builder, "u", 3 * 560); + else + g_variant_builder_add(builder, "u", 1 * 560); + scancode >>= 1; + } + + g_variant_builder_add(builder, "u", 560); + + r = g_variant_builder_end(builder); + g_variant_builder_unref(builder); + return r; +} + +static void +advanced_transmit_cb(GtkButton *button, gpointer user_data) +{ + RCDevice *object = user_data; + GtkComboBoxText *protocolw; + GtkEntry *scancodew; + gchar *protocol; + const gchar *scancode; + uint64_t sc; + GError *error = NULL; + gboolean r; + + protocolw = GTK_COMBO_BOX_TEXT(gtk_builder_get_object(global->builder, "advanced_main_transmit_protocol")); + scancodew = GTK_ENTRY(gtk_builder_get_object(global->builder, "advanced_main_transmit_scancode")); + + protocol = gtk_combo_box_text_get_active_text(protocolw); + scancode = gtk_entry_get_text(scancodew); + printf("Asked to transmit: protocol %s scancode %s\n", protocol, scancode); + g_free(protocol); + + if (!strcmp(protocol, "NEC")) { + printf("Invalid protocol: %s\n", protocol); + return; + } + + r = strtoull_strict(scancode, &sc); + if (r < 0 || sc > UINT32_MAX) { + printf("Invalid scancode: %s\n", scancode); + return; + } + + if (!rcdevice_call_transmit_sync(object, encode_nec(sc), NULL, &error)) { + printf("rcdevice_call_transmit_sync failed: %s\n", + error ? error->message : "no error reported"); + g_error_free(error); + } +} + static void advanced_cb(GtkButton *button, gpointer user_data) { RCDevice *object = user_data; GtkWidget *dialog; GtkWidget *title; + GtkWidget *transmit; gchar *titlestr; dialog = GTK_WIDGET(gtk_builder_get_object(global->builder, "advanced")); @@ -100,6 +173,9 @@ advanced_cb(GtkButton *button, gpointer user_data) gtk_label_set_markup(GTK_LABEL(title), titlestr); g_free(titlestr); + transmit = GTK_WIDGET(gtk_builder_get_object(global->builder, "advanced_main_transmit_button")); + g_signal_connect(transmit, "clicked", G_CALLBACK(advanced_transmit_cb), object); + g_signal_connect_swapped(dialog, "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), dialog); gtk_widget_show(dialog); } |