kopia lustrzana https://github.com/OpenRTX/OpenRTX
117 wiersze
3.9 KiB
C++
117 wiersze
3.9 KiB
C++
/***************************************************************************
|
|
* Copyright (C) 2021 - 2025 by Federico Amedeo Izzo IU2NUO, *
|
|
* Niccolò Izzo IU2KIN *
|
|
* Frederik Saraci IU2NRO *
|
|
* Silvano Seva IU2KWO *
|
|
* *
|
|
* 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 *
|
|
* the Free Software Foundation; either version 3 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU General Public License *
|
|
* along with this program; if not, see <http://www.gnu.org/licenses/> *
|
|
***************************************************************************/
|
|
|
|
#ifndef HRC6000_H
|
|
#define HRC6000_H
|
|
|
|
#include <datatypes.h>
|
|
#include "HR_Cx000.h"
|
|
|
|
enum class C6000_SpiOpModes : uint8_t
|
|
{
|
|
AUX = 1, ///< Auxiliary configuration registers.
|
|
DATA = 2, ///< Write TX data register and read RX data register.
|
|
SOUND = 3, ///< Voice prompt sample register.
|
|
CONFIG = 4, ///< Main configuration registers.
|
|
AMBE3K = 5, ///< AMBE3000 configuration register.
|
|
DATA_R = 6, ///< Write RX data register and read TX data register.
|
|
AMBE1K = 7 ///< AMBE1000 configuration register.
|
|
};
|
|
|
|
class HR_C6000 : public HR_Cx000 < C6000_SpiOpModes >
|
|
{
|
|
public:
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param uSpi: pointer to SPI device for "user" SPI interface.
|
|
* @param uCs: gpioPin object for "user" SPI chip select.
|
|
*/
|
|
HR_C6000(const struct spiDevice *uSpi, const struct gpioPin uCs) :
|
|
HR_Cx000< C6000_SpiOpModes >(uSpi, uCs) { }
|
|
|
|
/**
|
|
* Configure CTCSS tone transmission.
|
|
*
|
|
* @param tone: CTCSS tone frequency.
|
|
* @param deviation: CTCSS tone deviation.
|
|
*/
|
|
void setTxCtcss(const tone_t tone, const uint8_t deviation);
|
|
|
|
/**
|
|
* Configure CTCSS tone detection.
|
|
*
|
|
* @param tone: CTCSS tone frequency.
|
|
*/
|
|
void setRxCtcss(const tone_t tone);
|
|
|
|
/**
|
|
* Test if RX CTCSS tone has been detected.
|
|
*
|
|
* @return true if RX CTCSS tone has been detected.
|
|
*/
|
|
inline bool ctcssDetected()
|
|
{
|
|
uint8_t reg = readCfgRegister(0x93);
|
|
return ((reg & 0x01) != 0) ? true : false;
|
|
}
|
|
|
|
/**
|
|
* Disable all tone encode and decode.
|
|
*/
|
|
inline void disableTones()
|
|
{
|
|
writeCfgRegister(0xA1, 0x00); // Disable all tones
|
|
}
|
|
|
|
/**
|
|
* Transmit a tone of a given frequency.
|
|
*
|
|
* @param freq: tone frequency in Hz.
|
|
* @param deviation: tone deviation.
|
|
*/
|
|
void sendTone(const uint32_t freq, const uint8_t deviation);
|
|
|
|
private:
|
|
|
|
/**
|
|
* Write a register with 16-bit address.
|
|
*
|
|
* @param opMode: "operating mode" specifier, see datasheet for details.
|
|
* @param addr: register address.
|
|
* @param value: value to be written.
|
|
*/
|
|
void writeReg16(const C6000_SpiOpModes opMode, const uint16_t addr, const uint8_t value)
|
|
{
|
|
uint8_t data[4];
|
|
|
|
data[0] = static_cast< uint8_t >(opMode) | 0x40;
|
|
data[2] = (addr >> 8) & 0x07;
|
|
data[1] = addr & 0xFF;
|
|
data[3] = value;
|
|
|
|
ScopedChipSelect cs(uSpi, uCs);
|
|
spi_send(uSpi, data, 4);
|
|
}
|
|
};
|
|
|
|
#endif /* HRC6000_H */
|