/** * Digital Voice Modem - Host Software * GPLv2 Open Source. Use is subject to license terms. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * @package DVM / Host Server * */ /* * Copyright (C) 2018 by Bryan Biedenkapp N2PLL * * 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 2 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #if !defined(__P25_SITE_DATA_H__) #define __P25_SITE_DATA_H__ #include "Defines.h" #include "p25/P25Defines.h" #include "p25/P25Utils.h" namespace p25 { // --------------------------------------------------------------------------- // Class Declaration // Represents site data for P25. // --------------------------------------------------------------------------- class HOST_SW_API SiteData { public: /// Initializes a new instance of the SiteData class. SiteData() : m_lra(0U), m_netId(P25_WACN_STD_DEFAULT), m_sysId(P25_SID_STD_DEFAULT), m_rfssId(1U), m_siteId(1U), m_channelId(1U), m_channelNo(1U), m_serviceClass(P25_SVC_CLS_VOICE | P25_SVC_CLS_DATA), m_isAdjSite(false), m_callsign("CHANGEME"), m_chCnt(0U), m_netActive(false) { /* stub */ } /// Initializes a new instance of the SiteData class. /// P25 Network ID. /// P25 System ID. /// P25 RFSS ID. /// P25 Site ID. /// P25 Location Resource Area. /// Channel ID. /// Channel Number. /// Service class. SiteData(uint32_t netId, uint32_t sysId, uint8_t rfssId, uint8_t siteId, uint8_t lra, uint8_t channelId, uint32_t channelNo, uint8_t serviceClass) : m_lra(0U), m_netId(P25_WACN_STD_DEFAULT), m_sysId(P25_SID_STD_DEFAULT), m_rfssId(1U), m_siteId(1U), m_channelId(1U), m_channelNo(1U), m_serviceClass(P25_SVC_CLS_VOICE | P25_SVC_CLS_DATA), m_isAdjSite(false), m_callsign("CHANGEME"), m_chCnt(0U), m_netActive(false) { // lra clamping if (lra > 0xFFU) // clamp to $FF lra = 0xFFU; // netId clamping netId = P25Utils::netId(netId); // sysId clamping sysId = P25Utils::sysId(sysId); // rfssId clamping rfssId = P25Utils::rfssId(rfssId); // siteId clamping siteId = P25Utils::siteId(siteId); // channel id clamping if (channelId > 15U) channelId = 15U; // channel number clamping if (m_channelNo == 0U) { // clamp to 1 m_channelNo = 1U; } if (m_channelNo > 4095U) { // clamp to 4095 m_channelNo = 4095U; } m_lra = lra; m_netId = netId; m_sysId = sysId; m_rfssId = rfssId; m_siteId = siteId; m_channelId = channelId; m_channelNo = channelNo; m_serviceClass = serviceClass; } /// Helper to set the site callsign. /// Callsign. void setCallsign(std::string callsign) { m_callsign = callsign; } /// Helper to set the site channel count. /// Channel count. void setChCnt(uint8_t chCnt) { m_chCnt = m_chCnt; } /// Helper to set the site network active flag. /// Network active. void setNetActive(bool netActive) { m_netActive = netActive; } /// Helper to set adjacent site data. /// P25 System ID. /// P25 RFSS ID. /// P25 Site ID. /// Channel ID. /// Channel Number. /// Service class. void setAdjSite(uint32_t sysId, uint8_t rfssId, uint8_t siteId, uint8_t channelId, uint32_t channelNo, uint8_t serviceClass) { // sysId clamping sysId = P25Utils::sysId(sysId); // rfssId clamping rfssId = P25Utils::rfssId(rfssId); // siteId clamping siteId = P25Utils::siteId(siteId); // channel id clamping if (channelId > 15U) channelId = 15U; // channel number clamping if (channelNo == 0U) { // clamp to 1 channelNo = 1U; } if (channelNo > 4095U) { // clamp to 4095 channelNo = 4095U; } m_lra = 0U; m_netId = 0U; m_sysId = sysId; m_rfssId = rfssId; m_siteId = siteId; m_channelId = channelId; m_channelNo = channelNo; m_serviceClass = serviceClass; m_isAdjSite = true; m_callsign = "ADJSITE "; m_chCnt = -1; // don't store channel count for adjacent sites m_netActive = true; // adjacent sites are explicitly network active } /// Equals operator. /// /// SiteData & operator=(const SiteData & data) { if (this != &data) { m_lra = data.m_lra; m_netId = data.m_netId; m_sysId = data.m_sysId; m_rfssId = data.m_rfssId; m_siteId = data.m_siteId; m_channelId = data.m_channelId; m_channelNo = data.m_channelNo; m_serviceClass = data.m_serviceClass; m_isAdjSite = data.m_isAdjSite; m_callsign = data.m_callsign; m_chCnt = data.m_chCnt; m_netActive = data.m_netActive; } return *this; } public: /// P25 location resource area. __READONLY_PROPERTY_PLAIN(uint8_t, lra, lra); /// P25 network ID. __READONLY_PROPERTY_PLAIN(uint32_t, netId, netId); /// Gets the P25 system ID. __READONLY_PROPERTY_PLAIN(uint32_t, sysId, sysId); /// P25 RFSS ID. __READONLY_PROPERTY_PLAIN(uint8_t, rfssId, rfssId); /// P25 site ID. __READONLY_PROPERTY_PLAIN(uint8_t, siteId, siteId); /// Channel ID. __READONLY_PROPERTY_PLAIN(uint8_t, channelId, channelId); /// Channel number. __READONLY_PROPERTY_PLAIN(uint32_t, channelNo, channelNo); /// Service class. __READONLY_PROPERTY_PLAIN(uint8_t, serviceClass, serviceClass); /// Flag indicating whether this site data is for an adjacent site. __READONLY_PROPERTY_PLAIN(bool, isAdjSite, isAdjSite); /// Callsign. __READONLY_PROPERTY_PLAIN(std::string, callsign, callsign); /// Count of available channels. __READONLY_PROPERTY_PLAIN(uint8_t, chCnt, chCnt); /// Flag indicating whether this site is a linked active network member. __READONLY_PROPERTY_PLAIN(bool, netActive, netActive); }; } // namespace p25 #endif // __P25_SITE_DATA_H__