summaryrefslogtreecommitdiff
path: root/rcm-client-hardware-list.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2015-08-15 22:43:32 +0200
committerDavid Härdeman <david@hardeman.nu>2015-08-15 22:43:32 +0200
commitc420b38a5a4bac32b1086e0359e5f5646880d9f4 (patch)
treeffcf65dcc3d2e905665f82f57fcc48bccefa4a58 /rcm-client-hardware-list.c
parent6d12cb6b9e9d7b67521f6ca999c933e1555a3226 (diff)
Add basic transmit support (WIP)
Diffstat (limited to 'rcm-client-hardware-list.c')
-rw-r--r--rcm-client-hardware-list.c76
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);
}