TLAPD program ported to mbed and cleaned up, originally from Arduino. GPL licensed.

Dependencies:   mbed

Committer:
boltonja
Date:
Fri Sep 19 17:10:23 2014 +0000
Revision:
1:6f09c27a966f
Parent:
0:c1bb102a0fe2
Final-ish version of the Yarrduino, for TLAPD 2014.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
boltonja 1:6f09c27a966f 1 // Yarrduino
boltonja 1:6f09c27a966f 2 // Copyright 2013, 2014, J. Bolton
boltonja 1:6f09c27a966f 3 // This program is redistributable under the GNU General Public License, version 3.
boltonja 1:6f09c27a966f 4
boltonja 0:c1bb102a0fe2 5 #include "mbed.h"
boltonja 0:c1bb102a0fe2 6
boltonja 0:c1bb102a0fe2 7 // For Freescale FRDM-KL25Z target.
boltonja 0:c1bb102a0fe2 8
boltonja 0:c1bb102a0fe2 9 Serial pc(USBTX, USBRX);
boltonja 0:c1bb102a0fe2 10
boltonja 0:c1bb102a0fe2 11 #define USE_RGB
boltonja 0:c1bb102a0fe2 12
boltonja 0:c1bb102a0fe2 13 #ifdef USE_RGB
boltonja 0:c1bb102a0fe2 14 PwmOut r (LED_RED);
boltonja 0:c1bb102a0fe2 15 PwmOut g (LED_GREEN);
boltonja 0:c1bb102a0fe2 16 PwmOut b (LED_BLUE);
boltonja 0:c1bb102a0fe2 17 #else
boltonja 0:c1bb102a0fe2 18 #define LED_OFF 1
boltonja 0:c1bb102a0fe2 19 #define LED_ON 0
boltonja 0:c1bb102a0fe2 20 DigitalOut myled(LED1);
boltonja 0:c1bb102a0fe2 21 #endif
boltonja 1:6f09c27a966f 22 enum char_class {
boltonja 1:6f09c27a966f 23 LETTER = 0,
boltonja 1:6f09c27a966f 24 NUMBER = 1,
boltonja 1:6f09c27a966f 25 PUNCTUATION = 2
boltonja 1:6f09c27a966f 26 };
boltonja 1:6f09c27a966f 27
boltonja 1:6f09c27a966f 28 enum char_class color = LETTER;
boltonja 0:c1bb102a0fe2 29
boltonja 0:c1bb102a0fe2 30 void led_off(void)
boltonja 0:c1bb102a0fe2 31 {
boltonja 0:c1bb102a0fe2 32 #ifdef USE_RGB
boltonja 0:c1bb102a0fe2 33 r = 1.0;
boltonja 0:c1bb102a0fe2 34 g = 1.0;
boltonja 0:c1bb102a0fe2 35 b = 1.0;
boltonja 0:c1bb102a0fe2 36 #else
boltonja 0:c1bb102a0fe2 37 myled = LED_OFF;
boltonja 0:c1bb102a0fe2 38 #endif
boltonja 0:c1bb102a0fe2 39 }
boltonja 0:c1bb102a0fe2 40
boltonja 0:c1bb102a0fe2 41 void led_on(void)
boltonja 0:c1bb102a0fe2 42 {
boltonja 0:c1bb102a0fe2 43 #ifdef USE_RGB
boltonja 1:6f09c27a966f 44 if (color == NUMBER) {
boltonja 0:c1bb102a0fe2 45 r = 0;
boltonja 0:c1bb102a0fe2 46 g = 1.0;
boltonja 0:c1bb102a0fe2 47 b = 1.0;
boltonja 1:6f09c27a966f 48 } else if (color == PUNCTUATION){
boltonja 0:c1bb102a0fe2 49 r = 1.0;
boltonja 0:c1bb102a0fe2 50 g = 1.0;
boltonja 0:c1bb102a0fe2 51 b = 0;
boltonja 0:c1bb102a0fe2 52 } else {
boltonja 0:c1bb102a0fe2 53 // hot pink, because RGB LED.
boltonja 0:c1bb102a0fe2 54 r = 1.0 - (90.0/255.0); // 255
boltonja 0:c1bb102a0fe2 55 g = 1.0 - (255.0/255.0); // 105
boltonja 0:c1bb102a0fe2 56 b = 1.0 - (90.0/255.0); // 180
boltonja 0:c1bb102a0fe2 57 }
boltonja 0:c1bb102a0fe2 58 #else
boltonja 0:c1bb102a0fe2 59 myled = LED_ON;
boltonja 0:c1bb102a0fe2 60 #endif
boltonja 0:c1bb102a0fe2 61 }
boltonja 0:c1bb102a0fe2 62
boltonja 0:c1bb102a0fe2 63 char buffer[128];
boltonja 0:c1bb102a0fe2 64 int bufindex;
boltonja 0:c1bb102a0fe2 65 int debugSerial = 1;
boltonja 0:c1bb102a0fe2 66
boltonja 0:c1bb102a0fe2 67 //?{}[];':"^\|&*()^%$#@!`~,.;:
boltonja 0:c1bb102a0fe2 68
boltonja 0:c1bb102a0fe2 69 struct xlate {
boltonja 0:c1bb102a0fe2 70 char ascii;
boltonja 0:c1bb102a0fe2 71 char *morse;
boltonja 0:c1bb102a0fe2 72 };
boltonja 0:c1bb102a0fe2 73
boltonja 0:c1bb102a0fe2 74 struct xlate letters[] = {
boltonja 0:c1bb102a0fe2 75 { 'A', ".-" },
boltonja 0:c1bb102a0fe2 76 { 'B', "-..." },
boltonja 0:c1bb102a0fe2 77 { 'C', "-.-." },
boltonja 0:c1bb102a0fe2 78 { 'D', "-.." },
boltonja 0:c1bb102a0fe2 79 { 'E', "." },
boltonja 0:c1bb102a0fe2 80 { 'F', "..-." },
boltonja 0:c1bb102a0fe2 81 { 'G', "--." },
boltonja 0:c1bb102a0fe2 82 { 'H', "...." },
boltonja 0:c1bb102a0fe2 83 { 'I', ".." },
boltonja 0:c1bb102a0fe2 84 { 'J', ".---" },
boltonja 0:c1bb102a0fe2 85 { 'K', "-.-" },
boltonja 0:c1bb102a0fe2 86 { 'L', ".-.." },
boltonja 0:c1bb102a0fe2 87 { 'M', "--" },
boltonja 0:c1bb102a0fe2 88 { 'N', "-." },
boltonja 0:c1bb102a0fe2 89 { 'O', "---" },
boltonja 0:c1bb102a0fe2 90 { 'P', ".--." },
boltonja 0:c1bb102a0fe2 91 { 'Q', "--.-" },
boltonja 0:c1bb102a0fe2 92 { 'R', ".-." },
boltonja 0:c1bb102a0fe2 93 { 'S', "..." },
boltonja 0:c1bb102a0fe2 94 { 'T', "-" },
boltonja 0:c1bb102a0fe2 95 { 'U', "..-" },
boltonja 0:c1bb102a0fe2 96 { 'V', "...-" },
boltonja 0:c1bb102a0fe2 97 { 'W', ".--" },
boltonja 0:c1bb102a0fe2 98 { 'X', "-..-" },
boltonja 0:c1bb102a0fe2 99 { 'Y', "-.--" },
boltonja 0:c1bb102a0fe2 100 { 'Z', "--.." }
boltonja 0:c1bb102a0fe2 101 };
boltonja 0:c1bb102a0fe2 102
boltonja 0:c1bb102a0fe2 103 struct xlate numbers[] = {
boltonja 0:c1bb102a0fe2 104 { '1', ".----" },
boltonja 0:c1bb102a0fe2 105 { '2', "..---" },
boltonja 0:c1bb102a0fe2 106 { '3', "...--" },
boltonja 0:c1bb102a0fe2 107 { '4', "....-" },
boltonja 0:c1bb102a0fe2 108 { '5', "....." },
boltonja 0:c1bb102a0fe2 109 { '6', "-...." },
boltonja 0:c1bb102a0fe2 110 { '7', "--..." },
boltonja 0:c1bb102a0fe2 111 { '8', "---.." },
boltonja 0:c1bb102a0fe2 112 { '9', "----." },
boltonja 0:c1bb102a0fe2 113 { '0', "-----" },
boltonja 0:c1bb102a0fe2 114 };
boltonja 0:c1bb102a0fe2 115
boltonja 0:c1bb102a0fe2 116 #define APOSTROPHE 39
boltonja 0:c1bb102a0fe2 117
boltonja 0:c1bb102a0fe2 118 struct xlate puncs[] = {
boltonja 0:c1bb102a0fe2 119 { '.', ".-.-.-" },
boltonja 0:c1bb102a0fe2 120 //char *sk = "...-.-";
boltonja 0:c1bb102a0fe2 121 { ',', "--..--" },
boltonja 0:c1bb102a0fe2 122 { '?', "..--.." },
boltonja 0:c1bb102a0fe2 123 { APOSTROPHE, ".----." },
boltonja 0:c1bb102a0fe2 124 { '-', "-....-" },
boltonja 0:c1bb102a0fe2 125 //char *fraction = "-..-." },
boltonja 0:c1bb102a0fe2 126 { '(', "-.--.-" },
boltonja 0:c1bb102a0fe2 127 { ')', "-.--.-" },
boltonja 0:c1bb102a0fe2 128 { '"', ".-..-." },
boltonja 0:c1bb102a0fe2 129 { '!', "-.-.--" },
boltonja 0:c1bb102a0fe2 130 { '/', "-..-." },
boltonja 0:c1bb102a0fe2 131 { 0, 0 }
boltonja 0:c1bb102a0fe2 132 };
boltonja 0:c1bb102a0fe2 133
boltonja 0:c1bb102a0fe2 134
boltonja 0:c1bb102a0fe2 135 char *xlate_morse(char c)
boltonja 0:c1bb102a0fe2 136 {
boltonja 0:c1bb102a0fe2 137 char i;
boltonja 0:c1bb102a0fe2 138
boltonja 0:c1bb102a0fe2 139 if (c <= 'z' && c >='a') {
boltonja 1:6f09c27a966f 140 color = LETTER;
boltonja 0:c1bb102a0fe2 141 return letters[c-'a'].morse;
boltonja 0:c1bb102a0fe2 142 }
boltonja 0:c1bb102a0fe2 143
boltonja 0:c1bb102a0fe2 144 if (c <= 'Z' && c >= 'A') {
boltonja 1:6f09c27a966f 145 color = LETTER;
boltonja 0:c1bb102a0fe2 146 return letters[c-'A'].morse;
boltonja 0:c1bb102a0fe2 147 }
boltonja 0:c1bb102a0fe2 148
boltonja 0:c1bb102a0fe2 149 if (c <= '9' && c >= '0') {
boltonja 1:6f09c27a966f 150 color = NUMBER;
boltonja 0:c1bb102a0fe2 151 return letters[c-'0'].morse;
boltonja 0:c1bb102a0fe2 152 }
boltonja 0:c1bb102a0fe2 153
boltonja 0:c1bb102a0fe2 154 for (i=0; puncs[i].ascii; i++) {
boltonja 1:6f09c27a966f 155 color = PUNCTUATION;
boltonja 0:c1bb102a0fe2 156 if (puncs[i].ascii == c) {
boltonja 0:c1bb102a0fe2 157 return puncs[i].morse;
boltonja 0:c1bb102a0fe2 158 }
boltonja 0:c1bb102a0fe2 159 }
boltonja 0:c1bb102a0fe2 160
boltonja 0:c1bb102a0fe2 161 return (char *)0;
boltonja 0:c1bb102a0fe2 162 }
boltonja 0:c1bb102a0fe2 163
boltonja 0:c1bb102a0fe2 164 int worddelay = 500;
boltonja 0:c1bb102a0fe2 165 int glyphdelay = 300;
boltonja 0:c1bb102a0fe2 166 int ditdelay = 200;
boltonja 0:c1bb102a0fe2 167 int dahdelay = 600;
boltonja 0:c1bb102a0fe2 168 int pulsedelay = 100;
boltonja 0:c1bb102a0fe2 169
boltonja 0:c1bb102a0fe2 170 void delay(int ms)
boltonja 0:c1bb102a0fe2 171 {
boltonja 0:c1bb102a0fe2 172 wait_ms(ms);
boltonja 0:c1bb102a0fe2 173 }
boltonja 0:c1bb102a0fe2 174
boltonja 0:c1bb102a0fe2 175 void write_morse(char buf[], int len)
boltonja 0:c1bb102a0fe2 176 {
boltonja 0:c1bb102a0fe2 177 char *outbuf;
boltonja 0:c1bb102a0fe2 178
boltonja 0:c1bb102a0fe2 179 led_off();
boltonja 0:c1bb102a0fe2 180
boltonja 0:c1bb102a0fe2 181 for (int i=0; i<len; i++) {
boltonja 0:c1bb102a0fe2 182 if (pc.readable()) {
boltonja 0:c1bb102a0fe2 183 break;
boltonja 0:c1bb102a0fe2 184 }
boltonja 0:c1bb102a0fe2 185 if (buf[i] == ' ') {
boltonja 0:c1bb102a0fe2 186 delay(worddelay);
boltonja 0:c1bb102a0fe2 187 } else {
boltonja 0:c1bb102a0fe2 188 outbuf = xlate_morse(buf[i]);
boltonja 0:c1bb102a0fe2 189 pc.printf("%c %s\r\n", buf[i], outbuf);
boltonja 0:c1bb102a0fe2 190
boltonja 0:c1bb102a0fe2 191 for (int j = 0; outbuf[j]; j++) {
boltonja 0:c1bb102a0fe2 192 led_on();
boltonja 0:c1bb102a0fe2 193 delay((outbuf[j] == '-') ? dahdelay : ditdelay);
boltonja 0:c1bb102a0fe2 194 led_off();
boltonja 0:c1bb102a0fe2 195 delay(pulsedelay);
boltonja 0:c1bb102a0fe2 196 }
boltonja 0:c1bb102a0fe2 197 delay(glyphdelay);
boltonja 0:c1bb102a0fe2 198 }
boltonja 0:c1bb102a0fe2 199 }
boltonja 0:c1bb102a0fe2 200 }
boltonja 0:c1bb102a0fe2 201
boltonja 0:c1bb102a0fe2 202
boltonja 0:c1bb102a0fe2 203 void read_buffer(char buf[], int &idx, int maxsize)
boltonja 0:c1bb102a0fe2 204 {
boltonja 0:c1bb102a0fe2 205 int inchar;
boltonja 0:c1bb102a0fe2 206 idx = 0;
boltonja 0:c1bb102a0fe2 207 pc.printf("enter new message\r\n");
boltonja 0:c1bb102a0fe2 208 for (;;) {
boltonja 0:c1bb102a0fe2 209 while (!pc.readable()) { } ;
boltonja 0:c1bb102a0fe2 210
boltonja 0:c1bb102a0fe2 211 inchar = pc.getc();
boltonja 0:c1bb102a0fe2 212
boltonja 0:c1bb102a0fe2 213 if (debugSerial) {
boltonja 0:c1bb102a0fe2 214 pc.printf("read: %c", inchar);
boltonja 0:c1bb102a0fe2 215 pc.printf(" current index: %d\r\n", idx);
boltonja 0:c1bb102a0fe2 216 }
boltonja 0:c1bb102a0fe2 217
boltonja 0:c1bb102a0fe2 218 if (inchar != '|') {
boltonja 0:c1bb102a0fe2 219 buf[idx++] = inchar;
boltonja 0:c1bb102a0fe2 220 }
boltonja 0:c1bb102a0fe2 221
boltonja 0:c1bb102a0fe2 222 if ((idx == maxsize-1) || inchar == '|') {
boltonja 0:c1bb102a0fe2 223 buf[idx] = (char) 0;
boltonja 0:c1bb102a0fe2 224 pc.printf("received: %d bytes.\r\n", idx);
boltonja 0:c1bb102a0fe2 225 pc.printf("%s\r\n", buf);
boltonja 0:c1bb102a0fe2 226 return;
boltonja 0:c1bb102a0fe2 227 }
boltonja 0:c1bb102a0fe2 228 }
boltonja 0:c1bb102a0fe2 229 }
boltonja 0:c1bb102a0fe2 230
boltonja 0:c1bb102a0fe2 231 void loop()
boltonja 0:c1bb102a0fe2 232 {
boltonja 0:c1bb102a0fe2 233 if (pc.readable() > 0) {
boltonja 0:c1bb102a0fe2 234 read_buffer(buffer, bufindex, sizeof(buffer));
boltonja 0:c1bb102a0fe2 235 }
boltonja 0:c1bb102a0fe2 236
boltonja 0:c1bb102a0fe2 237 write_morse(buffer, bufindex);
boltonja 0:c1bb102a0fe2 238 }
boltonja 0:c1bb102a0fe2 239
boltonja 0:c1bb102a0fe2 240 int main()
boltonja 0:c1bb102a0fe2 241 {
boltonja 0:c1bb102a0fe2 242 led_off();
boltonja 0:c1bb102a0fe2 243
boltonja 1:6f09c27a966f 244 strcpy(buffer, "yarr, matey!");
boltonja 1:6f09c27a966f 245 bufindex = 12;
boltonja 0:c1bb102a0fe2 246
boltonja 0:c1bb102a0fe2 247 while(1) {
boltonja 0:c1bb102a0fe2 248 loop();
boltonja 0:c1bb102a0fe2 249 }
boltonja 0:c1bb102a0fe2 250 }