102 lines
2.4 KiB
C++
102 lines
2.4 KiB
C++
#include "Hellschreiber.h"
|
|
|
|
#if !defined(RADIOLIB_EXCLUDE_HELLSCHREIBER)
|
|
|
|
HellClient::HellClient(PhysicalLayer* phy) {
|
|
phyLayer = phy;
|
|
lineFeed = " ";
|
|
#if !defined(RADIOLIB_EXCLUDE_AFSK)
|
|
audioClient = nullptr;
|
|
#endif
|
|
}
|
|
|
|
#if !defined(RADIOLIB_EXCLUDE_AFSK)
|
|
HellClient::HellClient(AFSKClient* audio) {
|
|
phyLayer = audio->phyLayer;
|
|
lineFeed = " ";
|
|
audioClient = audio;
|
|
}
|
|
#endif
|
|
|
|
int16_t HellClient::begin(float base, float rate) {
|
|
// calculate 24-bit frequency
|
|
baseFreqHz = base;
|
|
baseFreq = (base * 1000000.0) / phyLayer->getFreqStep();
|
|
|
|
// calculate "pixel" duration
|
|
pixelDuration = 1000000.0/rate;
|
|
|
|
// configure for direct mode
|
|
return(phyLayer->startDirect());
|
|
}
|
|
|
|
size_t HellClient::printGlyph(uint8_t* buff) {
|
|
// print the character
|
|
Module* mod = phyLayer->getMod();
|
|
bool transmitting = false;
|
|
for(uint8_t mask = 0x40; mask >= 0x01; mask >>= 1) {
|
|
for(int8_t i = RADIOLIB_HELL_FONT_HEIGHT - 1; i >= 0; i--) {
|
|
uint32_t start = mod->hal->micros();
|
|
if((buff[i] & mask) && (!transmitting)) {
|
|
transmitting = true;
|
|
transmitDirect(baseFreq, baseFreqHz);
|
|
} else if((!(buff[i] & mask)) && (transmitting)) {
|
|
transmitting = false;
|
|
standby();
|
|
}
|
|
mod->waitForMicroseconds(start, pixelDuration);
|
|
}
|
|
}
|
|
|
|
// make sure transmitter is off
|
|
standby();
|
|
|
|
return(1);
|
|
}
|
|
|
|
void HellClient::setInversion(bool inv) {
|
|
invert = inv;
|
|
}
|
|
|
|
size_t HellClient::write(uint8_t b) {
|
|
// convert to position in font buffer
|
|
uint8_t pos = b;
|
|
if((pos >= ' ') && (pos <= '_')) {
|
|
pos -= ' ';
|
|
} else if((pos >= 'a') && (pos <= 'z')) {
|
|
pos -= (2*' ');
|
|
} else {
|
|
return(0);
|
|
}
|
|
|
|
// fetch character from flash
|
|
uint8_t buff[RADIOLIB_HELL_FONT_WIDTH];
|
|
buff[0] = 0x00;
|
|
for(uint8_t i = 0; i < RADIOLIB_HELL_FONT_WIDTH - 2; i++) {
|
|
buff[i + 1] = RADIOLIB_NONVOLATILE_READ_BYTE(&HellFont[pos][i]);
|
|
}
|
|
buff[RADIOLIB_HELL_FONT_WIDTH - 1] = 0x00;
|
|
|
|
// print the character
|
|
return(printGlyph(buff));
|
|
}
|
|
|
|
int16_t HellClient::transmitDirect(uint32_t freq, uint32_t freqHz) {
|
|
#if !defined(RADIOLIB_EXCLUDE_AFSK)
|
|
if(audioClient != nullptr) {
|
|
return(audioClient->tone(freqHz));
|
|
}
|
|
#endif
|
|
return(phyLayer->transmitDirect(freq));
|
|
}
|
|
|
|
int16_t HellClient::standby() {
|
|
#if !defined(RADIOLIB_EXCLUDE_AFSK)
|
|
if(audioClient != nullptr) {
|
|
return(audioClient->noTone(invert));
|
|
}
|
|
#endif
|
|
return(phyLayer->standby(RADIOLIB_STANDBY_WARM));
|
|
}
|
|
|
|
#endif
|