Text Entry using chording. Interactive Device Design Fall 2014.

Dependencies:   DebounceIn USBDevice mbed

Fork of Pushbutton_NoBounce_Demo by jim hamblen

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?

UserRevisionLine numberNew 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 //===================================================