[AX.25] Use Bell modem
This commit is contained in:
parent
f1a8333591
commit
e8f94c25d1
2 changed files with 17 additions and 36 deletions
|
@ -154,23 +154,25 @@ void AX25Frame::setSendSequence(uint8_t seqNumber) {
|
|||
AX25Client::AX25Client(PhysicalLayer* phy) {
|
||||
phyLayer = phy;
|
||||
#if !defined(RADIOLIB_EXCLUDE_AFSK)
|
||||
audioClient = nullptr;
|
||||
bellModem = nullptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !defined(RADIOLIB_EXCLUDE_AFSK)
|
||||
AX25Client::AX25Client(AFSKClient* audio) {
|
||||
phyLayer = audio->phyLayer;
|
||||
audioClient = audio;
|
||||
afskMark = RADIOLIB_AX25_AFSK_MARK;
|
||||
afskSpace = RADIOLIB_AX25_AFSK_SPACE;
|
||||
afskLen = RADIOLIB_AX25_AFSK_TONE_DURATION;
|
||||
bellModem = new BellClient(audio);
|
||||
bellModem->setModem(Bell202);
|
||||
}
|
||||
|
||||
int16_t AX25Client::setCorrection(int16_t mark, int16_t space, float length) {
|
||||
afskMark = RADIOLIB_AX25_AFSK_MARK + mark;
|
||||
afskSpace = RADIOLIB_AX25_AFSK_SPACE + space;
|
||||
afskLen = length*(float)RADIOLIB_AX25_AFSK_TONE_DURATION;
|
||||
BellModem_t modem;
|
||||
modem.freqMark = Bell202.freqMark + mark;
|
||||
modem.freqSpace = Bell202.freqSpace + space;
|
||||
modem.freqMarkReply = modem.freqMark;
|
||||
modem.freqSpaceReply = modem.freqSpace;
|
||||
modem.baudRate = length*(float)Bell202.baudRate;
|
||||
bellModem->setModem(modem);
|
||||
return(RADIOLIB_ERR_NONE);
|
||||
}
|
||||
#endif
|
||||
|
@ -401,27 +403,15 @@ int16_t AX25Client::sendFrame(AX25Frame* frame) {
|
|||
// transmit
|
||||
int16_t state = RADIOLIB_ERR_NONE;
|
||||
#if !defined(RADIOLIB_EXCLUDE_AFSK)
|
||||
if(audioClient != nullptr) {
|
||||
Module* mod = phyLayer->getMod();
|
||||
phyLayer->transmitDirect();
|
||||
if(bellModem != nullptr) {
|
||||
bellModem->idle();
|
||||
|
||||
// iterate over all bytes in the buffer
|
||||
for(uint32_t i = 0; i < stuffedFrameBuffLen; i++) {
|
||||
|
||||
// check each bit
|
||||
for(uint16_t mask = 0x80; mask >= 0x01; mask >>= 1) {
|
||||
uint32_t start = mod->hal->micros();
|
||||
if(stuffedFrameBuff[i] & mask) {
|
||||
audioClient->tone(afskMark, false);
|
||||
} else {
|
||||
audioClient->tone(afskSpace, false);
|
||||
}
|
||||
mod->waitForMicroseconds(start, afskLen);
|
||||
}
|
||||
|
||||
bellModem->write(stuffedFrameBuff[i]);
|
||||
}
|
||||
|
||||
audioClient->noTone();
|
||||
bellModem->standby();
|
||||
|
||||
} else {
|
||||
#endif
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include "../PhysicalLayer/PhysicalLayer.h"
|
||||
#include "../AFSK/AFSK.h"
|
||||
#include "../BellModem/BellModem.h"
|
||||
|
||||
// macros to access bits in byte array, from http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/1-C-intro/bit-array.html
|
||||
#define SET_BIT_IN_ARRAY(A, k) ( A[(k/8)] |= (1 << (k%8)) )
|
||||
|
@ -23,7 +24,7 @@
|
|||
// maximum callsign length in bytes
|
||||
#define RADIOLIB_AX25_MAX_CALLSIGN_LEN 6
|
||||
|
||||
// flag field MSB LSB DESCRIPTION
|
||||
// flag field MSB LSB DESCRIPTION
|
||||
#define RADIOLIB_AX25_FLAG 0b01111110 // 7 0 AX.25 frame start/end flag
|
||||
|
||||
// address field
|
||||
|
@ -73,13 +74,6 @@
|
|||
#define RADIOLIB_AX25_PID_NO_LAYER_3 0xF0
|
||||
#define RADIOLIB_AX25_PID_ESCAPE_CHARACTER 0xFF
|
||||
|
||||
// AFSK tones in Hz
|
||||
#define RADIOLIB_AX25_AFSK_MARK 1200
|
||||
#define RADIOLIB_AX25_AFSK_SPACE 2200
|
||||
|
||||
// tone duration in us (for 1200 baud AFSK)
|
||||
#define RADIOLIB_AX25_AFSK_TONE_DURATION 833
|
||||
|
||||
/*!
|
||||
\class AX25Frame
|
||||
\brief Abstraction of AX.25 frame format.
|
||||
|
@ -321,10 +315,7 @@ class AX25Client {
|
|||
|
||||
PhysicalLayer* phyLayer;
|
||||
#if !defined(RADIOLIB_EXCLUDE_AFSK)
|
||||
AFSKClient* audioClient;
|
||||
uint32_t afskMark;
|
||||
uint32_t afskSpace;
|
||||
uint32_t afskLen;
|
||||
BellClient* bellModem;
|
||||
#endif
|
||||
|
||||
char sourceCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1] = {0, 0, 0, 0, 0, 0, 0};
|
||||
|
|
Loading…
Add table
Reference in a new issue