From aae745e439f9ecb5c6b3bc7ba569831f23684dd3 Mon Sep 17 00:00:00 2001 From: Roman Moravcik Date: Mon, 21 Dec 2009 21:53:39 +0100 Subject: [PATCH] Added alarm management (eg. reading of overtemperature, undervoltage, ... faults). --- src/flashlight_applet.c | 96 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 78 insertions(+), 18 deletions(-) diff --git a/src/flashlight_applet.c b/src/flashlight_applet.c index 9dc8aa8..055dc49 100644 --- a/src/flashlight_applet.c +++ b/src/flashlight_applet.c @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -47,14 +48,16 @@ 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); -- 1.7.9.5