0
0
Fork 0
mirror of https://github.com/MarlinFirmware/Marlin.git synced 2025-01-31 06:02:16 +00:00

🚸 Update FTDI Eve / CocoaPress UI (#26233)

This commit is contained in:
Marcio T 2023-10-12 10:14:58 -06:00 committed by GitHub
parent e7e77d9612
commit 7f887f2342
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
36 changed files with 1567 additions and 500 deletions

View file

@ -0,0 +1,134 @@
/****************************************************************************
* 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 3 of the License, 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. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
/**
* This file was auto-generated using "svg2cpp.pl"
*
* The encoding consists of x,y pairs with the min and max scaled to
* 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the
* start of a new closed path.
*/
#pragma once
constexpr float x_min = 0.000000;
constexpr float x_max = 480.000000;
constexpr float y_min = 0.000000;
constexpr float y_max = 272.000000;
const PROGMEM uint16_t outline[] = {
0x8278, 0xC8E7, 0x7714, 0xC659, 0x6D20, 0xC0EF, 0x64D1, 0xB8D4, 0x5E5F, 0xAE2F,
0x5AF5, 0xA493, 0x58F2, 0x99F6, 0x5886, 0x8B4E, 0x590F, 0x7956, 0x5997, 0x69F3,
0x5B46, 0x5E96, 0x5E92, 0x5430, 0x6363, 0x4AF8, 0x69A4, 0x4327, 0x6F5B, 0x3E4A,
0x7871, 0x3979, 0x82A1, 0x371E, 0x8CBB, 0x3756, 0x95A1, 0x3997, 0x9D90, 0x3D88,
0xA50B, 0x43B6, 0xA6BC, 0x46C9, 0xA776, 0x4A42, 0xA669, 0x6D96, 0xA54B, 0x71E5,
0xA030, 0x7B45, 0x9ECB, 0x7CC5, 0x9B2C, 0x7E1D, 0x9717, 0x7C80, 0x9521, 0x7B11,
0x8FAD, 0x77D6, 0x8A1D, 0x7607, 0x82E0, 0x7609, 0x7CDD, 0x7812, 0x77F3, 0x7C15,
0x75EF, 0x7EC5, 0x7830, 0x8278, 0x7D94, 0x8772, 0x847F, 0x8A0B, 0x8B98, 0x89F7,
0x9127, 0x8806, 0x96AB, 0x849C, 0x9C6D, 0x81F2, 0x9F8E, 0x82E5, 0xA22C, 0x85FF,
0xA63C, 0x8D9E, 0xA78B, 0x931F, 0xA68F, 0xB5E2, 0xA5D0, 0xB944, 0xA430, 0xBC3E,
0x9E55, 0xC146, 0x94CA, 0xC660, 0x8A75, 0xC8DB, 0x8278, 0xC8E7, 0x8278, 0xC8E7
};
const PROGMEM uint16_t shadow[] = {
0x8699, 0x52F4, 0x807A, 0x5409, 0x7A89, 0x576A, 0x7583, 0x5D79, 0x7227, 0x6695,
0x714B, 0x70C7, 0x71C8, 0x75DB, 0x730A, 0x7A69, 0x7496, 0x7A0E, 0x7601, 0x787F,
0x78EF, 0x7565, 0x80E9, 0x7178, 0x8924, 0x7108, 0x914E, 0x7393, 0x9914, 0x789A,
0x9B62, 0x792D, 0x9D8A, 0x7823, 0xA0FE, 0x72DA, 0xA34C, 0x6DC9, 0xA3D7, 0x6766,
0xA42B, 0x5E98, 0xA3FD, 0x55F8, 0xA279, 0x55CE, 0xA12E, 0x578E, 0x9FE2, 0x59BB,
0x9E59, 0x5AD8, 0x9AAC, 0x5AE1, 0x9728, 0x58ED, 0x9019, 0x54A3, 0x8699, 0x52F4,
0x8699, 0x52F4, 0xFFFF, 0x5CA3, 0x849F, 0x5B93, 0x8686, 0x5B52, 0x896F, 0x5B3F,
0x8FA9, 0x5C60, 0x9D67, 0x6003, 0xA994, 0x6582, 0xB393, 0x6C3B, 0xBAC7, 0x7604,
0xC0E2, 0x8047, 0xC3D1, 0x8AB3, 0xC3DC, 0x94FB, 0xC14A, 0x9C85, 0xBD52, 0xA35D,
0xB6C2, 0xA41B, 0xABC2, 0xA460, 0xA092, 0xA416, 0x9C7C, 0xA33E, 0x9B91, 0xA20E,
0x9C3C, 0x9618, 0xA353, 0x8992, 0xA62E, 0x7CED, 0xA4E9, 0x7097, 0x9FA2, 0x6ADE,
0x9B4F, 0x65A4, 0x9557, 0x6117, 0x8DDF, 0x5D63, 0x850D, 0x5CA3, 0x849F, 0x5CA3,
0x849F
};
const PROGMEM uint16_t highlight[] = {
0x861C, 0x5348, 0x8243, 0x53C6, 0x7EBF, 0x5693, 0x7C12, 0x5B55, 0x7ABE, 0x61B3,
0x7AFC, 0x6656, 0x7C42, 0x6A49, 0x7FB1, 0x7163, 0x862A, 0x7090, 0x8C99, 0x717A,
0x92E2, 0x740A, 0x98E8, 0x782A, 0x9AB3, 0x7852, 0x9C22, 0x7665, 0x9E0C, 0x7087,
0x9E69, 0x65BE, 0x9C07, 0x5BDE, 0x9319, 0x568D, 0x8E92, 0x544E, 0x89E2, 0x534D,
0x861C, 0x5348, 0x861C, 0x5348, 0xFFFF, 0x6B6A, 0x9CA0, 0x69D9, 0x9F11, 0x695E,
0xA2AD, 0x6A25, 0xAA51, 0x6DB0, 0xBBAA, 0x785A, 0xC170, 0x8372, 0xC3D0, 0x8E9F,
0xC2E2, 0x9987, 0xBEBD, 0x9CAB, 0xBCE9, 0x9EFE, 0xB9D2, 0x9E63, 0xB379, 0x9CE9,
0xAD92, 0x98DE, 0xA2B8, 0x8D7F, 0xA5FA, 0x81FE, 0xA636, 0x76A6, 0xA32E, 0x6BC5,
0x9CA0, 0x6B6A, 0x9CA0, 0x6B6A, 0x9CA0
};
const PROGMEM uint16_t stroke[] = {
0x8282, 0xC890, 0x7A14, 0xC6FB, 0x7257, 0xC3D9, 0x6B6A, 0xBF38, 0x6569, 0xB928,
0x5E84, 0xADEC, 0x5B1E, 0xA460, 0x5926, 0x99F8, 0x58A5, 0x90C0, 0x59B6, 0x6B3D,
0x5B4C, 0x5F6C, 0x5EA3, 0x549E, 0x63A2, 0x4B13, 0x6A2E, 0x430B, 0x71D8, 0x3D0C,
0x7A7A, 0x3923, 0x83D5, 0x3761, 0x8DAA, 0x37DB, 0x98A8, 0x3B38, 0xA283, 0x4193,
0xA638, 0x4620, 0xA741, 0x4B64, 0xA6C5, 0x5D20, 0xA613, 0x6E81, 0xA43A, 0x738A,
0xA01F, 0x7AE8, 0x9DE9, 0x7D0E, 0x9B69, 0x7DBD, 0x9629, 0x7B6D, 0x905C, 0x77C9,
0x8A94, 0x75BF, 0x8402, 0x7587, 0x7E52, 0x76FE, 0x79CA, 0x79CE, 0x75B1, 0x7EC7,
0x780B, 0x82C0, 0x7C5E, 0x8702, 0x8193, 0x89A9, 0x8702, 0x8AA4, 0x8C76, 0x8A18,
0x91F2, 0x8803, 0x977B, 0x8464, 0x9C8C, 0x825E, 0x9EAF, 0x82C4, 0xA0FC, 0x84BC,
0xA3C6, 0x8965, 0xA6CF, 0x8FEF, 0xA756, 0x9463, 0xA6DA, 0xA612, 0xA5DF, 0xB86B,
0xA414, 0xBBE7, 0xA03D, 0xBF7C, 0x9648, 0xC56A, 0x8B45, 0xC86E, 0x8282, 0xC890,
0x8282, 0xC890, 0xFFFF, 0x89EE, 0xC221, 0x9395, 0xBFE8, 0x9C6D, 0xBB4F, 0xA047,
0xB837, 0xA298, 0xB561, 0xA30A, 0xAA1F, 0xA34B, 0x9D6D, 0xA204, 0x9E54, 0x9820,
0xA474, 0x960F, 0xA542, 0x886E, 0xA808, 0x803F, 0xA783, 0x785E, 0xA57C, 0x703C,
0xA168, 0x691E, 0x9BB9, 0x623D, 0x92BA, 0x5D27, 0x8795, 0x5C9D, 0x868D, 0x5C4D,
0x90BE, 0x5DBC, 0x9E89, 0x6126, 0xA944, 0x6630, 0xB207, 0x6CB0, 0xB914, 0x6E6F,
0xBA8C, 0x7080, 0xBC05, 0x78E3, 0xC016, 0x8263, 0xC21E, 0x89EE, 0xC221, 0x89EE,
0xC221, 0xFFFF, 0x8CBB, 0xA14B, 0x9726, 0x9E32, 0xA086, 0x9855, 0xA324, 0x95C0,
0xA39A, 0x92E9, 0xA121, 0x8DC2, 0x9E86, 0x8984, 0x9C63, 0x88AD, 0x98A6, 0x8A73,
0x8FB6, 0x8F97, 0x86EE, 0x90FB, 0x804C, 0x8FBC, 0x7A84, 0x8C98, 0x7476, 0x85CD,
0x706D, 0x7C88, 0x6EAA, 0x7064, 0x6EFF, 0x6929, 0x7056, 0x624A, 0x73DB, 0x59D0,
0x76F3, 0x5586, 0x7AA5, 0x523E, 0x83F8, 0x4E97, 0x8B83, 0x4EA9, 0x9221, 0x50DF,
0x98F7, 0x552D, 0x9C44, 0x56AE, 0x9DAF, 0x5652, 0xA12C, 0x5116, 0xA370, 0x4C6E,
0xA381, 0x4A6D, 0xA10D, 0x4772, 0x985F, 0x41B3, 0x8EB8, 0x3E71, 0x8631, 0x3DA9,
0x7DFC, 0x3EA4, 0x7645, 0x4159, 0x6F3D, 0x45BB, 0x6952, 0x4B6F, 0x646A, 0x529B,
0x60B0, 0x5AA7, 0x5E57, 0x6375, 0x5D39, 0x6ED1, 0x5E1E, 0x7B35, 0x6120, 0x8666,
0x6620, 0x9016, 0x6D01, 0x97F7, 0x7747, 0x9E7A, 0x83D9, 0xA18C, 0x8CBB, 0xA14B,
0x8CBB, 0xA14B, 0xFFFF, 0x7481, 0x77DA, 0x793F, 0x7317, 0x7EE3, 0x701D, 0x8044,
0x6FBD, 0x81B4, 0x6F76, 0x846C, 0x6F18, 0x8E1D, 0x7044, 0x97FF, 0x75D2, 0x9B2B,
0x772F, 0x9DAF, 0x75F3, 0xA26D, 0x6D0E, 0xA2E9, 0x62B8, 0xA33C, 0x583A, 0xA31E,
0x573E, 0xA252, 0x5871, 0x9FC0, 0x5BDB, 0x9CD5, 0x5D2A, 0x9751, 0x5AEC, 0x914A,
0x5720, 0x8B83, 0x5519, 0x83E3, 0x5506, 0x7ECB, 0x56B4, 0x7A0F, 0x59E9, 0x765D,
0x5E9D, 0x73CE, 0x64A3, 0x727C, 0x6BCF, 0x7286, 0x72FD, 0x73A3, 0x78D6, 0x7481,
0x77DA, 0x7481, 0x77DA
};
const PROGMEM uint16_t surface[] = {
0x8CBB, 0xA14B, 0x9726, 0x9E32, 0xA086, 0x9855, 0xA324, 0x95C0, 0xA39A, 0x92E9,
0xA121, 0x8DC2, 0x9E86, 0x8984, 0x9C63, 0x88AD, 0x98A6, 0x8A73, 0x8FB6, 0x8F97,
0x86EE, 0x90FB, 0x804C, 0x8FBC, 0x7A84, 0x8C98, 0x7476, 0x85CD, 0x706D, 0x7C88,
0x6EAA, 0x7064, 0x6EFF, 0x6929, 0x7056, 0x624A, 0x73DB, 0x59D0, 0x76F3, 0x5586,
0x7AA5, 0x523E, 0x83F8, 0x4E97, 0x8B83, 0x4EA9, 0x9221, 0x50DF, 0x98F7, 0x552D,
0x9C44, 0x56AE, 0x9DAF, 0x5652, 0xA12C, 0x5116, 0xA370, 0x4C6E, 0xA381, 0x4A6D,
0xA10D, 0x4772, 0x985F, 0x41B3, 0x8EB8, 0x3E71, 0x8631, 0x3DA9, 0x7DFC, 0x3EA4,
0x7645, 0x4159, 0x6F3D, 0x45BB, 0x6952, 0x4B6F, 0x646A, 0x529B, 0x60B0, 0x5AA7,
0x5E57, 0x6375, 0x5D39, 0x6ED1, 0x5E1E, 0x7B35, 0x6120, 0x8666, 0x6620, 0x9016,
0x6D01, 0x97F7, 0x7747, 0x9E7A, 0x83D9, 0xA18C, 0x8CBB, 0xA14B, 0x8CBB, 0xA14B
};
//#define LOGO_BACKGROUND 0xF05A22
#define LOGO_BACKGROUND 0xFFFFFF
#define LOGO_PAINT_PATHS \
LOGO_PAINT_PATH(0xF27121, surface) \
LOGO_PAINT_PATH(0x6B2C1B, shadow) \
LOGO_PAINT_PATH(0xBC3E26, highlight) \
LOGO_PAINT_PATH(0x3C2215, stroke)

View file

@ -0,0 +1,116 @@
/********************
* about_screen.cpp *
********************/
/****************************************************************************
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
* *
* 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 3 of the License, 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. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <https://www.gnu.org/licenses/>. *
****************************************************************************/
#include "../config.h"
#include "../screens.h"
#ifdef COCOA_ABOUT_SCREEN
#define GRID_COLS 4
#define GRID_ROWS 8
using namespace FTDI;
using namespace Theme;
using namespace ExtUI;
void AboutScreen::onEntry() {
BaseScreen::onEntry();
sound.play(chimes, PLAY_ASYNCHRONOUS);
}
void AboutScreen::onRedraw(draw_mode_t) {
CommandProcessor cmd;
cmd.cmd(CLEAR_COLOR_RGB(bg_color))
.cmd(CLEAR(true,true,true))
.cmd(COLOR_RGB(bg_text_enabled))
.tag(0);
#define HEADING_POS BTN_POS(1,1), BTN_SIZE(4,2)
#define FW_VERS_POS BTN_POS(1,3), BTN_SIZE(4,1)
#define FW_INFO_POS BTN_POS(1,4), BTN_SIZE(4,1)
#define LICENSE_POS BTN_POS(1,5), BTN_SIZE(4,3)
#define STATS_POS BTN_POS(1,8), BTN_SIZE(2,1)
#define BACK_POS BTN_POS(3,8), BTN_SIZE(2,1)
char about_str[1
+ strlen_P(GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2))
#ifdef TOOLHEAD_NAME
+ strlen_P(TOOLHEAD_NAME)
#endif
];
#ifdef TOOLHEAD_NAME
// If MSG_ABOUT_TOUCH_PANEL_2 has %s, substitute in the toolhead name.
// But this is optional, so squelch the compiler warning here.
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-extra-args"
sprintf_P(about_str, GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2), TOOLHEAD_NAME);
#pragma GCC diagnostic pop
#else
strcpy_P(about_str, GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2));
#endif
draw_text_box(cmd, HEADING_POS,
#ifdef MACHINE_NAME
F(MACHINE_NAME)
#else
GET_TEXT_F(MSG_ABOUT_TOUCH_PANEL_1)
#endif
, OPT_CENTER, font_xlarge
);
#if ALL(TOUCH_UI_DEVELOPER_MENU, FTDI_DEVELOPER_MENU)
cmd.tag(3);
#endif
draw_text_box(cmd, FW_VERS_POS,
#ifdef TOUCH_UI_VERSION
F(TOUCH_UI_VERSION)
#else
FPSTR(getFirmwareName_str())
#endif
, OPT_CENTER, font_medium);
cmd.tag(0);
draw_text_box(cmd, FW_INFO_POS, about_str, OPT_CENTER, font_medium);
draw_text_box(cmd, LICENSE_POS, GET_TEXT_F(MSG_LICENSE), OPT_CENTER, font_tiny);
cmd.font(font_medium);
#if ENABLED(PRINTCOUNTER)
cmd.colors(normal_btn)
.tag(2).button(STATS_POS, GET_TEXT_F(MSG_INFO_STATS_MENU));
#endif
cmd.colors(action_btn)
.tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE));
}
bool AboutScreen::onTouchEnd(uint8_t tag) {
switch (tag) {
case 1: GOTO_PREVIOUS(); break;
#if ENABLED(PRINTCOUNTER)
case 2: GOTO_SCREEN(StatisticsScreen); break;
#endif
#if ALL(TOUCH_UI_DEVELOPER_MENU, FTDI_DEVELOPER_MENU)
case 3: GOTO_SCREEN(DeveloperMenu); break;
#endif
default: return false;
}
return true;
}
#endif // COCOA_ABOUT_SCREEN

View file

@ -0,0 +1,33 @@
/******************
* about_screen.h *
******************/
/****************************************************************************
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
* *
* 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 3 of the License, 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. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <https://www.gnu.org/licenses/>. *
****************************************************************************/
#pragma once
#define COCOA_ABOUT_SCREEN
#define COCOA_ABOUT_SCREEN_CLASS AboutScreen
class AboutScreen : public BaseScreen, public UncachedScreen {
public:
static void onEntry();
static void onRedraw(draw_mode_t);
static bool onTouchEnd(uint8_t tag);
};

View file

@ -0,0 +1,248 @@
const unsigned char cocoa_press_ui[2941] PROGMEM = {
0x78, 0x9C, 0xED, 0xDD, 0x3B, 0x96, 0xA3, 0xC8, 0xB6, 0x00, 0xD0, 0xC9,
0x68, 0x28, 0x1A, 0x0A, 0x06, 0x3D, 0x8F, 0x34, 0x24, 0x83, 0x59, 0x94,
0x91, 0x8E, 0x0C, 0x30, 0x34, 0x86, 0x32, 0xCA, 0x2A, 0x03, 0x23, 0x99,
0x42, 0x8D, 0xE0, 0x62, 0xE8, 0x0A, 0x21, 0x20, 0x22, 0xF8, 0x54, 0xF6,
0xBA, 0x6F, 0x3D, 0xA5, 0x52, 0x7B, 0x1B, 0xDD, 0x29, 0x50, 0xA0, 0xA0,
0xD7, 0x39, 0xC4, 0x0F, 0xE8, 0xCB, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0,
0xFF, 0x48, 0x5B, 0xFF, 0x2E, 0xCB, 0xBA, 0x6E, 0x1F, 0x5D, 0x0F, 0xF8,
0x62, 0xDA, 0xF2, 0xB0, 0xDF, 0xEF, 0x06, 0xFB, 0xBC, 0xA8, 0x1F, 0x5D,
0x23, 0xF8, 0x2A, 0xCA, 0xEC, 0x96, 0x15, 0xFB, 0x2C, 0x3B, 0x1C, 0xB2,
0xAC, 0x4F, 0x94, 0xFD, 0x41, 0x8A, 0xC0, 0xE5, 0x72, 0xDA, 0x77, 0xD9,
0xF0, 0xFE, 0xEB, 0xCF, 0xE4, 0xFD, 0xD0, 0x65, 0xCC, 0xBE, 0x7C, 0x74,
0xD5, 0xE0, 0xC1, 0xEA, 0x6B, 0x76, 0x64, 0x3F, 0xFF, 0xCC, 0xBD, 0x5F,
0x77, 0xE4, 0x8F, 0xAE, 0x1D, 0x3C, 0x54, 0x71, 0xCD, 0x8E, 0x5F, 0x0B,
0xD9, 0x71, 0xCF, 0x90, 0xD3, 0xA3, 0xEB, 0x07, 0x0F, 0x94, 0xEF, 0xF6,
0xEF, 0x2B, 0xD9, 0xD1, 0x25, 0xC8, 0xEE, 0xB0, 0x5E, 0xB4, 0x29, 0x8F,
0x79, 0x96, 0xE5, 0xC7, 0x72, 0x71, 0x9C, 0x52, 0x17, 0xC7, 0xEC, 0x3A,
0x9C, 0x29, 0xAA, 0xD5, 0xD9, 0xB0, 0xA6, 0xDA, 0x2C, 0x7F, 0xEA, 0xF7,
0xAE, 0x96, 0xAF, 0xCA, 0xAB, 0x8F, 0x8D, 0x53, 0xBB, 0x1D, 0xA5, 0x1C,
0x54, 0xE9, 0xB4, 0x5C, 0x53, 0x0D, 0x7B, 0x66, 0xBB, 0x2E, 0x6D, 0x55,
0x06, 0xAA, 0xF4, 0xCC, 0xAE, 0x15, 0xCB, 0x96, 0xAA, 0x5D, 0x75, 0xA7,
0x9C, 0x6F, 0x9C, 0x32, 0x4F, 0xE6, 0xB0, 0xDB, 0x4F, 0x8D, 0xC7, 0xAF,
0xF7, 0x6E, 0x6C, 0xBE, 0xCF, 0xDE, 0x86, 0xA1, 0xC8, 0xAF, 0xFD, 0xAE,
0x58, 0x2B, 0x59, 0x77, 0x41, 0x32, 0xA8, 0xD2, 0xBD, 0x65, 0xB0, 0xF3,
0xD8, 0xFC, 0xFB, 0xF2, 0xD5, 0x5F, 0xCB, 0x1F, 0xFB, 0x9D, 0xDB, 0x09,
0x72, 0xCE, 0xB2, 0xD5, 0x03, 0x45, 0xBB, 0x92, 0x1A, 0xC4, 0xFB, 0xB2,
0xF0, 0x3F, 0xC2, 0x47, 0xBE, 0x56, 0x28, 0x38, 0xE7, 0x42, 0x86, 0x7C,
0x0B, 0x45, 0x90, 0x1E, 0xEF, 0xD3, 0xF4, 0x6E, 0x37, 0x5C, 0xEF, 0xB6,
0x5F, 0xB7, 0xAC, 0xE5, 0xC7, 0x31, 0x8E, 0xA0, 0x3C, 0x0A, 0xBD, 0x3A,
0x89, 0xAF, 0x85, 0x4E, 0xDA, 0x66, 0xF9, 0x8F, 0x8D, 0xF8, 0xBC, 0x6B,
0xD7, 0x77, 0x05, 0x4E, 0xC9, 0x81, 0x82, 0x80, 0x4E, 0xEB, 0x18, 0x1E,
0xA8, 0x4D, 0xF6, 0x05, 0x8D, 0x68, 0xB5, 0x5A, 0x28, 0x3E, 0xA3, 0xC5,
0x9C, 0xE6, 0xB9, 0x7C, 0xEC, 0xA7, 0xF4, 0xD8, 0xDF, 0xE6, 0x77, 0x7F,
0x74, 0xDE, 0xB2, 0xEE, 0x43, 0x76, 0xE8, 0x12, 0x66, 0x79, 0xFC, 0xD1,
0x64, 0xA9, 0x70, 0x20, 0x5F, 0xCD, 0xF6, 0x1E, 0x93, 0xF2, 0x6D, 0x3E,
0xFB, 0x4A, 0xB0, 0xF7, 0xFC, 0xD7, 0xF2, 0xC1, 0x6F, 0x6C, 0x9E, 0x60,
0x91, 0x1E, 0x68, 0xEA, 0x13, 0xA5, 0xF9, 0x11, 0xC6, 0x7A, 0x9A, 0x1F,
0xF9, 0x6A, 0xA9, 0xA9, 0x4C, 0x92, 0xF0, 0xDB, 0x79, 0xCB, 0x53, 0xC8,
0x77, 0xC3, 0xD8, 0xE3, 0xDA, 0x93, 0x1A, 0xB2, 0xA3, 0xD7, 0xA5, 0xC8,
0x75, 0xD3, 0x6E, 0x71, 0x86, 0x37, 0x8D, 0x9F, 0x38, 0x52, 0x66, 0x91,
0x37, 0x0F, 0xF0, 0x7F, 0x5D, 0x7E, 0x36, 0x0C, 0x3A, 0xCC, 0x23, 0x7E,
0xC1, 0x2C, 0x3F, 0xA6, 0x9F, 0x99, 0xFF, 0xCA, 0x74, 0xA4, 0xF4, 0xFC,
0xA6, 0xDA, 0xA7, 0x79, 0xBD, 0x7A, 0xB8, 0x59, 0x8F, 0x91, 0xA7, 0xD3,
0xEE, 0xF6, 0x53, 0xEB, 0xB1, 0xCF, 0xB2, 0xB7, 0x1F, 0xA1, 0xB7, 0xEB,
0x96, 0x95, 0xFC, 0x38, 0x64, 0x33, 0xD3, 0xF7, 0xE6, 0x6D, 0x4B, 0x27,
0x6A, 0x87, 0x8E, 0x5B, 0xFB, 0x97, 0x92, 0x6F, 0x76, 0x3D, 0x6E, 0xD7,
0x76, 0xC4, 0xE6, 0xF9, 0x31, 0xC6, 0xED, 0x3C, 0x3F, 0xA6, 0x23, 0xA5,
0x55, 0xA8, 0xD7, 0x0A, 0x4D, 0x59, 0x90, 0x9E, 0xD2, 0x56, 0xAD, 0x78,
0x0E, 0xC5, 0xD8, 0x7C, 0xBC, 0x77, 0xE9, 0x91, 0xFD, 0x88, 0xBD, 0x75,
0xF9, 0xF1, 0x7B, 0xA1, 0xDC, 0xD0, 0xB7, 0xC9, 0x6F, 0x13, 0x35, 0x75,
0x11, 0xC7, 0xC3, 0x10, 0x29, 0xC7, 0x2E, 0xAA, 0x9A, 0x71, 0xD0, 0xDA,
0xFC, 0x8F, 0xE5, 0xE3, 0x81, 0x78, 0xD0, 0x85, 0xDB, 0x3C, 0xC3, 0x31,
0xF0, 0xDB, 0xFB, 0x81, 0xC6, 0xAE, 0x52, 0x3D, 0x96, 0x6E, 0xAB, 0xF4,
0x48, 0xED, 0xDA, 0x91, 0x4F, 0x63, 0xBE, 0xB4, 0xE7, 0x3C, 0xFA, 0xC6,
0x3D, 0xC5, 0xAE, 0x27, 0xD4, 0x14, 0x99, 0xE6, 0xE3, 0x5B, 0xC8, 0x76,
0x51, 0xF3, 0x91, 0xE6, 0xC7, 0x8F, 0x2E, 0x3F, 0x96, 0xBA, 0x2F, 0xF7,
0x70, 0x1A, 0x2F, 0xF9, 0x4D, 0x11, 0xCC, 0x0C, 0x0D, 0x97, 0xD8, 0x21,
0x42, 0x86, 0xA1, 0x46, 0x31, 0x2B, 0x3F, 0x6E, 0x69, 0x8B, 0xE0, 0x56,
0x96, 0x66, 0xA5, 0x7C, 0xDC, 0x43, 0xBB, 0x25, 0x51, 0x35, 0x04, 0xEB,
0xAA, 0x22, 0xA8, 0x68, 0x19, 0x07, 0x7D, 0x1D, 0x7C, 0xBC, 0x27, 0xC8,
0x38, 0xE9, 0xB4, 0x9A, 0x1F, 0xC7, 0xB0, 0x6A, 0x75, 0x39, 0x9D, 0x75,
0x5C, 0xA2, 0x92, 0x1E, 0xDF, 0xC1, 0x7E, 0xEC, 0x5E, 0xDD, 0xD2, 0x23,
0xE9, 0x5F, 0xAD, 0xE6, 0x47, 0x35, 0x0B, 0xF8, 0xD0, 0x31, 0x0E, 0xEF,
0xCB, 0x98, 0x0E, 0x63, 0xF4, 0x9D, 0x37, 0xCB, 0x17, 0x6B, 0xE5, 0xC3,
0x19, 0xA1, 0x3E, 0x1C, 0x3F, 0x8E, 0x1B, 0xC7, 0x09, 0x0E, 0x76, 0x0A,
0xCA, 0x8C, 0x87, 0x09, 0xF3, 0x23, 0xD9, 0xF5, 0xB7, 0xFC, 0x58, 0xE8,
0x73, 0x36, 0x6B, 0x25, 0x78, 0x5A, 0xF5, 0x2E, 0xBB, 0xA7, 0xC7, 0xCF,
0x3E, 0x3F, 0xD2, 0x06, 0xA4, 0xCB, 0x8F, 0x85, 0x89, 0xFC, 0xE3, 0x66,
0x2C, 0xCC, 0xAF, 0xF6, 0x75, 0x12, 0xF1, 0xC5, 0x27, 0xCA, 0x87, 0xD3,
0x61, 0x69, 0xF9, 0xCB, 0x90, 0xA2, 0xC3, 0xBF, 0xD6, 0x85, 0xF9, 0x71,
0x3F, 0xF2, 0x90, 0xF0, 0x61, 0x7E, 0x5C, 0x3E, 0x9B, 0x1F, 0x45, 0x7C,
0x8C, 0x49, 0x3B, 0x3F, 0x6D, 0x9E, 0xDC, 0xEF, 0x31, 0x3F, 0xDE, 0xEF,
0xF9, 0xD1, 0xFF, 0x73, 0x6C, 0x47, 0xAE, 0xE9, 0xB1, 0x5F, 0x28, 0x97,
0xAD, 0x5D, 0x44, 0x3B, 0xF5, 0x42, 0x04, 0x25, 0xED, 0xC5, 0x66, 0xF3,
0xF1, 0xB1, 0x50, 0x3E, 0x9F, 0xC5, 0xDE, 0xB1, 0xDF, 0x50, 0xAF, 0x44,
0xEB, 0x68, 0x21, 0x3F, 0x86, 0x71, 0x4C, 0x98, 0x1F, 0x51, 0xAE, 0x5C,
0x36, 0xF2, 0x63, 0x18, 0xA9, 0x14, 0xB3, 0xE5, 0x8D, 0xFB, 0x0E, 0x03,
0x8F, 0xEF, 0xA3, 0x8C, 0xDB, 0x8F, 0xE0, 0xF1, 0x8F, 0xDD, 0x6D, 0xAA,
0xB7, 0x9B, 0xE2, 0x5D, 0x88, 0xBD, 0x66, 0xED, 0x1A, 0x7A, 0x53, 0x2D,
0x84, 0x56, 0xDC, 0x60, 0xB4, 0x9B, 0xE5, 0xCF, 0x0B, 0xE5, 0xCB, 0xD9,
0xB6, 0x21, 0x43, 0xB7, 0x32, 0x6D, 0xFA, 0xE5, 0x53, 0x78, 0xE4, 0xA1,
0x41, 0x0C, 0x73, 0xA2, 0x6F, 0x11, 0xA7, 0x36, 0x2B, 0x9E, 0xBF, 0x0A,
0x6B, 0x3A, 0x6E, 0x3C, 0x26, 0xF5, 0x9F, 0x26, 0x0C, 0x4A, 0x6B, 0xE7,
0xDF, 0xC3, 0x69, 0x9A, 0xDE, 0xDD, 0xED, 0x6E, 0x4B, 0x82, 0xF9, 0xA9,
0xAA, 0xEB, 0xDF, 0xE5, 0xF1, 0xB6, 0xF6, 0xD1, 0x6D, 0x59, 0x6A, 0x24,
0xD2, 0x8B, 0x6D, 0xAC, 0x4C, 0x42, 0xAD, 0x13, 0xE7, 0x4C, 0x13, 0xC7,
0x69, 0x62, 0x29, 0xBF, 0x66, 0xBF, 0x38, 0x0E, 0xCC, 0x8F, 0x5B, 0x55,
0xB9, 0x44, 0xF9, 0x31, 0x8C, 0xFB, 0x93, 0x83, 0xD6, 0x75, 0x5D, 0xE5,
0xE9, 0xA5, 0x3F, 0xCE, 0x8F, 0xB0, 0xE1, 0x0A, 0x96, 0x2E, 0xF3, 0x38,
0x43, 0x82, 0x39, 0x6F, 0x6B, 0x83, 0xDF, 0xC2, 0x69, 0x17, 0xCC, 0x5F,
0xC5, 0x0F, 0x7B, 0x34, 0xC5, 0xAD, 0x31, 0x59, 0x5C, 0x3C, 0xDF, 0xCE,
0x8F, 0x62, 0x16, 0x52, 0x69, 0x89, 0xED, 0xF2, 0xA7, 0x85, 0xFC, 0x9A,
0x95, 0x18, 0xD3, 0xA2, 0x4F, 0x94, 0xF5, 0x7B, 0xB0, 0xFA, 0xDA, 0xE4,
0x45, 0x51, 0x0C, 0xB3, 0xC6, 0x63, 0xEC, 0xCE, 0xD7, 0x3F, 0xA6, 0x62,
0x71, 0x7E, 0x44, 0x95, 0x09, 0xEF, 0x0D, 0x88, 0xF3, 0x20, 0x5C, 0x3A,
0xF4, 0x64, 0xD9, 0x37, 0x50, 0xEC, 0x82, 0xF5, 0x8F, 0xD9, 0x93, 0x1E,
0x75, 0x51, 0x2C, 0xC7, 0xDD, 0x67, 0xE2, 0x3B, 0x5E, 0xEE, 0x8E, 0xFB,
0x4C, 0xF7, 0xF2, 0x2B, 0xED, 0xC7, 0xBC, 0x2F, 0xB5, 0xF0, 0x8B, 0x63,
0x74, 0xF6, 0x8D, 0xC2, 0xFA, 0x3D, 0xF8, 0xF3, 0xF5, 0xC1, 0x71, 0xE0,
0x30, 0xCB, 0x8F, 0x20, 0xA6, 0x37, 0xF2, 0x23, 0x2A, 0x17, 0xEF, 0x09,
0x7F, 0xCC, 0x30, 0xE4, 0xF9, 0x1D, 0x76, 0xE3, 0x00, 0xE4, 0x4F, 0xB6,
0xDB, 0xA7, 0x43, 0xCE, 0xBA, 0xFE, 0xCF, 0x62, 0xB1, 0x8F, 0x24, 0xD0,
0x62, 0x4B, 0xFD, 0xA3, 0x38, 0xE6, 0xFF, 0xFD, 0xF8, 0x25, 0xDD, 0x76,
0x9E, 0x42, 0x70, 0x33, 0x57, 0x17, 0xF2, 0x63, 0x4A, 0xA5, 0x34, 0x3F,
0xCE, 0x41, 0xB1, 0x38, 0x3F, 0xD2, 0xEE, 0x52, 0xB5, 0xB6, 0xAB, 0x09,
0x16, 0xD1, 0xDD, 0x9F, 0xF8, 0xF4, 0x8E, 0xBB, 0xA9, 0x01, 0xE9, 0x56,
0x08, 0xC3, 0xC1, 0x46, 0x7B, 0xEB, 0x60, 0x2D, 0x3E, 0x3D, 0xD8, 0x6E,
0x5E, 0x21, 0xCF, 0x0B, 0xE1, 0xD1, 0x87, 0xCD, 0xD8, 0xA6, 0x6C, 0x96,
0xAF, 0x17, 0xCA, 0x17, 0xC9, 0xC5, 0xBA, 0x3F, 0x5E, 0xD1, 0x3D, 0x9A,
0xF1, 0x97, 0x60, 0x4C, 0xF3, 0x23, 0xE8, 0xF7, 0x25, 0xF9, 0x11, 0x45,
0xFA, 0xFD, 0x14, 0xCB, 0xEA, 0x66, 0x7E, 0xD8, 0x29, 0x43, 0x92, 0x5F,
0x6E, 0x8A, 0x85, 0x5F, 0xE2, 0x39, 0xFD, 0xB3, 0xDB, 0x4F, 0x23, 0xF4,
0x3F, 0xD7, 0xD6, 0x64, 0x7F, 0xAC, 0xBA, 0x26, 0xA3, 0xAD, 0x4F, 0xDD,
0xC3, 0xE7, 0xDD, 0xFD, 0xBB, 0x8B, 0x09, 0x92, 0xC5, 0xE1, 0x1E, 0x1B,
0x42, 0x6B, 0x63, 0x53, 0x96, 0x84, 0xFB, 0xD2, 0xD1, 0x4F, 0xF3, 0x4D,
0x45, 0xF2, 0x39, 0xB0, 0xFA, 0x98, 0x7C, 0x92, 0x1F, 0xE1, 0x51, 0xD3,
0xF6, 0x23, 0xEC, 0xEF, 0xAD, 0xCE, 0xEF, 0x8E, 0x86, 0x0C, 0x99, 0x25,
0x4F, 0x3B, 0xFC, 0xE4, 0x46, 0x61, 0x9E, 0x42, 0xDE, 0xDD, 0x9F, 0x3B,
0x25, 0xC8, 0xAF, 0x6C, 0xE1, 0xF9, 0x8F, 0xA5, 0x28, 0x5E, 0x5D, 0x24,
0xEB, 0x8F, 0x3A, 0x0B, 0x8F, 0xF4, 0xFB, 0xF7, 0xCF, 0xE7, 0x85, 0xC2,
0x97, 0x71, 0x1E, 0x28, 0x08, 0xD7, 0xB4, 0xFC, 0xC2, 0xFD, 0xBD, 0x6B,
0xA7, 0x18, 0xE6, 0x47, 0xF2, 0x24, 0xE2, 0x30, 0x0C, 0x6A, 0x9B, 0x34,
0xFD, 0x3E, 0x93, 0x1F, 0xC3, 0x57, 0x16, 0xA6, 0xAA, 0xFE, 0xD6, 0xA6,
0xF1, 0x24, 0xF2, 0xDB, 0x1C, 0xEE, 0x94, 0x20, 0x7F, 0x7E, 0xBD, 0xBF,
0x75, 0xCF, 0x0F, 0xEE, 0xB3, 0xC3, 0xCF, 0xF1, 0xAE, 0xF7, 0x85, 0x4B,
0xF3, 0x10, 0x9F, 0x53, 0xB8, 0xB5, 0xC5, 0x74, 0x1D, 0xBD, 0x87, 0xC7,
0xD4, 0xBF, 0x18, 0xA6, 0x44, 0x67, 0xE5, 0x83, 0xBB, 0x97, 0x4E, 0x53,
0xF9, 0x2A, 0x2D, 0x5F, 0xA7, 0xE5, 0xE7, 0x83, 0xEE, 0xD5, 0x60, 0x8C,
0xD6, 0x07, 0x17, 0xCF, 0x62, 0xFA, 0xC5, 0x60, 0x36, 0x62, 0x23, 0x3F,
0xEA, 0xE1, 0xA7, 0xCA, 0x34, 0x3F, 0xC6, 0xFC, 0x9D, 0x1D, 0x8E, 0xA7,
0xF4, 0xCF, 0x6D, 0x55, 0x30, 0x7C, 0xC0, 0x76, 0xE6, 0x7D, 0xB1, 0x01,
0x19, 0x66, 0x32, 0x87, 0x88, 0xE8, 0x42, 0x65, 0x0A, 0xF0, 0xE1, 0x72,
0x7D, 0x4F, 0x9F, 0x85, 0x9E, 0xC8, 0x21, 0x29, 0xDF, 0x7D, 0xA5, 0x4C,
0xCB, 0x1F, 0x56, 0xCB, 0xCF, 0xD3, 0x63, 0xB5, 0x83, 0xF5, 0xA9, 0xFC,
0x98, 0xDF, 0x12, 0xB3, 0x9E, 0x1F, 0xE5, 0xF8, 0x94, 0xEE, 0x74, 0x6B,
0xF0, 0x58, 0xAB, 0x2A, 0x2C, 0x6C, 0x95, 0xF0, 0xD9, 0x1D, 0x6F, 0x77,
0x95, 0x5C, 0xC7, 0xE1, 0x87, 0xB5, 0xF4, 0xF8, 0xB9, 0xDC, 0xC1, 0x1A,
0x17, 0xC9, 0x0E, 0x55, 0x5D, 0x9F, 0x8B, 0x24, 0x1E, 0xC6, 0x3B, 0xD2,
0x8B, 0x73, 0x5D, 0x97, 0xE3, 0xAA, 0x40, 0x50, 0x7E, 0xEC, 0x20, 0xE5,
0x41, 0xF9, 0xB1, 0x09, 0xA8, 0xFE, 0x52, 0xBE, 0x2F, 0x9D, 0xDF, 0xDF,
0x9D, 0x90, 0x8E, 0xDD, 0x63, 0x9F, 0xCB, 0x8F, 0x2A, 0x4E, 0xD7, 0x31,
0xC4, 0xAF, 0xBF, 0xDF, 0x1B, 0x77, 0xF4, 0x7D, 0xB1, 0xE3, 0xB5, 0xDA,
0xE9, 0x6D, 0x94, 0xF7, 0x5F, 0x3A, 0xD7, 0xB3, 0x9B, 0xE5, 0x79, 0x52,
0x55, 0x7F, 0xD7, 0xD5, 0x7E, 0x18, 0x6D, 0xCC, 0x1A, 0x8F, 0x6E, 0x0A,
0xEB, 0x9F, 0xA5, 0x92, 0x0B, 0x3D, 0x9C, 0x20, 0x08, 0x17, 0x9E, 0x7E,
0x5A, 0x9C, 0x90, 0x8A, 0x15, 0xDB, 0xE5, 0xEB, 0xA4, 0xF0, 0x18, 0x98,
0x0B, 0x87, 0x4F, 0x7F, 0xE8, 0xAF, 0xCB, 0x9C, 0xFD, 0x9F, 0xD3, 0x8C,
0xC3, 0xEC, 0x11, 0xAD, 0x61, 0xC7, 0xEC, 0xC1, 0xB0, 0xE4, 0x6E, 0x95,
0xA5, 0xD3, 0xE1, 0x49, 0xB5, 0xF7, 0xBB, 0x12, 0x6F, 0x77, 0x5E, 0xED,
0x0F, 0xD1, 0x6B, 0x7E, 0x7E, 0xBE, 0xDF, 0xF2, 0x66, 0xBF, 0x5B, 0x9E,
0xA7, 0x9C, 0x3F, 0x3E, 0x1E, 0x06, 0xE1, 0x42, 0x78, 0x27, 0xF3, 0x3C,
0x0B, 0x0F, 0x20, 0x16, 0x9B, 0x47, 0x9F, 0xDD, 0xEE, 0x3E, 0x26, 0x44,
0x91, 0xEE, 0x0F, 0x7D, 0x32, 0x3F, 0xD2, 0x06, 0x64, 0x96, 0x1F, 0xF5,
0xCA, 0xF6, 0xB1, 0xD2, 0xE9, 0x8B, 0x20, 0x0C, 0xCF, 0xBF, 0x81, 0xFD,
0x78, 0x5B, 0x7B, 0xD6, 0xBF, 0x71, 0x37, 0xCB, 0xDE, 0x0E, 0xB7, 0x17,
0xF0, 0xEE, 0xEE, 0xAF, 0xE3, 0x5D, 0x7D, 0xBF, 0xCF, 0xEC, 0x1A, 0x1F,
0xE5, 0xD1, 0x2C, 0xC0, 0x67, 0x73, 0x5D, 0xB3, 0xF2, 0x87, 0xCD, 0xBD,
0xF3, 0xF7, 0x8E, 0x8C, 0x9F, 0xFB, 0xD8, 0x5E, 0xE9, 0x60, 0x7D, 0x32,
0x3F, 0xD2, 0x29, 0xE7, 0xB5, 0xFC, 0x98, 0xBD, 0x75, 0x65, 0x3C, 0x5A,
0xFA, 0xC6, 0x15, 0xEB, 0xE7, 0xDF, 0x40, 0x15, 0x3C, 0xF6, 0xF1, 0x36,
0x64, 0xC5, 0x90, 0x1A, 0x37, 0xEB, 0xEF, 0xBF, 0x2A, 0x37, 0xE3, 0x21,
0xEE, 0x40, 0x1D, 0x16, 0x2E, 0xA6, 0x49, 0xF9, 0x64, 0x80, 0x1D, 0x5F,
0x8E, 0xA3, 0x3B, 0x01, 0xD3, 0x79, 0xA3, 0xCD, 0xB9, 0xD8, 0x72, 0xE9,
0xE0, 0xBD, 0x8F, 0x30, 0xC2, 0xD3, 0x06, 0x64, 0x2D, 0x3F, 0xE2, 0x8A,
0xE5, 0xC1, 0x18, 0xBC, 0x89, 0xAE, 0x09, 0xDE, 0x5B, 0xFC, 0x2D, 0xDC,
0x1B, 0x90, 0xE9, 0x89, 0xF3, 0xBB, 0xFB, 0xD3, 0x51, 0xAB, 0xEF, 0x67,
0xE8, 0xB4, 0xC5, 0x56, 0x38, 0x04, 0x7B, 0xD3, 0x3B, 0xC1, 0x07, 0xA7,
0x4F, 0x96, 0x3F, 0xC4, 0xB9, 0xD7, 0x5F, 0xF7, 0x83, 0xC8, 0x3C, 0x05,
0x71, 0x9E, 0xEA, 0xC7, 0xD3, 0xCB, 0x7D, 0x9D, 0x5B, 0x40, 0x0F, 0xC7,
0x3E, 0xC6, 0x5F, 0x5C, 0x6D, 0x27, 0x2E, 0xED, 0x54, 0xED, 0xA4, 0xD6,
0xF5, 0x58, 0xC8, 0x8B, 0xEF, 0xBF, 0x89, 0xBA, 0x4F, 0x90, 0xF4, 0xB9,
0xDA, 0xF1, 0xF1, 0xC1, 0x6B, 0x7E, 0x6C, 0x75, 0x14, 0x9A, 0xAA, 0x2C,
0x8A, 0x53, 0xB5, 0xD2, 0xD5, 0xAE, 0xAF, 0x7B, 0x4F, 0xD5, 0x56, 0xA8,
0x6C, 0x97, 0xFF, 0xE8, 0xCB, 0xCF, 0xE7, 0x49, 0x9B, 0x26, 0x2E, 0xD1,
0xA6, 0x1B, 0xB6, 0xBE, 0x1C, 0xEF, 0x0A, 0x96, 0x70, 0xE2, 0x2F, 0x36,
0x91, 0x85, 0x6A, 0x2F, 0xBE, 0x14, 0xB5, 0xAE, 0x4E, 0xEB, 0xE7, 0xC3,
0xF3, 0x29, 0x76, 0x8B, 0x2F, 0x66, 0xF8, 0x64, 0x7E, 0xC0, 0x37, 0xD7,
0x27, 0xC8, 0x72, 0x7E, 0xBC, 0xAD, 0xBD, 0xBF, 0x04, 0x5E, 0x45, 0x97,
0x20, 0xFB, 0xB5, 0x0E, 0xD6, 0x75, 0xC4, 0xFE, 0xE8, 0xFA, 0xC1, 0x43,
0x75, 0xFF, 0x7B, 0x9C, 0xE5, 0x04, 0xC9, 0x36, 0x5E, 0x4F, 0x0D, 0xAF,
0xA2, 0xB8, 0xBD, 0x8D, 0x3A, 0x4E, 0x91, 0xB7, 0xFE, 0xFD, 0xBB, 0x46,
0x1F, 0x70, 0xE9, 0x9F, 0x36, 0x1F, 0x16, 0x3D, 0xEE, 0x2B, 0x21, 0xFB,
0xDC, 0xD8, 0x03, 0x6E, 0x9A, 0x22, 0x0F, 0xFF, 0xF7, 0x1F, 0xBB, 0xFD,
0x3F, 0x9A, 0x0E, 0x88, 0xD4, 0x65, 0x51, 0x1C, 0x8B, 0xA2, 0xD8, 0x5C,
0xB4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xBE, 0x8A, 0xB6, 0x69, 0xDA, 0x47, 0xD7, 0x01, 0xBE, 0xA2, 0xB6,
0x3A, 0x66, 0x37, 0x87, 0xB2, 0x79, 0x74, 0x5D, 0xE0, 0x6B, 0x69, 0x8B,
0x2C, 0x3B, 0x56, 0xF5, 0x55, 0xD5, 0xFD, 0xA5, 0x15, 0x81, 0x49, 0x99,
0x65, 0xD5, 0xF4, 0xE9, 0x9C, 0x65, 0xA7, 0xC7, 0xD5, 0x05, 0xBE, 0x98,
0x63, 0x56, 0xC6, 0x1B, 0xAA, 0xEC, 0xF8, 0x98, 0x9A, 0xC0, 0x97, 0x73,
0xC8, 0xEA, 0x74, 0x53, 0x93, 0xE5, 0xFA, 0x58, 0x70, 0xE9, 0x5A, 0x8F,
0x71, 0x40, 0x7E, 0xCE, 0xF3, 0x7B, 0xC3, 0xD1, 0xE6, 0x87, 0x47, 0xD5,
0x07, 0xBE, 0x90, 0x32, 0x68, 0x3D, 0xBA, 0xF9, 0xAB, 0xA2, 0xFF, 0xB3,
0x19, 0xFE, 0x80, 0x17, 0xD6, 0x04, 0x23, 0xF3, 0xFA, 0x36, 0xBF, 0x7B,
0xFF, 0x70, 0x9E, 0xF7, 0xBA, 0xE0, 0xD5, 0x1C, 0xF3, 0xE9, 0xEF, 0xA6,
0xCB, 0x8F, 0x71, 0x64, 0x7E, 0xD4, 0xC3, 0xE2, 0xD5, 0x7D, 0x44, 0xAD,
0x44, 0x91, 0x05, 0xE3, 0xF2, 0x0F, 0x0D, 0x08, 0xAF, 0xAE, 0xC8, 0xA3,
0x8F, 0x4D, 0x98, 0x12, 0x47, 0x23, 0x10, 0x5E, 0x5C, 0xBA, 0xF2, 0x11,
0xAA, 0xB2, 0xFF, 0xBF, 0x7A, 0xC0, 0x17, 0xD4, 0x64, 0x1F, 0xD3, 0xDF,
0x1F, 0x75, 0x5D, 0x55, 0x55, 0xB8, 0x53, 0x07, 0x8B, 0x97, 0x76, 0x9E,
0x9A, 0x88, 0xA6, 0xBF, 0x3D, 0x31, 0x5C, 0x38, 0x0F, 0x6F, 0x3A, 0x81,
0xD7, 0x53, 0x4E, 0xC3, 0x8F, 0x2A, 0xCF, 0xBB, 0xFC, 0x08, 0x53, 0xC2,
0x00, 0x84, 0xD7, 0x76, 0x0A, 0x9B, 0x8B, 0x8F, 0x2E, 0x3F, 0xC2, 0xDB,
0x4A, 0x0A, 0xF9, 0xC1, 0x4B, 0x2B, 0xC2, 0xFC, 0x28, 0xAF, 0xE9, 0x11,
0x4D, 0x67, 0xC9, 0x0F, 0x5E, 0x5B, 0x19, 0xE6, 0xC3, 0x61, 0xBA, 0xBB,
0xA4, 0xA7, 0x7F, 0xC5, 0x6B, 0x8B, 0xA6, 0x70, 0xBB, 0xF1, 0x47, 0x34,
0x63, 0xB5, 0x35, 0xF9, 0x0B, 0xDF, 0x5F, 0x1D, 0x8C, 0x37, 0xEA, 0xB4,
0x7B, 0x75, 0x31, 0xBF, 0xCB, 0x8B, 0x0B, 0xE6, 0xAB, 0x8A, 0xE0, 0xE6,
0xC4, 0x9B, 0xDA, 0xFA, 0x20, 0x2F, 0xEE, 0x38, 0x0D, 0xD0, 0xBB, 0xEE,
0x55, 0x79, 0x39, 0x4F, 0x0B, 0x86, 0x85, 0x87, 0x08, 0x79, 0x71, 0xE7,
0xB1, 0x83, 0xD5, 0x76, 0xB3, 0xBB, 0xCD, 0x25, 0x9B, 0x1A, 0x0D, 0xCB,
0x83, 0xBC, 0xBC, 0x71, 0xC6, 0xAA, 0x1F, 0x7E, 0x04, 0x8F, 0xA2, 0x9F,
0x74, 0xAF, 0x78, 0x79, 0xE7, 0xE1, 0xE9, 0xDA, 0x6E, 0xF5, 0xE3, 0x50,
0x4C, 0x23, 0xF4, 0x56, 0xF3, 0x01, 0x97, 0xC3, 0x3D, 0x23, 0xAA, 0xDB,
0xED, 0x57, 0xF9, 0x6C, 0x3B, 0xBC, 0xB2, 0x76, 0xB8, 0x25, 0xB1, 0x1B,
0x9F, 0x1F, 0xC6, 0xE9, 0xDE, 0x22, 0xF3, 0x1A, 0x45, 0xE8, 0x06, 0x1E,
0x7D, 0x82, 0xB4, 0xA7, 0x62, 0x5A, 0xEF, 0x28, 0xAC, 0x7D, 0xC0, 0x4D,
0x9D, 0xE5, 0x49, 0x5B, 0xD1, 0x1E, 0xA5, 0x07, 0xDC, 0x35, 0x79, 0xFC,
0x42, 0xD1, 0x32, 0xD3, 0xB9, 0x82, 0xC9, 0x75, 0x70, 0x3E, 0x74, 0xAE,
0xEA, 0x22, 0x73, 0xDF, 0x15, 0xC4, 0xCA, 0x6C, 0x54, 0x7A, 0xB5, 0x28,
0xA4, 0xDA, 0xBA, 0x3A, 0x9D, 0xCA, 0x5A, 0xCF, 0x0A, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x57, 0xF4, 0x5F, 0xC3, 0x54, 0x94,
0x5A
};

View file

@ -1,52 +1,32 @@
/****************************************************************************
* 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 3 of the License, 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. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <https://www.gnu.org/licenses/>. *
****************************************************************************/
/**
* This file was auto-generated using "svg2cpp.py"
*
* The encoding consists of x,y pairs with the min and max scaled to
* 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the
* start of a new closed path.
*/
#pragma once
constexpr float x_min = 0.000000;
constexpr float x_max = 480.000000;
constexpr float y_min = 0.000000;
constexpr float y_max = 272.000000;
const PROGMEM uint16_t menu_btn[] = {0x0AAA, 0x0E1E, 0x6D54, 0x0E1E, 0x6D54, 0x2F0E, 0x0AAA, 0x2F0E, 0x0AAA, 0x0E1E};
const PROGMEM uint16_t print_btn[] = {0x47FF, 0xCF0D, 0x7FFF, 0xCF0D, 0x7FFF, 0xEFFE, 0x47FF, 0xEFFE, 0x47FF, 0xCF0D};
const PROGMEM uint16_t load_chocolate_btn[] = {0x0AAA, 0x3878, 0x6D54, 0x3878, 0x6D54, 0x5968, 0x0AAA, 0x5968, 0x0AAA, 0x3878};
const PROGMEM uint16_t extrude_btn[] = {0x0AAA, 0x5E1D, 0x6D54, 0x5E1D, 0x6D54, 0x7F0E, 0x0AAA, 0x7F0E, 0x0AAA, 0x5E1D};
const PROGMEM uint16_t preheat_chocolate_btn[] = {0x0AAA, 0x83C2, 0x6D54, 0x83C2, 0x6D54, 0xA4B3, 0x0AAA, 0xA4B3, 0x0AAA, 0x83C2};
const PROGMEM uint16_t media_btn[] = {0x0AAA, 0xCF0D, 0x42AA, 0xCF0D, 0x42AA, 0xEFFE, 0x0AAA, 0xEFFE, 0x0AAA, 0xCF0D};
const PROGMEM uint16_t pause_btn[] = {0x8554, 0xCF0D, 0xBD53, 0xCF0D, 0xBD53, 0xEFFE, 0x8554, 0xEFFE, 0x8554, 0xCF0D};
const PROGMEM uint16_t print_time_hms[] = {0xC59E, 0xAEA0, 0xF510, 0xAEA0, 0xF510, 0xC52D, 0xC59E, 0xC52D, 0xC59E, 0xAEA0};
const PROGMEM uint16_t file_name[] = {0x0B0E, 0xAECD, 0xBCEF, 0xAECD, 0xBCEF, 0xC4AB, 0x0B0E, 0xC4AB, 0x0B0E, 0xAECD};
const PROGMEM uint16_t chocolate_label[] = {0x75C1, 0x1369, 0xF4FE, 0x1369, 0xF4FE, 0x2AB1, 0x75C1, 0x2AB1, 0x75C1, 0x1369};
const PROGMEM uint16_t h0_label[] = {0x8304, 0x4BEB, 0xB271, 0x4BEB, 0xB271, 0x63B0, 0x8304, 0x63B0, 0x8304, 0x4BEB};
const PROGMEM uint16_t h0_temp[] = {0x8304, 0x7190, 0xB271, 0x7190, 0xB271, 0x8955, 0x8304, 0x8955, 0x8304, 0x7190};
const PROGMEM uint16_t h1_label[] = {0xBB04, 0x4BEB, 0xEA71, 0x4BEB, 0xEA71, 0x63B0, 0xBB04, 0x63B0, 0xBB04, 0x4BEB};
const PROGMEM uint16_t h1_temp[] = {0xBB04, 0x7190, 0xEA71, 0x7190, 0xEA71, 0x8956, 0xBB04, 0x8956, 0xBB04, 0x7190};
const PROGMEM uint16_t stop_btn[] = {0xC2A9, 0xCF0D, 0xF553, 0xCF0D, 0xF553, 0xEFFE, 0xC2A9, 0xEFFE, 0xC2A9, 0xCF0D};
const PROGMEM uint16_t load_screen_extrude[] = {0x382C, 0x8B02, 0x4188, 0x8B02, 0x4188, 0xAC4A, 0x4637, 0xAC4A, 0x3CDA, 0xBCEE, 0x337D, 0xAC4A, 0x382C, 0xAC4A, 0x382C, 0x8B02};
const PROGMEM uint16_t load_screen_retract[] = {0x382C, 0x7A5D, 0x4188, 0x7A5D, 0x4188, 0x5915, 0x4637, 0x5915, 0x3CDA, 0x4871, 0x337E, 0x5915, 0x382C, 0x5915, 0x382C, 0x7A5D};
const PROGMEM uint16_t load_screen_back_btn[] = {0x1555, 0xCA58, 0xEAA8, 0xCA58, 0xEAA8, 0xEFFE, 0x1555, 0xEFFE, 0x1555, 0xCA58};
const PROGMEM uint16_t load_screen_unload_btn[] = {0x67FF, 0x70F0, 0xEAA8, 0x70F0, 0xEAA8, 0x9695, 0x67FF, 0x9695, 0x67FF, 0x70F0};
const PROGMEM uint16_t load_screen_start_stop_btn[] = {0x67FF, 0x9B4A, 0xEAA8, 0x9B4A, 0xEAA8, 0xC0EF, 0x67FF, 0xC0EF, 0x67FF, 0x9B4A};
const PROGMEM uint16_t load_screen_load_btn[] = {0x67FF, 0x4696, 0xEAA8, 0x4696, 0xEAA8, 0x6C3B, 0x67FF, 0x6C3B, 0x67FF, 0x4696};
const PROGMEM uint16_t load_screen_continuous[] = {0x67FF, 0x1787, 0xEAA8, 0x1787, 0xEAA8, 0x3D2C, 0x67FF, 0x3D2C, 0x67FF, 0x1787};
const PROGMEM uint16_t load_screen_increment[] = {0x1555, 0x1787, 0x62A9, 0x1787, 0x62A9, 0x3D2C, 0x1555, 0x3D2C, 0x1555, 0x1787};
const PROGMEM uint16_t menu_btn[] = {0x0AAC, 0x0DF3, 0x6D54, 0x0DF3, 0x6D54, 0x2E89, 0x0AAC, 0x2E89, 0x0AAC, 0x0DF3};
const PROGMEM uint16_t print_btn[] = {0x4800, 0xCCCC, 0x7FFF, 0xCCCC, 0x7FFF, 0xED62, 0x4800, 0xED62, 0x4800, 0xCCCC};
const PROGMEM uint16_t load_chocolate_btn[] = {0x0AAC, 0x37D8, 0x6D54, 0x37D8, 0x6D54, 0x586E, 0x0AAC, 0x586E, 0x0AAC, 0x37D8};
const PROGMEM uint16_t preheat_chocolate_btn[] = {0x0AAC, 0x5D15, 0x6D54, 0x5D15, 0x6D54, 0x7DAB, 0x0AAC, 0x7DAB, 0x0AAC, 0x5D15};
const PROGMEM uint16_t extrude_btn[] = {0x0AAC, 0x8252, 0x6D54, 0x8252, 0x6D54, 0xA2E8, 0x0AAC, 0xA2E8, 0x0AAC, 0x8252};
const PROGMEM uint16_t media_btn[] = {0x0AAC, 0xCCCC, 0x42AA, 0xCCCC, 0x42AA, 0xED62, 0x0AAC, 0xED62, 0x0AAC, 0xCCCC};
const PROGMEM uint16_t pause_btn[] = {0x8554, 0xCCCC, 0xBD53, 0xCCCC, 0xBD53, 0xED62, 0x8554, 0xED62, 0x8554, 0xCCCC};
const PROGMEM uint16_t print_time_hms[] = {0xAB02, 0x82EE, 0xE4F8, 0x82EE, 0xE4F8, 0xA24C, 0xAB02, 0xA24C, 0xAB02, 0x82EE};
const PROGMEM uint16_t print_time_pct[] = {0x7386, 0x82E2, 0xA500, 0x82E2, 0xA500, 0xA258, 0x7386, 0xA258, 0x7386, 0x82E2};
const PROGMEM uint16_t file_name[] = {0x0B08, 0xA830, 0xF4F5, 0xA830, 0xF4F5, 0xC784, 0x0B08, 0xC784, 0x0B08, 0xA830};
const PROGMEM uint16_t h0_label[] = {0x85B6, 0x3884, 0xAF9B, 0x3884, 0xAF9B, 0x57C1, 0x85B6, 0x57C1, 0x85B6, 0x3884};
const PROGMEM uint16_t h0_temp[] = {0x85B6, 0x5DC1, 0xAF9B, 0x5DC1, 0xAF9B, 0x7CFF, 0x85B6, 0x7CFF, 0x85B6, 0x5DC1};
const PROGMEM uint16_t h1_label[] = {0xBB0B, 0x3884, 0xE4EF, 0x3884, 0xE4EF, 0x57C1, 0xBB0B, 0x57C1, 0xBB0B, 0x3884};
const PROGMEM uint16_t h1_temp[] = {0xBB0B, 0x5DC1, 0xE4EF, 0x5DC1, 0xE4EF, 0x7CFF, 0xBB0B, 0x7CFF, 0xBB0B, 0x5DC1};
const PROGMEM uint16_t stop_btn[] = {0xC2A8, 0xCCCC, 0xF551, 0xCCCC, 0xF551, 0xED62, 0xC2A8, 0xED62, 0xC2A8, 0xCCCC};
const PROGMEM uint16_t z_wizard_heading[] = {0x5332, 0x0FFF, 0xB331, 0x0FFF, 0xB331, 0x2AAA, 0x5332, 0x2AAA, 0x5332, 0x0FFF};
const PROGMEM uint16_t z_wizard_plus_btn[] = {0x9CCB, 0x3AAA, 0xAFFE, 0x3AAA, 0xAFFE, 0x5554, 0x9CCB, 0x5554, 0x9CCB, 0x3AAA};
const PROGMEM uint16_t z_wizard_edit_box[] = {0x0CCC, 0x9FFE, 0x5332, 0x9FFE, 0x5332, 0xC553, 0x0CCC, 0xC553, 0x0CCC, 0x9FFE};
const PROGMEM uint16_t z_wizard_inc1_btn[] = {0x5998, 0xA016, 0x8998, 0xA016, 0x8998, 0xC553, 0x5998, 0xC553, 0x5998, 0xA016};
const PROGMEM uint16_t z_wizard_inc2_btn[] = {0x8FFE, 0xA016, 0xBFFE, 0xA016, 0xBFFE, 0xC553, 0x8FFE, 0xC553, 0x8FFE, 0xA016};
const PROGMEM uint16_t z_wizard_inc3_btn[] = {0xC664, 0xA016, 0xF664, 0xA016, 0xF664, 0xC553, 0xC664, 0xC553, 0xC664, 0xA016};
const PROGMEM uint16_t z_wizard_done_btn[] = {0xBFFE, 0xCFFE, 0xF664, 0xCFFE, 0xF664, 0xF553, 0xBFFE, 0xF553, 0xBFFE, 0xCFFE};
const PROGMEM uint16_t z_wizard_neg_btn[] = {0x9CCB, 0x5FFF, 0xAFFE, 0x5FFF, 0xAFFE, 0x7AA9, 0x9CCB, 0x7AA9, 0x9CCB, 0x5FFF};
const PROGMEM uint16_t z_wizard_diagram[] = {0x6D65, 0x4DBE, 0x6D65, 0x6015, 0x7ADB, 0x6015, 0x7F1F, 0x6C6A, 0x8303, 0x6C6A, 0x8747, 0x6015, 0x94BE, 0x6015, 0x94BE, 0x4DBE, 0x6D65, 0x4DBE, 0xFFFF, 0x0D06, 0x8527, 0x0D06, 0x9554, 0xF664, 0x9554, 0xF664, 0x8527, 0x0D06, 0x8527};
const PROGMEM uint16_t load_screen_extrude[] = {0x382D, 0x897E, 0x4189, 0x897E, 0x4189, 0xAA6A, 0x4638, 0xAA6A, 0x3CDB, 0xBAE0, 0x337F, 0xAA6A, 0x382D, 0xAA6A, 0x382D, 0x897E};
const PROGMEM uint16_t load_screen_retract[] = {0x382D, 0x7908, 0x4189, 0x7908, 0x4189, 0x581C, 0x4638, 0x581C, 0x3CDB, 0x47A6, 0x337F, 0x581C, 0x382D, 0x581C, 0x382D, 0x7908};
const PROGMEM uint16_t load_screen_back_btn[] = {0x1556, 0xC825, 0xEAA7, 0xC825, 0xEAA7, 0xED62, 0x1556, 0xED62, 0x1556, 0xC825};
const PROGMEM uint16_t load_screen_unload_btn[] = {0x67FF, 0x6FB4, 0xEAA7, 0x6FB4, 0xEAA7, 0x94F1, 0x67FF, 0x94F1, 0x67FF, 0x6FB4};
const PROGMEM uint16_t load_screen_start_stop_btn[] = {0x67FF, 0x9998, 0xEAA7, 0x9998, 0xEAA7, 0xBED6, 0x67FF, 0xBED6, 0x67FF, 0x9998};
const PROGMEM uint16_t load_screen_load_btn[] = {0x67FF, 0x45CF, 0xEAA7, 0x45CF, 0xEAA7, 0x6B0C, 0x67FF, 0x6B0C, 0x67FF, 0x45CF};
const PROGMEM uint16_t load_screen_continuous[] = {0x67FF, 0x1743, 0xEAA7, 0x1743, 0xEAA7, 0x3C80, 0x67FF, 0x3C80, 0x67FF, 0x1743};
const PROGMEM uint16_t load_screen_increment[] = {0x1556, 0x1743, 0x62AA, 0x1743, 0x62AA, 0x3C80, 0x1556, 0x3C80, 0x1556, 0x1743};

View file

@ -171,13 +171,10 @@ void FilesScreen::drawFooter() {
cmd.colors(normal_btn)
.font(font_medium)
.colors(normal_btn)
.enabled(!mydata.flags.is_root)
.tag(245).button(BTN2_POS, F("Up Dir"))
.tag(mydata.flags.is_root ? 240 : 245).button(BTN2_POS, F("Back"))
.colors(action_btn);
if (mydata.flags.is_empty)
cmd.tag(240).button(BTN1_POS, GET_TEXT_F(MSG_BUTTON_DONE));
else if (has_selection && mydata.flags.is_dir)
if (has_selection && mydata.flags.is_dir)
cmd.tag(244).button(BTN1_POS, GET_TEXT_F(MSG_BUTTON_OPEN));
else
cmd.tag(241).enabled(has_selection).button(BTN1_POS, F("Select"));
@ -214,12 +211,9 @@ void FilesScreen::gotoPage(uint8_t page) {
bool FilesScreen::onTouchEnd(uint8_t tag) {
switch (tag) {
case 240: // Done button, always select first file
{
FileList files;
files.seek(0);
GOTO_PREVIOUS();
}
case 240: // Back button
card.filename[0] = card.longFilename[0] = '\0'; // Clear file selection
GOTO_PREVIOUS();
return true;
case 241: // Select highlighted file
GOTO_PREVIOUS();

View file

@ -25,24 +25,31 @@
#if ENABLED(COCOA_LEVELING_MENU)
#if ALL(HAS_BED_PROBE, BLTOUCH)
#include "../../../../feature/bltouch.h"
#endif
using namespace FTDI;
using namespace ExtUI;
using namespace Theme;
#define GRID_COLS 3
#define GRID_ROWS 5
#define BED_MESH_TITLE_POS BTN_POS(1,1), BTN_SIZE(3,1)
#define PROBE_BED_POS BTN_POS(1,2), BTN_SIZE(1,1)
#define SHOW_MESH_POS BTN_POS(2,2), BTN_SIZE(1,1)
#define EDIT_MESH_POS BTN_POS(3,2), BTN_SIZE(1,1)
#define BLTOUCH_TITLE_POS BTN_POS(1,3), BTN_SIZE(3,1)
#define BLTOUCH_RESET_POS BTN_POS(1,4), BTN_SIZE(1,1)
#define BLTOUCH_TEST_POS BTN_POS(2,4), BTN_SIZE(1,1)
#define BACK_POS BTN_POS(1,5), BTN_SIZE(3,1)
#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL)
#define GRID_COLS 3
#define GRID_ROWS 6
#define BED_MESH_TITLE_POS BTN_POS(1,1), BTN_SIZE(3,1)
#define WARNING_POS BTN_POS(1,2), BTN_SIZE(3,2)
#define PROBE_BED_POS BTN_POS(1,4), BTN_SIZE(1,1)
#define SHOW_MESH_POS BTN_POS(2,4), BTN_SIZE(1,1)
#define EDIT_MESH_POS BTN_POS(3,4), BTN_SIZE(1,1)
#define BACK_POS BTN_POS(1,6), BTN_SIZE(3,1)
#else
#define GRID_COLS 2
#define GRID_ROWS 6
#define BED_MESH_TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1)
#define WARNING_POS BTN_POS(1,2), BTN_SIZE(2,2)
#define PROBE_BED_POS BTN_POS(1,4), BTN_SIZE(1,1)
#define SHOW_MESH_POS BTN_POS(2,4), BTN_SIZE(1,1)
#define BACK_POS BTN_POS(1,6), BTN_SIZE(2,1)
// Hide the editor button if motion to grid point not supported
#define EDIT_MESH_POS BTN_POS(4,7), BTN_SIZE(1,1)
#endif
void LevelingMenu::onRedraw(draw_mode_t what) {
if (what & BACKGROUND) {
@ -57,38 +64,26 @@ void LevelingMenu::onRedraw(draw_mode_t what) {
cmd.font(font_large)
.cmd(COLOR_RGB(bg_text_enabled))
.text(BED_MESH_TITLE_POS, GET_TEXT_F(MSG_BED_LEVELING))
#if ENABLED(BLTOUCH)
.text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH))
#endif
.font(font_medium).colors(normal_btn)
.tag(2).button(PROBE_BED_POS, GET_TEXT_F(MSG_PROBE_BED))
.enabled(ENABLED(HAS_MESH))
.tag(3).button(SHOW_MESH_POS, GET_TEXT_F(MSG_MESH_VIEW))
.enabled(ENABLED(HAS_MESH))
.tag(4).button(EDIT_MESH_POS, GET_TEXT_F(MSG_EDIT_MESH))
#undef GRID_COLS
#define GRID_COLS 2
#if ENABLED(BLTOUCH)
.tag(5).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET))
.tag(6).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST))
#endif
#undef GRID_COLS
#define GRID_COLS 3
.colors(action_btn)
.tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE));
.tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE))
.cmd(COLOR_RGB(bg_text_enabled))
.tag(0);
draw_text_box(cmd, WARNING_POS, F("Remove chocolate cartridge before probing. This reduces the possibility of damaging a part."), OPT_CENTER, font_medium);
}
}
bool LevelingMenu::onTouchEnd(uint8_t tag) {
switch (tag) {
case 1: GOTO_PREVIOUS(); break;
case 2: BedMeshViewScreen::doProbe(); break;
case 2: SaveSettingsDialogBox::settingsChanged(); injectCommands(F(BED_LEVELING_COMMANDS)); break;
case 3: BedMeshViewScreen::show(); break;
case 4: BedMeshEditScreen::show(); break;
#if ENABLED(BLTOUCH)
case 5: injectCommands(F("M280 P0 S60")); break;
case 6: SpinnerDialogBox::enqueueAndWait(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
#endif
case 4: SaveSettingsDialogBox::settingsChanged(); BedMeshEditScreen::show(); break;
default: return false;
}
return true;

View file

@ -23,6 +23,7 @@
#include "../config.h"
#include "../screens.h"
#include "../../../../module/stepper.h"
#ifdef COCOA_MAIN_MENU
@ -34,13 +35,13 @@ using namespace Theme;
#define ZPROBE_ZOFFSET_POS BTN_POS(1,1), BTN_SIZE(1,1)
#define MOVE_XYZ_POS BTN_POS(1,2), BTN_SIZE(1,1)
#define TEMPERATURE_POS BTN_POS(2,1), BTN_SIZE(1,1)
#define LEVELING_POS BTN_POS(2,1), BTN_SIZE(1,1)
#define MOVE_E_POS BTN_POS(2,2), BTN_SIZE(1,1)
#define SPEED_POS BTN_POS(1,3), BTN_SIZE(1,1)
#define FLOW_POS BTN_POS(2,3), BTN_SIZE(1,1)
#define ADVANCED_SETTINGS_POS BTN_POS(1,4), BTN_SIZE(1,1)
#define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(1,1)
#define DISABLE_STEPPERS_POS BTN_POS(2,4), BTN_SIZE(1,1)
#define LEVELING_POS BTN_POS(1,5), BTN_SIZE(1,1)
#define ADVANCED_SETTINGS_POS BTN_POS(1,5), BTN_SIZE(1,1)
#define ABOUT_PRINTER_POS BTN_POS(2,5), BTN_SIZE(1,1)
#define BACK_POS BTN_POS(1,6), BTN_SIZE(2,1)
@ -63,6 +64,10 @@ void MainMenu::onRedraw(draw_mode_t what) {
.tag( 6).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED))
.tag( 7).button(FLOW_POS, GET_TEXT_F(MSG_FLOW))
.tag( 8).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS))
.enabled(stepper.axis_is_enabled(X_AXIS) ||
stepper.axis_is_enabled(Y_AXIS) ||
stepper.axis_is_enabled(Z_AXIS) ||
stepper.axis_is_enabled(E0_AXIS))
.tag( 9).button(DISABLE_STEPPERS_POS, GET_TEXT_F(MSG_DISABLE_STEPPERS))
.enabled(ENABLED(HAS_LEVELING))
.tag(10).button(LEVELING_POS, GET_TEXT_F(MSG_LEVELING))
@ -97,4 +102,12 @@ bool MainMenu::onTouchEnd(uint8_t tag) {
return true;
}
void MainMenu::onIdle() {
if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) {
if (!EventLoop::is_touch_held())
onRefresh();
refresh_timer.start();
}
}
#endif // COCOA_MAIN_MENU

View file

@ -30,4 +30,5 @@ class MainMenu : public BaseScreen, public CachedScreen<MENU_SCREEN_CACHE> {
public:
static void onRedraw(draw_mode_t);
static bool onTouchEnd(uint8_t tag);
static void onIdle();
};

View file

@ -32,40 +32,24 @@ using namespace Theme;
#define GRID_ROWS 5
void PreheatMenu::onRedraw(draw_mode_t what) {
const int16_t w = TERN0(COCOA_PRESS_EXTRA_HEATER, has_extra_heater()) ? BTN_W(1) : BTN_W(2);
const int16_t h = BTN_H(1);
if (what & BACKGROUND) {
CommandProcessor cmd;
cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color))
.cmd(CLEAR(true,true,true))
.tag(0)
.cmd(COLOR_RGB(bg_text_enabled))
.font(Theme::font_medium)
.text( BTN_POS(1,1), w, h, GET_TEXT_F(MSG_SELECT_CHOCOLATE_TYPE));
#if ENABLED(COCOA_PRESS_EXTRA_HEATER)
if (has_extra_heater()) {
cmd.text( BTN_POS(2,1), w, h, GET_TEXT_F(MSG_EXTERNAL));
}
#endif
.tag(0).text( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_SELECT_CHOCOLATE_TYPE));
}
if (what & FOREGROUND) {
CommandProcessor cmd;
cmd.font(Theme::font_medium)
.colors(normal_btn)
.tag(2).button(BTN_POS(1,2), w, h, F("Dark Chocolate"))
.tag(3).button(BTN_POS(1,3), w, h, F("Milk Chocolate"))
.tag(4).button(BTN_POS(1,4), w, h, F("White Chocolate"));
#if ENABLED(COCOA_PRESS_EXTRA_HEATER)
if (has_extra_heater()) {
cmd.tag(5).button(BTN_POS(2,2), w, h, F("Dark Chocolate"))
.tag(6).button(BTN_POS(2,3), w, h, F("Milk Chocolate"))
.tag(7).button(BTN_POS(2,4), w, h, F("White Chocolate"));
}
#endif
cmd.colors(action_btn)
.tag(1) .button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_DONE));
.tag(2).button(BTN_POS(1,2), BTN_SIZE(2,1), F("Dark Chocolate"))
.tag(3).button(BTN_POS(1,3), BTN_SIZE(2,1), F("Milk Chocolate"))
.tag(4).button(BTN_POS(1,4), BTN_SIZE(2,1), F("White Chocolate"))
.colors(action_btn)
.tag(1).button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_DONE));
}
}
@ -73,38 +57,20 @@ bool PreheatMenu::onTouchEnd(uint8_t tag) {
switch (tag) {
case 1: GOTO_PREVIOUS(); break;
case 2:
#ifdef COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_INT_SCRIPT
injectCommands(F(COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_INT_SCRIPT));
#ifdef COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_SCRIPT
injectCommands(F(COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_SCRIPT));
#endif
GOTO_SCREEN(PreheatTimerScreen);
break;
case 3:
#ifdef COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_INT_SCRIPT
injectCommands(F(COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_INT_SCRIPT));
#ifdef COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_SCRIPT
injectCommands(F(COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_SCRIPT));
#endif
GOTO_SCREEN(PreheatTimerScreen);
break;
case 4:
#ifdef COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_INT_SCRIPT
injectCommands(F(COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_INT_SCRIPT));
#endif
GOTO_SCREEN(PreheatTimerScreen);
break;
case 5:
#ifdef COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_EXT_SCRIPT
injectCommands(F(COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_EXT_SCRIPT));
#endif
GOTO_SCREEN(PreheatTimerScreen);
break;
case 6:
#ifdef COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_EXT_SCRIPT
injectCommands(F(COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_EXT_SCRIPT));
#endif
GOTO_SCREEN(PreheatTimerScreen);
break;
case 7:
#ifdef COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_EXT_SCRIPT
injectCommands(F(COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_EXT_SCRIPT));
#ifdef COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_SCRIPT
injectCommands(F(COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_SCRIPT));
#endif
GOTO_SCREEN(PreheatTimerScreen);
break;

View file

@ -89,20 +89,20 @@ void PreheatTimerScreen::draw_adjuster(draw_mode_t what, uint8_t tag, FSTR_P lab
cmd.tag(0)
.font(font_small);
if (what & BACKGROUND) {
cmd.text( SUB_POS(1,1), SUB_SIZE(9,1), label)
.button(SUB_POS(1,2), SUB_SIZE(5,1), F(""), OPT_FLAT);
cmd.text( SUB_POS(1,1), SUB_SIZE(9,1), label)
.button(SUB_POS(1,2), SUB_SIZE(5,1), F(""), OPT_FLAT);
}
if (what & FOREGROUND) {
char str[32];
dtostrf(value, 5, 1, str);
strcat_P(str, PSTR(" "));
strcat_P(str, (const char*) GET_TEXT_F(MSG_UNITS_C));
char str[32];
dtostrf(value, 5, 1, str);
strcat_P(str, PSTR(" "));
strcat_P(str, (const char*) GET_TEXT_F(MSG_UNITS_C));
cmd.text(SUB_POS(1,2), SUB_SIZE(5,1), str)
.font(font_medium)
.tag(tag ).button(SUB_POS(6,2), SUB_SIZE(2,1), F("-"))
.tag(tag+1).button(SUB_POS(8,2), SUB_SIZE(2,1), F("+"));
cmd.text(SUB_POS(1,2), SUB_SIZE(5,1), str)
.font(font_medium)
.tag(tag ).button(SUB_POS(6,2), SUB_SIZE(2,1), F("-"))
.tag(tag+1).button(SUB_POS(8,2), SUB_SIZE(2,1), F("+"));
}
}
@ -116,7 +116,9 @@ void PreheatTimerScreen::onRedraw(draw_mode_t what) {
draw_interaction_buttons(what);
draw_adjuster(what, 2, GET_TEXT_F(MSG_NOZZLE), getTargetTemp_celsius(E0), NOZZLE_ADJ_POS);
draw_adjuster(what, 4, GET_TEXT_F(MSG_BODY), getTargetTemp_celsius(E1), BODY_ADJ_POS);
draw_adjuster(what, 6, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER), CHAMBER_ADJ_POS);
#if HAS_HEATED_CHAMBER
draw_adjuster(what, 6, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER), CHAMBER_ADJ_POS);
#endif
}
bool PreheatTimerScreen::onTouchHeld(uint8_t tag) {
@ -126,8 +128,10 @@ bool PreheatTimerScreen::onTouchHeld(uint8_t tag) {
case 3: UI_INCREMENT(TargetTemp_celsius, E0); break;
case 4: UI_DECREMENT(TargetTemp_celsius, E1); break;
case 5: UI_INCREMENT(TargetTemp_celsius, E1); break;
case 6: UI_DECREMENT(TargetTemp_celsius, CHAMBER); break;
case 7: UI_INCREMENT(TargetTemp_celsius, CHAMBER); break;
#if HAS_HEATED_CHAMBER
case 6: UI_DECREMENT(TargetTemp_celsius, CHAMBER); break;
case 7: UI_INCREMENT(TargetTemp_celsius, CHAMBER); break;
#endif
default:
return false;
}

View file

@ -84,7 +84,6 @@ enum {
#include "../generic/base_numeric_adjustment_screen.h"
#include "../generic/dialog_box_base_class.h"
#include "../generic/boot_screen.h"
#include "../generic/about_screen.h"
#include "../generic/kill_screen.h"
#include "../generic/alert_dialog_box.h"
#include "../generic/spinner_dialog_box.h"
@ -105,13 +104,10 @@ enum {
#include "../generic/lock_screen.h"
#include "../generic/endstop_state_screen.h"
#include "../generic/display_tuning_screen.h"
#include "../generic/statistics_screen.h"
#include "../generic/stepper_current_screen.h"
#include "../generic/z_offset_screen.h"
#include "../generic/bed_mesh_base.h"
#include "../generic/bed_mesh_view_screen.h"
#include "../generic/bed_mesh_edit_screen.h"
#include "../generic/case_light_screen.h"
#include "../generic/linear_advance_screen.h"
#include "../generic/move_axis_screen.h"
#include "../generic/flow_percent_screen.h"
@ -132,3 +128,7 @@ enum {
#include "move_e_screen.h"
#include "files_screen.h"
#include "confirm_start_print_dialog_box.h"
#include "z_offset_screen.h"
#include "z_offset_wizard.h"
#include "about_screen.h"
#include "statistics_screen.h"

View file

@ -0,0 +1,83 @@
/*************************
* statistics_screen.cpp *
*************************/
/****************************************************************************
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
* *
* 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 3 of the License, 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. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <https://www.gnu.org/licenses/>. *
****************************************************************************/
#include "../config.h"
#include "../screens.h"
#ifdef COCOA_STATISTICS_SCREEN
using namespace FTDI;
using namespace ExtUI;
using namespace Theme;
#define GRID_COLS 4
#define GRID_ROWS 7
void StatisticsScreen::onRedraw(draw_mode_t what) {
CommandProcessor cmd;
if (what & BACKGROUND) {
char buffer[21];
cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color))
.cmd(CLEAR(true,true,true))
.cmd(COLOR_RGB(bg_text_enabled))
.tag(0)
.font(Theme::font_medium)
.text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXT_F(MSG_INFO_STATS_MENU))
.font(Theme::font_small)
.tag(0)
.text(BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_COUNT), OPT_RIGHTX | OPT_CENTERY)
.text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_COMPLETED_PRINTS), OPT_RIGHTX | OPT_CENTERY)
.text(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_TIME), OPT_RIGHTX | OPT_CENTERY)
.text(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_LONGEST), OPT_RIGHTX | OPT_CENTERY)
.text(BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_FILAMENT), OPT_RIGHTX | OPT_CENTERY);
// Don't chain the following, it causes strange issues with evaluation ordering!
cmd.text(BTN_POS(3,2), BTN_SIZE(2,1), getTotalPrints_str(buffer));
cmd.text(BTN_POS(3,3), BTN_SIZE(2,1), getFinishedPrints_str(buffer));
cmd.text(BTN_POS(3,4), BTN_SIZE(2,1), getTotalPrintTime_str(buffer));
cmd.text(BTN_POS(3,5), BTN_SIZE(2,1), getLongestPrint_str(buffer));
// Express in grams of chocolate rather than mm
const printStatistics stats = print_job_timer.getStats();
const long gramsChocolate = stats.filamentUsed * 0.53; // 1mm of extrusion is 0.53g
sprintf_P(buffer, PSTR("%ldg"), gramsChocolate);
cmd.text(BTN_POS(3,6), BTN_SIZE(2,1), buffer);
}
if (what & FOREGROUND) {
cmd.font(Theme::font_medium)
.colors(action_btn)
.tag(1).button(BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(MSG_BUTTON_DONE));
}
}
bool StatisticsScreen::onTouchEnd(uint8_t tag) {
switch (tag) {
case 1: GOTO_PREVIOUS(); return true;
default: return false;
}
}
#endif // COCOA_STATISTICS_SCREEN

View file

@ -0,0 +1,32 @@
/***********************
* statistics_screen.h *
***********************/
/****************************************************************************
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
* *
* 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 3 of the License, 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. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <https://www.gnu.org/licenses/>. *
****************************************************************************/
#pragma once
#define COCOA_STATISTICS_SCREEN
#define COCOA_STATISTICS_SCREEN_CLASS StatisticsScreen
class StatisticsScreen : public BaseScreen, public UncachedScreen {
public:
static void onRedraw(draw_mode_t);
static bool onTouchEnd(uint8_t tag);
};

View file

@ -23,22 +23,30 @@
#include "../config.h"
#include "../screens.h"
#include "../screen_data.h"
#ifdef COCOA_STATUS_SCREEN
#include "cocoa_press_ui.h"
#include "cocoa_press_bitmap.h"
#define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0]))
#define ICON_POS(x,y,w,h) x, y, h, h
#define TEXT_POS(x,y,w,h) x + h, y, w - h, h
const uint8_t shadow_depth = 5;
using namespace FTDI;
using namespace Theme;
using namespace ExtUI;
float StatusScreen::increment;
const uint8_t shadow_depth = 5;
constexpr static StatusScreenData &mydata = screen_data.StatusScreen;
// Format for background image
constexpr uint8_t format = RGB332;
constexpr uint16_t bitmap_w = 800;
constexpr uint16_t bitmap_h = 480;
void StatusScreen::_format_time(char *outstr, uint32_t time) {
const uint8_t hrs = time / 3600,
@ -69,6 +77,64 @@ void StatusScreen::loadBitmaps() {
#endif
}
void StatusScreen::draw_bkgnd(draw_mode_t what) {
if (what & BACKGROUND) {
constexpr float scale_w = float(FTDI::display_width)/bitmap_w;
constexpr float scale_h = float(FTDI::display_height)/bitmap_h;
uint16_t linestride;
uint32_t color;
switch (format) {
case RGB565: linestride = bitmap_w * 2; color = 0xFFFFFF; break;
case RGB332: linestride = bitmap_w ; color = 0xFFFFFF; break;
case L1: linestride = bitmap_w/8 ; color = 0x000000; break;
case L2: linestride = bitmap_w/4 ; color = 0x000000; break;
case L4: linestride = bitmap_w/2 ; color = 0x000000; break;
case L8: linestride = bitmap_w ; color = 0x000000; break;
}
CommandProcessor cmd;
cmd.cmd(COLOR_RGB(color))
.cmd(BITMAP_SOURCE(BACKGROUND_OFFSET))
.tag(0)
.bitmap_layout(format, linestride, bitmap_h)
.bitmap_size(NEAREST, BORDER, BORDER, bitmap_w*scale_w, bitmap_h*scale_h)
.cmd(BITMAP_TRANSFORM_A(uint32_t(float(256)/scale_w)))
.cmd(BITMAP_TRANSFORM_E(uint32_t(float(256)/scale_h)))
.cmd(BEGIN(BITMAPS))
.cmd(VERTEX2II(0, 0, 0, 0))
.cmd(BITMAP_TRANSFORM_A(256))
.cmd(BITMAP_TRANSFORM_E(256))
.cmd(COLOR_RGB(bg_text_enabled));
}
}
void StatusScreen::send_buffer(CommandProcessor &cmd, const void *data, uint16_t len) {
const char *ptr = (const char*) data;
constexpr uint16_t block_size = 512;
char block[block_size];
for (;len > 0;) {
const uint16_t nBytes = min(len, block_size);
memcpy_P(block, ptr, nBytes);
cmd.write((const void*)block, nBytes);
cmd.execute();
if(cmd.has_fault()) {
SERIAL_ECHOLNPGM("Recovering from fault: ");
cmd.reset();
delay(1000);
return;
}
ptr += nBytes;
len -= nBytes;
}
}
void StatusScreen::load_background(const void *data, uint16_t len) {
CommandProcessor cmd;
cmd.inflate(BACKGROUND_OFFSET)
.execute();
send_buffer(cmd, data, len);
cmd.wait();
}
void StatusScreen::draw_time(draw_mode_t what) {
CommandProcessor cmd;
PolyUI ui(cmd, what);
@ -96,23 +162,27 @@ void StatusScreen::draw_time(draw_mode_t what) {
}
}
void StatusScreen::draw_progress(draw_mode_t what) {
void StatusScreen::draw_percent(draw_mode_t what) {
CommandProcessor cmd;
PolyUI ui(cmd, what);
int16_t x, y, w, h;
cmd.cmd(COLOR_RGB(accent_color_1));
cmd.font(font_medium);
ui.bounds(POLY(print_time_pct), x, y, w, h);
if (what & FOREGROUND) {
// Draw progress bar
ui.bounds(POLY(file_name), x, y, w, h);
const uint16_t bar_width = w * getProgress_percent() / 100;
cmd.tag(8)
.cmd(COLOR_RGB(accent_color_5))
.rectangle(x, y, bar_width, h);
const uint16_t current_progress = TERN(HAS_PRINT_PROGRESS_PERMYRIAD, getProgress_permyriad(), getProgress_percent() * 100);
char progress_str[10];
sprintf_P(progress_str,
#if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS)
PSTR("%3d.%02d%%"), uint8_t(current_progress / 100), current_progress % 100
#else
PSTR("%3d%%"), uint8_t(current_progress / 100)
#endif
);
cmd.font(font_medium)
.cmd(COLOR_RGB(bg_text_enabled))
.text(TEXT_POS(x, y, w, h), progress_str);
}
}
@ -123,17 +193,8 @@ void StatusScreen::draw_temperature(draw_mode_t what) {
int16_t x, y, w, h;
if (what & BACKGROUND) {
cmd.cmd(COLOR_RGB(fluid_rgb));
cmd.font(font_medium).tag(10);
/*ui.bounds(POLY(temp_lbl), x, y, w, h);
cmd.text(x, y, w, h, F("Temp"));
ui.bounds(POLY(set_lbl), x, y, w, h);
cmd.text(x, y, w, h, F("Set"));*/
ui.bounds(POLY(chocolate_label), x, y, w, h);
cmd.text(x, y, w, h, F("Cocoa Press"));
cmd.cmd(COLOR_RGB(bg_text_enabled));
cmd.font(font_medium).tag(0);
ui.bounds(POLY(h0_label), x, y, w, h);
cmd.text(x, y, w, h, GET_TEXT_F(MSG_NOZZLE));
@ -141,18 +202,6 @@ void StatusScreen::draw_temperature(draw_mode_t what) {
ui.bounds(POLY(h1_label), x, y, w, h);
cmd.text(x, y, w, h, GET_TEXT_F(MSG_BODY));
#if ENABLED(COCOA_PRESS_EXTRA_HEATER)
if (has_extra_heater()) {
ui.bounds(POLY(h2_label), x, y, w, h);
cmd.text(x, y, w, h, GET_TEXT_F(MSG_EXTERNAL));
}
#endif
#if ENABLED(COCOA_PRESS_CHAMBER_COOLER)
ui.bounds(POLY(h3_label), x, y, w, h);
cmd.text(x, y, w, h, GET_TEXT_F(MSG_CHAMBER));
#endif
#if ENABLED(TOUCH_UI_USE_UTF8)
load_utf8_bitmaps(cmd); // Restore font bitmap handles
#endif
@ -160,116 +209,80 @@ void StatusScreen::draw_temperature(draw_mode_t what) {
if (what & FOREGROUND) {
char str[15];
cmd.cmd(COLOR_RGB(fluid_rgb));
cmd.font(font_large).tag(10);
cmd.font(font_medium).colors(normal_btn).tag(10);
// Show the actual temperatures
format_temp(str, getActualTemp_celsius(E0));
ui.bounds(POLY(h0_temp), x, y, w, h);
cmd.text(x, y, w, h, str);
cmd.button(x, y, w, h, str);
format_temp(str, getActualTemp_celsius(E1));
ui.bounds(POLY(h1_temp), x, y, w, h);
cmd.text(x, y, w, h, str);
#if ENABLED(COCOA_PRESS_EXTRA_HEATER)
if (has_extra_heater()) {
format_temp(str, getActualTemp_celsius(E2));
ui.bounds(POLY(h2_temp), x, y, w, h);
cmd.text(x, y, w, h, str);
}
#endif
#if ENABLED(COCOA_PRESS_CHAMBER_COOLER)
format_temp(str, getActualTemp_celsius(CHAMBER));
ui.bounds(POLY(h3_temp), x, y, w, h);
cmd.text(x, y, w, h, str);
#endif
/*// Show the set temperatures
format_temp(str, getTargetTemp_celsius(E0));
ui.bounds(POLY(h0_set), x, y, w, h);
cmd.text(x, y, w, h, str);
format_temp(str, getTargetTemp_celsius(E1));
ui.bounds(POLY(h1_set), x, y, w, h);
cmd.text(x, y, w, h, str);
#if ENABLED(COCOA_PRESS_EXTRA_HEATER)
if (has_extra_heater()) {
format_temp(str, getTargetTemp_celsius(E2));
ui.bounds(POLY(h2_set), x, y, w, h);
cmd.text(x, y, w, h, str);
}
#endif
#if ENABLED(COCOA_PRESS_CHAMBER_COOLER)
format_temp(str, getTargetTemp_celsius(CHAMBER));
ui.bounds(POLY(h3_set), x, y, w, h);
cmd.text(x, y, w, h, str);
#endif*/
cmd.button(x, y, w, h, str);
}
}
void StatusScreen::draw_buttons(draw_mode_t what) {
int16_t x, y, w, h;
if (what & FOREGROUND) {
int16_t x, y, w, h;
const bool can_print = !isPrinting() && isMediaInserted() && isFileSelected();
const bool can_select = !isPrinting() && isMediaInserted();
const bool sdOrHostPrinting = ExtUI::isPrinting();
const bool sdOrHostPaused = ExtUI::isPrintingPaused();
const bool can_print = !isPrinting() && isMediaInserted() && isFileSelected();
const bool can_select = !isPrinting() && isMediaInserted();
const bool sdOrHostPrinting = ExtUI::isPrinting();
const bool sdOrHostPaused = ExtUI::isPrintingPaused();
CommandProcessor cmd;
PolyUI ui(cmd, what);
CommandProcessor cmd;
PolyUI ui(cmd, what);
cmd.font(font_medium).colors(normal_btn);
cmd.font(font_medium).colors(normal_btn);
ui.bounds(POLY(load_chocolate_btn), x, y, w, h);
cmd.tag(1).button(x, y, w, h, GET_TEXT_F(MSG_LOAD_UNLOAD));
ui.bounds(POLY(load_chocolate_btn), x, y, w, h);
cmd.tag(1).button(x, y, w, h, GET_TEXT_F(MSG_LOAD_UNLOAD));
ui.bounds(POLY(extrude_btn), x, y, w, h);
cmd.tag(2).button(x, y, w, h, GET_TEXT_F(MSG_EXTRUDE));
ui.bounds(POLY(extrude_btn), x, y, w, h);
cmd.tag(2).button(x, y, w, h, GET_TEXT_F(MSG_EXTRUDE));
ui.bounds(POLY(preheat_chocolate_btn), x, y, w, h);
cmd.tag(3).button(x, y, w, h, GET_TEXT_F(MSG_PREHEAT_CHOCOLATE));
ui.bounds(POLY(preheat_chocolate_btn), x, y, w, h);
cmd.tag(3).button(x, y, w, h, GET_TEXT_F(MSG_PREHEAT_CHOCOLATE));
ui.bounds(POLY(menu_btn), x, y, w, h);
cmd.tag(4).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_MENU));
ui.bounds(POLY(menu_btn), x, y, w, h);
cmd.tag(4).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_MENU));
ui.bounds(POLY(media_btn), x, y, w, h);
cmd.tag(5).enabled(can_select).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_MEDIA));
ui.bounds(POLY(media_btn), x, y, w, h);
cmd.tag(5).enabled(can_select).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_MEDIA));
ui.bounds(POLY(print_btn), x, y, w, h);
cmd.tag(6).colors(action_btn).enabled(can_print).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_PRINT));
ui.bounds(POLY(print_btn), x, y, w, h);
cmd.tag(6).colors(action_btn).enabled(can_print).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_PRINT));
ui.bounds(POLY(pause_btn), x, y, w, h);
cmd.tag(sdOrHostPaused ? 8 : 7).enabled(sdOrHostPrinting).button(x, y, w, h, sdOrHostPaused ? GET_TEXT_F(MSG_BUTTON_RESUME) : GET_TEXT_F(MSG_BUTTON_PAUSE));
ui.bounds(POLY(pause_btn), x, y, w, h);
cmd.tag(sdOrHostPaused ? 8 : 7).enabled(sdOrHostPrinting).button(x, y, w, h, sdOrHostPaused ? GET_TEXT_F(MSG_BUTTON_RESUME) : GET_TEXT_F(MSG_BUTTON_PAUSE));
ui.bounds(POLY(stop_btn), x, y, w, h);
cmd.tag(9).enabled(sdOrHostPrinting).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_STOP));
ui.bounds(POLY(stop_btn), x, y, w, h);
cmd.tag(9).enabled(sdOrHostPrinting).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_STOP));
}
}
// When visible, the file name occupies the same space as the status
// message and must be drawn opaque.
void StatusScreen::draw_file(draw_mode_t what) {
int16_t x, y, w, h;
if (mydata.gotMessage) return;
CommandProcessor cmd;
PolyUI ui(cmd, what);
if (what & FOREGROUND) {
int16_t x, y, w, h;
ui.bounds(POLY(file_name), x, y, w, h);
CommandProcessor cmd;
PolyUI ui(cmd, what);
ui.bounds(POLY(file_name), x, y, w, h);
if (what & BACKGROUND) {
cmd.tag(5)
.cmd(COLOR_RGB(bg_text_enabled))
.cmd (COLOR_RGB(bg_color))
.rectangle(x, y, w, h)
.cmd (COLOR_RGB(bg_text_enabled))
.cmd (BITMAP_SOURCE(File_Icon_Info))
.cmd (BITMAP_LAYOUT(File_Icon_Info))
.cmd (BITMAP_SIZE (File_Icon_Info))
.icon(ICON_POS(x, y, w, h), File_Icon_Info, icon_scale);
}
if (what & FOREGROUND) {
cmd.cmd(COLOR_RGB(bg_text_enabled));
if (!isMediaInserted())
draw_text_with_ellipsis(cmd, TEXT_POS(x, y, w, h), F("No media present"), OPT_CENTERY, font_small);
@ -282,6 +295,21 @@ void StatusScreen::draw_file(draw_mode_t what) {
}
}
// The message will be drawn on the background and may be obscured by
// the filename.
void StatusScreen::draw_message(draw_mode_t what, const char *message) {
if (what & BACKGROUND) {
int16_t x, y, w, h;
CommandProcessor cmd;
PolyUI ui(cmd, what);
ui.bounds(POLY(file_name), x, y, w, h);
cmd.cmd(COLOR_RGB(bg_text_enabled));
draw_text_box(cmd, TEXT_POS(x, y, w, h), message, OPT_CENTERY, font_small);
}
}
bool StatusScreen::isFileSelected() {
if (!isMediaInserted()) return false;
FileList list;
@ -292,23 +320,14 @@ bool StatusScreen::isFileSelected() {
}
void StatusScreen::onRedraw(draw_mode_t what) {
if (what & BACKGROUND) {
CommandProcessor cmd;
cmd.cmd(CLEAR_COLOR_RGB(bg_color))
.cmd(CLEAR(true,true,true))
.tag(0);
if (what & FOREGROUND) {
draw_bkgnd(what);
draw_file(what);
draw_time(what);
draw_percent(what);
draw_temperature(what);
draw_buttons(what);
}
draw_file(what);
draw_time(what);
draw_progress(what);
draw_temperature(what);
draw_buttons(what);
}
bool StatusScreen::onTouchStart(uint8_t) {
increment = 0;
return true;
}
bool StatusScreen::onTouchEnd(uint8_t tag) {
@ -353,17 +372,55 @@ bool StatusScreen::onTouchEnd(uint8_t tag) {
bool StatusScreen::onTouchHeld(uint8_t tag) {
if (tag == 2 && !ExtUI::isMoving()) {
LoadChocolateScreen::setManualFeedrateAndIncrement(1, increment);
float increment;
LoadChocolateScreen::setManualFeedrateAndIncrement(0.25, increment);
UI_INCREMENT(AxisPosition_mm, E0);
current_screen.onRefresh();
}
return false;
}
void StatusScreen::setStatusMessage(FSTR_P) {
void StatusScreen::setStatusMessage(FSTR_P message) {
char buff[strlen_P((const char * const)message)+1];
strcpy_P(buff, (const char * const) message);
setStatusMessage((const char *) buff);
}
void StatusScreen::setStatusMessage(const char * const) {
void StatusScreen::setStatusMessage(const char * const message) {
if (CommandProcessor::is_processing()) {
#if ENABLED(TOUCH_UI_DEBUG)
SERIAL_ECHO_MSG("Cannot update status message, command processor busy");
#endif
return;
}
CommandProcessor cmd;
cmd.cmd(CMD_DLSTART)
.cmd(CLEAR_COLOR_RGB(bg_color))
.cmd(CLEAR(true,true,true));
const draw_mode_t what = BACKGROUND;
draw_bkgnd(what);
draw_message(what, message);
draw_time(what);
draw_percent(what);
draw_temperature(what);
draw_buttons(what);
storeBackground();
#if ENABLED(TOUCH_UI_DEBUG)
SERIAL_ECHO_MSG("New status message: ", message);
#endif
mydata.gotMessage = true;
if (AT_SCREEN(StatusScreen))
current_screen.onRefresh();
}
void StatusScreen::onEntry() {
mydata.gotMessage = false;
load_background(cocoa_press_ui, sizeof(cocoa_press_ui));
}
void StatusScreen::onIdle() {

View file

@ -26,31 +26,35 @@
#define COCOA_STATUS_SCREEN
#define COCOA_STATUS_SCREEN_CLASS StatusScreen
class StatusScreen : public BaseScreen, public CachedScreen<STATUS_SCREEN_CACHE> {
struct StatusScreenData {
bool gotMessage;
};
class StatusScreen : public BaseScreen, public CachedScreen<STATUS_SCREEN_CACHE, STATUS_SCREEN_DL_SIZE> {
private:
static void _format_time(char *outstr, uint32_t time);
static float increment;
static bool jog_xy;
static bool fine_motion;
static void draw_time(draw_mode_t what);
static void draw_progress(draw_mode_t what);
static void draw_percent(draw_mode_t what);
static void draw_temperature(draw_mode_t what);
static void draw_buttons(draw_mode_t what);
static void draw_file(draw_mode_t what);
static void draw_message(draw_mode_t what, const char *message);
static void draw_bkgnd(draw_mode_t what);
static void send_buffer(CommandProcessor &cmd, const void *data, uint16_t len);
static void load_background(const void *data, uint16_t len);
static bool isFileSelected();
public:
static void loadBitmaps();
static void unlockMotors();
static void setStatusMessage(const char *);
static void setStatusMessage(FSTR_P);
static void onRedraw(draw_mode_t);
static bool onTouchStart(uint8_t tag);
static void onEntry();
static bool onTouchHeld(uint8_t tag);
static bool onTouchEnd(uint8_t tag);
static void onIdle();

View file

@ -0,0 +1,59 @@
/***********************
* z_offset_screen.cpp *
***********************/
/****************************************************************************
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
* *
* 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 3 of the License, 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. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <https://www.gnu.org/licenses/>. *
****************************************************************************/
#include "../config.h"
#include "../screens.h"
#include "../screen_data.h"
#ifdef COCOA_Z_OFFSET_SCREEN
#include "z_offset_wizard.h"
using namespace FTDI;
using namespace ExtUI;
using namespace Theme;
void ZOffsetScreen::onRedraw(draw_mode_t what) {
widgets_t w(what);
w.precision(2, BaseNumericAdjustmentScreen::DEFAULT_MIDRANGE).units(GET_TEXT_F(MSG_UNITS_MM));
w.heading( GET_TEXT_F(MSG_ZPROBE_ZOFFSET));
w.color(z_axis).adjuster(4, GET_TEXT_F(MSG_ZPROBE_ZOFFSET), getZOffset_mm());
w.increments();
w.button(2, GET_TEXT_F(MSG_PROBE_WIZARD), !isPrinting());
}
bool ZOffsetScreen::onTouchHeld(uint8_t tag) {
const int16_t steps = TERN(BABYSTEPPING, mmToWholeSteps(getIncrement(), Z), 0);
const float increment = TERN(BABYSTEPPING, mmFromWholeSteps(steps, Z), getIncrement());
switch (tag) {
case 2: ZOffsetWizard::runWizard(); break;
case 4: UI_DECREMENT(ZOffset_mm); TERN(BABYSTEPPING, babystepAxis_steps(-steps, Z), UNUSED(steps)); break;
case 5: UI_INCREMENT(ZOffset_mm); TERN(BABYSTEPPING, babystepAxis_steps( steps, Z), UNUSED(steps)); break;
default:
return false;
}
SaveSettingsDialogBox::settingsChanged();
return true;
}
#endif // COCOA_Z_OFFSET_SCREEN

View file

@ -0,0 +1,32 @@
/***********************
* z_offset_screen.h *
***********************/
/****************************************************************************
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
* *
* 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 3 of the License, 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. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <https://www.gnu.org/licenses/>. *
****************************************************************************/
#pragma once
#define COCOA_Z_OFFSET_SCREEN
#define COCOA_Z_OFFSET_SCREEN_CLASS ZOffsetScreen
class ZOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen<ZOFFSET_SCREEN_CACHE> {
public:
static void onRedraw(draw_mode_t);
static bool onTouchHeld(uint8_t tag);
};

View file

@ -0,0 +1,162 @@
/***********************
* z_offset_screen.cpp *
***********************/
/****************************************************************************
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
* *
* 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 3 of the License, 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. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <https://www.gnu.org/licenses/>. *
****************************************************************************/
#include "../config.h"
#include "../screens.h"
#include "../screen_data.h"
#ifdef COCOA_Z_OFFSET_WIZARD
#include "cocoa_press_ui.h"
using namespace FTDI;
using namespace ExtUI;
using namespace Theme;
#define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0]))
#define SHEET_THICKNESS 0.1
constexpr static ZOffsetWizardData &mydata = screen_data.ZOffsetWizard;
void ZOffsetWizard::onEntry() {
mydata.increment = 242;
mydata.softEndstopState = getSoftEndstopState();
BaseNumericAdjustmentScreen::onEntry();
setSoftEndstopState(false);
}
void ZOffsetWizard::onExit() {
setSoftEndstopState(mydata.softEndstopState);
}
void ZOffsetWizard::onRedraw(draw_mode_t what) {
int16_t x, y, w, h;
CommandProcessor cmd;
PolyUI ui(cmd, what);
cmd.cmd(CLEAR_COLOR_RGB(bg_color))
.cmd(CLEAR(true,true,true))
.tag(0)
.font(font_medium).colors(normal_btn);
char b[32];
dtostrf(getZOffset_mm(), 5, 2, b);
strcat_P(b, PSTR(" mm"));
ui.bounds(POLY(z_wizard_edit_box), x, y, w, h);
cmd.tag(0).fgcolor(z_axis).button(x, y, w, h, b);
#define PREAMBLE(TAG) cmd.tag(TAG).colors(mydata.increment == TAG ? action_btn : normal_btn)
ui.bounds(POLY(z_wizard_inc1_btn), x, y, w, h);
PREAMBLE(241).button(x, y, w, h, F("0.01"));
ui.bounds(POLY(z_wizard_inc2_btn), x, y, w, h);
PREAMBLE(242).button(x, y, w, h, F("0.1"));
ui.bounds(POLY(z_wizard_inc3_btn), x, y, w, h);
PREAMBLE(243).button(x, y, w, h, F("1.0"));
ui.bounds(POLY(z_wizard_neg_btn), x, y, w, h);
cmd.tag(4).colors(action_btn).button(x, y, w, h, F(""));
drawArrow(x, y, w, h, DOWN);
ui.bounds(POLY(z_wizard_plus_btn), x, y, w, h);
cmd.tag(5).colors(action_btn).button(x, y, w, h, F(""));
drawArrow(x, y, w, h, UP);
ui.bounds(POLY(z_wizard_done_btn), x, y, w, h);
cmd.tag(1).colors(action_btn).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_DONE));
cmd.tag(0);
ui.color(bg_text_enabled);
ui.fill(POLY(z_wizard_diagram));
ui.bounds(POLY(z_wizard_heading), x, y, w, h);
cmd.font(font_large)
.text(x, y, w, h, F("Z Probe Wizard"));
}
float ZOffsetWizard::getIncrement() {
switch (mydata.increment) {
case 241: return 0.01;
case 242: return 0.1;
case 243: return 1.0;
default: return 0.0;
}
}
void ZOffsetWizard::runWizard() {
// Restore the default Z offset
constexpr float offset[] = NOZZLE_TO_PROBE_OFFSET;
setZOffset_mm(offset[Z_AXIS]);
// Move above probe point
char cmd[64], str[10];
strcpy_P(cmd, PSTR("G28 Z\nG0 F1000 X"));
dtostrf(TERN(Z_SAFE_HOMING,Z_SAFE_HOMING_X_POINT,X_CENTER), 3, 1, str);
strcat(cmd, str);
strcat_P(cmd, PSTR("Y"));
dtostrf(TERN(Z_SAFE_HOMING,Z_SAFE_HOMING_Y_POINT,Y_CENTER), 3, 1, str);
strcat(cmd, str);
strcat_P(cmd, PSTR("Z"));
dtostrf(SHEET_THICKNESS, 3, 1, str);
strcat(cmd, str);
injectCommands(cmd);
// Show instructions for user.
AlertDialogBox::show(F("\nOn the next screen, adjust the Z Offset so that a sheet of paper can pass between the nozzle and bed with slight resistance.\n\nOnce the printer stops moving, press Okay to begin.\n"));
// Set the destination screen after the dialog box.
current_screen.forget();
PUSH_SCREEN(ZOffsetWizard);
}
bool ZOffsetWizard::onTouchEnd(uint8_t tag) {
switch (tag) {
case 1:
GOTO_PREVIOUS();
break;
case 4:
case 5:
return onTouchHeld(tag);
case 241 ... 243:
mydata.increment = tag;
break;
default:
return false;
}
return true;
}
bool ZOffsetWizard::onTouchHeld(uint8_t tag) {
const float increment = TERN(BABYSTEPPING,
mmFromWholeSteps(mmToWholeSteps(getIncrement(), Z), Z), // Round increment to nearest steps
getIncrement()
);
switch (tag) {
case 4: UI_DECREMENT(ZOffset_mm); UI_DECREMENT(AxisPosition_mm, Z); break;
case 5: UI_INCREMENT(ZOffset_mm); UI_INCREMENT(AxisPosition_mm, Z); break;
default:
return false;
}
SaveSettingsDialogBox::settingsChanged();
return true;
}
#endif // COCOA_Z_OFFSET_WIZARD

View file

@ -0,0 +1,43 @@
/***********************
* z_offset_screen.h *
***********************/
/****************************************************************************
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
* *
* 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 3 of the License, 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. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <https://www.gnu.org/licenses/>. *
****************************************************************************/
#pragma once
#define COCOA_Z_OFFSET_WIZARD
#define COCOA_Z_OFFSET_WIZARD_CLASS ZOffsetWizard
struct ZOffsetWizardData : public BaseNumericAdjustmentScreenData {
uint8_t increment;
bool softEndstopState;
};
class ZOffsetWizard : public BaseScreen, public UncachedScreen {
private:
static float getIncrement();
public:
static void runWizard();
static void onEntry();
static void onExit();
static void onRedraw(draw_mode_t);
static bool onTouchHeld(uint8_t tag);
static bool onTouchEnd(uint8_t tag);
};

View file

@ -177,6 +177,14 @@ void CLCD::mem_write_pgm(uint32_t reg_address, const void *data, uint16_t len, u
spi_ftdi_deselect();
}
// Write 3-Byte Address, Multiple Bytes, plus padding bytes, from PROGMEM, reversing bytes (suitable for loading XBM images)
void CLCD::mem_write_xbm(uint32_t reg_address, const void *data, uint16_t len, uint8_t padding) {
spi_ftdi_select();
spi_write_addr(reg_address);
spi_write_bulk<xbm_write>(data, len, padding);
spi_ftdi_deselect();
}
// Write 3-Byte Address, Multiple Bytes, plus padding bytes, from PROGMEM, reversing bytes (suitable for loading XBM images)
void CLCD::mem_write_xbm(uint32_t reg_address, FSTR_P data, uint16_t len, uint8_t padding) {
spi_ftdi_select();

View file

@ -118,6 +118,7 @@ class CLCD {
static void mem_write_fill (uint32_t reg_address, uint8_t w_data, uint16_t len);
static void mem_write_bulk (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0);
static void mem_write_pgm (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0);
static void mem_write_xbm (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0);
static void mem_write_bulk (uint32_t reg_address, FSTR_P str, uint16_t len, uint8_t padding = 0);
static void mem_write_xbm (uint32_t reg_address, FSTR_P str, uint16_t len, uint8_t padding = 0);

View file

@ -66,14 +66,6 @@
* character (this is not the unicode codepoint)
*/
utf8_char_t FTDI::get_utf8_char_and_inc(char *&c) {
utf8_char_t val = *(uint8_t*)c++;
if ((val & 0xC0) == 0xC0)
while ((*c & 0xC0) == 0x80)
val = (val << 8) | *(uint8_t*)c++;
return val;
}
utf8_char_t FTDI::get_utf8_char_and_inc(const char *&c) {
utf8_char_t val = *(uint8_t*)c++;
if ((val & 0xC0) == 0xC0)

View file

@ -47,7 +47,6 @@ namespace FTDI {
* pointer to the next character */
utf8_char_t get_utf8_char_and_inc(const char *&c);
utf8_char_t get_utf8_char_and_inc(char *&c);
/* Returns the next character in a UTF8 string, without incrementing */

View file

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/python3
# Written By Marcio Teixeira 2018 - Aleph Objects, Inc.
#
@ -18,6 +18,8 @@
from __future__ import print_function
import argparse,re,sys
from html.parser import HTMLParser
usage = '''
This program extracts line segments from a SVG file and writes
them as coordinates in a C array. The x and y values will be
@ -107,19 +109,16 @@ class ComputeBoundingBox:
print("constexpr float y_max = %f;" % self.y_max)
print()
def from_svg_view_box(self, svg):
s = re.search('<svg[^>]+>', svg);
if s:
m = re.search('viewBox="([0-9-.]+) ([0-9-.]+) ([0-9-.]+) ([0-9-.]+)"', svg)
if m:
self.x_min = float(m[1])
self.y_min = float(m[2])
self.x_max = float(m[3])
self.y_max = float(m[4])
return True
def from_svg_view_box(self, viewbox):
m = re.search('([0-9-.]+) ([0-9-.]+) ([0-9-.]+) ([0-9-.]+)', viewbox)
if m:
self.x_min = float(m[1])
self.y_min = float(m[2])
self.x_max = float(m[3])
self.y_max = float(m[4])
return True
return False
# op
class WriteDataStructure:
def __init__(self, bounding_box):
self.bounds = bounding_box
@ -143,19 +142,29 @@ class WriteDataStructure:
print("const PROGMEM uint16_t", id + "[] = {" + ", ".join (self.hex_words) + "};")
self.hex_words = []
class Parser:
def __init__(self, op):
self.op = op
self.reset()
class SVGParser(HTMLParser):
def __init__(self, args):
super().__init__()
self.args = args
self.tags = []
self.groups = []
self.op = None
self.restart()
def reset(self):
def set_consumer(self, op):
self.op = op
if self.op:
self.op.reset()
def restart(self):
self.last_x = 0
self.last_y = 0
self.initial_x = 0
self.initial_y = 0
def process_svg_path_L_or_M(self, cmd, x, y):
self.op.command(cmd, x, y)
if self.op:
self.op.command(cmd, x, y)
self.last_x = x
self.last_y = y
if cmd == "M":
@ -239,42 +248,71 @@ class Parser:
print("Syntax error:", d, "in path", id, "\n", file=sys.stderr)
quit()
def process_svg_paths(self, svg):
self.op.reset()
for path in re.findall('<path[^>]+>', svg):
id = "<none>"
m = re.search(' id="(.*)"', path)
if m:
id = m[1]
def find_attr(attrs, what):
for attr, value in attrs:
if attr == what:
return value
m = re.search(' transform="(.*)"', path)
if m:
def layer_matches(self):
""" Are we in the correct layer?"""
if not self.args.layer:
return True
for l in self.groups:
if l and l.find(self.args.layer) != -1:
return True
return False
def handle_starttag(self, tag, attrs):
self.tags.append(tag)
if tag == 'svg':
self.viewbox = SVGParser.find_attr(attrs, 'viewbox')
if tag == 'g':
label = SVGParser.find_attr(attrs, 'inkscape:label')
self.groups.append(label)
if label and self.layer_matches():
print("Reading layer:", label, file=sys.stderr)
if tag == 'path' and self.layer_matches():
id = SVGParser.find_attr(attrs, 'id')
transform = SVGParser.find_attr(attrs, 'transform')
if transform:
print("Found transform in path", id, "! Cannot process file!", file=sys.stderr)
quit()
d = SVGParser.find_attr(attrs, 'd')
if d:
self.process_svg_path_data(id, d)
if self.op:
self.op.path_finished(id)
self.restart()
m = re.search(' d="(.*)"', path)
if m:
self.process_svg_path_data(id, m[1])
self.op.path_finished(id)
self.reset()
def handle_endtag(self, tag):
if tag == 'g':
self.groups.pop()
if tag != self.tags.pop():
print("Error popping tag off list")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("filename")
parser.add_argument('--layer', help='only include layers which have this string in their names')
args = parser.parse_args()
f = open(args.filename, "r")
data = f.read()
print(header)
# First pass to grab viewbox
p = SVGParser(args)
p.feed(data)
b = ComputeBoundingBox()
if not b.from_svg_view_box(data):
if not b.from_svg_view_box(p.viewbox):
# Can't find the view box, so use the bounding box of the elements themselves.
p = Parser(b)
p.process_svg_paths(data)
b.write()
p = SVGParser(args)
p.set_consumer(b)
p.feed(data)
b.write()
# Last pass to process paths
w = WriteDataStructure(b)
p = Parser(w)
p.process_svg_paths(data)
p = SVGParser(args)
p.set_consumer(w)
p.feed(data)

View file

@ -174,11 +174,11 @@ bool BedMeshEditScreen::onTouchEnd(uint8_t tag) {
case 1:
// On Cancel, reload saved mesh, discarding changes
GOTO_PREVIOUS();
injectCommands(F("G29 L1"));
injectCommands(F(TERN(AUTO_BED_LEVELING_UBL, "G29 L1", "M501")));
return true;
case 2:
saveAdjustedHighlightedValue();
injectCommands(F("G29 S1"));
injectCommands(F(TERN(AUTO_BED_LEVELING_UBL, "G29 S1", "M500")));
mydata.needSave = false;
return true;
case 3:
@ -191,7 +191,7 @@ bool BedMeshEditScreen::onTouchEnd(uint8_t tag) {
void BedMeshEditScreen::show() {
// On entry, always home (to account for possible Z offset changes) and save current mesh
SpinnerDialogBox::enqueueAndWait(F("G28\nG29 S1"));
SpinnerDialogBox::enqueueAndWait(F("G28\n" TERN(AUTO_BED_LEVELING_UBL, "G29 S1", "M500")));
// After the spinner, go to this screen.
current_screen.forget();
PUSH_SCREEN(BedMeshEditScreen);

View file

@ -53,10 +53,7 @@ constexpr static float gaugeThickness = 0.25;
#endif
static float meshGetter(uint8_t x, uint8_t y, void*) {
xy_uint8_t pos;
pos.x = x;
pos.y = y;
return ExtUI::getMeshPoint(pos);
return ExtUI::getMeshPoint(xy_uint8_t(x, y));
}
void BedMeshViewScreen::onEntry() {
@ -158,7 +155,7 @@ void BedMeshViewScreen::doProbe() {
}
void BedMeshViewScreen::show() {
injectCommands(F("G29 L1"));
TERN_(AUTO_BED_LEVELING_UBL, injectCommands(F("G29 L1")));
GOTO_SCREEN(BedMeshViewScreen);
}

View file

@ -43,7 +43,7 @@ void MainMenu::onRedraw(draw_mode_t what) {
#define ADVANCED_SETTINGS_POS BTN_POS(1,2), BTN_SIZE(2,1)
#if ENABLED(CUSTOM_MENU_MAIN)
#define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(1,1)
#define CUSTOM_MENU_POS BTN_POS(2,3), BTN_SIZE(1,1)
#define CUSTOM_MENU_POS BTN_POS(2,3), BTN_SIZE(1,1)
#else
#define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(2,1)
#endif
@ -66,7 +66,7 @@ void MainMenu::onRedraw(draw_mode_t what) {
#if ENABLED(CUSTOM_MENU_MAIN)
#define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(2,1)
#define FILAMENTCHANGE_POS BTN_POS(3,4), BTN_SIZE(2,1)
#define CUSTOM_MENU_POS BTN_POS(5,4), BTN_SIZE(2,1)
#define CUSTOM_MENU_POS BTN_POS(5,4), BTN_SIZE(2,1)
#else
#define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(3,1)
#define FILAMENTCHANGE_POS BTN_POS(4,4), BTN_SIZE(3,1)
@ -92,7 +92,7 @@ void MainMenu::onRedraw(draw_mode_t what) {
.tag( 9).button(LEVELING_POS, GET_TEXT_F(MSG_LEVELING))
.tag(10).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU))
#if ENABLED(CUSTOM_MENU_MAIN)
.tag(11).button(CUSTOM_MENU_POS, GET_TEXT_F(MSG_CUSTOM_COMMANDS))
.tag(11).button(CUSTOM_MENU_POS, GET_TEXT_F(MSG_CUSTOM_COMMANDS))
#endif
.colors(action_btn)
.tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE));
@ -103,22 +103,30 @@ bool MainMenu::onTouchEnd(uint8_t tag) {
using namespace ExtUI;
switch (tag) {
case 1: SaveSettingsDialogBox::promptToSaveSettings(); break;
case 2: SpinnerDialogBox::enqueueAndWait(F("G28")); break;
case 1: SaveSettingsDialogBox::promptToSaveSettings(); break;
case 2: SpinnerDialogBox::enqueueAndWait(F("G28")); break;
#if ENABLED(NOZZLE_CLEAN_FEATURE)
case 3: injectCommands(F("G12")); GOTO_SCREEN(StatusScreen); break;
case 3:
injectCommands(F("G12"));
GOTO_SCREEN(StatusScreen); break;
#endif
case 4: GOTO_SCREEN(MoveAxisScreen); break;
case 5: injectCommands(F("M84")); break;
case 6: GOTO_SCREEN(TemperatureScreen); break;
case 7: GOTO_SCREEN(ChangeFilamentScreen); break;
case 8: GOTO_SCREEN(AdvancedSettingsMenu); break;
case 4: GOTO_SCREEN(MoveAxisScreen); break;
case 5:
injectCommands(F("M84 E"
TERN_(DISABLE_INACTIVE_X, " X")
TERN_(DISABLE_INACTIVE_Y, " Y")
TERN_(DISABLE_INACTIVE_Z, " Z")
));
break;
case 6: GOTO_SCREEN(TemperatureScreen); break;
case 7: GOTO_SCREEN(ChangeFilamentScreen); break;
case 8: GOTO_SCREEN(AdvancedSettingsMenu); break;
#if HAS_LEVELING
case 9: GOTO_SCREEN(LevelingMenu); break;
case 9: GOTO_SCREEN(LevelingMenu); break;
#endif
case 10: GOTO_SCREEN(AboutScreen); break;
case 10: GOTO_SCREEN(AboutScreen); break;
#if ENABLED(CUSTOM_MENU_MAIN)
case 11: GOTO_SCREEN(CustomUserMenus); break;
case 11: GOTO_SCREEN(CustomUserMenus); break;
#endif
default:

View file

@ -376,10 +376,10 @@ void StatusScreen::loadBitmaps() {
// Load the bitmaps for the status screen
using namespace Theme;
constexpr uint32_t base = ftdi_memory_map::RAM_G;
CLCD::mem_write_pgm(base + TD_Icon_Info.RAMG_offset, TD_Icon, sizeof(TD_Icon));
CLCD::mem_write_pgm(base + Extruder_Icon_Info.RAMG_offset, Extruder_Icon, sizeof(Extruder_Icon));
CLCD::mem_write_pgm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon));
CLCD::mem_write_pgm(base + Fan_Icon_Info.RAMG_offset, Fan_Icon, sizeof(Fan_Icon));
CLCD::mem_write_xbm(base + TD_Icon_Info.RAMG_offset, TD_Icon, sizeof(TD_Icon));
CLCD::mem_write_xbm(base + Extruder_Icon_Info.RAMG_offset, Extruder_Icon, sizeof(Extruder_Icon));
CLCD::mem_write_xbm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon));
CLCD::mem_write_xbm(base + Fan_Icon_Info.RAMG_offset, Fan_Icon, sizeof(Fan_Icon));
// Load fonts for internationalization
#if ENABLED(TOUCH_UI_USE_UTF8)

View file

@ -66,7 +66,7 @@ void TemperatureScreen::onRedraw(draw_mode_t what) {
#if HAS_HEATED_CHAMBER
w.adjuster( 22, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER));
#endif
#if HAS_FAN
#if HAS_FAN0
w.color(fan_speed).units(GET_TEXT_F(MSG_UNITS_PERCENT));
w.adjuster( 10, GET_TEXT_F(MSG_FAN_SPEED), getTargetFan_percent(FAN0));
#endif

View file

@ -171,8 +171,6 @@ namespace Language_en {
LSTR MSG_PREHEAT_CHOCOLATE = u8"Preheat Chocolate";
LSTR MSG_PREHEAT_FINISHED = u8"Preheat finished";
LSTR MSG_PREHEAT = u8"Preheat";
LSTR MSG_BUTTON_PAUSE = u8"Pause";
LSTR MSG_BUTTON_RESUME = u8"Resume";
LSTR MSG_ELAPSED_PRINT = u8"Elapsed Print";
LSTR MSG_XYZ_MOVE = u8"XYZ Move";
LSTR MSG_E_MOVE = u8"Extrusion Move";

View file

@ -62,9 +62,11 @@ union screen_data_t {
DECL_DATA_IF_INCLUDED(FTDI_Z_OFFSET_SCREEN)
DECL_DATA_IF_INCLUDED(FTDI_BASE_NUMERIC_ADJ_SCREEN)
DECL_DATA_IF_INCLUDED(FTDI_ALERT_DIALOG_BOX)
DECL_DATA_IF_INCLUDED(COCOA_STATUS_SCREEN)
DECL_DATA_IF_INCLUDED(COCOA_PREHEAT_SCREEN)
DECL_DATA_IF_INCLUDED(COCOA_LOAD_CHOCOLATE_SCREEN)
DECL_DATA_IF_INCLUDED(COCOA_FILES_SCREEN)
DECL_DATA_IF_INCLUDED(COCOA_Z_OFFSET_WIZARD)
};
extern screen_data_t screen_data;

View file

@ -118,6 +118,10 @@ SCREEN_TABLE {
DECL_SCREEN_IF_INCLUDED(COCOA_MOVE_E_SCREEN)
DECL_SCREEN_IF_INCLUDED(COCOA_CONFIRM_START_PRINT)
DECL_SCREEN_IF_INCLUDED(COCOA_FILES_SCREEN)
DECL_SCREEN_IF_INCLUDED(COCOA_Z_OFFSET_SCREEN)
DECL_SCREEN_IF_INCLUDED(COCOA_Z_OFFSET_WIZARD)
DECL_SCREEN_IF_INCLUDED(COCOA_ABOUT_SCREEN)
DECL_SCREEN_IF_INCLUDED(COCOA_STATISTICS_SCREEN)
};
SCREEN_TABLE_POST

View file

@ -37,25 +37,25 @@ namespace Theme {
};
constexpr PROGMEM unsigned char Extruder_Icon[69] = {
0x3F, 0xFF, 0xFC,
0x7F, 0xFF, 0xFE,
0xC0, 0x00, 0x03,
0xC0, 0x00, 0x03,
0xC0, 0x00, 0x03,
0xC0, 0x00, 0x03,
0x7F, 0xFF, 0xFE,
0x3F, 0xFF, 0xFC,
0x3F, 0xFF, 0xFC,
0x7F, 0xFF, 0xFE,
0xC0, 0x00, 0x03,
0xC0, 0x00, 0x03,
0xC0, 0x00, 0x03,
0xC0, 0x00, 0x03,
0x7F, 0xFF, 0xFE,
0x7F, 0xFF, 0xFE,
0x07, 0xFF, 0xE0,
0x03, 0xFF, 0xC0,
0x01, 0x81, 0x80,
0xFC, 0xFF, 0x3F,
0xFE, 0xFF, 0x7F,
0x03, 0x00, 0xC0,
0x03, 0x00, 0xC0,
0x03, 0x00, 0xC0,
0x03, 0x00, 0xC0,
0xFE, 0xFF, 0x7F,
0xFC, 0xFF, 0x3F,
0xFC, 0xFF, 0x3F,
0xFE, 0xFF, 0x7F,
0x03, 0x00, 0xC0,
0x03, 0x00, 0xC0,
0x03, 0x00, 0xC0,
0x03, 0x00, 0xC0,
0xFE, 0xFF, 0x7F,
0xFE, 0xFF, 0x7F,
0xE0, 0xFF, 0x07,
0xC0, 0xFF, 0x03,
0x80, 0x81, 0x01,
0x00, 0xC3, 0x00,
0x00, 0x66, 0x00,
0x00, 0x3C, 0x00,
@ -74,28 +74,28 @@ namespace Theme {
};
constexpr PROGMEM unsigned char Bed_Heat_Icon[92] = {
0x01, 0x81, 0x81, 0x80,
0x01, 0x81, 0x81, 0x80,
0x00, 0xC0, 0xC0, 0xC0,
0x00, 0xC0, 0xC0, 0xC0,
0x00, 0x60, 0x60, 0x60,
0x00, 0x60, 0x60, 0x60,
0x00, 0xC0, 0xC0, 0xC0,
0x00, 0xC0, 0xC0, 0xC0,
0x01, 0x81, 0x81, 0x80,
0x01, 0x81, 0x81, 0x80,
0x03, 0x03, 0x03, 0x00,
0x03, 0x03, 0x03, 0x00,
0x06, 0x06, 0x06, 0x00,
0x06, 0x06, 0x06, 0x00,
0x03, 0x03, 0x03, 0x00,
0x03, 0x03, 0x03, 0x00,
0x01, 0x81, 0x81, 0x80,
0x01, 0x81, 0x81, 0x80,
0x80, 0x81, 0x81, 0x01,
0x80, 0x81, 0x81, 0x01,
0x00, 0x03, 0x03, 0x03,
0x00, 0x03, 0x03, 0x03,
0x00, 0x06, 0x06, 0x06,
0x00, 0x06, 0x06, 0x06,
0x00, 0x03, 0x03, 0x03,
0x00, 0x03, 0x03, 0x03,
0x80, 0x81, 0x81, 0x01,
0x80, 0x81, 0x81, 0x01,
0xC0, 0xC0, 0xC0, 0x00,
0xC0, 0xC0, 0xC0, 0x00,
0x60, 0x60, 0x60, 0x00,
0x60, 0x60, 0x60, 0x00,
0xC0, 0xC0, 0xC0, 0x00,
0xC0, 0xC0, 0xC0, 0x00,
0x80, 0x81, 0x81, 0x01,
0x80, 0x81, 0x81, 0x01,
0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xC0, 0x00, 0x00, 0x03,
0x03, 0x00, 0x00, 0xC0,
0xFF, 0xFF, 0xFF, 0xFF
};
@ -113,34 +113,34 @@ namespace Theme {
constexpr PROGMEM unsigned char Fan_Icon[128] = {
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xF8, 0x00, 0x00, 0x1F,
0xF0, 0x03, 0xF8, 0x0F,
0xE0, 0x07, 0xF0, 0x07,
0xC0, 0x0F, 0xE0, 0x03,
0xC0, 0x1F, 0xE0, 0x03,
0xC0, 0x1F, 0xE0, 0x03,
0xC0, 0x0F, 0xE0, 0x03,
0xC0, 0x07, 0xE0, 0x03,
0xC0, 0x03, 0xC0, 0x03,
0xD0, 0x00, 0x00, 0xC3,
0xD8, 0x03, 0xC1, 0xE3,
0xDF, 0xC7, 0xE3, 0xF3,
0xDF, 0xEF, 0xF7, 0xFB,
0xDF, 0xEF, 0xF7, 0xFB,
0xDF, 0xEF, 0xF7, 0xFB,
0xDF, 0xEF, 0xF7, 0xFB,
0xCF, 0xC7, 0xE3, 0xFB,
0xC7, 0x83, 0xC0, 0x1B,
0xC3, 0x00, 0x00, 0x0B,
0xC0, 0x03, 0xC0, 0x03,
0xC0, 0x07, 0xE0, 0x03,
0xC0, 0x07, 0xF0, 0x03,
0xC0, 0x07, 0xF8, 0x03,
0xC0, 0x07, 0xF8, 0x03,
0xC0, 0x07, 0xF0, 0x03,
0xE0, 0x0F, 0xE0, 0x07,
0xF0, 0x1F, 0xC0, 0x0F,
0xF8, 0x00, 0x00, 0x1F,
0x1F, 0x00, 0x00, 0xF8,
0x0F, 0xC0, 0x1F, 0xF0,
0x07, 0xE0, 0x0F, 0xE0,
0x03, 0xF0, 0x07, 0xC0,
0x03, 0xF8, 0x07, 0xC0,
0x03, 0xF8, 0x07, 0xC0,
0x03, 0xF0, 0x07, 0xC0,
0x03, 0xE0, 0x07, 0xC0,
0x03, 0xC0, 0x03, 0xC0,
0x0B, 0x00, 0x00, 0xC3,
0x1B, 0xC0, 0x83, 0xC7,
0xFB, 0xE3, 0xC7, 0xCF,
0xFB, 0xF7, 0xEF, 0xDF,
0xFB, 0xF7, 0xEF, 0xDF,
0xFB, 0xF7, 0xEF, 0xDF,
0xFB, 0xF7, 0xEF, 0xDF,
0xF3, 0xE3, 0xC7, 0xDF,
0xE3, 0xC1, 0x03, 0xD8,
0xC3, 0x00, 0x00, 0xD0,
0x03, 0xC0, 0x03, 0xC0,
0x03, 0xE0, 0x07, 0xC0,
0x03, 0xE0, 0x0F, 0xC0,
0x03, 0xE0, 0x1F, 0xC0,
0x03, 0xE0, 0x1F, 0xC0,
0x03, 0xE0, 0x0F, 0xC0,
0x07, 0xF0, 0x07, 0xE0,
0x0F, 0xF8, 0x03, 0xF0,
0x1F, 0x00, 0x00, 0xF8,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF
};
@ -157,26 +157,26 @@ namespace Theme {
};
constexpr PROGMEM unsigned char TD_Icon[140] = {
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, // Thumb Drive Widget
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80,
0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80,
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00
0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, // Thumb Drive Widget
0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x06, 0x00, 0x00, 0x00, 0xC0, 0x01,
0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03,
0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03,
0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03,
0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03,
0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
0x00, 0x06, 0x00, 0x00, 0x00, 0xC0, 0x01,
0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00
};
constexpr PROGMEM bitmap_info_t File_Icon_Info = {
@ -191,17 +191,17 @@ namespace Theme {
};
const unsigned char File_Icon[128] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00,
0x40, 0x02, 0x80, 0x00, 0x40, 0x02, 0x40, 0x00, 0x40, 0x02, 0x20, 0x00,
0x40, 0x02, 0x10, 0x00, 0x40, 0x02, 0x08, 0x00, 0x40, 0x02, 0x04, 0x00,
0x40, 0x02, 0x02, 0x00, 0x40, 0x03, 0xFF, 0x00, 0x40, 0x00, 0x01, 0x00,
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
0x7F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x00,
0x02, 0x40, 0x01, 0x00, 0x02, 0x40, 0x02, 0x00, 0x02, 0x40, 0x04, 0x00,
0x02, 0x40, 0x08, 0x00, 0x02, 0x40, 0x10, 0x00, 0x02, 0x40, 0x20, 0x00,
0x02, 0x40, 0x40, 0x00, 0x02, 0xC0, 0xFF, 0x00, 0x02, 0x00, 0x80, 0x00,
0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
};
constexpr PROGMEM bitmap_info_t Clock_Icon_Info = {
@ -216,17 +216,17 @@ namespace Theme {
};
const unsigned char Clock_Icon[128] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7E, 0x7E, 0x00,
0x00, 0xE0, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x07, 0x01, 0x00, 0xE0,
0x0C, 0x01, 0x80, 0x70, 0x0C, 0x01, 0x80, 0x30, 0x18, 0x01, 0x80, 0x18,
0x30, 0x01, 0x80, 0x08, 0x30, 0x01, 0x80, 0x0C, 0x20, 0x01, 0x80, 0x0C,
0x60, 0x01, 0x80, 0x04, 0x60, 0x01, 0x80, 0x06, 0x60, 0x01, 0x80, 0x06,
0x60, 0x01, 0xFF, 0x06, 0x60, 0x01, 0xFF, 0x06, 0x60, 0x00, 0x00, 0x06,
0x60, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x0C,
0x30, 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00, 0x18,
0x0C, 0x00, 0x00, 0x30, 0x0E, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0xE0,
0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x7F, 0xFE, 0x00,
0x00, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00
0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x7E, 0x7E, 0x00,
0x00, 0x07, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0xE0, 0x80, 0x00, 0x07,
0x30, 0x80, 0x01, 0x0E, 0x30, 0x80, 0x01, 0x0C, 0x18, 0x80, 0x01, 0x18,
0x0C, 0x80, 0x01, 0x10, 0x0C, 0x80, 0x01, 0x30, 0x04, 0x80, 0x01, 0x30,
0x06, 0x80, 0x01, 0x20, 0x06, 0x80, 0x01, 0x60, 0x06, 0x80, 0x01, 0x60,
0x06, 0x80, 0xFF, 0x60, 0x06, 0x80, 0xFF, 0x60, 0x06, 0x00, 0x00, 0x60,
0x06, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x30,
0x0C, 0x00, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x10, 0x18, 0x00, 0x00, 0x18,
0x30, 0x00, 0x00, 0x0C, 0x70, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x07,
0xC0, 0x01, 0x80, 0x03, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFE, 0x7F, 0x00,
0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00
};
constexpr PROGMEM bitmap_info_t Light_Bulb_Info = {
@ -241,17 +241,42 @@ namespace Theme {
};
const unsigned char Light_Bulb[128] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40,
0x02, 0x00, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00, 0x80, 0x02, 0x00,
0x00, 0x0F, 0xE0, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, 0x36, 0x18, 0x00,
0x00, 0x2C, 0x08, 0x00, 0x00, 0x58, 0x04, 0x00, 0x00, 0x50, 0x04, 0x00,
0x7C, 0x50, 0x04, 0x7C, 0x00, 0x40, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00,
0x00, 0x60, 0x0C, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00,
0x00, 0x10, 0x10, 0x00, 0x00, 0x88, 0x22, 0x00, 0x01, 0x08, 0x21, 0x00,
0x02, 0x08, 0x20, 0x80, 0x04, 0x0F, 0xE0, 0x40, 0x00, 0x07, 0xC0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02,
0x40, 0x00, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00,
0x00, 0xF0, 0x07, 0x00, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x6C, 0x18, 0x00,
0x00, 0x34, 0x10, 0x00, 0x00, 0x1A, 0x20, 0x00, 0x00, 0x0A, 0x20, 0x00,
0x3E, 0x0A, 0x20, 0x3E, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00,
0x00, 0x06, 0x30, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00,
0x00, 0x08, 0x08, 0x00, 0x00, 0x11, 0x44, 0x00, 0x80, 0x10, 0x84, 0x00,
0x40, 0x10, 0x04, 0x01, 0x20, 0xF0, 0x07, 0x02, 0x00, 0xE0, 0x03, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
};
constexpr PROGMEM bitmap_info_t Chamber_Icon_Info = {
.format = L1,
.linestride = 4,
.filter = BILINEAR,
.wrapx = BORDER,
.wrapy = BORDER,
.RAMG_offset = 8813,
.width = 32,
.height = 32,
};
const unsigned char Chamber_Icon[128] PROGMEM = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xF8,
0x0F, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0xC0,
0x03, 0x00, 0x00, 0xC0, 0x83, 0x81, 0x81, 0xC1, 0x83, 0x81, 0x81, 0xC1,
0x03, 0x03, 0x03, 0xC3, 0x03, 0x03, 0x03, 0xC3, 0x03, 0x06, 0x06, 0xC6,
0x03, 0x06, 0x06, 0xC6, 0x03, 0x03, 0x03, 0xC3, 0x03, 0x03, 0x03, 0xC3,
0x83, 0x81, 0x81, 0xC1, 0x83, 0x81, 0x81, 0xC1, 0xC3, 0xC0, 0xC0, 0xC0,
0xC3, 0xC0, 0xC0, 0xC0, 0x63, 0x60, 0x60, 0xC0, 0x63, 0x60, 0x60, 0xC0,
0xC3, 0xC0, 0xC0, 0xC0, 0xC3, 0xC0, 0xC0, 0xC0, 0x83, 0x81, 0x81, 0xC1,
0x83, 0x81, 0x81, 0xC1, 0x03, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0xC0,
0x07, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0xF8,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
constexpr PROGMEM uint32_t UTF8_FONT_OFFSET = 10000;

View file

@ -300,6 +300,44 @@ namespace Theme {
{SILENCE, END_SONG, 0}
};
const PROGMEM SoundPlayer::sound_t flagpole[] = {
{TRIANGLE_WAVE, NOTE_G3, 2},
{TRIANGLE_WAVE, NOTE_C4, 2},
{TRIANGLE_WAVE, NOTE_E4, 2},
{TRIANGLE_WAVE, NOTE_G4, 2},
{TRIANGLE_WAVE, NOTE_C5, 2},
{TRIANGLE_WAVE, NOTE_E5, 2},
{TRIANGLE_WAVE, NOTE_G5, 5},
{TRIANGLE_WAVE, NOTE_E5, 2},
{TRIANGLE_WAVE, NOTE_G3S, 2},
{TRIANGLE_WAVE, NOTE_C4, 2},
{TRIANGLE_WAVE, NOTE_D4S, 2},
{TRIANGLE_WAVE, NOTE_G4S, 2},
{TRIANGLE_WAVE, NOTE_C5, 2},
{TRIANGLE_WAVE, NOTE_D5S, 2},
{TRIANGLE_WAVE, NOTE_G5S, 5},
{TRIANGLE_WAVE, NOTE_D5S, 5},
{TRIANGLE_WAVE, NOTE_A3S, 2},
{TRIANGLE_WAVE, NOTE_D4, 2},
{TRIANGLE_WAVE, NOTE_F4, 2},
{TRIANGLE_WAVE, NOTE_A4S, 2},
{TRIANGLE_WAVE, NOTE_D5, 2},
{TRIANGLE_WAVE, NOTE_F5, 2},
{TRIANGLE_WAVE, NOTE_A5S, 5},
{SILENCE, REST, 1},
{TRIANGLE_WAVE, NOTE_A5S, 1},
{SILENCE, REST, 1},
{TRIANGLE_WAVE, NOTE_A5S, 1},
{SILENCE, REST, 1},
{TRIANGLE_WAVE, NOTE_A5S, 1},
{SILENCE, REST, 1},
{TRIANGLE_WAVE, NOTE_A5S, 8},
{SILENCE, END_SONG, 0}
};
const PROGMEM SoundPlayer::sound_t big_band[] = {
{XYLOPHONE, NOTE_F4, 3},
{XYLOPHONE, NOTE_G4, 3},
@ -402,7 +440,8 @@ const SoundList::list_t SoundList::list[] = {
{"Carousel", Theme::carousel},
{"Beats", Theme::beats},
{"Bach Joy", Theme::js_bach_joy},
{"Bach Toccata", Theme::js_bach_toccata}
{"Bach Toccata", Theme::js_bach_toccata},
{"Flagpole", Theme::flagpole}
};
const uint8_t SoundList::n = N_ELEMENTS(SoundList::list);

View file

@ -126,7 +126,7 @@
#endif
#ifndef E0_SLAVE_ADDRESS
#define E0_SLAVE_ADDRESS 3
#endif
#endif
#else
#define X_HARDWARE_SERIAL Serial2
#define Y_HARDWARE_SERIAL Serial2