mirror of
https://github.com/eried/portapack-mayhem.git
synced 2025-02-27 10:11:26 -05:00
Whistle now works
Moved BW widget in txview String-ized LCR and AFSK message generator
This commit is contained in:
parent
fbc054ca75
commit
d59ee08f41
@ -135,16 +135,17 @@ set(CPPSRC
|
||||
debounce.cpp
|
||||
touch.cpp
|
||||
touch_adc.cpp
|
||||
adsb.cpp
|
||||
protocols/adsb.cpp
|
||||
protocols/bht.cpp
|
||||
protocols/dcs.cpp
|
||||
protocols/lcr.cpp
|
||||
protocols/rds.cpp
|
||||
afsk.cpp
|
||||
audio.cpp
|
||||
${COMMON}/bch_code.cpp
|
||||
bht.cpp
|
||||
ctcss.cpp
|
||||
dcs.cpp
|
||||
encoder.cpp
|
||||
freqman.cpp
|
||||
rds.cpp
|
||||
${COMMON}/lcd_ili9341.cpp
|
||||
${COMMON}/ui.cpp
|
||||
${COMMON}/ui_text.cpp
|
||||
@ -270,6 +271,7 @@ set(INCDIR ${CMAKE_CURRENT_BINARY_DIR} ${COMMON} ${PORTINC} ${KERNINC} ${TESTINC
|
||||
${FATFSINC}
|
||||
${CHIBIOS}/os/various
|
||||
bitmaps
|
||||
protocols
|
||||
)
|
||||
|
||||
#
|
||||
|
@ -26,7 +26,7 @@
|
||||
|
||||
namespace afsk {
|
||||
|
||||
void generate_data(const char * in_message, char * out_data) {
|
||||
void generate_data(const std::string & in_message, char * out_data) {
|
||||
const afsk_formats_t * format_def;
|
||||
uint8_t pm, pp, bit, cp, cur_byte, new_byte;
|
||||
uint16_t dp;
|
||||
@ -40,7 +40,7 @@ void generate_data(const char * in_message, char * out_data) {
|
||||
|
||||
if (format_def->data_bits == 7) {
|
||||
if (!format_def->use_LUT) {
|
||||
for (dp = 0; dp < strlen(in_message); dp++) {
|
||||
for (dp = 0; dp < in_message.length(); dp++) {
|
||||
pp = pm;
|
||||
new_byte = 0;
|
||||
cur_byte = in_message[dp];
|
||||
@ -55,13 +55,9 @@ void generate_data(const char * in_message, char * out_data) {
|
||||
out_data[dp++] = 0;
|
||||
out_data[dp] = 0;
|
||||
} else {
|
||||
for (dp = 0; dp < strlen(in_message); dp++) {
|
||||
for (dp = 0; dp < in_message.length(); dp++) {
|
||||
pp = pm;
|
||||
|
||||
// Do not apply LUT on checksum (last byte) ?
|
||||
if (dp != strlen(in_message) - 1)
|
||||
cur_byte = alt_lookup[(uint8_t)in_message[dp] & 0x7F];
|
||||
else
|
||||
cur_byte = in_message[dp];
|
||||
|
||||
for (cp = 0; cp < 8; cp++)
|
||||
|
@ -54,19 +54,7 @@ const afsk_formats_t afsk_formats[4] = {
|
||||
{ "8-Even-0 ", "8E0", 8, EVEN, 1, true, false }
|
||||
};
|
||||
|
||||
// TODO: Complete table
|
||||
const char alt_lookup[128] = {
|
||||
0, 0, 0, 0x5F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0F, // 0
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 10
|
||||
0xF8, 0, 0x99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 !"#$%&'()*+,-./
|
||||
0xF5, 0, 0x94, 0x55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1C, 0, 0, // 30 0123456789:;<=>?
|
||||
0, 0x3C, 0x9C, 0x5D, 0, 0, 0, 0, 0, 0x44, 0x85, 0, 0xD5, 0x14, 0, 0, // 40 @ABCDEFGHIJKLMNO
|
||||
0xF0, 0, 0, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 50 PQRSTUVWXYZ[\]^_
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60 `abcdefghijklmno
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x7F // 70 pqrstuvwxyz{|}~
|
||||
};
|
||||
|
||||
void generate_data(const char * in_message, char * out_data);
|
||||
void generate_data(const std::string & in_message, char * out_data);
|
||||
|
||||
} /* namespace afsk */
|
||||
|
||||
|
@ -96,6 +96,17 @@ void set_tones_config(const uint32_t bw, const uint32_t pre_silence, const uint1
|
||||
send_message(&message);
|
||||
}
|
||||
|
||||
void kill_tone() {
|
||||
const TonesConfigureMessage message {
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
false,
|
||||
false
|
||||
};
|
||||
send_message(&message);
|
||||
}
|
||||
|
||||
void set_sstv_data(const uint8_t vis_code, const uint32_t pixel_duration) {
|
||||
const SSTVConfigureMessage message {
|
||||
vis_code,
|
||||
@ -117,6 +128,18 @@ void set_afsk_data(const uint32_t afsk_samples_per_bit, const uint32_t afsk_phas
|
||||
send_message(&message);
|
||||
}
|
||||
|
||||
void kill_afsk() {
|
||||
const AFSKConfigureMessage message {
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
false
|
||||
};
|
||||
send_message(&message);
|
||||
}
|
||||
|
||||
void set_audiotx_data(const uint32_t divider, const uint32_t bw, const uint32_t gain_x10,
|
||||
const bool ctcss_enabled, const uint32_t ctcss_phase_inc) {
|
||||
const AudioTXConfigMessage message {
|
||||
|
@ -58,6 +58,7 @@ struct WFMConfig {
|
||||
void set_tone(const uint32_t index, const uint32_t delta, const uint32_t duration);
|
||||
void set_tones_config(const uint32_t bw, const uint32_t pre_silence, const uint16_t tone_count,
|
||||
const bool dual_tone, const bool audio_out);
|
||||
void kill_tone();
|
||||
void set_sstv_data(const uint8_t vis_code, const uint32_t pixel_duration);
|
||||
void set_audiotx_data(const uint32_t divider, const uint32_t bw, const uint32_t gain_x10,
|
||||
const bool ctcss_enabled, const uint32_t ctcss_phase_inc);
|
||||
@ -65,6 +66,7 @@ void set_fifo_data(const int8_t * data);
|
||||
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,
|
||||
const uint8_t afsk_repeat, const uint32_t afsk_bw, const bool afsk_alt_format);
|
||||
void kill_afsk();
|
||||
void set_ook_data(const uint32_t stream_length, const uint32_t samples_per_bit, const uint8_t repeat,
|
||||
const uint32_t pause_symbols);
|
||||
void set_fsk_data(const uint32_t stream_length, const uint32_t samples_per_bit, const uint32_t shift,
|
||||
|
73
firmware/application/protocols/lcr.cpp
Normal file
73
firmware/application/protocols/lcr.cpp
Normal file
@ -0,0 +1,73 @@
|
||||
/*
|
||||
* 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 "lcr.hpp"
|
||||
#include "string_format.hpp"
|
||||
|
||||
//#include "portapack_persistent_memory.hpp"
|
||||
|
||||
namespace lcr {
|
||||
|
||||
std::string generate_message(std::string rgsb, std::vector<std::string> litterals, size_t option_ec) {
|
||||
const std::string ec_lut[4] = { "A", "J", "N", "S" }; // Eclairage (Auto, Jour, Nuit)
|
||||
char eom[3] = { 3, 0, 0 }; // EOM and space for checksum
|
||||
uint8_t i;
|
||||
std::string lcr_message { 127, 127, 127, 127, 127, 127, 127, 15 }; // Modem sync and SOM
|
||||
char checksum = 0;
|
||||
|
||||
// Pad litterals to 7 chars (not required ?)
|
||||
for (auto & litteral : litterals)
|
||||
while (litteral.length() < 7)
|
||||
litteral += ' ';
|
||||
|
||||
// Compose LCR message
|
||||
lcr_message += rgsb;
|
||||
lcr_message += "PA ";
|
||||
|
||||
i = 1;
|
||||
for (auto & litteral : litterals) {
|
||||
lcr_message += "AM=";
|
||||
lcr_message += to_string_dec_uint(i, 1);
|
||||
lcr_message += " AF=\"";
|
||||
lcr_message += litteral;
|
||||
lcr_message += "\" CL=0 ";
|
||||
i++;
|
||||
}
|
||||
|
||||
lcr_message += "EC=";
|
||||
lcr_message += ec_lut[option_ec];
|
||||
lcr_message += " SAB=0";
|
||||
|
||||
// Checksum
|
||||
i = 7; // Skip modem sync
|
||||
while (lcr_message[i])
|
||||
checksum ^= lcr_message[i++];
|
||||
checksum ^= eom[0]; // EOM char
|
||||
checksum &= 0x7F; // Trim
|
||||
eom[1] = checksum;
|
||||
|
||||
lcr_message += eom;
|
||||
|
||||
return lcr_message;
|
||||
}
|
||||
|
||||
} /* namespace lcr */
|
37
firmware/application/protocols/lcr.hpp
Normal file
37
firmware/application/protocols/lcr.hpp
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* 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 "ui.hpp"
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#ifndef __LCR_H__
|
||||
#define __LCR_H__
|
||||
|
||||
namespace lcr {
|
||||
|
||||
std::string generate_message(std::string rgsb, std::vector<std::string> litterals, size_t option_ec);
|
||||
|
||||
} /* namespace lcr */
|
||||
|
||||
#endif/*__LCR_H__*/
|
@ -281,7 +281,7 @@ DebugMenuView::DebugMenuView(NavigationView& nav) {
|
||||
on_left = [&nav](){ nav.pop(); };
|
||||
}
|
||||
|
||||
DebugLCRView::DebugLCRView(NavigationView& nav, std::string lcr_string, uint8_t checksum) {
|
||||
DebugLCRView::DebugLCRView(NavigationView& nav, std::string lcr_string) {
|
||||
|
||||
std::string debug_text;
|
||||
|
||||
@ -299,7 +299,7 @@ DebugLCRView::DebugLCRView(NavigationView& nav, std::string lcr_string, uint8_t
|
||||
|
||||
debug_text += "\n\n";
|
||||
debug_text += "Length: " + to_string_dec_uint(lcr_string.length()) + '\n';
|
||||
debug_text += "Checksum: " + to_string_dec_uint(checksum) + '\n';
|
||||
debug_text += "Checksum: " + to_string_dec_uint(lcr_string.back()) + '\n';
|
||||
|
||||
console.write(debug_text);
|
||||
|
||||
|
@ -210,7 +210,7 @@ private:
|
||||
|
||||
class DebugLCRView : public View {
|
||||
public:
|
||||
DebugLCRView(NavigationView& nav, std::string lcrstring, uint8_t checksum);
|
||||
DebugLCRView(NavigationView& nav, std::string lcrstring);
|
||||
|
||||
void focus() override;
|
||||
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "ui_debug.hpp"
|
||||
|
||||
#include "afsk.hpp"
|
||||
#include "lcr.hpp"
|
||||
#include "baseband_api.hpp"
|
||||
#include "string_format.hpp"
|
||||
|
||||
@ -47,58 +48,6 @@ LCRView::~LCRView() {
|
||||
baseband::shutdown();
|
||||
}
|
||||
|
||||
void LCRView::generate_message() {
|
||||
const char lcr_init[8] = { 127, 127, 127, 127, 127, 127, 127, 15 }; // Modem sync and SOM
|
||||
const char ec_lut[4][2] = { { 'A', 0x00 }, // Eclairage (Auto, Jour, Nuit)
|
||||
{ 'J', 0x00 },
|
||||
{ 'N', 0x00 },
|
||||
{ 'S', 0x00 } };
|
||||
char eom[3] = { 3, 0, 0 }; // EOM and space for checksum
|
||||
|
||||
uint8_t i;
|
||||
|
||||
button_setrgsb.set_text(rgsb);
|
||||
|
||||
// Pad litterals to 7 chars (not required ?)
|
||||
for (i = 0; i < 5; i++)
|
||||
while (strlen(litteral[i]) < 7)
|
||||
strcat(litteral[i], " ");
|
||||
|
||||
// Compose LCR message
|
||||
memset(lcr_message, 0, 512);
|
||||
memcpy(lcr_message, lcr_init, 8);
|
||||
|
||||
strcat(lcr_message, rgsb); // Address
|
||||
strcat(lcr_message, "PA ");
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
if (checkboxes[i].value() == true) {
|
||||
strcat(lcr_message, "AM=");
|
||||
strcat(lcr_message, to_string_dec_uint(i + 1, 1).c_str());
|
||||
strcat(lcr_message, " AF=\"");
|
||||
strcat(lcr_message, litteral[i]);
|
||||
strcat(lcr_message, "\" CL=0 ");
|
||||
}
|
||||
}
|
||||
strcat(lcr_message, "EC=");
|
||||
strcat(lcr_message, ec_lut[options_ec.selected_index()]);
|
||||
strcat(lcr_message, " SAB=0");
|
||||
|
||||
// Checksum
|
||||
checksum = 0;
|
||||
i = 7; // Skip modem sync
|
||||
while (lcr_message[i])
|
||||
checksum ^= lcr_message[i++];
|
||||
|
||||
checksum ^= eom[0]; // EOM char
|
||||
checksum &= 0x7F; // Trim
|
||||
eom[1] = checksum;
|
||||
|
||||
strcat(lcr_message, eom);
|
||||
|
||||
afsk::generate_data(lcr_message, lcr_message_data);
|
||||
}
|
||||
|
||||
void LCRView::paint(Painter& painter) {
|
||||
uint8_t i;
|
||||
std::string final_str;
|
||||
@ -134,6 +83,17 @@ void LCRView::paint(Painter& painter) {
|
||||
text_recap.set(final_str);
|
||||
}
|
||||
|
||||
std::vector<std::string> LCRView::parse_litterals() {
|
||||
std::vector<std::string> litterals;
|
||||
|
||||
for (size_t i = 0; i < 5; i++) {
|
||||
if (checkboxes[i].value())
|
||||
litterals.push_back(litteral[i]);
|
||||
}
|
||||
|
||||
return litterals;
|
||||
}
|
||||
|
||||
void LCRView::update_progress() {
|
||||
char str[16];
|
||||
|
||||
@ -162,8 +122,6 @@ void LCRView::update_progress() {
|
||||
}
|
||||
|
||||
void LCRView::on_txdone(int n) {
|
||||
char str[16];
|
||||
|
||||
if (n > 0) {
|
||||
// Repeating...
|
||||
repeat_index = n + 1;
|
||||
@ -177,17 +135,6 @@ void LCRView::on_txdone(int n) {
|
||||
// Done transmitting
|
||||
if ((tx_mode == SCAN) && (scan_index < (scan_count - 1))) {
|
||||
transmitter_model.disable();
|
||||
if (abort_scan) {
|
||||
// Kill scan process
|
||||
strcpy(str, "Abort @");
|
||||
strcat(str, rgsb);
|
||||
text_status.set(str);
|
||||
progress.set_value(0);
|
||||
tx_mode = IDLE;
|
||||
abort_scan = false;
|
||||
button_scan.set_style(&style_val);
|
||||
button_scan.set_text("SCAN");
|
||||
} else {
|
||||
// Next address
|
||||
scan_index++;
|
||||
strcpy(rgsb, &scan_list[options_scanlist.selected_index()].addresses[scan_index * 5]);
|
||||
@ -195,7 +142,6 @@ void LCRView::on_txdone(int n) {
|
||||
repeat_index = 1;
|
||||
update_progress();
|
||||
start_tx(true);
|
||||
}
|
||||
} else {
|
||||
transmitter_model.disable();
|
||||
tx_mode = IDLE;
|
||||
@ -230,7 +176,8 @@ void LCRView::start_tx(const bool scan) {
|
||||
update_progress();
|
||||
}
|
||||
|
||||
generate_message();
|
||||
button_setrgsb.set_text(rgsb);
|
||||
afsk::generate_data(lcr::generate_message(rgsb, parse_litterals(), options_ec.selected_index()), lcr_message_data);
|
||||
|
||||
switch (portapack::persistent_memory::afsk_format()) {
|
||||
case 0:
|
||||
@ -355,8 +302,7 @@ LCRView::LCRView(NavigationView& nav) {
|
||||
};
|
||||
|
||||
button_lcrdebug.on_select = [this, &nav](Button&) {
|
||||
generate_message();
|
||||
nav.push<DebugLCRView>(std::string(lcr_message), checksum);
|
||||
nav.push<DebugLCRView>(lcr::generate_message(rgsb, parse_litterals(), options_ec.selected_index()));
|
||||
};
|
||||
|
||||
button_transmit.on_select = [this](Button&) {
|
||||
@ -364,12 +310,22 @@ LCRView::LCRView(NavigationView& nav) {
|
||||
};
|
||||
|
||||
button_scan.on_select = [this](Button&) {
|
||||
char str[16];
|
||||
|
||||
if (tx_mode == IDLE) {
|
||||
button_scan.set_style(&style_cancel);
|
||||
button_scan.set_text("ABORT");
|
||||
start_tx(true);
|
||||
} else {
|
||||
abort_scan = true;
|
||||
// Kill scan process
|
||||
baseband::kill_afsk();
|
||||
strcpy(str, "Abort @");
|
||||
strcat(str, rgsb);
|
||||
text_status.set(str);
|
||||
progress.set_value(0);
|
||||
tx_mode = IDLE;
|
||||
button_scan.set_style(&style_val);
|
||||
button_scan.set_text("SCAN");
|
||||
}
|
||||
};
|
||||
|
||||
@ -383,8 +339,6 @@ LCRView::LCRView(NavigationView& nav) {
|
||||
checkboxes[n].set_value(true);
|
||||
set_dirty();
|
||||
start_tx(false);
|
||||
} else if (tx_mode == SCAN) {
|
||||
abort_scan = true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -79,18 +79,16 @@ private:
|
||||
};
|
||||
|
||||
tx_modes tx_mode = IDLE;
|
||||
bool abort_scan = false;
|
||||
uint8_t scan_count { 0 }, scan_index { 0 };
|
||||
double scan_progress { 0 };
|
||||
char litteral[5][8] = { { 0 }, { 0 }, { 0 }, { 0 }, { 0 } };
|
||||
char rgsb[5] = { 0 };
|
||||
char lcr_message[512];
|
||||
char lcr_message_data[512];
|
||||
char checksum = 0;
|
||||
rf::Frequency f { 0 };
|
||||
uint8_t repeat_index { 0 };
|
||||
|
||||
void generate_message();
|
||||
std::vector<std::string> parse_litterals();
|
||||
void update_progress();
|
||||
void start_tx(const bool scan);
|
||||
void on_txdone(int n);
|
||||
|
@ -208,7 +208,7 @@ MorseView::MorseView(
|
||||
tx_view.on_stop = [this]() {
|
||||
if (ookthread) chThdTerminate(ookthread);
|
||||
transmitter_model.disable();
|
||||
baseband::set_tones_config(0, 0, 0, false, false);
|
||||
baseband::kill_tone();
|
||||
tx_view.set_transmitting(false);
|
||||
};
|
||||
}
|
||||
|
@ -326,7 +326,7 @@ TransmitterAudioMenuView::TransmitterAudioMenuView(NavigationView& nav) {
|
||||
{ "Soundboard", ui::Color::green(), &bitmap_icon_soundboard, [&nav](){ nav.push<SoundBoardView>(); } },
|
||||
{ "Numbers station", ui::Color::yellow(),&bitmap_icon_numbers, [&nav](){ nav.push<NumbersStationView>(); } },
|
||||
{ "Microphone", ui::Color::green(), &bitmap_icon_microphone, [&nav](){ nav.push<MicTXView>(); } },
|
||||
{ "Whistle", ui::Color::orange(),&bitmap_icon_whistle, [&nav](){ nav.push<WhistleView>(); } },
|
||||
{ "Whistle", ui::Color::green(), &bitmap_icon_whistle, [&nav](){ nav.push<WhistleView>(); } },
|
||||
} });
|
||||
on_left = [&nav](){ nav.pop(); };
|
||||
}
|
||||
|
@ -36,12 +36,13 @@ void ScriptView::on_frequency_select() {
|
||||
}
|
||||
|
||||
void ScriptView::on_edit_freq(rf::Frequency f) {
|
||||
(void)f;
|
||||
//frequencies[menu_view.highlighted()].value = f;
|
||||
setup_list();
|
||||
}
|
||||
|
||||
void ScriptView::on_edit_desc(NavigationView& nav) {
|
||||
|
||||
(void)nav;
|
||||
}
|
||||
|
||||
void ScriptView::on_delete() {
|
||||
@ -50,7 +51,7 @@ void ScriptView::on_delete() {
|
||||
}
|
||||
|
||||
void ScriptView::setup_list() {
|
||||
size_t n;
|
||||
//size_t n;
|
||||
|
||||
menu_view.clear();
|
||||
|
||||
|
@ -100,11 +100,11 @@ private:
|
||||
};
|
||||
|
||||
Text text_bw {
|
||||
{ 11 * 8, 1 * 8, 9 * 8, 1 * 16 },
|
||||
{ 11 * 8, 2 * 8, 9 * 8, 1 * 16 },
|
||||
"BW: kHz"
|
||||
};
|
||||
NumberField field_bw {
|
||||
{ 14 * 8, 1 * 8 },
|
||||
{ 14 * 8, 2 * 8 },
|
||||
3,
|
||||
{ 1, 150 },
|
||||
1,
|
||||
|
@ -22,92 +22,86 @@
|
||||
|
||||
#include "ui_whistle.hpp"
|
||||
#include "ui_receiver.hpp"
|
||||
#include "tonesets.hpp"
|
||||
|
||||
#include "portapack.hpp"
|
||||
#include "hackrf_hal.hpp"
|
||||
#include "portapack_shared_memory.hpp"
|
||||
#include "portapack_persistent_memory.hpp"
|
||||
#include "baseband_api.hpp"
|
||||
|
||||
#include <cstring>
|
||||
#include <stdio.h>
|
||||
|
||||
using namespace hackrf::one;
|
||||
using namespace portapack;
|
||||
|
||||
namespace ui {
|
||||
|
||||
void WhistleView::start_tx() {
|
||||
baseband::set_tone(
|
||||
0,
|
||||
field_tone.value() * TONES_DELTA_COEF,
|
||||
(checkbox_stop.value()) ? field_stop.value() * TONES_SAMPLERATE : 0xFFFFFFFF); // (Almost) infinite duration :)
|
||||
|
||||
shared_memory.bb_data.tones_data.message[0] = 0;
|
||||
|
||||
transmitter_model.set_sampling_rate(1536000);
|
||||
transmitter_model.set_rf_amp(true);
|
||||
transmitter_model.set_baseband_bandwidth(1750000);
|
||||
transmitter_model.enable();
|
||||
|
||||
baseband::set_tones_config(transmitter_model.bandwidth(), 0, 1, false, false);
|
||||
|
||||
tx_mode = SINGLE;
|
||||
}
|
||||
|
||||
void WhistleView::on_tx_progress(const bool done) {
|
||||
if (done) {
|
||||
transmitter_model.disable();
|
||||
tx_view.set_transmitting(false);
|
||||
tx_mode = IDLE;
|
||||
}
|
||||
}
|
||||
|
||||
void WhistleView::focus() {
|
||||
button_transmit.focus();
|
||||
tx_view.focus();
|
||||
}
|
||||
|
||||
WhistleView::~WhistleView() {
|
||||
//transmitter_model.disable();
|
||||
transmitter_model.disable();
|
||||
baseband::shutdown();
|
||||
}
|
||||
|
||||
void WhistleView::paint(Painter& painter) {
|
||||
(void)painter;
|
||||
}
|
||||
|
||||
Button WhistleView::button_scan = {
|
||||
{ 76, 270, 72, 32 },
|
||||
"SCAN"
|
||||
};
|
||||
|
||||
WhistleView::WhistleView(
|
||||
NavigationView& nav
|
||||
)
|
||||
{
|
||||
baseband::run_image(portapack::spi_flash::image_tag_tones);
|
||||
|
||||
add_children({
|
||||
&button_transmit,
|
||||
&button_exit
|
||||
&labels,
|
||||
&field_tone,
|
||||
&checkbox_stop,
|
||||
&field_stop,
|
||||
&tx_view
|
||||
});
|
||||
|
||||
button_transmit.on_select = [this](Button&){
|
||||
/*uint16_t c;
|
||||
ui::Context context;
|
||||
field_tone.set_value(1520);
|
||||
field_stop.set_value(15);
|
||||
|
||||
make_frame();
|
||||
tx_view.on_edit_frequency = [this, &nav]() {
|
||||
auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency());
|
||||
new_view->on_changed = [this](rf::Frequency f) {
|
||||
receiver_model.set_tuning_frequency(f);
|
||||
};
|
||||
};
|
||||
|
||||
shared_memory.afsk_samples_per_bit = 228000/persistent_memory::afsk_bitrate();
|
||||
shared_memory.afsk_phase_inc_mark = persistent_memory::afsk_mark_freq()*(65536*1024)/2280;
|
||||
shared_memory.afsk_phase_inc_space = persistent_memory::afsk_space_freq()*(65536*1024)/2280;
|
||||
|
||||
for (c = 0; c < 256; c++) {
|
||||
shared_memory.lcrdata[c] = this->lcrframe[c];
|
||||
tx_view.on_start = [this]() {
|
||||
if (tx_mode == IDLE) {
|
||||
tx_view.set_transmitting(true);
|
||||
start_tx();
|
||||
}
|
||||
|
||||
shared_memory.afsk_transmit_done = false;
|
||||
shared_memory.afsk_repeat = 5; // DEFAULT
|
||||
|
||||
text_status.set("Send...");*/
|
||||
|
||||
//transmitter_model.enable();
|
||||
};
|
||||
|
||||
button_exit.on_select = [&nav](Button&){
|
||||
nav.pop();
|
||||
tx_view.on_stop = [this]() {
|
||||
baseband::kill_tone();
|
||||
};
|
||||
|
||||
//static VirtualTimer vt1;
|
||||
//msg_t msg, result;
|
||||
|
||||
/*static EvTimer evt;
|
||||
static EventListener el0;
|
||||
|
||||
evtInit(&evt, MS2ST(2000));
|
||||
evtStart(&evt);
|
||||
chEvtRegister(&evt.et_es, &el0, 0);*/
|
||||
|
||||
//chVTSet(&vt1, MS2ST(2000), whistle_th, (void *)&mbox);
|
||||
|
||||
//while(1) {
|
||||
/*result = chMBFetch(&mbox, &msg, TIME_INFINITE);
|
||||
if(result == RDY_OK) {
|
||||
if(msg & 1)
|
||||
button_scan.set_text("POUET");
|
||||
}*/
|
||||
//chThdSleepMilliseconds(500);
|
||||
//}
|
||||
|
||||
}
|
||||
|
||||
} /* namespace ui */
|
||||
|
@ -24,7 +24,7 @@
|
||||
#include "ui_widget.hpp"
|
||||
#include "ui_painter.hpp"
|
||||
#include "ui_navigation.hpp"
|
||||
#include "ui_font_fixed_8x16.hpp"
|
||||
#include "ui_transmitter.hpp"
|
||||
#include "message.hpp"
|
||||
#include "transmitter_model.hpp"
|
||||
|
||||
@ -36,33 +36,59 @@ public:
|
||||
~WhistleView();
|
||||
|
||||
void focus() override;
|
||||
void paint(Painter& painter) override;
|
||||
static void whistle_th(void *p);
|
||||
|
||||
std::string title() const override { return "Whistle"; };
|
||||
|
||||
private:
|
||||
rf::Frequency f;
|
||||
void start_tx();
|
||||
void on_tx_progress(const bool done);
|
||||
|
||||
Text text_status {
|
||||
{ 172, 196, 64, 16 },
|
||||
"Ready"
|
||||
enum tx_modes {
|
||||
IDLE = 0,
|
||||
SINGLE
|
||||
};
|
||||
|
||||
Checkbox checkbox_am_a {
|
||||
{ 16, 68 },
|
||||
20,
|
||||
""
|
||||
tx_modes tx_mode = IDLE;
|
||||
|
||||
Labels labels {
|
||||
{ { 3 * 8, 4 * 8 }, "Tone frequency: Hz", Color::light_grey() },
|
||||
{ { 22 * 8, 8 * 8 + 4 }, "s.", Color::light_grey() }
|
||||
};
|
||||
|
||||
Button button_transmit {
|
||||
{ 24, 270, 48, 32 },
|
||||
"TX"
|
||||
NumberField field_tone {
|
||||
{ 19 * 8, 4 * 8 },
|
||||
4,
|
||||
{ 1, 9999 },
|
||||
5,
|
||||
' '
|
||||
};
|
||||
|
||||
static Button button_scan;
|
||||
Checkbox checkbox_stop {
|
||||
{ 5 * 8, 8 * 8 },
|
||||
10,
|
||||
"Stop after"
|
||||
};
|
||||
|
||||
Button button_exit {
|
||||
{ 176, 270, 48, 32 },
|
||||
"Exit"
|
||||
NumberField field_stop {
|
||||
{ 20 * 8, 8 * 8 + 4 },
|
||||
2,
|
||||
{ 1, 99 },
|
||||
1,
|
||||
' '
|
||||
};
|
||||
|
||||
TransmitterView tx_view {
|
||||
16 * 16,
|
||||
10000,
|
||||
12
|
||||
};
|
||||
|
||||
MessageHandlerRegistration message_handler_tx_done {
|
||||
Message::ID::TXDone,
|
||||
[this](const Message* const p) {
|
||||
const auto message = *reinterpret_cast<const TXDoneMessage*>(p);
|
||||
this->on_tx_progress(message.done);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
Binary file not shown.
@ -124,6 +124,7 @@ void AFSKProcessor::on_message(const Message* const msg) {
|
||||
const auto message = *reinterpret_cast<const AFSKConfigureMessage*>(msg);
|
||||
|
||||
if (message.id == Message::ID::AFSKConfigure) {
|
||||
if (message.samples_per_bit) {
|
||||
afsk_samples_per_bit = message.samples_per_bit;
|
||||
afsk_phase_inc_mark = message.phase_inc_mark;
|
||||
afsk_phase_inc_space = message.phase_inc_space;
|
||||
@ -140,6 +141,8 @@ void AFSKProcessor::on_message(const Message* const msg) {
|
||||
ext_byte = 0;
|
||||
cur_bit = 0;
|
||||
configured = true;
|
||||
} else
|
||||
configured = false; // Kill
|
||||
}
|
||||
}
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user