diff --git a/modem/cw.py b/modem/cw.py index 6a678050..993e5513 100644 --- a/modem/cw.py +++ b/modem/cw.py @@ -6,8 +6,10 @@ import numpy as np """ + + class MorseCodePlayer: - def __init__(self, wpm=150, f=1500, fs=48000): + def __init__(self, wpm=25, f=1500, fs=48000): self.wpm = wpm self.f0 = f self.fs = fs @@ -39,28 +41,26 @@ class MorseCodePlayer: signal = np.array([], dtype=np.int16) for char in morse: if char == '.': - duration = int(self.dot_duration * self.fs) - s = np.sin(2 * np.pi * self.f0 * np.arange(duration) / self.fs) - signal = np.concatenate((signal, s * 32767)) - pause_duration = int(self.pause_duration * self.fs) - signal = np.concatenate((signal, np.zeros(pause_duration, dtype=np.int16))) + duration = self.dot_duration # Using class-defined duration + t = np.linspace(0, duration, int(self.fs * duration), endpoint=False) + s = 0.5 * np.sin(2 * np.pi * self.f0 * t) + signal = np.concatenate((signal, np.int16(s * 32767))) + pause_samples = int(self.pause_duration * self.fs) + signal = np.concatenate((signal, np.zeros(pause_samples, dtype=np.int16))) + elif char == '-': - duration = int(self.dash_duration * self.fs) - s = np.sin(2 * np.pi * self.f0 * np.arange(duration) / self.fs) - signal = np.concatenate((signal, s * 32767)) - pause_duration = int(self.pause_duration * self.fs) - signal = np.concatenate((signal, np.zeros(pause_duration, dtype=np.int16))) + duration = self.dash_duration # Using class-defined duration + t = np.linspace(0, duration, int(self.fs * duration), endpoint=False) + s = 0.5 * np.sin(2 * np.pi * self.f0 * t) + signal = np.concatenate((signal, np.int16(s * 32767))) + pause_samples = int(self.pause_duration * self.fs) + signal = np.concatenate((signal, np.zeros(pause_samples, dtype=np.int16))) + elif char == ' ': - pause_duration = int(self.word_pause_duration * self.fs) - signal = np.concatenate((signal, np.zeros(pause_duration, dtype=np.int16))) - pause_duration = int(self.pause_duration * self.fs) - signal = np.concatenate((signal, np.zeros(pause_duration, dtype=np.int16))) - - pause_duration = int(self.word_pause_duration * self.fs) - #signal = np.concatenate((signal, np.zeros(pause_duration, dtype=np.int16))) - - # Convert the signal to mono (single-channel) - #signal = signal.reshape(-1, 1) + pause_samples = int(self.word_pause_duration * self.fs) + signal = np.concatenate((signal, np.zeros(pause_samples, dtype=np.int16))) + pause_samples = int(self.pause_duration * self.fs) + signal = np.concatenate((signal, np.zeros(pause_samples, dtype=np.int16))) return signal diff --git a/modem/data_handler.py b/modem/data_handler.py index d6000511..ed65412c 100644 --- a/modem/data_handler.py +++ b/modem/data_handler.py @@ -2856,9 +2856,7 @@ class DATA: self.enqueue_frame_for_tx([cq_frame], c2_mode=FREEDV_MODE.fsk_ldpc_0.value) else: self.enqueue_frame_for_tx([cq_frame], c2_mode=FREEDV_MODE.sig0.value, copies=1, repeat_delay=0) - # FIXME Remove or change this in later versions for full CW support - # Modem.transmitting = True - # modem.MODEM_TRANSMIT_QUEUE.put(["morse", 1, 0, "123"]) + #modem.MODEM_TRANSMIT_QUEUE.put(["morse", 1, 0, self.mycallsign]) def received_cq(self, data_in: bytes) -> None: """ diff --git a/modem/modem.py b/modem/modem.py index 6df36fc5..3953052c 100644 --- a/modem/modem.py +++ b/modem/modem.py @@ -29,7 +29,7 @@ import structlog import ujson as json import tci # FIXME used for def transmit_morse -# import cw +import cw from queues import DATA_QUEUE_RECEIVED, MODEM_RECEIVED_QUEUE, MODEM_TRANSMIT_QUEUE, RIGCTLD_COMMAND_QUEUE, \ AUDIO_RECEIVED_QUEUE, AUDIO_TRANSMIT_QUEUE, MESH_RECEIVED_QUEUE @@ -745,18 +745,7 @@ class RF: ) start_of_transmission = time.time() - txbuffer = cw.MorseCodePlayer().text_to_signal("DJ2LS-1") - print(txbuffer) - print(type(txbuffer)) - x = np.frombuffer(txbuffer, dtype=np.int16) - print(type(x)) - txbuffer_out = x - print(txbuffer_out) - - #if not HamlibParam.hamlib_radiocontrol in ["tci"]: - # txbuffer_out = self.resampler.resample8_to_48(x) - #else: - # txbuffer_out = x + txbuffer_out = cw.MorseCodePlayer().text_to_signal("DJ2LS-1") self.mod_out_locked = True self.enqueue_modulation(txbuffer_out) @@ -808,6 +797,8 @@ class RF: self.log.debug("[MDM] ON AIR TIME", time=transmission_time) def enqueue_modulation(self, txbuffer_out): + + chunk_length = self.AUDIO_FRAMES_PER_BUFFER_TX # 4800 chunk = [ txbuffer_out[i: i + chunk_length]