mirror of
https://github.com/eried/portapack-mayhem.git
synced 2025-02-05 01:15:36 -05:00
Added CTCSS in Soundboard
This commit is contained in:
parent
629ebd0d28
commit
8276e5e311
@ -99,10 +99,12 @@ void set_afsk_data(const uint32_t afsk_samples_per_bit, const uint32_t afsk_phas
|
|||||||
send_message(&message);
|
send_message(&message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_audiotx_data(const uint32_t divider, const uint32_t bw) {
|
void set_audiotx_data(const uint32_t divider, const uint32_t bw, const bool ctcss_enabled, const uint32_t ctcss_phase_inc) {
|
||||||
const AudioTXConfigMessage message {
|
const AudioTXConfigMessage message {
|
||||||
divider,
|
divider,
|
||||||
bw
|
bw,
|
||||||
|
ctcss_phase_inc,
|
||||||
|
ctcss_enabled
|
||||||
};
|
};
|
||||||
send_message(&message);
|
send_message(&message);
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ struct WFMConfig {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void set_ccir_data( const uint32_t samples_per_tone, const uint16_t tone_count);
|
void set_ccir_data( const uint32_t samples_per_tone, const uint16_t tone_count);
|
||||||
void set_audiotx_data(const uint32_t divider, const uint32_t bw);
|
void set_audiotx_data(const uint32_t divider, const uint32_t bw, const bool ctcss_enabled, const uint32_t ctcss_phase_inc);
|
||||||
void set_fifo_data(const int8_t * data);
|
void set_fifo_data(const int8_t * data);
|
||||||
void set_pwmrssi(int32_t avg, bool enabled);
|
void set_pwmrssi(int32_t avg, bool enabled);
|
||||||
void set_afsk_data(const uint32_t afsk_samples_per_bit, const uint32_t afsk_phase_inc_mark, const uint32_t afsk_phase_inc_space,
|
void set_afsk_data(const uint32_t afsk_samples_per_bit, const uint32_t afsk_phase_inc_mark, const uint32_t afsk_phase_inc_space,
|
||||||
|
@ -59,7 +59,7 @@ void AboutView::on_show() {
|
|||||||
transmitter_model.set_baseband_bandwidth(1750000);
|
transmitter_model.set_baseband_bandwidth(1750000);
|
||||||
transmitter_model.enable();
|
transmitter_model.enable();
|
||||||
|
|
||||||
baseband::set_audiotx_data(32, 15);
|
baseband::set_audiotx_data(32, 15, false, 0);
|
||||||
|
|
||||||
//audio::headphone::set_volume(volume_t::decibel(0 - 99) + audio::headphone::volume_range().max);
|
//audio::headphone::set_volume(volume_t::decibel(0 - 99) + audio::headphone::volume_range().max);
|
||||||
}
|
}
|
||||||
|
@ -96,6 +96,9 @@ void SoundBoardView::on_tuning_frequency_changed(rf::Frequency f) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SoundBoardView::play_sound(uint16_t id) {
|
void SoundBoardView::play_sound(uint16_t id) {
|
||||||
|
uint32_t ctcss_option;
|
||||||
|
bool ctcss_enabled;
|
||||||
|
uint32_t divider;
|
||||||
|
|
||||||
if (sounds[id].size == 0) return;
|
if (sounds[id].size == 0) return;
|
||||||
|
|
||||||
@ -123,7 +126,21 @@ void SoundBoardView::play_sound(uint16_t id) {
|
|||||||
transmitter_model.set_baseband_bandwidth(1750000);
|
transmitter_model.set_baseband_bandwidth(1750000);
|
||||||
transmitter_model.enable();
|
transmitter_model.enable();
|
||||||
|
|
||||||
baseband::set_audiotx_data(1536000 / sounds[id].sample_rate, number_bw.value());
|
ctcss_option = options_ctcss.selected_index();
|
||||||
|
|
||||||
|
if (ctcss_option)
|
||||||
|
ctcss_enabled = true;
|
||||||
|
else
|
||||||
|
ctcss_enabled = false;
|
||||||
|
|
||||||
|
divider = (1536000 / sounds[id].sample_rate) - 1;
|
||||||
|
|
||||||
|
baseband::set_audiotx_data(
|
||||||
|
divider,
|
||||||
|
number_bw.value(),
|
||||||
|
ctcss_enabled,
|
||||||
|
(67109.0 * (float)_ctcss_freq)/1536000.0 // TODO: Might not be precise enough
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundBoardView::show_infos(uint16_t id) {
|
void SoundBoardView::show_infos(uint16_t id) {
|
||||||
@ -181,6 +198,10 @@ uint32_t SoundBoardView::fb_to_uint32(const std::string& fb) {
|
|||||||
return (fb[3] << 24) + (fb[2] << 16) + (fb[1] << 8) + fb[0];
|
return (fb[3] << 24) + (fb[2] << 16) + (fb[1] << 8) + fb[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoundBoardView::on_ctcss_changed(uint32_t v) {
|
||||||
|
_ctcss_freq = v;
|
||||||
|
}
|
||||||
|
|
||||||
SoundBoardView::SoundBoardView(
|
SoundBoardView::SoundBoardView(
|
||||||
NavigationView& nav
|
NavigationView& nav
|
||||||
)
|
)
|
||||||
@ -244,6 +265,7 @@ SoundBoardView::SoundBoardView(
|
|||||||
&field_frequency,
|
&field_frequency,
|
||||||
&number_bw,
|
&number_bw,
|
||||||
&text_kHz,
|
&text_kHz,
|
||||||
|
&options_ctcss,
|
||||||
&text_page,
|
&text_page,
|
||||||
&text_duration,
|
&text_duration,
|
||||||
&pbar,
|
&pbar,
|
||||||
@ -252,6 +274,12 @@ SoundBoardView::SoundBoardView(
|
|||||||
&button_exit
|
&button_exit
|
||||||
} });
|
} });
|
||||||
|
|
||||||
|
options_ctcss.on_change = [this](size_t, OptionsField::value_t v) {
|
||||||
|
this->on_ctcss_changed(v);
|
||||||
|
};
|
||||||
|
|
||||||
|
options_ctcss.set_selected_index(0);
|
||||||
|
|
||||||
const auto button_fn = [this](Button& button) {
|
const auto button_fn = [this](Button& button) {
|
||||||
tx_mode = NORMAL;
|
tx_mode = NORMAL;
|
||||||
this->play_sound(button.id);
|
this->play_sound(button.id);
|
||||||
|
@ -73,6 +73,8 @@ private:
|
|||||||
uint8_t max_sound;
|
uint8_t max_sound;
|
||||||
uint8_t max_page;
|
uint8_t max_page;
|
||||||
|
|
||||||
|
uint32_t _ctcss_freq;
|
||||||
|
|
||||||
int8_t audio_buffer[1024];
|
int8_t audio_buffer[1024];
|
||||||
|
|
||||||
Style style_a {
|
Style style_a {
|
||||||
@ -107,6 +109,7 @@ private:
|
|||||||
void refresh_buttons(uint16_t id);
|
void refresh_buttons(uint16_t id);
|
||||||
void play_sound(uint16_t id);
|
void play_sound(uint16_t id);
|
||||||
void prepare_audio();
|
void prepare_audio();
|
||||||
|
void on_ctcss_changed(uint32_t v);
|
||||||
uint16_t fb_to_uint16(const std::string& fb);
|
uint16_t fb_to_uint16(const std::string& fb);
|
||||||
uint32_t fb_to_uint32(const std::string& fb);
|
uint32_t fb_to_uint32(const std::string& fb);
|
||||||
|
|
||||||
@ -119,7 +122,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
NumberField number_bw {
|
NumberField number_bw {
|
||||||
{ 13 * 8, 4 },
|
{ 11 * 8, 4 },
|
||||||
3,
|
3,
|
||||||
{1, 150},
|
{1, 150},
|
||||||
1,
|
1,
|
||||||
@ -127,12 +130,71 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
Text text_kHz {
|
Text text_kHz {
|
||||||
{ 16 * 8, 4, 3 * 8, 16 },
|
{ 14 * 8, 4, 3 * 8, 16 },
|
||||||
"kHz"
|
"kHz"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
OptionsField options_ctcss {
|
||||||
|
{ 18 * 8, 4 },
|
||||||
|
6,
|
||||||
|
{
|
||||||
|
{ "None ", 0 },
|
||||||
|
{ "XZ 000", 67000 },
|
||||||
|
{ "WZ 001", 69400 },
|
||||||
|
{ "XA 039", 71900 },
|
||||||
|
{ "WA 003", 74400 },
|
||||||
|
{ "XB 004", 77000 },
|
||||||
|
{ "WB 005", 79700 },
|
||||||
|
{ "YZ 006", 82500 },
|
||||||
|
{ "YA 007", 85400 },
|
||||||
|
{ "YB 008", 88500 },
|
||||||
|
{ "ZZ 009", 91500 },
|
||||||
|
{ "ZA 010", 94800 },
|
||||||
|
{ "ZB 011", 97400 },
|
||||||
|
{ "1Z 012", 100000 },
|
||||||
|
{ "1A 013", 103500 },
|
||||||
|
{ "1B 014", 107200 },
|
||||||
|
{ "2Z 015", 110900 },
|
||||||
|
{ "2Z 016", 114800 },
|
||||||
|
{ "2B 017", 118800 },
|
||||||
|
{ "3Z 018", 123000 },
|
||||||
|
{ "3A 019", 127300 },
|
||||||
|
{ "3B 020", 131800 },
|
||||||
|
{ "4Z 021", 136500 },
|
||||||
|
{ "4A 022", 141300 },
|
||||||
|
{ "4B 023", 146200 },
|
||||||
|
{ "MIL ", 150000 },
|
||||||
|
{ "5Z 024", 151400 },
|
||||||
|
{ "5A 025", 156700 },
|
||||||
|
{ "-- 040", 159800 },
|
||||||
|
{ "5B 026", 162200 },
|
||||||
|
{ "-- 041", 165500 },
|
||||||
|
{ "6Z 027", 167900 },
|
||||||
|
{ "-- 042", 171300 },
|
||||||
|
{ "6A 028", 173800 },
|
||||||
|
{ "-- 043", 177300 },
|
||||||
|
{ "6B 029", 179900 },
|
||||||
|
{ "-- 044", 183500 },
|
||||||
|
{ "7Z 030", 186200 },
|
||||||
|
{ "-- 045", 189900 },
|
||||||
|
{ "7A 031", 192800 },
|
||||||
|
{ "-- 046", 196600 },
|
||||||
|
{ "-- 047", 199500 },
|
||||||
|
{ "M1 032", 203500 },
|
||||||
|
{ "8Z 048", 206500 },
|
||||||
|
{ "M2 033", 210700 },
|
||||||
|
{ "M3 034", 218100 },
|
||||||
|
{ "M4 035", 225700 },
|
||||||
|
{ "9Z 049", 229100 },
|
||||||
|
{ "-- 036", 233600 },
|
||||||
|
{ "-- 037", 241800 },
|
||||||
|
{ "-- 038", 250300 },
|
||||||
|
{ "0Z 050", 254100 }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Text text_page {
|
Text text_page {
|
||||||
{ 22 * 8, 4, 3 * 8, 16 },
|
{ 25 * 8, 4, 3 * 8, 16 },
|
||||||
"-/-"
|
"-/-"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -43,6 +43,12 @@ void AudioTXProcessor::execute(const buffer_c8_t& buffer){
|
|||||||
audio_fifo.out(sample);
|
audio_fifo.out(sample);
|
||||||
//preview_audio_buffer.p[ai++] = sample << 8;
|
//preview_audio_buffer.p[ai++] = sample << 8;
|
||||||
|
|
||||||
|
if (ctcss_enabled) {
|
||||||
|
ctcss_sample = sine_table_i8[(ctcss_phase & 0x03FC0000) >> 18];
|
||||||
|
int16_t mix = (sample * 218) + (ctcss_sample * 37); // ~15%
|
||||||
|
sample = mix >> 8;
|
||||||
|
}
|
||||||
|
|
||||||
if ((audio_fifo.len() < 1024) && (asked == false)) {
|
if ((audio_fifo.len() < 1024) && (asked == false)) {
|
||||||
// Ask application to fill up fifo
|
// Ask application to fill up fifo
|
||||||
sigmessage.signaltype = 1;
|
sigmessage.signaltype = 1;
|
||||||
@ -53,6 +59,8 @@ void AudioTXProcessor::execute(const buffer_c8_t& buffer){
|
|||||||
as--;
|
as--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctcss_phase += ctcss_phase_inc;
|
||||||
|
|
||||||
// FM
|
// FM
|
||||||
frq = sample * bw;
|
frq = sample * bw;
|
||||||
|
|
||||||
@ -79,6 +87,8 @@ void AudioTXProcessor::on_message(const Message* const msg) {
|
|||||||
// a = 262144 / 1536000 (*1000 = 171)
|
// a = 262144 / 1536000 (*1000 = 171)
|
||||||
bw = 171 * (message->bw);
|
bw = 171 * (message->bw);
|
||||||
divider = message->divider;
|
divider = message->divider;
|
||||||
|
ctcss_phase_inc = message->ctcss_phase_inc;
|
||||||
|
ctcss_enabled = message->ctcss_enabled;
|
||||||
as = 0;
|
as = 0;
|
||||||
|
|
||||||
configured = true;
|
configured = true;
|
||||||
|
@ -44,9 +44,11 @@ private:
|
|||||||
uint32_t bw;
|
uint32_t bw;
|
||||||
uint32_t divider;
|
uint32_t divider;
|
||||||
uint8_t as = 0;
|
uint8_t as = 0;
|
||||||
|
uint32_t ctcss_phase_inc;
|
||||||
|
bool ctcss_enabled;
|
||||||
|
|
||||||
int8_t re, im;
|
int8_t re, im;
|
||||||
int8_t sample;
|
int8_t ctcss_sample, sample;
|
||||||
|
|
||||||
bool asked = false;
|
bool asked = false;
|
||||||
|
|
||||||
@ -58,7 +60,7 @@ private:
|
|||||||
|
|
||||||
FIFOSignalMessage sigmessage;
|
FIFOSignalMessage sigmessage;
|
||||||
|
|
||||||
uint32_t aphase, phase, sphase;
|
uint32_t ctcss_phase, phase, sphase;
|
||||||
int32_t frq;
|
int32_t frq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -563,15 +563,21 @@ class AudioTXConfigMessage : public Message {
|
|||||||
public:
|
public:
|
||||||
constexpr AudioTXConfigMessage(
|
constexpr AudioTXConfigMessage(
|
||||||
const uint32_t divider,
|
const uint32_t divider,
|
||||||
const uint32_t bw
|
const uint32_t bw,
|
||||||
|
const uint32_t ctcss_phase_inc,
|
||||||
|
const bool ctcss_enabled
|
||||||
) : Message { ID::AudioTXConfig },
|
) : Message { ID::AudioTXConfig },
|
||||||
divider(divider),
|
divider(divider),
|
||||||
bw(bw)
|
bw(bw),
|
||||||
|
ctcss_phase_inc(ctcss_phase_inc),
|
||||||
|
ctcss_enabled(ctcss_enabled)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t divider;
|
const uint32_t divider;
|
||||||
const uint32_t bw;
|
const uint32_t bw;
|
||||||
|
const uint32_t ctcss_phase_inc;
|
||||||
|
const bool ctcss_enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AFSKConfigureMessage : public Message {
|
class AFSKConfigureMessage : public Message {
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user