mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2026-09-13 01:59:29 +00:00
Flipper fsk tx support (#2964)
This commit is contained in:
@@ -383,6 +383,11 @@ void set_morsetx_key(bool key_down) {
|
|||||||
send_message(&message);
|
send_message(&message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_bitstream_config(uint32_t deviation, uint8_t mode) {
|
||||||
|
const StreamTXConfigurationMessage message{deviation, mode};
|
||||||
|
send_message(&message);
|
||||||
|
}
|
||||||
|
|
||||||
static bool baseband_image_running = false;
|
static bool baseband_image_running = false;
|
||||||
|
|
||||||
void run_image(const spi_flash::image_tag_t image_tag) {
|
void run_image(const spi_flash::image_tag_t image_tag) {
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ void set_morsetx_key(bool key_down);
|
|||||||
void set_wefax_config(uint8_t lpm, uint8_t ioc);
|
void set_wefax_config(uint8_t lpm, uint8_t ioc);
|
||||||
void set_noaaapt_config();
|
void set_noaaapt_config();
|
||||||
void set_flex_config();
|
void set_flex_config();
|
||||||
|
void set_bitstream_config(uint32_t deviation, uint8_t mode); // mode 0 for am, 1 for 2fsk
|
||||||
|
|
||||||
void request_roger_beep();
|
void request_roger_beep();
|
||||||
void request_rssi_beep();
|
void request_rssi_beep();
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ bool FlipperTxView::on_file_changed(std::filesystem::path new_file_path) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
preset = submeta.value().preset;
|
preset = submeta.value().preset;
|
||||||
if (preset != FLIPPER_PRESET_OOK) {
|
if (preset != FLIPPER_PRESET_OOK && preset != FLIPPER_PRESET_2FSK) {
|
||||||
field_filename.set_text("File: err, not supp. preset");
|
field_filename.set_text("File: err, not supp. preset");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -108,8 +108,13 @@ void FlipperTxView::stop() {
|
|||||||
bool FlipperTxView::start() {
|
bool FlipperTxView::start() {
|
||||||
if (filename.empty()) return false;
|
if (filename.empty()) return false;
|
||||||
baseband::run_prepared_image(portapack::memory::map::m4_code.base());
|
baseband::run_prepared_image(portapack::memory::map::m4_code.base());
|
||||||
|
transmitter_model.set_sampling_rate(OOK_SAMPLERATE);
|
||||||
transmitter_model.enable();
|
transmitter_model.enable();
|
||||||
button_startstop.set_text(LanguageHelper::currentMessages[LANG_STOP]);
|
button_startstop.set_text(LanguageHelper::currentMessages[LANG_STOP]);
|
||||||
|
uint8_t mode = 0;
|
||||||
|
if (preset == FLIPPER_PRESET_2FSK)
|
||||||
|
mode = 1;
|
||||||
|
baseband::set_bitstream_config(FM_DEVIATION, mode);
|
||||||
// start thread
|
// start thread
|
||||||
replay_thread = std::make_unique<FlipperPlayThread>(
|
replay_thread = std::make_unique<FlipperPlayThread>(
|
||||||
filename,
|
filename,
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ using namespace ui;
|
|||||||
namespace ui::external_app::flippertx {
|
namespace ui::external_app::flippertx {
|
||||||
|
|
||||||
#define OOK_SAMPLERATE 2280000U
|
#define OOK_SAMPLERATE 2280000U
|
||||||
|
#define FM_DEVIATION 60000U
|
||||||
|
|
||||||
class FlipperPlayThread;
|
class FlipperPlayThread;
|
||||||
class FlipperTxView : public View {
|
class FlipperTxView : public View {
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -618,12 +618,12 @@ set(MODE_CPPSRC
|
|||||||
)
|
)
|
||||||
DeclareTargets(PADT adsbtx)
|
DeclareTargets(PADT adsbtx)
|
||||||
|
|
||||||
### OOKStream
|
### Binary Timed stream TX
|
||||||
|
|
||||||
set(MODE_CPPSRC
|
set(MODE_CPPSRC
|
||||||
proc_ook_stream_tx.cpp
|
proc_bint_stream_tx.cpp
|
||||||
)
|
)
|
||||||
DeclareTargets(POSK ookstream)
|
DeclareTargets(POSK bintstream)
|
||||||
|
|
||||||
|
|
||||||
### Signal generator
|
### Signal generator
|
||||||
|
|||||||
+33
-14
@@ -19,7 +19,7 @@
|
|||||||
* Boston, MA 02110-1301, USA.
|
* Boston, MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "proc_ook_stream_tx.hpp"
|
#include "proc_bint_stream_tx.hpp"
|
||||||
#include "sine_table_int8.hpp"
|
#include "sine_table_int8.hpp"
|
||||||
#include "portapack_shared_memory.hpp"
|
#include "portapack_shared_memory.hpp"
|
||||||
|
|
||||||
@@ -27,27 +27,35 @@
|
|||||||
|
|
||||||
#include "utility.hpp"
|
#include "utility.hpp"
|
||||||
|
|
||||||
OOKProcessorStreamed::OOKProcessorStreamed() {
|
BinaryTimedProcessorStreamed::BinaryTimedProcessorStreamed() {
|
||||||
configured = false;
|
configured = false;
|
||||||
baseband_thread.start();
|
baseband_thread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void OOKProcessorStreamed::write_sample(const buffer_c8_t& buffer, bool bit_value, size_t i) {
|
inline void BinaryTimedProcessorStreamed::write_sample(const buffer_c8_t& buffer, bool bit_value, size_t i) {
|
||||||
int8_t re, im;
|
int8_t re = 0, im = 0;
|
||||||
|
if (mode == 0) {
|
||||||
if (bit_value) {
|
if (bit_value) {
|
||||||
phase = (phase + 200); // What ?
|
phase = (phase + 200);
|
||||||
|
sphase = phase + (64 << 18);
|
||||||
|
re = (sine_table_i8[(sphase & 0x03FC0000) >> 18]);
|
||||||
|
im = (sine_table_i8[(phase & 0x03FC0000) >> 18]);
|
||||||
|
}
|
||||||
|
} else if (mode == 1) {
|
||||||
|
// calculate the re, im based on the deviation uint32_t variable to get the re, im, to send out 2fsk signal. based on the bit_value
|
||||||
|
if (bit_value) {
|
||||||
|
phase += deviation_delta;
|
||||||
|
} else {
|
||||||
|
phase -= deviation_delta;
|
||||||
|
}
|
||||||
sphase = phase + (64 << 18);
|
sphase = phase + (64 << 18);
|
||||||
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]);
|
||||||
} else {
|
|
||||||
re = 0;
|
|
||||||
im = 0;
|
|
||||||
}
|
}
|
||||||
buffer.p[i] = {re, im};
|
buffer.p[i] = {re, im};
|
||||||
}
|
}
|
||||||
|
|
||||||
void OOKProcessorStreamed::execute(const buffer_c8_t& buffer) {
|
void BinaryTimedProcessorStreamed::execute(const buffer_c8_t& buffer) {
|
||||||
if (!configured || !stream) return;
|
if (!configured || !stream) return;
|
||||||
|
|
||||||
for (size_t i = 0; i < buffer.count; i++) {
|
for (size_t i = 0; i < buffer.count; i++) {
|
||||||
@@ -87,7 +95,7 @@ void OOKProcessorStreamed::execute(const buffer_c8_t& buffer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OOKProcessorStreamed::on_message(const Message* const message) {
|
void BinaryTimedProcessorStreamed::on_message(const Message* const message) {
|
||||||
switch (message->id) {
|
switch (message->id) {
|
||||||
case Message::ID::ReplayConfig:
|
case Message::ID::ReplayConfig:
|
||||||
configured = false;
|
configured = false;
|
||||||
@@ -100,12 +108,23 @@ void OOKProcessorStreamed::on_message(const Message* const message) {
|
|||||||
shared_memory.application_queue.push(txprogress_message);
|
shared_memory.application_queue.push(txprogress_message);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Message::ID::StreamTXConfiguration:
|
||||||
|
streamtx_config(*reinterpret_cast<const StreamTXConfigurationMessage*>(message));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OOKProcessorStreamed::replay_config(const ReplayConfigMessage& message) {
|
void BinaryTimedProcessorStreamed::streamtx_config(const StreamTXConfigurationMessage& message) {
|
||||||
|
mode = message.mode;
|
||||||
|
deviation = message.deviation;
|
||||||
|
uint64_t big_calc = (uint64_t)message.deviation << 26;
|
||||||
|
deviation_delta = (uint32_t)(big_calc / OOK_SAMPLERATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinaryTimedProcessorStreamed::replay_config(const ReplayConfigMessage& message) {
|
||||||
if (message.config) {
|
if (message.config) {
|
||||||
txprogress_message.progress = -2;
|
txprogress_message.progress = -2;
|
||||||
shared_memory.application_queue.push(txprogress_message);
|
shared_memory.application_queue.push(txprogress_message);
|
||||||
@@ -121,7 +140,7 @@ void OOKProcessorStreamed::replay_config(const ReplayConfigMessage& message) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
EventDispatcher event_dispatcher{std::make_unique<OOKProcessorStreamed>()};
|
EventDispatcher event_dispatcher{std::make_unique<BinaryTimedProcessorStreamed>()};
|
||||||
event_dispatcher.run();
|
event_dispatcher.run();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
+8
-2
@@ -34,10 +34,11 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#define OOK_SAMPLERATE 2280000U
|
#define OOK_SAMPLERATE 2280000U
|
||||||
|
#define FM_DEVIATION 60000U
|
||||||
|
|
||||||
class OOKProcessorStreamed : public BasebandProcessor {
|
class BinaryTimedProcessorStreamed : public BasebandProcessor {
|
||||||
public:
|
public:
|
||||||
OOKProcessorStreamed();
|
BinaryTimedProcessorStreamed();
|
||||||
|
|
||||||
void execute(const buffer_c8_t& buffer) override;
|
void execute(const buffer_c8_t& buffer) override;
|
||||||
void on_message(const Message* const message) override;
|
void on_message(const Message* const message) override;
|
||||||
@@ -53,6 +54,11 @@ class OOKProcessorStreamed : public BasebandProcessor {
|
|||||||
std::unique_ptr<StreamOutput> stream{};
|
std::unique_ptr<StreamOutput> stream{};
|
||||||
bool configured{false};
|
bool configured{false};
|
||||||
void replay_config(const ReplayConfigMessage& message);
|
void replay_config(const ReplayConfigMessage& message);
|
||||||
|
void streamtx_config(const StreamTXConfigurationMessage& message);
|
||||||
|
|
||||||
|
uint8_t mode = 0; // am = 0, 2fsk = 1
|
||||||
|
uint32_t deviation = FM_DEVIATION; // used in 2fsk
|
||||||
|
uint32_t deviation_delta = (FM_DEVIATION * 4294967296ULL) / OOK_SAMPLERATE;
|
||||||
|
|
||||||
int32_t endsignals[3] = {0, 42069, 613379}; // 0 is skipped, count from 1, don't ask...
|
int32_t endsignals[3] = {0, 42069, 613379}; // 0 is skipped, count from 1, don't ask...
|
||||||
uint8_t readerrs = 0; // to count in the array
|
uint8_t readerrs = 0; // to count in the array
|
||||||
@@ -152,6 +152,7 @@ class Message {
|
|||||||
TXDisabled = 94,
|
TXDisabled = 94,
|
||||||
MorseTXConfigure = 95,
|
MorseTXConfigure = 95,
|
||||||
MorseTXkey = 96,
|
MorseTXkey = 96,
|
||||||
|
StreamTXConfiguration = 97,
|
||||||
MAX
|
MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1758,4 +1759,15 @@ class MorseTXkeyMessage : public Message {
|
|||||||
bool key_down = false;
|
bool key_down = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class StreamTXConfigurationMessage : public Message {
|
||||||
|
public:
|
||||||
|
constexpr StreamTXConfigurationMessage(uint32_t deviation, uint8_t mode)
|
||||||
|
: Message{ID::StreamTXConfiguration},
|
||||||
|
deviation{deviation},
|
||||||
|
mode{mode} {}
|
||||||
|
|
||||||
|
uint32_t deviation = 60000; // used in 2fsk
|
||||||
|
uint8_t mode = 0; // am = 0, 2fsk = 1
|
||||||
|
};
|
||||||
|
|
||||||
#endif /*__MESSAGE_H__*/
|
#endif /*__MESSAGE_H__*/
|
||||||
|
|||||||
Reference in New Issue
Block a user