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: DebounceIn PinDetect_KL25Z USBDevice mbed
Fork of idd_fall15_hw2_chiller_morse by
Diff: main.cpp
- Revision:
- 0:4b4ae443bf49
- Child:
- 1:11e89d389dd4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Sun Sep 13 21:47:15 2015 +0000
@@ -0,0 +1,221 @@
+#include "mbed.h"
+#include "USBKeyboard.h"
+#include "DebounceIn.h"
+#include "PinDetect.h"
+
+DigitalOut redled(LED1);
+DigitalOut greenled(LED2);
+DigitalOut blueled(LED3);
+
+
+DebounceIn dit(D2);
+DebounceIn dah(D3);
+DebounceIn space(D4);
+PinDetect enter(D5);
+PinDetect backspace(D6);
+PinDetect capsLock(D7);
+
+DigitalOut capsled(D8);
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+USBKeyboard keyboard;
+Timer t;
+struct Node {
+ char character;
+ char modifier;
+ bool display;
+ Node *left, *right;
+ Node(char nodeChar, char nodeMod, bool disp, Node *leftN, Node *rightN):
+ character(nodeChar), modifier(nodeMod), display(disp), left(leftN), right(rightN) {}
+};
+
+Node *head, *superHead;
+double timerTime;
+
+int main() {
+ dit.mode(PullUp);
+ dah.mode(PullUp);
+
+ space.mode(PullUp);
+ enter.mode(PullUp);
+ backspace.mode(PullUp);
+ capsLock.mode(PullUp);
+
+ // Delay for initial pullup to take effect
+ wait(.001);
+
+ bool ditActive=false;
+ bool dahActive=false;
+ bool spaceActive = false;
+ bool enterActive = false;
+ bool backspaceActive = false;
+ bool capsLockActive = false;
+
+
+
+ Node *head = new Node(' ',0, false,
+ new Node('e',0,true,
+ new Node('i',0, true,
+ new Node('s',0, true,
+ new Node('h',0, true,
+ new Node('5',0, true, NULL, NULL),
+ new Node('4',0, true, NULL, NULL)),
+ new Node('v',0, true,
+ new Node(' ',0, false,
+ new Node(' ',0, false,
+ NULL,
+ new Node('4',KEY_SHIFT, true, NULL, NULL)),
+ NULL),
+ new Node('3',0, true, NULL, NULL))),
+ new Node('u',0, true,
+ new Node('f',0, true, NULL, NULL),
+ new Node(' ',0, false,
+ new Node(' ',0, false,
+ new Node('?',KEY_SHIFT, true, NULL, NULL),
+ new Node('_',KEY_SHIFT, true, NULL, NULL)),
+ new Node('2',0, true, NULL, NULL)))),
+ new Node('a',0, true,
+ new Node('r',0, true,
+ new Node('l',0, true,
+ new Node('7',KEY_SHIFT, true, NULL, NULL), /* & */
+ new Node(' ',0, false,
+ new Node('\'',KEY_SHIFT, true, NULL, NULL), /* " */
+ NULL)),
+ new Node(' ',0, false,
+ new Node('+',KEY_SHIFT, true,
+ NULL,
+ new Node('.',0, true, NULL, NULL)),
+ NULL)),
+ new Node('w',0, true,
+ new Node('p',0, true,
+ NULL,
+ new Node(' ',0, false,
+ new Node(34,KEY_SHIFT, true, NULL, NULL), /*@*/
+ NULL)),
+ new Node('j',0, true,
+ NULL,
+ new Node('1',0, true,
+ new Node('\'',0, true, NULL, NULL),
+ NULL))))),
+ new Node('t',0, true,
+ new Node('n',0, true,
+ new Node('d',0, true,
+ new Node('b',0, true,
+ new Node('6',0, true,
+ NULL,
+ new Node('-',0, true, NULL, NULL)),
+ new Node('=',0, true, NULL, NULL)),
+ new Node('x',0, true,
+ new Node('/',0, true, NULL, NULL),
+ NULL)),
+ new Node('k',0, true,
+ new Node('c',0, true,
+ NULL,
+ new Node(' ',0, false,
+ new Node(';',0, true, NULL, NULL),
+ new Node('1',KEY_SHIFT, true, NULL, NULL))),
+ new Node('y',0, true,
+ new Node('9',KEY_SHIFT, true,
+ NULL,
+ new Node('0',KEY_SHIFT, true, NULL, NULL)),
+ NULL))),
+ new Node('m',0, true,
+ new Node('g',0, true,
+ new Node('z',0, true,
+ new Node('7',0, true, NULL, NULL),
+ new Node(' ',0, false,
+ NULL,
+ new Node(',',0, true, NULL, NULL))),
+ new Node('q',0, true, NULL, NULL)),
+ new Node('o',0, true,
+ new Node(' ',0, false,
+ new Node('8',0, true,
+ new Node(';',KEY_SHIFT, true, NULL, NULL),
+ NULL),
+ NULL),
+ new Node(' ',0, false,
+ new Node('9',0, true, NULL, NULL),
+ new Node('0',0, true, NULL, NULL))))));
+
+
+ superHead = head;
+ redled = 0;
+ greenled = 1;
+ blueled = 1;
+ t.start();
+ timerTime = t.read();
+ float tempTime;
+ while(1) {
+ // Non-character buttons, tried with interrupts but would send multiple keys, not sure why
+ if (space == 1) {
+ spaceActive = false;
+ } else if ((space == 0) && !spaceActive) {
+ spaceActive = true;
+ keyboard.keyCode(' ');
+ head = superHead;
+ timerTime = t.read();
+ continue;
+ }
+
+ if (enter == 1) {
+ enterActive = false;
+ } else if ((enter == 0) && !enterActive) {
+ enterActive = true;
+ keyboard.printf("\r\n");
+ head = superHead;
+ timerTime = t.read();
+ continue;
+ }
+ if (backspace == 1) {
+ backspaceActive = false;
+ } else if ((backspace == 0) && !backspaceActive) {
+ backspaceActive = true;
+ keyboard.keyCode(8);
+ head = superHead;
+ timerTime = t.read();
+ continue;
+ }
+ if (capsLock == 1) {
+ capsLockActive = false;
+ } else if ((capsLock == 0) && !capsLockActive) {
+ capsLockActive = true;
+ keyboard.keyCode(KEY_CAPS_LOCK);
+ head = superHead;
+ timerTime = t.read();
+ blueled = 1 - blueled;
+ capsled = 1- capsled;
+ continue;
+ }
+
+
+ // press a button, advance the tree state
+ if ((dit == 0) && !ditActive){
+ ditActive = true;
+ head = head->left;
+ timerTime = t.read();
+ } else if ((dah == 0) && !dahActive) {
+ dahActive = true;
+ head = head->right;
+ timerTime = t.read();
+ } else {
+ if (dit == 1) {
+ ditActive = false;
+ }
+ if (dah == 1) {
+ dahActive = false;
+ }
+ }
+ // after a certain delay, send the key, reset the tree
+ tempTime = t.read();
+ if ((tempTime - timerTime) > 0.3f) {
+ if (head->display) {
+ keyboard.keyCode(head->character, head->modifier);
+ redled = 1-redled;
+ greenled = 1-greenled;
+ }
+ timerTime = t.read();
+ head = superHead;
+ }
+ }
+}
