88 lines
2.3 KiB
C++
88 lines
2.3 KiB
C++
|
/*
|
||
|
Copyright (c):
|
||
|
|
||
|
Philipp Matthias Schäfer (philipp.matthias.schaefer@posteo.de), 2020
|
||
|
|
||
|
This file is part of the KrautStatus' Arduino code.
|
||
|
|
||
|
The Clean CommonMark library is free software: you can redistribute it and/or
|
||
|
modify it under the terms of the GNU Affero General Public License as published
|
||
|
by the Free Software Foundation, either version 3 of the License, or (at your
|
||
|
option) any later version.
|
||
|
|
||
|
The Clean CommonMark library 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 Affero General Public License
|
||
|
for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Affero General Public License along
|
||
|
with the Clean CommonMark library. If not, see <https://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
#include <ArduinoGraphics.h>
|
||
|
#include <Arduino_MKRRGB.h>
|
||
|
#include <uTimerLib.h>
|
||
|
|
||
|
#include "matrix.h"
|
||
|
|
||
|
|
||
|
const uint32_t RED = COLOR(255, 0, 0);
|
||
|
const uint32_t YELLOW = COLOR(255, 255, 0);
|
||
|
|
||
|
const unsigned long int SCAN_UPDATE_FREQUENCY = 25;
|
||
|
|
||
|
void matrix_setup() {
|
||
|
MATRIX.begin();
|
||
|
}
|
||
|
|
||
|
void matrix_show_failure() {
|
||
|
MATRIX.stroke(RED);
|
||
|
MATRIX.beginDraw();
|
||
|
MATRIX.clear();
|
||
|
MATRIX.line(0, 0, MATRIX.width() - 1, MATRIX.height() - 1);
|
||
|
MATRIX.line(0, MATRIX.height() - 1, MATRIX.width() - 1, 0);
|
||
|
MATRIX.endDraw();
|
||
|
}
|
||
|
|
||
|
uint8_t scan_timer = 0;
|
||
|
|
||
|
void matrix_paint_scan() {
|
||
|
// We paint a vertical line that oscillates between the left and right border
|
||
|
// of the matrix. Going back and forth one pixel at a time gives us as period
|
||
|
// of
|
||
|
// 2 * width - 2
|
||
|
// because we do not want to remain at the borders for one tick.
|
||
|
scan_timer += 1;
|
||
|
scan_timer %= 2 * MATRIX.width() - 2;
|
||
|
|
||
|
uint8_t position = scan_timer;
|
||
|
if(position >= MATRIX.width())
|
||
|
position = 2 * MATRIX.width() - position - 2;
|
||
|
|
||
|
MATRIX.beginDraw();
|
||
|
MATRIX.clear();
|
||
|
MATRIX.line(position, 0, position, 6);
|
||
|
MATRIX.endDraw();
|
||
|
}
|
||
|
|
||
|
bool matrix_show_scan_and_run(bool(*thunk)()) {
|
||
|
MATRIX.stroke(YELLOW);
|
||
|
TimerLib.setInterval_us(matrix_paint_scan, 1000000 / SCAN_UPDATE_FREQUENCY);
|
||
|
|
||
|
bool result = thunk();
|
||
|
|
||
|
TimerLib.clearTimer();
|
||
|
MATRIX.beginDraw();
|
||
|
MATRIX.clear();
|
||
|
MATRIX.endDraw();
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
void matrix_fill(uint32_t color) {
|
||
|
MATRIX.fill(color);
|
||
|
MATRIX.beginDraw();
|
||
|
MATRIX.clear();
|
||
|
MATRIX.endDraw();
|
||
|
}
|