Regenerate the FICH correctly.

This commit is contained in:
Jonathan Naylor 2020-10-13 10:07:31 +01:00
parent eb2510898d
commit c1171bc052
4 changed files with 40 additions and 5 deletions

View File

@ -19,6 +19,6 @@
#if !defined(VERSION_H)
#define VERSION_H
const char* VERSION = "20200924";
const char* VERSION = "20201013";
#endif

View File

@ -155,9 +155,30 @@ bool CYSFControl::writeModem(unsigned char *data, unsigned int len)
CYSFFICH fich;
bool valid = fich.decode(data + 2U);
if (!valid) {
unsigned char fi = m_lastFICH.getFI();
unsigned char ft = m_lastFICH.getFT();
unsigned char fn = m_lastFICH.getFN();
unsigned char bt = m_lastFICH.getBT();
unsigned char bn = m_lastFICH.getBN();
if (valid)
m_lastFICH = fich;
if (fi == YSF_FI_COMMUNICATIONS && ft > 0U) {
fn++;
if (fn > ft) {
fn = 0U;
if (bt > 0U)
bn++;
}
}
fich.setFI(YSF_FI_COMMUNICATIONS);
fich.setFN(fn);
fich.setFT(ft);
fich.setBN(bn);
fich.setBT(bt);
}
m_lastFICH = fich;
#ifdef notdef
// Stop repeater packets coming through, unless we're acting as a remote gateway

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2016,2017,2019 by Jonathan Naylor G4KLX
* Copyright (C) 2016,2017,2019,2020 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -225,6 +225,18 @@ void CYSFFICH::setFI(unsigned char fi)
m_fich[0U] |= (fi << 6) & 0xC0U;
}
void CYSFFICH::setBN(unsigned char bn)
{
m_fich[0U] &= 0xFCU;
m_fich[0U] |= bn & 0x03U;
}
void CYSFFICH::setBT(unsigned char bt)
{
m_fich[1U] &= 0x3FU;
m_fich[1U] |= (bt << 6) & 0xC0U;
}
void CYSFFICH::setFN(unsigned char fn)
{
m_fich[1U] &= 0xC7U;

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2016,2017,2019 by Jonathan Naylor G4KLX
* Copyright (C) 2016,2017,2019,2020 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -41,6 +41,8 @@ public:
unsigned char getDGId() const;
void setFI(unsigned char fi);
void setBN(unsigned char bn);
void setBT(unsigned char bt);
void setFN(unsigned char fn);
void setFT(unsigned char ft);
void setMR(unsigned char mr);