Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MMA8451Q USBDevice mbed-rtos mbed
Fork of Super_Hans_USB by
Revision 2:034f34663c45, committed 2014-01-30
- Comitter:
- InBrewJ
- Date:
- Thu Jan 30 14:48:49 2014 +0000
- Parent:
- 1:e1a1bf8c36d9
- Commit message:
- v1 Superhans
Changed in this revision
--- /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) {
- }
-}
