I didn't see any other mention of morsecode, but personally I find it a rather nifty way to interface with the watch. In the interest of seeing other's use it, or better yet, improve my code, here's the respective code.
Since I haven't built a local toolchain yet, I'm just catting all my .c files into one chunk and sending to compileandload that way. Thus no header :>
The idea is you add updates in your button up/ down/ main loop event loops and pass in the current millisecond time. The timing of dot vs dash is the MORSE_DOT define - my experiments found 250 best - 200 still got some false dashes.
I was only caring about RAM usage, not code size when writing this, so ways to crunch the code to be smaller would be appreciated.
// // Defines the morse functions. // Hook up, passing in current millisec // morse_buttondown(int ms) // morse_buttonup(int ms) // morse_mainloop(int ms) // // Read with, which return 0 if none on stack. // u8 morse_getchar() // // RAM use: 11 bytes //
// // Prototypes // u8 morse_getchar(); void morse_mainloop(int ms); void morse_buttonup(int ms); void morse_buttondown(int ms); void morse_reset();
// // Implementation //
#define MORSE_DOT 250 #define MORSE_ENDOFSYMBOL 400 #define MORSE_SPACEPUSH 1100
u32 morse_downtime = 0; u32 morse_uptime = 0;
u8 morse_seq; u8 morse_symbols = 0; u8 morse_char = 0;
void morse_pushdot() { // zero by default morse_symbols++; }
void morse_pushdash() { morse_seq |= 1 << morse_symbols; morse_symbols++; }
void morse_pushchar(u8 c) { morse_char = c; }
void morse_pushcode() { if (morse_symbols == 0) return;
if (morse_symbols < 5) { const char *lut = // " " // oI "et" // oIoI // ooII "inam" // oIoIoIoI // ooIIooII // ooooIIII "sdrgukwo" // oIoIoIoIoIoIoIoI // ooIIooIIooIIooII // ooooIIIIooooIIII // ooooooooIIIIIIII "hblzfcp-vx-q-yj-" ; int off; off = 1 << morse_symbols; off--; off += morse_seq; morse_pushchar(lut[off]); }
// Longer lengths take special codes. else if (morse_symbols == 5) { // NOTE: These are all backwards bit patterns! switch (morse_seq) { // Number patterns case 0b11110: morse_pushchar('1'); break; case 0b11100: morse_pushchar('2'); break; case 0b11000: morse_pushchar('3'); break; case 0b10000: morse_pushchar('4'); break; case 0b00000: morse_pushchar('5'); break; case 0b00001: morse_pushchar('6'); break; case 0b00011: morse_pushchar('7'); break; case 0b00111: morse_pushchar('8'); break; case 0b01111: morse_pushchar('9'); break; case 0b11111: morse_pushchar('0'); break;
// Punctuation case 0b01001: morse_pushchar('/'); break; case 0b01101: morse_pushchar('('); break; case 0b00010: morse_pushchar('&'); break; case 0b10001: morse_pushchar('='); break; case 0b01010: morse_pushchar('+'); break; } } else if (morse_symbols == 6) { // NOTE: These are all backwards bit patterns! switch (morse_seq) { case 0b000000: // All e's, error code. morse_pushchar('\b'); break; case 0b101010: morse_pushchar('.'); break; case 0b110011: morse_pushchar(','); break; case 0b001100: morse_pushchar('?'); break; case 0b011110: morse_pushchar('\''); break; case 0b101011: morse_pushchar('!'); break; case 0b101101: morse_pushchar(')'); break; case 0b000111: morse_pushchar(':'); break; case 0b010101: morse_pushchar(';'); break; case 0b100001: morse_pushchar('-'); break; case 0b101100: morse_pushchar('_'); break; case 0b010010: morse_pushchar('"'); break;
// Recent addition from 2004. case 0b010110: morse_pushchar('@'); break;
} }
else if (morse_symbols == 7) { switch (morse_seq) { case 0b0000000: // All e's, error code. morse_pushchar('\b'); break; case 0b1001000: morse_pushchar('$'); break; } } // 6 or more e's is considered error, ie, backspace, so // we detect else if (!morse_seq) { morse_pushchar('\b'); }
// Reset in any case. morse_symbols = 0; morse_seq = 0; }
void morse_process(bool signal, int lenms) { if (signal) { if (lenms < MORSE_DOT) morse_pushdot(); else morse_pushdash(); } else { if (lenms > MORSE_ENDOFSYMBOL) { morse_pushcode(); } if (lenms > MORSE_SPACEPUSH) { morse_uptime = 0; morse_pushchar(' '); } } }
void morse_buttondown(int ms) { morse_uptime = 0; morse_downtime = ms; }
void morse_buttonup(int ms) { morse_uptime = ms; morse_process(true, morse_uptime - morse_downtime); morse_downtime = 0; }
void morse_mainloop(int ms) { if (morse_uptime) { morse_process(false, ms - morse_uptime); } }
u8 morse_getchar() { u8 c; c = morse_char; morse_char = 0; return c; }
void morse_reset() { morse_char = 0; morse_seq = 0; morse_uptime = 0; }
|