Superhans v1 (index finger click and second finger 'q')

Dependencies:   MMA8451Q USBDevice mbed-rtos mbed

Fork of Super_Hans_USB by Anurag Dhutti

Files at this revision

API Documentation at this revision

Comitter:
InBrewJ
Date:
Thu Jan 30 14:48:49 2014 +0000
Parent:
1:e1a1bf8c36d9
Commit message:
v1 Superhans

Changed in this revision

SuperHansRightGlove.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SuperHansRightGlove.cpp	Thu Jan 30 14:48:49 2014 +0000
@@ -0,0 +1,503 @@
+/* SuperHansRightGlove.cpp    
+
+IDEA - MAP FLEX SENSORS TO A SET HID REPORT.data
+will allow more button presses!
+
+Code for WIRED RIGHT GLOVE
+
+Sends mouse movement dependent on tilt
+of the glove, index finger left mouse click,
+middle finger 'q' press and various
+finger/palm keys corresponding to various
+keys on a standard keyboard
+
+For use with:
+FRDM KL25Z
+ 
+Authors:
+Tristan Hughes
+Anurag Dhutti
+Jason Brewer
+*/ 
+
+#include "mbed.h"
+#include "rtos.h"
+#define MMA8451_I2C_ADDRESS (0x1d<<1)
+#include "MMA8451Q.h"
+#include "USBMouseKeyboard.h"
+#include "USBHID.h"
+
+// Misc Init
+
+DigitalOut led(LED1);
+MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
+AnalogIn ain(PTB1);    // Forefinger sensor
+AnalogIn ain1(PTB0);   // Second finger Sensor
+USBMouseKeyboard key_mouse;
+Mutex USB_mutex;
+
+// Button Init
+
+// D-Pad Palm Switches
+DigitalIn _up(PTE5);
+DigitalIn _left(PTE4);
+DigitalIn _down(PTE3);
+DigitalIn _right(PTE2);
+DigitalIn _sel(PTB11);
+DigitalIn _start(PTB10);
+
+// Finger Switches
+DigitalIn _i1(PTE31);
+
+DigitalIn _s1(PTA17);
+DigitalIn _s2(PTA16);
+DigitalIn _s3(PTC17);
+DigitalIn _s4(PTC16);
+
+DigitalIn _th1(PTC13);
+DigitalIn _th2(PTC12);
+DigitalIn _th3(PTC11);
+DigitalIn _th4(PTC10);
+
+DigitalIn _pi1(PTC6);
+
+void click_thread(void const *args)
+{
+    bool press[2];
+    bool lPress = 0;
+    //bool rPress = 0;
+    
+    // PLEASE NOTE:
+    // The following code does not allow both mouse
+    // buttons to be pressed down at the same time.
+    // Your system will register the press of each button
+    // but as soon as one is released the other will also
+    // be released. Review your application to see if this is
+    // applicable. 
+    
+    while(true) {
+        lPress = ain.read()<0.5;
+        //rPress = ain1.read()<0.25;
+        //key_mouse.printf("Fore: %f Sec: %f\n",ain.read(), ain1.read());
+        if( lPress && (press[0] == 0) ) {
+            press[0] = 1;
+            led != led;
+            //key_mouse.printf("L: %i\n", lPress);
+            USB_mutex.lock();
+            key_mouse.press(MOUSE_LEFT);
+            USB_mutex.unlock();
+        } else if ( !lPress && (press[0] == 1) ) {
+            press[0] = 0;
+            //key_mouse.printf("L: %i\n", lPress);
+            USB_mutex.lock();
+            key_mouse.release(MOUSE_LEFT);
+            USB_mutex.unlock();
+        }
+        if(!_i1 && press[1] == 0) {
+        //if( rPress && (press[1] == 0) ) {
+             //key_mouse.printf("R: %i\n", rPress);
+             press[1] = 1;
+             if(!lPress) USB_mutex.lock();
+             key_mouse.press(MOUSE_RIGHT);            
+             if(!lPress) USB_mutex.unlock();     // As Right mouse click
+         }else if(_i1 && press[1] == 1) {
+        //}else if( !rPress && (press[1] == 1) ) {
+             //key_mouse.printf("R: %i\n", rPress);
+             press[1] = 0;
+             if(!lPress) USB_mutex.lock();
+             key_mouse.release(MOUSE_RIGHT);
+             if(!lPress) USB_mutex.unlock();
+         }
+        
+        Thread::wait(100);
+    }
+}
+
+
+void mouse_thread(void const *args)
+{
+    while(true) {
+
+        USB_mutex.lock();
+        key_mouse.move(-acc.getAccZ()*10, 0);
+        key_mouse.move(0, -acc.getAccX()*10);
+        USB_mutex.unlock();
+        Thread::wait(1);
+    }
+}
+
+void SendKeyPress (uint8_t keyID, bool state, uint8_t numberPressed)
+{
+    // Send a simulated keyboard keypress. Returns true if successful.
+    static HID_REPORT report;
+    static uint8_t last_pressed;
+    static uint8_t keyBuffer[3];
+    
+    report.data[0] = REPORT_ID_KEYBOARD;
+    report.data[1] = 0;
+    report.data[2] = 0;
+    //report.data[3] = 0;  
+    //report.data[4] = 0;
+    //report.data[5] = 0;
+    report.data[6] = 0;
+    report.data[7] = 0;
+    report.data[8] = 0;
+
+    report.length = 9;
+    
+    // Multiple button press functionality
+    
+    if(!numberPressed)     // Clear the keyBuffer if no buttons are pressed
+    {
+        keyBuffer[0] = 0;
+        keyBuffer[1] = 0;
+        keyBuffer[2] = 0;
+    }
+    
+    if(state)  // If a button is pressed, put it in the keyBuffer
+    {
+        keyBuffer[numberPressed-1] = keyID;
+    }
+    
+    // If keys are depressed in the same order
+    // in which they were pressed, swap the second
+    // member of the key buffer with the first so
+    // expected behaviour is maintained
+    
+    // Only has functionality for 2 key presses at once
+    // which follows most standard keyboard
+    
+    // 3 key presses at once gets a little trickier
+    
+    if(!state && numberPressed == 1 && 
+        keyBuffer[0] == keyID)
+    {
+        keyBuffer[0] = keyBuffer[1];
+        keyBuffer[1] = 0;
+    }
+    
+    //key_mouse.printf("keyBuffer: %X, %X, %X\n", keyBuffer[0], keyBuffer[1], keyBuffer[2]);
+    
+    if(numberPressed == 0)
+    {
+        report.data[3] = 0;
+        report.data[4] = 0;
+        report.data[5] = 0;
+    }else if(numberPressed == 1)
+    {
+        report.data[3] = keyBuffer[0];
+        report.data[4] = 0;
+        report.data[5] = 0;
+    }else if(numberPressed == 2)
+    {
+        report.data[3] = report.data[3];
+        report.data[4] = keyBuffer[1];
+        report.data[5] = 0;
+    } else if(numberPressed == 3)  // not actually functional
+    {
+        report.data[3] = report.data[3];
+        report.data[4] = report.data[4];
+        report.data[5] = keyBuffer[2];
+    }
+    
+    key_mouse.send(&report);
+
+}
+
+void keyboard_thread(void const *args)
+{
+    uint8_t numberPressed = 0;
+    bool press[16] = {0};
+        
+    while(true) {
+        
+        // Uncomment for debug
+        
+        //key_mouse.printf("No: %d\n", numberPressed);
+        /*key_mouse.printf("pressArr: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
+        press[0], press[1], press[2], press[3], press[4], press[5], press[6], press[7],
+        press[8], press[9], press[10], press[11], press[12], press[13], press[14], press[15]);*/
+        
+        // Makes the second bend sensor map to the key "q"
+        // Mapping the second bend sensor to right mouse
+        // poses some issues to do with how the clicks are sent
+        // in the mbed libraries. An indepth analysis
+        // of HID reports is required and tbh cba ukno
+        
+        if( (ain1.read()<0.25) && (press[0] == 0) ) {            
+            if(press[0] == 0) numberPressed++;
+            press[0] = 1;
+            //key_mouse.printf("   qPress: %i\n", press[0]);
+            //USB_mutex.lock();
+            //key_mouse.press(MOUSE_RIGHT); // Sends right mouse click
+            //USB_mutex.unlock();
+            SendKeyPress(0x14,1,numberPressed);     // Sends 'q' keypress
+        } else if ( (ain1.read()>0.25) && (press[0] == 1) ) {
+            if(press[0] == 1) numberPressed--;
+            press[0] = 0;
+            //key_mouse.printf("R: %i\n", press[0]);
+            //USB_mutex.lock();
+            //key_mouse.release(MOUSE_RIGHT); // releases right mouse click
+            //USB_mutex.unlock();
+            SendKeyPress(0x14,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        // FOREFINGER BUTTON
+
+        /*if(!_i1 && press[0] == 0) {
+            press[0] = 1;
+            SendKeyPress(0x14,0);     // Sends 'q' keypress
+            //Thread::wait(60);
+        } else if(_i1 && press[0] == 1) {
+            press[0] = 0;
+            Thread::wait(17);
+            SendKeyPress(0,1);
+        }*/
+
+        // SECOND FINGER BUTTONS (4 of them)
+
+        if(!_s1 && press[1] == 0) {
+            if(press[1] == 0) numberPressed++;
+            press[1] = 1;
+            SendKeyPress(0x08,1,numberPressed);     // Sends 'e' keypress (a = 0x04)
+            //SendKeyPress(0x04,1,numberPressed);
+            //Thread::wait(60);
+        } else if(_s1 && press[1] == 1) {
+            if(press[1] == 1) numberPressed--;
+            press[1] = 0;
+            Thread::wait(17);
+            SendKeyPress(0x4,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        if(!_s2 && press[2] == 0) {
+            if(press[2] == 0) numberPressed++;
+            press[2] = 1;
+            SendKeyPress(0x15,1,numberPressed);     // Sends 'r' keypress (w = 0x1a)
+            //SendKeyPress(0x1a,1,numberPressed);
+        } else if(_s2 && press[2] == 1) {
+            if(press[2] == 1) numberPressed--;
+            press[2] = 0;
+            Thread::wait(17);
+            SendKeyPress(0x1a,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        if(!_s3 && press[3]== 0) {
+            if(press[3] == 0) numberPressed++;
+            press[3] = 1;
+            SendKeyPress(0x17,1,numberPressed);     // Sends 't' keypress (s = 0x16)
+            //SendKeyPress(0x16,numberPressed);
+            //Thread::wait(60);
+        } else if(_s3 && press[3]== 1) {
+            if(press[3] == 1) numberPressed--;
+            press[3] = 0;
+            Thread::wait(17);
+            SendKeyPress(0x17,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        if(!_s4 && press[4]== 0) {
+            if(press[4] == 0) numberPressed++;
+            press[4] = 1;
+            SendKeyPress(0x1c,1,numberPressed);     // Sends 'y' keypress (d = 0x07)
+            //SendKeyPress(0x07,0);
+            //Thread::wait(60);
+        } else if(_s4 && press[4]== 1) {
+            if(press[4] == 1) numberPressed--;
+            press[4] = 0;
+            Thread::wait(17);
+            SendKeyPress(0x1c,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+       // THIRD FINGER BUTTONS (4 of them)
+
+        if(!_th1 && press[5]== 0) {
+            if(press[5] == 0) numberPressed++;
+            press[5]= 1;
+            SendKeyPress(0x18,1,numberPressed);     // Sends 'u' keypress
+            Thread::wait(60);
+        } else if(_th1 && press[5]== 1) {
+            if(press[5] == 1) numberPressed--;
+            press[5]= 0;
+            SendKeyPress(0x18,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        if(!_th2 && press[6]== 0) {
+            if(press[6] == 0) numberPressed++;
+            press[6]= 1;
+            SendKeyPress(0x0c,1,numberPressed);     // Sends 'i' keypress
+            
+        } else if(_th2 && press[6]== 1) {
+            if(press[6] == 1) numberPressed--;
+            press[6]= 0;
+            SendKeyPress(0x0c,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        if(!_th3 && press[7]== 0) {
+            if(press[7] == 0) numberPressed++;
+            press[7]= 1;
+            SendKeyPress(0x12,1,numberPressed);     // Sends 'o' keypress
+            
+        } else if(_th3 && press[7]== 1) {
+            if(press[7] == 1) numberPressed--;
+            press[7]= 0;
+            SendKeyPress(0x12,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        if(!_th4 && press[8]== 0) {
+            if(press[8] == 0) numberPressed++;
+            press[8]= 1;
+            SendKeyPress(0x13,1, numberPressed);     // Sends 'p' keypress
+            
+        } else if(_th4 && press[8]== 1) {
+            if(press[8] == 1) numberPressed--;
+            press[8]= 0;
+            SendKeyPress(0x13,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        // PINKY BUTTON
+
+        if(!_pi1 && press[9]== 0) {
+            if(press[9] == 0) numberPressed++;
+            press[9]= 1;
+            //SendKeyPress(0x2f,0);     // Sends '[' keypress
+            SendKeyPress(0x2c,1,numberPressed);     // Sends 'space' keypress
+            
+        } else if(_pi1 && press[9]== 1) {
+            if(press[9] == 1) numberPressed--;
+            press[9]= 0;
+            Thread::wait(17);
+            SendKeyPress(0x2c,0, numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        // PALM D-PAD BUTTONS (6 of them)
+
+        if(!_up && press[10]== 0) {
+            if(press[10] == 0) numberPressed++;
+            press[10]= 1;
+            SendKeyPress(0x52,1,numberPressed);     // Sends up arrow keypress
+            
+        } else if(_up && press[10]== 1) {
+            if(press[10] == 1) numberPressed--;
+            press[10]= 0;
+            SendKeyPress(0x52,1,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        if(!_left && press[11]== 0) {
+            if(press[11] == 0) numberPressed++;
+            press[11]= 1;
+            SendKeyPress(0x50,1,numberPressed);     // Sends left arrow keypress
+            
+        } else if(_left && press[11]== 1) {
+            if(press[11] == 1) numberPressed--;
+            press[11]= 0;
+            SendKeyPress(0x50,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        if(!_down && press[12]== 0) {
+            if(press[12] == 0) numberPressed++;
+            press[12]= 1;
+            SendKeyPress(0x51,1,numberPressed);     // Sends down arrow keypress
+            
+        } else if(_down && press[12]== 1) {
+            if(press[12] == 1) numberPressed--;
+            press[12]= 0;
+            SendKeyPress(0x51,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        if(!_right && press[13]== 0) {
+            if(press[13] == 0) numberPressed++;
+            press[13]= 1;
+            SendKeyPress(0x4f,1,numberPressed);     // Sends right arrow keypress
+            
+        } else if(_right && press[13]== 1) {
+            if(press[13] == 1) numberPressed--;
+            press[13]= 0;
+            SendKeyPress(0x4f,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        if(!_sel && press[14]== 0) {
+            if(press[14] == 0) numberPressed++;
+            press[14]= 1;
+            SendKeyPress(0x1d,1,numberPressed);     // Sends 'z' keypress
+            
+        } else if(_sel && press[14]== 1) {
+            if(press[14] == 1) numberPressed--;
+            press[14]= 0;
+            SendKeyPress(0x1d,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+
+        if(!_start && press[15]== 0) {
+            if(press[15] == 0) numberPressed++;
+            press[15]= 1;
+            SendKeyPress(0x1b,1,numberPressed);     // Sends 'x' keypress
+            
+        } else if(_start && press[15]== 1) {
+            if(press[15] == 1) numberPressed--;
+            press[15]= 0;
+            SendKeyPress(0x1b,0,numberPressed);
+        }else
+        {
+            numberPressed = numberPressed;
+        }
+    
+    Thread::wait(100);  // Slows the whole thread down. Without this keys stick!
+    //Thread::wait(300);
+
+    }
+}
+
+int main()
+{
+    Thread click(click_thread);
+    Thread mouse(mouse_thread);
+    Thread keyboard(keyboard_thread);
+
+    led = 1.0;
+
+    while (true) {
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice.lib	Thu Jan 30 14:48:49 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/USBDevice/#4f6df64750bd
--- a/main.cpp	Fri Dec 27 22:04:23 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-#include "mbed.h"
-#include "rtos.h"
-#define MMA8451_I2C_ADDRESS (0x1d<<1)
-#include "MMA8451Q.h"
-#include "USBMouseKeyboard.h"
-#define PI 3.14159265
-
-PwmOut led1(LED2);
-MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
-AnalogIn ain(PTC2);
-Serial pc(USBTX, USBRX);
-USBMouseKeyboard key_mouse;
-Mutex USB_mutex;
-//USBHID key_mouse;
-
-void click_thread(void const *args)
-{
-    int press;
-    while(true) {
-        if( (ain.read()>0.3) && (press == 0) ) {
-            press = 1;
-            led1 != led1;
-            pc.printf("%i\n", press);
-            USB_mutex.lock();
-            key_mouse.press(MOUSE_LEFT);
-            USB_mutex.unlock();
-        } else if ( (ain.read()<0.3) && (press == 1) ) {
-            press = 0;
-            pc.printf("%i\n", press);
-            USB_mutex.lock();
-            key_mouse.release(MOUSE_LEFT);
-            USB_mutex.unlock();
-        }
-        Thread::wait(100);
-    }
-}
-
-void mouse_thread(void const *args)
-{
-    while(true) {
-
-        USB_mutex.lock();
-        pc.printf("%f, %f, %f\n", acc.getAccX(), acc.getAccY(), acc.getAccZ() );
-        
-        if (acc.getAccZ()
-        
-        key_mouse.move(-acc.getAccZ()*10, 0);
-        key_mouse.move(0, acc.getAccX()*10);
-        USB_mutex.unlock();
-        Thread::wait(1);
-    }
-}
-
-void heartbeat_thread(void const *args)
-{
-    int i;
-    led1.period(0.001);
-    while(true) {
-        for(i=0; i<180; i++) {
-            led1 = sin(i*PI/180);
-            Thread::wait(10);
-        }
-    }
-
-}
-
-int main()
-{
-    //Thread click(click_thread);
-    Thread mouse(mouse_thread);
-    Thread heartbeat(heartbeat_thread);
-
-    led1 = 1.0;
-
-    while (true) {
-    }
-}