From e8f94c25d1d19cafb7e727e0a6af7792dff568d7 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 29 Apr 2023 23:01:50 +0200 Subject: [PATCH] [AX.25] Use Bell modem --- src/protocols/AX25/AX25.cpp | 38 ++++++++++++++----------------------- src/protocols/AX25/AX25.h | 15 +++------------ 2 files changed, 17 insertions(+), 36 deletions(-) diff --git a/src/protocols/AX25/AX25.cpp b/src/protocols/AX25/AX25.cpp index 63f0bc4b..53b4018c 100644 --- a/src/protocols/AX25/AX25.cpp +++ b/src/protocols/AX25/AX25.cpp @@ -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 diff --git a/src/protocols/AX25/AX25.h b/src/protocols/AX25/AX25.h index a769edb8..05399e60 100644 --- a/src/protocols/AX25/AX25.h +++ b/src/protocols/AX25/AX25.h @@ -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};