diff --git a/firmware/application/ui_nuoptix.cpp b/firmware/application/ui_nuoptix.cpp index 0171b6df..119d8cd8 100644 --- a/firmware/application/ui_nuoptix.cpp +++ b/firmware/application/ui_nuoptix.cpp @@ -63,16 +63,19 @@ void NuoptixView::transmit(bool setup) { timecode = lfsr_iterate(timecode) % 1999; // Could be 9999 but that would be one long audio track ! if (setup) { - pbar.set_max(4); + pbar.set_max(6 * 2); - if (tx_mode == NORMAL) + if (tx_mode == IMPROVISE) { + // Seed from RTC + rtcGetTime(&RTCD1, &datetime); + timecode = datetime.day() + datetime.second(); + } else { timecode = number_timecode.value(); - else - timecode = 0125; // TODO: Use RTC as seed ? + } transmitter_model.set_baseband_configuration({ .mode = 0, - .sampling_rate = 1536000, + .sampling_rate = 1536000U, .decimation_factor = 1, }); transmitter_model.set_rf_amp(true); @@ -137,7 +140,7 @@ void NuoptixView::transmit(bool setup) { shared_memory.bb_data.tones_data.silence = NUOPTIX_TONE_LENGTH; // 49ms tone, 49ms space audio::set_rate(audio::Rate::Hz_24000); - baseband::set_tones_data(number_bw.value(), 0, 6 * 2, true, true); + baseband::set_tones_data(number_bw.value() * 500, 0, 6 * 2, true, true); timecode++; } diff --git a/firmware/application/ui_nuoptix.hpp b/firmware/application/ui_nuoptix.hpp index 7d6bd328..7f4c0658 100644 --- a/firmware/application/ui_nuoptix.hpp +++ b/firmware/application/ui_nuoptix.hpp @@ -29,6 +29,7 @@ #include "baseband_api.hpp" #include "ui_navigation.hpp" #include "ui_receiver.hpp" +#include "time.hpp" #include "message.hpp" #include "volume.hpp" #include "audio.hpp" @@ -89,6 +90,7 @@ private: void transmit(bool setup); uint32_t timecode; + rtc::RTC datetime; FrequencyField field_frequency { { 1 * 8, 4 }, @@ -148,7 +150,7 @@ private: Message::ID::TXDone, [this](const Message* const p) { const auto message = *reinterpret_cast(p); - if (message.progress == 0xFF) + if (message.done) transmit(false); else pbar.set_value(message.progress); diff --git a/firmware/baseband/baseband_tones.img b/firmware/baseband/baseband_tones.img index 9a246ffb..b6654183 100644 Binary files a/firmware/baseband/baseband_tones.img and b/firmware/baseband/baseband_tones.img differ diff --git a/firmware/baseband/proc_dtmf_tx.cpp b/firmware/baseband/proc_dtmf_tx.cpp deleted file mode 100644 index 9af57f51..00000000 --- a/firmware/baseband/proc_dtmf_tx.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "proc_dtmf_tx.hpp" -#include "portapack_shared_memory.hpp" -#include "sine_table_int8.hpp" -//#include "audio_output.hpp" -#include "event_m4.hpp" - -#include - -void DTMFTXProcessor::execute(const buffer_c8_t& buffer) { - - // This is called at 1536000/2048 = 750Hz - // DTMF samplerate = 153600Hz - - if (!configured) return; - - for (size_t i = 0; i> 18] >> 1; - sample += sine_table_i8[(tone_b_phase & 0x03FC0000) >> 18] >> 1; - - tone_a_phase += DTMF_LUT[tone_code][0]; - tone_b_phase += DTMF_LUT[tone_code][1]; - } else { - sample = 0; - } - } else { - as--; - } - - // FM - frq = sample * bw; - - phase = (phase + frq); - sphase = phase + (64 << 18); - - re = (sine_table_i8[(sphase & 0x03FC0000) >> 18]); - im = (sine_table_i8[(phase & 0x03FC0000) >> 18]); - - buffer.p[i] = {(int8_t)re, (int8_t)im}; - } - - //AudioOutput::fill_audio_buffer(preview_audio_buffer, true); -} - -void DTMFTXProcessor::on_message(const Message* const msg) { - uint8_t * tone_ptr; - const auto message = *reinterpret_cast(msg); - - if (message.id == Message::ID::DTMFTXConfig) { - - // Translate DTMF message to index in DTMF frequencies table - tone_ptr = &shared_memory.bb_data.data[0]; - for (;;) { - tone_code = *tone_ptr; - if (tone_code == 0xFF) - break; // End of message - else if (tone_code <= 9) - // That's already fine bro. - *tone_ptr = tone_code; - else if (tone_code == 'A') - *tone_ptr = 10; - else if (tone_code == 'B') - *tone_ptr = 11; - else if (tone_code == 'C') - *tone_ptr = 12; - else if (tone_code == 'D') - *tone_ptr = 13; - else if (tone_code == '#') - *tone_ptr = 14; - else if (tone_code == '*') - *tone_ptr = 15; - else { - *tone_ptr = 0xFF; // Invalid character, stop here - } - tone_ptr++; - } - - // 1<<18 = 262144 - // m = (262144 * a) / 1536000 - // a = 262144 / 1536000 (*1000 = 171) - bw = 171 * (message.bw); - tone_length = message.tone_length * 154; // 153.6 - pause_length = message.pause_length * 154; // 153.6 - as = 0; - txdone_message.progress = 0; - txdone_message.done = false; - tone = false; - timer = 0; - tone_idx = 0; - - configured = true; - } -} - -int main() { - EventDispatcher event_dispatcher { std::make_unique() }; - event_dispatcher.run(); - return 0; -} diff --git a/firmware/baseband/proc_dtmf_tx.hpp b/firmware/baseband/proc_dtmf_tx.hpp deleted file mode 100644 index b04f5802..00000000 --- a/firmware/baseband/proc_dtmf_tx.hpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __PROC_DTMFTX_H__ -#define __PROC_DTMFTX_H__ - -#include "baseband_processor.hpp" -#include "baseband_thread.hpp" - -#define DTMF_PHASEINC 436.91 // (65536*1024)/1536000*10 -#define DTMF_C0 (uint32_t)(1209*DTMF_PHASEINC) -#define DTMF_C1 (uint32_t)(1336*DTMF_PHASEINC) -#define DTMF_C2 (uint32_t)(1477*DTMF_PHASEINC) -#define DTMF_C3 (uint32_t)(1633*DTMF_PHASEINC) -#define DTMF_R0 (uint32_t)(697*DTMF_PHASEINC) -#define DTMF_R1 (uint32_t)(770*DTMF_PHASEINC) -#define DTMF_R2 (uint32_t)(852*DTMF_PHASEINC) -#define DTMF_R3 (uint32_t)(941*DTMF_PHASEINC) - -class DTMFTXProcessor : public BasebandProcessor { -public: - void execute(const buffer_c8_t& buffer) override; - - void on_message(const Message* const msg) override; - -private: - bool configured = false; - - BasebandThread baseband_thread { 1536000, this, NORMALPRIO + 20, baseband::Direction::Transmit }; - - // 0123456789ABCD#* - const uint32_t DTMF_LUT[16][2] = { - { DTMF_C1, DTMF_R3 }, - { DTMF_C0, DTMF_R0 }, - { DTMF_C1, DTMF_R0 }, - { DTMF_C2, DTMF_R0 }, - { DTMF_C0, DTMF_R1 }, - { DTMF_C1, DTMF_R1 }, - { DTMF_C2, DTMF_R1 }, - { DTMF_C0, DTMF_R2 }, - { DTMF_C1, DTMF_R2 }, - { DTMF_C2, DTMF_R2 }, - { DTMF_C3, DTMF_R0 }, - { DTMF_C3, DTMF_R1 }, - { DTMF_C3, DTMF_R2 }, - { DTMF_C3, DTMF_R3 }, - { DTMF_C2, DTMF_R3 }, - { DTMF_C0, DTMF_R3 } - }; - - uint32_t tone_length, pause_length; - uint32_t as, bw; - uint8_t tone_idx = 0, tone_code = 0; - - uint32_t timer = 0; - - bool tone = false; // Tone / pause - - int8_t re, im; - int8_t sample; - - //int16_t audio_data[64]; - /*const buffer_s16_t preview_audio_buffer { - audio_data, - sizeof(int16_t)*64 - };*/ - - TXDoneMessage txdone_message; - - uint32_t tone_a_phase, tone_b_phase, phase, sphase; - int32_t frq; -}; - -#endif diff --git a/firmware/baseband/proc_tones.cpp b/firmware/baseband/proc_tones.cpp index 2f6d0db7..88b816a5 100644 --- a/firmware/baseband/proc_tones.cpp +++ b/firmware/baseband/proc_tones.cpp @@ -54,6 +54,7 @@ void TonesProcessor::execute(const buffer_c8_t& buffer) { configured = false; txdone_message.done = true; shared_memory.application_queue.push(txdone_message); + return; } else { txdone_message.progress = digit_pos; // Inform UI about progress shared_memory.application_queue.push(txdone_message); @@ -62,7 +63,7 @@ void TonesProcessor::execute(const buffer_c8_t& buffer) { digit_pos++; if ((digit >= 32) || (tone_deltas[digit] == 0)) { - silence_count = shared_memory.bb_data.tones_data.silence; + sample_count = shared_memory.bb_data.tones_data.silence; } else { if (!dual_tone) { tone_a_delta = tone_deltas[digit]; @@ -79,8 +80,6 @@ void TonesProcessor::execute(const buffer_c8_t& buffer) { // Ugly if (digit >= 32) { tone_sample = 0; - re = 0; - im = 0; } else { if (!dual_tone) { tone_sample = (sine_table_i8[(tone_a_phase & 0x03FC0000) >> 18]); @@ -92,16 +91,16 @@ void TonesProcessor::execute(const buffer_c8_t& buffer) { tone_a_phase += tone_a_delta; tone_b_phase += tone_b_delta; } - - // FM - delta = tone_sample * fm_delta; - - phase += delta; - sphase = phase + (64 << 18); - - re = (sine_table_i8[(sphase & 0x03FC0000) >> 18]); - im = (sine_table_i8[(phase & 0x03FC0000) >> 18]); } + + // FM + delta = tone_sample * fm_delta; + + phase += delta; + sphase = phase + (64 << 18); + + re = (sine_table_i8[(sphase & 0x03FC0000) >> 18]); + im = (sine_table_i8[(phase & 0x03FC0000) >> 18]); } // Headphone output sample generation: 1536000/24000 = 64 @@ -139,6 +138,7 @@ void TonesProcessor::on_message(const Message* const p) { txdone_message.progress = 0; digit_pos = 0; + sample_count = 0; tone_a_phase = 0; tone_b_phase = 0; as = 0; diff --git a/firmware/portapack-h1-havoc.bin b/firmware/portapack-h1-havoc.bin index bf8ae5a4..81958a17 100644 Binary files a/firmware/portapack-h1-havoc.bin and b/firmware/portapack-h1-havoc.bin differ