Jillian Bolton
/
yarrduinoooo
TLAPD program ported to mbed and cleaned up, originally from Arduino. GPL licensed.
main.cpp@1:6f09c27a966f, 2014-09-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |