177 lines
2.5 KiB
HolyC
Executable File
177 lines
2.5 KiB
HolyC
Executable File
#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;
|