RISC-V/hello/morse.cpp

61 lines
2.1 KiB
C++
Raw Normal View History

2024-02-29 12:22:16 +01:00
#include "morse.h"
2024-03-17 16:33:48 +01:00
// Spočteme číslo (pro 1kHz) jako (1000 << 32) / 24000 (24 kHz je samplerate).
static constexpr unsigned F0 = (1000ull << 32) / 24000u;
2024-02-29 12:22:16 +01:00
static const unsigned char compressed_table [] = {
0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0xde, 0xad, 0xed, 0x00, 0xaa, 0xf3, 0xe1, 0xea, 0xa9,
0xbf, 0xbe, 0xbc, 0xb8, 0xb0, 0xa0, 0xa1, 0xa3, 0xa7, 0xaf, 0xc7, 0xd5, 0x00, 0xb1, 0x00, 0xcc,
0xd6, 0x42, 0x81, 0x85, 0x61, 0x20, 0x84, 0x63, 0x80, 0x40, 0x8e, 0x65, 0x82, 0x43, 0x41, 0x67,
0x86, 0x8b, 0x62, 0x60, 0x21, 0x64, 0x88, 0x66, 0x89, 0x8d, 0x83, 0x00, 0x00, 0x00, 0x00, 0xec,
};
2024-03-17 16:33:48 +01:00
Morse::Morse(const GpioClass & pin, const unsigned int ms) noexcept : unit (ms), led (pin),
gen (F0), pwm () {
pwm.attach(gen);
2024-02-29 12:22:16 +01:00
}
2024-03-17 16:33:48 +01:00
const Morse & Morse::operator<< (const char * text) {
for (unsigned n=0; ; n++) {
2024-02-29 12:22:16 +01:00
const char c = text [n];
2024-03-17 16:33:48 +01:00
if (c == '\0') break;
2024-02-29 12:22:16 +01:00
morse_byte mb;
if (c < '\x20') {
} else if (c < '`') {
const int i = c - '\x20';
mb.byte = compressed_table [i];
} else if (c == '`') {
} else if (c <= 'z') {
const int i = c - '\x40';
mb.byte = compressed_table [i];
} else {
}
out (mb);
}
2024-03-17 16:33:48 +01:00
gen.delay (10 * unit);
2024-02-29 12:22:16 +01:00
return * this;
}
/* . => 1 x unit
* - => 3 x unit
* mezera mezi značkami => 1 x unit
* mezera mezi znaky => 3 x unit
* mezera mezi slovy => 7 x unit
* */
2024-03-17 16:33:48 +01:00
void Morse::out (const morse_byte mb) {
2024-02-29 12:22:16 +01:00
/* Finta je v tom, že i když se pole mlen a bits překrývají,
* nevadí to - maximální délka je 6, takže v nejnižším bitu
* mlen může být obsažen 1 bit 6.bitového znaku.
* Takhle napsáno to běhá jen na malém indiánu, přepisovat
* to do bitových posunů nebudu, i když by to bylo čistší.
* */
const unsigned len = mb.mlen > 6u ? 6u : mb.mlen;
2024-03-17 16:33:48 +01:00
if (!len) { gen.delay (4 * unit); return; }
2024-02-29 12:22:16 +01:00
for (unsigned n=0; n<len; n++) {
2024-03-17 16:33:48 +01:00
off ();
gen.delay (unit);
2024-02-29 12:22:16 +01:00
const unsigned v = (1u << n) & mb.bits;
const unsigned d = v ? 3u : 1u;
2024-03-17 16:33:48 +01:00
on ();
gen.delay (d * unit);
off ();
2024-02-29 12:22:16 +01:00
}
2024-03-17 16:33:48 +01:00
gen.delay (3 * unit);
2024-02-29 12:22:16 +01:00
}