Merge branch 'eried:next' into next

This commit is contained in:
Brumi-2021 2022-05-22 16:41:48 +02:00 committed by GitHub
commit 840da4c685
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 413 additions and 172 deletions

View File

@ -1,12 +1,18 @@
--- ---
name: Bug report name: Bug report
about: Create a report to help us improve about: Create a report to help us improve the software
title: '' title: ''
labels: bug labels: bug
assignees: '' assignees: ''
--- ---
----
(Please try the latest nightly release before submitting this. You can find the latest nightly verison here: https://github.com/eried/portapack-mayhem/releases)
----
**Describe the bug** **Describe the bug**
A clear and concise description of what the bug is. A clear and concise description of what the bug is.
@ -21,9 +27,9 @@ A clear and concise description of what you expected to happen.
**Affected versions** **Affected versions**
Please write any difference related with the Expected behavior, on the following versions: Please write any difference related with the Expected behavior, on the following versions:
* Latest Stable Release * Latest Stable release:
* Previous one (if any) that did not presented the issue * Latest Nightly release:
* Old versions available here: https://github.com/eried/Research/tree/master/HackRF/PortaPack/old_legacy_firmware * Previous working release:
**Additional** **Additional**
If the bug is difficult to explain, additionally to the text please include images and videos. If the bug is difficult to explain, additionally to the text please include images and videos.

View File

@ -1,18 +1,39 @@
--- ---
name: Problem upgrading the firmware name: Problem upgrading the firmware or booting
about: Deal with the firmware upgrade problems about: If you are having firmware upgrade or booting problems
title: Problem upgrading the firmware title: ''
labels: '' labels: 'firmware'
assignees: '' assignees: ''
--- ---
**What is happening?** ----
Describe here why you are unable to upgrade the firmware. Before describing your problems, **do the following**: Before creating this issue, **do the following**:
* Read the Wiki on booting: https://github.com/eried/portapack-mayhem/wiki/Won't-boot
* Read: https://github.com/eried/portapack-havoc/wiki/Update-firmware * Read: https://github.com/eried/portapack-havoc/wiki/Update-firmware
* Watch carefully: https://www.youtube.com/watch?v=_zx4ZvurgOs * Watch carefully: https://www.youtube.com/watch?v=_zx4ZvurgOs
* (if you are not in Windows) also check: https://www.youtube.com/watch?v=kjFB58Y1TAo * (if you are not in Windows) also check: https://www.youtube.com/watch?v=kjFB58Y1TAo
----
**Describe the issue**
A clear and concise description of what the issue you are facing is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Tap on '....'
**My Hardware**
Please specify what PortaPack hardware version you are using.
You can find the list of versions here: https://github.com/eried/portapack-mayhem/wiki/PortaPack-Versions
**Affected versions**
Please tell us what version you are running.
Also please try the latest nightly release before submitting this.
You can find the latest nightly version here https://github.com/eried/portapack-mayhem/releases
**Were you able to update the firmware before?** **Were you able to update the firmware before?**
Things might be confusing the first time, please check the video available on the link above. Things might be confusing the first time, please check the video available on the link above.
@ -20,4 +41,4 @@ Things might be confusing the first time, please check the video available on th
If is possible, swap hardware and try again. Also, try different USB cables, even if the one you are using works fine for other purposes. If is possible, swap hardware and try again. Also, try different USB cables, even if the one you are using works fine for other purposes.
**Additional** **Additional**
Add photos and videos of your procedure. If the issue is difficult to explain, additionally to the text please include images and videos.

View File

@ -51,7 +51,7 @@ jobs:
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with: with:
tag_name: v1.5.1 tag_name: ${{ steps.version.outputs.version }}
release_name: Mayhem firmware ${{ steps.version.outputs.version }} release_name: Mayhem firmware ${{ steps.version.outputs.version }}
body: | body: |
**Stable release - ${{ steps.version.outputs.version }}** **Stable release - ${{ steps.version.outputs.version }}**

View File

@ -1 +1 @@
v1.5.0 v1.5.1

View File

@ -1 +1 @@
v1.5.1 v1.5.3

1
.gitignore vendored
View File

@ -27,7 +27,6 @@
# Compiled Dynamic libraries # Compiled Dynamic libraries
*.so *.so
*.dylib *.dylib
*.dll
# Fortran module files # Fortran module files
*.mod *.mod

View File

@ -27,56 +27,30 @@
#include "portapack.hpp" #include "portapack.hpp"
#include "portapack_persistent_memory.hpp" #include "portapack_persistent_memory.hpp"
#include <cstring> #include <cstring>
#include <algorithm>
namespace std { namespace std {
int app_settings::load(std::string application, AppSettings* settings){ int app_settings::load(std::string application, AppSettings* settings) {
if (portapack::persistent_memory::load_app_settings()) { if (portapack::persistent_memory::load_app_settings()) {
file_path = folder+"/"+application+".ini"; file_path = folder+"/"+application+".ini";
auto error = settings_file.open(file_path); auto error = settings_file.open(file_path);
if (!error.is_valid()) { if (!error.is_valid()) {
auto error = settings_file.read(file_content, 256); auto error = settings_file.read(file_content, std::min((int)settings_file.size(), MAX_FILE_CONTENT_SIZE));
// Retrieve settings
auto position1 = strstr(file_content, "baseband_bandwidth=");
if (position1) {
position1 += 19;
settings->baseband_bandwidth=strtoll(position1, nullptr, 10);
}
auto position2 = strstr(file_content, "rx_frequency=");
if (position2) {
position2 += 13;
settings->rx_frequency=strtoll(position2, nullptr, 10);
}
auto position3 = strstr(file_content, "lna=");
if (position3) {
position3 += 4;
settings->lna=strtoll(position3, nullptr, 10);
}
auto position4 = strstr(file_content, "rx_amp=");
if (position4) {
position4 += 7;
settings->rx_amp=strtoll(position4, nullptr, 10);
}
auto position5 = strstr(file_content, "sampling_rate=");
if (position5) {
position5 += 13;
settings->sampling_rate=strtoll(position5, nullptr, 10);
}
auto position6 = strstr(file_content, "vga=");
if (position6) {
position6 += 4;
settings->vga=strtoll(position6, nullptr, 10);
}
settings->baseband_bandwidth=std::app_settings::read_long_long(file_content, "baseband_bandwidth=");
settings->channel_bandwidth=std::app_settings::read_long_long(file_content, "channel_bandwidth=");
settings->lna=std::app_settings::read_long_long(file_content, "lna=");
settings->modulation=std::app_settings::read_long_long(file_content, "modulation=");
settings->rx_amp=std::app_settings::read_long_long(file_content, "rx_amp=");
settings->rx_frequency=std::app_settings::read_long_long(file_content, "rx_frequency=");
settings->sampling_rate=std::app_settings::read_long_long(file_content, "sampling_rate=");
settings->vga=std::app_settings::read_long_long(file_content, "vga=");
settings->tx_amp=std::app_settings::read_long_long(file_content, "tx_amp=");
settings->tx_frequency=std::app_settings::read_long_long(file_content, "tx_frequency=");
settings->tx_gain=std::app_settings::read_long_long(file_content, "tx_gain=");
rc = SETTINGS_OK; rc = SETTINGS_OK;
} }
else rc = SETTINGS_UNABLE_TO_LOAD; else rc = SETTINGS_UNABLE_TO_LOAD;
@ -85,7 +59,7 @@ int app_settings::load(std::string application, AppSettings* settings){
return(rc); return(rc);
} }
int app_settings::save(std::string application, AppSettings* settings){ int app_settings::save(std::string application, AppSettings* settings) {
if (portapack::persistent_memory::save_app_settings()) { if (portapack::persistent_memory::save_app_settings()) {
file_path = folder+"/"+application+".ini"; file_path = folder+"/"+application+".ini";
@ -95,12 +69,16 @@ int app_settings::save(std::string application, AppSettings* settings){
if (!error.is_valid()) { if (!error.is_valid()) {
// Save common setting // Save common setting
settings_file.write_line("baseband_bandwidth="+to_string_dec_uint(portapack::receiver_model.baseband_bandwidth())); settings_file.write_line("baseband_bandwidth="+to_string_dec_uint(portapack::receiver_model.baseband_bandwidth()));
settings_file.write_line("channel_bandwidth="+to_string_dec_uint(portapack::transmitter_model.channel_bandwidth()));
settings_file.write_line("lna="+to_string_dec_uint(portapack::receiver_model.lna())); settings_file.write_line("lna="+to_string_dec_uint(portapack::receiver_model.lna()));
settings_file.write_line("rx_amp="+to_string_dec_uint(portapack::receiver_model.rf_amp())); settings_file.write_line("rx_amp="+to_string_dec_uint(portapack::receiver_model.rf_amp()));
settings_file.write_line("sampling_rate="+to_string_dec_uint(portapack::receiver_model.sampling_rate())); settings_file.write_line("sampling_rate="+to_string_dec_uint(portapack::receiver_model.sampling_rate()));
settings_file.write_line("tx_amp="+to_string_dec_uint(portapack::transmitter_model.rf_amp()));
settings_file.write_line("tx_gain="+to_string_dec_uint(portapack::transmitter_model.tx_gain()));
settings_file.write_line("vga="+to_string_dec_uint(portapack::receiver_model.vga())); settings_file.write_line("vga="+to_string_dec_uint(portapack::receiver_model.vga()));
// Save other settings from struct // Save other settings from struct
settings_file.write_line("rx_frequency="+to_string_dec_uint(settings->rx_frequency)); settings_file.write_line("rx_frequency="+to_string_dec_uint(settings->rx_frequency));
settings_file.write_line("tx_frequency="+to_string_dec_uint(settings->tx_frequency));
rc = SETTINGS_OK; rc = SETTINGS_OK;
} }
@ -110,4 +88,15 @@ int app_settings::save(std::string application, AppSettings* settings){
return(rc); return(rc);
} }
long long int app_settings::read_long_long(char* file_content, const char* setting_text) {
auto position = strstr(file_content, (char *)setting_text);
if (position) {
position += strlen((char *)setting_text);
setting_value = strtoll(position, nullptr, 10);
}
return(setting_value);
}
} /* namespace std */ } /* namespace std */

View File

@ -46,13 +46,18 @@ public:
#define SETTINGS_DISABLED -3 // load/save settings disabled in settings #define SETTINGS_DISABLED -3 // load/save settings disabled in settings
// store settings that can't be set directly, but have to be stored in app
struct AppSettings { struct AppSettings {
uint32_t baseband_bandwidth; uint32_t baseband_bandwidth;
uint32_t channel_bandwidth;
uint8_t lna; uint8_t lna;
uint8_t modulation;
uint8_t rx_amp; uint8_t rx_amp;
uint32_t rx_frequency; uint32_t rx_frequency;
uint32_t sampling_rate; uint32_t sampling_rate;
uint8_t tx_amp;
uint32_t tx_frequency;
uint8_t tx_gain;
uint8_t vga; uint8_t vga;
}; };
@ -62,12 +67,16 @@ public:
private: private:
#define MAX_FILE_CONTENT_SIZE 1000
char file_content[257] = {}; char file_content[MAX_FILE_CONTENT_SIZE] = {};
std::string file_path = ""; std::string file_path = "";
std::string folder = "SETTINGS"; std::string folder = "SETTINGS";
int rc = SETTINGS_OK; int rc = SETTINGS_OK;
File settings_file { }; File settings_file { };
long long int setting_value {} ;
long long int read_long_long(char* file_content, const char* setting_text);
}; // class app_settings }; // class app_settings

View File

@ -139,7 +139,6 @@ AnalogAudioView::AnalogAudioView(
} }
else field_frequency.set_value(receiver_model.tuning_frequency()); else field_frequency.set_value(receiver_model.tuning_frequency());
//Filename Datetime and Frequency //Filename Datetime and Frequency
record_view.set_filename_date_frequency(true); record_view.set_filename_date_frequency(true);
@ -170,6 +169,7 @@ AnalogAudioView::AnalogAudioView(
const auto modulation = receiver_model.modulation(); const auto modulation = receiver_model.modulation();
options_modulation.set_by_value(toUType(modulation)); options_modulation.set_by_value(toUType(modulation));
options_modulation.on_change = [this](size_t, OptionsField::value_t v) { options_modulation.on_change = [this](size_t, OptionsField::value_t v) {
this->on_modulation_changed(static_cast<ReceiverModel::Mode>(v)); this->on_modulation_changed(static_cast<ReceiverModel::Mode>(v));
}; };
@ -412,9 +412,6 @@ void AnalogAudioView::update_modulation(const ReceiverModel::Mode modulation) {
} }
} }
/*void AnalogAudioView::squelched() {
if (exit_on_squelch) nav_.pop();
}*/
void AnalogAudioView::handle_coded_squelch(const uint32_t value) { void AnalogAudioView::handle_coded_squelch(const uint32_t value) {
float diff, min_diff = value; float diff, min_diff = value;

View File

@ -39,10 +39,14 @@ using namespace portapack;
namespace ui { namespace ui {
void LGEView::focus() { void LGEView::focus() {
options_trame.focus(); options_frame.focus();
} }
LGEView::~LGEView() { LGEView::~LGEView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_lge", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();
} }
@ -70,10 +74,10 @@ void LGEView::generate_frame_touche() {
std::vector<uint8_t> data { 0x46, 0x28, 0x01, 0x45, 0x27, 0x01, 0x44, 0x23 }; std::vector<uint8_t> data { 0x46, 0x28, 0x01, 0x45, 0x27, 0x01, 0x44, 0x23 };
console.write("\n\x1B\x07Touche:\x1B\x10"); console.write("\n\x1B\x07Touche:\x1B\x10");
generate_lge_frame(0x96, (field_joueur.value() << 8) | field_salle.value(), 0x0001, data); generate_lge_frame(0x96, (field_player.value() << 8) | field_room.value(), 0x0001, data);
} }
void LGEView::generate_frame_pseudo() { void LGEView::generate_frame_nickname() {
// 0040.48s: // 0040.48s:
// 30 02 1A 00 19 00 FF 00 02 19 42 52 45 42 49 53 20 00 00 00 00 00 00 00 00 00 // 30 02 1A 00 19 00 FF 00 02 19 42 52 45 42 49 53 20 00 00 00 00 00 00 00 00 00
// 04 01 B0 04 7F 1F 11 33 40 1F 22 01 07 00 00 01 07 00 00 63 05 00 00 99 A2 // 04 01 B0 04 7F 1F 11 33 40 1F 22 01 07 00 00 01 07 00 00 63 05 00 00 99 A2
@ -90,15 +94,15 @@ void LGEView::generate_frame_pseudo() {
}; };
uint32_t c; uint32_t c;
//data_header[2] = field_salle.value(); // ? //data_header[2] = field_room.value(); // ?
//data_footer[0] = field_salle.value(); // ? //data_footer[0] = field_room.value(); // ?
data.insert(data.begin(), data_header.begin(), data_header.end()); data.insert(data.begin(), data_header.begin(), data_header.end());
data.push_back(field_joueur.value()); data.push_back(field_player.value());
c = 0; c = 0;
for (auto &ch : pseudo) { for (auto &ch : nickname) {
data.push_back(ch); data.push_back(ch);
c++; c++;
} }
@ -108,16 +112,16 @@ void LGEView::generate_frame_pseudo() {
while (++c < 16) while (++c < 16)
data.push_back(0x00); data.push_back(0x00);
data.push_back(field_equipe.value()); data.push_back(field_team.value());
data.insert(data.end(), data_footer.begin(), data_footer.end()); data.insert(data.end(), data_footer.begin(), data_footer.end());
console.write("\n\x1B\x0ESet pseudo:\x1B\x10"); console.write("\n\x1B\x0ESet nickname:\x1B\x10");
generate_lge_frame(0x02, 0x001A, field_joueur.value(), data); generate_lge_frame(0x02, 0x001A, field_player.value(), data);
} }
void LGEView::generate_frame_equipe() { void LGEView::generate_frame_team() {
// 0041.83s: // 0041.83s:
// 3D 03 FF FF FF FF 02 03 01 52 4F 55 47 45 00 00 00 00 00 00 00 00 00 00 00 00 // 3D 03 FF FF FF FF 02 03 01 52 4F 55 47 45 00 00 00 00 00 00 00 00 00 00 00 00
// 02 56 45 52 54 45 00 00 00 00 00 00 00 00 00 00 00 01 03 42 4C 45 55 45 00 00 // 02 56 45 52 54 45 00 00 00 00 00 00 00 00 00 00 00 01 03 42 4C 45 55 45 00 00
@ -129,10 +133,10 @@ void LGEView::generate_frame_equipe() {
data.insert(data.begin(), data_header.begin(), data_header.end()); data.insert(data.begin(), data_header.begin(), data_header.end());
data.push_back(field_equipe.value()); data.push_back(field_team.value());
c = 0; c = 0;
for (auto &ch : pseudo) { for (auto &ch : nickname) {
data.push_back(ch); data.push_back(ch);
c++; c++;
} }
@ -140,14 +144,14 @@ void LGEView::generate_frame_equipe() {
while (c++ < 16) while (c++ < 16)
data.push_back(0x00); data.push_back(0x00);
data.push_back(field_equipe.value() - 1); // Color ? data.push_back(field_team.value() - 1); // Color ?
console.write("\n\x1B\x0ASet equipe:\x1B\x10"); console.write("\n\x1B\x0ASet team:\x1B\x10");
generate_lge_frame(0x03, data); generate_lge_frame(0x03, data);
} }
void LGEView::generate_frame_broadcast_pseudo() { void LGEView::generate_frame_broadcast_nickname() {
// 0043.86s: // 0043.86s:
// 3D 04 FF FF FF FF 02 03 19 42 52 45 42 49 53 20 00 00 00 00 00 00 00 00 00 04 // 3D 04 FF FF FF FF 02 03 19 42 52 45 42 49 53 20 00 00 00 00 00 00 00 00 00 04
// 07 50 4F 4E 45 59 20 00 00 00 00 00 00 00 00 00 00 05 1B 41 42 42 59 20 00 00 // 07 50 4F 4E 45 59 20 00 00 00 00 00 00 00 00 00 00 05 1B 41 42 42 59 20 00 00
@ -159,10 +163,10 @@ void LGEView::generate_frame_broadcast_pseudo() {
data.insert(data.begin(), data_header.begin(), data_header.end()); data.insert(data.begin(), data_header.begin(), data_header.end());
data.push_back(field_joueur.value()); data.push_back(field_player.value());
c = 0; c = 0;
for (auto &ch : pseudo) { for (auto &ch : nickname) {
data.push_back(ch); data.push_back(ch);
c++; c++;
} }
@ -172,9 +176,9 @@ void LGEView::generate_frame_broadcast_pseudo() {
while (++c < 16) while (++c < 16)
data.push_back(0x00); data.push_back(0x00);
data.push_back(field_equipe.value()); data.push_back(field_team.value());
console.write("\n\x1B\x09" "Broadcast pseudo:\x1B\x10"); console.write("\n\x1B\x09" "Broadcast nickname:\x1B\x10");
generate_lge_frame(0x04, data); generate_lge_frame(0x04, data);
} }
@ -184,14 +188,14 @@ void LGEView::generate_frame_start() {
// 0A 05 FF FF FF FF 02 EC FF FF FF A3 35 // 0A 05 FF FF FF FF 02 EC FF FF FF A3 35
std::vector<uint8_t> data { 0x02, 0xEC, 0xFF, 0xFF, 0xFF }; std::vector<uint8_t> data { 0x02, 0xEC, 0xFF, 0xFF, 0xFF };
//data[0] = field_salle.value(); // ? //data[0] = field_room.value(); // ?
console.write("\n\x1B\x0DStart:\x1B\x10"); console.write("\n\x1B\x0DStart:\x1B\x10");
generate_lge_frame(0x05, data); generate_lge_frame(0x05, data);
} }
void LGEView::generate_frame_gameover() { void LGEView::generate_frame_gameover() {
std::vector<uint8_t> data { (uint8_t)field_salle.value() }; std::vector<uint8_t> data { (uint8_t)field_room.value() };
console.write("\n\x1B\x0CGameover:\x1B\x10"); console.write("\n\x1B\x0CGameover:\x1B\x10");
generate_lge_frame(0x0D, data); generate_lge_frame(0x0D, data);
@ -203,7 +207,7 @@ void LGEView::generate_frame_collier() {
// Custom // Custom
// 0C 00 13 37 13 37 id flags channel playerid zapduty zaptime checksum CRC CRC // 0C 00 13 37 13 37 id flags channel playerid zapduty zaptime checksum CRC CRC
// channel: field_channel // channel: field_channel
// playerid: field_joueur // playerid: field_player
// zapduty: field_power // zapduty: field_power
// zaptime: field_duration // zaptime: field_duration
@ -218,8 +222,8 @@ void LGEView::generate_frame_collier() {
std::vector<uint8_t> data { std::vector<uint8_t> data {
id, id,
flags, flags,
(uint8_t)field_salle.value(), (uint8_t)field_room.value(),
(uint8_t)field_joueur.value(), (uint8_t)field_player.value(),
(uint8_t)field_power.value(), (uint8_t)field_power.value(),
(uint8_t)(field_duration.value() * 10) (uint8_t)(field_duration.value() * 10)
}; };
@ -285,11 +289,11 @@ LGEView::LGEView(NavigationView& nav) {
add_children({ add_children({
&labels, &labels,
&options_trame, &options_frame,
&field_salle, &field_room,
&button_texte, &button_text,
&field_equipe, &field_team,
&field_joueur, &field_player,
&field_id, &field_id,
&field_power, &field_power,
&field_duration, &field_duration,
@ -300,20 +304,29 @@ LGEView::LGEView(NavigationView& nav) {
&tx_view &tx_view
}); });
field_salle.set_value(1); // load app settings
field_equipe.set_value(1); auto rc = settings.load("tx_lge", &app_settings);
field_joueur.set_value(1); if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_channel_bandwidth(app_settings.channel_bandwidth);
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
field_room.set_value(1);
field_team.set_value(1);
field_player.set_value(1);
field_id.set_value(1); field_id.set_value(1);
field_power.set_value(1); field_power.set_value(1);
field_duration.set_value(2); field_duration.set_value(2);
button_texte.on_select = [this, &nav](Button&) { button_text.on_select = [this, &nav](Button&) {
text_prompt( text_prompt(
nav, nav,
pseudo, nickname,
15, 15,
[this](std::string& buffer) { [this](std::string& buffer) {
button_texte.set_text(buffer); button_text.set_text(buffer);
}); });
}; };
@ -326,15 +339,15 @@ LGEView::LGEView(NavigationView& nav) {
tx_view.on_start = [this]() { tx_view.on_start = [this]() {
if (tx_mode == IDLE) { if (tx_mode == IDLE) {
auto i = options_trame.selected_index_value(); auto i = options_frame.selected_index_value();
if (i == 0) if (i == 0)
generate_frame_touche(); generate_frame_touche();
else if (i == 1) else if (i == 1)
generate_frame_pseudo(); generate_frame_nickname();
else if (i == 2) else if (i == 2)
generate_frame_equipe(); generate_frame_team();
else if (i == 3) else if (i == 3)
generate_frame_broadcast_pseudo(); generate_frame_broadcast_nickname();
else if (i == 4) else if (i == 4)
generate_frame_start(); generate_frame_start();
else if (i == 5) else if (i == 5)

View File

@ -30,6 +30,7 @@
#include "message.hpp" #include "message.hpp"
#include "transmitter_model.hpp" #include "transmitter_model.hpp"
#include "portapack.hpp" #include "portapack.hpp"
#include "app_settings.hpp"
namespace ui { namespace ui {
@ -49,6 +50,10 @@ private:
ALL ALL
}; };
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
tx_modes tx_mode = IDLE; tx_modes tx_mode = IDLE;
RFM69 rfm69 { 5, 0x2DD4, true, true }; RFM69 rfm69 { 5, 0x2DD4, true, true };
@ -56,7 +61,7 @@ private:
uint32_t frame_size { 0 }; uint32_t frame_size { 0 };
uint32_t repeats { 0 }; uint32_t repeats { 0 };
uint32_t channel_index { 0 }; uint32_t channel_index { 0 };
std::string pseudo { "ABCDEF" }; std::string nickname { "ABCDEF" };
rf::Frequency channels[3] = { 868067000, 868183000, 868295000 }; rf::Frequency channels[3] = { 868067000, 868183000, 868295000 };
@ -68,9 +73,9 @@ private:
} }
void generate_lge_frame(const uint8_t command, const uint16_t address_a, const uint16_t address_b, std::vector<uint8_t>& data); void generate_lge_frame(const uint8_t command, const uint16_t address_a, const uint16_t address_b, std::vector<uint8_t>& data);
void generate_frame_touche(); void generate_frame_touche();
void generate_frame_pseudo(); void generate_frame_nickname();
void generate_frame_equipe(); void generate_frame_team();
void generate_frame_broadcast_pseudo(); void generate_frame_broadcast_nickname();
void generate_frame_start(); void generate_frame_start();
void generate_frame_gameover(); void generate_frame_gameover();
void generate_frame_collier(); void generate_frame_collier();
@ -79,28 +84,28 @@ private:
Labels labels { Labels labels {
//{ { 7 * 8, 1 * 8 }, "NO FUN ALLOWED !", Color::red() }, //{ { 7 * 8, 1 * 8 }, "NO FUN ALLOWED !", Color::red() },
{ { 1 * 8, 1 * 8 }, "Trame:", Color::light_grey() }, { { 1 * 8, 1 * 8 }, "Frame:", Color::light_grey() },
{ { 1 * 8, 3 * 8 }, "Salle:", Color::light_grey() }, { { 2 * 8, 3 * 8 }, "Room:", Color::light_grey() },
{ { 14 * 8, 3 * 8 }, "Texte:", Color::light_grey() }, { { 14 * 8, 3 * 8 }, "Text:", Color::light_grey() },
{ { 0 * 8, 5 * 8 }, "Equipe:", Color::light_grey() }, { { 2 * 8, 5 * 8 }, "Team:", Color::light_grey() },
{ { 0 * 8, 7 * 8 }, "Joueur:", Color::light_grey() }, { { 0 * 8, 7 * 8 }, "Player:", Color::light_grey() },
{ { 0 * 8, 10 * 8 }, "Collier:", Color::light_grey() }, { { 0 * 8, 10 * 8 }, "Vest:", Color::light_grey() },
{ { 4 * 8, 12 * 8 }, "ID:", Color::light_grey() }, { { 4 * 8, 12 * 8 }, "ID:", Color::light_grey() },
{ { 3 * 8, 14 * 8 }, "Pow: /10", Color::light_grey() }, { { 3 * 8, 14 * 8 }, "Pow: /10", Color::light_grey() },
{ { 1 * 8, 16 * 8 }, "Duree: x100ms", Color::light_grey() } { { 2 * 8, 16 * 8 }, "Time: x100ms", Color::light_grey() }
}; };
OptionsField options_trame { OptionsField options_frame {
{ 7 * 8, 1 * 8 }, { 7 * 8, 1 * 8 },
13, 13,
{ {
{ "Touche", 0 }, { "Key", 0 },
{ "Set pseudo", 1 }, { "Set nickname", 1 },
{ "Set equipe", 2 }, { "Set team", 2 },
{ "Brdcst pseudo", 3 }, { "Brdcst nick", 3 },
{ "Start", 4 }, { "Start", 4 },
{ "Game over", 5 }, { "Game over", 5 },
{ "Set collier", 6 } { "Set vest", 6 }
} }
}; };
@ -111,7 +116,7 @@ private:
true true
}; };
NumberField field_salle { NumberField field_room {
{ 7 * 8, 3 * 8 }, { 7 * 8, 3 * 8 },
1, 1,
{ 1, 2 }, { 1, 2 },
@ -119,12 +124,12 @@ private:
'0' '0'
}; };
Button button_texte { Button button_text {
{ 14 * 8, 5 * 8, 16 * 8, 3 * 8 }, { 14 * 8, 5 * 8, 16 * 8, 3 * 8 },
"ABCDEF" "ABCDEF"
}; };
NumberField field_equipe { NumberField field_team {
{ 7 * 8, 5 * 8 }, { 7 * 8, 5 * 8 },
1, 1,
{ 1, 6 }, { 1, 6 },
@ -132,7 +137,7 @@ private:
'0' '0'
}; };
NumberField field_joueur { NumberField field_player {
{ 7 * 8, 7 * 8 }, { 7 * 8, 7 * 8 },
2, 2,
{ 1, 50 }, { 1, 50 },

View File

@ -87,6 +87,8 @@ POCSAGAppView::POCSAGAppView(NavigationView& nav) {
} }
else field_frequency.set_value(receiver_model.tuning_frequency()); else field_frequency.set_value(receiver_model.tuning_frequency());
receiver_model.set_modulation(ReceiverModel::Mode::NarrowbandFMAudio);
receiver_model.set_sampling_rate(3072000); receiver_model.set_sampling_rate(3072000);
receiver_model.set_baseband_bandwidth(1750000); receiver_model.set_baseband_bandwidth(1750000);
receiver_model.enable(); receiver_model.enable();

View File

@ -241,6 +241,15 @@ SoundBoardView::SoundBoardView(
&tx_view &tx_view
}); });
// load app settings
auto rc = settings.load("tx_soundboard", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_channel_bandwidth(app_settings.channel_bandwidth);
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
refresh_list(); refresh_list();
button_next_page.on_select = [this](Button&) { button_next_page.on_select = [this](Button&) {
@ -280,6 +289,10 @@ SoundBoardView::SoundBoardView(
} }
SoundBoardView::~SoundBoardView() { SoundBoardView::~SoundBoardView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_soundboard", &app_settings);
stop(); stop();
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();

View File

@ -30,6 +30,7 @@
#include "lfsr_random.hpp" #include "lfsr_random.hpp"
#include "io_wave.hpp" #include "io_wave.hpp"
#include "tone_key.hpp" #include "tone_key.hpp"
#include "app_settings.hpp"
namespace ui { namespace ui {
@ -50,6 +51,10 @@ public:
private: private:
NavigationView& nav_; NavigationView& nav_;
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
enum tx_modes { enum tx_modes {
NORMAL = 0, NORMAL = 0,
RANDOM RANDOM

View File

@ -313,6 +313,7 @@ ADSBRxView::~ADSBRxView() {
// save app settings // save app settings
settings.save("rx_adsb", &app_settings); settings.save("rx_adsb", &app_settings);
//TODO: once all apps keep there own settin previous frequency logic can be removed
receiver_model.set_tuning_frequency(prevFreq); receiver_model.set_tuning_frequency(prevFreq);
rtc_time::signal_tick_second -= signal_token_tick_second; rtc_time::signal_tick_second -= signal_token_tick_second;
receiver_model.disable(); receiver_model.disable();

View File

@ -284,6 +284,11 @@ void ADSBTxView::focus() {
} }
ADSBTxView::~ADSBTxView() { ADSBTxView::~ADSBTxView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_adsb", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();
} }
@ -336,6 +341,14 @@ ADSBTxView::ADSBTxView(
&tx_view &tx_view
}); });
// load app settings
auto rc = settings.load("tx_adsb", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
tx_view.on_edit_frequency = [this, &nav]() { tx_view.on_edit_frequency = [this, &nav]() {
auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency()); auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency());
new_view->on_changed = [this](rf::Frequency f) { new_view->on_changed = [this](rf::Frequency f) {

View File

@ -28,6 +28,7 @@
#include "ui_transmitter.hpp" #include "ui_transmitter.hpp"
#include "message.hpp" #include "message.hpp"
#include "transmitter_model.hpp" #include "transmitter_model.hpp"
#include "app_settings.hpp"
#include "portapack.hpp" #include "portapack.hpp"
using namespace adsb; using namespace adsb;
@ -190,6 +191,10 @@ private:
-1 -1
};*/ };*/
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
//tx_modes tx_mode = IDLE; //tx_modes tx_mode = IDLE;
NavigationView& nav_; NavigationView& nav_;
std::vector<ADSBFrame> frames { }; std::vector<ADSBFrame> frames { };

View File

@ -43,6 +43,10 @@ void APRSTXView::focus() {
} }
APRSTXView::~APRSTXView() { APRSTXView::~APRSTXView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_aprs", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();
} }
@ -66,7 +70,7 @@ void APRSTXView::start_tx() {
1200, 1200,
2200, 2200,
1, 1,
10000, //transmitter_model.channel_bandwidth(), 10000, //APRS uses fixed 10k bandwidth
8 8
); );
} }
@ -95,6 +99,15 @@ APRSTXView::APRSTXView(NavigationView& nav) {
&tx_view &tx_view
}); });
// load app settings
auto rc = settings.load("tx_aprs", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
button_set.on_select = [this, &nav](Button&) { button_set.on_select = [this, &nav](Button&) {
text_prompt( text_prompt(
nav, nav,

View File

@ -29,6 +29,7 @@
#include "message.hpp" #include "message.hpp"
#include "transmitter_model.hpp" #include "transmitter_model.hpp"
#include "app_settings.hpp"
#include "portapack.hpp" #include "portapack.hpp"
namespace ui { namespace ui {
@ -40,16 +41,13 @@ public:
void focus() override; void focus() override;
std::string title() const override { return "APRS TX (beta)"; }; std::string title() const override { return "APRS TX"; };
private: private:
/*enum tx_modes {
IDLE = 0,
SINGLE,
SEQUENCE
};
tx_modes tx_mode = IDLE;*/ // app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
std::string payload { "" }; std::string payload { "" };
@ -103,7 +101,7 @@ private:
TransmitterView tx_view { TransmitterView tx_view {
16 * 16, 16 * 16,
5000, 5000,
10 0 // disable setting bandwith, since APRS used fixed 10k bandwidth
}; };
MessageHandlerRegistration message_handler_tx_progress { MessageHandlerRegistration message_handler_tx_progress {

View File

@ -96,9 +96,9 @@ void BHTView::on_tx_progress(const uint32_t progress, const bool done) {
if (target_system == XYLOS) { if (target_system == XYLOS) {
if (done) { if (done) {
if (tx_mode == SINGLE) { if (tx_mode == SINGLE) {
if (checkbox_cligno.value()) { if (checkbox_flashing.value()) {
// TODO: Thread ! // TODO: Thread !
chThdSleepMilliseconds(field_tempo.value() * 1000); // Dirty :( chThdSleepMilliseconds(field_speed.value() * 1000); // Dirty :(
view_xylos.flip_relays(); view_xylos.flip_relays();
start_tx(); start_tx();
} else } else
@ -120,9 +120,9 @@ void BHTView::on_tx_progress(const uint32_t progress, const bool done) {
} else { } else {
view_EPAR.half = false; view_EPAR.half = false;
if (tx_mode == SINGLE) { if (tx_mode == SINGLE) {
if (checkbox_cligno.value()) { if (checkbox_flashing.value()) {
// TODO: Thread ! // TODO: Thread !
chThdSleepMilliseconds(field_tempo.value() * 1000); // Dirty :( chThdSleepMilliseconds(field_speed.value() * 1000); // Dirty :(
view_EPAR.flip_relays(); view_EPAR.flip_relays();
start_tx(); start_tx();
} else } else
@ -140,6 +140,10 @@ void BHTView::on_tx_progress(const uint32_t progress, const bool done) {
} }
BHTView::~BHTView() { BHTView::~BHTView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_bht", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
} }
@ -150,13 +154,22 @@ BHTView::BHTView(NavigationView& nav) {
&view_xylos, &view_xylos,
&view_EPAR, &view_EPAR,
&checkbox_scan, &checkbox_scan,
&checkbox_cligno, &checkbox_flashing,
&field_tempo, &field_speed,
&progressbar, &progressbar,
&tx_view &tx_view
}); });
field_tempo.set_value(1); // load app settings
auto rc = settings.load("tx_bht", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_channel_bandwidth(app_settings.channel_bandwidth);
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
field_speed.set_value(1);
tx_view.on_edit_frequency = [this, &nav]() { tx_view.on_edit_frequency = [this, &nav]() {
auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency()); auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency());

View File

@ -32,6 +32,7 @@
#include "message.hpp" #include "message.hpp"
#include "transmitter_model.hpp" #include "transmitter_model.hpp"
#include "encoders.hpp" #include "encoders.hpp"
#include "app_settings.hpp"
#include "portapack.hpp" #include "portapack.hpp"
namespace ui { namespace ui {
@ -50,11 +51,11 @@ public:
private: private:
Labels labels { Labels labels {
{ { 8 * 8, 1 * 8 }, "Header:", Color::light_grey() }, { { 8 * 8, 1 * 8 }, "Header:", Color::light_grey() },
{ { 4 * 8, 3 * 8 }, "Code ville:", Color::light_grey() }, { { 4 * 8, 3 * 8 }, "City code:", Color::light_grey() },
{ { 7 * 8, 5 * 8 }, "Famille:", Color::light_grey() }, { { 7 * 8, 5 * 8 }, "Family:", Color::light_grey() },
{ { 2 * 8, 7 * 8 + 2 }, "Sous-famille:", Color::light_grey() }, { { 2 * 8, 7 * 8 + 2 }, "Subfamily:", Color::light_grey() },
{ { 2 * 8, 11 * 8 }, "ID recepteur:", Color::light_grey() }, { { 2 * 8, 11 * 8 }, "Receiver ID:", Color::light_grey() },
{ { 2 * 8, 14 * 8 }, "Relais:", Color::light_grey() } { { 2 * 8, 14 * 8 }, "Relay:", Color::light_grey() }
}; };
NumberField field_header_a { NumberField field_header_a {
@ -98,8 +99,8 @@ private:
Checkbox checkbox_wcsubfamily { Checkbox checkbox_wcsubfamily {
{ 20 * 8, 6 * 8 + 6 }, { 20 * 8, 6 * 8 + 6 },
6, 3,
"Toutes" "All"
}; };
NumberField field_receiver { NumberField field_receiver {
@ -111,8 +112,8 @@ private:
}; };
Checkbox checkbox_wcid { Checkbox checkbox_wcid {
{ 20 * 8, 10 * 8 + 4 }, { 20 * 8, 10 * 8 + 4 },
4, 3,
"Tous" "All"
}; };
std::array<ImageOptionsField, 4> relay_states { }; std::array<ImageOptionsField, 4> relay_states { };
@ -139,9 +140,9 @@ public:
private: private:
Labels labels { Labels labels {
{ { 4 * 8, 1 * 8 }, "Code ville:", Color::light_grey() }, { { 4 * 8, 1 * 8 }, "City code:", Color::light_grey() },
{ { 8 * 8, 3 * 8 }, "Groupe:", Color::light_grey() }, { { 8 * 8, 3 * 8 }, "Group:", Color::light_grey() },
{ { 8 * 8, 7 * 8 }, "Relais:", Color::light_grey() } { { 8 * 8, 7 * 8 }, "Relay:", Color::light_grey() }
}; };
NumberField field_city { NumberField field_city {
@ -181,6 +182,10 @@ public:
std::string title() const override { return "BHT Xy/EP TX"; }; std::string title() const override { return "BHT Xy/EP TX"; };
private: private:
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
void on_tx_progress(const uint32_t progress, const bool done); void on_tx_progress(const uint32_t progress, const bool done);
void start_tx(); void start_tx();
void stop_tx(); void stop_tx();
@ -220,12 +225,12 @@ private:
"Scan" "Scan"
}; };
Checkbox checkbox_cligno { Checkbox checkbox_flashing {
{ 16 * 8, 25 * 8 }, { 16 * 8, 25 * 8 },
6, 8,
"Cligno" "Flashing"
}; };
NumberField field_tempo { NumberField field_speed {
{ 26 * 8, 25 * 8 + 4 }, { 26 * 8, 25 * 8 + 4 },
2, 2,
{ 1, 99 }, { 1, 99 },

View File

@ -37,6 +37,10 @@ void CoasterPagerView::focus() {
} }
CoasterPagerView::~CoasterPagerView() { CoasterPagerView::~CoasterPagerView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_coaster", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();
} }
@ -119,6 +123,15 @@ CoasterPagerView::CoasterPagerView(NavigationView& nav) {
&tx_view &tx_view
}); });
// load app settings
auto rc = settings.load("tx_coaster", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_channel_bandwidth(app_settings.channel_bandwidth);
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
// Bytes to nibbles // Bytes to nibbles
for (c = 0; c < 16; c++) for (c = 0; c < 16; c++)
sym_data.set_sym(c, (data_init[c >> 1] >> ((c & 1) ? 0 : 4)) & 0x0F); sym_data.set_sym(c, (data_init[c >> 1] >> ((c & 1) ? 0 : 4)) & 0x0F);

View File

@ -28,6 +28,7 @@
#include "message.hpp" #include "message.hpp"
#include "transmitter_model.hpp" #include "transmitter_model.hpp"
#include "app_settings.hpp"
#include "portapack.hpp" #include "portapack.hpp"
namespace ui { namespace ui {
@ -50,6 +51,10 @@ private:
tx_modes tx_mode = IDLE; tx_modes tx_mode = IDLE;
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
void start_tx(); void start_tx();
void generate_frame(); void generate_frame();
void on_tx_progress(const uint32_t progress, const bool done); void on_tx_progress(const uint32_t progress, const bool done);

View File

@ -203,6 +203,10 @@ void EncodersView::focus() {
} }
EncodersView::~EncodersView() { EncodersView::~EncodersView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_ook", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();
} }
@ -335,6 +339,15 @@ EncodersView::EncodersView(
&tx_view &tx_view
}); });
// load app settings
auto rc = settings.load("tx_ook", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_channel_bandwidth(app_settings.channel_bandwidth);
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
tx_view.on_edit_frequency = [this, &nav]() { tx_view.on_edit_frequency = [this, &nav]() {
auto new_view = nav.push<FrequencyKeypadView>(transmitter_model.tuning_frequency()); auto new_view = nav.push<FrequencyKeypadView>(transmitter_model.tuning_frequency());
new_view->on_changed = [this](rf::Frequency f) { new_view->on_changed = [this](rf::Frequency f) {

View File

@ -26,6 +26,7 @@
#include "transmitter_model.hpp" #include "transmitter_model.hpp"
#include "encoders.hpp" #include "encoders.hpp"
#include "de_bruijn.hpp" #include "de_bruijn.hpp"
#include "app_settings.hpp"
using namespace encoders; using namespace encoders;
@ -169,6 +170,10 @@ private:
SCAN SCAN
}; };
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
tx_modes tx_mode = IDLE; tx_modes tx_mode = IDLE;
uint8_t repeat_index { 0 }; uint8_t repeat_index { 0 };
uint8_t repeat_min { 0 }; uint8_t repeat_min { 0 };

View File

@ -136,6 +136,9 @@ void KeyfobView::focus() {
} }
KeyfobView::~KeyfobView() { KeyfobView::~KeyfobView() {
// save app settings
settings.save("tx_keyfob", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();
} }
@ -214,6 +217,13 @@ KeyfobView::KeyfobView(
&tx_view &tx_view
}); });
// load app settings
auto rc = settings.load("tx_keyfob", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
frame[0] = 0x55; frame[0] = 0x55;
update_symfields(); update_symfields();

View File

@ -23,6 +23,7 @@
#include "ui.hpp" #include "ui.hpp"
#include "ui_transmitter.hpp" #include "ui_transmitter.hpp"
#include "transmitter_model.hpp" #include "transmitter_model.hpp"
#include "app_settings.hpp"
#include "encoders.hpp" #include "encoders.hpp"
using namespace encoders; using namespace encoders;
@ -41,6 +42,10 @@ public:
private: private:
NavigationView& nav_; NavigationView& nav_;
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
// 1013210ns / bit // 1013210ns / bit
static constexpr uint32_t subaru_samples_per_bit = (OOK_SAMPLERATE * 0.00101321); static constexpr uint32_t subaru_samples_per_bit = (OOK_SAMPLERATE * 0.00101321);
static constexpr uint32_t repeats = 4; static constexpr uint32_t repeats = 4;

View File

@ -39,6 +39,10 @@ void LCRView::focus() {
} }
LCRView::~LCRView() { LCRView::~LCRView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_lcr", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();
} }
@ -173,6 +177,15 @@ LCRView::LCRView(NavigationView& nav) {
&tx_view &tx_view
}); });
// load app settings
auto rc = settings.load("tx_lcr", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_channel_bandwidth(app_settings.channel_bandwidth);
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
options_scanlist.set_selected_index(0); options_scanlist.set_selected_index(0);
const auto button_set_am_fn = [this, &nav](Button& button) { const auto button_set_am_fn = [this, &nav](Button& button) {

View File

@ -27,6 +27,7 @@
#include "message.hpp" #include "message.hpp"
#include "transmitter_model.hpp" #include "transmitter_model.hpp"
#include "app_settings.hpp"
namespace ui { namespace ui {
@ -81,6 +82,10 @@ private:
SCAN SCAN
}; };
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
tx_modes tx_mode = IDLE; tx_modes tx_mode = IDLE;
uint8_t scan_count { 0 }, scan_index { 0 }; uint8_t scan_count { 0 }, scan_index { 0 };
uint32_t scan_progress { 0 }; uint32_t scan_progress { 0 };

View File

@ -97,6 +97,10 @@ void MorseView::focus() {
} }
MorseView::~MorseView() { MorseView::~MorseView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_morse", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();
} }
@ -203,6 +207,15 @@ MorseView::MorseView(
&tx_view &tx_view
}); });
// load app settings
auto rc = settings.load("tx_morse", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_channel_bandwidth(app_settings.channel_bandwidth);
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
// Default settings // Default settings
field_speed.set_value(15); // 15wps field_speed.set_value(15); // 15wps
field_tone.set_value(700); // 700Hz FM tone field_tone.set_value(700); // 700Hz FM tone

View File

@ -27,7 +27,7 @@
#include "ui_widget.hpp" #include "ui_widget.hpp"
#include "ui_navigation.hpp" #include "ui_navigation.hpp"
#include "ui_transmitter.hpp" #include "ui_transmitter.hpp"
#include "app_settings.hpp"
#include "portapack.hpp" #include "portapack.hpp"
#include "message.hpp" #include "message.hpp"
#include "volume.hpp" #include "volume.hpp"
@ -67,6 +67,10 @@ private:
std::string message { }; std::string message { };
uint32_t time_units { 0 }; uint32_t time_units { 0 };
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
enum modulation_t { enum modulation_t {
CW = 0, CW = 0,
FM = 1 FM = 1

View File

@ -38,6 +38,10 @@ void POCSAGTXView::focus() {
} }
POCSAGTXView::~POCSAGTXView() { POCSAGTXView::~POCSAGTXView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_pocsag", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();
} }
@ -141,6 +145,15 @@ POCSAGTXView::POCSAGTXView(
&tx_view &tx_view
}); });
// load app settings
auto rc = settings.load("tx_pocsag", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_channel_bandwidth(app_settings.channel_bandwidth);
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
options_bitrate.set_selected_index(1); // 1200bps options_bitrate.set_selected_index(1); // 1200bps
options_type.set_selected_index(0); // Address only options_type.set_selected_index(0); // Address only

View File

@ -31,6 +31,7 @@
#include "bch_code.hpp" #include "bch_code.hpp"
#include "message.hpp" #include "message.hpp"
#include "transmitter_model.hpp" #include "transmitter_model.hpp"
#include "app_settings.hpp"
#include "pocsag.hpp" #include "pocsag.hpp"
using namespace pocsag; using namespace pocsag;
@ -62,6 +63,10 @@ private:
5, 31, 21, 2 5, 31, 21, 2
}; };
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
void on_set_text(NavigationView& nav); void on_set_text(NavigationView& nav);
void on_tx_progress(const uint32_t progress, const bool done); void on_tx_progress(const uint32_t progress, const bool done);
bool start_tx(); bool start_tx();

View File

@ -175,6 +175,10 @@ void RDSView::focus() {
} }
RDSView::~RDSView() { RDSView::~RDSView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_rds", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();
} }
@ -226,11 +230,17 @@ RDSView::RDSView(
&view_radiotext, &view_radiotext,
&view_datetime, &view_datetime,
&view_audio, &view_audio,
//&options_countrycode,
//&options_coverage,
&tx_view, &tx_view,
}); });
// load app settings
auto rc = settings.load("tx_rds", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_channel_bandwidth(app_settings.channel_bandwidth);
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
check_TP.set_value(true); check_TP.set_value(true);
sym_pi_code.set_sym(0, 0xF); sym_pi_code.set_sym(0, 0xF);
@ -242,8 +252,6 @@ RDSView::RDSView(
}; };
options_pty.set_selected_index(0); // None options_pty.set_selected_index(0); // None
//options_countrycode.set_selected_index(18); // Baguette du fromage
//options_coverage.set_selected_index(0); // Local
tx_view.on_edit_frequency = [this, &nav]() { tx_view.on_edit_frequency = [this, &nav]() {
auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency()); auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency());

View File

@ -24,7 +24,7 @@
#include "ui_transmitter.hpp" #include "ui_transmitter.hpp"
#include "ui_textentry.hpp" #include "ui_textentry.hpp"
#include "ui_tabview.hpp" #include "ui_tabview.hpp"
#include "app_settings.hpp"
#include "rds.hpp" #include "rds.hpp"
using namespace rds; using namespace rds;
@ -150,6 +150,11 @@ private:
NavigationView& nav_; NavigationView& nav_;
RDS_flags rds_flags { }; RDS_flags rds_flags { };
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
std::vector<RDSGroup> frame_psn { }; std::vector<RDSGroup> frame_psn { };
std::vector<RDSGroup> frame_radiotext { }; std::vector<RDSGroup> frame_radiotext { };
std::vector<RDSGroup> frame_datetime { }; std::vector<RDSGroup> frame_datetime { };

View File

@ -88,6 +88,10 @@ void SSTVTXView::paint(Painter&) {
} }
SSTVTXView::~SSTVTXView() { SSTVTXView::~SSTVTXView() {
// save app settings
app_settings.tx_frequency = transmitter_model.tuning_frequency();
settings.save("tx_sstv", &app_settings);
transmitter_model.disable(); transmitter_model.disable();
baseband::shutdown(); baseband::shutdown();
} }
@ -215,6 +219,15 @@ SSTVTXView::SSTVTXView(
options_t mode_options; options_t mode_options;
uint32_t c; uint32_t c;
// load app settings
auto rc = settings.load("tx_sstv", &app_settings);
if(rc == SETTINGS_OK) {
transmitter_model.set_rf_amp(app_settings.tx_amp);
transmitter_model.set_channel_bandwidth(app_settings.channel_bandwidth);
transmitter_model.set_tuning_frequency(app_settings.tx_frequency);
transmitter_model.set_tx_gain(app_settings.tx_gain);
}
// Search for valid bitmaps // Search for valid bitmaps
file_list = scan_root_files(u"/sstv", u"*.bmp"); file_list = scan_root_files(u"/sstv", u"*.bmp");
if (!file_list.size()) { if (!file_list.size()) {

View File

@ -34,6 +34,7 @@
#include "sstv.hpp" #include "sstv.hpp"
#include "file.hpp" #include "file.hpp"
#include "bmp.hpp" #include "bmp.hpp"
#include "app_settings.hpp"
using namespace sstv; using namespace sstv;
@ -58,6 +59,9 @@ private:
NavigationView& nav_; NavigationView& nav_;
sstv_scanline scanline_buffer { }; sstv_scanline scanline_buffer { };
// app save settings
std::app_settings settings { };
std::app_settings::AppSettings app_settings { };
bool file_error { false }; bool file_error { false };
File bmp_file { }; File bmp_file { };

View File

@ -36,7 +36,7 @@ outfile.write(struct.pack('H', im.size[1]))
print("Generating: \t" + outfile.name + "\n from\t\t" + im.filename + "\n please wait..."); print("Generating: \t" + outfile.name + "\n from\t\t" + im.filename + "\n please wait...");
for y in range (0, im.size[1]): for y in range (0, im.size[1]):
line = '' line = b''
for x in range (0, im.size[0]): for x in range (0, im.size[0]):
# RRRRRGGGGGGBBBBB # RRRRRGGGGGGBBBBB
pixel_lcd = (pix[x, y][0] >> 3) << 11 pixel_lcd = (pix[x, y][0] >> 3) << 11
@ -47,8 +47,8 @@ for y in range (0, im.size[1]):
# pixel_lcd = (pix[x, y][0] >> 5) << 5 # pixel_lcd = (pix[x, y][0] >> 5) << 5
# pixel_lcd |= (pix[x, y][1] >> 5) << 2 # pixel_lcd |= (pix[x, y][1] >> 5) << 2
# pixel_lcd |= (pix[x, y][2] >> 6) # pixel_lcd |= (pix[x, y][2] >> 6)
line += str(struct.pack('H', pixel_lcd)) line += struct.pack('H', pixel_lcd)
outfile.write(line.encode('utf-8')) outfile.write(line)
print(str(y) + '/' + str(im.size[1]) + '\r', end="") print(str(y) + '/' + str(im.size[1]) + '\r', end="")
print("Ready."); print("Ready.");

Binary file not shown.

Binary file not shown.

BIN
flashing/msvcp120.dll Normal file

Binary file not shown.

BIN
flashing/msvcr120.dll Normal file

Binary file not shown.