[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
src/protocols/AX25

View file

@ -154,23 +154,25 @@ void AX25Frame::setSendSequence(uint8_t seqNumber) {
AX25Client::AX25Client(PhysicalLayer* phy) { AX25Client::AX25Client(PhysicalLayer* phy) {
phyLayer = phy; phyLayer = phy;
#if !defined(RADIOLIB_EXCLUDE_AFSK) #if !defined(RADIOLIB_EXCLUDE_AFSK)
audioClient = nullptr; bellModem = nullptr;
#endif #endif
} }
#if !defined(RADIOLIB_EXCLUDE_AFSK) #if !defined(RADIOLIB_EXCLUDE_AFSK)
AX25Client::AX25Client(AFSKClient* audio) { AX25Client::AX25Client(AFSKClient* audio) {
phyLayer = audio->phyLayer; phyLayer = audio->phyLayer;
audioClient = audio; bellModem = new BellClient(audio);
afskMark = RADIOLIB_AX25_AFSK_MARK; bellModem->setModem(Bell202);
afskSpace = RADIOLIB_AX25_AFSK_SPACE;
afskLen = RADIOLIB_AX25_AFSK_TONE_DURATION;
} }
int16_t AX25Client::setCorrection(int16_t mark, int16_t space, float length) { int16_t AX25Client::setCorrection(int16_t mark, int16_t space, float length) {
afskMark = RADIOLIB_AX25_AFSK_MARK + mark; BellModem_t modem;
afskSpace = RADIOLIB_AX25_AFSK_SPACE + space; modem.freqMark = Bell202.freqMark + mark;
afskLen = length*(float)RADIOLIB_AX25_AFSK_TONE_DURATION; 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); return(RADIOLIB_ERR_NONE);
} }
#endif #endif
@ -401,27 +403,15 @@ int16_t AX25Client::sendFrame(AX25Frame* frame) {
// transmit // transmit
int16_t state = RADIOLIB_ERR_NONE; int16_t state = RADIOLIB_ERR_NONE;
#if !defined(RADIOLIB_EXCLUDE_AFSK) #if !defined(RADIOLIB_EXCLUDE_AFSK)
if(audioClient != nullptr) { if(bellModem != nullptr) {
Module* mod = phyLayer->getMod(); bellModem->idle();
phyLayer->transmitDirect();
// iterate over all bytes in the buffer // iterate over all bytes in the buffer
for(uint32_t i = 0; i < stuffedFrameBuffLen; i++) { for(uint32_t i = 0; i < stuffedFrameBuffLen; i++) {
bellModem->write(stuffedFrameBuff[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);
}
} }
audioClient->noTone(); bellModem->standby();
} else { } else {
#endif #endif

View file

@ -7,6 +7,7 @@
#include "../PhysicalLayer/PhysicalLayer.h" #include "../PhysicalLayer/PhysicalLayer.h"
#include "../AFSK/AFSK.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 // 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)) ) #define SET_BIT_IN_ARRAY(A, k) ( A[(k/8)] |= (1 << (k%8)) )
@ -23,7 +24,7 @@
// maximum callsign length in bytes // maximum callsign length in bytes
#define RADIOLIB_AX25_MAX_CALLSIGN_LEN 6 #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 #define RADIOLIB_AX25_FLAG 0b01111110 // 7 0 AX.25 frame start/end flag
// address field // address field
@ -73,13 +74,6 @@
#define RADIOLIB_AX25_PID_NO_LAYER_3 0xF0 #define RADIOLIB_AX25_PID_NO_LAYER_3 0xF0
#define RADIOLIB_AX25_PID_ESCAPE_CHARACTER 0xFF #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 \class AX25Frame
\brief Abstraction of AX.25 frame format. \brief Abstraction of AX.25 frame format.
@ -321,10 +315,7 @@ class AX25Client {
PhysicalLayer* phyLayer; PhysicalLayer* phyLayer;
#if !defined(RADIOLIB_EXCLUDE_AFSK) #if !defined(RADIOLIB_EXCLUDE_AFSK)
AFSKClient* audioClient; BellClient* bellModem;
uint32_t afskMark;
uint32_t afskSpace;
uint32_t afskLen;
#endif #endif
char sourceCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1] = {0, 0, 0, 0, 0, 0, 0}; char sourceCallsign[RADIOLIB_AX25_MAX_CALLSIGN_LEN + 1] = {0, 0, 0, 0, 0, 0, 0};