#define M_DASH_THRESHOLD 0.140 #define M_SPACE_THRESHOLD 0.300 U8 *morse_list = "A.-\0" "B-...\0" "C-.-.\0" "D-..\0" "E.\0" "F..-.\0" "G--.\0" "H....\0" "I..\0" "J.---\0" "K-.-\0" "L.-..\0" "M--\0" "N-.\0" "O---\0" "P.--.\0" "Q--.-\0" "R.-.\0" "S...\0" "T-\0" "U..-\0" "V...-\0" "W.--\0" "X-..-\0" "Y-.--\0" "Z--..\0" "1.----\0" "2..---\0" "3...--\0" "4....-\0" "5.....\0" "6-....\0" "7--...\0" "8---..\0" "9----.\0" "0-----\0" "/-..-.\0" "+.-.-.\0" "..-.-.-\0" ",--..--\0" "?..--..\0" "(-.--.\0" ")-.--.-\0" "--....-\0" "\".-..-.\0" "_..--.-\0" "'.----.\0" ":---...\0" ";-.-.-.\0" "=-...-\0"; U0 MorseTable() { U8 *st; I64 i = 0; for (i = 0; i < 13; i++ ) { if (st = ListSub(i ,morse_list)) "$RED$%C$FG$ %-7s ", *st, st + 1; if (st = ListSub(i + 13, morse_list)) "$RED$%C$FG$ %-7s ", *st, st + 1; if (st = ListSub(i + 26, morse_list)) "$RED$%C$FG$ %-7s ", *st, st + 1; if (st = ListSub(i + 39, morse_list)) "$RED$%C$FG$ %-7s ", *st, st + 1; '\n'; } '\n'; } F64 m_start, m_end, dt_down, dt_up; Bool space_sent; U8 *MorseTimes(CDoc *, CDocEntry *, CTask *mem_task) { U8 *st = MAlloc(64, mem_task); StrPrint(st, "Down:%10.6f Up:%10.6f", dt_down, dt_up); return st; } I64 MorseWaitKey() { I64 ch; F64 dt; while (TRUE) { if (m_start) { MessageGet(NULL, NULL, 1 << MESSAGE_KEY_UP); m_end = tS; Sound; dt_down = m_end - m_start; m_start = 0; space_sent = FALSE; if (dt_down < M_DASH_THRESHOLD) return '.'; else return '-'; } else { if (!space_sent) { while (!MessageScan(&ch, NULL, 1 << MESSAGE_KEY_DOWN)) { dt = tS - m_end; if (dt >= M_SPACE_THRESHOLD) { space_sent = TRUE; return CH_SPACE; } Yield; } } else ch = CharGet(, FALSE); m_start = tS; Sound(74); if (ch == CH_SHIFT_ESC || ch == CH_ESC) { '\n'; Sound; throw; //exit program } dt_up = m_start - m_end; if (!space_sent && dt_up >= M_SPACE_THRESHOLD) { space_sent = TRUE; return CH_SPACE; } } } } U0 Morse() { CDocEntry *doc_e; I64 ch; U8 buf[8], *dst, *src; MorseTable; m_start = 0; m_end = tS; dt_down = 0; dt_up = 0; space_sent = TRUE; "$GREEN$"; doc_e = DocPrint(DocPut, "$TX+TC,\" \"$"); doc_e->tag_cb = &MorseTimes; "$FG$\n"; dst = buf; while (TRUE) { ch = MorseWaitKey; if (ch == CH_SPACE) { *dst = 0; src = morse_list; while (*src) { if (!StrCompare(src + 1, buf)) { "$GREEN$%C$FG$", *src; break; } else src += StrLen(src) + 1; } '' CH_SPACE; dst = buf; } else { if (dst - buf < sizeof(buf) - 1) { '' ch; *dst++ = ch; } } } Sound; } Morse;