Added SD card wiper tool
Frequency manager now creates FREQMAN.TXT if not found Moved graphics files
@ -174,7 +174,7 @@ set(CPPSRC
|
|||||||
ui_record_view.cpp
|
ui_record_view.cpp
|
||||||
ui_rssi.cpp
|
ui_rssi.cpp
|
||||||
ui_sd_card_status_view.cpp
|
ui_sd_card_status_view.cpp
|
||||||
ui_sd_card_debug.cpp
|
# ui_sd_card_debug.cpp
|
||||||
ui_setup.cpp
|
ui_setup.cpp
|
||||||
ui_soundboard.cpp
|
ui_soundboard.cpp
|
||||||
ui_spectrum.cpp
|
ui_spectrum.cpp
|
||||||
|
@ -4811,33 +4811,6 @@ ui_rssi.cpp.s:
|
|||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_rssi.cpp.s
|
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_rssi.cpp.s
|
||||||
.PHONY : ui_rssi.cpp.s
|
.PHONY : ui_rssi.cpp.s
|
||||||
|
|
||||||
ui_sd_card_debug.obj: ui_sd_card_debug.cpp.obj
|
|
||||||
|
|
||||||
.PHONY : ui_sd_card_debug.obj
|
|
||||||
|
|
||||||
# target to build an object file
|
|
||||||
ui_sd_card_debug.cpp.obj:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_sd_card_debug.cpp.obj
|
|
||||||
.PHONY : ui_sd_card_debug.cpp.obj
|
|
||||||
|
|
||||||
ui_sd_card_debug.i: ui_sd_card_debug.cpp.i
|
|
||||||
|
|
||||||
.PHONY : ui_sd_card_debug.i
|
|
||||||
|
|
||||||
# target to preprocess a source file
|
|
||||||
ui_sd_card_debug.cpp.i:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_sd_card_debug.cpp.i
|
|
||||||
.PHONY : ui_sd_card_debug.cpp.i
|
|
||||||
|
|
||||||
ui_sd_card_debug.s: ui_sd_card_debug.cpp.s
|
|
||||||
|
|
||||||
.PHONY : ui_sd_card_debug.s
|
|
||||||
|
|
||||||
# target to generate assembly for a file
|
|
||||||
ui_sd_card_debug.cpp.s:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_sd_card_debug.cpp.s
|
|
||||||
.PHONY : ui_sd_card_debug.cpp.s
|
|
||||||
|
|
||||||
ui_sd_card_status_view.obj: ui_sd_card_status_view.cpp.obj
|
ui_sd_card_status_view.obj: ui_sd_card_status_view.cpp.obj
|
||||||
|
|
||||||
.PHONY : ui_sd_card_status_view.obj
|
.PHONY : ui_sd_card_status_view.obj
|
||||||
@ -5610,9 +5583,6 @@ help:
|
|||||||
@echo "... ui_rssi.obj"
|
@echo "... ui_rssi.obj"
|
||||||
@echo "... ui_rssi.i"
|
@echo "... ui_rssi.i"
|
||||||
@echo "... ui_rssi.s"
|
@echo "... ui_rssi.s"
|
||||||
@echo "... ui_sd_card_debug.obj"
|
|
||||||
@echo "... ui_sd_card_debug.i"
|
|
||||||
@echo "... ui_sd_card_debug.s"
|
|
||||||
@echo "... ui_sd_card_status_view.obj"
|
@echo "... ui_sd_card_status_view.obj"
|
||||||
@echo "... ui_sd_card_status_view.i"
|
@echo "... ui_sd_card_status_view.i"
|
||||||
@echo "... ui_sd_card_status_view.s"
|
@echo "... ui_sd_card_status_view.s"
|
||||||
|
@ -74,8 +74,7 @@ bool save_freqman_file(std::vector<freqman_entry> &frequencies) {
|
|||||||
size_t n;
|
size_t n;
|
||||||
std::string item_string;
|
std::string item_string;
|
||||||
|
|
||||||
auto result = freqs_file.create("freqman.txt");
|
if (!create_freqman_file(freqs_file)) return false;
|
||||||
if (result.is_valid()) return false;
|
|
||||||
|
|
||||||
for (n = 0; n < frequencies.size(); n++) {
|
for (n = 0; n < frequencies.size(); n++) {
|
||||||
item_string = "f=" + to_string_dec_uint(frequencies[n].value);
|
item_string = "f=" + to_string_dec_uint(frequencies[n].value);
|
||||||
@ -89,6 +88,13 @@ bool save_freqman_file(std::vector<freqman_entry> &frequencies) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool create_freqman_file(File &freqs_file) {
|
||||||
|
auto result = freqs_file.create("freqman.txt");
|
||||||
|
if (result.is_valid()) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
std::string freqman_item_string(freqman_entry &entry) {
|
std::string freqman_item_string(freqman_entry &entry) {
|
||||||
std::string item_string, frequency_str, description;
|
std::string item_string, frequency_str, description;
|
||||||
char temp_buffer[32];
|
char temp_buffer[32];
|
||||||
|
@ -39,6 +39,7 @@ struct freqman_entry {
|
|||||||
|
|
||||||
bool load_freqman_file(std::vector<freqman_entry> &frequencies);
|
bool load_freqman_file(std::vector<freqman_entry> &frequencies);
|
||||||
bool save_freqman_file(std::vector<freqman_entry> &frequencies);
|
bool save_freqman_file(std::vector<freqman_entry> &frequencies);
|
||||||
|
bool create_freqman_file(File &freqs_file);
|
||||||
std::string freqman_item_string(freqman_entry &frequencies);
|
std::string freqman_item_string(freqman_entry &frequencies);
|
||||||
|
|
||||||
#endif/*__FREQMAN_H__*/
|
#endif/*__FREQMAN_H__*/
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
//TEST: Imperial in whipcalc
|
//TEST: Imperial in whipcalc
|
||||||
//TEST: Numbers
|
//TEST: Numbers
|
||||||
//TEST: Jammer
|
//TEST: Jammer
|
||||||
//TEST: Frequency manager + save/load
|
//TODO: Frequency manager auto-remove duplicates
|
||||||
|
|
||||||
//TODO: "TX box" view or composite widget with frequency and bw settings, simple and advanced setup TX buttons...
|
//TODO: "TX box" view or composite widget with frequency and bw settings, simple and advanced setup TX buttons...
|
||||||
//TODO: Morse coder for foxhunts
|
//TODO: Morse coder for foxhunts
|
||||||
@ -57,7 +57,6 @@
|
|||||||
//TODO: CTCSS detector
|
//TODO: CTCSS detector
|
||||||
//TODO: DMR detector
|
//TODO: DMR detector
|
||||||
|
|
||||||
//TODO: SD card wiper
|
|
||||||
//TODO: GSM channel detector
|
//TODO: GSM channel detector
|
||||||
//TODO: SIGFOX RX/TX
|
//TODO: SIGFOX RX/TX
|
||||||
//TODO: Bodet :)
|
//TODO: Bodet :)
|
||||||
|
@ -27,14 +27,14 @@
|
|||||||
|
|
||||||
namespace sd_card {
|
namespace sd_card {
|
||||||
|
|
||||||
|
FATFS fs;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
bool card_present = false;
|
bool card_present = false;
|
||||||
|
|
||||||
Status status_ { Status::NotPresent };
|
Status status_ { Status::NotPresent };
|
||||||
|
|
||||||
FATFS fs;
|
|
||||||
|
|
||||||
FRESULT mount() {
|
FRESULT mount() {
|
||||||
return f_mount(&fs, "", 0);
|
return f_mount(&fs, "", 0);
|
||||||
}
|
}
|
||||||
|
@ -24,9 +24,12 @@
|
|||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "ff.h"
|
||||||
#include "signal.hpp"
|
#include "signal.hpp"
|
||||||
|
|
||||||
namespace sd_card {
|
namespace sd_card {
|
||||||
|
|
||||||
|
extern FATFS fs;
|
||||||
|
|
||||||
enum class Status : int32_t {
|
enum class Status : int32_t {
|
||||||
IOError = -3,
|
IOError = -3,
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
#include "audio.hpp"
|
#include "audio.hpp"
|
||||||
|
|
||||||
#include "ui_sd_card_debug.hpp"
|
// #include "ui_sd_card_debug.hpp"
|
||||||
|
|
||||||
namespace ui {
|
namespace ui {
|
||||||
|
|
||||||
@ -271,10 +271,10 @@ DebugPeripheralsMenuView::DebugPeripheralsMenuView(NavigationView& nav) {
|
|||||||
/* DebugMenuView *********************************************************/
|
/* DebugMenuView *********************************************************/
|
||||||
|
|
||||||
DebugMenuView::DebugMenuView(NavigationView& nav) {
|
DebugMenuView::DebugMenuView(NavigationView& nav) {
|
||||||
add_items<5>({ {
|
add_items<4>({ {
|
||||||
{ "Memory", ui::Color::white(), nullptr, [&nav](){ nav.push<DebugMemoryView>(); } },
|
{ "Memory", ui::Color::white(), nullptr, [&nav](){ nav.push<DebugMemoryView>(); } },
|
||||||
{ "Radio State", ui::Color::white(), nullptr, [&nav](){ nav.push<NotImplementedView>(); } },
|
{ "Radio State", ui::Color::white(), nullptr, [&nav](){ nav.push<NotImplementedView>(); } },
|
||||||
{ "SD Card", ui::Color::white(), nullptr, [&nav](){ nav.push<SDCardDebugView>(); } },
|
//{ "SD Card", ui::Color::white(), nullptr, [&nav](){ nav.push<SDCardDebugView>(); } },
|
||||||
{ "Peripherals", ui::Color::white(), nullptr, [&nav](){ nav.push<DebugPeripheralsMenuView>(); } },
|
{ "Peripherals", ui::Color::white(), nullptr, [&nav](){ nav.push<DebugPeripheralsMenuView>(); } },
|
||||||
{ "Temperature", ui::Color::white(), nullptr, [&nav](){ nav.push<TemperatureView>(); } },
|
{ "Temperature", ui::Color::white(), nullptr, [&nav](){ nav.push<TemperatureView>(); } },
|
||||||
} });
|
} });
|
||||||
|
@ -65,7 +65,11 @@ FrequencySaveView::FrequencySaveView(
|
|||||||
) : nav_ (nav),
|
) : nav_ (nav),
|
||||||
value_ (value)
|
value_ (value)
|
||||||
{
|
{
|
||||||
error = !load_freqman_file(frequencies);
|
File freqs_file;
|
||||||
|
|
||||||
|
if (!load_freqman_file(frequencies)) {
|
||||||
|
if (!create_freqman_file(freqs_file)) error = true;
|
||||||
|
}
|
||||||
|
|
||||||
signal_token_tick_second = time::signal_tick_second += [this]() {
|
signal_token_tick_second = time::signal_tick_second += [this]() {
|
||||||
this->on_tick_second();
|
this->on_tick_second();
|
||||||
|
@ -317,10 +317,11 @@ TransmitterAudioMenuView::TransmitterAudioMenuView(NavigationView& nav) {
|
|||||||
/* UtilitiesView *****************************************************************/
|
/* UtilitiesView *****************************************************************/
|
||||||
|
|
||||||
UtilitiesView::UtilitiesView(NavigationView& nav) {
|
UtilitiesView::UtilitiesView(NavigationView& nav) {
|
||||||
add_items<3>({ {
|
add_items<4>({ {
|
||||||
{ "Frequency manager", ui::Color::red(), nullptr, [&nav](){ nav.push<FreqManView>(); } },
|
{ "Frequency manager", ui::Color::green(), nullptr, [&nav](){ nav.push<FreqManView>(); } },
|
||||||
{ "Whip antenna length", ui::Color::green(), nullptr, [&nav](){ nav.push<WhipCalcView>(); } },
|
{ "Whip antenna length", ui::Color::yellow(),nullptr, [&nav](){ nav.push<WhipCalcView>(); } },
|
||||||
{ "Notepad", ui::Color::grey(), nullptr, [&nav](){ nav.push<NotImplementedView>(); } },
|
{ "Notepad", ui::Color::grey(), nullptr, [&nav](){ nav.push<NotImplementedView>(); } },
|
||||||
|
{ "Wipe SD card", ui::Color::red(), nullptr, [&nav](){ nav.push<WipeSDView>(); } },
|
||||||
} });
|
} });
|
||||||
on_left = [&nav](){ nav.pop(); };
|
on_left = [&nav](){ nav.pop(); };
|
||||||
}
|
}
|
||||||
@ -348,7 +349,7 @@ SystemMenuView::SystemMenuView(NavigationView& nav) {
|
|||||||
{ "Utilities", ui::Color::purple(),nullptr, [&nav](){ nav.push<UtilitiesView>(); } },
|
{ "Utilities", ui::Color::purple(),nullptr, [&nav](){ nav.push<UtilitiesView>(); } },
|
||||||
//{ "Analyze", ui::Color::white(), [&nav](){ nav.push<NotImplementedView>(); } },
|
//{ "Analyze", ui::Color::white(), [&nav](){ nav.push<NotImplementedView>(); } },
|
||||||
{ "Setup", ui::Color::white(), nullptr, [&nav](){ nav.push<SetupMenuView>(); } },
|
{ "Setup", ui::Color::white(), nullptr, [&nav](){ nav.push<SetupMenuView>(); } },
|
||||||
//{ "Debug", ui::Color::white(), [&nav](){ nav.push<DebugMenuView>(); } },
|
//{ "Debug", ui::Color::white(), nullptr, [&nav](){ nav.push<DebugMenuView>(); } },
|
||||||
{ "HackRF mode", ui::Color::white(), &bitmap_icon_hackrf, [this, &nav](){ hackrf_mode(nav); } },
|
{ "HackRF mode", ui::Color::white(), &bitmap_icon_hackrf, [this, &nav](){ hackrf_mode(nav); } },
|
||||||
{ "About", ui::Color::white(), nullptr, [&nav](){ nav.push<AboutView>(); } }
|
{ "About", ui::Color::white(), nullptr, [&nav](){ nav.push<AboutView>(); } }
|
||||||
} });
|
} });
|
||||||
@ -433,6 +434,45 @@ void BMPView::paint(Painter&) {
|
|||||||
portapack::display.drawBMP({(240 - 185) / 2, 0}, splash_bmp, false);
|
portapack::display.drawBMP({(240 - 185) / 2, 0}, splash_bmp, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* WipeSDView ************************************************************/
|
||||||
|
|
||||||
|
WipeSDView::WipeSDView(NavigationView& nav) : nav_ (nav) {
|
||||||
|
add_children({ {
|
||||||
|
&text_info,
|
||||||
|
&progress,
|
||||||
|
&dummy
|
||||||
|
} });
|
||||||
|
}
|
||||||
|
|
||||||
|
WipeSDView::~WipeSDView() {
|
||||||
|
if (thread) chThdTerminate(thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread* WipeSDView::thread { nullptr };
|
||||||
|
|
||||||
|
void WipeSDView::focus() {
|
||||||
|
BlockDeviceInfo block_device_info;
|
||||||
|
|
||||||
|
dummy.focus();
|
||||||
|
|
||||||
|
if (!confirmed) {
|
||||||
|
nav_.push<ModalMessageView>("Warning !", "Wipe first 32MB of SD card ?", YESCANCEL, [this](bool choice) {
|
||||||
|
if (choice)
|
||||||
|
confirmed = true;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
if (sdcGetInfo(&SDCD1, &block_device_info) == CH_SUCCESS) {
|
||||||
|
blocks = 32; // Only erase first 32MB (block_device_info.blk_size * uint64_t(block_device_info.blk_num)) / (1024 * 1024);
|
||||||
|
progress.set_max(blocks);
|
||||||
|
|
||||||
|
thread = chThdCreateFromHeap(NULL, 2048, NORMALPRIO + 10, WipeSDView::static_fn, this);
|
||||||
|
} else {
|
||||||
|
nav_.pop(); // Just silently abort for now
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* PlayDeadView **********************************************************/
|
/* PlayDeadView **********************************************************/
|
||||||
|
|
||||||
void PlayDeadView::focus() {
|
void PlayDeadView::focus() {
|
||||||
@ -450,6 +490,8 @@ void PlayDeadView::paint(Painter& painter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PlayDeadView::PlayDeadView(NavigationView& nav) {
|
PlayDeadView::PlayDeadView(NavigationView& nav) {
|
||||||
|
rtc::RTC datetime;
|
||||||
|
|
||||||
portapack::persistent_memory::set_playing_dead(0x5920C1DF); // Enable
|
portapack::persistent_memory::set_playing_dead(0x5920C1DF); // Enable
|
||||||
|
|
||||||
add_children({ {
|
add_children({ {
|
||||||
@ -459,6 +501,10 @@ PlayDeadView::PlayDeadView(NavigationView& nav) {
|
|||||||
&button_seq_entry,
|
&button_seq_entry,
|
||||||
} });
|
} });
|
||||||
|
|
||||||
|
// Seed from RTC
|
||||||
|
rtcGetTime(&RTCD1, &datetime);
|
||||||
|
text_playdead2.set("0x" + to_string_hex(lfsr_iterate(datetime.second()), 6) + "00");
|
||||||
|
|
||||||
text_playdead3.hidden(true);
|
text_playdead3.hidden(true);
|
||||||
|
|
||||||
button_seq_entry.on_dir = [this](Button&, KeyEvent key){
|
button_seq_entry.on_dir = [this](Button&, KeyEvent key){
|
||||||
@ -532,7 +578,21 @@ ModalMessageView::ModalMessageView(
|
|||||||
if (on_choice_) on_choice_(false);
|
if (on_choice_) on_choice_(false);
|
||||||
nav.pop();
|
nav.pop();
|
||||||
};
|
};
|
||||||
} else {
|
} else if (type == YESCANCEL) {
|
||||||
|
add_children({ {
|
||||||
|
&button_yes,
|
||||||
|
&button_no
|
||||||
|
} });
|
||||||
|
|
||||||
|
button_yes.on_select = [this, &nav](Button&){
|
||||||
|
if (on_choice_) on_choice_(true);
|
||||||
|
nav.pop();
|
||||||
|
};
|
||||||
|
button_no.on_select = [this, &nav](Button&){
|
||||||
|
//if (on_choice_) on_choice_(false);
|
||||||
|
nav.pop_modal();
|
||||||
|
};
|
||||||
|
} else { // ABORT
|
||||||
add_child(&button_ok);
|
add_child(&button_ok);
|
||||||
|
|
||||||
button_ok.on_select = [this, &nav](Button&){
|
button_ok.on_select = [this, &nav](Button&){
|
||||||
@ -554,7 +614,7 @@ void ModalMessageView::paint(Painter&) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ModalMessageView::focus() {
|
void ModalMessageView::focus() {
|
||||||
if (type_ == YESNO) {
|
if ((type_ == YESNO) || (type_ == YESCANCEL)) {
|
||||||
button_yes.focus();
|
button_yes.focus();
|
||||||
} else {
|
} else {
|
||||||
button_ok.focus();
|
button_ok.focus();
|
||||||
|
@ -34,15 +34,22 @@
|
|||||||
#include "ui_sd_card_status_view.hpp"
|
#include "ui_sd_card_status_view.hpp"
|
||||||
|
|
||||||
#include "bitmap.hpp"
|
#include "bitmap.hpp"
|
||||||
|
#include "ff.h"
|
||||||
|
#include "diskio.h"
|
||||||
|
#include "lfsr_random.hpp"
|
||||||
|
#include "sd_card.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
using namespace sd_card;
|
||||||
|
|
||||||
namespace ui {
|
namespace ui {
|
||||||
|
|
||||||
enum modal_t {
|
enum modal_t {
|
||||||
INFO = 0,
|
INFO = 0,
|
||||||
YESNO,
|
YESNO,
|
||||||
|
YESCANCEL,
|
||||||
ABORT
|
ABORT
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -167,6 +174,62 @@ private:
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class WipeSDView : public View {
|
||||||
|
public:
|
||||||
|
WipeSDView(NavigationView& nav);
|
||||||
|
~WipeSDView();
|
||||||
|
void focus() override;
|
||||||
|
|
||||||
|
std::string title() const override { return "SD card wipe"; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
NavigationView& nav_;
|
||||||
|
|
||||||
|
bool confirmed = false;
|
||||||
|
uint32_t blocks;
|
||||||
|
static Thread* thread;
|
||||||
|
|
||||||
|
static msg_t static_fn(void* arg) {
|
||||||
|
auto obj = static_cast<WipeSDView*>(arg);
|
||||||
|
obj->run();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void run() {
|
||||||
|
uint32_t n, b;
|
||||||
|
lfsr_word_t v = 1;
|
||||||
|
const auto buffer = std::make_unique<std::array<uint8_t, 16384>>();
|
||||||
|
|
||||||
|
for (b = 0; b < blocks; b++) {
|
||||||
|
progress.set_value(b);
|
||||||
|
|
||||||
|
lfsr_fill(v,
|
||||||
|
reinterpret_cast<lfsr_word_t*>(buffer->data()),
|
||||||
|
sizeof(*buffer.get()) / sizeof(lfsr_word_t));
|
||||||
|
|
||||||
|
// 1MB
|
||||||
|
for (n = 0; n < 64; n++) {
|
||||||
|
if (disk_write(sd_card::fs.drv, buffer->data(), n + (b * 64), 16384 / 512) != RES_OK) nav_.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nav_.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
Text text_info {
|
||||||
|
{ 10 * 8, 16 * 8, 10 * 8, 16 },
|
||||||
|
"Working..."
|
||||||
|
};
|
||||||
|
|
||||||
|
ProgressBar progress {
|
||||||
|
{ 2 * 8, 19 * 8, 26 * 8, 24 }
|
||||||
|
};
|
||||||
|
|
||||||
|
Button dummy {
|
||||||
|
{ 240, 0, 0, 0 },
|
||||||
|
""
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
class PlayDeadView : public View {
|
class PlayDeadView : public View {
|
||||||
public:
|
public:
|
||||||
PlayDeadView(NavigationView& nav);
|
PlayDeadView(NavigationView& nav);
|
||||||
@ -179,11 +242,11 @@ private:
|
|||||||
|
|
||||||
Text text_playdead1 {
|
Text text_playdead1 {
|
||||||
{ 6 * 8, 7 * 16, 14 * 8, 16 },
|
{ 6 * 8, 7 * 16, 14 * 8, 16 },
|
||||||
"Firmware error"
|
"\x46irmwa" "re " "er\x72o\x72"
|
||||||
};
|
};
|
||||||
Text text_playdead2 {
|
Text text_playdead2 {
|
||||||
{ 6 * 8, 9 * 16, 16 * 8, 16 },
|
{ 6 * 8, 9 * 16, 16 * 8, 16 },
|
||||||
"0x1400_0000 : 2C"
|
""
|
||||||
};
|
};
|
||||||
Text text_playdead3 {
|
Text text_playdead3 {
|
||||||
{ 6 * 8, 12 * 16, 16 * 8, 16 },
|
{ 6 * 8, 12 * 16, 16 * 8, 16 },
|
||||||
|
@ -53,6 +53,7 @@ void NuoptixView::transmit(bool setup) {
|
|||||||
uint8_t mod, tone_code;
|
uint8_t mod, tone_code;
|
||||||
uint8_t c;
|
uint8_t c;
|
||||||
uint8_t dtmf_message[6];
|
uint8_t dtmf_message[6];
|
||||||
|
rtc::RTC datetime;
|
||||||
|
|
||||||
if (!tx_mode) {
|
if (!tx_mode) {
|
||||||
transmitter_model.disable();
|
transmitter_model.disable();
|
||||||
|
@ -90,7 +90,6 @@ private:
|
|||||||
void transmit(bool setup);
|
void transmit(bool setup);
|
||||||
|
|
||||||
uint32_t timecode;
|
uint32_t timecode;
|
||||||
rtc::RTC datetime;
|
|
||||||
|
|
||||||
FrequencyField field_frequency {
|
FrequencyField field_frequency {
|
||||||
{ 1 * 8, 4 },
|
{ 1 * 8, 4 },
|
||||||
|
@ -459,7 +459,7 @@ void ProgressBar::set_value(const uint32_t value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ProgressBar::paint(Painter& painter) {
|
void ProgressBar::paint(Painter& painter) {
|
||||||
uint16_t v_sized;
|
uint32_t v_sized;
|
||||||
|
|
||||||
const auto rect = screen_rect();
|
const auto rect = screen_rect();
|
||||||
const auto s = style();
|
const auto s = style();
|
||||||
|
Before Width: | Height: | Size: 133 B After Width: | Height: | Size: 133 B |
Before Width: | Height: | Size: 134 B After Width: | Height: | Size: 134 B |
Before Width: | Height: | Size: 137 B After Width: | Height: | Size: 137 B |
Before Width: | Height: | Size: 127 B After Width: | Height: | Size: 127 B |
Before Width: | Height: | Size: 145 B After Width: | Height: | Size: 145 B |
Before Width: | Height: | Size: 138 B After Width: | Height: | Size: 138 B |
Before Width: | Height: | Size: 143 B After Width: | Height: | Size: 143 B |
Before Width: | Height: | Size: 146 B After Width: | Height: | Size: 146 B |
Before Width: | Height: | Size: 153 B After Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 133 B After Width: | Height: | Size: 133 B |
Before Width: | Height: | Size: 173 B After Width: | Height: | Size: 173 B |
Before Width: | Height: | Size: 114 B After Width: | Height: | Size: 114 B |
Before Width: | Height: | Size: 135 B After Width: | Height: | Size: 135 B |
Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 117 B |
Before Width: | Height: | Size: 155 B After Width: | Height: | Size: 155 B |
Before Width: | Height: | Size: 129 B After Width: | Height: | Size: 129 B |
Before Width: | Height: | Size: 127 B After Width: | Height: | Size: 127 B |
Before Width: | Height: | Size: 132 B After Width: | Height: | Size: 132 B |
Before Width: | Height: | Size: 131 B After Width: | Height: | Size: 131 B |
Before Width: | Height: | Size: 141 B After Width: | Height: | Size: 141 B |
Before Width: | Height: | Size: 112 B After Width: | Height: | Size: 112 B |
Before Width: | Height: | Size: 109 B After Width: | Height: | Size: 109 B |
Before Width: | Height: | Size: 157 B After Width: | Height: | Size: 157 B |
Before Width: | Height: | Size: 144 B After Width: | Height: | Size: 144 B |
Before Width: | Height: | Size: 522 B After Width: | Height: | Size: 522 B |
Before Width: | Height: | Size: 478 B After Width: | Height: | Size: 478 B |
Before Width: | Height: | Size: 510 B After Width: | Height: | Size: 510 B |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
0
firmware/application/bitmaps/splash.bmp → firmware/graphics/havoc_splash.bmp
Normal file → Executable file
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 830 B After Width: | Height: | Size: 830 B |
BIN
firmware/graphics/splash.bmp
Normal file
After Width: | Height: | Size: 12 KiB |