You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dvmhost/src/host/setup/LevelAdjustWnd.h

315 lines
12 KiB

// SPDX-License-Identifier: GPL-2.0-only
/*
* Digital Voice Modem - Modem Host Software
* GPLv2 Open Source. Use is subject to license terms.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright (C) 2023 Bryan Biedenkapp, N2PLL
*
*/
/**
* @file LevelAdjustWnd.h
* @ingroup setup
*/
#if !defined(__LEVEL_ADJUST_WND_H__)
#define __LEVEL_ADJUST_WND_H__
#include "common/Thread.h"
#include "setup/HostSetup.h"
#include "setup/AdjustWndBase.h"
#include <final/final.h>
using namespace finalcut;
// ---------------------------------------------------------------------------
// Class Declaration
// ---------------------------------------------------------------------------
/**
* @brief This class implements the modem level adjustment window.
* @ingroup setup
*/
class HOST_SW_API LevelAdjustWnd final : public AdjustWndBase {
public:
/**
* @brief Initializes a new instance of the LevelAdjustWnd class.
* @param setup Instance of the HostSetup class.
* @param widget
*/
explicit LevelAdjustWnd(HostSetup* setup, FWidget* widget = nullptr) : AdjustWndBase{setup, widget}
{
/* stub */
}
private:
FLabel m_softwareLevelLabel{"Software Levels", this};
FLabel m_rxLevelLabel{"Rx Level: ", this};
FLabel m_rxDCOffsetLabel{"Rx DC Offset: ", this};
FLabel m_txLevelLabel{"Tx Level: ", this};
FLabel m_txDCOffsetLabel{"Tx DC Offset: ", this};
FLabel m_softpotLevelLabel{"Softpot Levels", this};
FLabel m_rxCoarseLabel{"Rx Coarse: ", this};
FLabel m_rxFineLabel{"Rx Fine: ", this};
FLabel m_txCoarseLabel{"Tx Coarse: ", this};
FLabel m_rssiCoarseLabel{"RSSI Coarse: ", this};
FLabel m_digitalTimingLabel{"Digital Timing", this};
FLabel m_fdmaPreambleLabel{"FDMA Preambles: ", this};
FLabel m_dmrRxDelayLabel{"DMR Rx Delay: ", this};
FLabel m_p25CorrCountLabel{"P25 Corr. Count: ", this};
FLabel m_freqAdjustLabel{"Hotspot Frequency Offset", this};
FLabel m_rxFreqAdjLabel{"Rx Freq. Offset: ", this};
FLabel m_txFreqAdjLabel{"Tx Freq. Offset: ", this};
FSpinBox m_rxLevel{this};
FSpinBox m_rxDCOffsetLevel{this};
FSpinBox m_txLevel{this};
FSpinBox m_txDCOffsetLevel{this};
FSpinBox m_rxCoarseLevel{this};
FSpinBox m_rxFineLevel{this};
FSpinBox m_txCoarseLevel{this};
FSpinBox m_rssiCoarseLevel{this};
FSpinBox m_fdmaPreambles{this};
FSpinBox m_dmrRxDelay{this};
FSpinBox m_p25CorrCount{this};
FSpinBox m_rxTuning{this};
FSpinBox m_txTuning{this};
/**
* @brief Initializes the window layout.
*/
void initLayout() override
{
FDialog::setText("Modem Level Adjustment");
FDialog::setSize(FSize{65, 22});
AdjustWndBase::initLayout();
}
/**
* @brief Initializes window controls.
*/
void initControls() override
{
// software levels
{
m_softwareLevelLabel.setGeometry(FPoint(2, 1), FSize(20, 2));
m_softwareLevelLabel.setEmphasis();
m_softwareLevelLabel.setAlignment(Align::Center);
m_rxLevelLabel.setGeometry(FPoint(2, 3), FSize(20, 1));
m_rxLevel.setGeometry(FPoint(18, 3), FSize(10, 1));
m_rxLevel.setRange(0, 100);
m_rxLevel.setValue(m_setup->m_modem->m_rxLevel);
m_rxLevel.setShadow(false);
m_rxLevel.addCallback("changed", [&]() {
m_setup->m_modem->m_rxLevel = m_rxLevel.getValue();
Thread::sleep(2);
m_setup->writeConfig();
});
m_rxDCOffsetLabel.setGeometry(FPoint(2, 4), FSize(20, 1));
m_rxDCOffsetLevel.setGeometry(FPoint(18, 4), FSize(10, 1));
m_rxDCOffsetLevel.setRange(-127, 127);
m_rxDCOffsetLevel.setValue(m_setup->m_modem->m_rxDCOffset);
m_rxDCOffsetLevel.setShadow(false);
m_rxDCOffsetLevel.addCallback("changed", [&]() {
m_setup->m_modem->m_rxDCOffset = m_rxDCOffsetLevel.getValue();
Thread::sleep(2);
m_setup->writeConfig();
});
m_txLevelLabel.setGeometry(FPoint(2, 5), FSize(20, 1));
m_txLevel.setGeometry(FPoint(18, 5), FSize(10, 1));
m_txLevel.setRange(0, 100);
m_txLevel.setValue(m_setup->m_modem->m_cwIdTXLevel);
m_txLevel.setShadow(false);
m_txLevel.addCallback("changed", [&]() {
m_setup->m_modem->m_cwIdTXLevel = m_txLevel.getValue();
Thread::sleep(2);
m_setup->writeConfig();
});
m_txDCOffsetLabel.setGeometry(FPoint(2, 6), FSize(20, 1));
m_txDCOffsetLevel.setGeometry(FPoint(18, 6), FSize(10, 1));
m_txDCOffsetLevel.setRange(-127, 127);
m_txDCOffsetLevel.setValue(m_setup->m_modem->m_txDCOffset);
m_txDCOffsetLevel.setShadow(false);
m_txDCOffsetLevel.addCallback("changed", [&]() {
m_setup->m_modem->m_txDCOffset = m_txDCOffsetLevel.getValue();
Thread::sleep(2);
m_setup->writeConfig();
});
}
// digital timing
{
m_digitalTimingLabel.setGeometry(FPoint(32, 1), FSize(20, 2));
m_digitalTimingLabel.setEmphasis();
m_digitalTimingLabel.setAlignment(Align::Center);
m_fdmaPreambleLabel.setGeometry(FPoint(32, 3), FSize(20, 1));
m_fdmaPreambles.setGeometry(FPoint(52, 3), FSize(10, 1));
m_fdmaPreambles.setRange(0, 255);
m_fdmaPreambles.setValue(m_setup->m_modem->m_fdmaPreamble);
m_fdmaPreambles.setShadow(false);
m_fdmaPreambles.addCallback("changed", [&]() {
m_setup->m_modem->m_fdmaPreamble = m_fdmaPreambles.getValue();
Thread::sleep(2);
m_setup->writeConfig();
});
m_dmrRxDelayLabel.setGeometry(FPoint(32, 4), FSize(20, 1));
m_dmrRxDelay.setGeometry(FPoint(52, 4), FSize(10, 1));
m_dmrRxDelay.setRange(0, 255);
m_dmrRxDelay.setValue(m_setup->m_modem->m_dmrRxDelay);
m_dmrRxDelay.setShadow(false);
m_dmrRxDelay.addCallback("changed", [&]() {
m_setup->m_modem->m_dmrRxDelay = m_dmrRxDelay.getValue();
Thread::sleep(2);
m_setup->writeConfig();
});
m_p25CorrCountLabel.setGeometry(FPoint(32, 5), FSize(20, 1));
m_p25CorrCount.setGeometry(FPoint(52, 5), FSize(10, 1));
m_p25CorrCount.setRange(0, 255);
m_p25CorrCount.setValue(m_setup->m_modem->m_p25CorrCount);
m_p25CorrCount.setShadow(false);
m_p25CorrCount.addCallback("changed", [&]() {
m_setup->m_modem->m_p25CorrCount = m_p25CorrCount.getValue();
Thread::sleep(2);
m_setup->writeConfig();
});
}
// softpot levels
{
m_softpotLevelLabel.setGeometry(FPoint(2, 8), FSize(20, 2));
m_softpotLevelLabel.setEmphasis();
m_softpotLevelLabel.setAlignment(Align::Center);
m_rxCoarseLabel.setGeometry(FPoint(2, 10), FSize(20, 1));
m_rxCoarseLevel.setGeometry(FPoint(18, 10), FSize(10, 1));
m_rxCoarseLevel.setRange(0, 255);
m_rxCoarseLevel.setValue(m_setup->m_modem->m_rxCoarsePot);
m_rxCoarseLevel.setShadow(false);
m_rxCoarseLevel.addCallback("changed", [&]() {
m_setup->m_modem->m_rxCoarsePot = m_rxCoarseLevel.getValue();
Thread::sleep(2);
m_setup->writeConfig();
});
m_rxFineLabel.setGeometry(FPoint(2, 11), FSize(20, 1));
m_rxFineLevel.setGeometry(FPoint(18, 11), FSize(10, 1));
m_rxFineLevel.setRange(0, 255);
m_rxFineLevel.setValue(m_setup->m_modem->m_rxFinePot);
m_rxFineLevel.setShadow(false);
m_rxFineLevel.addCallback("changed", [&]() {
m_setup->m_modem->m_rxFinePot = m_rxFineLevel.getValue();
Thread::sleep(2);
m_setup->writeConfig();
});
m_txCoarseLabel.setGeometry(FPoint(2, 12), FSize(20, 1));
m_txCoarseLevel.setGeometry(FPoint(18, 12), FSize(10, 1));
m_txCoarseLevel.setRange(0, 255);
m_txCoarseLevel.setValue(m_setup->m_modem->m_txCoarsePot);
m_txCoarseLevel.setShadow(false);
m_txCoarseLevel.addCallback("changed", [&]() {
m_setup->m_modem->m_txCoarsePot = m_txCoarseLevel.getValue();
Thread::sleep(2);
m_setup->writeConfig();
});
m_rssiCoarseLabel.setGeometry(FPoint(2, 13), FSize(20, 1));
m_rssiCoarseLevel.setGeometry(FPoint(18, 13), FSize(10, 1));
m_rssiCoarseLevel.setRange(0, 255);
m_rssiCoarseLevel.setValue(m_setup->m_modem->m_rssiCoarsePot);
m_rssiCoarseLevel.setShadow(false);
m_rssiCoarseLevel.addCallback("changed", [&]() {
m_setup->m_modem->m_rssiCoarsePot = m_rssiCoarseLevel.getValue();
Thread::sleep(2);
m_setup->writeConfig();
});
}
// frequency offset
{
m_freqAdjustLabel.setGeometry(FPoint(32, 8), FSize(30, 2));
m_freqAdjustLabel.setEmphasis();
m_freqAdjustLabel.setAlignment(Align::Center);
m_rxFreqAdjLabel.setGeometry(FPoint(32, 10), FSize(20, 1));
m_rxTuning.setGeometry(FPoint(52, 10), FSize(10, 1));
m_rxTuning.setRange(-100000, 100000);
m_rxTuning.setValue(m_setup->m_modem->m_rxTuning);
m_rxTuning.setShadow(false);
m_rxTuning.addCallback("changed", [&]() {
m_setup->m_modem->m_rxTuning = m_rxTuning.getValue();
Thread::sleep(2);
m_setup->calculateRxTxFreq();
m_setup->writeRFParams();
Thread::sleep(2);
m_setup->writeConfig();
});
m_txFreqAdjLabel.setGeometry(FPoint(32, 12), FSize(20, 1));
m_txTuning.setGeometry(FPoint(52, 12), FSize(10, 1));
m_txTuning.setRange(-100000, 100000);
m_txTuning.setValue(m_setup->m_modem->m_txTuning);
m_txTuning.setShadow(false);
m_txTuning.addCallback("changed", [&]() {
m_setup->m_modem->m_txTuning = m_txTuning.getValue();
Thread::sleep(2);
m_setup->calculateRxTxFreq();
m_setup->writeRFParams();
Thread::sleep(2);
m_setup->writeConfig();
});
}
// setup control states
if (m_setup->m_isConnected) {
if (m_setup->m_modem->m_isHotspot) {
m_p25CorrCount.setDisable();
m_rxLevel.setDisable();
m_rxDCOffsetLevel.setDisable();
m_txDCOffsetLevel.setDisable();
m_rxCoarseLevel.setDisable();
m_rxFineLevel.setDisable();
m_txCoarseLevel.setDisable();
m_rssiCoarseLevel.setDisable();
m_rxTuning.setEnable();
m_txTuning.setEnable();
}
else {
m_p25CorrCount.setEnable();
m_rxLevel.setEnable();
m_rxDCOffsetLevel.setEnable();
m_txDCOffsetLevel.setEnable();
m_rxCoarseLevel.setEnable();
m_rxFineLevel.setEnable();
m_txCoarseLevel.setEnable();
m_rssiCoarseLevel.setEnable();
m_rxTuning.setDisable();
m_txTuning.setDisable();
}
}
AdjustWndBase::initControls();
}
};
#endif // __LEVEL_ADJUST_WND_H__

Powered by TurnKey Linux.