#define M_DASH_THRESHOLD 0.140
#define M_SPACE_THRESHOLD 0.300
U8 *morse_lst=
"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=LstSub(i,morse_lst))
"$RED$%C$FG$ %-7s ",*st,st+1;
if (st=LstSub(i+13,morse_lst))
"$RED$%C$FG$ %-7s ",*st,st+1;
if (st=LstSub(i+26,morse_lst))
"$RED$%C$FG$ %-7s ",*st,st+1;
if (st=LstSub(i+39,morse_lst))
"$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) {
GetMsg(NULL,NULL,1<<MSG_KEY_UP);
m_end=tS;
Snd;
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 (!ScanMsg(&ch,NULL,1<<MSG_KEY_DOWN)) {
dt=tS-m_end;
if (dt>=M_SPACE_THRESHOLD) {
space_sent=TRUE;
return CH_SPACE;
}
Yield;
}
} else
ch=GetChar(,FALSE);
m_start=tS;
Snd(74);
if (ch==CH_SHIFT_ESC || ch==CH_ESC) {
'\n';
Snd;
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_lst;
while (*src) {
if (!StrCmp(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;
}
}
}
Snd;
}
Morse;