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/HostSetup.h

380 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) 2015,2016,2017 Jonathan Naylor, G4KLX
* Copyright (C) 2017,2018 Andy Uribe, CA6JAU
* Copyright (C) 2021-2023 Bryan Biedenkapp, N2PLL
*
*/
/**
* @defgroup setup Host Setup
* @brief Implementation for the interactive host setup TUI.
* @ingroup host
*
* @file HostSetup.h
* @ingroup setup
* @file HostSetup.cpp
* @ingroup setup
*/
#if !defined(__HOST_SETUP_H__)
#define __HOST_SETUP_H__
#include "Defines.h"
#include "common/edac/AMBEFEC.h"
#include "common/lookups/IdenTableLookup.h"
#include "common/yaml/Yaml.h"
#include "common/RingBuffer.h"
#include "common/StopWatch.h"
#include "modem/Modem.h"
#include "Host.h"
#include <string>
#if !defined(CATCH2_TEST_COMPILATION)
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
#define DMR_CAL_STR "[Tx] DMR 1200 Hz Tone Mode (2.75Khz Deviation)"
#define P25_CAL_STR "[Tx] P25 1200 Hz Tone Mode (2.83Khz Deviation)"
#define DMR_LF_CAL_STR "[Tx] DMR Low Frequency Mode (80 Hz square wave)"
#define DMR_CAL_1K_STR "[Tx] DMR BS 1031 Hz Test Pattern (TS2 CC1 ID1 TG9)"
#define DMR_DMO_CAL_1K_STR "[Tx] DMR MS 1031 Hz Test Pattern (TS2 CC1 ID1 TG9)"
#define P25_CAL_1K_STR "[Tx] P25 1011 Hz Test Pattern (NAC293 ID1 TG1)"
#define P25_TDU_TEST_STR "[Tx] P25 TDU Data Test Stream"
#define NXDN_CAL_1K_STR "[Tx] NXDN 1031 Hz Test Pattern (RAN1 ID1 TG1)"
#define DMR_FEC_STR "[Rx] DMR MS FEC BER Test Mode"
#define DMR_FEC_1K_STR "[Rx] DMR MS 1031 Hz Test Pattern (CC1 ID1 TG9)"
#define P25_FEC_STR "[Rx] P25 FEC BER Test Mode"
#define P25_FEC_1K_STR "[Rx] P25 1011 Hz Test Pattern (NAC293 ID1 TG1)"
#define NXDN_FEC_STR "[Rx] NXDN FEC BER Test Mode"
#define RSSI_CAL_STR "RSSI Calibration Mode"
// ---------------------------------------------------------------------------
// Class Prototypes
// ---------------------------------------------------------------------------
#if defined(ENABLE_SETUP_TUI)
class HOST_SW_API SetupApplication;
class HOST_SW_API SetupMainWnd;
class HOST_SW_API AdjustWndBase;
class HOST_SW_API CloseWndBase;
class HOST_SW_API LevelAdjustWnd;
class HOST_SW_API SymbLevelAdjustWnd;
class HOST_SW_API HSBandwidthAdjustWnd;
class HOST_SW_API HSGainAdjustWnd;
class HOST_SW_API FIFOBufferAdjustWnd;
class HOST_SW_API LoggingAndDataSetWnd;
class HOST_SW_API SystemConfigSetWnd;
class HOST_SW_API SiteParamSetWnd;
class HOST_SW_API ChannelConfigSetWnd;
#endif // defined(ENABLE_SETUP_TUI)
// ---------------------------------------------------------------------------
// Class Declaration
// ---------------------------------------------------------------------------
/**
* @brief This class implements an interactive session to setup the DVM.
* @ingroup setup
*/
class HOST_SW_API HostSetup {
public:
/**
* @brief Initializes a new instance of the HostSetup class.
* @param confFile Full-path to the configuration file.
*/
HostSetup(const std::string& confFile);
/**
* @brief Finalizes a instance of the HostSetup class.
*/
virtual ~HostSetup();
#if defined(ENABLE_SETUP_TUI)
/**
* @brief Executes the processing loop.
* @param argc main() argc.
* @param argv main() argv.
* @returns int Exit code.
*/
virtual int run(int argc, char** argv);
#else
/**
* @brief Executes the processing loop.
* @param argc main() argc.
* @param argv main() argv.
* @returns int Exit code.
*/
virtual int run(int argc, char **argv) = 0;
#endif // defined(ENABLE_SETUP_TUI)
protected:
#if defined(ENABLE_SETUP_TUI)
friend class SetupApplication;
friend class SetupMainWnd;
friend class AdjustWndBase;
friend class CloseWndBase;
friend class LevelAdjustWnd;
friend class SymbLevelAdjustWnd;
friend class HSBandwidthAdjustWnd;
friend class HSGainAdjustWnd;
friend class FIFOBufferAdjustWnd;
friend class LoggingAndDataSetWnd;
friend class SystemConfigSetWnd;
friend class SiteParamSetWnd;
friend class ChannelConfigSetWnd;
SetupMainWnd* m_setupWnd;
#endif // defined(ENABLE_SETUP_TUI)
const std::string &m_confFile;
yaml::Node m_conf;
StopWatch m_stopWatch;
modem::Modem *m_modem;
RingBuffer<uint8_t> m_queue;
edac::AMBEFEC m_fec;
bool m_transmit;
bool m_duplex;
bool m_startupDuplex;
bool m_dmrEnabled;
bool m_dmrRx1K;
bool m_p25Enabled;
bool m_p25Rx1K;
bool m_p25TduTest;
bool m_nxdnEnabled;
bool m_isHotspot;
bool m_isConnected;
bool m_debug;
uint8_t m_mode;
std::string m_modeStr;
uint32_t m_rxFrequency; // hotspot modem - Rx Frequency
uint32_t m_rxAdjustedFreq;
uint32_t m_txFrequency; // hotspot modem - Tx Frequency
uint32_t m_txAdjustedFreq;
uint8_t m_channelId;
uint32_t m_channelNo;
lookups::IdenTableLookup* m_idenTable;
uint32_t m_berFrames;
uint32_t m_berBits;
uint32_t m_berErrs;
uint32_t m_berUndecodableLC;
uint32_t m_berUncorrectable;
uint32_t m_timeout;
uint32_t m_timer;
bool m_updateConfigFromModem;
bool m_hasFetchedStatus;
bool m_requestedStatus;
bool m_reqBootload;
/**
* @brief Modem port open callback.
* @param modem Instance of the Modem class.
* @returns bool True, if the modem is opened, otherwise false.
*/
bool portModemOpen(modem::Modem* modem);
/**
* @brief Modem port close callback.
* @param modem Instance of the Modem class.
* @returns bool True, if the modem is closed, otherwise false.
*/
bool portModemClose(modem::Modem* modem);
/**
* @brief Modem clock callback.
* @param modem Instance of the Modem class.
* @param ms
* @param rspType Modem message response type.
* @param rspDblLen Flag indicating whether or not this message is a double length message.
* @param[in] buffer Buffer containing modem message.
* @param len Length of buffer.
* @returns bool True, if the modem response was handled, otherwise false.
*/
bool portModemHandler(modem::Modem* modem, uint32_t ms, modem::RESP_TYPE_DVM rspType, bool rspDblLen, const uint8_t* buffer, uint16_t len);
/**
* @brief Helper to save configuration.
*/
void saveConfig();
/**
* @brief Helper to calculate the Rx/Tx frequencies.
* @param consoleDisplay Flag indicating output should goto the console log.
* @param txFrequency Transmit frequency to use (this will auto calculate the Rx frequency from Tx frequency).
* @returns bool True, if Rx/Tx frequencies are calculated, otherwise false.
*/
bool calculateRxTxFreq(bool consoleDisplay = false, uint32_t txFrequency = 0U);
/**
* @brief Helper to log the system configuration parameters.
*/
void displayConfigParams();
/**
* @brief Initializes the modem DSP.
* @param consoleDisplay Flag indicating output should goto the console log.
* @returns bool True, if modem is initialized, otherwise false.
*/
bool createModem(bool consoleDisplay = false);
/**
* @brief Helper to toggle modem transmit mode.
* @returns bool True, if setting was applied, otherwise false.
*/
bool setTransmit();
/**
* @brief Helper to update BER display window.
* @param ber Bit Error Rate.
*/
void updateTUIBER(float ber);
/**
* @brief Process DMR Rx BER.
* @param[in] buffer DMR data to measure for BER.
* @param seq Sequence Number.
*/
void processDMRBER(const uint8_t* buffer, uint8_t seq);
/**
* @brief Process DMR Tx 1011hz BER.
* @param[in] buffer DMR data to measure for BER.
* @param seq Sequence Number.
*/
void processDMR1KBER(const uint8_t* buffer, uint8_t seq);
/**
* @brief Process P25 Rx BER.
* @param[in] buffer P25 data to measure for BER.
*/
void processP25BER(const uint8_t* buffer);
/**
* @brief Process P25 Tx 1011hz BER.
* @param[in] buffer P25 data to measure for BER.
*/
void processP251KBER(const uint8_t* buffer);
/**
* @brief Process NXDN Rx BER.
* @param[in] buffer NXDN data to measure for BER.
*/
void processNXDNBER(const uint8_t* buffer);
/**
* @brief Write configuration to the modem DSP.
* @returns bool True, if configuration is written, otherwise false.
*/
bool writeConfig();
/**
* @brief Write configuration to the modem DSP.
* @param modeOverride Forced modem mode override.
* @returns bool True, if configuration is written, otherwise false.
*/
bool writeConfig(uint8_t modeOverride);
/**
* @brief Write RF parameters to the air interface modem.
* @returns bool True, if parameters are written, otherwise false.
*/
bool writeRFParams();
/**
* @brief Write symbol level adjustments to the modem DSP.
* @returns bool True, if adjustments are written, otherwise false.
*/
bool writeSymbolAdjust();
/**
* @brief Write transmit FIFO buffer lengths.
* @returns bool True, if FIFO buffer lengths are written, otherwise false.
*/
bool writeFifoLength();
/**
* @brief Helper to sleep the calibration thread.
*/
void sleep(uint32_t ms);
/**
* @brief Read the configuration area on the air interface modem.
* @returns bool True, if modem flash was read, otherwise false.
*/
bool readFlash();
/**
* @brief Process the configuration data from the air interface modem.
* @param[in] buffer Buffer containing configuration data from modem.
*/
void processFlashConfig(const uint8_t *buffer);
/**
* @brief Erase the configuration area on the air interface modem.
* @returns bool True, if modem coonfiguration area was erased, otherwise false.
*/
bool eraseFlash();
/**
* @brief Write the configuration area on the air interface modem.
* @returns bool True, if modem coonfiguration area was written, otherwise false.
*/
bool writeFlash();
/**
* @brief
*/
void writeBootload();
/**
* @brief Helper to clock the calibration BER timer.
*/
void timerClock();
/**
* @brief Helper to start the calibration BER timer.
*/
void timerStart();
/**
* @brief Helper to stop the calibration BER timer.
*/
void timerStop();
/**
* @brief Retrieve the current status from the air interface modem.
*/
void getStatus();
#if defined(ENABLE_SETUP_TUI)
/**
* @brief Prints the current status.
*/
virtual void printStatus();
#else
/**
* @brief Prints the current status.
*/
virtual void printStatus() = 0;
#endif // defined(ENABLE_SETUP_TUI)
/**
* @brief Add data frame to the data ring buffer.
* @param[in] data Data to add to ring buffer.
* @param length Length of data.
* @param maxFrameSize
*/
void addFrame(const uint8_t* data, uint32_t length, uint32_t maxFrameSize);
/**
* @brief Counts the total number of bit errors between bytes.
* @param a Byte 1.
* @param b Byte 2.
* @returns uint8_t Number of bit errors between bytes.
*/
uint8_t countErrs(uint8_t a, uint8_t b);
};
#endif // !defined(CATCH2_TEST_COMPILATION)
#endif // __HOST_SETUP_H__

Powered by TurnKey Linux.