98 lines
2.1 KiB
C++
98 lines
2.1 KiB
C++
#include "BellModem.h"
|
|
#if !RADIOLIB_EXCLUDE_BELL
|
|
|
|
const BellModem_t Bell101 = {
|
|
.freqMark = 1270,
|
|
.freqSpace = 1070,
|
|
.baudRate = 110,
|
|
.freqMarkReply = 2225,
|
|
.freqSpaceReply = 2025,
|
|
};
|
|
|
|
const BellModem_t Bell103 = {
|
|
.freqMark = 1270,
|
|
.freqSpace = 1070,
|
|
.baudRate = 300,
|
|
.freqMarkReply = 2225,
|
|
.freqSpaceReply = 2025,
|
|
};
|
|
|
|
const BellModem_t Bell202 = {
|
|
.freqMark = 1200,
|
|
.freqSpace = 2200,
|
|
.baudRate = 1200,
|
|
.freqMarkReply = 1200,
|
|
.freqSpaceReply = 2200,
|
|
};
|
|
|
|
BellClient::BellClient(PhysicalLayer* phy, uint32_t pin) : AFSKClient(phy, pin) {
|
|
this->reply = false;
|
|
}
|
|
|
|
BellClient::BellClient(AFSKClient* aud) : AFSKClient(aud) {
|
|
this->reply = false;
|
|
}
|
|
|
|
int16_t BellClient::begin(const BellModem_t& modem) {
|
|
int16_t state = setModem(modem);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
state = phyLayer->startDirect();
|
|
return(state);
|
|
}
|
|
|
|
int16_t BellClient::setModem(const BellModem_t& modem) {
|
|
this->modemType = modem;
|
|
this->toneLen = (1000000.0f/(float)this->modemType.baudRate)*this->correction;
|
|
return(RADIOLIB_ERR_NONE);
|
|
}
|
|
|
|
int16_t BellClient::setCorrection(float corr) {
|
|
this->correction = corr;
|
|
return(RADIOLIB_ERR_NONE);
|
|
}
|
|
|
|
size_t BellClient::write(uint8_t b) {
|
|
// first get the frequencies
|
|
uint16_t toneMark = this->modemType.freqMark;
|
|
uint16_t toneSpace = this->modemType.freqSpace;
|
|
if(this->reply) {
|
|
toneMark = this->modemType.freqMarkReply;
|
|
toneSpace = this->modemType.freqSpaceReply;
|
|
}
|
|
|
|
// get the Module pointer to access HAL
|
|
Module* mod = this->phyLayer->getMod();
|
|
|
|
if(this->autoStart) {
|
|
phyLayer->transmitDirect();
|
|
}
|
|
|
|
// iterate over the bits and set correct frequencies
|
|
for(uint16_t mask = 0x80; mask >= 0x01; mask >>= 1) {
|
|
RadioLibTime_t start = mod->hal->micros();
|
|
if(b & mask) {
|
|
this->tone(toneMark, false);
|
|
} else {
|
|
this->tone(toneSpace, false);
|
|
}
|
|
mod->waitForMicroseconds(start, this->toneLen);
|
|
}
|
|
|
|
if(this->autoStart) {
|
|
phyLayer->standby();
|
|
}
|
|
return(1);
|
|
}
|
|
|
|
int16_t BellClient::idle() {
|
|
this->autoStart = false;
|
|
return(phyLayer->transmitDirect());
|
|
}
|
|
|
|
int16_t BellClient::standby() {
|
|
this->autoStart = true;
|
|
return(phyLayer->standby());
|
|
}
|
|
|
|
#endif
|