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