51 строка
1.3 KiB
Python
Исполняемый файл
51 строка
1.3 KiB
Python
Исполняемый файл
from __future__ import annotations
|
|
|
|
import enum
|
|
|
|
from abc import ABC, abstractmethod
|
|
from bitarray import bitarray
|
|
from dmr_utils3.bptc import decode_full_lc
|
|
|
|
from .exceptions import DMRPL2BadDataException
|
|
|
|
|
|
class DMRPL2Base(ABC):
|
|
DataTypes = enum.StrEnum('DataTypes', [
|
|
'UNKNOWN', 'FULL_LC', 'VOICE_BURST'
|
|
])
|
|
|
|
def __init__(self, data: bytes) -> None:
|
|
self.set_data(data)
|
|
|
|
def set_data(self, data: bytes) -> None:
|
|
if len(data) != 33:
|
|
DMRPL2BadDataException("Data must be 33 bytes long")
|
|
|
|
self.bitdata: bitarray = bitarray(data, endian='big')
|
|
|
|
def get_data(self) -> bytes:
|
|
return self.bitdata.tobytes()
|
|
|
|
@abstractmethod
|
|
def get_data_type(self) -> DMRPL2Base.DataTypes:
|
|
pass
|
|
|
|
|
|
class DMRPL2FullLC(DMRPL2Base):
|
|
def get_data_type(self) -> DMRPL2Base.DataTypes:
|
|
return DMRPL2Base.DataTypes.FULL_LC
|
|
|
|
def get_full_lc(self) -> bytes:
|
|
return decode_full_lc(self.bitdata[:98] + self.bitdata[-98:]).tobytes()
|
|
|
|
|
|
class DMRPL2VoiceBurst(DMRPL2Base):
|
|
def get_data_type(self) -> DMRPL2Base.DataTypes:
|
|
return DMRPL2Base.DataTypes.VOICE_BURST
|
|
|
|
def get_voice_bits(self) -> tuple[bitarray, bitarray]:
|
|
return (self.bitdata[:108], self.bitdata[-108:])
|
|
|
|
def get_emb_lc(self) -> bytes:
|
|
return self.bitdata[116:148].tobytes()
|