/** * 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 * */ // // Based on code from the MMDVMHost project. (https://github.com/g4klx/MMDVMHost) // Licensed under the GPLv2 License (https://opensource.org/licenses/GPL-2.0) // /* * 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" 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) { /* 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) { // lra clamping if (lra > 0xFFU) // clamp to $FF lra = 0xFFU; // netId clamping if (netId == 0U) // clamp to 1 netId = 1U; if (netId > 0xFFFFEU) // clamp to $FFFFE netId = 0xFFFFEU; // sysId clamping if (sysId == 0U) // clamp to 1 sysId = 1U; if (sysId > 0xFFEU) // clamp to $FFE sysId = 0xFFEU; // rfssId clamping if (rfssId == 0U) // clamp to 1 rfssId = 1U; if (rfssId > 0xFEU) // clamp to $FE rfssId = 0xFEU; // siteId clamping if (siteId == 0U) // clamp to 1 siteId = 1U; if (siteId > 0xFEU) // clamp to $FE siteId = 0xFEU; // channel id clamping if (channelId > 15U) channelId = 15U; // channel number clamping if (channelNo == 0U) // clamp to 1 channelNo = 1U; if (channelNo > 4095U) // clamp to 4096 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 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 if (sysId == 0U) // clamp to 1 sysId = 1U; if (sysId > 0xFFEU) // clamp to $FFE sysId = 0xFFEU; // rfssId clamping if (rfssId == 0U) // clamp to 1 rfssId = 1U; if (rfssId > 0xFEU) // clamp to $FE rfssId = 0xFEU; // siteId clamping if (siteId == 0U) // clamp to 1 siteId = 1U; if (siteId > 0xFEU) // clamp to $FE siteId = 0xFEU; // channel id clamping if (channelId > 15U) channelId = 15U; // channel number clamping if (channelNo == 0U) // clamp to 1 channelNo = 1U; if (channelNo > 4095U) // clamp to 4096 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; } /// 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; } 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); /// Channel number. __READONLY_PROPERTY_PLAIN(uint8_t, serviceClass, serviceClass); /// Flag indicating whether this site data is for an adjacent site. __READONLY_PROPERTY_PLAIN(bool, isAdjSite, isAdjSite); }; } // namespace p25 #endif // __P25_SITE_DATA_H__