#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,
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;
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;
}
g_return_if_fail (priv);
+ if (strcmp (udi, CAM_COVER_UDI) != 0)
+ return;
+
if (strcmp (key, CAM_COVER_STATE) != 0)
return;
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 */
}
}
+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);
}
}
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)) {
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");
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);
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);