You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
4.3 KiB
148 lines
4.3 KiB
/**************************
|
|
* stress_test_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 FTDI_STRESS_TEST_SCREEN
|
|
|
|
#define STRESS_TEST_CHANGE_INTERVAL 6000
|
|
|
|
#define GRID_COLS 4
|
|
#define GRID_ROWS 9
|
|
|
|
using namespace FTDI;
|
|
using namespace Theme;
|
|
using namespace ExtUI;
|
|
|
|
constexpr static StressTestScreenData &mydata = screen_data.StressTestScreen;
|
|
|
|
void StressTestScreen::drawDots(uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
|
|
CommandProcessor cmd;
|
|
for (uint8_t i = 0; i < 100; i++) {
|
|
cmd.cmd(BEGIN(POINTS))
|
|
.cmd(POINT_SIZE(20*16))
|
|
.cmd(COLOR_RGB(random(0xFFFFFF)))
|
|
.cmd(VERTEX2F((x + random(w)) * 16,(y + random(h)) * 16));
|
|
}
|
|
}
|
|
|
|
bool StressTestScreen::watchDogTestNow() {
|
|
return mydata.next_watchdog_trigger &&
|
|
ELAPSED(millis(), mydata.next_watchdog_trigger);
|
|
}
|
|
|
|
void StressTestScreen::onRedraw(draw_mode_t) {
|
|
using namespace ExtUI;
|
|
CommandProcessor cmd;
|
|
cmd.cmd(CLEAR_COLOR_RGB(bg_color))
|
|
.cmd(CLEAR(true,true,true))
|
|
.cmd(COLOR_RGB(bg_text_enabled))
|
|
.font(font_medium)
|
|
.text(BTN_POS(1,1), BTN_SIZE(4,1), FPSTR(mydata.message));
|
|
|
|
drawDots(BTN_POS(1,3), BTN_SIZE(4,4));
|
|
|
|
cmd.font(font_medium).enabled(!watchDogTestNow()).colors(action_btn).tag(1).button(BTN_POS(2,8), BTN_SIZE(2,1), F("Exit"));
|
|
}
|
|
|
|
bool StressTestScreen::onTouchEnd(uint8_t tag) {
|
|
CommandProcessor cmd;
|
|
switch (tag) {
|
|
case 1:
|
|
runTestOnBootup(false);
|
|
GOTO_SCREEN(StatusScreen);
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void StressTestScreen::runTestOnBootup(bool enable) {
|
|
// Use a magic value in passcode to indicate
|
|
// whether or not we need to re-run the test
|
|
// at startup.
|
|
LockScreen::set_hash(enable ? 0xDEAD : 0);
|
|
injectCommands(F("M500"));
|
|
}
|
|
|
|
void StressTestScreen::startupCheck() {
|
|
if (LockScreen::get_hash() == 0xDEAD)
|
|
GOTO_SCREEN(StressTestScreen);
|
|
}
|
|
|
|
void StressTestScreen::onEntry() {
|
|
mydata.next_watchdog_trigger = millis() + 10000 + random(40000);
|
|
mydata.message = PSTR("Test 1: Stress testing...");
|
|
|
|
// Turn off heaters.
|
|
coolDown();
|
|
|
|
runTestOnBootup(true);
|
|
}
|
|
|
|
void StressTestScreen::recursiveLockup() {
|
|
mydata.message = PSTR("Test 2: Printer will restart.");
|
|
current_screen.onRefresh();
|
|
recursiveLockup();
|
|
}
|
|
|
|
void StressTestScreen::iterativeLockup() {
|
|
mydata.message = PSTR("Test 3: Printer will restart.");
|
|
for (;;) current_screen.onRefresh();
|
|
}
|
|
|
|
void StressTestScreen::onIdle() {
|
|
current_screen.onRefresh();
|
|
reset_menu_timeout();
|
|
|
|
if (!commandsInQueue()) {
|
|
if (!isPositionKnown()) {
|
|
injectCommands_P(G28_STR);
|
|
}
|
|
else {
|
|
injectCommands(F(
|
|
"G0 X100 Y100 Z100 F6000\n"
|
|
"T0\nG4 S1"
|
|
E_TERN_("\nT1\nG4 S1")
|
|
"\nG0 X150 Y150 Z150"
|
|
));
|
|
}
|
|
}
|
|
|
|
if (refresh_timer.elapsed(STRESS_TEST_CHANGE_INTERVAL)) {
|
|
setTargetFan_percent(random(100),FAN0);
|
|
}
|
|
|
|
if (watchDogTestNow()) {
|
|
if (random(2) % 2)
|
|
iterativeLockup();
|
|
else
|
|
recursiveLockup();
|
|
}
|
|
|
|
BaseScreen::onIdle();
|
|
}
|
|
|
|
#endif // FTDI_STRESS_TEST_SCREEN
|
|
|