ADHD: Add dBus message for microphone jack state.

Details

  Adds code to generate a dbus message each time the microphone jack is
  changed.

  The message has a string and a boolean:

     "microphone" :  The name of the jack which is reporting
     true         :  The headphones have been inserted.
     false        :  The headphones have been removed.

Testing

   On a Kaen:

     dbus-monitor --system

   Alter the state of the headphone switch.
   The messages will be displayed, as follows:

   signal sender=:1.20 -> dest=(null destination) serial=8 path=/gavd/jack; interface=gavd.jack.state; member=jack
      string "microphone"
      boolean false
   signal sender=:1.20 -> dest=(null destination) serial=9 path=/gavd/jack; interface=gavd.jack.state; member=jack
      string "microphone"
      boolean true

BUG=chromium-os:19558
TEST=See above.

Change-Id: Idb25f1b92433aed2b721416c24e1fab1e2394d70
Signed-off-by: Taylor Hutt <thutt@chromium.org>
diff --git a/gavd/dbus_connection.c b/gavd/dbus_connection.c
index 4dbaa27..fa1e447 100644
--- a/gavd/dbus_connection.c
+++ b/gavd/dbus_connection.c
@@ -23,7 +23,7 @@
 static const char     *dbus_connection_name = "org.chromium.gavd";
 
 
-static void dbus_connection_jack_state(const char *jack, unsigned state)
+void dbus_connection_jack_state(const char *jack, unsigned state)
 {
     dbus_uint32_t  serial = 0;
     DBusMessage   *msg;
@@ -61,16 +61,6 @@
 
 }
 
-void dbus_connection_headphone_state(unsigned state)
-{
-    dbus_connection_jack_state("headphone", state);
-}
-
-void dbus_connection_microphone_state(unsigned state)
-{
-    dbus_connection_jack_state("microphone", state);
-}
-
 static void initialize(void)
 {
     DBusError error;
diff --git a/gavd/dbus_connection.h b/gavd/dbus_connection.h
index 4abcf53..c9eaa99 100644
--- a/gavd/dbus_connection.h
+++ b/gavd/dbus_connection.h
@@ -2,17 +2,11 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#if !defined(_GAVD_DBUS_H_)
-#define _GAVD_DBUS_H__
+#if !defined(_DBUS_CONNECTION_H_)
+#define _DBUS_CONNECTION_H__
 
-/* state = 0 -> headphone unplugged
- * state = 1 -> headphone plugged
+/* state = 0 -> jack unplugged
+ * state = 1 -> jack plugged
  */
-void dbus_connection_headphone_state(unsigned state);
-
-/* state = 0 -> mircophone unplugged
- * state = 1 -> mircophone plugged
- */
-void dbus_connection_microphone_state(unsigned state);
-
+void dbus_connection_jack_state(const char *jack_name, unsigned state);
 #endif
diff --git a/gavd/dbus_to_chrome_fifo.c b/gavd/dbus_to_chrome_fifo.c
index 7b96b7f..2191c89 100644
--- a/gavd/dbus_to_chrome_fifo.c
+++ b/gavd/dbus_to_chrome_fifo.c
@@ -20,8 +20,9 @@
 #include "dbus_to_chrome_fifo.h"
 
 typedef struct state_t {
-    unsigned state;             /* 0     -> Speaker enabled, headphone disabled.
-                                 * 1     -> Speaker disabled, headphone enabled.
+    const char *jack;           /* non-NULL jack name */
+    unsigned    state;          /* 0     -> jack unplugged.
+                                 * 1     -> jack plugged.
                                  * other -> llegal.
                                  */
 } state_t;
@@ -91,17 +92,19 @@
     verbose_log(0, LOG_INFO, "%s: speaker: %s.  headphone: %s", __FUNCTION__,
                 speaker, headphone);
 
-    dbus_connection_headphone_state(state);
+    dbus_connection_jack_state(p->jack, state);
     free(data);
 });
 
-void dbus_to_chrome_fifo_internal_speaker_headphone_state(unsigned state)
+void dbus_to_chrome_fifo_internal_speaker_headphone_state(const char *jack,
+                                                          unsigned    state)
 {
     state_t *data = calloc((size_t)1, sizeof(state_t));
 
     assert(state == 0 || state == 1);
     if (data != NULL) {
         data->state = state;
+        data->jack  = jack;
         if (!FIFO_ADD_ITEM(dbus_to_chrome_fifo,
                            internal_speaker_headphone_state, data)) {
             free(data);
diff --git a/gavd/dbus_to_chrome_fifo.h b/gavd/dbus_to_chrome_fifo.h
index 59a315e..ba6b3fc 100644
--- a/gavd/dbus_to_chrome_fifo.h
+++ b/gavd/dbus_to_chrome_fifo.h
@@ -12,9 +12,12 @@
 /*  dbus_to_chrome_fifo_internal_speaker_headphone_state
  *   Indicate state change to internal speaker / heaphones.
  *
- *  state = 0 -> Speaker enable, headphone disabled.
- *  state = 1 -> Speaker disabled, headphone enabled.
+ *  jack == NULL -> Invalid invocation.
+ *  jack != NULL -> Name of the jack.
+ *  state = 0    -> Speaker enable, headphone disabled.
+ *  state = 1    -> Speaker disabled, headphone enabled.
  *  state not in {0, 1} -> error
  */
-void dbus_to_chrome_fifo_internal_speaker_headphone_state(unsigned state);
+void dbus_to_chrome_fifo_internal_speaker_headphone_state(const char *jack,
+                                                          unsigned    state);
 #endif
diff --git a/gavd/gpio_switch_monitor.c b/gavd/gpio_switch_monitor.c
index 8ae4616..27e1c24 100644
--- a/gavd/gpio_switch_monitor.c
+++ b/gavd/gpio_switch_monitor.c
@@ -22,7 +22,7 @@
 
 typedef struct switch_state_t {
     const char *thread_name;
-    const char *device_name;
+    const char *jack;
     const char *insert_command;
     const char *remove_command;
     unsigned    state;          /* 0 -> remove, 1 -> insert */
@@ -51,7 +51,8 @@
         threads_lock_hardware();
         utils_execute_command(cmd);
         threads_unlock_hardware();
-        dbus_to_chrome_fifo_internal_speaker_headphone_state(ss->state);
+        dbus_to_chrome_fifo_internal_speaker_headphone_state(ss->jack,
+                                                             ss->state);
     } else {
         /* If there is no command for insertion, or there is no
          * command for removal, then both commands must not exist.  In
@@ -70,6 +71,7 @@
 });
 
 static void gpio_switch_monitor_work(const char *thread_name,
+                                     const char *jack,
                                      unsigned    switch_event,
                                      const char *insert_command,
                                      const char *remove_command,
@@ -100,6 +102,7 @@
             */
             if (ss != NULL) {
                 ss->thread_name    = thread_name;
+                ss->jack           = jack;
                 ss->insert_command = insert_command;
                 ss->remove_command = remove_command;
                 ss->state          = current_state;
@@ -119,6 +122,7 @@
 }
 
 void gpio_switch_monitor(const char *thread_name,
+                         const char *jack,
                          const char *device_name,
                          unsigned    switch_event,
                          const char *insert_command,
@@ -138,6 +142,7 @@
         if (fd != -1 &&
             sys_input_get_switch_state(fd, switch_event, &current_state)) {
             gpio_switch_monitor_work(thread_name,
+                                     jack,
                                      switch_event,
                                      insert_command,
                                      remove_command,
diff --git a/gavd/gpio_switch_monitor.h b/gavd/gpio_switch_monitor.h
index 892ce32..f5ce263 100644
--- a/gavd/gpio_switch_monitor.h
+++ b/gavd/gpio_switch_monitor.h
@@ -23,6 +23,7 @@
  *                   switch is deactivated.
  */
 void gpio_switch_monitor(const char *thread_name,
+                         const char *jack,
                          const char *device_name,
                          unsigned    switch_event,
                          const char *insert_command,
diff --git a/gavd/thread_gpio_switch_monitor.c b/gavd/thread_gpio_switch_monitor.c
index 799b7b7..42d4f56 100644
--- a/gavd/thread_gpio_switch_monitor.c
+++ b/gavd/thread_gpio_switch_monitor.c
@@ -28,6 +28,7 @@
     /* Wait for all other threads to start. */
     pthread_barrier_wait(&thread_management.tm_start_barrier);
     gpio_switch_monitor(desc->td_name,
+                        "headphone",
                         ADHD_INPUT_NAME_HEADPHONE_JACK,
                         SW_HEADPHONE_INSERT,
                         ADHD_GPIO_HEADPHONE_INSERT_COMMAND,
@@ -49,6 +50,7 @@
     /* Wait for all other threads to start. */
     pthread_barrier_wait(&thread_management.tm_start_barrier);
     gpio_switch_monitor(desc->td_name,
+                        "microphone",
                         ADHD_INPUT_NAME_MICROPHONE_JACK,
                         SW_MICROPHONE_INSERT,
                         ADHD_GPIO_MIRCOPHONE_INSERT_COMMAND,