import json
import requests
from enum import Enum

class DataType(str, Enum):
    iq = 'iq'
    spectrogram = 'spectrogram'

class Format(str, Enum):
    raw_float32 = 'raw_float32'
    raw_float64 = 'raw_float64'
    wav = 'wav'
    sigmf = 'sigmf'
    matlab = 'matlab'
    vita49 = 'vita49'

class Signal(str, Enum):
    tone = 'tone'
    psk = 'psk'
    iridium = 'iridium'
    ook = 'ook'
    ask = 'ask'
    fsk = 'fsk'
    dpsk = 'dpsk'
    qam = 'qam'
    ofdm = 'ofdm'
    gmsk = 'gmsk'
    ais = 'ais'
    dsss = 'dsss'
    pam = 'pam'
    am = 'am'
    fm = 'fm'
    chirp = 'chirp'
    lora = 'lora'
    adsb = 'adsb'
    apsk = 'apsk'
    msk = 'msk'
    gfsk = 'gfsk'
    cpfsk = 'cpfsk'
    ble = 'ble'
    aprs = 'aprs'
    fhss = 'fhss'
    wifi = 'wifi'

class MessageType(str, Enum):
    msg1_position_report = 'msg1_position_report'
    msg2_assigned_position_report = 'msg2_assigned_position_report'
    msg3_special_position_report = 'msg3_special_position_report'
    msg4_base_station_report = 'msg4_base_station_report'
    msg9_sar_aircraft_position = 'msg9_sar_aircraft_position'
    msg14_safety_broadcast = 'msg14_safety_broadcast'
    msg18_position_report_class_b = 'msg18_position_report_class_b'
    msg21_aid_to_navigation = 'msg21_aid_to_navigation'
    msg24_static_data = 'msg24_static_data'
    msg27_long_range_broadcast = 'msg27_long_range_broadcast'
    msg28_aid_to_navigation_single_slot = 'msg28_aid_to_navigation_single_slot'

class _NbTone:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, duration=0.1, phase=0, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.duration = duration
        self.phase = phase
        self.count = count

    def to_dict(self):
        return {
            'signal': 'tone',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'duration': self.duration,
            'phase': self.phase,
            'count': self.count,
        }

class _NbPSK:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, modulation_order=4, baud=4800, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'psk',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _NbIridium:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, slot_index=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, duration=0.1, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.slot_index = slot_index
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.duration = duration
        self.count = count

    def to_dict(self):
        return {
            'signal': 'iridium',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'slot_index': self.slot_index,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'duration': self.duration,
            'count': self.count,
        }

class _NbOOK:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, baud=4800, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ook',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'baud': self.baud,
            'count': self.count,
        }

class _NbASK:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, modulation_order=2, baud=4800, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ask',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _NbFSK:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, modulation_order=4, baud=4800, samples_per_symbol=8, freq_sep=1000, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.modulation_order = modulation_order
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.freq_sep = freq_sep
        self.count = count

    def to_dict(self):
        return {
            'signal': 'fsk',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'freq_sep': self.freq_sep,
            'count': self.count,
        }

class _NbDpsk:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, baud=4800, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'dpsk',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'baud': self.baud,
            'count': self.count,
        }

class _NbQAM:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, modulation_order=16, baud=4800, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'qam',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _NbOfdm:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, num_subcarriers=64, fft_size=64, cyclic_prefix_length=16, baud=4800, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.num_subcarriers = num_subcarriers
        self.fft_size = fft_size
        self.cyclic_prefix_length = cyclic_prefix_length
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ofdm',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'num_subcarriers': self.num_subcarriers,
            'fft_size': self.fft_size,
            'cyclic_prefix_length': self.cyclic_prefix_length,
            'baud': self.baud,
            'count': self.count,
        }

class _NbGmsk:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, baud=9600, samples_per_symbol=8, BT=0.3, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.count = count

    def to_dict(self):
        return {
            'signal': 'gmsk',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'count': self.count,
        }

class _NbAIS:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency='161975000, 162025000', baud=9600, samples_per_symbol=8, BT=0.4, message_type=MessageType.msg1_position_report, mmsi=338000001, lat=37.7749, lon=-122.4194, speed=0.0, course=0.0, heading=511, status=0, alt=1000, text='ALL CLEAR', name='BUOY', aid_type=1, repeat=0, accuracy=0, to_bow=0, to_stern=0, to_port=0, to_starboard=0, epfd=0, second=60, off_position=0, reserved_1=0, raim=0, virtual_aid=0, assigned=0, name_ext='', shipname='SIGTERA', callsign='KXYZ', ship_type=0, station_type=1, restricted=0, iala_mrn=0, dimension=0, dimensions_a=0, dimensions_b=0, dimension_additional_data=0, charted_status=0, station_status=0, status_bits=0, auth=0, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.message_type = message_type
        self.mmsi = mmsi
        self.lat = lat
        self.lon = lon
        self.speed = speed
        self.course = course
        self.heading = heading
        self.status = status
        self.alt = alt
        self.text = text
        self.name = name
        self.aid_type = aid_type
        self.repeat = repeat
        self.accuracy = accuracy
        self.to_bow = to_bow
        self.to_stern = to_stern
        self.to_port = to_port
        self.to_starboard = to_starboard
        self.epfd = epfd
        self.second = second
        self.off_position = off_position
        self.reserved_1 = reserved_1
        self.raim = raim
        self.virtual_aid = virtual_aid
        self.assigned = assigned
        self.name_ext = name_ext
        self.shipname = shipname
        self.callsign = callsign
        self.ship_type = ship_type
        self.station_type = station_type
        self.restricted = restricted
        self.iala_mrn = iala_mrn
        self.dimension = dimension
        self.dimensions_a = dimensions_a
        self.dimensions_b = dimensions_b
        self.dimension_additional_data = dimension_additional_data
        self.charted_status = charted_status
        self.station_status = station_status
        self.status_bits = status_bits
        self.auth = auth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ais',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'message_type': self.message_type,
            'mmsi': self.mmsi,
            'lat': self.lat,
            'lon': self.lon,
            'speed': self.speed,
            'course': self.course,
            'heading': self.heading,
            'status': self.status,
            'alt': self.alt,
            'text': self.text,
            'name': self.name,
            'aid_type': self.aid_type,
            'repeat': self.repeat,
            'accuracy': self.accuracy,
            'to_bow': self.to_bow,
            'to_stern': self.to_stern,
            'to_port': self.to_port,
            'to_starboard': self.to_starboard,
            'epfd': self.epfd,
            'second': self.second,
            'off_position': self.off_position,
            'reserved_1': self.reserved_1,
            'raim': self.raim,
            'virtual_aid': self.virtual_aid,
            'assigned': self.assigned,
            'name_ext': self.name_ext,
            'shipname': self.shipname,
            'callsign': self.callsign,
            'ship_type': self.ship_type,
            'station_type': self.station_type,
            'restricted': self.restricted,
            'iala_mrn': self.iala_mrn,
            'dimension': self.dimension,
            'dimensions_a': self.dimensions_a,
            'dimensions_b': self.dimensions_b,
            'dimension_additional_data': self.dimension_additional_data,
            'charted_status': self.charted_status,
            'station_status': self.station_status,
            'status_bits': self.status_bits,
            'auth': self.auth,
            'count': self.count,
        }

class _NbDsss:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, baud=9600, sequence='barker_13', count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.baud = baud
        self.sequence = sequence
        self.count = count

    def to_dict(self):
        return {
            'signal': 'dsss',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'baud': self.baud,
            'sequence': self.sequence,
            'count': self.count,
        }

class _NbPAM:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, modulation_order=4, baud=4800, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'pam',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _NbAM:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, duration=0.1, mode='dsb', modulation_index=0.5, message_bandwidth=3000, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.duration = duration
        self.mode = mode
        self.modulation_index = modulation_index
        self.message_bandwidth = message_bandwidth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'am',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'duration': self.duration,
            'mode': self.mode,
            'modulation_index': self.modulation_index,
            'message_bandwidth': self.message_bandwidth,
            'count': self.count,
        }

class _NbFM:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, duration=0.1, deviation=5000, message_bandwidth=3000, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.duration = duration
        self.deviation = deviation
        self.message_bandwidth = message_bandwidth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'fm',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'duration': self.duration,
            'deviation': self.deviation,
            'message_bandwidth': self.message_bandwidth,
            'count': self.count,
        }

class _NbChirp:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, duration=0.001, bandwidth=10000, direction='up', count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.duration = duration
        self.bandwidth = bandwidth
        self.direction = direction
        self.count = count

    def to_dict(self):
        return {
            'signal': 'chirp',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'duration': self.duration,
            'bandwidth': self.bandwidth,
            'direction': self.direction,
            'count': self.count,
        }

class _NbLora:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, spreading_factor=7, bandwidth=125000, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.spreading_factor = spreading_factor
        self.bandwidth = bandwidth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'lora',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'spreading_factor': self.spreading_factor,
            'bandwidth': self.bandwidth,
            'count': self.count,
        }

class _NbAdsb:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, format='extended', count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.format = format
        self.count = count

    def to_dict(self):
        return {
            'signal': 'adsb',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'format': self.format,
            'count': self.count,
        }

class _NbApsk:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, modulation_order=16, baud=4800, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'apsk',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _NbMSK:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, baud=4800, samples_per_symbol=8, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.count = count

    def to_dict(self):
        return {
            'signal': 'msk',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'count': self.count,
        }

class _NbGfsk:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, baud=4800, samples_per_symbol=8, BT=0.5, modulation_index=0.5, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.modulation_index = modulation_index
        self.count = count

    def to_dict(self):
        return {
            'signal': 'gfsk',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'modulation_index': self.modulation_index,
            'count': self.count,
        }

class _NbCpfsk:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, modulation_order=2, baud=4800, samples_per_symbol=8, modulation_index=0.5, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.modulation_order = modulation_order
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.modulation_index = modulation_index
        self.count = count

    def to_dict(self):
        return {
            'signal': 'cpfsk',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'modulation_index': self.modulation_index,
            'count': self.count,
        }

class _NbBLE:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, baud=1000000, samples_per_symbol=8, BT=0.5, modulation_index=0.5, payload_bytes=16, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.modulation_index = modulation_index
        self.payload_bytes = payload_bytes
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ble',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'modulation_index': self.modulation_index,
            'payload_bytes': self.payload_bytes,
            'count': self.count,
        }

class _NbAprs:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, source='N0CALL', info='>SIGTERA TEST', count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.source = source
        self.info = info
        self.count = count

    def to_dict(self):
        return {
            'signal': 'aprs',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'source': self.source,
            'info': self.info,
            'count': self.count,
        }

class _NbFhss:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, baud=4800, samples_per_symbol=8, freq_sep=2000, num_channels=8, channel_spacing=25000, hop_rate=100, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.freq_sep = freq_sep
        self.num_channels = num_channels
        self.channel_spacing = channel_spacing
        self.hop_rate = hop_rate
        self.count = count

    def to_dict(self):
        return {
            'signal': 'fhss',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'freq_sep': self.freq_sep,
            'num_channels': self.num_channels,
            'channel_spacing': self.channel_spacing,
            'hop_rate': self.hop_rate,
            'count': self.count,
        }

class _NbWifi:
    def __init__(self, pre_padding=0, post_padding=0, power=-2, center_frequency=0, modulation_order=4, num_symbols=8, count=1):
        self.pre_padding = pre_padding
        self.post_padding = post_padding
        self.power = power
        self.center_frequency = center_frequency
        self.modulation_order = modulation_order
        self.num_symbols = num_symbols
        self.count = count

    def to_dict(self):
        return {
            'signal': 'wifi',
            'pre-padding': self.pre_padding,
            'post-padding': self.post_padding,
            'power': self.power,
            'center_frequency': self.center_frequency,
            'modulation_order': self.modulation_order,
            'num_symbols': self.num_symbols,
            'count': self.count,
        }

class _WbTone:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, duration=0.1, phase=0, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.duration = duration
        self.phase = phase
        self.count = count

    def to_dict(self):
        return {
            'signal': 'tone',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'duration': self.duration,
            'phase': self.phase,
            'count': self.count,
        }

class _WbPSK:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, signal_start_time=0, modulation_order=4, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.signal_start_time = signal_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'psk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'signal_start_time': self.signal_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _WbIridium:
    def __init__(self, power=-2, center_frequency=0, slot_index=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, signal_start_time=0, duration=0.1, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.slot_index = slot_index
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.signal_start_time = signal_start_time
        self.duration = duration
        self.count = count

    def to_dict(self):
        return {
            'signal': 'iridium',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'slot_index': self.slot_index,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'signal_start_time': self.signal_start_time,
            'duration': self.duration,
            'count': self.count,
        }

class _WbOOK:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, signal_start_time=0, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.signal_start_time = signal_start_time
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ook',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'signal_start_time': self.signal_start_time,
            'baud': self.baud,
            'count': self.count,
        }

class _WbASK:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, signal_start_time=0, modulation_order=2, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.signal_start_time = signal_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ask',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'signal_start_time': self.signal_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _WbFSK:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, modulation_order=4, baud=4800, samples_per_symbol=8, freq_sep=1000, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.freq_sep = freq_sep
        self.count = count

    def to_dict(self):
        return {
            'signal': 'fsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'freq_sep': self.freq_sep,
            'count': self.count,
        }

class _WbDpsk:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, signal_start_time=0, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.signal_start_time = signal_start_time
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'dpsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'signal_start_time': self.signal_start_time,
            'baud': self.baud,
            'count': self.count,
        }

class _WbQAM:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, signal_start_time=0, modulation_order=16, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.signal_start_time = signal_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'qam',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'signal_start_time': self.signal_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _WbOfdm:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, num_subcarriers=64, fft_size=64, cyclic_prefix_length=16, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.num_subcarriers = num_subcarriers
        self.fft_size = fft_size
        self.cyclic_prefix_length = cyclic_prefix_length
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ofdm',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'num_subcarriers': self.num_subcarriers,
            'fft_size': self.fft_size,
            'cyclic_prefix_length': self.cyclic_prefix_length,
            'baud': self.baud,
            'count': self.count,
        }

class _WbGmsk:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, baud=9600, samples_per_symbol=8, BT=0.3, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.count = count

    def to_dict(self):
        return {
            'signal': 'gmsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'count': self.count,
        }

class _WbAIS:
    def __init__(self, power=-2, center_frequency='161975000, 162025000', baud=9600, samples_per_symbol=8, BT=0.4, signal_start_time=0, message_type=MessageType.msg1_position_report, mmsi=338000001, lat=37.7749, lon=-122.4194, speed=0.0, course=0.0, heading=511, status=0, alt=1000, text='ALL CLEAR', name='BUOY', aid_type=1, repeat=0, accuracy=0, to_bow=0, to_stern=0, to_port=0, to_starboard=0, epfd=0, second=60, off_position=0, reserved_1=0, raim=0, virtual_aid=0, assigned=0, name_ext='', shipname='SIGTERA', callsign='KXYZ', ship_type=0, station_type=1, restricted=0, iala_mrn=0, dimension=0, dimensions_a=0, dimensions_b=0, dimension_additional_data=0, charted_status=0, station_status=0, status_bits=0, auth=0, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.signal_start_time = signal_start_time
        self.message_type = message_type
        self.mmsi = mmsi
        self.lat = lat
        self.lon = lon
        self.speed = speed
        self.course = course
        self.heading = heading
        self.status = status
        self.alt = alt
        self.text = text
        self.name = name
        self.aid_type = aid_type
        self.repeat = repeat
        self.accuracy = accuracy
        self.to_bow = to_bow
        self.to_stern = to_stern
        self.to_port = to_port
        self.to_starboard = to_starboard
        self.epfd = epfd
        self.second = second
        self.off_position = off_position
        self.reserved_1 = reserved_1
        self.raim = raim
        self.virtual_aid = virtual_aid
        self.assigned = assigned
        self.name_ext = name_ext
        self.shipname = shipname
        self.callsign = callsign
        self.ship_type = ship_type
        self.station_type = station_type
        self.restricted = restricted
        self.iala_mrn = iala_mrn
        self.dimension = dimension
        self.dimensions_a = dimensions_a
        self.dimensions_b = dimensions_b
        self.dimension_additional_data = dimension_additional_data
        self.charted_status = charted_status
        self.station_status = station_status
        self.status_bits = status_bits
        self.auth = auth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ais',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'signal_start_time': self.signal_start_time,
            'message_type': self.message_type,
            'mmsi': self.mmsi,
            'lat': self.lat,
            'lon': self.lon,
            'speed': self.speed,
            'course': self.course,
            'heading': self.heading,
            'status': self.status,
            'alt': self.alt,
            'text': self.text,
            'name': self.name,
            'aid_type': self.aid_type,
            'repeat': self.repeat,
            'accuracy': self.accuracy,
            'to_bow': self.to_bow,
            'to_stern': self.to_stern,
            'to_port': self.to_port,
            'to_starboard': self.to_starboard,
            'epfd': self.epfd,
            'second': self.second,
            'off_position': self.off_position,
            'reserved_1': self.reserved_1,
            'raim': self.raim,
            'virtual_aid': self.virtual_aid,
            'assigned': self.assigned,
            'name_ext': self.name_ext,
            'shipname': self.shipname,
            'callsign': self.callsign,
            'ship_type': self.ship_type,
            'station_type': self.station_type,
            'restricted': self.restricted,
            'iala_mrn': self.iala_mrn,
            'dimension': self.dimension,
            'dimensions_a': self.dimensions_a,
            'dimensions_b': self.dimensions_b,
            'dimension_additional_data': self.dimension_additional_data,
            'charted_status': self.charted_status,
            'station_status': self.station_status,
            'status_bits': self.status_bits,
            'auth': self.auth,
            'count': self.count,
        }

class _WbDsss:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, baud=9600, sequence='barker_13', count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.baud = baud
        self.sequence = sequence
        self.count = count

    def to_dict(self):
        return {
            'signal': 'dsss',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'baud': self.baud,
            'sequence': self.sequence,
            'count': self.count,
        }

class _WbPAM:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, signal_start_time=0, modulation_order=4, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.signal_start_time = signal_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'pam',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'signal_start_time': self.signal_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _WbAM:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, duration=0.1, mode='dsb', modulation_index=0.5, message_bandwidth=3000, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.duration = duration
        self.mode = mode
        self.modulation_index = modulation_index
        self.message_bandwidth = message_bandwidth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'am',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'duration': self.duration,
            'mode': self.mode,
            'modulation_index': self.modulation_index,
            'message_bandwidth': self.message_bandwidth,
            'count': self.count,
        }

class _WbFM:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, duration=0.1, deviation=5000, message_bandwidth=3000, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.duration = duration
        self.deviation = deviation
        self.message_bandwidth = message_bandwidth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'fm',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'duration': self.duration,
            'deviation': self.deviation,
            'message_bandwidth': self.message_bandwidth,
            'count': self.count,
        }

class _WbChirp:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, duration=0.001, bandwidth=10000, direction='up', count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.duration = duration
        self.bandwidth = bandwidth
        self.direction = direction
        self.count = count

    def to_dict(self):
        return {
            'signal': 'chirp',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'duration': self.duration,
            'bandwidth': self.bandwidth,
            'direction': self.direction,
            'count': self.count,
        }

class _WbLora:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, spreading_factor=7, bandwidth=125000, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.spreading_factor = spreading_factor
        self.bandwidth = bandwidth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'lora',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'spreading_factor': self.spreading_factor,
            'bandwidth': self.bandwidth,
            'count': self.count,
        }

class _WbAdsb:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, format='extended', count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.format = format
        self.count = count

    def to_dict(self):
        return {
            'signal': 'adsb',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'format': self.format,
            'count': self.count,
        }

class _WbApsk:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, signal_start_time=0, modulation_order=16, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.signal_start_time = signal_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'apsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'signal_start_time': self.signal_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _WbMSK:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, baud=4800, samples_per_symbol=8, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.count = count

    def to_dict(self):
        return {
            'signal': 'msk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'count': self.count,
        }

class _WbGfsk:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, baud=4800, samples_per_symbol=8, BT=0.5, modulation_index=0.5, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.modulation_index = modulation_index
        self.count = count

    def to_dict(self):
        return {
            'signal': 'gfsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'modulation_index': self.modulation_index,
            'count': self.count,
        }

class _WbCpfsk:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, modulation_order=2, baud=4800, samples_per_symbol=8, modulation_index=0.5, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.modulation_index = modulation_index
        self.count = count

    def to_dict(self):
        return {
            'signal': 'cpfsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'modulation_index': self.modulation_index,
            'count': self.count,
        }

class _WbBLE:
    def __init__(self, power=-2, center_frequency=0, baud=1000000, samples_per_symbol=8, BT=0.5, modulation_index=0.5, signal_start_time=0, payload_bytes=16, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.modulation_index = modulation_index
        self.signal_start_time = signal_start_time
        self.payload_bytes = payload_bytes
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ble',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'modulation_index': self.modulation_index,
            'signal_start_time': self.signal_start_time,
            'payload_bytes': self.payload_bytes,
            'count': self.count,
        }

class _WbAprs:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, source='N0CALL', info='>SIGTERA TEST', count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.source = source
        self.info = info
        self.count = count

    def to_dict(self):
        return {
            'signal': 'aprs',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'source': self.source,
            'info': self.info,
            'count': self.count,
        }

class _WbFhss:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, baud=4800, samples_per_symbol=8, freq_sep=2000, num_channels=8, channel_spacing=25000, hop_rate=100, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.freq_sep = freq_sep
        self.num_channels = num_channels
        self.channel_spacing = channel_spacing
        self.hop_rate = hop_rate
        self.count = count

    def to_dict(self):
        return {
            'signal': 'fhss',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'freq_sep': self.freq_sep,
            'num_channels': self.num_channels,
            'channel_spacing': self.channel_spacing,
            'hop_rate': self.hop_rate,
            'count': self.count,
        }

class _WbWifi:
    def __init__(self, power=-2, center_frequency=0, signal_start_time=0, modulation_order=4, num_symbols=8, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.signal_start_time = signal_start_time
        self.modulation_order = modulation_order
        self.num_symbols = num_symbols
        self.count = count

    def to_dict(self):
        return {
            'signal': 'wifi',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'signal_start_time': self.signal_start_time,
            'modulation_order': self.modulation_order,
            'num_symbols': self.num_symbols,
            'count': self.count,
        }

class _Narrowband:
    def __init__(self, data_type=DataType.iq, format=Format.raw_float32, noise=-10, sample_rate=100000):
        self.data_type = data_type
        self.format = format
        self.noise = noise
        self.sample_rate = sample_rate
        self._signals = []

    def Tone(self, **kwargs):
        sig = _NbTone(**kwargs)
        self._signals.append(sig)
        return sig

    def PSK(self, **kwargs):
        sig = _NbPSK(**kwargs)
        self._signals.append(sig)
        return sig

    def Iridium(self, **kwargs):
        sig = _NbIridium(**kwargs)
        self._signals.append(sig)
        return sig

    def OOK(self, **kwargs):
        sig = _NbOOK(**kwargs)
        self._signals.append(sig)
        return sig

    def ASK(self, **kwargs):
        sig = _NbASK(**kwargs)
        self._signals.append(sig)
        return sig

    def FSK(self, **kwargs):
        sig = _NbFSK(**kwargs)
        self._signals.append(sig)
        return sig

    def Dpsk(self, **kwargs):
        sig = _NbDpsk(**kwargs)
        self._signals.append(sig)
        return sig

    def QAM(self, **kwargs):
        sig = _NbQAM(**kwargs)
        self._signals.append(sig)
        return sig

    def Ofdm(self, **kwargs):
        sig = _NbOfdm(**kwargs)
        self._signals.append(sig)
        return sig

    def Gmsk(self, **kwargs):
        sig = _NbGmsk(**kwargs)
        self._signals.append(sig)
        return sig

    def AIS(self, **kwargs):
        sig = _NbAIS(**kwargs)
        self._signals.append(sig)
        return sig

    def Dsss(self, **kwargs):
        sig = _NbDsss(**kwargs)
        self._signals.append(sig)
        return sig

    def PAM(self, **kwargs):
        sig = _NbPAM(**kwargs)
        self._signals.append(sig)
        return sig

    def AM(self, **kwargs):
        sig = _NbAM(**kwargs)
        self._signals.append(sig)
        return sig

    def FM(self, **kwargs):
        sig = _NbFM(**kwargs)
        self._signals.append(sig)
        return sig

    def Chirp(self, **kwargs):
        sig = _NbChirp(**kwargs)
        self._signals.append(sig)
        return sig

    def Lora(self, **kwargs):
        sig = _NbLora(**kwargs)
        self._signals.append(sig)
        return sig

    def Adsb(self, **kwargs):
        sig = _NbAdsb(**kwargs)
        self._signals.append(sig)
        return sig

    def Apsk(self, **kwargs):
        sig = _NbApsk(**kwargs)
        self._signals.append(sig)
        return sig

    def MSK(self, **kwargs):
        sig = _NbMSK(**kwargs)
        self._signals.append(sig)
        return sig

    def Gfsk(self, **kwargs):
        sig = _NbGfsk(**kwargs)
        self._signals.append(sig)
        return sig

    def Cpfsk(self, **kwargs):
        sig = _NbCpfsk(**kwargs)
        self._signals.append(sig)
        return sig

    def BLE(self, **kwargs):
        sig = _NbBLE(**kwargs)
        self._signals.append(sig)
        return sig

    def Aprs(self, **kwargs):
        sig = _NbAprs(**kwargs)
        self._signals.append(sig)
        return sig

    def Fhss(self, **kwargs):
        sig = _NbFhss(**kwargs)
        self._signals.append(sig)
        return sig

    def Wifi(self, **kwargs):
        sig = _NbWifi(**kwargs)
        self._signals.append(sig)
        return sig
    def to_dict(self):
        return {
            'mode': 'dataset_generation',
            'segmentation': 'narrowband',
            'data_type': self.data_type,
            'format': self.format,
            'noise': self.noise,
            'sample_rate': self.sample_rate,
            'signal': [s.to_dict() for s in self._signals],
        }

class _Wideband:
    def __init__(self, data_type=DataType.iq, format=Format.raw_float32, noise=-10, length=10, sample_rate=100000):
        self.data_type = data_type
        self.format = format
        self.noise = noise
        self.length = length
        self.sample_rate = sample_rate
        self._signals = []

    def Tone(self, **kwargs):
        sig = _WbTone(**kwargs)
        self._signals.append(sig)
        return sig

    def PSK(self, **kwargs):
        sig = _WbPSK(**kwargs)
        self._signals.append(sig)
        return sig

    def Iridium(self, **kwargs):
        sig = _WbIridium(**kwargs)
        self._signals.append(sig)
        return sig

    def OOK(self, **kwargs):
        sig = _WbOOK(**kwargs)
        self._signals.append(sig)
        return sig

    def ASK(self, **kwargs):
        sig = _WbASK(**kwargs)
        self._signals.append(sig)
        return sig

    def FSK(self, **kwargs):
        sig = _WbFSK(**kwargs)
        self._signals.append(sig)
        return sig

    def Dpsk(self, **kwargs):
        sig = _WbDpsk(**kwargs)
        self._signals.append(sig)
        return sig

    def QAM(self, **kwargs):
        sig = _WbQAM(**kwargs)
        self._signals.append(sig)
        return sig

    def Ofdm(self, **kwargs):
        sig = _WbOfdm(**kwargs)
        self._signals.append(sig)
        return sig

    def Gmsk(self, **kwargs):
        sig = _WbGmsk(**kwargs)
        self._signals.append(sig)
        return sig

    def AIS(self, **kwargs):
        sig = _WbAIS(**kwargs)
        self._signals.append(sig)
        return sig

    def Dsss(self, **kwargs):
        sig = _WbDsss(**kwargs)
        self._signals.append(sig)
        return sig

    def PAM(self, **kwargs):
        sig = _WbPAM(**kwargs)
        self._signals.append(sig)
        return sig

    def AM(self, **kwargs):
        sig = _WbAM(**kwargs)
        self._signals.append(sig)
        return sig

    def FM(self, **kwargs):
        sig = _WbFM(**kwargs)
        self._signals.append(sig)
        return sig

    def Chirp(self, **kwargs):
        sig = _WbChirp(**kwargs)
        self._signals.append(sig)
        return sig

    def Lora(self, **kwargs):
        sig = _WbLora(**kwargs)
        self._signals.append(sig)
        return sig

    def Adsb(self, **kwargs):
        sig = _WbAdsb(**kwargs)
        self._signals.append(sig)
        return sig

    def Apsk(self, **kwargs):
        sig = _WbApsk(**kwargs)
        self._signals.append(sig)
        return sig

    def MSK(self, **kwargs):
        sig = _WbMSK(**kwargs)
        self._signals.append(sig)
        return sig

    def Gfsk(self, **kwargs):
        sig = _WbGfsk(**kwargs)
        self._signals.append(sig)
        return sig

    def Cpfsk(self, **kwargs):
        sig = _WbCpfsk(**kwargs)
        self._signals.append(sig)
        return sig

    def BLE(self, **kwargs):
        sig = _WbBLE(**kwargs)
        self._signals.append(sig)
        return sig

    def Aprs(self, **kwargs):
        sig = _WbAprs(**kwargs)
        self._signals.append(sig)
        return sig

    def Fhss(self, **kwargs):
        sig = _WbFhss(**kwargs)
        self._signals.append(sig)
        return sig

    def Wifi(self, **kwargs):
        sig = _WbWifi(**kwargs)
        self._signals.append(sig)
        return sig
    def to_dict(self):
        return {
            'mode': 'dataset_generation',
            'segmentation': 'wideband',
            'data_type': self.data_type,
            'format': self.format,
            'noise': self.noise,
            'length': self.length,
            'sample_rate': self.sample_rate,
            'signal': [s.to_dict() for s in self._signals],
        }

class _EnvTxTone:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, duration=0.1, phase=0, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.duration = duration
        self.phase = phase
        self.count = count

    def to_dict(self):
        return {
            'signal': 'tone',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'duration': self.duration,
            'phase': self.phase,
            'count': self.count,
        }

class _EnvTxPSK:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, transmitter_start_time=0, modulation_order=4, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.transmitter_start_time = transmitter_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'psk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'transmitter_start_time': self.transmitter_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _EnvTxIridium:
    def __init__(self, power=-2, center_frequency=0, slot_index=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, transmitter_start_time=0, duration=0.1, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.slot_index = slot_index
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.transmitter_start_time = transmitter_start_time
        self.duration = duration
        self.count = count

    def to_dict(self):
        return {
            'signal': 'iridium',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'slot_index': self.slot_index,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'transmitter_start_time': self.transmitter_start_time,
            'duration': self.duration,
            'count': self.count,
        }

class _EnvTxOOK:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, transmitter_start_time=0, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.transmitter_start_time = transmitter_start_time
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ook',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'transmitter_start_time': self.transmitter_start_time,
            'baud': self.baud,
            'count': self.count,
        }

class _EnvTxASK:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, transmitter_start_time=0, modulation_order=2, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.transmitter_start_time = transmitter_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ask',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'transmitter_start_time': self.transmitter_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _EnvTxFSK:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, modulation_order=4, baud=4800, samples_per_symbol=8, freq_sep=1000, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.freq_sep = freq_sep
        self.count = count

    def to_dict(self):
        return {
            'signal': 'fsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'freq_sep': self.freq_sep,
            'count': self.count,
        }

class _EnvTxDpsk:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, transmitter_start_time=0, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.transmitter_start_time = transmitter_start_time
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'dpsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'transmitter_start_time': self.transmitter_start_time,
            'baud': self.baud,
            'count': self.count,
        }

class _EnvTxQAM:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, transmitter_start_time=0, modulation_order=16, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.transmitter_start_time = transmitter_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'qam',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'transmitter_start_time': self.transmitter_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _EnvTxOfdm:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, num_subcarriers=64, fft_size=64, cyclic_prefix_length=16, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.num_subcarriers = num_subcarriers
        self.fft_size = fft_size
        self.cyclic_prefix_length = cyclic_prefix_length
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ofdm',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'num_subcarriers': self.num_subcarriers,
            'fft_size': self.fft_size,
            'cyclic_prefix_length': self.cyclic_prefix_length,
            'baud': self.baud,
            'count': self.count,
        }

class _EnvTxGmsk:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, baud=9600, samples_per_symbol=8, BT=0.3, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.count = count

    def to_dict(self):
        return {
            'signal': 'gmsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'count': self.count,
        }

class _EnvTxAIS:
    def __init__(self, power=-2, center_frequency='161975000, 162025000', baud=9600, samples_per_symbol=8, BT=0.4, transmitter_start_time=0, message_type=MessageType.msg1_position_report, mmsi=338000001, lat=37.7749, lon=-122.4194, speed=0.0, course=0.0, heading=511, status=0, alt=1000, text='ALL CLEAR', name='BUOY', aid_type=1, repeat=0, accuracy=0, to_bow=0, to_stern=0, to_port=0, to_starboard=0, epfd=0, second=60, off_position=0, reserved_1=0, raim=0, virtual_aid=0, assigned=0, name_ext='', shipname='SIGTERA', callsign='KXYZ', ship_type=0, station_type=1, restricted=0, iala_mrn=0, dimension=0, dimensions_a=0, dimensions_b=0, dimension_additional_data=0, charted_status=0, station_status=0, status_bits=0, auth=0, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.transmitter_start_time = transmitter_start_time
        self.message_type = message_type
        self.mmsi = mmsi
        self.lat = lat
        self.lon = lon
        self.speed = speed
        self.course = course
        self.heading = heading
        self.status = status
        self.alt = alt
        self.text = text
        self.name = name
        self.aid_type = aid_type
        self.repeat = repeat
        self.accuracy = accuracy
        self.to_bow = to_bow
        self.to_stern = to_stern
        self.to_port = to_port
        self.to_starboard = to_starboard
        self.epfd = epfd
        self.second = second
        self.off_position = off_position
        self.reserved_1 = reserved_1
        self.raim = raim
        self.virtual_aid = virtual_aid
        self.assigned = assigned
        self.name_ext = name_ext
        self.shipname = shipname
        self.callsign = callsign
        self.ship_type = ship_type
        self.station_type = station_type
        self.restricted = restricted
        self.iala_mrn = iala_mrn
        self.dimension = dimension
        self.dimensions_a = dimensions_a
        self.dimensions_b = dimensions_b
        self.dimension_additional_data = dimension_additional_data
        self.charted_status = charted_status
        self.station_status = station_status
        self.status_bits = status_bits
        self.auth = auth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ais',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'transmitter_start_time': self.transmitter_start_time,
            'message_type': self.message_type,
            'mmsi': self.mmsi,
            'lat': self.lat,
            'lon': self.lon,
            'speed': self.speed,
            'course': self.course,
            'heading': self.heading,
            'status': self.status,
            'alt': self.alt,
            'text': self.text,
            'name': self.name,
            'aid_type': self.aid_type,
            'repeat': self.repeat,
            'accuracy': self.accuracy,
            'to_bow': self.to_bow,
            'to_stern': self.to_stern,
            'to_port': self.to_port,
            'to_starboard': self.to_starboard,
            'epfd': self.epfd,
            'second': self.second,
            'off_position': self.off_position,
            'reserved_1': self.reserved_1,
            'raim': self.raim,
            'virtual_aid': self.virtual_aid,
            'assigned': self.assigned,
            'name_ext': self.name_ext,
            'shipname': self.shipname,
            'callsign': self.callsign,
            'ship_type': self.ship_type,
            'station_type': self.station_type,
            'restricted': self.restricted,
            'iala_mrn': self.iala_mrn,
            'dimension': self.dimension,
            'dimensions_a': self.dimensions_a,
            'dimensions_b': self.dimensions_b,
            'dimension_additional_data': self.dimension_additional_data,
            'charted_status': self.charted_status,
            'station_status': self.station_status,
            'status_bits': self.status_bits,
            'auth': self.auth,
            'count': self.count,
        }

class _EnvTxDsss:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, baud=9600, sequence='barker_13', count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.baud = baud
        self.sequence = sequence
        self.count = count

    def to_dict(self):
        return {
            'signal': 'dsss',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'baud': self.baud,
            'sequence': self.sequence,
            'count': self.count,
        }

class _EnvTxPAM:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, transmitter_start_time=0, modulation_order=4, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.transmitter_start_time = transmitter_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'pam',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'transmitter_start_time': self.transmitter_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _EnvTxAM:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, duration=0.1, mode='dsb', modulation_index=0.5, message_bandwidth=3000, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.duration = duration
        self.mode = mode
        self.modulation_index = modulation_index
        self.message_bandwidth = message_bandwidth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'am',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'duration': self.duration,
            'mode': self.mode,
            'modulation_index': self.modulation_index,
            'message_bandwidth': self.message_bandwidth,
            'count': self.count,
        }

class _EnvTxFM:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, duration=0.1, deviation=5000, message_bandwidth=3000, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.duration = duration
        self.deviation = deviation
        self.message_bandwidth = message_bandwidth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'fm',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'duration': self.duration,
            'deviation': self.deviation,
            'message_bandwidth': self.message_bandwidth,
            'count': self.count,
        }

class _EnvTxChirp:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, duration=0.001, bandwidth=10000, direction='up', count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.duration = duration
        self.bandwidth = bandwidth
        self.direction = direction
        self.count = count

    def to_dict(self):
        return {
            'signal': 'chirp',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'duration': self.duration,
            'bandwidth': self.bandwidth,
            'direction': self.direction,
            'count': self.count,
        }

class _EnvTxLora:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, spreading_factor=7, bandwidth=125000, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.spreading_factor = spreading_factor
        self.bandwidth = bandwidth
        self.count = count

    def to_dict(self):
        return {
            'signal': 'lora',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'spreading_factor': self.spreading_factor,
            'bandwidth': self.bandwidth,
            'count': self.count,
        }

class _EnvTxAdsb:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, format='extended', count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.format = format
        self.count = count

    def to_dict(self):
        return {
            'signal': 'adsb',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'format': self.format,
            'count': self.count,
        }

class _EnvTxApsk:
    def __init__(self, power=-2, center_frequency=0, samples_per_symbol=8, pulse_shape='rectangle', pulse_shape_span=6, pulse_shape_rolloff=0.35, transmitter_start_time=0, modulation_order=16, baud=4800, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.samples_per_symbol = samples_per_symbol
        self.pulse_shape = pulse_shape
        self.pulse_shape_span = pulse_shape_span
        self.pulse_shape_rolloff = pulse_shape_rolloff
        self.transmitter_start_time = transmitter_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.count = count

    def to_dict(self):
        return {
            'signal': 'apsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'samples_per_symbol': self.samples_per_symbol,
            'pulse_shape': self.pulse_shape,
            'pulse_shape_span': self.pulse_shape_span,
            'pulse_shape_rolloff': self.pulse_shape_rolloff,
            'transmitter_start_time': self.transmitter_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'count': self.count,
        }

class _EnvTxMSK:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, baud=4800, samples_per_symbol=8, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.count = count

    def to_dict(self):
        return {
            'signal': 'msk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'count': self.count,
        }

class _EnvTxGfsk:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, baud=4800, samples_per_symbol=8, BT=0.5, modulation_index=0.5, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.modulation_index = modulation_index
        self.count = count

    def to_dict(self):
        return {
            'signal': 'gfsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'modulation_index': self.modulation_index,
            'count': self.count,
        }

class _EnvTxCpfsk:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, modulation_order=2, baud=4800, samples_per_symbol=8, modulation_index=0.5, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.modulation_order = modulation_order
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.modulation_index = modulation_index
        self.count = count

    def to_dict(self):
        return {
            'signal': 'cpfsk',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'modulation_order': self.modulation_order,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'modulation_index': self.modulation_index,
            'count': self.count,
        }

class _EnvTxBLE:
    def __init__(self, power=-2, center_frequency=0, baud=1000000, samples_per_symbol=8, BT=0.5, modulation_index=0.5, transmitter_start_time=0, payload_bytes=16, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.BT = BT
        self.modulation_index = modulation_index
        self.transmitter_start_time = transmitter_start_time
        self.payload_bytes = payload_bytes
        self.count = count

    def to_dict(self):
        return {
            'signal': 'ble',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'BT': self.BT,
            'modulation_index': self.modulation_index,
            'transmitter_start_time': self.transmitter_start_time,
            'payload_bytes': self.payload_bytes,
            'count': self.count,
        }

class _EnvTxAprs:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, source='N0CALL', info='>SIGTERA TEST', count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.source = source
        self.info = info
        self.count = count

    def to_dict(self):
        return {
            'signal': 'aprs',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'source': self.source,
            'info': self.info,
            'count': self.count,
        }

class _EnvTxFhss:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, baud=4800, samples_per_symbol=8, freq_sep=2000, num_channels=8, channel_spacing=25000, hop_rate=100, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.baud = baud
        self.samples_per_symbol = samples_per_symbol
        self.freq_sep = freq_sep
        self.num_channels = num_channels
        self.channel_spacing = channel_spacing
        self.hop_rate = hop_rate
        self.count = count

    def to_dict(self):
        return {
            'signal': 'fhss',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'baud': self.baud,
            'samples_per_symbol': self.samples_per_symbol,
            'freq_sep': self.freq_sep,
            'num_channels': self.num_channels,
            'channel_spacing': self.channel_spacing,
            'hop_rate': self.hop_rate,
            'count': self.count,
        }

class _EnvTxWifi:
    def __init__(self, power=-2, center_frequency=0, transmitter_start_time=0, modulation_order=4, num_symbols=8, count=1):
        self.power = power
        self.center_frequency = center_frequency
        self.transmitter_start_time = transmitter_start_time
        self.modulation_order = modulation_order
        self.num_symbols = num_symbols
        self.count = count

    def to_dict(self):
        return {
            'signal': 'wifi',
            'power': self.power,
            'center_frequency': self.center_frequency,
            'transmitter_start_time': self.transmitter_start_time,
            'modulation_order': self.modulation_order,
            'num_symbols': self.num_symbols,
            'count': self.count,
        }

class _EnvReceiver:
    def __init__(self, data_type=DataType.iq, format=Format.raw_float32, noise=-10, sample_rate=100000):
        self.data_type = data_type
        self.format = format
        self.noise = noise
        self.sample_rate = sample_rate

    def to_dict(self):
        return {
            'element': 'receiver',
            'data_type': self.data_type,
            'format': self.format,
            'noise': self.noise,
            'sample_rate': self.sample_rate,
        }

class _EnvTransmitter:
    def __init__(self):
        self._sig = None

    def Tone(self, **kwargs):
        self._sig = _EnvTxTone(**kwargs)
        return self._sig

    def PSK(self, **kwargs):
        self._sig = _EnvTxPSK(**kwargs)
        return self._sig

    def Iridium(self, **kwargs):
        self._sig = _EnvTxIridium(**kwargs)
        return self._sig

    def OOK(self, **kwargs):
        self._sig = _EnvTxOOK(**kwargs)
        return self._sig

    def ASK(self, **kwargs):
        self._sig = _EnvTxASK(**kwargs)
        return self._sig

    def FSK(self, **kwargs):
        self._sig = _EnvTxFSK(**kwargs)
        return self._sig

    def Dpsk(self, **kwargs):
        self._sig = _EnvTxDpsk(**kwargs)
        return self._sig

    def QAM(self, **kwargs):
        self._sig = _EnvTxQAM(**kwargs)
        return self._sig

    def Ofdm(self, **kwargs):
        self._sig = _EnvTxOfdm(**kwargs)
        return self._sig

    def Gmsk(self, **kwargs):
        self._sig = _EnvTxGmsk(**kwargs)
        return self._sig

    def AIS(self, **kwargs):
        self._sig = _EnvTxAIS(**kwargs)
        return self._sig

    def Dsss(self, **kwargs):
        self._sig = _EnvTxDsss(**kwargs)
        return self._sig

    def PAM(self, **kwargs):
        self._sig = _EnvTxPAM(**kwargs)
        return self._sig

    def AM(self, **kwargs):
        self._sig = _EnvTxAM(**kwargs)
        return self._sig

    def FM(self, **kwargs):
        self._sig = _EnvTxFM(**kwargs)
        return self._sig

    def Chirp(self, **kwargs):
        self._sig = _EnvTxChirp(**kwargs)
        return self._sig

    def Lora(self, **kwargs):
        self._sig = _EnvTxLora(**kwargs)
        return self._sig

    def Adsb(self, **kwargs):
        self._sig = _EnvTxAdsb(**kwargs)
        return self._sig

    def Apsk(self, **kwargs):
        self._sig = _EnvTxApsk(**kwargs)
        return self._sig

    def MSK(self, **kwargs):
        self._sig = _EnvTxMSK(**kwargs)
        return self._sig

    def Gfsk(self, **kwargs):
        self._sig = _EnvTxGfsk(**kwargs)
        return self._sig

    def Cpfsk(self, **kwargs):
        self._sig = _EnvTxCpfsk(**kwargs)
        return self._sig

    def BLE(self, **kwargs):
        self._sig = _EnvTxBLE(**kwargs)
        return self._sig

    def Aprs(self, **kwargs):
        self._sig = _EnvTxAprs(**kwargs)
        return self._sig

    def Fhss(self, **kwargs):
        self._sig = _EnvTxFhss(**kwargs)
        return self._sig

    def Wifi(self, **kwargs):
        self._sig = _EnvTxWifi(**kwargs)
        return self._sig
    def to_dict(self):
        d = {"element": "transmitter"}
        if self._sig:
            d.update(self._sig.to_dict())
        return d

class _EnvPlatform:
    def __init__(self, latitude=0, longitude=0, altitude=0, self_interference_cancelation='True'):
        self.latitude = latitude
        self.longitude = longitude
        self.altitude = altitude
        self.self_interference_cancelation = self_interference_cancelation
        self._elements = []

    def Receiver(self, **kwargs):
        el = _EnvReceiver(**kwargs)
        self._elements.append(el)
        return el

    def Transmitter(self):
        el = _EnvTransmitter()
        self._elements.append(el)
        return el

    def to_dict(self):
        return {
            'platform': 'platform',
            'latitude': self.latitude,
            'longitude': self.longitude,
            'altitude': self.altitude,
            'self_interference_cancelation': self.self_interference_cancelation,
            'element': [e.to_dict() for e in self._elements],
        }

class _Environment:
    def __init__(self, length=10, speed_of_propagation=300000000.0, path_loss_exponent=2):
        self.length = length
        self.speed_of_propagation = speed_of_propagation
        self.path_loss_exponent = path_loss_exponent
        self._platforms = []

    def Platform(self, **kwargs):
        plat = _EnvPlatform(**kwargs)
        self._platforms.append(plat)
        return plat

    def to_dict(self):
        return {
            'mode': 'environment_simulation',
            'length': self.length,
            'speed_of_propagation': self.speed_of_propagation,
            'path_loss_exponent': self.path_loss_exponent,
            'platform': [p.to_dict() for p in self._platforms],
        }

class SigteraClient:
    def __init__(self, url='https://api.sigtera.com'):
        self.url = url
        self._requests = []

    def narrowband(self, **kwargs):
        req = _Narrowband(**kwargs)
        self._requests.append(req)
        return req

    def wideband(self, **kwargs):
        req = _Wideband(**kwargs)
        self._requests.append(req)
        return req

    def environment(self, **kwargs):
        req = _Environment(**kwargs)
        self._requests.append(req)
        return req

    def simulate(self):
        for req in self._requests:
            yield from self._send(req)

    def _send(self, req):
        with requests.post(f'{self.url}/api', json=req.to_dict(), stream=True) as r:
            r.raise_for_status()
            yield from self._parse(r)

    def _parse(self, r):
        buf = bytearray()
        it = r.iter_content(chunk_size=65536)

        def fill(n):
            while len(buf) < n:
                try:
                    buf.extend(next(it))
                except StopIteration:
                    return

        def read_frame():
            fill(4)
            if len(buf) < 4:
                return None, b''
            n = int.from_bytes(buf[:4], 'big')
            if n == 0:
                del buf[:4]
                return 0, b''
            fill(4 + n)
            data = bytes(buf[4:4 + n])
            del buf[:4 + n]
            return n, data

        while True:
            n, data = read_frame()
            if n is None:
                return
            sig_params = json.loads(data)
            chunks = []
            while True:
                n, data = read_frame()
                if n == 0 or n is None:
                    break
                chunks.append(data)
            yield sig_params, b''.join(chunks)
