Text Entry using chording. Interactive Device Design Fall 2014.
Dependencies: DebounceIn USBDevice mbed
Fork of Pushbutton_NoBounce_Demo by
main.cpp@1:b80a3bb34555, 2014-09-22 (annotated)
- Committer:
- appachu
- Date:
- Mon Sep 22 10:18:28 2014 +0000
- Revision:
- 1:b80a3bb34555
- Parent:
- 0:ca31694551ed
finger chording
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
4180_1 | 0:ca31694551ed | 1 | #include "mbed.h" |
4180_1 | 0:ca31694551ed | 2 | #include "DebounceIn.h" |
appachu | 1:b80a3bb34555 | 3 | #include "USBKeyboard.h" |
appachu | 1:b80a3bb34555 | 4 | |
appachu | 1:b80a3bb34555 | 5 | // Serial connection for debugging |
appachu | 1:b80a3bb34555 | 6 | Serial pc(USBTX, USBRX); |
appachu | 1:b80a3bb34555 | 7 | // mimic USB keyboard |
appachu | 1:b80a3bb34555 | 8 | USBKeyboard keyboard; |
appachu | 1:b80a3bb34555 | 9 | // LED |
appachu | 1:b80a3bb34555 | 10 | DigitalOut red(LED_RED); |
appachu | 1:b80a3bb34555 | 11 | DigitalOut green(LED_GREEN); |
appachu | 1:b80a3bb34555 | 12 | DigitalOut blue(LED_BLUE); |
appachu | 1:b80a3bb34555 | 13 | // Push Buttons with Debounce |
appachu | 1:b80a3bb34555 | 14 | DebounceIn pb1(D2); |
appachu | 1:b80a3bb34555 | 15 | DebounceIn pb2(D3); |
appachu | 1:b80a3bb34555 | 16 | DebounceIn pb3(D4); |
appachu | 1:b80a3bb34555 | 17 | DebounceIn pb4(D5); |
appachu | 1:b80a3bb34555 | 18 | DebounceIn pb5(D6); |
4180_1 | 0:ca31694551ed | 19 | |
appachu | 1:b80a3bb34555 | 20 | // chord character map |
appachu | 1:b80a3bb34555 | 21 | char chord_characters[32] = { |
appachu | 1:b80a3bb34555 | 22 | '?', // 00000 0 |
appachu | 1:b80a3bb34555 | 23 | 'e', // 00001 1 |
appachu | 1:b80a3bb34555 | 24 | 'd', // 00010 2 |
appachu | 1:b80a3bb34555 | 25 | 'i', // 00011 3 |
appachu | 1:b80a3bb34555 | 26 | 'c', // 00100 4 |
appachu | 1:b80a3bb34555 | 27 | 'l', // 00101 5 |
appachu | 1:b80a3bb34555 | 28 | 'h', // 00110 6 |
appachu | 1:b80a3bb34555 | 29 | 'v', // 00111 7 |
appachu | 1:b80a3bb34555 | 30 | 'b', // 01000 8 |
appachu | 1:b80a3bb34555 | 31 | 'n', // 01001 9 |
appachu | 1:b80a3bb34555 | 32 | 'k', // 01010 10 |
appachu | 1:b80a3bb34555 | 33 | 'u', // 01011 11 |
appachu | 1:b80a3bb34555 | 34 | 'g', // 01100 12 |
appachu | 1:b80a3bb34555 | 35 | 't', // 01101 13 |
appachu | 1:b80a3bb34555 | 36 | 's', // 01110 14 |
appachu | 1:b80a3bb34555 | 37 | ' ', // 01111 15 SPACE |
appachu | 1:b80a3bb34555 | 38 | 'a', // 10000 16 |
appachu | 1:b80a3bb34555 | 39 | 'o', // 10001 17 |
appachu | 1:b80a3bb34555 | 40 | 'm', // 10010 18 |
appachu | 1:b80a3bb34555 | 41 | 'y', // 10011 19 |
appachu | 1:b80a3bb34555 | 42 | 'j', // 10100 20 |
appachu | 1:b80a3bb34555 | 43 | 'x', // 10101 21 |
appachu | 1:b80a3bb34555 | 44 | 'r', // 10110 22 |
appachu | 1:b80a3bb34555 | 45 | '?', // 10111 23 |
appachu | 1:b80a3bb34555 | 46 | 'f', // 11000 24 |
appachu | 1:b80a3bb34555 | 47 | 'w', // 11001 25 |
appachu | 1:b80a3bb34555 | 48 | 'q', // 11010 26 |
appachu | 1:b80a3bb34555 | 49 | 'z', // 11011 27 |
appachu | 1:b80a3bb34555 | 50 | 'p', // 11100 28 |
appachu | 1:b80a3bb34555 | 51 | '?', // 11101 29 |
appachu | 1:b80a3bb34555 | 52 | '\b', // 11110 30 |
appachu | 1:b80a3bb34555 | 53 | '\n', // 11111 31 |
appachu | 1:b80a3bb34555 | 54 | }; |
appachu | 1:b80a3bb34555 | 55 | |
appachu | 1:b80a3bb34555 | 56 | // print binary representation of char for debugging |
appachu | 1:b80a3bb34555 | 57 | void printbinchar(char c) |
appachu | 1:b80a3bb34555 | 58 | { |
appachu | 1:b80a3bb34555 | 59 | for (int i = 7; i >= 0; --i) |
appachu | 1:b80a3bb34555 | 60 | { |
appachu | 1:b80a3bb34555 | 61 | pc.printf("%c", ( (c & (1 << i)) ? '1' : '0' )); |
appachu | 1:b80a3bb34555 | 62 | } |
appachu | 1:b80a3bb34555 | 63 | pc.printf("\r\n"); |
appachu | 1:b80a3bb34555 | 64 | } |
4180_1 | 0:ca31694551ed | 65 | |
appachu | 1:b80a3bb34555 | 66 | void setup() { |
appachu | 1:b80a3bb34555 | 67 | // use internal pullup for pushbuttons |
appachu | 1:b80a3bb34555 | 68 | pb1.mode(PullUp); |
appachu | 1:b80a3bb34555 | 69 | pb2.mode(PullUp); |
appachu | 1:b80a3bb34555 | 70 | pb3.mode(PullUp); |
appachu | 1:b80a3bb34555 | 71 | pb4.mode(PullUp); |
appachu | 1:b80a3bb34555 | 72 | pb5.mode(PullUp); |
appachu | 1:b80a3bb34555 | 73 | // delay for initial pullup to take effect |
appachu | 1:b80a3bb34555 | 74 | wait(0.1); |
appachu | 1:b80a3bb34555 | 75 | // setup LED's |
appachu | 1:b80a3bb34555 | 76 | red = 1, green = 1, blue = 1; |
appachu | 1:b80a3bb34555 | 77 | } |
appachu | 1:b80a3bb34555 | 78 | |
appachu | 1:b80a3bb34555 | 79 | int main() { |
appachu | 1:b80a3bb34555 | 80 | setup(); |
appachu | 1:b80a3bb34555 | 81 | int keycode = 0; |
appachu | 1:b80a3bb34555 | 82 | while(1) { |
appachu | 1:b80a3bb34555 | 83 | // determine which push buttons are depressed |
appachu | 1:b80a3bb34555 | 84 | if(!pb1){ keycode |= 1; } |
appachu | 1:b80a3bb34555 | 85 | if(!pb2){ keycode |= 2; } |
appachu | 1:b80a3bb34555 | 86 | if(!pb3){ keycode |= 4; } |
appachu | 1:b80a3bb34555 | 87 | if(!pb4){ keycode |= 8; } |
appachu | 1:b80a3bb34555 | 88 | if(!pb5){ keycode |= 16; } |
appachu | 1:b80a3bb34555 | 89 | // when all buttons are released and some buttons were previously depressed |
appachu | 1:b80a3bb34555 | 90 | if(pb1 && pb2 && pb3 && pb4 && pb5 && keycode) |
appachu | 1:b80a3bb34555 | 91 | { |
appachu | 1:b80a3bb34555 | 92 | int chr = chord_characters[keycode]; |
appachu | 1:b80a3bb34555 | 93 | pc.printf("%c", chr); |
appachu | 1:b80a3bb34555 | 94 | keyboard.printf("%c", chr); |
appachu | 1:b80a3bb34555 | 95 | |
appachu | 1:b80a3bb34555 | 96 | //pc.printf("%d, %c\r\n", chr, chr); |
appachu | 1:b80a3bb34555 | 97 | //printbinchar(chr); |
appachu | 1:b80a3bb34555 | 98 | //printbinchar(keycode); |
appachu | 1:b80a3bb34555 | 99 | keycode = 0; |
appachu | 1:b80a3bb34555 | 100 | } |
4180_1 | 0:ca31694551ed | 101 | } |
appachu | 1:b80a3bb34555 | 102 | } |
appachu | 1:b80a3bb34555 | 103 | |
appachu | 1:b80a3bb34555 | 104 | //============================= |
appachu | 1:b80a3bb34555 | 105 | // python code to generate chord_characters array |
appachu | 1:b80a3bb34555 | 106 | // import binascii |
appachu | 1:b80a3bb34555 | 107 | // |
appachu | 1:b80a3bb34555 | 108 | // chord_map = { |
appachu | 1:b80a3bb34555 | 109 | // "10000":"a", |
appachu | 1:b80a3bb34555 | 110 | // "01000":"b", |
appachu | 1:b80a3bb34555 | 111 | // "00100":"c", |
appachu | 1:b80a3bb34555 | 112 | // "00010":"d", |
appachu | 1:b80a3bb34555 | 113 | // "00001":"e", |
appachu | 1:b80a3bb34555 | 114 | // "11000":"f", |
appachu | 1:b80a3bb34555 | 115 | // "01100":"g", |
appachu | 1:b80a3bb34555 | 116 | // "00110":"h", |
appachu | 1:b80a3bb34555 | 117 | // "00011":"i", |
appachu | 1:b80a3bb34555 | 118 | // "10100":"j", |
appachu | 1:b80a3bb34555 | 119 | // "01010":"k", |
appachu | 1:b80a3bb34555 | 120 | // "00101":"l", |
appachu | 1:b80a3bb34555 | 121 | // "10010":"m", |
appachu | 1:b80a3bb34555 | 122 | // "01001":"n", |
appachu | 1:b80a3bb34555 | 123 | // "10001":"o", |
appachu | 1:b80a3bb34555 | 124 | // "11100":"p", |
appachu | 1:b80a3bb34555 | 125 | // "11010":"q", |
appachu | 1:b80a3bb34555 | 126 | // "10110":"r", |
appachu | 1:b80a3bb34555 | 127 | // "01110":"s", |
appachu | 1:b80a3bb34555 | 128 | // "01101":"t", |
appachu | 1:b80a3bb34555 | 129 | // "01011":"u", |
appachu | 1:b80a3bb34555 | 130 | // "00111":"v", |
appachu | 1:b80a3bb34555 | 131 | // "11001":"w", |
appachu | 1:b80a3bb34555 | 132 | // "10101":"x", |
appachu | 1:b80a3bb34555 | 133 | // "10011":"y", |
appachu | 1:b80a3bb34555 | 134 | // "11011":"z", |
appachu | 1:b80a3bb34555 | 135 | // "11110":"?", |
appachu | 1:b80a3bb34555 | 136 | // "10111":"?", |
appachu | 1:b80a3bb34555 | 137 | // "11101":"?", |
appachu | 1:b80a3bb34555 | 138 | // "01111":" ", |
appachu | 1:b80a3bb34555 | 139 | // "11111":"?", |
appachu | 1:b80a3bb34555 | 140 | // } |
appachu | 1:b80a3bb34555 | 141 | // |
appachu | 1:b80a3bb34555 | 142 | // if __name__ == '__main__': |
appachu | 1:b80a3bb34555 | 143 | // array = [0] * 32 |
appachu | 1:b80a3bb34555 | 144 | // for k, v in chord_map.iteritems(): |
appachu | 1:b80a3bb34555 | 145 | // array[ int(k, 2) ] = k |
appachu | 1:b80a3bb34555 | 146 | // for i in range(len(array)): |
appachu | 1:b80a3bb34555 | 147 | // try: |
appachu | 1:b80a3bb34555 | 148 | // print "'" + chord_map[array[i]] + "', //", array[i], i |
appachu | 1:b80a3bb34555 | 149 | // except KeyError: |
appachu | 1:b80a3bb34555 | 150 | // print "'" + "?" + "', //", array[i], i |
appachu | 1:b80a3bb34555 | 151 | //=================================================== |