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/dmr/packet/ControlSignaling.h

228 lines
9.2 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-2022 Bryan Biedenkapp, N2PLL
*
*/
/**
* @file ControlSignaling.h
* @ingroup host_dmr
* @file ControlSignaling.cpp
* @ingroup host_dmr
*/
#if !defined(__DMR_PACKET_CONTROL_SIGNALING_H__)
#define __DMR_PACKET_CONTROL_SIGNALING_H__
#include "Defines.h"
#include "common/dmr/data/NetData.h"
#include "common/dmr/data/EmbeddedData.h"
#include "common/dmr/lc/LC.h"
#include "common/dmr/lc/CSBK.h"
#include "common/network/BaseNetwork.h"
#include "common/RingBuffer.h"
#include "common/StopWatch.h"
#include "common/Timer.h"
#include "modem/Modem.h"
#include <vector>
namespace dmr
{
// ---------------------------------------------------------------------------
// Class Prototypes
// ---------------------------------------------------------------------------
class HOST_SW_API Slot;
namespace packet
{
// ---------------------------------------------------------------------------
// Class Declaration
// ---------------------------------------------------------------------------
/**
* @brief This class implements core logic for handling DMR control signaling (CSBK)
* packets.
* @ingroup host_dmr
*/
class HOST_SW_API ControlSignaling
{
public:
/** @name Frame Processing */
/**
* @brief Process a data frame from the RF interface.
* @param data Buffer containing data frame.
* @param len Length of data frame.
* @returns bool True, if data frame is processed, otherwise false.
*/
bool process(uint8_t* data, uint32_t len);
/**
* @brief Process a data frame from the network.
* @param[in] data Instance of data::NetData DMR data container class.
* @returns bool True, if data frame is processed, otherwise false.
*/
void processNetwork(const data::NetData& dmrData);
/** @} */
/**
* @brief Helper to write P25 adjacent site information to the network.
*/
void writeAdjSSNetwork();
/** @name Externally Callable CSBK Commands */
/**
* @brief Helper to write a extended function packet on the RF interface.
*/
void writeRF_Ext_Func(uint32_t func, uint32_t arg, uint32_t dstId);
/**
* @brief Helper to write a call alert packet on the RF interface.
*/
void writeRF_Call_Alrt(uint32_t srcId, uint32_t dstId);
/** @} */
private:
friend class dmr::Control;
friend class dmr::Slot;
Slot* m_slot;
bool m_dumpCSBKData;
bool m_verbose;
bool m_debug;
/**
* @brief Initializes a new instance of the ControlSignaling class.
* @param slot DMR slot.
* @param network Instance of the BaseNetwork class.
* @param dumpCSBKData
* @param debug Flag indicating whether DMR debug is enabled.
* @param verbose Flag indicating whether DMR verbose logging is enabled.
*/
ControlSignaling(Slot* slot, network::BaseNetwork* network, bool dumpCSBKData, bool debug, bool verbose);
/**
* @brief Finalizes a instance of the ControlSignaling class.
*/
~ControlSignaling();
/*
** Modem Frame Queuing
*/
/**
* @brief Helper to write a immediate CSBK packet.
* @param csbk CSBK to write to the modem.
*/
void writeRF_CSBK_Imm(lc::CSBK *csbk) { writeRF_CSBK(csbk, true); }
/**
* @brief Helper to write a CSBK packet.
* @param csbk CSBK to write to the modem.
* @param imm Flag indicating the TSBK should be written to the immediate queue.
*/
void writeRF_CSBK(lc::CSBK* csbk, bool imm = false);
/**
* @brief Helper to write a network CSBK packet.
* @param csbk CSBK to write to the network.
*/
void writeNet_CSBK(lc::CSBK* csbk);
/*
** Control Signalling Logic
*/
/**
* @brief Helper to write a ACK RSP packet.
* @param dstId Destination ID.
* @param reason Denial Reason.
* @param responseInfo Response code.
*/
void writeRF_CSBK_ACK_RSP(uint32_t dstId, uint8_t reason, uint8_t responseInfo);
/**
* @brief Helper to write a NACK RSP packet.
* @param dstId Destination ID.
* @param reason Denial Reason.
* @param service Service being denied.
*/
void writeRF_CSBK_NACK_RSP(uint32_t dstId, uint8_t reason, uint8_t service);
/**
* @brief Helper to write a grant packet.
* @param srcId Source Radio ID.
* @param dstId Destination ID.
* @param serviceOptions Service Options.
* @param grp Flag indicating the destination ID is a talkgroup.
* @param net Flag indicating this grant is coming from network traffic.
* @param skip Flag indicating normal grant checking is skipped.
* @param chNo Channel Number.
*/
bool writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_t serviceOptions, bool grp, bool net = false, bool skip = false, uint32_t chNo = 0U);
/**
* @brief Helper to write a data grant packet.
* @param srcId Source Radio ID.
* @param dstId Destination ID.
* @param serviceOptions Service Options.
* @param grp Flag indicating the destination ID is a talkgroup.
* @param net Flag indicating this grant is coming from network traffic.
* @param skip Flag indicating normal grant checking is skipped.
* @param chNo Channel Number.
*/
bool writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, uint8_t serviceOptions, bool grp, bool net = false, bool skip = false, uint32_t chNo = 0U);
/**
* @brief Helper to write a unit registration response packet.
* @param srcId Source Radio ID.
* @param serviceOptions Service Options.
*/
void writeRF_CSBK_U_Reg_Rsp(uint32_t srcId, uint8_t serviceOptions);
/**
* @brief Helper to write a TSCC late entry channel grant packet on the RF interface.
* @param dstId Destination ID.
* @param srcId Source Radio ID.
* @param grp Flag indicating the destination ID is a talkgroup.
*/
void writeRF_CSBK_Grant_LateEntry(uint32_t dstId, uint32_t srcId, bool grp);
/**
* @brief Helper to write a payload activation to a TSCC payload channel on the RF interface.
* @param dstId Destination ID.
* @param srcId Source Radio ID.
* @param grp Flag indicating group grant.
* @param voice Flag indicating if the payload traffic is voice.
* @param imm Flag indicating the TSBK should be written to the immediate queue.
*/
void writeRF_CSBK_Payload_Activate(uint32_t dstId, uint32_t srcId, bool grp, bool voice, bool imm = false);
/**
* @brief Helper to write a payload clear to a TSCC payload channel on the RF interface.
* @param dstId Destination ID.
* @param srcId Source Radio ID.
* @param grp Flag indicating group grant.
* @param imm Flag indicating the TSBK should be written to the immediate queue.
*/
void writeRF_CSBK_Payload_Clear(uint32_t dstId, uint32_t srcId, bool grp, bool imm = false);
/**
* @brief Helper to write a TSCC Aloha broadcast packet on the RF interface.
*/
void writeRF_TSCC_Aloha();
/**
* @brief Helper to write a TSCC Ann-Wd broadcast packet on the RF interface.
* @param channelNo Channel number.
* @param annWd Flag indicating whether the channel is being announced or withdrawn.
* @param uint32_t System Identity.
* @param requireReq Flag indicating this site requires registration.
*/
void writeRF_TSCC_Bcast_Ann_Wd(uint32_t channelNo, bool annWd, uint32_t systemIdentity, bool requireReg);
/**
* @brief Helper to write a TSCC Sys_Parm broadcast packet on the RF interface.
*/
void writeRF_TSCC_Bcast_Sys_Parm();
/**
* @brief Helper to write a TSCC Git Hash broadcast packet on the RF interface.
*/
void writeRF_TSCC_Git_Hash();
};
} // namespace packet
} // namespace dmr
#endif // __DMR_PACKET_CONTROL_SIGNALING_H__

Powered by TurnKey Linux.