User:Sagacis/ForceFeedback

From Openmoko

< User:Sagacis
Revision as of 04:04, 3 October 2007 by Sagacis (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

I've added tactile feedback to touchscreen presses to the neod. See the attached patch.

It's configured using the neod gconf file. I still have to figure out how to put that in the build.

Sagacis 05:04, 3 October 2007 (CEST)

Index: neod/src/buttonactions.c
===================================================================
--- neod.orig/src/buttonactions.c	2007-09-30 11:19:30.000000000 -0500
+++ neod/src/buttonactions.c	2007-09-30 15:20:40.000000000 -0500
@@ -43,6 +43,7 @@
 //#define DEBUG_THIS_FILE
 
 #define SYS_CLASS_BACKLIGHT "/sys/class/backlight/"
+#define SYS_VIBRATE "/sys/class/leds/gta01:vibrator/"
 
 static gchar* backlight_node = NULL;
 static int backlight_max_brightness = 1;
@@ -76,6 +77,9 @@
 int powersave_timer2 = -1;
 int powersave_timer3 = -1;
 
+int tactile_feedback_duration_ms = 20;
+int tactile_feedback_enabled = 1;
+
 GtkWidget* aux_menu = 0;
 GtkWidget* power_menu = 0;
 
@@ -225,6 +229,10 @@
     GError* error = 0;
     pm_value = gconf_client_get_int( gconfc, "/desktop/openmoko/neod/power_management", &error );
     if ( error ) g_debug( "gconf error: %s", error->message );
+    tactile_feedback_enabled = gconf_client_get_int( gconfc, "/desktop/openmoko/neod/tactile_feedback_enabled", &error );
+    if ( error ) g_debug( "gconf error: %s", error->message );
+    tactile_feedback_duration_ms = gconf_client_get_int( gconfc, "/desktop/openmoko/neod/tactile_feedback_duration_ms", &error );
+    if ( error ) g_debug( "gconf error: %s", error->message );
     gconf_client_add_dir( gconfc, "/desktop/openmoko/neod", GCONF_CLIENT_PRELOAD_NONE, &error );
     if ( error ) g_debug( "gconf error: %s", error->message );
     gconf_client_notify_add( gconfc, "/desktop/openmoko/neod/power_management", (GConfClientNotifyFunc) neod_buttonactions_gconf_cb, NULL, NULL, &error );
@@ -306,6 +314,9 @@
                 {
                     g_debug( "stylus pressed" );
                     neod_buttonactions_sound_play( "touchscreen" );
+                    if (tactile_feedback_enabled == 1 &&
+                        tactile_feedback_duration_ms > 10  && tactile_feedback_duration_ms <= 1000)
+                      neod_buttonactions_vibrate( tactile_feedback_duration_ms );
                 }
                 else if ( event.value == 0 ) /* released */
                 {
@@ -807,3 +818,27 @@
 
 }
 
+void
+moko_notify_vibrate (char* value)
+{
+  gint fd;
+  gchar buf[100];
+  gint len;
+
+  fd = g_open (SYS_VIBRATE"brightness", O_WRONLY, 0);
+  if (fd == -1)
+  {
+    g_warning ("Unable to open vibration device");
+    return;
+  }
+  len = g_sprintf (buf, "%s", value);
+  write (fd, buf, len);
+  close (fd);
+}
+
+void neod_buttonactions_vibrate( int ms_duration )
+{
+  moko_notify_vibrate("1");
+  usleep(ms_duration * 1000);
+  moko_notify_vibrate("0");
+}
Index: neod/src/buttonactions.h
===================================================================
--- neod.orig/src/buttonactions.h	2007-09-30 11:19:30.000000000 -0500
+++ neod/src/buttonactions.h	2007-09-30 11:19:44.000000000 -0500
@@ -40,5 +40,6 @@
 void neod_buttonactions_sound_init();
 void neod_buttonactions_set_display( int brightness );
 void neod_buttonactions_sound_play( const gchar* samplename );
+void neod_buttonactions_vibrate( int duration );
 
 #endif
Personal tools

I've added tactile feedback to touchscreen presses to the neod. See the attached patch.

It's configured using the neod gconf file. I still have to figure out how to put that in the build.

Sagacis 05:04, 3 October 2007 (CEST)

Index: neod/src/buttonactions.c
===================================================================
--- neod.orig/src/buttonactions.c	2007-09-30 11:19:30.000000000 -0500
+++ neod/src/buttonactions.c	2007-09-30 15:20:40.000000000 -0500
@@ -43,6 +43,7 @@
 //#define DEBUG_THIS_FILE
 
 #define SYS_CLASS_BACKLIGHT "/sys/class/backlight/"
+#define SYS_VIBRATE "/sys/class/leds/gta01:vibrator/"
 
 static gchar* backlight_node = NULL;
 static int backlight_max_brightness = 1;
@@ -76,6 +77,9 @@
 int powersave_timer2 = -1;
 int powersave_timer3 = -1;
 
+int tactile_feedback_duration_ms = 20;
+int tactile_feedback_enabled = 1;
+
 GtkWidget* aux_menu = 0;
 GtkWidget* power_menu = 0;
 
@@ -225,6 +229,10 @@
     GError* error = 0;
     pm_value = gconf_client_get_int( gconfc, "/desktop/openmoko/neod/power_management", &error );
     if ( error ) g_debug( "gconf error: %s", error->message );
+    tactile_feedback_enabled = gconf_client_get_int( gconfc, "/desktop/openmoko/neod/tactile_feedback_enabled", &error );
+    if ( error ) g_debug( "gconf error: %s", error->message );
+    tactile_feedback_duration_ms = gconf_client_get_int( gconfc, "/desktop/openmoko/neod/tactile_feedback_duration_ms", &error );
+    if ( error ) g_debug( "gconf error: %s", error->message );
     gconf_client_add_dir( gconfc, "/desktop/openmoko/neod", GCONF_CLIENT_PRELOAD_NONE, &error );
     if ( error ) g_debug( "gconf error: %s", error->message );
     gconf_client_notify_add( gconfc, "/desktop/openmoko/neod/power_management", (GConfClientNotifyFunc) neod_buttonactions_gconf_cb, NULL, NULL, &error );
@@ -306,6 +314,9 @@
                 {
                     g_debug( "stylus pressed" );
                     neod_buttonactions_sound_play( "touchscreen" );
+                    if (tactile_feedback_enabled == 1 &&
+                        tactile_feedback_duration_ms > 10  && tactile_feedback_duration_ms <= 1000)
+                      neod_buttonactions_vibrate( tactile_feedback_duration_ms );
                 }
                 else if ( event.value == 0 ) /* released */
                 {
@@ -807,3 +818,27 @@
 
 }
 
+void
+moko_notify_vibrate (char* value)
+{
+  gint fd;
+  gchar buf[100];
+  gint len;
+
+  fd = g_open (SYS_VIBRATE"brightness", O_WRONLY, 0);
+  if (fd == -1)
+  {
+    g_warning ("Unable to open vibration device");
+    return;
+  }
+  len = g_sprintf (buf, "%s", value);
+  write (fd, buf, len);
+  close (fd);
+}
+
+void neod_buttonactions_vibrate( int ms_duration )
+{
+  moko_notify_vibrate("1");
+  usleep(ms_duration * 1000);
+  moko_notify_vibrate("0");
+}
Index: neod/src/buttonactions.h
===================================================================
--- neod.orig/src/buttonactions.h	2007-09-30 11:19:30.000000000 -0500
+++ neod/src/buttonactions.h	2007-09-30 11:19:44.000000000 -0500
@@ -40,5 +40,6 @@
 void neod_buttonactions_sound_init();
 void neod_buttonactions_set_display( int brightness );
 void neod_buttonactions_sound_play( const gchar* samplename );
+void neod_buttonactions_vibrate( int duration );
 
 #endif