diff --git a/firmware/baseband/audio_dma.cpp b/firmware/baseband/audio_dma.cpp index 60e85096e..1f2828558 100644 --- a/firmware/baseband/audio_dma.cpp +++ b/firmware/baseband/audio_dma.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2016 Furrtek * * This file is part of PortaPack. * @@ -228,7 +229,7 @@ buffer_t rx_empty_buffer() { if( next_lli ) { const size_t next_index = next_lli - &lli_rx_loop[0]; const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask; - return { reinterpret_cast(lli_rx_loop[free_index].srcaddr), transfer_samples }; + return { reinterpret_cast(lli_rx_loop[free_index].destaddr), transfer_samples }; } else { return { nullptr, 0 }; } diff --git a/firmware/baseband/audio_dma.hpp b/firmware/baseband/audio_dma.hpp index 863a4f396..5fe16a27c 100644 --- a/firmware/baseband/audio_dma.hpp +++ b/firmware/baseband/audio_dma.hpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2016 Furrtek * * This file is part of PortaPack. * diff --git a/firmware/baseband/audio_input.cpp b/firmware/baseband/audio_input.cpp new file mode 100644 index 000000000..4ebfc507c --- /dev/null +++ b/firmware/baseband/audio_input.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2014 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 "audio_input.hpp" + +#include "portapack_shared_memory.hpp" + +#include "audio_dma.hpp" + +#include "message.hpp" + +#include +#include +#include + +void AudioInput::configure( + const iir_biquad_config_t& hpf_config, + const float squelch_threshold +) { + //hpf.configure(hpf_config); + //squelch.set_threshold(squelch_threshold); +} + +void AudioInput::read_audio_buffer(buffer_s16_t& audio) { + //std::array audio_int; + + auto audio_buffer = audio::dma::rx_empty_buffer(); + + for(size_t i=0; iwrite(audio_int.data(), audio_buffer.count * sizeof(audio_int[0])); + }*/ + + //feed_audio_stats(audio); +} diff --git a/firmware/baseband/audio_input.hpp b/firmware/baseband/audio_input.hpp new file mode 100644 index 000000000..963e09c39 --- /dev/null +++ b/firmware/baseband/audio_input.hpp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2014 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 __AUDIO_INPUT_H__ +#define __AUDIO_INPUT_H__ + +#include "dsp_types.hpp" + +#include "dsp_iir.hpp" +#include "dsp_squelch.hpp" + +#include "stream_input.hpp" + +#include +#include + +class AudioInput { +public: + void configure( + const iir_biquad_config_t& hpf_config, + const float squelch_threshold = 0.0f + ); + + void read_audio_buffer(buffer_s16_t& audio); + + /*void set_stream(std::unique_ptr new_stream) { + stream = std::move(new_stream); + }*/ + +private: + static constexpr float k = 32768.0f; + static constexpr float ki = 1.0f / k; + + IIRBiquadFilter hpf { }; + //FMSquelch squelch { }; + + //std::unique_ptr stream { }; + + //AudioStatsCollector audio_stats { }; +}; + +#endif/*__AUDIO_INPUT_H__*/ diff --git a/firmware/baseband/proc_mictx.cpp b/firmware/baseband/proc_mictx.cpp new file mode 100644 index 000000000..1345a062d --- /dev/null +++ b/firmware/baseband/proc_mictx.cpp @@ -0,0 +1,96 @@ +/* + * 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_mictx.hpp" +#include "portapack_shared_memory.hpp" +#include "sine_table_int8.hpp" +#include "event_m4.hpp" + +#include + +void MicTXProcessor::execute(const buffer_c8_t& buffer){ + + // This is called at 1536000/2048 = 750Hz + + if (!configured) return; + + audio_input.read_audio_buffer(audio_buffer); + + for (size_t i = 0; i> 6] >> 8; + + power += (sample < 0) ? -sample : sample; + + if (!as) { + as = divider; + level_message.value = power / (divider / 4); + shared_memory.application_queue.push(level_message); + power = 0; + } else { + as--; + } + + if (ctcss_enabled) { + ctcss_sample = sine_table_i8[(ctcss_phase & 0xFF000000U) >> 24]; + sample_mixed = ((sample * 205) + (ctcss_sample * 50)) / 256; // ~20% + ctcss_phase += ctcss_phase_inc; + } else { + sample_mixed = sample; + } + + // FM + delta = sample_mixed * fm_delta; + + phase += delta; + sphase = phase + (64 << 24); + + re = (sine_table_i8[(sphase & 0xFF000000U) >> 24]); + im = (sine_table_i8[(phase & 0xFF000000U) >> 24]); + + buffer.p[i] = {re, im}; + } +} + +void MicTXProcessor::on_message(const Message* const msg) { + const auto message = *reinterpret_cast(msg); + + switch(msg->id) { + case Message::ID::AudioTXConfig: + fm_delta = message.fm_delta * (0xFFFFFFULL / 1536000); + divider = message.divider; + ctcss_enabled = message.ctcss_enabled; + ctcss_phase_inc = message.ctcss_phase_inc; + + configured = true; + break; + + default: + break; + } +} + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband/proc_mictx.hpp b/firmware/baseband/proc_mictx.hpp new file mode 100644 index 000000000..99f59b35d --- /dev/null +++ b/firmware/baseband/proc_mictx.hpp @@ -0,0 +1,63 @@ +/* + * 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_MICTX_H__ +#define __PROC_MICTX_H__ + +#include "audio_input.hpp" +#include "baseband_processor.hpp" +#include "baseband_thread.hpp" + +class MicTXProcessor : 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 }; + + int16_t audio_data[64]; + buffer_s16_t audio_buffer { + audio_data, + sizeof(int16_t) * 64 + }; + + AudioInput audio_input { }; + + uint32_t divider { }; + uint32_t as { 0 }; + uint32_t fm_delta { 0 }; + bool ctcss_enabled { false }; + uint32_t ctcss_phase_inc { }; + uint32_t ctcss_phase { 0 }, phase { 0 }, sphase { 0 }; + int32_t ctcss_sample { 0 }, sample { 0 }, sample_mixed { }, delta { }; + uint64_t power { 0 }; + + int8_t re { 0 }, im { 0 }; + + AudioLevelMessage level_message { }; +}; + +#endif