Added alarm management (eg. reading of overtemperature, undervoltage, ... faults).
authorRoman Moravcik <roman.moravcik@gmail.com>
Mon, 21 Dec 2009 20:53:39 +0000 (21:53 +0100)
committerRoman Moravcik <roman.moravcik@gmail.com>
Mon, 21 Dec 2009 20:53:39 +0000 (21:53 +0100)
src/flashlight_applet.c

index 9dc8aa8..055dc49 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <glib.h>
 #include <gtk/gtk.h>
 #include <hildon/hildon.h>
 #include <glib/gi18n-lib.h>
 struct _FlashlightPluginPrivate
 {
        GtkWidget *button;
+       guint status_timer;
+
        FlashlightContext_t *flashlight;
        LibHalContext *hal;
 };
 
 HD_DEFINE_PLUGIN_MODULE (FlashlightPlugin, flashlight_status_plugin, HD_TYPE_STATUS_MENU_ITEM)
 
-static void
-flashlight_status_plugin_finalize (GObject *object);
+static gboolean flashlight_status_plugin_status (gpointer data);
+static void flashlight_status_plugin_finalize (GObject *object);
 
 static void
 flashlight_status_plugin_show_notification (FlashlightPlugin *plugin,
@@ -78,13 +81,13 @@ flashlight_status_plugin_enable (FlashlightPlugin *plugin,
        g_return_if_fail (priv);
 
        if (enable) {
-               if (flashlight_open (priv->flashlight, "/dev/video0") == -1) {
+               if (flashlight_open (priv->flashlight, "/dev/video0") < 0) {
                        flashlight_status_plugin_show_notification (plugin,
                                _("Unable to initialize flashlight.\nCamera in use by another application."));
                        return;
                }
 
-               if (flashlight_set_intensity (priv->flashlight, 10) == -1) {
+               if (flashlight_set_intensity (priv->flashlight, 1) < 0) {
                        flashlight_status_plugin_show_notification (plugin,
                                _("Unable to turn on flashlight."));
                        return;
@@ -93,14 +96,24 @@ flashlight_status_plugin_enable (FlashlightPlugin *plugin,
                hildon_button_set_value (HILDON_BUTTON (priv->button), MSG_FLASHLIGHT_ON);
                hildon_button_set_image (HILDON_BUTTON (priv->button),
                                         gtk_image_new_from_icon_name (ICON_FLASHLIGHT_ON, -1));
+
+               /* check status of controller every 1s */
+               priv->status_timer = g_timeout_add (1000, flashlight_status_plugin_status, plugin);
        } else {
-               if (flashlight_set_intensity (priv->flashlight, 0) == -1) {
+               /* cancel status timer */
+               if (priv->status_timer) {
+                       g_source_remove (priv->status_timer);
+                       priv->status_timer = 0;
+               }
+
+               /* set intensity to 0 */
+               if (flashlight_set_intensity (priv->flashlight, 0) < 0) {
                        flashlight_status_plugin_show_notification (plugin,
                                _("Unable to turn off flashlight."));
                        return;
                }
 
-               if (flashlight_close (priv->flashlight) == -1) {
+               if (flashlight_close (priv->flashlight) < 0) {
                        return;
                }
 
@@ -124,6 +137,9 @@ flashlight_status_plugin_on_hal_property_modified (LibHalContext *ctx,
 
        g_return_if_fail (priv);
 
+       if (strcmp (udi, CAM_COVER_UDI) != 0)
+               return;
+
        if (strcmp (key, CAM_COVER_STATE) != 0)
                return;
 
@@ -134,10 +150,10 @@ flashlight_status_plugin_on_hal_property_modified (LibHalContext *ctx,
                gtk_widget_show_all (GTK_WIDGET (plugin));
        } else {
                /* turn off flashlight if flashlight is enabled */
-               flashlight_get_intensity (priv->flashlight, &intensity);
-
-               if (intensity > 0) {
-                       flashlight_status_plugin_enable (plugin, FALSE);
+               if (flashlight_get_intensity (priv->flashlight, &intensity) == 0) {
+                       if (intensity > 0) {
+                               flashlight_status_plugin_enable (plugin, FALSE);
+                       }
                }
 
                /* hide widget */
@@ -145,20 +161,55 @@ flashlight_status_plugin_on_hal_property_modified (LibHalContext *ctx,
        }
 }
 
+static gboolean
+flashlight_status_plugin_status (gpointer data)
+{
+       FlashlightPlugin *plugin = data;
+       FlashlightPluginPrivate *priv = FLASHLIGHT_STATUS_PLUGIN_GET_PRIVATE (plugin);
+       int status = 0;
+
+       if (flashlight_get_status (priv->flashlight, &status) < 0) {
+               flashlight_status_plugin_show_notification (plugin,
+                                                           _("Unable to read status from driver."));
+               return FALSE;
+       }
+
+       /* ops, something is wrong */
+       if (status) {
+               /* turn off flashlight */
+               flashlight_status_plugin_enable (plugin, FALSE);
+
+               if (status & FLASHLIGHT_STATUS_SHORT_CIRCUT_FAULT) {
+                       flashlight_status_plugin_show_notification (plugin,
+                               _("Short-circut fault detected!\nTurning off flashlight."));
+               } else if (status & FLASHLIGHT_STATUS_OVERTEMPERATURE_FAULT) {
+                       flashlight_status_plugin_show_notification (plugin,
+                               _("Overtemperature fault detected!\nTurning off flashlight."));
+               } else if (status & FLASHLIGHT_STATUS_TIMEOUT_FAULT) {
+                       flashlight_status_plugin_show_notification (plugin,
+                               _("Timeout fault detected!\nTurning off flashlight."));
+               } else if (status & FLASHLIGHT_STATUS_OVERVOLTAGE_FAULT) {
+                       flashlight_status_plugin_show_notification (plugin,
+                               _("Overvoltage fault detected!\nTurning off flashlight."));
+               }
+       }
+
+       return TRUE;
+}
+
 static void
 flashlight_status_plugin_on_clicked (HildonButton *button,
                                     gpointer data)
 {
-       FlashlightPluginPrivate *priv = FLASHLIGHT_STATUS_PLUGIN_GET_PRIVATE (data);
+       FlashlightPlugin *plugin = data;
+       FlashlightPluginPrivate *priv = FLASHLIGHT_STATUS_PLUGIN_GET_PRIVATE (plugin);
 
        g_return_if_fail (priv);
 
        if (!strcmp (hildon_button_get_value (button), MSG_FLASHLIGHT_ON)) {
-               flashlight_status_plugin_enable (data, FALSE);
+               flashlight_status_plugin_enable (plugin, FALSE);
        } else {
-               flashlight_status_plugin_enable (data, TRUE);
-
-               /* fixme periodicaly check status */
+               flashlight_status_plugin_enable (plugin, TRUE);
        }
 }
 
@@ -203,6 +254,7 @@ flashlight_status_plugin_init (FlashlightPlugin *plugin)
        DBusConnection *dbus_connection;
        DBusError error;
 
+       /* initialize dbus */
        dbus_error_init (&error);
        dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
        if (dbus_error_is_set (&error)) {
@@ -212,11 +264,13 @@ flashlight_status_plugin_init (FlashlightPlugin *plugin)
                return;
        }
 
-       if (flashlight_init (&priv->flashlight) == -1) {
+       /* initialize flashlight */
+       if (flashlight_init (&priv->flashlight) < 0) {
                g_critical ("flashlight_status_plugin_init: Unable to create Flashlight context\n");
                return;
        }
 
+       /* initialize hal */
        priv->hal = libhal_ctx_new ();
        if (!priv->hal) {
                g_critical ("flashlight_status_plugin_init: Unable to create HAL context\n");
@@ -243,6 +297,7 @@ flashlight_status_plugin_init (FlashlightPlugin *plugin)
 
        libhal_device_add_property_watch (priv->hal, CAM_COVER_UDI, NULL);
 
+       /* create plugin ui */
        priv->button = flashlight_status_plugin_ui (plugin);
        gtk_container_add (GTK_CONTAINER (plugin), priv->button);
 
@@ -258,16 +313,21 @@ flashlight_status_plugin_finalize (GObject *object)
        FlashlightPlugin *plugin = FLASHLIGHT_STATUS_PLUGIN (object);
        FlashlightPluginPrivate *priv = FLASHLIGHT_STATUS_PLUGIN_GET_PRIVATE (plugin);
 
+       /* deinitialize hal */
        if (priv->hal) {
                libhal_device_remove_property_watch (priv->hal, CAM_COVER_UDI, NULL);
                libhal_ctx_set_user_data (priv->hal, NULL);
                libhal_ctx_free (priv->hal);
-               priv->hal = NULL;
        }
 
+       /* cancel status timer */
+       if (priv->status_timer) {
+               g_source_remove (priv->status_timer);
+       }
+
+       /* deinitialize flashlight */
        if (priv->flashlight) {
                flashlight_deinit (priv->flashlight);
-               priv->flashlight = NULL;
        }
 
        G_OBJECT_CLASS (flashlight_status_plugin_parent_class)->finalize (object);