mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2025-08-25 15:37:49 +00:00
Date and time display widget
Disabled handwriting text input (not that useful for now) Bugfix: Trim long filenames in fileman Slight cleanup of 7-seg display widget
This commit is contained in:
@@ -405,6 +405,45 @@ void Labels::paint(Painter& painter) {
|
||||
}
|
||||
}
|
||||
|
||||
/* LiveDateTime **********************************************************/
|
||||
|
||||
void LiveDateTime::on_tick_second() {
|
||||
rtcGetTime(&RTCD1, &datetime);
|
||||
|
||||
text = to_string_dec_uint(datetime.month(), 2, '0') + "/" + to_string_dec_uint(datetime.day(), 2, '0') + " " +
|
||||
to_string_dec_uint(datetime.hour(), 2, '0') + ":" + to_string_dec_uint(datetime.minute(), 2, '0');
|
||||
|
||||
set_dirty();
|
||||
}
|
||||
|
||||
LiveDateTime::LiveDateTime(
|
||||
Rect parent_rect
|
||||
) : Widget { parent_rect }
|
||||
{
|
||||
signal_token_tick_second = rtc_time::signal_tick_second += [this]() {
|
||||
this->on_tick_second();
|
||||
};
|
||||
}
|
||||
|
||||
LiveDateTime::~LiveDateTime() {
|
||||
rtc_time::signal_tick_second -= signal_token_tick_second;
|
||||
}
|
||||
|
||||
void LiveDateTime::paint(Painter& painter) {
|
||||
const auto rect = screen_rect();
|
||||
const auto s = style();
|
||||
|
||||
on_tick_second();
|
||||
|
||||
painter.fill_rectangle(rect, s.background);
|
||||
|
||||
painter.draw_string(
|
||||
rect.location(),
|
||||
s,
|
||||
text
|
||||
);
|
||||
}
|
||||
|
||||
/* BigFrequency **********************************************************/
|
||||
|
||||
BigFrequency::BigFrequency(
|
||||
@@ -422,21 +461,22 @@ void BigFrequency::set(const rf::Frequency frequency) {
|
||||
|
||||
void BigFrequency::paint(Painter& painter) {
|
||||
uint32_t i, digit_def;
|
||||
char digits[7];
|
||||
std::array<char, 7> digits;
|
||||
char digit;
|
||||
Coord digit_x, digit_y;
|
||||
Point digit_pos;
|
||||
ui::Color segment_color;
|
||||
|
||||
const auto rect = screen_rect();
|
||||
|
||||
// Erase
|
||||
painter.fill_rectangle({{0, rect.location().y()}, {240, 52}}, ui::Color::black());
|
||||
painter.fill_rectangle({ { 0, rect.location().y() }, { 240, 52 } }, ui::Color::black());
|
||||
|
||||
// Prepare digits
|
||||
if (!_frequency) {
|
||||
for (i = 0; i < 7; i++) // ----.------
|
||||
digits[i] = 10;
|
||||
digits.fill(10); // ----.---
|
||||
digit_pos = { 0, rect.location().y() };
|
||||
} else {
|
||||
_frequency /= 1000; // GMMM.KKKuuu
|
||||
_frequency /= 1000; // GMMM.KKK(uuu)
|
||||
|
||||
for (i = 0; i < 7; i++) {
|
||||
digits[6 - i] = _frequency % 10;
|
||||
@@ -444,37 +484,38 @@ void BigFrequency::paint(Painter& painter) {
|
||||
}
|
||||
|
||||
// Remove leading zeros
|
||||
for (i = 0; i < 7; i++) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (!digits[i])
|
||||
digits[i] = 16; // "Don't draw" code
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
digit_pos = { (240 - ((7 * digit_width) + 8) - (i * digit_width)) / 2, rect.location().y() };
|
||||
}
|
||||
|
||||
segment_color = style().foreground;
|
||||
|
||||
// Draw
|
||||
digit_x = rect.location().x(); // 7 * 32 + 8 = 232 (4 px margins)
|
||||
for (i = 0; i < 7; i++) {
|
||||
digit = digits[i];
|
||||
digit_y = rect.location().y();
|
||||
|
||||
if (digit < 16) {
|
||||
digit_def = segment_font[(uint8_t)digit];
|
||||
if (digit_def & 0x01) painter.fill_rectangle({{digit_x + 4, digit_y}, {20, 4}}, segment_color);
|
||||
if (digit_def & 0x02) painter.fill_rectangle({{digit_x + 24, digit_y + 4}, {4, 20}}, segment_color);
|
||||
if (digit_def & 0x04) painter.fill_rectangle({{digit_x + 24, digit_y + 28}, {4, 20}}, segment_color);
|
||||
if (digit_def & 0x08) painter.fill_rectangle({{digit_x + 4, digit_y + 48}, {20, 4}}, segment_color);
|
||||
if (digit_def & 0x10) painter.fill_rectangle({{digit_x, digit_y + 28}, {4, 20}}, segment_color);
|
||||
if (digit_def & 0x20) painter.fill_rectangle({{digit_x, digit_y + 4}, {4, 20}}, segment_color);
|
||||
if (digit_def & 0x40) painter.fill_rectangle({{digit_x + 4, digit_y + 24}, {20, 4}}, segment_color);
|
||||
|
||||
for (size_t s = 0; s < 7; s++) {
|
||||
if (digit_def & 1)
|
||||
painter.fill_rectangle({ digit_pos + segments[s].location(), segments[s].size() }, segment_color);
|
||||
digit_def >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == 3) {
|
||||
// Dot
|
||||
painter.fill_rectangle({{digit_x + 34, digit_y + 48}, {4, 4}}, segment_color);
|
||||
digit_x += 40;
|
||||
painter.fill_rectangle({ digit_pos + Point(34, 48), { 4, 4 } }, segment_color);
|
||||
digit_pos += { (digit_width + 8), 0 };
|
||||
} else {
|
||||
digit_x += 32;
|
||||
digit_pos += { digit_width, 0 };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -28,6 +28,7 @@
|
||||
#include "ui_painter.hpp"
|
||||
#include "ui_focus.hpp"
|
||||
#include "ui_font_fixed_8x16.hpp"
|
||||
#include "rtc_time.hpp"
|
||||
#include "radio.hpp"
|
||||
|
||||
#include "portapack.hpp"
|
||||
@@ -235,6 +236,25 @@ private:
|
||||
std::vector<Label> labels_;
|
||||
};
|
||||
|
||||
class LiveDateTime : public Widget {
|
||||
public:
|
||||
LiveDateTime(Rect parent_rect);
|
||||
~LiveDateTime();
|
||||
|
||||
void paint(Painter& painter) override;
|
||||
|
||||
std::string& string() {
|
||||
return text;
|
||||
}
|
||||
|
||||
private:
|
||||
void on_tick_second();
|
||||
|
||||
rtc::RTC datetime { };
|
||||
SignalToken signal_token_tick_second { };
|
||||
std::string text { };
|
||||
};
|
||||
|
||||
class BigFrequency : public Widget {
|
||||
public:
|
||||
BigFrequency(Rect parent_rect, rf::Frequency frequency);
|
||||
@@ -246,6 +266,8 @@ public:
|
||||
private:
|
||||
rf::Frequency _frequency;
|
||||
|
||||
static constexpr Dim digit_width = 32;
|
||||
|
||||
const uint8_t segment_font[11] = {
|
||||
0b00111111, // 0: ABCDEF
|
||||
0b00000110, // 1: AB
|
||||
@@ -259,6 +281,16 @@ private:
|
||||
0b01101111, // 9: ABCDFG
|
||||
0b01000000 // -: G
|
||||
};
|
||||
|
||||
const Rect segments[7] = {
|
||||
{{4, 0}, {20, 4}},
|
||||
{{24, 4}, {4, 20}},
|
||||
{{24, 28}, {4, 20}},
|
||||
{{4, 48}, {20, 4}},
|
||||
{{0, 28}, {4, 20}},
|
||||
{{0, 4}, {4, 20}},
|
||||
{{4, 24}, {20, 4}}
|
||||
};
|
||||
};
|
||||
|
||||
class ProgressBar : public Widget {
|
||||
|
Reference in New Issue
Block a user