[AX.25] Use Bell modem

This commit is contained in:
jgromes 2023-04-29 23:01:50 +02:00
parent f1a8333591
commit e8f94c25d1
2 changed files with 17 additions and 36 deletions

View file

@ -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

View file

@ -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};