mirror of
https://github.com/eried/portapack-mayhem.git
synced 2024-12-25 07:19:28 -05:00
Fixed Nuoptix TX, merged DTMF TX with tones TX
This commit is contained in:
parent
1e34a48be9
commit
a67feb01fd
@ -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 !
|
timecode = lfsr_iterate(timecode) % 1999; // Could be 9999 but that would be one long audio track !
|
||||||
|
|
||||||
if (setup) {
|
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();
|
timecode = number_timecode.value();
|
||||||
else
|
}
|
||||||
timecode = 0125; // TODO: Use RTC as seed ?
|
|
||||||
|
|
||||||
transmitter_model.set_baseband_configuration({
|
transmitter_model.set_baseband_configuration({
|
||||||
.mode = 0,
|
.mode = 0,
|
||||||
.sampling_rate = 1536000,
|
.sampling_rate = 1536000U,
|
||||||
.decimation_factor = 1,
|
.decimation_factor = 1,
|
||||||
});
|
});
|
||||||
transmitter_model.set_rf_amp(true);
|
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
|
shared_memory.bb_data.tones_data.silence = NUOPTIX_TONE_LENGTH; // 49ms tone, 49ms space
|
||||||
|
|
||||||
audio::set_rate(audio::Rate::Hz_24000);
|
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++;
|
timecode++;
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "baseband_api.hpp"
|
#include "baseband_api.hpp"
|
||||||
#include "ui_navigation.hpp"
|
#include "ui_navigation.hpp"
|
||||||
#include "ui_receiver.hpp"
|
#include "ui_receiver.hpp"
|
||||||
|
#include "time.hpp"
|
||||||
#include "message.hpp"
|
#include "message.hpp"
|
||||||
#include "volume.hpp"
|
#include "volume.hpp"
|
||||||
#include "audio.hpp"
|
#include "audio.hpp"
|
||||||
@ -89,6 +90,7 @@ private:
|
|||||||
void transmit(bool setup);
|
void transmit(bool setup);
|
||||||
|
|
||||||
uint32_t timecode;
|
uint32_t timecode;
|
||||||
|
rtc::RTC datetime;
|
||||||
|
|
||||||
FrequencyField field_frequency {
|
FrequencyField field_frequency {
|
||||||
{ 1 * 8, 4 },
|
{ 1 * 8, 4 },
|
||||||
@ -148,7 +150,7 @@ private:
|
|||||||
Message::ID::TXDone,
|
Message::ID::TXDone,
|
||||||
[this](const Message* const p) {
|
[this](const Message* const p) {
|
||||||
const auto message = *reinterpret_cast<const TXDoneMessage*>(p);
|
const auto message = *reinterpret_cast<const TXDoneMessage*>(p);
|
||||||
if (message.progress == 0xFF)
|
if (message.done)
|
||||||
transmit(false);
|
transmit(false);
|
||||||
else
|
else
|
||||||
pbar.set_value(message.progress);
|
pbar.set_value(message.progress);
|
||||||
|
Binary file not shown.
@ -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 <cstdint>
|
|
||||||
|
|
||||||
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<buffer.count; i++) {
|
|
||||||
|
|
||||||
if (!as) {
|
|
||||||
as = 10;
|
|
||||||
|
|
||||||
if (!timer) {
|
|
||||||
if (tone) {
|
|
||||||
tone = false;
|
|
||||||
timer = pause_length;
|
|
||||||
} else {
|
|
||||||
tone = true;
|
|
||||||
timer = tone_length;
|
|
||||||
|
|
||||||
tone_code = shared_memory.bb_data.data[tone_idx];
|
|
||||||
|
|
||||||
if (tone_code == 0xFF) {
|
|
||||||
txdone_message.done = true; // End of list
|
|
||||||
shared_memory.application_queue.push(txdone_message);
|
|
||||||
configured = false;
|
|
||||||
tone = false;
|
|
||||||
} else {
|
|
||||||
txdone_message.progress = tone_idx; // New tone
|
|
||||||
shared_memory.application_queue.push(txdone_message);
|
|
||||||
tone_idx++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
timer--;
|
|
||||||
|
|
||||||
if (tone) {
|
|
||||||
sample = sine_table_i8[(tone_a_phase & 0x03FC0000) >> 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<const DTMFTXConfigMessage*>(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<DTMFTXProcessor>() };
|
|
||||||
event_dispatcher.run();
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -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
|
|
@ -54,6 +54,7 @@ void TonesProcessor::execute(const buffer_c8_t& buffer) {
|
|||||||
configured = false;
|
configured = false;
|
||||||
txdone_message.done = true;
|
txdone_message.done = true;
|
||||||
shared_memory.application_queue.push(txdone_message);
|
shared_memory.application_queue.push(txdone_message);
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
txdone_message.progress = digit_pos; // Inform UI about progress
|
txdone_message.progress = digit_pos; // Inform UI about progress
|
||||||
shared_memory.application_queue.push(txdone_message);
|
shared_memory.application_queue.push(txdone_message);
|
||||||
@ -62,7 +63,7 @@ void TonesProcessor::execute(const buffer_c8_t& buffer) {
|
|||||||
digit_pos++;
|
digit_pos++;
|
||||||
|
|
||||||
if ((digit >= 32) || (tone_deltas[digit] == 0)) {
|
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 {
|
} else {
|
||||||
if (!dual_tone) {
|
if (!dual_tone) {
|
||||||
tone_a_delta = tone_deltas[digit];
|
tone_a_delta = tone_deltas[digit];
|
||||||
@ -79,8 +80,6 @@ void TonesProcessor::execute(const buffer_c8_t& buffer) {
|
|||||||
// Ugly
|
// Ugly
|
||||||
if (digit >= 32) {
|
if (digit >= 32) {
|
||||||
tone_sample = 0;
|
tone_sample = 0;
|
||||||
re = 0;
|
|
||||||
im = 0;
|
|
||||||
} else {
|
} else {
|
||||||
if (!dual_tone) {
|
if (!dual_tone) {
|
||||||
tone_sample = (sine_table_i8[(tone_a_phase & 0x03FC0000) >> 18]);
|
tone_sample = (sine_table_i8[(tone_a_phase & 0x03FC0000) >> 18]);
|
||||||
@ -92,6 +91,7 @@ void TonesProcessor::execute(const buffer_c8_t& buffer) {
|
|||||||
tone_a_phase += tone_a_delta;
|
tone_a_phase += tone_a_delta;
|
||||||
tone_b_phase += tone_b_delta;
|
tone_b_phase += tone_b_delta;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// FM
|
// FM
|
||||||
delta = tone_sample * fm_delta;
|
delta = tone_sample * fm_delta;
|
||||||
@ -102,7 +102,6 @@ void TonesProcessor::execute(const buffer_c8_t& buffer) {
|
|||||||
re = (sine_table_i8[(sphase & 0x03FC0000) >> 18]);
|
re = (sine_table_i8[(sphase & 0x03FC0000) >> 18]);
|
||||||
im = (sine_table_i8[(phase & 0x03FC0000) >> 18]);
|
im = (sine_table_i8[(phase & 0x03FC0000) >> 18]);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Headphone output sample generation: 1536000/24000 = 64
|
// Headphone output sample generation: 1536000/24000 = 64
|
||||||
if (audio_out) {
|
if (audio_out) {
|
||||||
@ -139,6 +138,7 @@ void TonesProcessor::on_message(const Message* const p) {
|
|||||||
txdone_message.progress = 0;
|
txdone_message.progress = 0;
|
||||||
|
|
||||||
digit_pos = 0;
|
digit_pos = 0;
|
||||||
|
sample_count = 0;
|
||||||
tone_a_phase = 0;
|
tone_a_phase = 0;
|
||||||
tone_b_phase = 0;
|
tone_b_phase = 0;
|
||||||
as = 0;
|
as = 0;
|
||||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user