/** * 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 Software * */ // // 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) 2016 by Jonathan Naylor G4KLX * Copyright (C) 2017-2019 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_LC__LC_H__) #define __P25_LC__LC_H__ #include "Defines.h" #include "p25/lc/TSBK.h" #include "p25/lc/TDULC.h" #include "p25/SiteData.h" #include "edac/RS634717.h" #include "lookups/IdenTableLookup.h" #include namespace p25 { namespace lc { // --------------------------------------------------------------------------- // Class Prototypes // --------------------------------------------------------------------------- class HOST_SW_API TSBK; class HOST_SW_API TDULC; // --------------------------------------------------------------------------- // Class Declaration // Represents link control data for HDU, LDU1 and 2 packets. // --------------------------------------------------------------------------- class HOST_SW_API LC { public: /// Initializes a new instance of the LC class. LC(); /// Finalizes a instance of the LC class. ~LC(); /// Equals operator. LC& operator=(const LC& data); /// Decode a header data unit. bool decodeHDU(const uint8_t* data); /// Encode a header data unit. void encodeHDU(uint8_t* data); /// Decode a logical link data unit 1. bool decodeLDU1(const uint8_t* data); /// Encode a logical link data unit 1. void encodeLDU1(uint8_t* data); /// Decode a logical link data unit 2. bool decodeLDU2(const uint8_t* data); /// Encode a logical link data unit 2. void encodeLDU2(uint8_t* data); /// Helper to reset data values to defaults. void reset(); /** Local Site data */ /// Sets local configured site data. void setSiteData(SiteData siteData); /** Encryption data */ /// Sets the encryption message indicator. void setMI(const uint8_t* mi); /// Gets the encryption message indicator. void getMI(uint8_t* mi) const; public: /** Common Data */ /// Flag indicating the link control data is protected. __PROPERTY(bool, protect, Protect); /// Link control opcode. __PROPERTY(uint8_t, lco, LCO); /// Manufacturer ID. __PROPERTY(uint8_t, mfId, MFId); /// Source ID. __PROPERTY(uint32_t, srcId, SrcId); /// Destination ID. __PROPERTY(uint32_t, dstId, DstId); /// Service class. __PROPERTY(uint8_t, serviceClass, ServiceClass); /// Voice channel number. __PROPERTY(uint32_t, grpVchNo, GrpVchNo); /** Service Options */ /// Flag indicating the emergency bits are set. __PROPERTY(bool, emergency, Emergency); /// Flag indicating that encryption is enabled. __PROPERTY(bool, encrypted, Encrypted); /// Priority level for the traffic. __PROPERTY(uint8_t, priority, Priority); /// Flag indicating a group/talkgroup operation. __PROPERTY(bool, group, Group); /** Encryption data */ /// Encryption algorithm ID. __PROPERTY(uint8_t, algId, AlgId); /// Encryption key ID. __PROPERTY(uint32_t, kId, KId); private: friend class TSBK; friend class TDULC; edac::RS634717 m_rs; bool m_encryptOverride; bool m_tsbkVendorSkip; uint32_t m_callTimer; /** Encryption data */ uint8_t* m_mi; /** Local Site data */ SiteData m_siteData; /// Decode link control. bool decodeLC(const uint8_t* rs); /// Encode link control. void encodeLC(uint8_t* rs); /// Decode LDU hamming FEC. void decodeLDUHamming(const uint8_t* raw, uint8_t* data); /// Encode LDU hamming FEC. void encodeLDUHamming(uint8_t* data, const uint8_t* raw); /// Decode HDU Golay FEC. void decodeHDUGolay(const uint8_t* raw, uint8_t* data); /// Encode HDU Golay FEC. void encodeHDUGolay(uint8_t* data, const uint8_t* raw); }; } // namespace lc } // namespace p25 #endif // __P25_LC__LC_H__