Compare commits
19 Commits
a680363bf9
...
10648045a3
| Author | SHA1 | Date | |
|---|---|---|---|
| 10648045a3 | |||
| bff0bb30dd | |||
| 6508358ddf | |||
| 361a14aa09 | |||
| 232c9ddce1 | |||
| 6a798e96e9 | |||
| a198ae4225 | |||
| c359ecb544 | |||
| 4f2f0fccda | |||
| 579a7559c1 | |||
| 758b16aa0d | |||
| 54ff226694 | |||
| 8cd5d09933 | |||
| 00fa493943 | |||
| 12eedf9722 | |||
| 43b01f0b2b | |||
| 295b764d40 | |||
| 6530ed56c6 | |||
| 83915efc33 |
@ -14,4 +14,6 @@ Developer Note: You can convert mp3 files to 44100Hz mono signed 16 uncompressed
|
|||||||
File names must be no longer than `8` characters not including the extention
|
File names must be no longer than `8` characters not including the extention
|
||||||
File extentions must be no longer than `3` characters.
|
File extentions must be no longer than `3` characters.
|
||||||
|
|
||||||
|
To build images, use the lvgl image converter [`https://lvgl.io/tools/imageconverter`].
|
||||||
|
Use v8.
|
||||||
|
I have had the best luck with `CF_RGB565A8`.
|
||||||
|
|||||||
@ -13,8 +13,10 @@ set(SOURCES
|
|||||||
"sd.cpp"
|
"sd.cpp"
|
||||||
"speaker.cpp"
|
"speaker.cpp"
|
||||||
"sseg.cpp"
|
"sseg.cpp"
|
||||||
|
"state_tracking.cpp"
|
||||||
"tft.cpp"
|
"tft.cpp"
|
||||||
"wires.cpp"
|
"wires.cpp"
|
||||||
|
"wlvgl.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
target_sources(${COMPONENT_LIB} PRIVATE ${SOURCES})
|
target_sources(${COMPONENT_LIB} PRIVATE ${SOURCES})
|
||||||
|
|||||||
@ -13,7 +13,9 @@ void init_drivers() {
|
|||||||
init_speaker();
|
init_speaker();
|
||||||
init_sseg();
|
init_sseg();
|
||||||
init_game_timers();
|
init_game_timers();
|
||||||
|
init_tft();
|
||||||
|
init_leds();
|
||||||
|
init_power_board();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Initializes I2C_NUM_0.
|
/// @brief Initializes I2C_NUM_0.
|
||||||
|
|||||||
@ -1,21 +1,14 @@
|
|||||||
#ifndef ALL_H
|
#ifndef ALL_H
|
||||||
#define ALL_H
|
#define ALL_H
|
||||||
|
|
||||||
// #include "driver/uart.h"
|
|
||||||
// #include "driver/i2c.h"
|
|
||||||
// #include "drivers/tft.h"
|
|
||||||
// #include "drivers/wires.h"
|
|
||||||
// #include "drivers/sd.h"
|
|
||||||
// #include "drivers/char_lcd.h"
|
|
||||||
// #include "drivers/leds.h"
|
|
||||||
// #include "drivers/power.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include "char_lcd.h"
|
#include "char_lcd.h"
|
||||||
#include "bottom_half.h"
|
#include "bottom_half.h"
|
||||||
#include "sd.h"
|
#include "sd.h"
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
#include "game_timer.h"
|
#include "game_timer.h"
|
||||||
|
#include "drivers/tft.h"
|
||||||
|
#include "drivers/leds.h"
|
||||||
|
#include "drivers/power.h"
|
||||||
|
|
||||||
void init_drivers();
|
void init_drivers();
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
#include "bottom_half.h"
|
#include "bottom_half.h"
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
|
#include "state_tracking.h"
|
||||||
|
|
||||||
static const char *TAG = "bottom_half";
|
static const char *TAG = "bottom_half";
|
||||||
|
|
||||||
@ -29,6 +30,11 @@ static void receive_keypad();
|
|||||||
static void receive_button_switch();
|
static void receive_button_switch();
|
||||||
static void receive_touch();
|
static void receive_touch();
|
||||||
|
|
||||||
|
static bool replay_handler(const char* event, char* arg) {
|
||||||
|
// no reply neccesary
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: add intrupt on bottom half delta pin
|
// TODO: add intrupt on bottom half delta pin
|
||||||
// static void IRAM_ATTR gpio_isr_handler(void* arg)
|
// static void IRAM_ATTR gpio_isr_handler(void* arg)
|
||||||
// {
|
// {
|
||||||
@ -56,6 +62,8 @@ void init_bottom_half() {
|
|||||||
|
|
||||||
xTaskCreate(poll_bottom_task, "poll_bottom", 4096, NULL, 10, NULL);
|
xTaskCreate(poll_bottom_task, "poll_bottom", 4096, NULL, 10, NULL);
|
||||||
|
|
||||||
|
register_replay_fn(replay_handler);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Bottom half initialized!");
|
ESP_LOGI(TAG, "Bottom half initialized!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,9 +83,19 @@ static void receive_keypad(void) {
|
|||||||
|
|
||||||
uint16_t just_pressed = new_keypad_state & ~keypad_state;
|
uint16_t just_pressed = new_keypad_state & ~keypad_state;
|
||||||
keypad_pressed |= just_pressed;
|
keypad_pressed |= just_pressed;
|
||||||
|
if (is_state_tracking() && just_pressed) {
|
||||||
|
char buf[6];
|
||||||
|
sprintf(buf, "%d", just_pressed);
|
||||||
|
event_occured("KP_PRESS", buf);
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t just_released = ~new_keypad_state & keypad_state;
|
uint16_t just_released = ~new_keypad_state & keypad_state;
|
||||||
keypad_released |= just_released;
|
keypad_released |= just_released;
|
||||||
|
if (is_state_tracking() && just_released) {
|
||||||
|
char buf[6];
|
||||||
|
sprintf(buf, "%d", just_released);
|
||||||
|
event_occured("KP_RELEASE", buf);
|
||||||
|
}
|
||||||
|
|
||||||
keypad_state = new_keypad_state;
|
keypad_state = new_keypad_state;
|
||||||
}
|
}
|
||||||
@ -92,27 +110,57 @@ static void receive_button_switch(void) {
|
|||||||
// button
|
// button
|
||||||
uint8_t just_pressed = new_button_state & ~button_state;
|
uint8_t just_pressed = new_button_state & ~button_state;
|
||||||
button_pressed |= just_pressed;
|
button_pressed |= just_pressed;
|
||||||
|
if (is_state_tracking() && just_pressed) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", just_pressed);
|
||||||
|
event_occured("BTN_PRESS", buf);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t just_released = ~new_button_state & button_state;
|
uint8_t just_released = ~new_button_state & button_state;
|
||||||
button_released |= just_released;
|
button_released |= just_released;
|
||||||
|
if (is_state_tracking() && just_released) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", just_released);
|
||||||
|
event_occured("BTN_RELEASE", buf);
|
||||||
|
}
|
||||||
|
|
||||||
button_state = new_button_state;
|
button_state = new_button_state;
|
||||||
|
|
||||||
// switch
|
// switch
|
||||||
uint8_t just_flipped_up = new_switch_state & ~switch_state;
|
uint8_t just_flipped_up = new_switch_state & ~switch_state;
|
||||||
switch_flipped_up |= just_flipped_up;
|
switch_flipped_up |= just_flipped_up;
|
||||||
|
if (is_state_tracking() && just_flipped_up) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", just_flipped_up);
|
||||||
|
event_occured("SW_UP", buf);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t just_flipped_down = ~new_switch_state & switch_state;
|
uint8_t just_flipped_down = ~new_switch_state & switch_state;
|
||||||
switch_flipped_down |= just_flipped_down;
|
switch_flipped_down |= just_flipped_down;
|
||||||
|
if (is_state_tracking() && just_flipped_down) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", just_flipped_down);
|
||||||
|
event_occured("SW_DOWN", buf);
|
||||||
|
}
|
||||||
|
|
||||||
switch_state = new_switch_state;
|
switch_state = new_switch_state;
|
||||||
|
|
||||||
// switch touch
|
// switch touch
|
||||||
uint8_t touch_just_pressed = new_switch_touch_state & ~switch_touch_state;
|
uint8_t touch_just_pressed = new_switch_touch_state & ~switch_touch_state;
|
||||||
switch_touch_pressed |= touch_just_pressed;
|
switch_touch_pressed |= touch_just_pressed;
|
||||||
|
if (is_state_tracking() && touch_just_pressed) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", touch_just_pressed);
|
||||||
|
event_occured("SW_TOUCH", buf);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t touch_just_released = ~new_switch_touch_state & switch_touch_state;
|
uint8_t touch_just_released = ~new_switch_touch_state & switch_touch_state;
|
||||||
switch_touch_released |= touch_just_released;
|
switch_touch_released |= touch_just_released;
|
||||||
|
if (is_state_tracking() && touch_just_released) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", touch_just_released);
|
||||||
|
event_occured("SW_UNTOUCH", buf);
|
||||||
|
}
|
||||||
|
|
||||||
switch_touch_state = new_switch_touch_state;
|
switch_touch_state = new_switch_touch_state;
|
||||||
}
|
}
|
||||||
@ -125,9 +173,15 @@ static void receive_touch(void) {
|
|||||||
|
|
||||||
bool just_pressed = new_touch_state & !touch_state;
|
bool just_pressed = new_touch_state & !touch_state;
|
||||||
touch_pressed |= just_pressed;
|
touch_pressed |= just_pressed;
|
||||||
|
if (is_state_tracking() && just_pressed) {
|
||||||
|
event_occured("FINGER_TOUCHED", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
bool just_released = (!new_touch_state) & touch_state;
|
bool just_released = (!new_touch_state) & touch_state;
|
||||||
touch_released |= just_released;
|
touch_released |= just_released;
|
||||||
|
if (is_state_tracking() && just_released) {
|
||||||
|
event_occured("FINGER_UNTOUCHED", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
touch_state = new_touch_state;
|
touch_state = new_touch_state;
|
||||||
}
|
}
|
||||||
@ -307,7 +361,6 @@ uint8_t get_switch_touch_state(){
|
|||||||
return switch_touch_state;
|
return switch_touch_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool get_touch_state(void) {
|
bool get_touch_state(void) {
|
||||||
return touch_state;
|
return touch_state;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,11 +2,92 @@
|
|||||||
|
|
||||||
#include "./i2c_lcd_pcf8574.h"
|
#include "./i2c_lcd_pcf8574.h"
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
|
#include "state_tracking.h"
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
i2c_lcd_pcf8574_handle_t lcd;
|
i2c_lcd_pcf8574_handle_t lcd;
|
||||||
|
|
||||||
static const char *TAG = "char_lcd";
|
static const char *TAG = "char_lcd";
|
||||||
|
|
||||||
|
static char buf[65];
|
||||||
|
|
||||||
|
static bool replay_handler(const char* event, char* arg) {
|
||||||
|
if (strcmp(event, "LCD_CLEAR") == 0) {
|
||||||
|
lcd_clear();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_CURSOR") == 0) {
|
||||||
|
char* col_str = strtok(arg, ",");
|
||||||
|
char* row_str = strtok(NULL, ",");
|
||||||
|
uint32_t col = atoi(col_str);
|
||||||
|
uint32_t row = atoi(row_str);
|
||||||
|
lcd_set_cursor_pos(col, row);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_SET_DISPLAY") == 0) {
|
||||||
|
lcd_set_display(strcmp(arg, "true") == 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_CURSOR_VIS") == 0) {
|
||||||
|
lcd_set_cursor_vis(strcmp(arg, "true") == 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_CURSOR_BLINK") == 0) {
|
||||||
|
lcd_set_cursor_blink(strcmp(arg, "true") == 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_SCROLL_DISPLAY_LEFT") == 0) {
|
||||||
|
lcd_scroll_display_left();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_SCROLL_DISPLAY_RIGHT") == 0) {
|
||||||
|
lcd_scroll_display_right();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_LEFT_TO_RIGHT") == 0) {
|
||||||
|
lcd_left_to_right();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_RIGHT_TO_LEFT") == 0) {
|
||||||
|
lcd_right_to_left();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_AUTOSCROLL") == 0) {
|
||||||
|
lcd_set_autoscroll(strcmp(arg, "true") == 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_BACKLIGHT") == 0) {
|
||||||
|
uint32_t brightness = atoi(arg);
|
||||||
|
lcd_set_backlight(brightness);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_CREATE_CHAR") == 0) {
|
||||||
|
char* location_str = strtok(arg, ",");
|
||||||
|
uint8_t location = atoi(location_str);
|
||||||
|
|
||||||
|
uint8_t charmap[8];
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
char* str = strtok(NULL, ",");
|
||||||
|
charmap[i] = atoi(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
lcd_create_char(location, charmap);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_WRITE") == 0) {
|
||||||
|
uint8_t value = atoi(arg);
|
||||||
|
lcd_write(value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LCD_PRINT") == 0) {
|
||||||
|
// TODO: handle \r and \n
|
||||||
|
lcd_print(arg);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void init_lcd() {
|
void init_lcd() {
|
||||||
ESP_LOGI(TAG, "Initializing LCD...");
|
ESP_LOGI(TAG, "Initializing LCD...");
|
||||||
|
|
||||||
@ -15,20 +96,34 @@ void init_lcd() {
|
|||||||
|
|
||||||
lcd_set_backlight(&lcd, 255);
|
lcd_set_backlight(&lcd, 255);
|
||||||
|
|
||||||
|
register_replay_fn(replay_handler);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "LCD initialized!");
|
ESP_LOGI(TAG, "LCD initialized!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void lcd_clear() {
|
void lcd_clear() {
|
||||||
lcd_clear(&lcd);
|
lcd_clear(&lcd);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LCD_CLEAR", NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_cursor_home() {
|
void lcd_cursor_home() {
|
||||||
lcd_home(&lcd);
|
lcd_home(&lcd);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LCD_CURSOR", "0,0");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_set_cursor_pos(uint8_t col, uint8_t row) {
|
void lcd_set_cursor_pos(uint8_t col, uint8_t row) {
|
||||||
lcd_set_cursor(&lcd, col, row);
|
lcd_set_cursor(&lcd, col, row);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
sprintf(buf, "%d,%d", col, row);
|
||||||
|
event_occured("LCD_CURSOR", buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_set_display(bool display) {
|
void lcd_set_display(bool display) {
|
||||||
@ -37,6 +132,10 @@ void lcd_set_display(bool display) {
|
|||||||
} else {
|
} else {
|
||||||
lcd_no_display(&lcd);
|
lcd_no_display(&lcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LCD_SET_DISPLAY", display ? "true" : "false");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_set_cursor_vis(bool cursor) {
|
void lcd_set_cursor_vis(bool cursor) {
|
||||||
@ -45,6 +144,10 @@ void lcd_set_cursor_vis(bool cursor) {
|
|||||||
} else {
|
} else {
|
||||||
lcd_no_cursor(&lcd);
|
lcd_no_cursor(&lcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LCD_CURSOR_VIS", cursor ? "true" : "false");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_set_cursor_blink(bool blink) {
|
void lcd_set_cursor_blink(bool blink) {
|
||||||
@ -53,20 +156,40 @@ void lcd_set_cursor_blink(bool blink) {
|
|||||||
} else {
|
} else {
|
||||||
lcd_no_blink(&lcd);
|
lcd_no_blink(&lcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LCD_CURSOR_BLINK", blink ? "true" : "false");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_scroll_display_left() {
|
void lcd_scroll_display_left() {
|
||||||
lcd_scroll_display_left(&lcd);
|
lcd_scroll_display_left(&lcd);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LCD_SCROLL_DISPLAY_LEFT", NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void lcd_scroll_display_right() {
|
void lcd_scroll_display_right() {
|
||||||
lcd_scroll_display_right(&lcd);
|
lcd_scroll_display_right(&lcd);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LCD_SCROLL_DISPLAY_RIGHT", NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_left_to_right() {
|
void lcd_left_to_right() {
|
||||||
lcd_left_to_right(&lcd);
|
lcd_left_to_right(&lcd);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LCD_LEFT_TO_RIGHT", NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void lcd_right_to_left() {
|
void lcd_right_to_left() {
|
||||||
lcd_right_to_left(&lcd);
|
lcd_right_to_left(&lcd);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LCD_RIGHT_TO_LEFT", NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_set_autoscroll(bool autoscroll) {
|
void lcd_set_autoscroll(bool autoscroll) {
|
||||||
@ -75,25 +198,52 @@ void lcd_set_autoscroll(bool autoscroll) {
|
|||||||
} else {
|
} else {
|
||||||
lcd_no_autoscroll(&lcd);
|
lcd_no_autoscroll(&lcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LCD_AUTOSCROLL", autoscroll ? "true" : "false");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_set_backlight(uint8_t brightness) {
|
void lcd_set_backlight(uint8_t brightness) {
|
||||||
lcd_set_backlight(&lcd, brightness);
|
lcd_set_backlight(&lcd, brightness);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
sprintf(buf, "%d", brightness);
|
||||||
|
event_occured("LCD_BACKLIGHT", buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_create_char(uint8_t location, uint8_t charmap[]) {
|
void lcd_create_char(uint8_t location, uint8_t* charmap) {
|
||||||
lcd_create_char(&lcd, location, charmap);
|
lcd_create_char(&lcd, location, charmap);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
snprintf(buf, 65,
|
||||||
|
"%d,%d,%d,%d,%d,%d,%d,%d,%d", location,
|
||||||
|
charmap[0], charmap[1], charmap[2], charmap[3], charmap[4], charmap[5], charmap[6], charmap[7]
|
||||||
|
);
|
||||||
|
event_occured("LCD_CREATE_CHAR", buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_write(uint8_t value) {
|
void lcd_write(uint8_t value) {
|
||||||
lcd_write(&lcd, value);
|
lcd_write(&lcd, value);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
sprintf(buf, "%d", value);
|
||||||
|
event_occured("LCD_WRITE", buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_print(const char* str) {
|
void lcd_print(const char* str) {
|
||||||
lcd_print(&lcd, str);
|
lcd_print(&lcd, str);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
// TODO: handle \r and \n
|
||||||
|
event_occured("LCD_PRINT", str);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_print(uint8_t col, uint8_t row, const char* str) {
|
void lcd_print(uint8_t col, uint8_t row, const char* str) {
|
||||||
lcd_set_cursor_pos(col, row);
|
lcd_set_cursor_pos(col, row);
|
||||||
lcd_print(&lcd, str);
|
lcd_print(str);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,8 +1,36 @@
|
|||||||
#include "leds.h"
|
#include "leds.h"
|
||||||
|
#include "led_strip.h"
|
||||||
|
#include <esp_log.h>
|
||||||
|
#include "state_tracking.h"
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
led_strip_handle_t leds;
|
static const char* TAG = "leds";
|
||||||
|
|
||||||
|
static led_strip_handle_t leds;
|
||||||
|
|
||||||
|
// TODO: rename these to playback_handler
|
||||||
|
static bool replay_handler(const char* event, char* arg) {
|
||||||
|
if (strcmp(event, "LED_SET") == 0) {
|
||||||
|
uint32_t led = atoi(strtok(arg, ","));
|
||||||
|
uint32_t color = atoi(strtok(NULL, ","));
|
||||||
|
led_set(led, color);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LED_FLUSH") == 0) {
|
||||||
|
leds_flush();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "LED_CLR") == 0) {
|
||||||
|
leds_clear();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_leds() {
|
||||||
|
ESP_LOGI(TAG, "Initializing LEDs...");
|
||||||
|
|
||||||
void init_leds(void) {
|
|
||||||
led_strip_config_t strip_config = {
|
led_strip_config_t strip_config = {
|
||||||
.strip_gpio_num = NEOPIXEL_PIN,
|
.strip_gpio_num = NEOPIXEL_PIN,
|
||||||
.max_leds = LED_COUNT,
|
.max_leds = LED_COUNT,
|
||||||
@ -17,11 +45,39 @@ void init_leds(void) {
|
|||||||
rmt_config.flags.with_dma = false;
|
rmt_config.flags.with_dma = false;
|
||||||
|
|
||||||
ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &leds));
|
ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &leds));
|
||||||
|
|
||||||
|
register_replay_fn(replay_handler);
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "LEDs initialized!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void example_leds(void) {
|
void led_set(uint32_t led, uint8_t r, uint8_t g, uint8_t b) {
|
||||||
for (int i = 0; i < LED_COUNT; i++) {
|
led_strip_set_pixel(leds, led, r, g, b);
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, i, i, LED_COUNT-i, 0));
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
char buf[32];
|
||||||
|
uint32_t color = (r << 16) | (g << 8) | b;
|
||||||
|
sprintf(buf, "%ld,%ld", led, color);
|
||||||
|
event_occured("LED_SET", buf);
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
}
|
||||||
}
|
|
||||||
|
void led_set(uint32_t led, uint32_t color) {
|
||||||
|
led_set(led, (color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void leds_flush() {
|
||||||
|
led_strip_refresh(leds);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LED_FLUSH", NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void leds_clear() {
|
||||||
|
led_strip_clear(leds);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LED_CLR", NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,40 +1,73 @@
|
|||||||
#ifndef LEDS_H
|
#ifndef LEDS_H
|
||||||
#define LEDS_H
|
#define LEDS_H
|
||||||
|
|
||||||
#include "led_strip.h"
|
#include <stdint.h>
|
||||||
|
|
||||||
#define LED_COUNT 21
|
#define LED_COUNT 21
|
||||||
#define NEOPIXEL_PIN GPIO_NUM_7
|
#define NEOPIXEL_PIN GPIO_NUM_7
|
||||||
// 10MHz resolution, 1 tick = 0.1us (led strip needs a high resolution)
|
// 10MHz resolution, 1 tick = 0.1us (led strip needs a high resolution)
|
||||||
#define LED_STRIP_RMT_RES_HZ (10 * 1000 * 1000)
|
#define LED_STRIP_RMT_RES_HZ (10 * 1000 * 1000)
|
||||||
|
|
||||||
extern led_strip_handle_t leds;
|
enum LEDColor: uint32_t {
|
||||||
|
LED_COLOR_OFF = 0x00'00'00,
|
||||||
|
LED_COLOR_RED = 0x17'00'00,
|
||||||
|
LED_COLOR_RED_STRONG = 0xFF'00'00,
|
||||||
|
LED_COLOR_ORANGE = 0x17'02'00,
|
||||||
|
LED_COLOR_ORANGE_STRONG = 0xFF'20'00,
|
||||||
|
LED_COLOR_YELLOW = 0x07'07'00,
|
||||||
|
LED_COLOR_YELLOW_STRONG = 0xFF'FF'00,
|
||||||
|
LED_COLOR_GREEN = 0x00'07'00,
|
||||||
|
LED_COLOR_GREEN_STRONG = 0x00'FF'00,
|
||||||
|
LED_COLOR_BLUE = 0x00'00'17,
|
||||||
|
LED_COLOR_BLUE_STRONG = 0x00'00'FF,
|
||||||
|
LED_COLOR_PINK = 0x10'00'04,
|
||||||
|
LED_COLOR_PINK_STRONG = 0xFF'00'80,
|
||||||
|
LED_COLOR_WHITE = 0x04'04'04,
|
||||||
|
LED_COLOR_WHITE_STRONG = 0xFF'FF'FF,
|
||||||
|
};
|
||||||
|
|
||||||
typedef enum {
|
enum IndicatorLED {
|
||||||
shape1 = 0,
|
LED_SHAPE1 = 0u,
|
||||||
shape2 = 1,
|
LED_SHAPE2 = 1u,
|
||||||
shape3 = 2,
|
LED_SHAPE3 = 2u,
|
||||||
shape4 = 3,
|
LED_SHAPE4 = 3u,
|
||||||
module_sseg = 4,
|
LED_MODULE_SSEG = 4u,
|
||||||
game_sseg = 5,
|
LED_GAME_SSEG = 5u,
|
||||||
tft = 6,
|
LED_TFT = 6u,
|
||||||
mic = 7,
|
LED_MIC = 7u,
|
||||||
ir_led = 8,
|
LED_IR_LED = 8u,
|
||||||
speaker = 9,
|
LED_SPEAKER = 9u,
|
||||||
rfid = 10,
|
LED_RFID = 10u,
|
||||||
keypad = 11,
|
LED_KEYPAD = 11u,
|
||||||
char_lcd = 12,
|
LED_LCD = 12u,
|
||||||
switch4 = 13,
|
LED_S4 = 13u,
|
||||||
switch3 = 14,
|
LED_S3 = 14u,
|
||||||
switch2 = 15,
|
LED_S2 = 15u,
|
||||||
switch1 = 16,
|
LED_S1 = 16u,
|
||||||
button4 = 17,
|
LED_B4 = 17u,
|
||||||
button3 = 18,
|
LED_B3 = 18u,
|
||||||
button2 = 19,
|
LED_B2 = 19u,
|
||||||
button1 = 20,
|
LED_B1 = 20u,
|
||||||
} Led;
|
LED_MAX = 20u,
|
||||||
|
};
|
||||||
|
|
||||||
void init_leds(void);
|
/// @brief Initializes the indicator LEDs
|
||||||
void example_leds(void);
|
void init_leds();
|
||||||
|
|
||||||
|
/// Sets the color of an LED.
|
||||||
|
///
|
||||||
|
/// Call `flush_leds()` to send the data to the LEDs.
|
||||||
|
void led_set(uint32_t led, uint32_t color);
|
||||||
|
|
||||||
|
/// Sets the color of an LED with rgb.
|
||||||
|
///
|
||||||
|
/// Call `flush_leds()` to send the data to the LEDs.
|
||||||
|
void led_set(uint32_t led, uint8_t r, uint8_t g, uint8_t b);
|
||||||
|
|
||||||
|
/// Outputs the data to the leds.
|
||||||
|
void leds_flush();
|
||||||
|
|
||||||
|
/// Clears the LEDs
|
||||||
|
void leds_clear();
|
||||||
|
|
||||||
#endif /* LEDS_H */
|
#endif /* LEDS_H */
|
||||||
@ -1,7 +1,8 @@
|
|||||||
#include "power.h"
|
#include "power.h"
|
||||||
#include "char_lcd.h"
|
#include "char_lcd.h"
|
||||||
|
#include <esp_log.h>
|
||||||
|
|
||||||
static const char* TAG = "POWER";
|
static const char* TAG = "power";
|
||||||
|
|
||||||
void bat_monitor_task(void* arg) {
|
void bat_monitor_task(void* arg) {
|
||||||
while (1) {
|
while (1) {
|
||||||
@ -36,12 +37,17 @@ void bat_monitor_task(void* arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void init_power_board() {
|
void init_power_board() {
|
||||||
|
ESP_LOGI(TAG, "Initializing power board...");
|
||||||
|
|
||||||
if (!lipo.begin()) {
|
if (!lipo.begin()) {
|
||||||
ESP_LOGE(TAG, "Failed to init communication with the battery gas guage");
|
ESP_LOGE(TAG, "Failed to init communication with the battery gas guage");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto voltage = lipo.voltage();
|
auto voltage = lipo.voltage();
|
||||||
ESP_LOGI(TAG, "Battery Voltage: %d", voltage);
|
ESP_LOGI(TAG, "Battery Voltage: %d", voltage);
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Power board initialized!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,12 +2,14 @@
|
|||||||
#define POWER_H
|
#define POWER_H
|
||||||
|
|
||||||
#include "SparkFunBQ27441/SparkFunBQ27441.h"
|
#include "SparkFunBQ27441/SparkFunBQ27441.h"
|
||||||
#include <esp_log.h>
|
|
||||||
|
|
||||||
void bat_monitor_task(void* arg);
|
void bat_monitor_task(void* arg);
|
||||||
|
|
||||||
/// Initializes the battery gas guage for getting battery stats.
|
/// Initializes the battery gas guage for getting battery stats.
|
||||||
void init_power_board();
|
void init_power_board();
|
||||||
|
|
||||||
|
/// @brief Gets the battery voltage
|
||||||
|
/// @return battery voltage in mV.
|
||||||
uint16_t get_bat_voltage();
|
uint16_t get_bat_voltage();
|
||||||
|
|
||||||
#endif /* POWER_H */
|
#endif /* POWER_H */
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
|
#include "state_tracking.h"
|
||||||
|
|
||||||
static const char *TAG = "speaker";
|
static const char *TAG = "speaker";
|
||||||
|
|
||||||
@ -29,6 +30,27 @@ QueueHandle_t play_clip_queue;
|
|||||||
/// The clips that are currently playing
|
/// The clips that are currently playing
|
||||||
std::vector<playing_audio_clip_t> playing_clips;
|
std::vector<playing_audio_clip_t> playing_clips;
|
||||||
|
|
||||||
|
static bool replay_handler(const char* event, char* arg) {
|
||||||
|
if (strcmp(event, "PLAY_WAV") == 0) {
|
||||||
|
char* file_name = strtok(arg, ":");
|
||||||
|
char* play_immediately_str = strtok(NULL, ":");
|
||||||
|
char* repeat_str = strtok(NULL, ":");
|
||||||
|
char* prescaler_str = strtok(NULL, ":");
|
||||||
|
|
||||||
|
bool play_immediately = strcmp(play_immediately_str, "true") == 0;
|
||||||
|
bool repeat = strcmp(repeat_str, "true") == 0;
|
||||||
|
uint8_t prescaler = atoi(prescaler_str);
|
||||||
|
play_clip_wav(file_name, play_immediately, repeat, prescaler, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "STOP_WAV") == 0) {
|
||||||
|
stop_clip(arg, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool push_clip(audio_clip_t clip) {
|
static bool push_clip(audio_clip_t clip) {
|
||||||
ESP_LOGD(TAG, "playing %s", clip.file_name);
|
ESP_LOGD(TAG, "playing %s", clip.file_name);
|
||||||
FILE* fh = fopen(clip.file_name, "rb");
|
FILE* fh = fopen(clip.file_name, "rb");
|
||||||
@ -156,7 +178,7 @@ static void speaker_task(void* arg) {
|
|||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool play_clip_wav(const char* file_name, bool play_immediatly, bool repeat, uint8_t prescaler, TickType_t ticks_to_wait) {
|
bool play_clip_wav(const char* file_name, bool play_immediately, bool repeat, uint8_t prescaler, TickType_t ticks_to_wait) {
|
||||||
// clone the passed in string to the heap.
|
// clone the passed in string to the heap.
|
||||||
size_t len = strlen(file_name);
|
size_t len = strlen(file_name);
|
||||||
char* dynamic_file_name = (char*) malloc(len+1);
|
char* dynamic_file_name = (char*) malloc(len+1);
|
||||||
@ -166,10 +188,16 @@ bool play_clip_wav(const char* file_name, bool play_immediatly, bool repeat, uin
|
|||||||
.file_name = dynamic_file_name,
|
.file_name = dynamic_file_name,
|
||||||
.prescaler = prescaler,
|
.prescaler = prescaler,
|
||||||
.repeat = repeat,
|
.repeat = repeat,
|
||||||
.play_immediatly = play_immediatly,
|
.play_immediatly = play_immediately,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (play_immediatly) {
|
if (is_state_tracking()) {
|
||||||
|
char buf[64];
|
||||||
|
sprintf(buf, "%s:%d:%d:%d", file_name, play_immediately, repeat, prescaler);
|
||||||
|
event_occured("PLAY_WAV", buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (play_immediately) {
|
||||||
return xQueueSendToFront(play_clip_queue, &clip, ticks_to_wait) == pdTRUE;
|
return xQueueSendToFront(play_clip_queue, &clip, ticks_to_wait) == pdTRUE;
|
||||||
}
|
}
|
||||||
return xQueueSend(play_clip_queue, &clip, ticks_to_wait) == pdTRUE;
|
return xQueueSend(play_clip_queue, &clip, ticks_to_wait) == pdTRUE;
|
||||||
@ -181,7 +209,11 @@ bool stop_clip(const char* file_name, TickType_t ticks_to_wait) {
|
|||||||
char* dynamic_file_name = (char*) malloc(len+1);
|
char* dynamic_file_name = (char*) malloc(len+1);
|
||||||
strcpy(dynamic_file_name, file_name);
|
strcpy(dynamic_file_name, file_name);
|
||||||
|
|
||||||
return xQueueSend(play_clip_queue, &dynamic_file_name, ticks_to_wait) == pdTRUE;
|
if (is_state_tracking()) {
|
||||||
|
event_occured("STOP_WAV", file_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return xQueueSend(stop_clip_queue, &dynamic_file_name, ticks_to_wait) == pdTRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_speaker(void) {
|
void init_speaker(void) {
|
||||||
@ -221,7 +253,9 @@ void init_speaker(void) {
|
|||||||
// start task
|
// start task
|
||||||
xTaskCreate(speaker_task, "play_audio", 4096, NULL, 5, NULL);
|
xTaskCreate(speaker_task, "play_audio", 4096, NULL, 5, NULL);
|
||||||
|
|
||||||
play_clip_wav(MOUNT_POINT "/startup.wav", true, false, 3, 0);
|
play_clip_wav(MOUNT_POINT "/startup.wav", true, false, 4, 0);
|
||||||
|
|
||||||
|
register_replay_fn(replay_handler);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Speaker initialized!");
|
ESP_LOGI(TAG, "Speaker initialized!");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,7 +52,7 @@ void init_speaker();
|
|||||||
/// loud. Useful for loud audio files.
|
/// loud. Useful for loud audio files.
|
||||||
/// @param ticks_to_wait The number of ticks to wait if the queue is full.
|
/// @param ticks_to_wait The number of ticks to wait if the queue is full.
|
||||||
/// @return true if the clip was added to the queue.
|
/// @return true if the clip was added to the queue.
|
||||||
bool play_clip_wav(const char* file_name, bool play_immediatly, bool repeat, uint8_t prescaler, TickType_t ticks_to_wait);
|
bool play_clip_wav(const char* file_name, bool play_immediately, bool repeat, uint8_t prescaler, TickType_t ticks_to_wait);
|
||||||
|
|
||||||
/// @brief Stops an audio clip from playing.
|
/// @brief Stops an audio clip from playing.
|
||||||
/// @param file_name The file name of the audio clip that was played.
|
/// @param file_name The file name of the audio clip that was played.
|
||||||
|
|||||||
@ -1,15 +1,62 @@
|
|||||||
#include "sseg.h"
|
#include "sseg.h"
|
||||||
#include "esp_log.h"
|
#include <esp_log.h>
|
||||||
|
#include "state_tracking.h"
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
TM1640* sseg = nullptr;
|
TM1640* sseg = nullptr;
|
||||||
|
|
||||||
static const char *TAG = "sseg";
|
static const char *TAG = "sseg";
|
||||||
|
|
||||||
|
static bool replay_handler(const char* event, char* arg) {
|
||||||
|
if (strcmp(event, "SSEG_G_RAW") == 0) {
|
||||||
|
uint8_t segments[4];
|
||||||
|
segments[0] = atoi(strtok(arg, ","));
|
||||||
|
for (int i = 1; i < 4; i++) {
|
||||||
|
segments[i] = atoi(strtok(NULL, ","));
|
||||||
|
}
|
||||||
|
set_game_sseg_raw(segments);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "SSEG_G_CLR") == 0) {
|
||||||
|
clear_game_sseg();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "SSEG_M_RAW") == 0) {
|
||||||
|
uint8_t segments[4];
|
||||||
|
segments[0] = atoi(strtok(arg, ","));
|
||||||
|
for (int i = 1; i < 4; i++) {
|
||||||
|
segments[i] = atoi(strtok(NULL, ","));
|
||||||
|
}
|
||||||
|
set_module_sseg_raw(segments);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "SSEG_M_CLR") == 0) {
|
||||||
|
clear_module_sseg();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "SSEG_G") == 0) {
|
||||||
|
uint32_t value = atoi(strtok(arg, ","));
|
||||||
|
uint8_t dot_pos = atoi(strtok(NULL, ","));
|
||||||
|
set_game_sseg_num(value, dot_pos);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (strcmp(event, "SSEG_M") == 0) {
|
||||||
|
uint32_t value = atoi(strtok(arg, ","));
|
||||||
|
uint8_t dot_pos = atoi(strtok(NULL, ","));
|
||||||
|
set_module_sseg_num(value, dot_pos);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void init_sseg() {
|
void init_sseg() {
|
||||||
ESP_LOGI(TAG, "Initializing sseg...");
|
ESP_LOGI(TAG, "Initializing sseg...");
|
||||||
|
|
||||||
sseg = new TM1640(SSEG_PIN_DATA, SSEG_PIN_CLK, 8);
|
sseg = new TM1640(SSEG_PIN_DATA, SSEG_PIN_CLK, 8);
|
||||||
|
|
||||||
|
register_replay_fn(replay_handler);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Sseg initialized!");
|
ESP_LOGI(TAG, "Sseg initialized!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -18,12 +65,22 @@ void set_game_sseg_raw(const uint8_t* segments) {
|
|||||||
sseg->setSegments(segments[1], 1);
|
sseg->setSegments(segments[1], 1);
|
||||||
sseg->setSegments(segments[2], 2);
|
sseg->setSegments(segments[2], 2);
|
||||||
sseg->setSegments(segments[3], 3);
|
sseg->setSegments(segments[3], 3);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, "%d,%d,%d,%d", segments[0], segments[1], segments[2], segments[3]);
|
||||||
|
event_occured("SSEG_G_RAW", buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void clear_game_sseg() {
|
void clear_game_sseg() {
|
||||||
sseg->setSegments(0, 0);
|
sseg->setSegments(0, 0);
|
||||||
sseg->setSegments(0, 1);
|
sseg->setSegments(0, 1);
|
||||||
sseg->setSegments(0, 2);
|
sseg->setSegments(0, 2);
|
||||||
sseg->setSegments(0, 3);
|
sseg->setSegments(0, 3);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("SSEG_G_CLR", NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_module_sseg_raw(const uint8_t* segments) {
|
void set_module_sseg_raw(const uint8_t* segments) {
|
||||||
@ -31,6 +88,12 @@ void set_module_sseg_raw(const uint8_t* segments) {
|
|||||||
sseg->setSegments(segments[1], 5);
|
sseg->setSegments(segments[1], 5);
|
||||||
sseg->setSegments(segments[2], 6);
|
sseg->setSegments(segments[2], 6);
|
||||||
sseg->setSegments(segments[3], 7);
|
sseg->setSegments(segments[3], 7);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, "%d,%d,%d,%d", segments[0], segments[1], segments[2], segments[3]);
|
||||||
|
event_occured("SSEG_M_RAW", buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear_module_sseg() {
|
void clear_module_sseg() {
|
||||||
@ -38,20 +101,38 @@ void clear_module_sseg() {
|
|||||||
sseg->setSegments(0, 5);
|
sseg->setSegments(0, 5);
|
||||||
sseg->setSegments(0, 6);
|
sseg->setSegments(0, 6);
|
||||||
sseg->setSegments(0, 7);
|
sseg->setSegments(0, 7);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("SSEG_M_CLR", NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_game_sseg_num(uint32_t value, uint8_t dot_pos) {
|
void set_game_sseg_num(uint32_t value, uint8_t dot_pos) {
|
||||||
|
uint32_t initial_value = value;
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
auto idx = value % 10;
|
auto idx = value % 10;
|
||||||
sseg->sendChar(3-i, TM16XX_NUMBER_FONT[idx], i == dot_pos);
|
sseg->sendChar(3-i, TM16XX_NUMBER_FONT[idx], i == dot_pos);
|
||||||
value = value / 10;
|
value = value / 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
char buf[16];
|
||||||
|
sprintf(buf, "%ld,%d", initial_value, dot_pos);
|
||||||
|
event_occured("SSEG_G", buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_module_sseg_num(uint32_t value, uint8_t dot_pos) {
|
void set_module_sseg_num(uint32_t value, uint8_t dot_pos) {
|
||||||
|
uint32_t initial_value = value;
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
auto idx = value % 10;
|
auto idx = value % 10;
|
||||||
sseg->sendChar(7-i, TM16XX_NUMBER_FONT[idx], i == dot_pos);
|
sseg->sendChar(7-i, TM16XX_NUMBER_FONT[idx], i == dot_pos);
|
||||||
value = value / 10;
|
value = value / 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
char buf[16];
|
||||||
|
sprintf(buf, "%ld,%d", initial_value, dot_pos);
|
||||||
|
event_occured("SSEG_M", buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
226
main/drivers/state_tracking.cpp
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
#include "state_tracking.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <vector>
|
||||||
|
#include "wlvgl.h"
|
||||||
|
|
||||||
|
static const char* PLAYBACK_TAG = "playback";
|
||||||
|
|
||||||
|
enum state_t {
|
||||||
|
STATE_IDLE = 0,
|
||||||
|
STATE_RECORDING = 1,
|
||||||
|
STATE_PLAYBACK = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static std::vector<bool(*)(const char*, char*)> replay_fns;
|
||||||
|
|
||||||
|
static bool should_close_recording_stream;
|
||||||
|
static FILE* recording_stream;
|
||||||
|
static uint32_t recording_start_time;
|
||||||
|
TaskHandle_t flush_file_task_handle;
|
||||||
|
|
||||||
|
static bool should_close_playback_stream;
|
||||||
|
static FILE* playback_stream;
|
||||||
|
static uint32_t playback_start_time;
|
||||||
|
TaskHandle_t playback_task_handle;
|
||||||
|
|
||||||
|
static volatile state_t state = STATE_IDLE;
|
||||||
|
|
||||||
|
|
||||||
|
/// @brief Periodically flushes and syncs (if neccesary) the output stream.
|
||||||
|
/// @param arg unused.
|
||||||
|
static void flush_file_task(void* arg) {
|
||||||
|
while (state == STATE_RECORDING && recording_stream != nullptr) {
|
||||||
|
fflush(recording_stream);
|
||||||
|
|
||||||
|
int fd = fileno(recording_stream);
|
||||||
|
if (fd != -1) {
|
||||||
|
fsync(fd);
|
||||||
|
}
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(5000));
|
||||||
|
}
|
||||||
|
|
||||||
|
flush_file_task_handle = NULL;
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void playback_task(void* arg) {
|
||||||
|
const size_t size = 16*1024;
|
||||||
|
char* buf = (char*) malloc(size*sizeof(char));
|
||||||
|
if (buf == nullptr) {
|
||||||
|
ESP_LOGE(PLAYBACK_TAG, "buf alloc failure");
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (state == STATE_PLAYBACK && playback_stream != nullptr) {
|
||||||
|
char* ret = fgets(buf, size, playback_stream);
|
||||||
|
if (ret == nullptr) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (buf[0] == '\0') {
|
||||||
|
ESP_LOGI(PLAYBACK_TAG, "playback done");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// get rid of the '\n' and possibly '\r' in the string
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
if (buf[i] == '\0') break;
|
||||||
|
if (buf[i] == '\r' || buf[i] == '\n') {
|
||||||
|
buf[i] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ESP_LOGI(PLAYBACK_TAG, "handling: %s", buf);
|
||||||
|
|
||||||
|
// look for a comma, indicating the end of the "ticks" part
|
||||||
|
// TODO: replace with strtok
|
||||||
|
size_t comma_pos = 0;
|
||||||
|
for (int i = 0; i < 11; i++) {
|
||||||
|
if (buf[i] == ',') {
|
||||||
|
comma_pos = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (comma_pos == 0) {
|
||||||
|
ESP_LOGE(PLAYBACK_TAG, "Failed to find comma in playback line");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[comma_pos] = '\0';
|
||||||
|
uint32_t tick = atoi(buf);
|
||||||
|
|
||||||
|
// now look for the colon to indicate the end of the event name
|
||||||
|
size_t colon_pos = 0;
|
||||||
|
int i = comma_pos + 1; // start looking right after the comma
|
||||||
|
while (i < size) {
|
||||||
|
if (buf[i] == ':') {
|
||||||
|
colon_pos = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (colon_pos == 0) {
|
||||||
|
ESP_LOGE(PLAYBACK_TAG, "Failed to find colon in playback line");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[colon_pos] = '\0';
|
||||||
|
char* event_name = buf + (comma_pos + 1);
|
||||||
|
char* arg = buf + (colon_pos + 1);
|
||||||
|
|
||||||
|
int32_t ticks_to_wait = ((int32_t) tick) - (int32_t)(xTaskGetTickCount() - playback_start_time);
|
||||||
|
|
||||||
|
if (ticks_to_wait < 0) {
|
||||||
|
ESP_LOGW(PLAYBACK_TAG, "Playback is behind by %ld ticks!", ticks_to_wait);
|
||||||
|
}
|
||||||
|
if (ticks_to_wait > 0) {
|
||||||
|
vTaskDelay(ticks_to_wait);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool matched = false;
|
||||||
|
for (const auto& fn : replay_fns) {
|
||||||
|
matched = (fn)(event_name, arg);
|
||||||
|
if (matched) break;
|
||||||
|
}
|
||||||
|
if (!matched) {
|
||||||
|
ESP_LOGW(PLAYBACK_TAG, "Failed to match event: %s!", event_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
playback_task_handle = NULL;
|
||||||
|
|
||||||
|
stop_playback();
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void register_replay_fn(bool (*replay_fn)(const char*, char*)) {
|
||||||
|
replay_fns.push_back(replay_fn);
|
||||||
|
}
|
||||||
|
|
||||||
|
void event_occured(const char* name, const char* arg) {
|
||||||
|
if (state != STATE_RECORDING) return;
|
||||||
|
if (name == nullptr) return;
|
||||||
|
if (recording_stream == nullptr) {
|
||||||
|
ESP_LOGE("state_tracking", "We are in state recording, but recording stream is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
arg = (arg == nullptr) ? "" : arg;
|
||||||
|
uint32_t ticks = xTaskGetTickCount() - recording_start_time;
|
||||||
|
fprintf(recording_stream, "%ld,%s:%s\n", ticks, name, (arg == nullptr) ? "" : arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool set_recording_source(FILE* stream, bool should_close) {
|
||||||
|
if (state == STATE_RECORDING) return false;
|
||||||
|
|
||||||
|
recording_stream = stream;
|
||||||
|
should_close_recording_stream = should_close;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool set_playback_source(FILE* stream, bool should_close) {
|
||||||
|
if (state == STATE_PLAYBACK) return false;
|
||||||
|
|
||||||
|
playback_stream = stream;
|
||||||
|
should_close_playback_stream = should_close;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool start_recording() {
|
||||||
|
if (state != STATE_IDLE) return false;
|
||||||
|
if (recording_stream == nullptr) return false;
|
||||||
|
|
||||||
|
state = STATE_RECORDING;
|
||||||
|
recording_start_time = xTaskGetTickCount();
|
||||||
|
xTaskCreate(flush_file_task, "flush_recording", 2048, NULL, 2, &flush_file_task_handle);
|
||||||
|
reset_wlv_tables(); // TODO: generify this
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool stop_recording() {
|
||||||
|
if (state != STATE_RECORDING) return false;
|
||||||
|
|
||||||
|
state = STATE_IDLE;
|
||||||
|
fflush(recording_stream);
|
||||||
|
if (should_close_recording_stream) {
|
||||||
|
fclose(recording_stream);
|
||||||
|
recording_stream = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flush_file_task_handle != nullptr) {
|
||||||
|
vTaskDelete(flush_file_task_handle);
|
||||||
|
flush_file_task_handle = NULL;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool start_playback() {
|
||||||
|
if (state != STATE_IDLE) return false;
|
||||||
|
if (playback_stream == nullptr) return false;
|
||||||
|
|
||||||
|
state = STATE_PLAYBACK;
|
||||||
|
playback_start_time = xTaskGetTickCount();
|
||||||
|
xTaskCreate(playback_task, "playback", 4096, NULL, 2, &playback_task_handle);
|
||||||
|
reset_wlv_tables(); // TODO: generify this
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool stop_playback() {
|
||||||
|
if (state != STATE_PLAYBACK) return false;
|
||||||
|
|
||||||
|
state = STATE_IDLE;
|
||||||
|
if (should_close_playback_stream) {
|
||||||
|
fclose(playback_stream);
|
||||||
|
playback_stream = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (playback_task_handle != nullptr) {
|
||||||
|
// TODO: NO!! This leaks the malloc. Instead, use a queue to request a graceful stop
|
||||||
|
vTaskDelete(playback_task_handle);
|
||||||
|
playback_task_handle = NULL;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_state_tracking() {
|
||||||
|
return state == STATE_RECORDING;
|
||||||
|
}
|
||||||
53
main/drivers/state_tracking.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#ifndef STATE_TRACKING_H
|
||||||
|
#define STATE_TRACKING_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "esp_vfs_fat.h"
|
||||||
|
|
||||||
|
/// @brief Registers function to be called on replay.
|
||||||
|
/// @param replay_callback A function to call to playback the event.
|
||||||
|
void register_replay_fn(bool (*replay_fn)(const char*, char*));
|
||||||
|
|
||||||
|
// TODO: add one for generically responding to all events.
|
||||||
|
|
||||||
|
/// @brief Call this to indicate that the bomb state has transitioned.
|
||||||
|
/// @param name The name of the event that has occured.
|
||||||
|
/// @param arg The serialized data associated with the event.
|
||||||
|
/// This must not contain newline characters such as '\n' or '\r'
|
||||||
|
void event_occured(const char* name, const char* arg);
|
||||||
|
|
||||||
|
/// @brief Sets the recording source.
|
||||||
|
/// @param stream The stream to record to.
|
||||||
|
/// @param should_close whether or not the stream should be closed when finished.
|
||||||
|
/// @return true if the source was updated.
|
||||||
|
bool set_recording_source(FILE* stream, bool should_close);
|
||||||
|
|
||||||
|
/// @brief Sets the playback source.
|
||||||
|
/// @param stream The stream to playback from.
|
||||||
|
/// @param should_close whether or not the stream should be closed when finished.
|
||||||
|
/// @return true if the source was updated.
|
||||||
|
bool set_playback_source(FILE* stream, bool should_close);
|
||||||
|
|
||||||
|
/// @brief Starts recording to the stream specified by `set_recording_source()`.
|
||||||
|
/// @return true if starting recording is successful.
|
||||||
|
bool start_recording();
|
||||||
|
|
||||||
|
/// @brief Stops recording the state.
|
||||||
|
/// @return true if stopping the recording is successful.
|
||||||
|
bool stop_recording();
|
||||||
|
|
||||||
|
/// @brief Starts playing back the recording specified by `set_playback_source()`.
|
||||||
|
/// @return true if starting playback is successful.
|
||||||
|
bool start_playback();
|
||||||
|
|
||||||
|
/// @brief Stops playing back the recording.
|
||||||
|
/// @return true if stopping the playback is successful.
|
||||||
|
bool stop_playback();
|
||||||
|
|
||||||
|
/// @brief Gets weather or not we are tracking the state
|
||||||
|
/// This can be helpful to conditionally do extra computation only
|
||||||
|
/// when we are tracking the state.
|
||||||
|
/// @return
|
||||||
|
bool is_state_tracking();
|
||||||
|
|
||||||
|
#endif /* STATE_TRACKING_H */
|
||||||
@ -1,4 +1,5 @@
|
|||||||
#include "tft.h"
|
#include "tft.h"
|
||||||
|
#include "state_tracking.h"
|
||||||
|
|
||||||
static const char* TAG = "tft";
|
static const char* TAG = "tft";
|
||||||
|
|
||||||
@ -16,16 +17,28 @@ static lv_style_t style_screen;
|
|||||||
|
|
||||||
SemaphoreHandle_t xGuiSemaphore;
|
SemaphoreHandle_t xGuiSemaphore;
|
||||||
|
|
||||||
|
static bool replay_handler(const char* event, char* arg) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool notify_lvgl_flush_ready(
|
static bool notify_lvgl_flush_ready(
|
||||||
esp_lcd_panel_io_handle_t panel_io,
|
esp_lcd_panel_io_handle_t panel_io,
|
||||||
esp_lcd_panel_io_event_data_t *edata,
|
esp_lcd_panel_io_event_data_t *edata,
|
||||||
void *user_ctx
|
void *user_ctx
|
||||||
) {
|
) {
|
||||||
lv_disp_drv_t *disp_driver = (lv_disp_drv_t *)user_ctx;
|
lv_disp_drv_t* disp_driver = (lv_disp_drv_t *)user_ctx;
|
||||||
lv_disp_flush_ready(disp_driver);
|
lv_disp_flush_ready(disp_driver);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
|
/// Base 64 encodes a u16... sort of. This doesn't do any of the fancy padding stuff.
|
||||||
|
static void encode_base64(char* buf, size_t start_idx, uint16_t value) {
|
||||||
|
buf[start_idx+0] = base64_chars[(value >> 10) & 0x3F];
|
||||||
|
buf[start_idx+1] = base64_chars[(value >> 4) & 0x3F];
|
||||||
|
buf[start_idx+2] = base64_chars[(value << 2) & 0x3F];
|
||||||
|
}
|
||||||
|
|
||||||
static void lvgl_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) {
|
static void lvgl_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) {
|
||||||
esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) drv->user_data;
|
esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) drv->user_data;
|
||||||
|
|
||||||
@ -33,7 +46,46 @@ static void lvgl_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t
|
|||||||
int offsetx2 = area->x2;
|
int offsetx2 = area->x2;
|
||||||
int offsety1 = area->y1;
|
int offsety1 = area->y1;
|
||||||
int offsety2 = area->y2;
|
int offsety2 = area->y2;
|
||||||
|
|
||||||
esp_lcd_panel_draw_bitmap(panel_handle, offsetx1, offsety1, offsetx2 + 1, offsety2 + 1, color_map);
|
esp_lcd_panel_draw_bitmap(panel_handle, offsetx1, offsety1, offsetx2 + 1, offsety2 + 1, color_map);
|
||||||
|
|
||||||
|
// TODO: change this to be a kconfig value
|
||||||
|
#if false
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
size_t size = (offsetx2 + 1 - offsetx1) * (offsety2 + 1 - offsety1) + 1;
|
||||||
|
// if (size > 1024) {
|
||||||
|
// ESP_LOGW("tft_track_state", "Write too big (%d)! truncating to 1024!", size);
|
||||||
|
// }
|
||||||
|
// size = MIN(1024, size);
|
||||||
|
|
||||||
|
|
||||||
|
// 24 bytes for the offsets
|
||||||
|
// 3 bytes per encoded color
|
||||||
|
// 1 byte for null terminator
|
||||||
|
size_t alloc_size = 24 + size * 3 + 1;
|
||||||
|
char* buf = (char*)malloc(alloc_size);
|
||||||
|
|
||||||
|
if (buf != nullptr) {
|
||||||
|
size_t initial_offset = sprintf(buf, "%d,%d,%d,%d:", offsetx1, offsety1, offsetx2 + 1, offsety2 + 1);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < size; i++) {
|
||||||
|
size_t index = initial_offset + i * 3;
|
||||||
|
|
||||||
|
// we assume that the size of the color data is 16b
|
||||||
|
static_assert(sizeof(lv_color_t) == sizeof(uint16_t), "lv_color_t must be 16b wide");
|
||||||
|
encode_base64(buf, index, color_map[i].full);
|
||||||
|
}
|
||||||
|
buf[initial_offset + (size-1) * 3 + 1] = '\0';
|
||||||
|
|
||||||
|
event_occured("TFT_W", buf);
|
||||||
|
free(buf);
|
||||||
|
} else {
|
||||||
|
ESP_LOGE("tft_track_state", "buffer alloc failed!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void IRAM_ATTR lv_tick_task(void *param) {
|
static void IRAM_ATTR lv_tick_task(void *param) {
|
||||||
@ -150,10 +202,10 @@ static void guiTask(void *pvParameter) {
|
|||||||
ESP_ERROR_CHECK(esp_timer_create(&lvgl_tick_timer_args, &periodic_timer));
|
ESP_ERROR_CHECK(esp_timer_create(&lvgl_tick_timer_args, &periodic_timer));
|
||||||
ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LVGL_UPDATE_PERIOD_MS * 1000));
|
ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LVGL_UPDATE_PERIOD_MS * 1000));
|
||||||
|
|
||||||
screen = lv_disp_get_scr_act(NULL);
|
screen = lv_scr_act();
|
||||||
lv_style_init(&style_screen);
|
lv_style_init(&style_screen);
|
||||||
lv_style_set_bg_color(&style_screen, lv_color_black());
|
lv_style_set_bg_color(&style_screen, lv_color_black());
|
||||||
lv_obj_add_style(lv_scr_act(), &style_screen, LV_STATE_DEFAULT);
|
lv_obj_add_style(screen, &style_screen, LV_STATE_DEFAULT);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
/* Delay 1 tick (assumes FreeRTOS tick is 10ms */
|
/* Delay 1 tick (assumes FreeRTOS tick is 10ms */
|
||||||
@ -169,20 +221,14 @@ static void guiTask(void *pvParameter) {
|
|||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tick_timer_task(void* arg) {
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
lv_task_handler();
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(10));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void init_tft() {
|
void init_tft() {
|
||||||
|
ESP_LOGI(TAG, "Initializing TFT...");
|
||||||
|
|
||||||
initialize_spi();
|
initialize_spi();
|
||||||
initialize_display();
|
initialize_display();
|
||||||
xTaskCreatePinnedToCore(guiTask, "gui", 4096*2, NULL, 5, NULL, 1);
|
xTaskCreatePinnedToCore(guiTask, "gui", 4096*2, NULL, 5, NULL, 1);
|
||||||
|
|
||||||
// xTaskCreatePinnedToCore(tick_timer_task, "tick_lvgl", 4096, NULL, 5, NULL, 1);
|
register_replay_fn(replay_handler);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "TFT initialization Successful");
|
ESP_LOGI(TAG, "TFT initialized!");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,14 @@
|
|||||||
#include "wires.h"
|
#include "wires.h"
|
||||||
|
|
||||||
|
extern uint32_t current_step;
|
||||||
|
|
||||||
uint32_t total_strikes;
|
uint32_t total_strikes;
|
||||||
|
uint32_t step_strikes[N_STEPS] = {0};
|
||||||
|
uint32_t step_finish_times[N_STEPS] = {0};
|
||||||
|
|
||||||
static const char *TAG = "wires";
|
static const char *TAG = "wires";
|
||||||
|
|
||||||
static const uint32_t STRIKE_TIME_PENALTY = 30'000;
|
const uint32_t STRIKE_TIME_PENALTY = 30'000;
|
||||||
|
|
||||||
static bool button_state;
|
static bool button_state;
|
||||||
static bool button_pressed;
|
static bool button_pressed;
|
||||||
@ -83,7 +87,10 @@ void strike(const char* reason) {
|
|||||||
ESP_LOGW("strike!", "%s", reason);
|
ESP_LOGW("strike!", "%s", reason);
|
||||||
lcd_print(0, 3, reason);
|
lcd_print(0, 3, reason);
|
||||||
time_penalty(STRIKE_TIME_PENALTY);
|
time_penalty(STRIKE_TIME_PENALTY);
|
||||||
total_strikes += 1;
|
if (current_step > 0 && current_step <= N_STEPS) {
|
||||||
|
total_strikes += 1;
|
||||||
|
step_strikes[current_step - 1] += 1;
|
||||||
|
}
|
||||||
uint8_t reg = 6;
|
uint8_t reg = 6;
|
||||||
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_to_device(WIRES_I2C_NUM, WIRES_I2C_ADDR, ®, 1, (100 / portTICK_PERIOD_MS)));
|
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_to_device(WIRES_I2C_NUM, WIRES_I2C_ADDR, ®, 1, (100 / portTICK_PERIOD_MS)));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@
|
|||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
#include "drivers/char_lcd.h"
|
#include "drivers/char_lcd.h"
|
||||||
#include "drivers/game_timer.h"
|
#include "drivers/game_timer.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
#define WIRES_PIN_DELTA GPIO_NUM_2
|
#define WIRES_PIN_DELTA GPIO_NUM_2
|
||||||
#define WIRES_I2C_NUM I2C_NUM_1
|
#define WIRES_I2C_NUM I2C_NUM_1
|
||||||
@ -15,6 +16,10 @@
|
|||||||
#define DELTA_BIT_WIRES 0
|
#define DELTA_BIT_WIRES 0
|
||||||
#define DELTA_BIT_BUTTON 1
|
#define DELTA_BIT_BUTTON 1
|
||||||
|
|
||||||
|
extern const uint32_t STRIKE_TIME_PENALTY;
|
||||||
|
extern uint32_t step_strikes[N_STEPS];
|
||||||
|
extern uint32_t step_finish_times[N_STEPS];
|
||||||
|
|
||||||
extern uint32_t total_strikes;
|
extern uint32_t total_strikes;
|
||||||
|
|
||||||
void init_wires(void);
|
void init_wires(void);
|
||||||
|
|||||||
55
main/drivers/wlvgl.cpp
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#include "wlvgl.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
/// A table that maps an incrementing integer to a style reference
|
||||||
|
static std::vector<lv_style_t*> style_table;
|
||||||
|
|
||||||
|
/// A table that maps an incrementing integer to a style reference
|
||||||
|
static std::vector<lv_obj_t*> obj_table;
|
||||||
|
|
||||||
|
void reset_wlv_tables() {
|
||||||
|
style_table.clear();
|
||||||
|
obj_table.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
lv_obj_t wlv_obj_create(lv_obj_t* parent) {
|
||||||
|
// initialize the obj
|
||||||
|
lv_obj_t value = lv_obj_create(parent);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
// add the style to the table
|
||||||
|
obj_table.push_back(value);
|
||||||
|
size_t obj_index = obj_table.size();
|
||||||
|
|
||||||
|
char buf[8];
|
||||||
|
sprintf(buf, "%d", obj_index);
|
||||||
|
event_occured("lv_obj_create", buf);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_style_init(lv_style_t* style) {
|
||||||
|
// initialize the style
|
||||||
|
lv_style_init(style);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
// add the style to the table
|
||||||
|
style_table.push_back(style);
|
||||||
|
size_t style_index = style_table.size();
|
||||||
|
|
||||||
|
char buf[8];
|
||||||
|
sprintf(buf, "%d", style_index);
|
||||||
|
event_occured("lv_style_init", buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_obj_set_style_bg_color(lv_obj_t* obj, lv_color_t value, lv_style_selector_t selector) {
|
||||||
|
lv_obj_set_style_bg_color(obj, value, selector);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
char buf[8];
|
||||||
|
sprintf(buf, "%d", style_index);
|
||||||
|
event_occured("lv_obj_set_style_bg_color", buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
13
main/drivers/wlvgl.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef WLVGL_H
|
||||||
|
#define WLVGL_H
|
||||||
|
|
||||||
|
#include "lvgl.h"
|
||||||
|
#include "state_tracking.h"
|
||||||
|
|
||||||
|
void reset_wlv_tables();
|
||||||
|
|
||||||
|
void wlv_obj_create(lv_obj_t* parent);
|
||||||
|
void wlv_style_init(lv_style_t* style);
|
||||||
|
void wlv_obj_set_style_bg_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector);
|
||||||
|
|
||||||
|
#endif /* WLVGL_H */
|
||||||
115
main/helper.cpp
@ -7,8 +7,8 @@ void clean_bomb(void) {
|
|||||||
clear_wires_pressed_released_cut();
|
clear_wires_pressed_released_cut();
|
||||||
|
|
||||||
// clear leds
|
// clear leds
|
||||||
led_strip_clear(leds);
|
leds_clear();
|
||||||
led_strip_refresh(leds);
|
leds_flush();
|
||||||
|
|
||||||
// clear module timer
|
// clear module timer
|
||||||
stop_module_timer();
|
stop_module_timer();
|
||||||
@ -89,40 +89,105 @@ void do_star_codes(StarCodeHandler* star_codes, int star_codes_len) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static lv_style_t game_results_style;
|
static lv_obj_t* old_scr;
|
||||||
static lv_obj_t* game_results_label;
|
static lv_obj_t* scr;
|
||||||
|
|
||||||
|
static lv_style_t game_results_style;
|
||||||
|
static lv_obj_t* overall_results_label;
|
||||||
|
static lv_obj_t* breakdown_results_label;
|
||||||
|
static lv_obj_t* strike_numbers_label;
|
||||||
|
static lv_obj_t* step_times_label;
|
||||||
|
|
||||||
|
static void write_time(char* buf, int32_t game_time) {
|
||||||
|
char minus[2] = "\0";
|
||||||
|
if (game_time < 0) {
|
||||||
|
minus[0] = '-';
|
||||||
|
game_time = -game_time;
|
||||||
|
}
|
||||||
|
|
||||||
static char str_buf[10] = {0};
|
|
||||||
static char* write_time(uint32_t game_time) {
|
|
||||||
uint8_t hours = (game_time / (1000*60*60)) % 10;
|
uint8_t hours = (game_time / (1000*60*60)) % 10;
|
||||||
uint8_t minutes = (game_time / (1000*60)) % 60;
|
uint8_t minutes = (game_time / (1000*60)) % 60;
|
||||||
uint8_t seconds = (game_time / (1000)) % 60;
|
uint8_t seconds = (game_time / (1000)) % 60;
|
||||||
|
|
||||||
sprintf(str_buf, "%d:%02d:%02d", hours, minutes, seconds);
|
sprintf(buf, "%s%d:%02d:%02d", minus, hours, minutes, seconds);
|
||||||
return str_buf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern uint32_t initial_game_time;
|
extern uint32_t initial_game_time;
|
||||||
void display_game_results(void) {
|
void display_game_results(void) {
|
||||||
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
while (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdFALSE) vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
lv_style_init(&game_results_style);
|
scr = lv_obj_create(NULL);
|
||||||
lv_style_set_text_color(&game_results_style, lv_color_white());
|
lv_obj_set_style_bg_color(scr, lv_color_black(), LV_STATE_DEFAULT);
|
||||||
lv_style_set_bg_color(&game_results_style, lv_color_black());
|
|
||||||
lv_style_set_bg_opa(&game_results_style, LV_OPA_100);
|
lv_style_init(&game_results_style);
|
||||||
lv_style_set_text_align(&game_results_style, LV_TEXT_ALIGN_CENTER);
|
lv_style_set_text_color(&game_results_style, lv_color_white());
|
||||||
|
lv_style_set_text_align(&game_results_style, LV_TEXT_ALIGN_LEFT);
|
||||||
|
|
||||||
game_results_label = lv_label_create(lv_scr_act());
|
overall_results_label = lv_label_create(scr);
|
||||||
lv_obj_align(game_results_label, LV_ALIGN_CENTER, 0, 0);
|
lv_obj_align(overall_results_label, LV_ALIGN_TOP_LEFT, 20, 20);
|
||||||
lv_obj_add_style(game_results_label, &game_results_style, LV_STATE_DEFAULT);
|
lv_obj_set_size(overall_results_label, 460, 140);
|
||||||
|
lv_obj_add_style(overall_results_label, &game_results_style, LV_STATE_DEFAULT);
|
||||||
|
|
||||||
char buf[100] = {0};
|
breakdown_results_label = lv_label_create(scr);
|
||||||
int32_t time_s = get_game_time();
|
lv_obj_align(breakdown_results_label, LV_ALIGN_BOTTOM_LEFT, 20, 0);
|
||||||
int32_t time_spent = initial_game_time - time_s;
|
lv_obj_set_size(breakdown_results_label, 460, 140);
|
||||||
char* time = write_time(time_spent);
|
lv_obj_add_style(breakdown_results_label, &game_results_style, LV_STATE_DEFAULT);
|
||||||
sprintf(buf, "Finished!\nTotal Time (w/ penalties): %s\nTotal Strikes: %ld", time, total_strikes);
|
|
||||||
|
|
||||||
lv_label_set_text(game_results_label, buf);
|
strike_numbers_label = lv_label_create(scr);
|
||||||
|
lv_obj_align(strike_numbers_label, LV_ALIGN_BOTTOM_LEFT, 90, 0);
|
||||||
|
lv_obj_set_size(strike_numbers_label, 60, 140);
|
||||||
|
lv_obj_add_style(strike_numbers_label, &game_results_style, LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_text_align(strike_numbers_label, LV_TEXT_ALIGN_RIGHT, LV_STATE_DEFAULT);
|
||||||
|
|
||||||
xSemaphoreGive(xGuiSemaphore);
|
step_times_label = lv_label_create(scr);
|
||||||
}
|
lv_obj_align(step_times_label, LV_ALIGN_BOTTOM_LEFT, 140, 0);
|
||||||
|
lv_obj_set_size(step_times_label, 80, 140);
|
||||||
|
lv_obj_add_style(step_times_label, &game_results_style, LV_STATE_DEFAULT);
|
||||||
|
lv_obj_set_style_text_align(step_times_label, LV_TEXT_ALIGN_RIGHT, LV_STATE_DEFAULT);
|
||||||
|
|
||||||
|
char buf[1024] = {0};
|
||||||
|
|
||||||
|
char time_buf_1[32] = {0};
|
||||||
|
char time_buf_2[32] = {0};
|
||||||
|
char time_buf_3[32] = {0};
|
||||||
|
char time_buf_4[32] = {0};
|
||||||
|
char time_buf_5[32] = {0};
|
||||||
|
char time_buf_6[32] = {0};
|
||||||
|
|
||||||
|
int32_t time_left = get_game_time();
|
||||||
|
int32_t time_spent = initial_game_time - time_left;
|
||||||
|
int32_t true_time_spent = time_spent - (total_strikes * STRIKE_TIME_PENALTY);
|
||||||
|
write_time(time_buf_1, time_left);
|
||||||
|
write_time(time_buf_2, time_spent);
|
||||||
|
write_time(time_buf_3, true_time_spent);
|
||||||
|
|
||||||
|
sprintf(buf,
|
||||||
|
"Finished!\n\tTotal Strikes: %ld\n\tTime Left (w/ penalties): %s\n\tTime Spent (w/ penalties): %s\n\tTrue Time Spent: %s\n\n",
|
||||||
|
total_strikes, time_buf_1, time_buf_2, time_buf_3
|
||||||
|
);
|
||||||
|
lv_label_set_text(overall_results_label, buf);
|
||||||
|
|
||||||
|
lv_label_set_text(breakdown_results_label, "Step Breakdown:\n\tStep 1: \n\tStep 2:\n\tStep 3:\n\tStep 4:\n\tStep 5:\n\tStep 6:");
|
||||||
|
|
||||||
|
sprintf(buf,
|
||||||
|
"\n%ld strikes\n%ld strikes\n%ld strikes\n%ld strikes\n%ld strikes\n%ld strikes",
|
||||||
|
step_strikes[0], step_strikes[1], step_strikes[2], step_strikes[3], step_strikes[4], step_strikes[5]
|
||||||
|
);
|
||||||
|
lv_label_set_text(strike_numbers_label, buf);
|
||||||
|
|
||||||
|
write_time(time_buf_1, initial_game_time - step_finish_times[0]);
|
||||||
|
write_time(time_buf_2, step_finish_times[0] - step_finish_times[1]);
|
||||||
|
write_time(time_buf_3, step_finish_times[1] - step_finish_times[2]);
|
||||||
|
write_time(time_buf_4, step_finish_times[2] - step_finish_times[3]);
|
||||||
|
write_time(time_buf_5, step_finish_times[3] - step_finish_times[4]);
|
||||||
|
write_time(time_buf_6, step_finish_times[4] - step_finish_times[5]);
|
||||||
|
sprintf(buf,
|
||||||
|
"\n%s\n%s\n%s\n%s\n%s\n%s",
|
||||||
|
time_buf_1, time_buf_2, time_buf_3, time_buf_4, time_buf_5, time_buf_6
|
||||||
|
);
|
||||||
|
lv_label_set_text(step_times_label, buf);
|
||||||
|
|
||||||
|
old_scr = lv_scr_act();
|
||||||
|
lv_scr_load(scr);
|
||||||
|
|
||||||
|
xSemaphoreGive(xGuiSemaphore);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,14 @@
|
|||||||
|
#include "main.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "esp_rom_gpio.h"
|
#include "esp_rom_gpio.h"
|
||||||
|
#include "esp_heap_caps.h"
|
||||||
|
|
||||||
#include "drivers/all.h"
|
#include "drivers/all.h"
|
||||||
|
#include "drivers/state_tracking.h"
|
||||||
|
|
||||||
#include "helper.h"
|
#include "helper.h"
|
||||||
|
|
||||||
@ -17,34 +21,60 @@
|
|||||||
#include "steps/step6.h"
|
#include "steps/step6.h"
|
||||||
|
|
||||||
static const char *TAG = "main";
|
static const char *TAG = "main";
|
||||||
uint32_t initial_game_time = 90*60*1000;
|
uint32_t initial_game_time = 90*60*1000 + 1000;
|
||||||
uint32_t skip_to_step = 0;
|
uint32_t skip_to_step = 0;
|
||||||
|
uint32_t current_step = 0;
|
||||||
|
extern uint32_t total_strikes;
|
||||||
|
|
||||||
extern "C" void app_main(void) {
|
extern "C" void app_main(void) {
|
||||||
printf("app_main\n");
|
printf("app_main\n");
|
||||||
|
|
||||||
init_drivers();
|
init_drivers();
|
||||||
init_tft();
|
|
||||||
init_leds();
|
// TODO: get wires out of the drivers
|
||||||
|
// TODO: generify the strike system out of wires
|
||||||
init_wires();
|
init_wires();
|
||||||
init_power_board();
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
step0();
|
step0();
|
||||||
set_game_time(initial_game_time + 1000);
|
|
||||||
|
// set_recording_source(stdout, false);
|
||||||
|
FILE* record_file = fopen(MOUNT_POINT "/record.txt", "w");
|
||||||
|
if (record_file == nullptr) {
|
||||||
|
ESP_LOGE("main", "failed to open record.txt");
|
||||||
|
}
|
||||||
|
set_recording_source(record_file, true);
|
||||||
|
start_recording();
|
||||||
|
|
||||||
|
set_game_time(initial_game_time);
|
||||||
start_game_timer();
|
start_game_timer();
|
||||||
|
total_strikes = 0;
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
|
current_step = 1;
|
||||||
if (skip_to_step <= 1) step1();
|
if (skip_to_step <= 1) step1();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
|
current_step = 2;
|
||||||
if (skip_to_step <= 2) step2();
|
if (skip_to_step <= 2) step2();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
|
current_step = 3;
|
||||||
if (skip_to_step <= 3) step3();
|
if (skip_to_step <= 3) step3();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
|
current_step = 4;
|
||||||
if (skip_to_step <= 4) step4();
|
if (skip_to_step <= 4) step4();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
|
current_step = 5;
|
||||||
if (skip_to_step <= 5) step5();
|
if (skip_to_step <= 5) step5();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
|
current_step = 6;
|
||||||
if (skip_to_step <= 6) step6();
|
if (skip_to_step <= 6) step6();
|
||||||
|
start_game_timer();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
|
|
||||||
stop_game_timer();
|
stop_game_timer();
|
||||||
@ -52,5 +82,6 @@ extern "C" void app_main(void) {
|
|||||||
play_clip_wav(MOUNT_POINT "/diffuse.wav", true, false, 3, 0);
|
play_clip_wav(MOUNT_POINT "/diffuse.wav", true, false, 3, 0);
|
||||||
|
|
||||||
display_game_results();
|
display_game_results();
|
||||||
}
|
stop_recording();
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
8
main/main.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef MAIN_H
|
||||||
|
#define MAIN_H
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
constexpr size_t N_STEPS = 6;
|
||||||
|
|
||||||
|
#endif /* MAIN_H */
|
||||||
@ -10,4 +10,6 @@ set(SOURCES
|
|||||||
"wires_puzzle.cpp"
|
"wires_puzzle.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_subdirectory(tetris_resources)
|
||||||
|
|
||||||
target_sources(${COMPONENT_LIB} PRIVATE ${SOURCES})
|
target_sources(${COMPONENT_LIB} PRIVATE ${SOURCES})
|
||||||
|
|||||||
@ -30,7 +30,7 @@ void setup_wires(void) {
|
|||||||
clear_all_pressed_released();
|
clear_all_pressed_released();
|
||||||
get_cut_wires();
|
get_cut_wires();
|
||||||
lcd_clear();
|
lcd_clear();
|
||||||
lcd_set_cursor_vis(false);
|
lcd_set_cursor_vis(true);
|
||||||
|
|
||||||
WireColor wires[NUM_WIRES];
|
WireColor wires[NUM_WIRES];
|
||||||
load_wires_from_sd_card(wires);
|
load_wires_from_sd_card(wires);
|
||||||
|
|||||||
@ -1,26 +1,28 @@
|
|||||||
#include "step0.h"
|
#include "step0.h"
|
||||||
|
#include "drivers/state_tracking.h"
|
||||||
|
|
||||||
static const char* TAG = "step0";
|
static const char* TAG = "step0";
|
||||||
|
|
||||||
extern uint32_t initial_game_time;
|
extern uint32_t initial_game_time;
|
||||||
extern uint32_t skip_to_step;
|
extern uint32_t skip_to_step;
|
||||||
|
|
||||||
static void set_game_time(void);
|
static void set_game_time();
|
||||||
static void skip_to_step1(void) { skip_to_step = 1; }
|
static void skip_to_step1() { skip_to_step = 1; }
|
||||||
static void skip_to_step2(void) { skip_to_step = 2; }
|
static void skip_to_step2() { skip_to_step = 2; }
|
||||||
static void skip_to_step3(void) { skip_to_step = 3; }
|
static void skip_to_step3() { skip_to_step = 3; }
|
||||||
static void skip_to_step4(void) { skip_to_step = 4; }
|
static void skip_to_step4() { skip_to_step = 4; }
|
||||||
static void skip_to_step5(void) { skip_to_step = 5; }
|
static void skip_to_step5() { skip_to_step = 5; }
|
||||||
static void skip_to_step6(void) { skip_to_step = 6; }
|
static void skip_to_step6() { skip_to_step = 6; }
|
||||||
static void try_step1(void) { clean_bomb(); step1(); }
|
static void try_step1() { clean_bomb(); step1(); }
|
||||||
static void try_step2(void) { clean_bomb(); step2(); }
|
static void try_step2() { clean_bomb(); step2(); }
|
||||||
static void try_step3(void) { clean_bomb(); step3(); }
|
static void try_step3() { clean_bomb(); step3(); }
|
||||||
static void try_step4(void) { clean_bomb(); step4(); }
|
static void try_step4() { clean_bomb(); step4(); }
|
||||||
static void try_step5(void) { clean_bomb(); step5(); }
|
static void try_step5() { clean_bomb(); step5(); }
|
||||||
static void try_step6(void) { clean_bomb(); step6(); }
|
static void try_step6() { clean_bomb(); step6(); }
|
||||||
static void issue_strike(void) { strike("Strike Issued"); }
|
static void issue_strike() { strike("Strike Issued"); }
|
||||||
static void debug_switches(void);
|
static void flashbang();
|
||||||
static void battery_stats(void) {
|
static void debug_switches();
|
||||||
|
static void battery_stats() {
|
||||||
BaseType_t xReturned;
|
BaseType_t xReturned;
|
||||||
TaskHandle_t xHandle = NULL;
|
TaskHandle_t xHandle = NULL;
|
||||||
xReturned = xTaskCreate(bat_monitor_task, "bat_monitor", 4096, NULL, 5, &xHandle);
|
xReturned = xTaskCreate(bat_monitor_task, "bat_monitor", 4096, NULL, 5, &xHandle);
|
||||||
@ -33,14 +35,25 @@ static void battery_stats(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: remove. This is temperary
|
||||||
|
static void replay_last() {
|
||||||
|
FILE* record_file = fopen(MOUNT_POINT "/record.txt", "r");
|
||||||
|
if (record_file == nullptr) {
|
||||||
|
ESP_LOGE("main", "failed to open record.txt");
|
||||||
|
}
|
||||||
|
set_playback_source(record_file, true);
|
||||||
|
start_playback();
|
||||||
|
}
|
||||||
|
|
||||||
/// Wait for "*9819"
|
/// Wait for "*9819"
|
||||||
void step0(void) {
|
void step0() {
|
||||||
led_strip_set_pixel(leds, Led::speaker, 0, 0, 20);
|
led_set(IndicatorLED::LED_SPEAKER, LEDColor::LED_COLOR_BLUE);
|
||||||
led_strip_refresh(leds);
|
leds_flush();
|
||||||
|
|
||||||
StarCodeHandler star_codes[] = {
|
StarCodeHandler star_codes[] = {
|
||||||
{
|
{
|
||||||
.code = "*9819",
|
.code = "*9819",
|
||||||
.display_text = "Diffusal Initiated",
|
.display_text = "Defusal Initiated",
|
||||||
.should_exit = true,
|
.should_exit = true,
|
||||||
.callback = nullptr,
|
.callback = nullptr,
|
||||||
},
|
},
|
||||||
@ -146,6 +159,18 @@ void step0(void) {
|
|||||||
.should_exit = false,
|
.should_exit = false,
|
||||||
.callback = issue_strike,
|
.callback = issue_strike,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.code = "*1112",
|
||||||
|
.display_text = "????",
|
||||||
|
.should_exit = false,
|
||||||
|
.callback = flashbang,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "*1113",
|
||||||
|
.display_text = "replay_last",
|
||||||
|
.should_exit = false,
|
||||||
|
.callback = replay_last,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
int len = sizeof(star_codes)/sizeof(StarCodeHandler);
|
int len = sizeof(star_codes)/sizeof(StarCodeHandler);
|
||||||
do_star_codes(star_codes, len);
|
do_star_codes(star_codes, len);
|
||||||
@ -163,7 +188,7 @@ static void _update_display(uint8_t* digits, uint8_t cursor_pos) {
|
|||||||
lcd_set_cursor_pos(mapped_cursor_pos, 1);
|
lcd_set_cursor_pos(mapped_cursor_pos, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_game_time(void) {
|
static void set_game_time() {
|
||||||
uint8_t hours = (initial_game_time / (1000*60*60)) % 10;
|
uint8_t hours = (initial_game_time / (1000*60*60)) % 10;
|
||||||
uint8_t minutes = (initial_game_time / (1000*60)) % 60;
|
uint8_t minutes = (initial_game_time / (1000*60)) % 60;
|
||||||
uint8_t seconds = (initial_game_time / (1000)) % 60;
|
uint8_t seconds = (initial_game_time / (1000)) % 60;
|
||||||
@ -195,8 +220,8 @@ static void set_game_time(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
led_strip_set_pixel(leds, Led::speaker, 0, 0, 20);
|
led_set(IndicatorLED::LED_SPEAKER, LEDColor::LED_COLOR_BLUE);
|
||||||
led_strip_refresh(leds);
|
leds_flush();
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
int just_pressed = -1;
|
int just_pressed = -1;
|
||||||
@ -266,7 +291,7 @@ static void print_4bin_rev(char* out_str, uint8_t n) {
|
|||||||
out_str[4] = '\0';
|
out_str[4] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
static void debug_switches(void) {
|
static void debug_switches() {
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
uint8_t switch_state = 0xFF;
|
uint8_t switch_state = 0xFF;
|
||||||
uint8_t switch_touch_state = 0xFF;
|
uint8_t switch_touch_state = 0xFF;
|
||||||
@ -346,3 +371,18 @@ static void debug_switches(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void flashbang() {
|
||||||
|
play_clip_wav(MOUNT_POINT "/flash.wav", true, false, 1, 0);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(4000));
|
||||||
|
|
||||||
|
for (int bright = 255; bright >= 0; bright -= 2) {
|
||||||
|
for (int led_idx = 0; led_idx < IndicatorLED::LED_MAX; led_idx++) {
|
||||||
|
led_set(led_idx, bright, bright, bright);
|
||||||
|
}
|
||||||
|
leds_flush();
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
}
|
||||||
|
leds_clear();
|
||||||
|
leds_flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -17,11 +17,11 @@ static const char* NUM_NAMES[] = {
|
|||||||
"four"
|
"four"
|
||||||
};
|
};
|
||||||
|
|
||||||
static uint8_t NEOPIXEL_COLORS[4][3] = {
|
static uint32_t NEOPIXEL_COLORS[4] = {
|
||||||
{0, 20, 0},
|
LEDColor::LED_COLOR_GREEN,
|
||||||
{20, 0, 0},
|
LEDColor::LED_COLOR_RED,
|
||||||
{20, 20, 0},
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
{0, 0, 20},
|
LEDColor::LED_COLOR_BLUE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::random_device my_rd;
|
static std::random_device my_rd;
|
||||||
@ -30,6 +30,7 @@ static std::uniform_int_distribution<> zero_to_one(0, 1);
|
|||||||
static std::uniform_int_distribution<> zero_to_two(0, 2);
|
static std::uniform_int_distribution<> zero_to_two(0, 2);
|
||||||
static std::uniform_int_distribution<> zero_to_three(0, 3);
|
static std::uniform_int_distribution<> zero_to_three(0, 3);
|
||||||
|
|
||||||
|
static lv_obj_t *old_scr;
|
||||||
static lv_obj_t *scr;
|
static lv_obj_t *scr;
|
||||||
static lv_obj_t *text = NULL;
|
static lv_obj_t *text = NULL;
|
||||||
|
|
||||||
@ -58,13 +59,13 @@ static int part = 0;
|
|||||||
|
|
||||||
static void init_step(void) {
|
static void init_step(void) {
|
||||||
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
||||||
scr = lv_disp_get_scr_act(NULL);
|
scr = lv_obj_create(NULL);
|
||||||
|
|
||||||
// Set the background color of the display to black.
|
// Set the background color of the display to black.
|
||||||
lv_style_init(&style_screen);
|
lv_style_init(&style_screen);
|
||||||
lv_style_set_bg_color(&style_screen, lv_color_black());
|
lv_style_set_bg_color(&style_screen, lv_color_black());
|
||||||
lv_style_set_text_font(&style_screen, &lv_font_montserrat_32);
|
lv_style_set_text_font(&style_screen, &lv_font_montserrat_32);
|
||||||
lv_obj_add_style(lv_scr_act(), &style_screen, LV_STATE_DEFAULT);
|
lv_obj_add_style(scr, &style_screen, LV_STATE_DEFAULT);
|
||||||
|
|
||||||
// rgb565
|
// rgb565
|
||||||
lv_color_t green = { .full = 0x0560 };
|
lv_color_t green = { .full = 0x0560 };
|
||||||
@ -85,15 +86,18 @@ static void init_step(void) {
|
|||||||
lv_style_set_text_color(&blue_text, blue);
|
lv_style_set_text_color(&blue_text, blue);
|
||||||
|
|
||||||
text = lv_label_create(scr);
|
text = lv_label_create(scr);
|
||||||
|
|
||||||
|
old_scr = lv_scr_act();
|
||||||
|
lv_scr_load(scr);
|
||||||
xSemaphoreGive(xGuiSemaphore);
|
xSemaphoreGive(xGuiSemaphore);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clean_up_step(void) {
|
static void clean_up_step(void) {
|
||||||
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
while (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdFALSE) vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
lv_obj_clean(scr);
|
lv_scr_load(old_scr);
|
||||||
xSemaphoreGive(xGuiSemaphore);
|
lv_obj_del(scr);
|
||||||
}
|
xSemaphoreGive(xGuiSemaphore);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void generate_switch_leds(void) {
|
static void generate_switch_leds(void) {
|
||||||
@ -114,10 +118,9 @@ static void generate_switch_leds(void) {
|
|||||||
switch_leds[3] = colors[0];
|
switch_leds[3] = colors[0];
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
uint8_t* rgb = NEOPIXEL_COLORS[switch_leds[i]];
|
led_set(IndicatorLED::LED_S1 - i, NEOPIXEL_COLORS[switch_leds[i]]);
|
||||||
led_strip_set_pixel(leds, Led::switch1 - i, rgb[0], rgb[1], rgb[2]);
|
|
||||||
}
|
}
|
||||||
led_strip_refresh(leds);
|
leds_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_text_and_color(const char* text_str, int color) {
|
static void set_text_and_color(const char* text_str, int color) {
|
||||||
@ -200,7 +203,6 @@ static void update_lcd_count(int times) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool play_part(uint32_t time) {
|
static bool play_part(uint32_t time) {
|
||||||
stop_module_timer();
|
|
||||||
set_module_time(time);
|
set_module_time(time);
|
||||||
|
|
||||||
lcd_clear();
|
lcd_clear();
|
||||||
@ -208,18 +210,18 @@ static bool play_part(uint32_t time) {
|
|||||||
switch (part) {
|
switch (part) {
|
||||||
case 0:
|
case 0:
|
||||||
lcd_print("COLOR");
|
lcd_print("COLOR");
|
||||||
led_strip_set_pixel(leds, Led::char_lcd, 20, 0, 20);
|
led_set(IndicatorLED::LED_LCD, LEDColor::LED_COLOR_PINK);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
lcd_print("NUMBER");
|
lcd_print("NUMBER");
|
||||||
led_strip_set_pixel(leds, Led::char_lcd, 0, 0, 30);
|
led_set(IndicatorLED::LED_LCD, LEDColor::LED_COLOR_BLUE);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
lcd_print("SWITCH");
|
lcd_print("SWITCH");
|
||||||
led_strip_set_pixel(leds, Led::char_lcd, 20, 20, 0);
|
led_set(IndicatorLED::LED_LCD, LEDColor::LED_COLOR_YELLOW);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
led_strip_refresh(leds);
|
leds_flush();
|
||||||
|
|
||||||
int times = 0;
|
int times = 0;
|
||||||
int correct = generate_part();
|
int correct = generate_part();
|
||||||
@ -253,21 +255,23 @@ static bool play_part(uint32_t time) {
|
|||||||
}
|
}
|
||||||
if (get_module_time() <= 0) {
|
if (get_module_time() <= 0) {
|
||||||
strike("Out of time");
|
strike("Out of time");
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(2000));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(10));
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stop_module_timer();
|
||||||
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
||||||
lv_label_set_text(text, "");
|
lv_label_set_text(text, "");
|
||||||
xSemaphoreGive(xGuiSemaphore);
|
xSemaphoreGive(xGuiSemaphore);
|
||||||
}
|
}
|
||||||
if (part == 2) {
|
if (part < 2) {
|
||||||
play_clip_wav(MOUNT_POINT "/stepdone.wav", true, false, 0, 0);
|
play_clip_wav(MOUNT_POINT "/partdone.wav", true, false, 0, 0);
|
||||||
vTaskDelay(pdMS_TO_TICKS(2000));
|
vTaskDelay(pdMS_TO_TICKS(2000));
|
||||||
} else {
|
} else {
|
||||||
play_clip_wav(MOUNT_POINT "/partdone.wav", true, false, 1, 0);
|
play_clip_wav(MOUNT_POINT "/stepdone.wav", true, false, 1, 0);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,9 +16,13 @@ static const uint8_t SSEG_MAPS[5][4] = {
|
|||||||
{0b01000111, 0b00011001, 0b01111000, 0b00111110}
|
{0b01000111, 0b00011001, 0b01111000, 0b00111110}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int INDICATOR_RED[5] = {15, 0, 0, 10, 5};
|
static const uint32_t INDICATOR_COLORS[5] = {
|
||||||
static const int INDICATOR_GREEN[5] = {0, 0, 10, 5, 7};
|
LEDColor::LED_COLOR_RED,
|
||||||
static const int INDICATOR_BLUE[5] = {0, 10, 0, 0, 5};
|
LEDColor::LED_COLOR_BLUE,
|
||||||
|
LEDColor::LED_COLOR_GREEN,
|
||||||
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
|
LEDColor::LED_COLOR_WHITE,
|
||||||
|
};
|
||||||
|
|
||||||
// random number generators
|
// random number generators
|
||||||
static std::random_device rd;
|
static std::random_device rd;
|
||||||
@ -48,8 +52,8 @@ std::map<int, int> number_map = {
|
|||||||
static void new_puzzle(void) {
|
static void new_puzzle(void) {
|
||||||
// scramble lights
|
// scramble lights
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
led_strip_set_pixel(leds, 9, INDICATOR_RED[map_dist(gen)], INDICATOR_GREEN[map_dist(gen)], INDICATOR_BLUE[map_dist(gen)]);
|
led_set(IndicatorLED::LED_SPEAKER, INDICATOR_COLORS[map_dist(gen)]);
|
||||||
led_strip_refresh(leds);
|
leds_flush();
|
||||||
|
|
||||||
uint8_t random_segments[4] = {0, 0, 0, 0};
|
uint8_t random_segments[4] = {0, 0, 0, 0};
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
@ -72,8 +76,8 @@ static void new_puzzle(void) {
|
|||||||
}
|
}
|
||||||
// ESP_LOGI(TAG, "Chosen Map: %i", chosen_map);
|
// ESP_LOGI(TAG, "Chosen Map: %i", chosen_map);
|
||||||
|
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, 9, INDICATOR_RED[chosen_map], INDICATOR_GREEN[chosen_map], INDICATOR_BLUE[chosen_map]));
|
led_set(IndicatorLED::LED_SPEAKER, INDICATOR_COLORS[chosen_map]);
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
bool bit = (answer_sseg >> i) & 1;
|
bool bit = (answer_sseg >> i) & 1;
|
||||||
@ -84,6 +88,7 @@ static void new_puzzle(void) {
|
|||||||
// ESP_LOGI(TAG, "Flipping bit %i on display %i", i, display);
|
// ESP_LOGI(TAG, "Flipping bit %i on display %i", i, display);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
set_module_sseg_raw(display_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
void step2(void) {
|
void step2(void) {
|
||||||
@ -94,7 +99,6 @@ void step2(void) {
|
|||||||
int strike_time = 0;
|
int strike_time = 0;
|
||||||
while(solved_times < NUM_SOLVES) {
|
while(solved_times < NUM_SOLVES) {
|
||||||
// for every bit in the answer-
|
// for every bit in the answer-
|
||||||
set_module_sseg_raw(display_map);
|
|
||||||
if (get_keypad_pressed(&key)) {
|
if (get_keypad_pressed(&key)) {
|
||||||
lcd_clear();
|
lcd_clear();
|
||||||
char c = char_of_keypad_key(key);
|
char c = char_of_keypad_key(key);
|
||||||
@ -102,11 +106,11 @@ void step2(void) {
|
|||||||
if (c == answer_char) {
|
if (c == answer_char) {
|
||||||
solved_times++;
|
solved_times++;
|
||||||
if (solved_times < NUM_SOLVES) {
|
if (solved_times < NUM_SOLVES) {
|
||||||
play_clip_wav(MOUNT_POINT "/stepdone.wav", true, false, 0, 0);
|
play_clip_wav(MOUNT_POINT "/partdone.wav", true, false, 0, 0);
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
new_puzzle();
|
new_puzzle();
|
||||||
} else {
|
} else {
|
||||||
play_clip_wav(MOUNT_POINT "/partdone.wav", true, false, 0, 0);
|
play_clip_wav(MOUNT_POINT "/stepdone.wav", true, false, 1, 0);
|
||||||
clear_module_sseg();
|
clear_module_sseg();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -49,14 +49,14 @@ static std::uniform_int_distribution<> lcd_rand_char_dist(0, sizeof(lcd_random_c
|
|||||||
static std::uniform_int_distribution<> has_coconut_dist(0, 2);
|
static std::uniform_int_distribution<> has_coconut_dist(0, 2);
|
||||||
static std::uniform_int_distribution<> coconut_position_dist(0, 13);
|
static std::uniform_int_distribution<> coconut_position_dist(0, 13);
|
||||||
|
|
||||||
static uint8_t NEOPIXEL_COLORS[7][3] = {
|
static uint32_t NEOPIXEL_COLORS[7] = {
|
||||||
{20, 0, 0}, // red
|
LEDColor::LED_COLOR_RED,
|
||||||
{20, 10, 0}, // orange
|
LEDColor::LED_COLOR_ORANGE,
|
||||||
{20, 20, 0}, // yellow
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
{0, 20, 0}, // green
|
LEDColor::LED_COLOR_GREEN,
|
||||||
{0, 0, 20}, // blue
|
LEDColor::LED_COLOR_BLUE,
|
||||||
{20, 0, 20}, // purple
|
LEDColor::LED_COLOR_PINK,
|
||||||
{0, 0, 0}, // off
|
LEDColor::LED_COLOR_OFF,
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool one_second();
|
static bool one_second();
|
||||||
@ -81,7 +81,8 @@ void step3(void) {
|
|||||||
while (get_button_pressed(nullptr)) vTaskDelay(pdMS_TO_TICKS(10));
|
while (get_button_pressed(nullptr)) vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
|
||||||
play_clip_wav(MOUNT_POINT "/ready.wav", true, false, 3, 0);
|
play_clip_wav(MOUNT_POINT "/ready.wav", true, false, 3, 0);
|
||||||
play_clip_wav(TONE_FILES[tone], false, false, 3, 0);
|
// The high pitched tones need to be scaled down by 3 more
|
||||||
|
play_clip_wav(TONE_FILES[tone], false, false, 2 + (tone/3) * 3, 0);
|
||||||
|
|
||||||
bool correct = false;
|
bool correct = false;
|
||||||
switch (tone % 3) {
|
switch (tone % 3) {
|
||||||
@ -99,9 +100,9 @@ void step3(void) {
|
|||||||
times++;
|
times++;
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
if (times < TIMES_TO_COMPLETE) {
|
if (times < TIMES_TO_COMPLETE) {
|
||||||
play_clip_wav(MOUNT_POINT "/part-done.wav", true, false, 3, 0);
|
play_clip_wav(MOUNT_POINT "/partdone.wav", true, false, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
play_clip_wav(MOUNT_POINT "/step-done.wav", true, false, 3, 0);
|
play_clip_wav(MOUNT_POINT "/stepdone.wav", true, false, 1, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
vTaskDelay(pdMS_TO_TICKS(1500));
|
vTaskDelay(pdMS_TO_TICKS(1500));
|
||||||
@ -138,10 +139,9 @@ static void rng_leds() {
|
|||||||
static void write_leds() {
|
static void write_leds() {
|
||||||
// update all the leds
|
// update all the leds
|
||||||
for (int i = 0; i < LED_COUNT; i++) {
|
for (int i = 0; i < LED_COUNT; i++) {
|
||||||
auto colors = NEOPIXEL_COLORS[indicator_led_idxs[i]];
|
led_set(i, NEOPIXEL_COLORS[indicator_led_idxs[i]]);
|
||||||
led_strip_set_pixel(leds, i, colors[0], colors[1], colors[2]);
|
|
||||||
}
|
}
|
||||||
led_strip_refresh(leds);
|
leds_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t four_bit_flag(bool b0, bool b1, bool b2, bool b3) {
|
static uint8_t four_bit_flag(bool b0, bool b1, bool b2, bool b3) {
|
||||||
@ -211,7 +211,7 @@ static bool one_second() {
|
|||||||
start_module_timer();
|
start_module_timer();
|
||||||
|
|
||||||
rng_leds();
|
rng_leds();
|
||||||
int speaker_color = indicator_led_idxs[Led::speaker];
|
int speaker_color = indicator_led_idxs[IndicatorLED::LED_SPEAKER];
|
||||||
int lcd_string_idx = lcd_string_dist(gen);
|
int lcd_string_idx = lcd_string_dist(gen);
|
||||||
bool was_high = (tone / 3) == 1;
|
bool was_high = (tone / 3) == 1;
|
||||||
write_leds();
|
write_leds();
|
||||||
@ -237,10 +237,10 @@ static bool one_second() {
|
|||||||
|
|
||||||
uint8_t correct_button_mask = 0b1011;
|
uint8_t correct_button_mask = 0b1011;
|
||||||
uint8_t correct_buttons = four_bit_flag(
|
uint8_t correct_buttons = four_bit_flag(
|
||||||
indicator_led_idxs[Led::char_lcd] != 6, // green
|
indicator_led_idxs[IndicatorLED::LED_LCD] != 6, // green
|
||||||
red_led_count > blue_led_count, // red
|
red_led_count > blue_led_count, // red
|
||||||
0, // yellow UNCHECKED
|
0, // yellow UNCHECKED
|
||||||
indicator_led_idxs[Led::rfid] == 4 || indicator_led_idxs[Led::rfid] == 6 // blue
|
indicator_led_idxs[IndicatorLED::LED_RFID] == 4 || indicator_led_idxs[IndicatorLED::LED_RFID] == 6 // blue
|
||||||
);
|
);
|
||||||
|
|
||||||
debug_correct_values(correct_buttons, correct_button_mask, correct_switches);
|
debug_correct_values(correct_buttons, correct_button_mask, correct_switches);
|
||||||
@ -345,7 +345,7 @@ static bool six_second() {
|
|||||||
|
|
||||||
bool was_high = (tone / 3) == 1;
|
bool was_high = (tone / 3) == 1;
|
||||||
|
|
||||||
bool second_switch_correct_state = (indicator_led_idxs[Led::switch2] == 0) || (indicator_led_idxs[Led::switch2] == 6);
|
bool second_switch_correct_state = (indicator_led_idxs[IndicatorLED::LED_S2] == 0) || (indicator_led_idxs[IndicatorLED::LED_S2] == 6);
|
||||||
second_switch_correct_state = second_switch_correct_state || was_high;
|
second_switch_correct_state = second_switch_correct_state || was_high;
|
||||||
|
|
||||||
rng_leds();
|
rng_leds();
|
||||||
@ -361,10 +361,10 @@ static bool six_second() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int purple_led_on_bottom_count = 0;
|
int pink_led_on_bottom_count = 0;
|
||||||
for (int i = Led::rfid; i < LED_COUNT; i++) {
|
for (int i = IndicatorLED::LED_RFID; i < LED_COUNT; i++) {
|
||||||
if (indicator_led_idxs[i] == 5) {
|
if (indicator_led_idxs[i] == 5) {
|
||||||
purple_led_on_bottom_count++;
|
pink_led_on_bottom_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -372,12 +372,12 @@ static bool six_second() {
|
|||||||
vowels > 7,
|
vowels > 7,
|
||||||
second_switch_correct_state,
|
second_switch_correct_state,
|
||||||
true,
|
true,
|
||||||
!(purple_led_on_bottom_count > 1)
|
!(pink_led_on_bottom_count > 1)
|
||||||
);
|
);
|
||||||
|
|
||||||
uint8_t correct_button_mask = 0b1101;
|
uint8_t correct_button_mask = 0b1101;
|
||||||
uint8_t correct_buttons = four_bit_flag(
|
uint8_t correct_buttons = four_bit_flag(
|
||||||
(!was_high) || (green_led_count >= 2) || indicator_led_idxs[Led::keypad] == 4, // green
|
(!was_high) || (green_led_count >= 2) || indicator_led_idxs[IndicatorLED::LED_KEYPAD] == 4, // green
|
||||||
0, // red UNCHECKED
|
0, // red UNCHECKED
|
||||||
blue_led_count >= 3, // yellow
|
blue_led_count >= 3, // yellow
|
||||||
contains_coconut // blue
|
contains_coconut // blue
|
||||||
|
|||||||
@ -3,29 +3,55 @@
|
|||||||
__attribute__((unused))
|
__attribute__((unused))
|
||||||
static const char *TAG = "step4";
|
static const char *TAG = "step4";
|
||||||
|
|
||||||
|
static lv_obj_t *old_scr;
|
||||||
|
static lv_obj_t* scr;
|
||||||
static lv_obj_t* img;
|
static lv_obj_t* img;
|
||||||
|
|
||||||
static bool invisible_blocks = false;
|
|
||||||
static bool text_output = false;
|
|
||||||
|
|
||||||
static const int height = 22;
|
static const int height = 22;
|
||||||
static const int width = 10;
|
static const int width = 10;
|
||||||
|
|
||||||
static int board[height][width] = {0};
|
static int board[height][width] = {0};
|
||||||
// static lv_obj_t* visual_board[height][width] = {0};
|
static lv_obj_t* visual_board[height][width] = {0};
|
||||||
|
|
||||||
static lv_obj_t* line_clear_img;
|
static lv_obj_t* line_clear_img;
|
||||||
static lv_style_t game_over_style;
|
static lv_style_t game_over_style;
|
||||||
static lv_obj_t* game_over_label;
|
static lv_obj_t* game_over_label;
|
||||||
|
|
||||||
static const void* LINE_CLEAR_SRC = (void*)"A:" MOUNT_POINT "/clear.bin";
|
|
||||||
static const void* BACKGROUND_SRC = (void*)"A:" MOUNT_POINT "/bg.bin";
|
|
||||||
// LV_IMG_DECLARE(background);
|
|
||||||
// static const void* BACKGROUND_SRC = (void*)&background;
|
|
||||||
|
|
||||||
#define MUSIC_FILE MOUNT_POINT "/piano.wav"
|
#define MUSIC_FILE MOUNT_POINT "/piano.wav"
|
||||||
|
|
||||||
static const char* PIECE_IMG_SRC[] = {
|
#ifdef TETRIS_USE_FLASH_BG_IMG
|
||||||
|
LV_IMG_DECLARE(bg);
|
||||||
|
static const void* BACKGROUND_SRC = (void*) &bg;
|
||||||
|
#else
|
||||||
|
static const void* BACKGROUND_SRC = (void*)"A:" MOUNT_POINT "/bg.bin";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TETRIS_USE_FLASH_IMG
|
||||||
|
LV_IMG_DECLARE(clear);
|
||||||
|
LV_IMG_DECLARE(db);
|
||||||
|
LV_IMG_DECLARE(green);
|
||||||
|
LV_IMG_DECLARE(lb);
|
||||||
|
LV_IMG_DECLARE(orange);
|
||||||
|
LV_IMG_DECLARE(purple);
|
||||||
|
LV_IMG_DECLARE(red);
|
||||||
|
LV_IMG_DECLARE(yellow);
|
||||||
|
|
||||||
|
static const void* LINE_CLEAR_SRC = (void*) &clear;
|
||||||
|
|
||||||
|
static const void* PIECE_IMG_SRC[] = {
|
||||||
|
NULL,
|
||||||
|
&lb,
|
||||||
|
&db,
|
||||||
|
&orange,
|
||||||
|
&yellow,
|
||||||
|
&green,
|
||||||
|
&purple,
|
||||||
|
&red,
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
static const void* LINE_CLEAR_SRC = (void*)"A:" MOUNT_POINT "/clear.bin";
|
||||||
|
|
||||||
|
static const void* PIECE_IMG_SRC[] = {
|
||||||
NULL,
|
NULL,
|
||||||
"A:" MOUNT_POINT "/lb.bin",
|
"A:" MOUNT_POINT "/lb.bin",
|
||||||
"A:" MOUNT_POINT "/db.bin",
|
"A:" MOUNT_POINT "/db.bin",
|
||||||
@ -35,6 +61,7 @@ static const char* PIECE_IMG_SRC[] = {
|
|||||||
"A:" MOUNT_POINT "/purple.bin",
|
"A:" MOUNT_POINT "/purple.bin",
|
||||||
"A:" MOUNT_POINT "/red.bin",
|
"A:" MOUNT_POINT "/red.bin",
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool game = true;
|
static bool game = true;
|
||||||
|
|
||||||
@ -53,27 +80,27 @@ static int piece_nodes[4][2] = {
|
|||||||
|
|
||||||
lv_obj_t* piece_imgs[4] = {};
|
lv_obj_t* piece_imgs[4] = {};
|
||||||
|
|
||||||
TaskHandle_t music_handle;
|
static bool music_playing;
|
||||||
|
|
||||||
static std::random_device rd;
|
static std::random_device rd;
|
||||||
static std::mt19937 gen(rd());
|
static std::mt19937 gen(rd());
|
||||||
static std::uniform_int_distribution<> piece_dist(2, 7);
|
static std::uniform_int_distribution<> piece_dist(2, 7);
|
||||||
|
|
||||||
static void generate_block(void);
|
static void generate_block();
|
||||||
static void show_board(void);
|
static void show_board();
|
||||||
static void get_node_locations(void);
|
static void get_node_locations();
|
||||||
static bool check_overlap(void);
|
static bool check_overlap();
|
||||||
|
|
||||||
static void line_clear(int hi);
|
static void line_clear(int hi);
|
||||||
static void check_line_clears(void);
|
static void check_line_clears();
|
||||||
static void place_piece(void);
|
static void place_piece();
|
||||||
|
|
||||||
static void move_left(void);
|
static void move_left();
|
||||||
static void move_right(void);
|
static void move_right();
|
||||||
static void drop(void);
|
static void drop();
|
||||||
static void rotate_block(void);
|
static void rotate_block();
|
||||||
static void update_score(void);
|
static void update_score();
|
||||||
static void clear_board(void);
|
static void clear_board();
|
||||||
|
|
||||||
|
|
||||||
static int bbcc(int i) { // [0,1,2,3] -> [ 0, 0,+1,+1]
|
static int bbcc(int i) { // [0,1,2,3] -> [ 0, 0,+1,+1]
|
||||||
@ -125,12 +152,13 @@ static int bdca(int i) { // [0,1,2,3] -> [ 0,+2,+1,-1]
|
|||||||
|
|
||||||
static void init_screen() {
|
static void init_screen() {
|
||||||
while (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdFALSE) vTaskDelay(pdMS_TO_TICKS(10));
|
while (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdFALSE) vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
scr = lv_obj_create(NULL);
|
||||||
img = lv_img_create(lv_scr_act());
|
|
||||||
|
img = lv_img_create(scr);
|
||||||
lv_img_set_src(img, BACKGROUND_SRC);
|
lv_img_set_src(img, BACKGROUND_SRC);
|
||||||
lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);
|
lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);
|
||||||
|
|
||||||
line_clear_img = lv_img_create(lv_scr_act());
|
line_clear_img = lv_img_create(scr);
|
||||||
lv_obj_add_flag(line_clear_img, LV_OBJ_FLAG_HIDDEN);
|
lv_obj_add_flag(line_clear_img, LV_OBJ_FLAG_HIDDEN);
|
||||||
lv_img_set_src(line_clear_img, LINE_CLEAR_SRC);
|
lv_img_set_src(line_clear_img, LINE_CLEAR_SRC);
|
||||||
lv_obj_align(line_clear_img, LV_ALIGN_BOTTOM_LEFT, 159, -(height*16));
|
lv_obj_align(line_clear_img, LV_ALIGN_BOTTOM_LEFT, 159, -(height*16));
|
||||||
@ -141,37 +169,63 @@ static void init_screen() {
|
|||||||
lv_style_set_bg_opa(&game_over_style, LV_OPA_100);
|
lv_style_set_bg_opa(&game_over_style, LV_OPA_100);
|
||||||
lv_style_set_text_align(&game_over_style, LV_TEXT_ALIGN_CENTER);
|
lv_style_set_text_align(&game_over_style, LV_TEXT_ALIGN_CENTER);
|
||||||
|
|
||||||
game_over_label = lv_label_create(lv_scr_act());
|
game_over_label = lv_label_create(scr);
|
||||||
lv_obj_add_flag(game_over_label, LV_OBJ_FLAG_HIDDEN);
|
lv_obj_add_flag(game_over_label, LV_OBJ_FLAG_HIDDEN);
|
||||||
lv_obj_align(game_over_label, LV_ALIGN_CENTER, 0, 0);
|
lv_obj_align(game_over_label, LV_ALIGN_LEFT_MID, 0, 0);
|
||||||
|
lv_obj_set_width(game_over_label, 160);
|
||||||
lv_obj_add_style(game_over_label, &game_over_style, LV_STATE_DEFAULT);
|
lv_obj_add_style(game_over_label, &game_over_style, LV_STATE_DEFAULT);
|
||||||
|
|
||||||
// for (int h = 0; h < height; h++) {
|
for (int h = 0; h < height; h++) {
|
||||||
// for (int w = 0; w < width; w++) {
|
for (int w = 0; w < width; w++) {
|
||||||
// visual_board[h][w] = lv_img_create(lv_scr_act());
|
visual_board[h][w] = lv_img_create(scr);
|
||||||
// lv_obj_align(visual_board[h][w], LV_ALIGN_BOTTOM_LEFT, 159 + w*16, -(h*16));
|
lv_obj_align(visual_board[h][w], LV_ALIGN_BOTTOM_LEFT, 159 + w*16, -(h*16));
|
||||||
// lv_img_set_src(visual_board[h][w], PIECE_IMG_SRC[((w+h)%7)+1]);
|
lv_obj_add_flag(visual_board[h][w], LV_OBJ_FLAG_HIDDEN);
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
piece_imgs[i] = lv_img_create(lv_scr_act());
|
piece_imgs[i] = lv_img_create(scr);
|
||||||
lv_obj_align(piece_imgs[i], LV_ALIGN_BOTTOM_LEFT, 159, -320);
|
lv_obj_align(piece_imgs[i], LV_ALIGN_BOTTOM_LEFT, 159, -320);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
old_scr = lv_scr_act();
|
||||||
|
lv_scr_load(scr);
|
||||||
|
|
||||||
xSemaphoreGive(xGuiSemaphore);
|
xSemaphoreGive(xGuiSemaphore);
|
||||||
|
|
||||||
play_clip_wav(MUSIC_FILE, true, true, 4, 0);
|
play_clip_wav(MUSIC_FILE, true, true, 4, 0);
|
||||||
|
music_playing = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void deinit_screen() {
|
static void deinit_screen() {
|
||||||
while (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdFALSE) vTaskDelay(pdMS_TO_TICKS(10));
|
while (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdFALSE) vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_scr_load(old_scr);
|
||||||
|
lv_obj_del(scr);
|
||||||
xSemaphoreGive(xGuiSemaphore);
|
xSemaphoreGive(xGuiSemaphore);
|
||||||
|
|
||||||
if (!stop_clip(MUSIC_FILE, pdMS_TO_TICKS(1000))) {
|
if (!stop_clip(MUSIC_FILE, pdMS_TO_TICKS(1000))) {
|
||||||
ESP_LOGW(TAG, "Can't stop, addicted to the shindig.");
|
ESP_LOGW(TAG, "Can't stop, addicted to the shindig.");
|
||||||
}
|
}
|
||||||
|
music_playing = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void reveal_board() {
|
||||||
|
for (int h = 0; h < height; h++) {
|
||||||
|
for (int w = 0; w < width; w++) {
|
||||||
|
if (PIECE_IMG_SRC[board[h][w]]) {
|
||||||
|
lv_img_set_src(visual_board[h][w], PIECE_IMG_SRC[board[h][w]]);
|
||||||
|
lv_obj_clear_flag(visual_board[h][w], LV_OBJ_FLAG_HIDDEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static void hide_board() {
|
||||||
|
for (int h = 0; h < height; h++) {
|
||||||
|
for (int w = 0; w < width; w++) {
|
||||||
|
lv_obj_add_flag(visual_board[h][w], LV_OBJ_FLAG_HIDDEN);
|
||||||
|
lv_img_set_src(visual_board[h][w], NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool play_game(int time, int required_score) {
|
bool play_game(int time, int required_score) {
|
||||||
@ -228,6 +282,20 @@ bool play_game(int time, int required_score) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Toggle music with switch4
|
||||||
|
SwitchKey switch_;
|
||||||
|
while (get_switch_flipped(&switch_)) {
|
||||||
|
if (switch_ == SwitchKey::s4) {
|
||||||
|
if (music_playing) {
|
||||||
|
stop_clip(MUSIC_FILE, 0);
|
||||||
|
music_playing = false;
|
||||||
|
} else {
|
||||||
|
play_clip_wav(MUSIC_FILE, true, true, 4, 0);
|
||||||
|
music_playing = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (down_held != 0) {
|
if (down_held != 0) {
|
||||||
// check repeat
|
// check repeat
|
||||||
TickType_t now = xTaskGetTickCount();
|
TickType_t now = xTaskGetTickCount();
|
||||||
@ -270,8 +338,9 @@ bool play_game(int time, int required_score) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void complete(void) {
|
static void complete() {
|
||||||
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
||||||
|
reveal_board();
|
||||||
lv_label_set_text(game_over_label, "Winner!\nPress any button to continue");
|
lv_label_set_text(game_over_label, "Winner!\nPress any button to continue");
|
||||||
lv_obj_clear_flag(game_over_label, LV_OBJ_FLAG_HIDDEN);
|
lv_obj_clear_flag(game_over_label, LV_OBJ_FLAG_HIDDEN);
|
||||||
xSemaphoreGive(xGuiSemaphore);
|
xSemaphoreGive(xGuiSemaphore);
|
||||||
@ -284,17 +353,20 @@ static void complete(void) {
|
|||||||
}
|
}
|
||||||
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
||||||
lv_obj_add_flag(game_over_label, LV_OBJ_FLAG_HIDDEN);
|
lv_obj_add_flag(game_over_label, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
hide_board();
|
||||||
xSemaphoreGive(xGuiSemaphore);
|
xSemaphoreGive(xGuiSemaphore);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fail(void) {
|
static void fail() {
|
||||||
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
||||||
lv_label_set_text(game_over_label, "Game Over\nPress any button to continue");
|
lv_label_set_text(game_over_label, "Game Over\nPress any button to continue");
|
||||||
lv_obj_clear_flag(game_over_label, LV_OBJ_FLAG_HIDDEN);
|
lv_obj_clear_flag(game_over_label, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
|
||||||
|
reveal_board();
|
||||||
xSemaphoreGive(xGuiSemaphore);
|
xSemaphoreGive(xGuiSemaphore);
|
||||||
}
|
}
|
||||||
vTaskDelay(pdMS_TO_TICKS(500));
|
vTaskDelay(pdMS_TO_TICKS(2000));
|
||||||
while (get_button_pressed(nullptr));
|
while (get_button_pressed(nullptr));
|
||||||
while (1) {
|
while (1) {
|
||||||
if (get_button_pressed(nullptr)) break;
|
if (get_button_pressed(nullptr)) break;
|
||||||
@ -302,11 +374,12 @@ static void fail(void) {
|
|||||||
}
|
}
|
||||||
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
||||||
lv_obj_add_flag(game_over_label, LV_OBJ_FLAG_HIDDEN);
|
lv_obj_add_flag(game_over_label, LV_OBJ_FLAG_HIDDEN);
|
||||||
|
hide_board();
|
||||||
xSemaphoreGive(xGuiSemaphore);
|
xSemaphoreGive(xGuiSemaphore);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void step4(void) {
|
void step4() {
|
||||||
StarCodeHandler star_code = {
|
StarCodeHandler star_code = {
|
||||||
.code = "*3850",
|
.code = "*3850",
|
||||||
.display_text = "Starting...",
|
.display_text = "Starting...",
|
||||||
@ -317,17 +390,19 @@ void step4(void) {
|
|||||||
init_screen();
|
init_screen();
|
||||||
|
|
||||||
while (!play_game(4*60*1000, 2)) fail();
|
while (!play_game(4*60*1000, 2)) fail();
|
||||||
|
play_clip_wav(MOUNT_POINT "/partdone.wav", true, false, 0, 0);
|
||||||
complete();
|
complete();
|
||||||
while (!play_game(4*60*1000, 4)) fail();
|
while (!play_game(4*60*1000, 4)) fail();
|
||||||
|
play_clip_wav(MOUNT_POINT "/partdone.wav", true, false, 0, 0);
|
||||||
complete();
|
complete();
|
||||||
while (!play_game(7*60*1000, 8)) fail();
|
while (!play_game(7*60*1000, 8)) fail();
|
||||||
|
play_clip_wav(MOUNT_POINT "/stepdone.wav", true, false, 1, 0);
|
||||||
complete();
|
complete();
|
||||||
// vTaskDelay(pdMS_TO_TICKS(3000));
|
|
||||||
|
|
||||||
deinit_screen();
|
deinit_screen();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_board(void) {
|
static void show_board() {
|
||||||
for (int h = 0; h < height; h++) {
|
for (int h = 0; h < height; h++) {
|
||||||
for (int w = 0; w < width; w++) {
|
for (int w = 0; w < width; w++) {
|
||||||
if (board[h][w] == 9) {
|
if (board[h][w] == 9) {
|
||||||
@ -341,16 +416,6 @@ static void show_board(void) {
|
|||||||
board[p[0]][p[1]] = 9;
|
board[p[0]][p[1]] = 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (text_output) {
|
|
||||||
for (int h = height-1; h >= 0; h--) {
|
|
||||||
for (int w = 0; w < width; w++) {
|
|
||||||
printf("|%c", board[h][w] == 9 ? 'X' : (invisible_blocks ? '0' : ('0' + board[h][w])));
|
|
||||||
}
|
|
||||||
printf("|\n");
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
if (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdTRUE) {
|
||||||
for (int i = 0; i < sizeof(piece_nodes)/sizeof(piece_nodes[0]); i++) {
|
for (int i = 0; i < sizeof(piece_nodes)/sizeof(piece_nodes[0]); i++) {
|
||||||
int* p = piece_nodes[i];
|
int* p = piece_nodes[i];
|
||||||
@ -361,7 +426,7 @@ static void show_board(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void generate_block(void) {
|
static void generate_block() {
|
||||||
int new_piece = piece_dist(gen);
|
int new_piece = piece_dist(gen);
|
||||||
if (new_piece == piece) {
|
if (new_piece == piece) {
|
||||||
new_piece = 1;
|
new_piece = 1;
|
||||||
@ -396,7 +461,7 @@ static void generate_block(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rotate_block(void) {
|
static void rotate_block() {
|
||||||
piece_rotation++;
|
piece_rotation++;
|
||||||
if (piece_rotation > 3) {
|
if (piece_rotation > 3) {
|
||||||
piece_rotation = 0;
|
piece_rotation = 0;
|
||||||
@ -474,7 +539,7 @@ static void rotate_block(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if nodes are outside of map or interposed onto placed nodes
|
// Check if nodes are outside of map or interposed onto placed nodes
|
||||||
static bool check_overlap(void) {
|
static bool check_overlap() {
|
||||||
for (int i = 0; i < sizeof(piece_nodes)/sizeof(piece_nodes[0]); i++) {
|
for (int i = 0; i < sizeof(piece_nodes)/sizeof(piece_nodes[0]); i++) {
|
||||||
int* p = piece_nodes[i];
|
int* p = piece_nodes[i];
|
||||||
if (p[0] < 0 || p[1] < 0 || p[1] >= width) {
|
if (p[0] < 0 || p[1] < 0 || p[1] >= width) {
|
||||||
@ -486,7 +551,7 @@ static bool check_overlap(void) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void move_left(void) {
|
static void move_left() {
|
||||||
for (int i = 0; i < sizeof(piece_nodes)/sizeof(piece_nodes[0]); i++) {
|
for (int i = 0; i < sizeof(piece_nodes)/sizeof(piece_nodes[0]); i++) {
|
||||||
int* p = piece_nodes[i];
|
int* p = piece_nodes[i];
|
||||||
if (p[1] == 0) {
|
if (p[1] == 0) {
|
||||||
@ -500,7 +565,7 @@ static void move_left(void) {
|
|||||||
get_node_locations();
|
get_node_locations();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void move_right(void) {
|
static void move_right() {
|
||||||
for (int i = 0; i < sizeof(piece_nodes)/sizeof(piece_nodes[0]); i++) {
|
for (int i = 0; i < sizeof(piece_nodes)/sizeof(piece_nodes[0]); i++) {
|
||||||
int* p = piece_nodes[i];
|
int* p = piece_nodes[i];
|
||||||
if (p[1] == width-1) {
|
if (p[1] == width-1) {
|
||||||
@ -513,7 +578,7 @@ static void move_right(void) {
|
|||||||
get_node_locations();
|
get_node_locations();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void drop(void) {
|
static void drop() {
|
||||||
for (int i = 0; i < sizeof(piece_nodes)/sizeof(piece_nodes[0]); i++) {
|
for (int i = 0; i < sizeof(piece_nodes)/sizeof(piece_nodes[0]); i++) {
|
||||||
int* p = piece_nodes[i];
|
int* p = piece_nodes[i];
|
||||||
if (p[0] == 0) {
|
if (p[0] == 0) {
|
||||||
@ -533,7 +598,7 @@ static void drop(void) {
|
|||||||
get_node_locations();
|
get_node_locations();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void place_piece(void) {
|
static void place_piece() {
|
||||||
for (int h = 0; h < height; h++) {
|
for (int h = 0; h < height; h++) {
|
||||||
for (int w = 0; w < width; w++) {
|
for (int w = 0; w < width; w++) {
|
||||||
if (board[h][w] == 9) {
|
if (board[h][w] == 9) {
|
||||||
@ -622,7 +687,7 @@ static void get_node_locations() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_line_clears(void) {
|
static void check_line_clears() {
|
||||||
for (int h = height-2; h >= 0; h--) {
|
for (int h = height-2; h >= 0; h--) {
|
||||||
for (int w = 0; w < width; w++) {
|
for (int w = 0; w < width; w++) {
|
||||||
if (board[h][w] != 0 && board[h][w] != 9) {
|
if (board[h][w] != 0 && board[h][w] != 9) {
|
||||||
@ -636,7 +701,7 @@ static void check_line_clears(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_score(void) {
|
static void update_score() {
|
||||||
char buff[16] = {};
|
char buff[16] = {};
|
||||||
sprintf(buff, "%d/%d", score, target_score);
|
sprintf(buff, "%d/%d", score, target_score);
|
||||||
lcd_clear();
|
lcd_clear();
|
||||||
@ -673,7 +738,7 @@ static void line_clear(int hi) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear_board(void) {
|
void clear_board() {
|
||||||
for (int h = 0; h < height; h++) {
|
for (int h = 0; h < height; h++) {
|
||||||
for (int w = 0; w < width; w++) {
|
for (int w = 0; w < width; w++) {
|
||||||
board[h][w] = 0;
|
board[h][w] = 0;
|
||||||
|
|||||||
@ -10,13 +10,8 @@
|
|||||||
#include "../drivers/char_lcd.h"
|
#include "../drivers/char_lcd.h"
|
||||||
#include "../helper.h"
|
#include "../helper.h"
|
||||||
|
|
||||||
// TODO:
|
#define TETRIS_USE_FLASH_IMG
|
||||||
// - [ ] set up real game loop
|
#define TETRIS_USE_FLASH_BG_IMG
|
||||||
// - [ ] stop music
|
|
||||||
// - [ ] set up strike on falure
|
|
||||||
// - [ ] set up module timer
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void step4(void);
|
void step4(void);
|
||||||
|
|
||||||
|
|||||||
@ -21,23 +21,23 @@ static std::uniform_int_distribution<> puzzle_dist(0, 7);
|
|||||||
static std::uniform_int_distribution<> led_picker_dist(0, 20);
|
static std::uniform_int_distribution<> led_picker_dist(0, 20);
|
||||||
static std::uniform_int_distribution<> led_color_dist(0, 5);
|
static std::uniform_int_distribution<> led_color_dist(0, 5);
|
||||||
|
|
||||||
void set_unique_leds(std::vector<int>& input_options, const int num, const int r, const int g, const int b) {
|
void set_unique_leds(std::vector<int>& input_options, const int num, const uint32_t color) {
|
||||||
for (int i = 0; i < num; i++) {
|
for (int i = 0; i < num; i++) {
|
||||||
std::uniform_int_distribution<> led_option_dist(0, input_options.size() - 1);
|
std::uniform_int_distribution<> led_option_dist(0, input_options.size() - 1);
|
||||||
int led = led_option_dist(gen);
|
int led = led_option_dist(gen);
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, input_options[led], r, g, b));
|
led_set(input_options[led], color);
|
||||||
input_options.erase(input_options.begin() + led);
|
input_options.erase(input_options.begin() + led);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_unique_leds_random_color(std::vector<int>& input_options, const int num, const int* r, const int* g, const int* b) {
|
void set_unique_leds_random_color(std::vector<int>& input_options, const int num, const uint32_t* COLORS, size_t COLORS_len) {
|
||||||
for (int i = 0; i < num; i++) {
|
for (int i = 0; i < num; i++) {
|
||||||
std::uniform_int_distribution<> led_option_dist(0, input_options.size() - 1);
|
std::uniform_int_distribution<> led_option_dist(0, input_options.size() - 1);
|
||||||
int led = led_option_dist(gen);
|
int led = led_option_dist(gen);
|
||||||
|
|
||||||
std::uniform_int_distribution<> led_color_dist(0, sizeof(r) - 1);
|
std::uniform_int_distribution<> led_color_dist(0, COLORS_len - 1);
|
||||||
int color = led_color_dist(gen);
|
int color = led_color_dist(gen);
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, input_options[led], r[color], g[color], b[color]));
|
led_set(input_options[led], COLORS[color]);
|
||||||
input_options.erase(input_options.begin() + led);
|
input_options.erase(input_options.begin() + led);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -196,9 +196,14 @@ void step5(void) {
|
|||||||
all_leds.push_back(i);
|
all_leds.push_back(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
const int INDICATOR_RED[6] = {20, 0, 0, 10, 10, 5};
|
const uint32_t COLORS[] = {
|
||||||
const int INDICATOR_GREEN[6] = {0, 0, 10, 5, 0, 7};
|
LEDColor::LED_COLOR_RED,
|
||||||
const int INDICATOR_BLUE[6] = {0, 10, 0, 0, 5, 5};
|
LEDColor::LED_COLOR_BLUE,
|
||||||
|
LEDColor::LED_COLOR_GREEN,
|
||||||
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
|
LEDColor::LED_COLOR_PINK,
|
||||||
|
LEDColor::LED_COLOR_WHITE,
|
||||||
|
};
|
||||||
static std::uniform_int_distribution<> led_number_dist(0, 21);
|
static std::uniform_int_distribution<> led_number_dist(0, 21);
|
||||||
|
|
||||||
int last_cycle_tick = xTaskGetTickCount();
|
int last_cycle_tick = xTaskGetTickCount();
|
||||||
@ -207,8 +212,8 @@ void step5(void) {
|
|||||||
if ((xTaskGetTickCount() - last_cycle_tick) > pdMS_TO_TICKS(100)) {
|
if ((xTaskGetTickCount() - last_cycle_tick) > pdMS_TO_TICKS(100)) {
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
std::vector<int> led_options = all_leds;
|
std::vector<int> led_options = all_leds;
|
||||||
set_unique_leds_random_color(led_options, led_number_dist(gen), INDICATOR_RED, INDICATOR_GREEN, INDICATOR_BLUE);
|
set_unique_leds_random_color(led_options, led_number_dist(gen), COLORS, sizeof(COLORS)/sizeof(COLORS[0]));
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
last_cycle_tick = xTaskGetTickCount();
|
last_cycle_tick = xTaskGetTickCount();
|
||||||
scrambled_times++;
|
scrambled_times++;
|
||||||
}
|
}
|
||||||
@ -234,16 +239,18 @@ void step5(void) {
|
|||||||
// set green
|
// set green
|
||||||
std::uniform_int_distribution<> green_indicators_dist(1, 15);
|
std::uniform_int_distribution<> green_indicators_dist(1, 15);
|
||||||
uint8_t green_indicators = green_indicators_dist(gen);
|
uint8_t green_indicators = green_indicators_dist(gen);
|
||||||
set_unique_leds(indicator_options, green_indicators, 0, 10, 0);
|
set_unique_leds(indicator_options, green_indicators, LEDColor::LED_COLOR_GREEN);
|
||||||
|
|
||||||
// set non-green
|
// set non-green
|
||||||
const int NON_GREEN_INDICATOR_RED[3] = {20, 0, 10};
|
const uint32_t NON_GREEN_COLORS[] = {
|
||||||
const int NON_GREEN_INDICATOR_GREEN[3] = {0, 0, 0};
|
LEDColor::LED_COLOR_RED,
|
||||||
const int NON_GREEN_INDICATOR_BLUE[3] = {0, 10, 5};
|
LEDColor::LED_COLOR_BLUE,
|
||||||
|
LEDColor::LED_COLOR_PINK,
|
||||||
|
};
|
||||||
std::uniform_int_distribution<> non_green_indicators_dist(0, (20 - green_indicators));
|
std::uniform_int_distribution<> non_green_indicators_dist(0, (20 - green_indicators));
|
||||||
set_unique_leds_random_color(indicator_options, non_green_indicators_dist(gen), NON_GREEN_INDICATOR_RED, NON_GREEN_INDICATOR_GREEN, NON_GREEN_INDICATOR_BLUE);
|
set_unique_leds_random_color(indicator_options, non_green_indicators_dist(gen), NON_GREEN_COLORS, sizeof(NON_GREEN_COLORS)/sizeof(NON_GREEN_COLORS[0]));
|
||||||
|
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
|
|
||||||
// wait for submit
|
// wait for submit
|
||||||
KeypadKey key;
|
KeypadKey key;
|
||||||
@ -266,12 +273,9 @@ void step5(void) {
|
|||||||
uint8_t indicators_num = on_indicators_dist(gen);
|
uint8_t indicators_num = on_indicators_dist(gen);
|
||||||
|
|
||||||
std::vector<int> indicator_options = all_leds;
|
std::vector<int> indicator_options = all_leds;
|
||||||
const int INDICATOR_RED[6] = {20, 0, 0, 10, 10, 5};
|
|
||||||
const int INDICATOR_GREEN[6] = {0, 0, 10, 5, 0, 7};
|
|
||||||
const int INDICATOR_BLUE[6] = {0, 10, 0, 0, 5, 5};
|
|
||||||
|
|
||||||
set_unique_leds_random_color(indicator_options, indicators_num, INDICATOR_RED, INDICATOR_BLUE, INDICATOR_GREEN);
|
set_unique_leds_random_color(indicator_options, indicators_num, COLORS, sizeof(COLORS)/sizeof(COLORS[0]));
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
|
|
||||||
uint8_t starting_switch_state = get_switch_state();
|
uint8_t starting_switch_state = get_switch_state();
|
||||||
std::string pressed_keys;
|
std::string pressed_keys;
|
||||||
@ -315,10 +319,10 @@ void step5(void) {
|
|||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
if (lit_leds[i]) {
|
if (lit_leds[i]) {
|
||||||
int color = led_color_dist(gen);
|
int color = led_color_dist(gen);
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, idx_to_led_map[i], INDICATOR_RED[color], INDICATOR_GREEN[color], INDICATOR_BLUE[color]));
|
led_set(idx_to_led_map[i], COLORS[color]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
|
|
||||||
int green_button_pressed = 0;
|
int green_button_pressed = 0;
|
||||||
int blue_button_pressed = 0;
|
int blue_button_pressed = 0;
|
||||||
@ -379,9 +383,12 @@ void step5(void) {
|
|||||||
set_module_time(TIME_NOTHING);
|
set_module_time(TIME_NOTHING);
|
||||||
start_module_timer();
|
start_module_timer();
|
||||||
|
|
||||||
const int COLOR_RED[5] = {0, 20, 10, 0};
|
const uint32_t COLORS[] = {
|
||||||
const int COLOR_GREEN[5] = {20, 0, 10, 0};
|
LEDColor::LED_COLOR_GREEN,
|
||||||
const int COLOR_BLUE[5] = {0, 0, 0, 20};
|
LEDColor::LED_COLOR_RED,
|
||||||
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
|
LEDColor::LED_COLOR_BLUE,
|
||||||
|
};
|
||||||
|
|
||||||
static std::uniform_int_distribution<> color_dist(0, 3);
|
static std::uniform_int_distribution<> color_dist(0, 3);
|
||||||
|
|
||||||
@ -389,10 +396,10 @@ void step5(void) {
|
|||||||
int speaker_color = color_dist(gen);
|
int speaker_color = color_dist(gen);
|
||||||
int s3_color = color_dist(gen);
|
int s3_color = color_dist(gen);
|
||||||
|
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, 6, COLOR_RED[tft_color], COLOR_GREEN[tft_color], COLOR_BLUE[tft_color]));
|
led_set(IndicatorLED::LED_TFT, COLORS[tft_color]);
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, 9, COLOR_RED[speaker_color], COLOR_GREEN[speaker_color], COLOR_BLUE[speaker_color]));
|
led_set(IndicatorLED::LED_SPEAKER, COLORS[speaker_color]);
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, 14, COLOR_RED[s3_color], COLOR_GREEN[s3_color], COLOR_BLUE[s3_color]));
|
led_set(IndicatorLED::LED_S3, COLORS[s3_color]);
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
|
|
||||||
int buttons_pressed = 0;
|
int buttons_pressed = 0;
|
||||||
|
|
||||||
@ -436,30 +443,36 @@ void step5(void) {
|
|||||||
start_module_timer();
|
start_module_timer();
|
||||||
|
|
||||||
// buttons
|
// buttons
|
||||||
const int BUTTON_COLOR_RED[4] = {0, 20, 10, 0};
|
const uint32_t BUTTON_COLORS[] = {
|
||||||
const int BUTTON_COLOR_GREEN[4] = {10, 0, 5, 0};
|
LEDColor::LED_COLOR_GREEN,
|
||||||
const int BUTTON_COLOR_BLUE[4] = {0, 0, 0, 10};
|
LEDColor::LED_COLOR_RED,
|
||||||
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
|
LEDColor::LED_COLOR_BLUE,
|
||||||
|
};
|
||||||
|
|
||||||
static std::uniform_int_distribution<> button_color_dist(0, 3);
|
static std::uniform_int_distribution<> button_color_dist(0, 3);
|
||||||
int button_colors[4] = {button_color_dist(gen), button_color_dist(gen), button_color_dist(gen), button_color_dist(gen)};
|
int button_colors[4] = {button_color_dist(gen), button_color_dist(gen), button_color_dist(gen), button_color_dist(gen)};
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, (20 - i), BUTTON_COLOR_RED[button_colors[i]], BUTTON_COLOR_GREEN[button_colors[i]], BUTTON_COLOR_BLUE[button_colors[i]]));
|
led_set(IndicatorLED::LED_B1 - i, BUTTON_COLORS[button_colors[i]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// switches
|
// switches
|
||||||
const int SWITCH_COLOR_RED[3] = {20, 0, 10};
|
const uint32_t SWITCH_COLOR[] = {
|
||||||
const int SWITCH_COLOR_GREEN[3] = {0, 10, 5};
|
LEDColor::LED_COLOR_RED,
|
||||||
|
LEDColor::LED_COLOR_GREEN,
|
||||||
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
|
};
|
||||||
|
|
||||||
static std::uniform_int_distribution<> switch_color_dist(0, 2);
|
static std::uniform_int_distribution<> switch_color_dist(0, 2);
|
||||||
|
|
||||||
int switch_colors[4] = {switch_color_dist(gen), switch_color_dist(gen), switch_color_dist(gen), switch_color_dist(gen)};
|
int switch_colors[4] = {switch_color_dist(gen), switch_color_dist(gen), switch_color_dist(gen), switch_color_dist(gen)};
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, (16 - i), SWITCH_COLOR_RED[switch_colors[i]], SWITCH_COLOR_GREEN[switch_colors[i]], 0));
|
led_set(IndicatorLED::LED_S1 - i, SWITCH_COLOR[switch_colors[i]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
|
|
||||||
ButtonKey button;
|
ButtonKey button;
|
||||||
KeypadKey key;
|
KeypadKey key;
|
||||||
@ -475,11 +488,10 @@ void step5(void) {
|
|||||||
if (button_colors[i] > 3) {
|
if (button_colors[i] > 3) {
|
||||||
button_colors[i] = 0;
|
button_colors[i] = 0;
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, (20 - i), BUTTON_COLOR_RED[button_colors[i]], BUTTON_COLOR_GREEN[button_colors[i]], BUTTON_COLOR_BLUE[button_colors[i]]));
|
led_set(IndicatorLED::LED_B1 - i, BUTTON_COLORS[button_colors[i]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
}
|
}
|
||||||
if (get_module_time() <= 0 || (get_keypad_pressed(&key) && (char_of_keypad_key(key) == '#'))) {
|
if (get_module_time() <= 0 || (get_keypad_pressed(&key) && (char_of_keypad_key(key) == '#'))) {
|
||||||
solved_correctly = submit_4(button_colors, switch_colors, starting_switch_state);
|
solved_correctly = submit_4(button_colors, switch_colors, starting_switch_state);
|
||||||
@ -496,18 +508,21 @@ void step5(void) {
|
|||||||
|
|
||||||
std::uniform_int_distribution<> indicator_number_dist(0, 5);
|
std::uniform_int_distribution<> indicator_number_dist(0, 5);
|
||||||
|
|
||||||
const int INDICATOR_RED[4] = {0, 20, 10, 0};
|
const uint32_t COLORS[] = {
|
||||||
const int INDICATOR_GREEN[4] = {10, 0, 5, 0};
|
LEDColor::LED_COLOR_GREEN,
|
||||||
const int INDICATOR_BLUE[4] = {0, 0, 0, 10};
|
LEDColor::LED_COLOR_RED,
|
||||||
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
|
LEDColor::LED_COLOR_BLUE,
|
||||||
|
};
|
||||||
|
|
||||||
// green, red, yellow, blue
|
// green, red, yellow, blue
|
||||||
std::array<int, 4> indicator_numbers = {indicator_number_dist(gen), indicator_number_dist(gen), indicator_number_dist(gen), indicator_number_dist(gen)};
|
std::array<int, 4> indicator_numbers = {indicator_number_dist(gen), indicator_number_dist(gen), indicator_number_dist(gen), indicator_number_dist(gen)};
|
||||||
std::vector<int> indicator_options = all_leds;
|
std::vector<int> indicator_options = all_leds;
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
set_unique_leds(indicator_options, indicator_numbers[i], INDICATOR_RED[i], INDICATOR_GREEN[i], INDICATOR_BLUE[i]);
|
set_unique_leds(indicator_options, indicator_numbers[i], COLORS[i]);
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
|
|
||||||
std::array<int, 4> buttons_pressed = {0, 0, 0, 0};
|
std::array<int, 4> buttons_pressed = {0, 0, 0, 0};
|
||||||
ButtonKey button;
|
ButtonKey button;
|
||||||
@ -550,10 +565,14 @@ void step5(void) {
|
|||||||
std::uniform_int_distribution<> led_color_dist(0, 5);
|
std::uniform_int_distribution<> led_color_dist(0, 5);
|
||||||
std::uniform_int_distribution<> led_off_dist(-1, 3);
|
std::uniform_int_distribution<> led_off_dist(-1, 3);
|
||||||
|
|
||||||
// red, purple, blue, white, green, yellow
|
const uint32_t COLORS[] = {
|
||||||
const uint8_t COLORS_RED[6] = {20, 10, 0, 5, 0, 10};
|
LEDColor::LED_COLOR_RED,
|
||||||
const uint8_t COLORS_GREEN[6] = {0, 0, 0, 7, 10, 5};
|
LEDColor::LED_COLOR_PINK,
|
||||||
const uint8_t COLORS_BLUE[6] = {0, 10, 10, 5, 0, 0};
|
LEDColor::LED_COLOR_BLUE,
|
||||||
|
LEDColor::LED_COLOR_WHITE,
|
||||||
|
LEDColor::LED_COLOR_GREEN,
|
||||||
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
|
};
|
||||||
|
|
||||||
int button_colors[4];
|
int button_colors[4];
|
||||||
bool buttons_cycling[4];
|
bool buttons_cycling[4];
|
||||||
@ -562,14 +581,14 @@ void step5(void) {
|
|||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
if (led_off != i) {
|
if (led_off != i) {
|
||||||
button_colors[i] = led_color_dist(gen);
|
button_colors[i] = led_color_dist(gen);
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, (20 - i), COLORS_RED[button_colors[i]], COLORS_GREEN[button_colors[i]], COLORS_BLUE[button_colors[i]]));
|
led_set(IndicatorLED::LED_B1 - i, COLORS[button_colors[i]]);
|
||||||
buttons_cycling[i] = true;
|
buttons_cycling[i] = true;
|
||||||
} else {
|
} else {
|
||||||
button_colors[i] = -1;
|
button_colors[i] = -1;
|
||||||
buttons_cycling[i] = false;
|
buttons_cycling[i] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
|
|
||||||
const uint8_t CORRECT_COLORS[4] = {4, 0, 5, 2};
|
const uint8_t CORRECT_COLORS[4] = {4, 0, 5, 2};
|
||||||
TickType_t lastCycleTime = xTaskGetTickCount();
|
TickType_t lastCycleTime = xTaskGetTickCount();
|
||||||
@ -593,8 +612,8 @@ void step5(void) {
|
|||||||
break;
|
break;
|
||||||
} else if (led_turn_on_dist(gen) == 0) {
|
} else if (led_turn_on_dist(gen) == 0) {
|
||||||
button_turned_on = true;
|
button_turned_on = true;
|
||||||
led_strip_set_pixel(leds, (20 - i), COLORS_RED[CORRECT_COLORS[i]], COLORS_GREEN[CORRECT_COLORS[i]], COLORS_BLUE[CORRECT_COLORS[i]]);
|
led_set(IndicatorLED::LED_B1 - i, COLORS[CORRECT_COLORS[i]]);
|
||||||
led_strip_refresh(leds);
|
leds_flush();
|
||||||
}
|
}
|
||||||
} else if (button_colors[i] != CORRECT_COLORS[i]) {
|
} else if (button_colors[i] != CORRECT_COLORS[i]) {
|
||||||
strike("Wrong time!");
|
strike("Wrong time!");
|
||||||
@ -610,16 +629,16 @@ void step5(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((xTaskGetTickCount() - lastCycleTime) >= pdMS_TO_TICKS(500)) {
|
if ((xTaskGetTickCount() - lastCycleTime) >= pdMS_TO_TICKS(500)) {
|
||||||
for (int i = 0; i < 4; i++) {
|
for (uint32_t i = 0; i < 4; i++) {
|
||||||
if (buttons_cycling[i]) {
|
if (buttons_cycling[i]) {
|
||||||
button_colors[i]++;
|
button_colors[i]++;
|
||||||
if (button_colors[i] > 5) {
|
if (button_colors[i] > 5) {
|
||||||
button_colors[i] = 0;
|
button_colors[i] = 0;
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(led_strip_set_pixel(leds, (20 - i), COLORS_RED[button_colors[i]], COLORS_GREEN[button_colors[i]], COLORS_BLUE[button_colors[i]]));
|
led_set(IndicatorLED::LED_B1 - i, COLORS[button_colors[i]]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
|
|
||||||
lastCycleTime = xTaskGetTickCount();
|
lastCycleTime = xTaskGetTickCount();
|
||||||
}
|
}
|
||||||
@ -708,11 +727,12 @@ void step5(void) {
|
|||||||
lcd_print(1, 2, display_expression.c_str());
|
lcd_print(1, 2, display_expression.c_str());
|
||||||
|
|
||||||
// set LEDs
|
// set LEDs
|
||||||
|
const uint32_t COLORS[] = {
|
||||||
// blue, red, green, yellow
|
LEDColor::LED_COLOR_BLUE,
|
||||||
const int INDICATOR_RED[4] = {0, 20, 0, 10};
|
LEDColor::LED_COLOR_RED,
|
||||||
const int INDICATOR_GREEN[4] = {0, 0, 10, 5};
|
LEDColor::LED_COLOR_GREEN,
|
||||||
const int INDICATOR_BLUE[4] = {10, 0, 0, 0};
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
|
};
|
||||||
|
|
||||||
std::uniform_int_distribution<> add_sub_indicator_dist(1, 6);
|
std::uniform_int_distribution<> add_sub_indicator_dist(1, 6);
|
||||||
std::uniform_int_distribution<> mult_div_indicator_dist(1, 3);
|
std::uniform_int_distribution<> mult_div_indicator_dist(1, 3);
|
||||||
@ -734,10 +754,10 @@ void step5(void) {
|
|||||||
|
|
||||||
std::vector<int> led_options = all_leds;
|
std::vector<int> led_options = all_leds;
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
set_unique_leds(led_options, modifier_indicators[i], INDICATOR_RED[i], INDICATOR_GREEN[i], INDICATOR_BLUE[i]);
|
set_unique_leds(led_options, modifier_indicators[i], COLORS[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
leds_flush();
|
||||||
|
|
||||||
std::string answer_string = std::to_string(expression_answer);
|
std::string answer_string = std::to_string(expression_answer);
|
||||||
std::string entered_string = "";
|
std::string entered_string = "";
|
||||||
@ -787,10 +807,13 @@ void step5(void) {
|
|||||||
|
|
||||||
// ESP_LOGI(TAG, "Green: %i, Red: %i, Yellow: %i, Blue: %i", green_indicators, red_indicators, yellow_indicators, blue_indicators);
|
// ESP_LOGI(TAG, "Green: %i, Red: %i, Yellow: %i, Blue: %i", green_indicators, red_indicators, yellow_indicators, blue_indicators);
|
||||||
|
|
||||||
// green, red, yellow, blue, purple
|
const uint32_t COLORS[] = {
|
||||||
const int INDICATOR_RED[5] = {0, 20, 10, 0, 10};
|
LEDColor::LED_COLOR_GREEN,
|
||||||
const int INDICATOR_GREEN[5] = {10, 0, 5, 0, 0};
|
LEDColor::LED_COLOR_RED,
|
||||||
const int INDICATOR_BLUE[5] = {0, 0, 0, 10, 5};
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
|
LEDColor::LED_COLOR_BLUE,
|
||||||
|
LEDColor::LED_COLOR_PINK,
|
||||||
|
};
|
||||||
|
|
||||||
int solved_times = 0;
|
int solved_times = 0;
|
||||||
bool failed = false;
|
bool failed = false;
|
||||||
@ -799,11 +822,10 @@ void step5(void) {
|
|||||||
|
|
||||||
std::vector<int> led_options = all_leds;
|
std::vector<int> led_options = all_leds;
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
set_unique_leds(led_options, indicator_numbers[i], INDICATOR_RED[i], INDICATOR_GREEN[i], INDICATOR_BLUE[i]);
|
set_unique_leds(led_options, indicator_numbers[i], COLORS[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
leds_flush();
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
|
||||||
|
|
||||||
std::uniform_int_distribution<> answer_color_dist(0, 4);
|
std::uniform_int_distribution<> answer_color_dist(0, 4);
|
||||||
|
|
||||||
@ -812,7 +834,7 @@ void step5(void) {
|
|||||||
{1, "Red"},
|
{1, "Red"},
|
||||||
{2, "Yellow"},
|
{2, "Yellow"},
|
||||||
{3, "Blue"},
|
{3, "Blue"},
|
||||||
{4, "Purple"},
|
{4, "Pink"},
|
||||||
};
|
};
|
||||||
|
|
||||||
int answer_color = answer_color_dist(gen);
|
int answer_color = answer_color_dist(gen);
|
||||||
|
|||||||
13
main/steps/tetris_resources/CMakeLists.txt
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
set(SOURCES
|
||||||
|
"bg.c"
|
||||||
|
"clear.c"
|
||||||
|
"db.c"
|
||||||
|
"green.c"
|
||||||
|
"lb.c"
|
||||||
|
"orange.c"
|
||||||
|
"purple.c"
|
||||||
|
"red.c"
|
||||||
|
"yellow.c"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_sources(${COMPONENT_LIB} PRIVATE ${SOURCES})
|
||||||
677
main/steps/tetris_resources/bg.c
Normal file
69
main/steps/tetris_resources/clear.c
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#ifdef __has_include
|
||||||
|
#if __has_include("lvgl.h")
|
||||||
|
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#define LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
|
||||||
|
#include "lvgl.h"
|
||||||
|
#else
|
||||||
|
#include "lvgl/lvgl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_IMG_CLEAR
|
||||||
|
#define LV_ATTRIBUTE_IMG_CLEAR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_CLEAR uint8_t clear_map[] = {
|
||||||
|
0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0xdb, 0xde, 0x75, 0xad, 0xbb, 0xde,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0x5d, 0xef, 0x7d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7e, 0xf7, 0x7e, 0xf7, 0x5d, 0xef, 0xba, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0x5d, 0xef, 0x7d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7e, 0xf7, 0x7e, 0xf7, 0x5d, 0xef, 0xba, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0x5d, 0xef, 0x7d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7e, 0xf7, 0x7e, 0xf7, 0x5d, 0xef, 0xba, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0x5d, 0xef, 0x7d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7e, 0xf7, 0x7e, 0xf7, 0x5d, 0xef, 0xba, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0x5d, 0xef, 0x7d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7e, 0xf7, 0x7e, 0xf7, 0x5d, 0xef, 0xba, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0x5d, 0xef, 0x7d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7e, 0xf7, 0x7e, 0xf7, 0x5d, 0xef, 0xba, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0x5d, 0xef, 0x7d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7e, 0xf7, 0x7e, 0xf7, 0x5d, 0xef, 0xba, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0x5d, 0xef, 0x7d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7e, 0xf7, 0x7e, 0xf7, 0x5d, 0xef, 0xba, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0x5d, 0xef, 0x7d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7e, 0xf7, 0x7e, 0xf7, 0x5d, 0xef, 0xba, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xbb, 0xde, 0x5d, 0xef, 0x7d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7e, 0xf7, 0x7e, 0xf7, 0x5d, 0xef, 0xba, 0xd6, 0x75, 0xad, 0xbb, 0xde,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xb7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xb7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xb7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xb7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xb7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xb7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xb7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xb7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xb7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xb7, 0xbd, 0x75, 0xad, 0xbb, 0xde,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0xf8, 0xc5, 0x38, 0xc6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x18, 0xc6, 0xd7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0xf8, 0xc5, 0x38, 0xc6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x18, 0xc6, 0xd7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0xf8, 0xc5, 0x38, 0xc6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x18, 0xc6, 0xd7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0xf8, 0xc5, 0x38, 0xc6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x18, 0xc6, 0xd7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0xf8, 0xc5, 0x38, 0xc6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x18, 0xc6, 0xd7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0xf8, 0xc5, 0x38, 0xc6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x18, 0xc6, 0xd7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0xf8, 0xc5, 0x38, 0xc6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x18, 0xc6, 0xd7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0xf8, 0xc5, 0x38, 0xc6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x18, 0xc6, 0xd7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0xf8, 0xc5, 0x38, 0xc6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x18, 0xc6, 0xd7, 0xbd, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xb7, 0xbd, 0xf8, 0xc5, 0x38, 0xc6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x18, 0xc6, 0xd7, 0xbd, 0x75, 0xad, 0xbb, 0xde,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0xf7, 0xbd, 0x38, 0xc6, 0x79, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf7, 0xbd, 0x38, 0xc6, 0x79, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf7, 0xbd, 0x38, 0xc6, 0x79, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf7, 0xbd, 0x38, 0xc6, 0x79, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf7, 0xbd, 0x38, 0xc6, 0x79, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf7, 0xbd, 0x38, 0xc6, 0x79, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf7, 0xbd, 0x38, 0xc6, 0x79, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf7, 0xbd, 0x38, 0xc6, 0x79, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf7, 0xbd, 0x38, 0xc6, 0x79, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf7, 0xbd, 0x38, 0xc6, 0x79, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0x9a, 0xd6, 0x9a, 0xd6, 0x7a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0xf8, 0xc5, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf8, 0xc5, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf8, 0xc5, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf8, 0xc5, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf8, 0xc5, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf8, 0xc5, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf8, 0xc5, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf8, 0xc5, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf8, 0xc5, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0xf8, 0xc5, 0x59, 0xce, 0x7a, 0xd6, 0x9a, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0x9a, 0xd6, 0x59, 0xce, 0x18, 0xc6, 0x75, 0xad, 0xbb, 0xde,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0x18, 0xc6, 0x79, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x18, 0xc6, 0x79, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x18, 0xc6, 0x79, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x18, 0xc6, 0x79, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x18, 0xc6, 0x79, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x18, 0xc6, 0x79, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x18, 0xc6, 0x79, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x18, 0xc6, 0x79, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x18, 0xc6, 0x79, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x18, 0xc6, 0x79, 0xce, 0x9a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xfb, 0xde, 0xdb, 0xde, 0xbb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xbb, 0xde,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0xfc, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0xfc, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0xfc, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0xfc, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0xfc, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0xfc, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0xfc, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0xfc, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0xfc, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x7a, 0xd6, 0xbb, 0xde, 0xdb, 0xde, 0xfb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0xfc, 0xe6, 0xdb, 0xde, 0xdb, 0xde, 0x9a, 0xd6, 0x59, 0xce, 0x75, 0xad, 0xba, 0xd6,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x9a, 0xd6, 0xdb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xfb, 0xde, 0xba, 0xd6, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x9a, 0xd6, 0xdb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xfb, 0xde, 0xba, 0xd6, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x9a, 0xd6, 0xdb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xfb, 0xde, 0xba, 0xd6, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x9a, 0xd6, 0xdb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xfb, 0xde, 0xba, 0xd6, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x9a, 0xd6, 0xdb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xfb, 0xde, 0xba, 0xd6, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x9a, 0xd6, 0xdb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xfb, 0xde, 0xba, 0xd6, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x9a, 0xd6, 0xdb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xfb, 0xde, 0xba, 0xd6, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x9a, 0xd6, 0xdb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xfb, 0xde, 0xba, 0xd6, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x9a, 0xd6, 0xdb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xfb, 0xde, 0xba, 0xd6, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x39, 0xce, 0x9a, 0xd6, 0xdb, 0xde, 0xfb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x3c, 0xe7, 0x1c, 0xe7, 0xfc, 0xe6, 0xfb, 0xde, 0xba, 0xd6, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0x59, 0xce, 0x9a, 0xd6, 0xfb, 0xde, 0xfc, 0xe6, 0x3c, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfc, 0xe6, 0xbb, 0xde, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x59, 0xce, 0x9a, 0xd6, 0xfb, 0xde, 0xfc, 0xe6, 0x3c, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfc, 0xe6, 0xbb, 0xde, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x59, 0xce, 0x9a, 0xd6, 0xfb, 0xde, 0xfc, 0xe6, 0x3c, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfc, 0xe6, 0xbb, 0xde, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x59, 0xce, 0x9a, 0xd6, 0xfb, 0xde, 0xfc, 0xe6, 0x3c, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfc, 0xe6, 0xbb, 0xde, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x59, 0xce, 0x9a, 0xd6, 0xfb, 0xde, 0xfc, 0xe6, 0x3c, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfc, 0xe6, 0xbb, 0xde, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x59, 0xce, 0x9a, 0xd6, 0xfb, 0xde, 0xfc, 0xe6, 0x3c, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfc, 0xe6, 0xbb, 0xde, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x59, 0xce, 0x9a, 0xd6, 0xfb, 0xde, 0xfc, 0xe6, 0x3c, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfc, 0xe6, 0xbb, 0xde, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x59, 0xce, 0x9a, 0xd6, 0xfb, 0xde, 0xfc, 0xe6, 0x3c, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfc, 0xe6, 0xbb, 0xde, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x59, 0xce, 0x9a, 0xd6, 0xfb, 0xde, 0xfc, 0xe6, 0x3c, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfc, 0xe6, 0xbb, 0xde, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6, 0xbb, 0xde, 0x75, 0xad, 0x59, 0xce, 0x9a, 0xd6, 0xfb, 0xde, 0xfc, 0xe6, 0x3c, 0xe7, 0x3d, 0xef, 0x3d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xfc, 0xe6, 0xbb, 0xde, 0x7a, 0xd6, 0x75, 0xad, 0xba, 0xd6,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0x5d, 0xef, 0x5d, 0xef, 0x7d, 0xef, 0x5d, 0xef, 0x3c, 0xe7, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0x5d, 0xef, 0x5d, 0xef, 0x7d, 0xef, 0x5d, 0xef, 0x3c, 0xe7, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0x5d, 0xef, 0x5d, 0xef, 0x7d, 0xef, 0x5d, 0xef, 0x3c, 0xe7, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0x5d, 0xef, 0x5d, 0xef, 0x7d, 0xef, 0x5d, 0xef, 0x3c, 0xe7, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0x5d, 0xef, 0x5d, 0xef, 0x7d, 0xef, 0x5d, 0xef, 0x3c, 0xe7, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0x5d, 0xef, 0x5d, 0xef, 0x7d, 0xef, 0x5d, 0xef, 0x3c, 0xe7, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0x5d, 0xef, 0x5d, 0xef, 0x7d, 0xef, 0x5d, 0xef, 0x3c, 0xe7, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0x5d, 0xef, 0x5d, 0xef, 0x7d, 0xef, 0x5d, 0xef, 0x3c, 0xe7, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0x5d, 0xef, 0x5d, 0xef, 0x7d, 0xef, 0x5d, 0xef, 0x3c, 0xe7, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0xfc, 0xe6, 0x1c, 0xe7, 0x5d, 0xef, 0x5d, 0xef, 0x7d, 0xef, 0x5d, 0xef, 0x3c, 0xe7, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde,
|
||||||
|
0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x5d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x7d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x5d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x7d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x5d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x7d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x5d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x7d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x5d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x7d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x5d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x7d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x5d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x7d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x5d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x7d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x5d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x7d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde, 0xbb, 0xde, 0x75, 0xad, 0x79, 0xce, 0xbb, 0xde, 0x1c, 0xe7, 0x1c, 0xe7, 0x5d, 0xef, 0x7e, 0xf7, 0x9e, 0xf7, 0x7d, 0xef, 0x3d, 0xef, 0x1c, 0xe7, 0xdb, 0xde, 0x9a, 0xd6, 0x75, 0xad, 0xbb, 0xde,
|
||||||
|
0xba, 0xd6, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xba, 0xd6, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xba, 0xd6, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xba, 0xd6, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xba, 0xd6, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xba, 0xd6, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xba, 0xd6, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xba, 0xd6, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xba, 0xd6, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde, 0xba, 0xd6, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0x75, 0xad, 0xbb, 0xde,
|
||||||
|
0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xbb, 0xde, 0xba, 0xd6, 0xbb, 0xde, 0xba, 0xd6, 0x00, 0x00,
|
||||||
|
/*alpha channel*/
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const lv_img_dsc_t clear = {
|
||||||
|
.header.cf = LV_IMG_CF_RGB565A8,
|
||||||
|
.header.always_zero = 0,
|
||||||
|
.header.reserved = 0,
|
||||||
|
.header.w = 160,
|
||||||
|
.header.h = 16,
|
||||||
|
.data_size = 7680,
|
||||||
|
.data = clear_map,
|
||||||
|
};
|
||||||
69
main/steps/tetris_resources/db.c
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#ifdef __has_include
|
||||||
|
#if __has_include("lvgl.h")
|
||||||
|
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#define LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
|
||||||
|
#include "lvgl.h"
|
||||||
|
#else
|
||||||
|
#include "lvgl/lvgl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_IMG_DB
|
||||||
|
#define LV_ATTRIBUTE_IMG_DB
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_DB uint8_t db_map[] = {
|
||||||
|
0x00, 0x00, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x00, 0x00,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, 0x33, 0x54, 0x33, 0x54, 0x33, 0x54, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0x13, 0x33, 0xb5, 0x4b, 0xd5, 0x4b, 0xf6, 0x4b, 0xf7, 0x4b, 0x17, 0x4c, 0x17, 0x4c, 0x17, 0x4c, 0xf6, 0x4b, 0xf6, 0x4b, 0xb5, 0x4b, 0x13, 0x33, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0xf1, 0x01, 0xd5, 0x4b, 0xdd, 0xce, 0xbb, 0x9d, 0xb9, 0x64, 0xb9, 0x64, 0xb9, 0x64, 0xb9, 0x64, 0xb9, 0x64, 0x98, 0x64, 0xf6, 0x4b, 0xf1, 0x01, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0xf1, 0x01, 0x53, 0x02, 0x95, 0x02, 0x58, 0x54, 0x7b, 0x85, 0x1a, 0x6d, 0x1a, 0x6d, 0x1a, 0x6d, 0x79, 0x54, 0xb5, 0x02, 0x74, 0x02, 0x32, 0x02, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0x32, 0x02, 0x95, 0x02, 0xd6, 0x02, 0xf7, 0x02, 0x38, 0x03, 0x38, 0x03, 0x59, 0x03, 0x38, 0x03, 0x18, 0x03, 0xf7, 0x02, 0xb5, 0x02, 0x53, 0x02, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0x53, 0x02, 0xb5, 0x02, 0xf7, 0x02, 0x18, 0x03, 0x59, 0x03, 0x59, 0x03, 0x59, 0x03, 0x59, 0x03, 0x38, 0x03, 0x18, 0x03, 0xd6, 0x02, 0x74, 0x02, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0x74, 0x02, 0xd6, 0x02, 0x38, 0x03, 0x59, 0x03, 0x7a, 0x03, 0x9a, 0x03, 0xbb, 0x03, 0x9a, 0x03, 0x7a, 0x03, 0x59, 0x03, 0x17, 0x03, 0xb5, 0x02, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0x95, 0x02, 0xf7, 0x02, 0x59, 0x03, 0x5a, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0x9a, 0x03, 0x59, 0x03, 0x38, 0x03, 0xb6, 0x02, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0xb5, 0x02, 0x18, 0x03, 0x7a, 0x03, 0xbb, 0x03, 0xfc, 0x03, 0xfc, 0x03, 0x1d, 0x04, 0xfc, 0x03, 0xbb, 0x03, 0x9b, 0x03, 0x59, 0x03, 0xd7, 0x02, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0xb6, 0x02, 0x38, 0x03, 0x9a, 0x03, 0xbb, 0x03, 0xfc, 0x03, 0x1d, 0x04, 0x1d, 0x04, 0x1d, 0x04, 0xfc, 0x03, 0xbb, 0x03, 0x59, 0x03, 0xf7, 0x02, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0xd6, 0x02, 0x59, 0x03, 0xbb, 0x03, 0xfc, 0x03, 0x3d, 0x04, 0x5e, 0x04, 0x7e, 0x04, 0x5e, 0x04, 0x1d, 0x04, 0xfc, 0x03, 0x7a, 0x03, 0x18, 0x03, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0xd7, 0x02, 0x59, 0x03, 0xbb, 0x03, 0xfc, 0x03, 0x5e, 0x04, 0x9f, 0x04, 0xbf, 0x04, 0x7f, 0x04, 0x1d, 0x04, 0xfc, 0x03, 0x9a, 0x03, 0x18, 0x03, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x13, 0x33, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0x13, 0x33,
|
||||||
|
0x00, 0x00, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x00, 0x00,
|
||||||
|
/*alpha channel*/
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const lv_img_dsc_t db = {
|
||||||
|
.header.cf = LV_IMG_CF_RGB565A8,
|
||||||
|
.header.always_zero = 0,
|
||||||
|
.header.reserved = 0,
|
||||||
|
.header.w = 16,
|
||||||
|
.header.h = 16,
|
||||||
|
.data_size = 768,
|
||||||
|
.data = db_map,
|
||||||
|
};
|
||||||
69
main/steps/tetris_resources/green.c
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#ifdef __has_include
|
||||||
|
#if __has_include("lvgl.h")
|
||||||
|
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#define LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
|
||||||
|
#include "lvgl.h"
|
||||||
|
#else
|
||||||
|
#include "lvgl/lvgl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_IMG_GREEN
|
||||||
|
#define LV_ATTRIBUTE_IMG_GREEN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_GREEN uint8_t green_map[] = {
|
||||||
|
0x00, 0x00, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0x00, 0x00,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0xe9, 0x34, 0xe9, 0x34, 0xe9, 0x34, 0xe9, 0x34, 0x09, 0x35, 0x09, 0x35, 0x09, 0x35, 0x09, 0x35, 0xe9, 0x34, 0xe9, 0x34, 0xe9, 0x34, 0xe9, 0x34, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0xe9, 0x34, 0x2c, 0x4d, 0x6c, 0x4d, 0x8c, 0x4d, 0xac, 0x4d, 0xcc, 0x4d, 0xcc, 0x4d, 0xcc, 0x4d, 0x8c, 0x4d, 0x8c, 0x4d, 0x2c, 0x4d, 0xc9, 0x34, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0x44, 0x04, 0x6c, 0x4d, 0x7a, 0xcf, 0xb5, 0x9e, 0x4f, 0x66, 0x4f, 0x66, 0x4f, 0x66, 0x4f, 0x66, 0x2f, 0x66, 0x0f, 0x66, 0x8c, 0x4d, 0x44, 0x04, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0x44, 0x04, 0xc4, 0x04, 0x25, 0x05, 0x0e, 0x56, 0xd3, 0x86, 0x91, 0x6e, 0x91, 0x6e, 0x91, 0x6e, 0x2e, 0x56, 0x65, 0x05, 0x05, 0x05, 0x84, 0x04, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0xa4, 0x04, 0x25, 0x05, 0xa5, 0x05, 0xc6, 0x05, 0x06, 0x06, 0x26, 0x06, 0x26, 0x06, 0x06, 0x06, 0x06, 0x06, 0xc6, 0x05, 0x65, 0x05, 0xe5, 0x04, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0xc4, 0x04, 0x65, 0x05, 0xc6, 0x05, 0xe6, 0x05, 0x46, 0x06, 0x47, 0x06, 0x47, 0x06, 0x47, 0x06, 0x26, 0x06, 0x06, 0x06, 0x85, 0x05, 0x05, 0x05, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0x05, 0x05, 0xa5, 0x05, 0x06, 0x06, 0x47, 0x06, 0x87, 0x06, 0xa7, 0x06, 0xa7, 0x06, 0xa7, 0x06, 0x67, 0x06, 0x46, 0x06, 0xe6, 0x05, 0x65, 0x05, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0x45, 0x05, 0xc6, 0x05, 0x46, 0x06, 0x67, 0x06, 0xa7, 0x06, 0xc8, 0x06, 0xe8, 0x06, 0xc8, 0x06, 0x87, 0x06, 0x67, 0x06, 0x06, 0x06, 0x85, 0x05, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0x65, 0x05, 0x06, 0x06, 0x87, 0x06, 0xa7, 0x06, 0x08, 0x07, 0x08, 0x07, 0x28, 0x07, 0x28, 0x07, 0xe8, 0x06, 0xa7, 0x06, 0x46, 0x06, 0xc6, 0x05, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0x65, 0x05, 0x06, 0x06, 0xa7, 0x06, 0xc7, 0x06, 0x28, 0x07, 0x48, 0x07, 0x48, 0x07, 0x48, 0x07, 0x08, 0x07, 0xc7, 0x06, 0x47, 0x06, 0xc6, 0x05, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0xa5, 0x05, 0x46, 0x06, 0xc7, 0x06, 0x08, 0x07, 0x69, 0x07, 0x89, 0x07, 0xa9, 0x07, 0x89, 0x07, 0x28, 0x07, 0x08, 0x07, 0x87, 0x06, 0xe6, 0x05, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0xa5, 0x05, 0x47, 0x06, 0xe8, 0x06, 0x08, 0x07, 0x89, 0x07, 0xc9, 0x07, 0xea, 0x07, 0xa9, 0x07, 0x48, 0x07, 0x08, 0x07, 0x87, 0x06, 0x06, 0x06, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0xa9, 0x34, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa9, 0x34,
|
||||||
|
0x00, 0x00, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0xa9, 0x34, 0x00, 0x00,
|
||||||
|
/*alpha channel*/
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const lv_img_dsc_t green = {
|
||||||
|
.header.cf = LV_IMG_CF_RGB565A8,
|
||||||
|
.header.always_zero = 0,
|
||||||
|
.header.reserved = 0,
|
||||||
|
.header.w = 16,
|
||||||
|
.header.h = 16,
|
||||||
|
.data_size = 768,
|
||||||
|
.data = green_map,
|
||||||
|
};
|
||||||
69
main/steps/tetris_resources/lb.c
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#ifdef __has_include
|
||||||
|
#if __has_include("lvgl.h")
|
||||||
|
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#define LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
|
||||||
|
#include "lvgl.h"
|
||||||
|
#else
|
||||||
|
#include "lvgl/lvgl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_IMG_LB
|
||||||
|
#define LV_ATTRIBUTE_IMG_LB
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_LB uint8_t lb_map[] = {
|
||||||
|
0x00, 0x00, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x00, 0x00,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0x73, 0x34, 0x73, 0x34, 0x73, 0x34, 0x73, 0x34, 0x94, 0x34, 0x94, 0x34, 0x94, 0x34, 0x94, 0x34, 0x73, 0x34, 0x73, 0x34, 0x73, 0x34, 0x73, 0x34, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0x73, 0x34, 0xd5, 0x4c, 0x15, 0x4d, 0x36, 0x4d, 0x37, 0x4d, 0x57, 0x4d, 0x57, 0x4d, 0x57, 0x4d, 0x36, 0x4d, 0x16, 0x4d, 0xf5, 0x4c, 0x53, 0x34, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0xb1, 0x03, 0x15, 0x4d, 0x3d, 0xcf, 0x7b, 0x9e, 0xd9, 0x65, 0xd9, 0x65, 0xf9, 0x65, 0xf9, 0x65, 0xd9, 0x65, 0xd8, 0x65, 0x36, 0x4d, 0xb1, 0x03, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0xb1, 0x03, 0x33, 0x04, 0x95, 0x04, 0xb8, 0x55, 0x7b, 0x86, 0x3a, 0x6e, 0x3a, 0x6e, 0x3a, 0x6e, 0xd9, 0x55, 0xd5, 0x04, 0x54, 0x04, 0xf2, 0x03, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0x12, 0x04, 0x95, 0x04, 0x16, 0x05, 0x37, 0x05, 0x78, 0x05, 0x78, 0x05, 0x99, 0x05, 0x78, 0x05, 0x58, 0x05, 0x37, 0x05, 0xd5, 0x04, 0x53, 0x04, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0x33, 0x04, 0xb5, 0x04, 0x37, 0x05, 0x58, 0x05, 0x99, 0x05, 0xb9, 0x05, 0xb9, 0x05, 0xb9, 0x05, 0x78, 0x05, 0x58, 0x05, 0xf6, 0x04, 0x74, 0x04, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0x74, 0x04, 0x16, 0x05, 0x78, 0x05, 0xb9, 0x05, 0xda, 0x05, 0xfa, 0x05, 0x1b, 0x06, 0xfa, 0x05, 0xda, 0x05, 0x99, 0x05, 0x37, 0x05, 0xb5, 0x04, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0xb5, 0x04, 0x37, 0x05, 0x99, 0x05, 0xda, 0x05, 0x1b, 0x06, 0x3b, 0x06, 0x3b, 0x06, 0x3b, 0x06, 0xfa, 0x05, 0xd9, 0x05, 0x78, 0x05, 0xd6, 0x04, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0xb5, 0x04, 0x58, 0x05, 0xda, 0x05, 0x1b, 0x06, 0x5c, 0x06, 0x7c, 0x06, 0x7d, 0x06, 0x7c, 0x06, 0x3b, 0x06, 0xfb, 0x05, 0x99, 0x05, 0x17, 0x05, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0xd6, 0x04, 0x78, 0x05, 0xfa, 0x05, 0x1b, 0x06, 0x7c, 0x06, 0x9d, 0x06, 0x9d, 0x06, 0x9d, 0x06, 0x5c, 0x06, 0x1b, 0x06, 0xb9, 0x05, 0x37, 0x05, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0x16, 0x05, 0x99, 0x05, 0x1b, 0x06, 0x5c, 0x06, 0xbd, 0x06, 0xde, 0x06, 0xfe, 0x06, 0xde, 0x06, 0x9d, 0x06, 0x5c, 0x06, 0xda, 0x05, 0x58, 0x05, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0x17, 0x05, 0xb9, 0x05, 0x3b, 0x06, 0x7c, 0x06, 0xde, 0x06, 0x1f, 0x07, 0x3f, 0x07, 0x1f, 0x07, 0x9d, 0x06, 0x7c, 0x06, 0xfa, 0x05, 0x58, 0x05, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x53, 0x34, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0x53, 0x34,
|
||||||
|
0x00, 0x00, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x53, 0x34, 0x00, 0x00,
|
||||||
|
/*alpha channel*/
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const lv_img_dsc_t lb = {
|
||||||
|
.header.cf = LV_IMG_CF_RGB565A8,
|
||||||
|
.header.always_zero = 0,
|
||||||
|
.header.reserved = 0,
|
||||||
|
.header.w = 16,
|
||||||
|
.header.h = 16,
|
||||||
|
.data_size = 768,
|
||||||
|
.data = lb_map,
|
||||||
|
};
|
||||||
69
main/steps/tetris_resources/orange.c
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#ifdef __has_include
|
||||||
|
#if __has_include("lvgl.h")
|
||||||
|
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#define LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
|
||||||
|
#include "lvgl.h"
|
||||||
|
#else
|
||||||
|
#include "lvgl/lvgl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_IMG_ORANGE
|
||||||
|
#define LV_ATTRIBUTE_IMG_ORANGE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_ORANGE uint8_t orange_map[] = {
|
||||||
|
0x00, 0x00, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x00, 0x00,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0x86, 0x9b, 0x86, 0x9b, 0x86, 0x9b, 0x86, 0x9b, 0xa6, 0xa3, 0xa6, 0xa3, 0xa6, 0xa3, 0xa6, 0xa3, 0x86, 0x9b, 0x86, 0x9b, 0x86, 0x9b, 0x86, 0x9b, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0x86, 0x9b, 0x09, 0xac, 0x49, 0xac, 0x49, 0xb4, 0x69, 0xbc, 0x69, 0xbc, 0x89, 0xbc, 0x69, 0xbc, 0x49, 0xb4, 0x49, 0xb4, 0x09, 0xac, 0x86, 0x9b, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0x80, 0x8a, 0x29, 0xac, 0xf9, 0xee, 0xf3, 0xdd, 0x0c, 0xcd, 0x0c, 0xcd, 0x2c, 0xcd, 0x0c, 0xcd, 0x0c, 0xcd, 0xec, 0xc4, 0x49, 0xb4, 0x80, 0x8a, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0x80, 0x8a, 0xe0, 0x9a, 0x40, 0xab, 0xca, 0xc4, 0xd0, 0xdd, 0x6d, 0xd5, 0x6d, 0xd5, 0x6d, 0xd5, 0xea, 0xcc, 0x60, 0xab, 0x00, 0xa3, 0xc0, 0x92, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0xc0, 0x92, 0x40, 0xab, 0x80, 0xb3, 0xa0, 0xbb, 0xe0, 0xc3, 0xe0, 0xc3, 0x00, 0xcc, 0xe0, 0xc3, 0xe0, 0xc3, 0xa0, 0xbb, 0x60, 0xab, 0xe0, 0x9a, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0xe0, 0x9a, 0x40, 0xab, 0xa0, 0xbb, 0xe0, 0xc3, 0x00, 0xcc, 0x20, 0xcc, 0x20, 0xcc, 0x20, 0xcc, 0xe0, 0xc3, 0xe0, 0xc3, 0x80, 0xb3, 0x20, 0xa3, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0x20, 0xa3, 0x80, 0xb3, 0xe0, 0xc3, 0x20, 0xcc, 0x40, 0xd4, 0x60, 0xd4, 0x80, 0xdc, 0x60, 0xd4, 0x40, 0xd4, 0x20, 0xcc, 0xc0, 0xbb, 0x40, 0xab, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0x40, 0xab, 0xa0, 0xbb, 0x00, 0xcc, 0x40, 0xd4, 0x80, 0xdc, 0xa0, 0xdc, 0xa0, 0xdc, 0xa0, 0xdc, 0x60, 0xd4, 0x40, 0xcc, 0xe0, 0xc3, 0x60, 0xb3, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0x40, 0xab, 0xe0, 0xc3, 0x40, 0xd4, 0x80, 0xdc, 0xc0, 0xe4, 0xe0, 0xe4, 0xe0, 0xec, 0xe0, 0xe4, 0xa0, 0xdc, 0x80, 0xdc, 0x00, 0xcc, 0xa0, 0xbb, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0x60, 0xb3, 0xe0, 0xc3, 0x60, 0xd4, 0x80, 0xdc, 0xe0, 0xe4, 0x00, 0xed, 0x00, 0xed, 0x00, 0xed, 0xc0, 0xe4, 0x80, 0xdc, 0x20, 0xcc, 0xa0, 0xbb, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0x80, 0xb3, 0x20, 0xcc, 0x80, 0xdc, 0xc0, 0xe4, 0x20, 0xed, 0x40, 0xf5, 0x40, 0xf5, 0x40, 0xf5, 0x00, 0xed, 0xc0, 0xe4, 0x40, 0xd4, 0xc0, 0xc3, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0xa0, 0xbb, 0x20, 0xcc, 0xa0, 0xdc, 0xe0, 0xe4, 0x40, 0xf5, 0x60, 0xfd, 0x80, 0xfd, 0x60, 0xfd, 0x00, 0xed, 0xe0, 0xe4, 0x60, 0xd4, 0xe0, 0xc3, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x66, 0x9b, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x66, 0x9b,
|
||||||
|
0x00, 0x00, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x66, 0x9b, 0x00, 0x00,
|
||||||
|
/*alpha channel*/
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const lv_img_dsc_t orange = {
|
||||||
|
.header.cf = LV_IMG_CF_RGB565A8,
|
||||||
|
.header.always_zero = 0,
|
||||||
|
.header.reserved = 0,
|
||||||
|
.header.w = 16,
|
||||||
|
.header.h = 16,
|
||||||
|
.data_size = 768,
|
||||||
|
.data = orange_map,
|
||||||
|
};
|
||||||
69
main/steps/tetris_resources/purple.c
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#ifdef __has_include
|
||||||
|
#if __has_include("lvgl.h")
|
||||||
|
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#define LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
|
||||||
|
#include "lvgl.h"
|
||||||
|
#else
|
||||||
|
#include "lvgl/lvgl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_IMG_PURPLE
|
||||||
|
#define LV_ATTRIBUTE_IMG_PURPLE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_PURPLE uint8_t purple_map[] = {
|
||||||
|
0x00, 0x00, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0x00, 0x00,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x93, 0x89, 0x93, 0x89, 0x93, 0x89, 0x93, 0x89, 0x94, 0x89, 0x94, 0x89, 0x94, 0x89, 0x94, 0x89, 0x93, 0x89, 0x93, 0x89, 0x93, 0x89, 0x93, 0x89, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x73, 0x81, 0x55, 0x92, 0x55, 0x9a, 0x56, 0x9a, 0x57, 0xa2, 0x57, 0xa2, 0x57, 0xa2, 0x57, 0xa2, 0x56, 0x9a, 0x56, 0x9a, 0x55, 0x92, 0x73, 0x81, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x11, 0x68, 0x35, 0x9a, 0x5d, 0xe6, 0xdb, 0xcc, 0x19, 0xb3, 0x19, 0xb3, 0x19, 0xb3, 0x19, 0xb3, 0x19, 0xb3, 0x18, 0xb3, 0x56, 0x9a, 0x11, 0x68, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x11, 0x68, 0x13, 0x78, 0x15, 0x80, 0x98, 0xaa, 0x1b, 0xcc, 0x5a, 0xbb, 0x5a, 0xc3, 0x5a, 0xbb, 0x99, 0xb2, 0x15, 0x88, 0x14, 0x80, 0x12, 0x70, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x12, 0x78, 0x15, 0x80, 0x16, 0x90, 0x17, 0x98, 0x18, 0xa0, 0x18, 0xa0, 0x19, 0xa0, 0x18, 0xa0, 0x18, 0x98, 0x17, 0x98, 0x15, 0x88, 0x13, 0x78, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x13, 0x78, 0x15, 0x88, 0x17, 0x98, 0x18, 0x98, 0x19, 0xa0, 0x19, 0xa8, 0x19, 0xa8, 0x19, 0xa8, 0x18, 0xa0, 0x18, 0x98, 0x16, 0x90, 0x14, 0x80, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x14, 0x80, 0x16, 0x90, 0x18, 0xa0, 0x19, 0xa8, 0x1a, 0xa8, 0x1a, 0xb0, 0x1b, 0xb0, 0x1a, 0xb0, 0x1a, 0xa8, 0x19, 0xa0, 0x17, 0x98, 0x15, 0x88, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x15, 0x88, 0x17, 0x98, 0x19, 0xa0, 0x1a, 0xa8, 0x1b, 0xb0, 0x1b, 0xb8, 0x1b, 0xb8, 0x1b, 0xb8, 0x1a, 0xb0, 0x19, 0xa8, 0x18, 0xa0, 0x16, 0x88, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x15, 0x88, 0x18, 0x98, 0x1a, 0xa8, 0x1b, 0xb0, 0x1c, 0xb8, 0x1c, 0xc0, 0x1d, 0xc0, 0x1c, 0xc0, 0x1b, 0xb8, 0x1b, 0xb0, 0x19, 0xa0, 0x17, 0x90, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x16, 0x88, 0x18, 0xa0, 0x1a, 0xb0, 0x1b, 0xb0, 0x1c, 0xc0, 0x1d, 0xc0, 0x1d, 0xc0, 0x1d, 0xc0, 0x1c, 0xb8, 0x1b, 0xb0, 0x19, 0xa8, 0x17, 0x98, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x16, 0x90, 0x19, 0xa0, 0x1b, 0xb0, 0x1c, 0xb8, 0x1d, 0xc8, 0x1e, 0xc8, 0x1e, 0xd0, 0x1e, 0xc8, 0x1d, 0xc0, 0x1c, 0xb8, 0x1a, 0xa8, 0x18, 0x98, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x17, 0x90, 0x19, 0xa8, 0x1b, 0xb8, 0x1c, 0xc0, 0x1e, 0xc8, 0x1f, 0xd0, 0x1f, 0xd8, 0x1f, 0xd0, 0x1d, 0xc0, 0x1c, 0xc0, 0x1a, 0xb0, 0x18, 0x98, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0xb3, 0x81, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0x0f, 0x58, 0xb3, 0x81,
|
||||||
|
0x00, 0x00, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0xb3, 0x81, 0x00, 0x00,
|
||||||
|
/*alpha channel*/
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const lv_img_dsc_t purple = {
|
||||||
|
.header.cf = LV_IMG_CF_RGB565A8,
|
||||||
|
.header.always_zero = 0,
|
||||||
|
.header.reserved = 0,
|
||||||
|
.header.w = 16,
|
||||||
|
.header.h = 16,
|
||||||
|
.data_size = 768,
|
||||||
|
.data = purple_map,
|
||||||
|
};
|
||||||
69
main/steps/tetris_resources/red.c
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#ifdef __has_include
|
||||||
|
#if __has_include("lvgl.h")
|
||||||
|
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#define LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
|
||||||
|
#include "lvgl.h"
|
||||||
|
#else
|
||||||
|
#include "lvgl/lvgl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_IMG_RED
|
||||||
|
#define LV_ATTRIBUTE_IMG_RED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_RED uint8_t red_map[] = {
|
||||||
|
0x00, 0x00, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0x00, 0x00,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x86, 0x99, 0x86, 0x99, 0x86, 0x99, 0x86, 0x99, 0x86, 0xa1, 0x86, 0xa1, 0x86, 0xa1, 0x86, 0xa1, 0x86, 0x99, 0x86, 0x99, 0x86, 0x99, 0x86, 0x99, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x66, 0x99, 0x49, 0xaa, 0x49, 0xaa, 0x49, 0xb2, 0x49, 0xba, 0x49, 0xba, 0x49, 0xba, 0x49, 0xba, 0x49, 0xb2, 0x49, 0xb2, 0x49, 0xaa, 0x66, 0x99, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0x88, 0x29, 0xaa, 0x59, 0xee, 0xd3, 0xdc, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xc3, 0x49, 0xb2, 0x00, 0x88, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0x88, 0x00, 0x98, 0x00, 0xa8, 0x8a, 0xc2, 0x10, 0xdc, 0x4d, 0xd3, 0x4d, 0xd3, 0x4d, 0xd3, 0x8a, 0xca, 0x00, 0xa8, 0x00, 0xa0, 0x00, 0x90, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0x90, 0x00, 0xa8, 0x00, 0xb0, 0x00, 0xb8, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc8, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xb8, 0x00, 0xa8, 0x00, 0x98, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0x98, 0x00, 0xa8, 0x00, 0xb8, 0x00, 0xc0, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xb0, 0x00, 0xa0, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0xa0, 0x00, 0xb0, 0x00, 0xc0, 0x00, 0xc8, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd8, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xc8, 0x00, 0xb8, 0x00, 0xa8, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0xa8, 0x00, 0xb8, 0x00, 0xc8, 0x00, 0xd0, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xd0, 0x00, 0xc8, 0x00, 0xc0, 0x00, 0xb0, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0xa8, 0x00, 0xc0, 0x00, 0xd0, 0x00, 0xd8, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xe8, 0x00, 0xe0, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xc8, 0x00, 0xb8, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0xb0, 0x00, 0xc0, 0x00, 0xd0, 0x00, 0xd8, 0x00, 0xe0, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0xe0, 0x00, 0xd8, 0x00, 0xc8, 0x00, 0xb8, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0xb0, 0x00, 0xc8, 0x00, 0xd8, 0x00, 0xe0, 0x00, 0xe8, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xe8, 0x00, 0xe0, 0x00, 0xd0, 0x00, 0xc0, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0xb8, 0x00, 0xc8, 0x00, 0xd8, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xe8, 0x00, 0xe0, 0x00, 0xd0, 0x00, 0xc0, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0xa6, 0x99, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0xa6, 0x99,
|
||||||
|
0x00, 0x00, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0x00, 0x00,
|
||||||
|
/*alpha channel*/
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const lv_img_dsc_t red = {
|
||||||
|
.header.cf = LV_IMG_CF_RGB565A8,
|
||||||
|
.header.always_zero = 0,
|
||||||
|
.header.reserved = 0,
|
||||||
|
.header.w = 16,
|
||||||
|
.header.h = 16,
|
||||||
|
.data_size = 768,
|
||||||
|
.data = red_map,
|
||||||
|
};
|
||||||
69
main/steps/tetris_resources/yellow.c
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#ifdef __has_include
|
||||||
|
#if __has_include("lvgl.h")
|
||||||
|
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#define LV_LVGL_H_INCLUDE_SIMPLE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
|
||||||
|
#include "lvgl.h"
|
||||||
|
#else
|
||||||
|
#include "lvgl/lvgl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LV_ATTRIBUTE_IMG_YELLOW
|
||||||
|
#define LV_ATTRIBUTE_IMG_YELLOW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_YELLOW uint8_t yellow_map[] = {
|
||||||
|
0x00, 0x00, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x00, 0x00,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0xa8, 0x9c, 0xa8, 0xa4, 0xa8, 0xa4, 0xa8, 0xa4, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0x88, 0x9c, 0xcb, 0xa4, 0xeb, 0xac, 0x0b, 0xad, 0x2b, 0xb5, 0x2b, 0xb5, 0x2b, 0xb5, 0x2b, 0xb5, 0x0b, 0xad, 0x0b, 0xad, 0xcb, 0xa4, 0x88, 0x9c, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0x20, 0x94, 0xeb, 0xac, 0x18, 0xef, 0x33, 0xce, 0xae, 0xc5, 0xae, 0xc5, 0xae, 0xc5, 0xae, 0xc5, 0x8e, 0xbd, 0x8e, 0xbd, 0x0b, 0xad, 0x20, 0x94, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0x20, 0x94, 0x60, 0x9c, 0xa0, 0xa4, 0x8c, 0xbd, 0x31, 0xd6, 0xef, 0xcd, 0xef, 0xcd, 0xef, 0xcd, 0x8c, 0xbd, 0xc0, 0xac, 0x80, 0xa4, 0x40, 0x94, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0x40, 0x9c, 0xa0, 0xa4, 0x00, 0xad, 0x20, 0xb5, 0x40, 0xbd, 0x40, 0xbd, 0x60, 0xbd, 0x40, 0xbd, 0x40, 0xbd, 0x20, 0xb5, 0xc0, 0xac, 0x80, 0x9c, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0x60, 0x9c, 0xc0, 0xac, 0x20, 0xb5, 0x20, 0xb5, 0x60, 0xbd, 0x80, 0xc5, 0x80, 0xc5, 0x80, 0xc5, 0x40, 0xbd, 0x40, 0xbd, 0xe0, 0xac, 0x80, 0xa4, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0x80, 0xa4, 0x00, 0xad, 0x40, 0xbd, 0x80, 0xc5, 0xa0, 0xcd, 0xc0, 0xcd, 0xc0, 0xcd, 0xc0, 0xcd, 0xa0, 0xc5, 0x60, 0xc5, 0x20, 0xb5, 0xc0, 0xac, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0xc0, 0xa4, 0x20, 0xb5, 0x60, 0xbd, 0x80, 0xc5, 0xc0, 0xcd, 0xe0, 0xd5, 0x00, 0xd6, 0xe0, 0xd5, 0xc0, 0xcd, 0x80, 0xc5, 0x40, 0xbd, 0xe0, 0xac, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0xc0, 0xac, 0x40, 0xbd, 0xa0, 0xcd, 0xc0, 0xcd, 0x20, 0xde, 0x20, 0xde, 0x40, 0xe6, 0x40, 0xde, 0x00, 0xd6, 0xc0, 0xcd, 0x60, 0xbd, 0x00, 0xb5, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0xe0, 0xac, 0x40, 0xbd, 0xc0, 0xcd, 0xe0, 0xd5, 0x40, 0xde, 0x60, 0xe6, 0x60, 0xe6, 0x60, 0xe6, 0x20, 0xde, 0xe0, 0xd5, 0x80, 0xc5, 0x20, 0xb5, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0x00, 0xad, 0x60, 0xc5, 0xe0, 0xd5, 0x20, 0xde, 0x80, 0xee, 0xa0, 0xee, 0xc0, 0xf6, 0xa0, 0xee, 0x40, 0xe6, 0x20, 0xde, 0xa0, 0xcd, 0x20, 0xb5, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0x00, 0xb5, 0x80, 0xc5, 0x00, 0xd6, 0x20, 0xde, 0xa0, 0xee, 0xe0, 0xf6, 0x00, 0xff, 0xe0, 0xf6, 0x60, 0xe6, 0x20, 0xde, 0xc0, 0xcd, 0x40, 0xbd, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x88, 0x9c, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0xa0, 0x83, 0x88, 0x9c,
|
||||||
|
0x00, 0x00, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x88, 0x9c, 0x00, 0x00,
|
||||||
|
/*alpha channel*/
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const lv_img_dsc_t yellow = {
|
||||||
|
.header.cf = LV_IMG_CF_RGB565A8,
|
||||||
|
.header.always_zero = 0,
|
||||||
|
.header.reserved = 0,
|
||||||
|
.header.w = 16,
|
||||||
|
.header.h = 16,
|
||||||
|
.data_size = 768,
|
||||||
|
.data = yellow_map,
|
||||||
|
};
|
||||||
BIN
resources/flash.wav
Normal file
BIN
resources_src/bg.aseprite
Normal file
BIN
resources_src/bg.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
resources_src/clear.png
Normal file
|
After Width: | Height: | Size: 502 B |
BIN
resources_src/db.png
Normal file
|
After Width: | Height: | Size: 565 B |
BIN
resources_src/green.png
Normal file
|
After Width: | Height: | Size: 563 B |
BIN
resources_src/lb.png
Normal file
|
After Width: | Height: | Size: 570 B |
BIN
resources_src/orange.png
Normal file
|
After Width: | Height: | Size: 573 B |
BIN
resources_src/purple.png
Normal file
|
After Width: | Height: | Size: 578 B |
BIN
resources_src/red.png
Normal file
|
After Width: | Height: | Size: 518 B |
BIN
resources_src/yellow.png
Normal file
|
After Width: | Height: | Size: 552 B |
65
sdkconfig
@ -366,7 +366,7 @@ CONFIG_IDF_TOOLCHAIN="gcc"
|
|||||||
CONFIG_IDF_TARGET_ARCH_XTENSA=y
|
CONFIG_IDF_TARGET_ARCH_XTENSA=y
|
||||||
CONFIG_IDF_TARGET_ARCH="xtensa"
|
CONFIG_IDF_TARGET_ARCH="xtensa"
|
||||||
CONFIG_IDF_TARGET="esp32s3"
|
CONFIG_IDF_TARGET="esp32s3"
|
||||||
CONFIG_IDF_INIT_VERSION="5.2.2"
|
CONFIG_IDF_INIT_VERSION="5.3.2"
|
||||||
CONFIG_IDF_TARGET_ESP32S3=y
|
CONFIG_IDF_TARGET_ESP32S3=y
|
||||||
CONFIG_IDF_FIRMWARE_CHIP_ID=0x0009
|
CONFIG_IDF_FIRMWARE_CHIP_ID=0x0009
|
||||||
|
|
||||||
@ -920,8 +920,8 @@ CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES=4
|
|||||||
#
|
#
|
||||||
# Sleep Config
|
# Sleep Config
|
||||||
#
|
#
|
||||||
# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set
|
|
||||||
CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y
|
CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y
|
||||||
|
CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND=y
|
||||||
CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU=y
|
CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU=y
|
||||||
CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y
|
CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y
|
||||||
CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y
|
CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y
|
||||||
@ -1030,7 +1030,37 @@ CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP=y
|
|||||||
#
|
#
|
||||||
# ESP PSRAM
|
# ESP PSRAM
|
||||||
#
|
#
|
||||||
# CONFIG_SPIRAM is not set
|
CONFIG_SPIRAM=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# SPI RAM config
|
||||||
|
#
|
||||||
|
# CONFIG_SPIRAM_MODE_QUAD is not set
|
||||||
|
CONFIG_SPIRAM_MODE_OCT=y
|
||||||
|
CONFIG_SPIRAM_TYPE_AUTO=y
|
||||||
|
# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set
|
||||||
|
CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y
|
||||||
|
CONFIG_SPIRAM_CLK_IO=30
|
||||||
|
CONFIG_SPIRAM_CS_IO=26
|
||||||
|
# CONFIG_SPIRAM_XIP_FROM_PSRAM is not set
|
||||||
|
# CONFIG_SPIRAM_FETCH_INSTRUCTIONS is not set
|
||||||
|
# CONFIG_SPIRAM_RODATA is not set
|
||||||
|
# CONFIG_SPIRAM_SPEED_80M is not set
|
||||||
|
CONFIG_SPIRAM_SPEED_40M=y
|
||||||
|
CONFIG_SPIRAM_SPEED=40
|
||||||
|
# CONFIG_SPIRAM_ECC_ENABLE is not set
|
||||||
|
CONFIG_SPIRAM_BOOT_INIT=y
|
||||||
|
# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set
|
||||||
|
# CONFIG_SPIRAM_USE_MEMMAP is not set
|
||||||
|
# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set
|
||||||
|
CONFIG_SPIRAM_USE_MALLOC=y
|
||||||
|
CONFIG_SPIRAM_MEMTEST=y
|
||||||
|
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384
|
||||||
|
# CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is not set
|
||||||
|
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768
|
||||||
|
# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set
|
||||||
|
# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set
|
||||||
|
# end of SPI RAM config
|
||||||
# end of ESP PSRAM
|
# end of ESP PSRAM
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -1183,10 +1213,10 @@ CONFIG_ESP_TIMER_IMPL_SYSTIMER=y
|
|||||||
CONFIG_ESP_WIFI_ENABLED=y
|
CONFIG_ESP_WIFI_ENABLED=y
|
||||||
CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10
|
CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10
|
||||||
CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32
|
CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32
|
||||||
# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set
|
CONFIG_ESP_WIFI_STATIC_TX_BUFFER=y
|
||||||
CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y
|
CONFIG_ESP_WIFI_TX_BUFFER_TYPE=0
|
||||||
CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1
|
CONFIG_ESP_WIFI_STATIC_TX_BUFFER_NUM=16
|
||||||
CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32
|
CONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=32
|
||||||
CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y
|
CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y
|
||||||
# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set
|
# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set
|
||||||
CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0
|
CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0
|
||||||
@ -1196,6 +1226,7 @@ CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y
|
|||||||
CONFIG_ESP_WIFI_TX_BA_WIN=6
|
CONFIG_ESP_WIFI_TX_BA_WIN=6
|
||||||
CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
|
CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
|
||||||
CONFIG_ESP_WIFI_RX_BA_WIN=6
|
CONFIG_ESP_WIFI_RX_BA_WIN=6
|
||||||
|
# CONFIG_ESP_WIFI_AMSDU_TX_ENABLED is not set
|
||||||
CONFIG_ESP_WIFI_NVS_ENABLED=y
|
CONFIG_ESP_WIFI_NVS_ENABLED=y
|
||||||
CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y
|
CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y
|
||||||
# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set
|
# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set
|
||||||
@ -1285,6 +1316,7 @@ CONFIG_FATFS_CODEPAGE=437
|
|||||||
CONFIG_FATFS_FS_LOCK=0
|
CONFIG_FATFS_FS_LOCK=0
|
||||||
CONFIG_FATFS_TIMEOUT_MS=10000
|
CONFIG_FATFS_TIMEOUT_MS=10000
|
||||||
CONFIG_FATFS_PER_FILE_CACHE=y
|
CONFIG_FATFS_PER_FILE_CACHE=y
|
||||||
|
CONFIG_FATFS_ALLOC_PREFER_EXTRAM=y
|
||||||
# CONFIG_FATFS_USE_FASTSEEK is not set
|
# CONFIG_FATFS_USE_FASTSEEK is not set
|
||||||
CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0
|
CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0
|
||||||
# CONFIG_FATFS_IMMEDIATE_FSYNC is not set
|
# CONFIG_FATFS_IMMEDIATE_FSYNC is not set
|
||||||
@ -1589,6 +1621,7 @@ CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y
|
|||||||
# mbedTLS
|
# mbedTLS
|
||||||
#
|
#
|
||||||
CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y
|
CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y
|
||||||
|
# CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC is not set
|
||||||
# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set
|
# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set
|
||||||
# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set
|
# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set
|
||||||
CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
|
CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
|
||||||
@ -1751,6 +1784,8 @@ CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y
|
|||||||
# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set
|
# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set
|
||||||
# end of Newlib
|
# end of Newlib
|
||||||
|
|
||||||
|
CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# NVS
|
# NVS
|
||||||
#
|
#
|
||||||
@ -2046,7 +2081,7 @@ CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00
|
|||||||
# Memory settings
|
# Memory settings
|
||||||
#
|
#
|
||||||
# CONFIG_LV_MEM_CUSTOM is not set
|
# CONFIG_LV_MEM_CUSTOM is not set
|
||||||
CONFIG_LV_MEM_SIZE_KILOBYTES=32
|
CONFIG_LV_MEM_SIZE_KILOBYTES=64
|
||||||
CONFIG_LV_MEM_ADDR=0x0
|
CONFIG_LV_MEM_ADDR=0x0
|
||||||
CONFIG_LV_MEM_BUF_MAX_NUM=16
|
CONFIG_LV_MEM_BUF_MAX_NUM=16
|
||||||
# CONFIG_LV_MEMCPY_MEMSET_STD is not set
|
# CONFIG_LV_MEMCPY_MEMSET_STD is not set
|
||||||
@ -2377,7 +2412,6 @@ CONFIG_POST_EVENTS_FROM_IRAM_ISR=y
|
|||||||
CONFIG_GDBSTUB_SUPPORT_TASKS=y
|
CONFIG_GDBSTUB_SUPPORT_TASKS=y
|
||||||
CONFIG_GDBSTUB_MAX_TASKS=32
|
CONFIG_GDBSTUB_MAX_TASKS=32
|
||||||
# CONFIG_OTA_ALLOW_HTTP is not set
|
# CONFIG_OTA_ALLOW_HTTP is not set
|
||||||
# CONFIG_ESP_SYSTEM_PD_FLASH is not set
|
|
||||||
CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY=2000
|
CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY=2000
|
||||||
CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000
|
CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000
|
||||||
CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y
|
CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y
|
||||||
@ -2393,7 +2427,9 @@ CONFIG_ESP32_PHY_MAX_TX_POWER=20
|
|||||||
# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set
|
# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set
|
||||||
CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y
|
CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y
|
||||||
CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y
|
CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y
|
||||||
# CONFIG_ESP32S3_SPIRAM_SUPPORT is not set
|
CONFIG_ESP32S3_SPIRAM_SUPPORT=y
|
||||||
|
CONFIG_DEFAULT_PSRAM_CLK_IO=30
|
||||||
|
CONFIG_DEFAULT_PSRAM_CS_IO=26
|
||||||
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set
|
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set
|
||||||
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160=y
|
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160=y
|
||||||
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set
|
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set
|
||||||
@ -2443,10 +2479,10 @@ CONFIG_TIMER_TASK_STACK_SIZE=3584
|
|||||||
CONFIG_ESP32_WIFI_ENABLED=y
|
CONFIG_ESP32_WIFI_ENABLED=y
|
||||||
CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10
|
CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10
|
||||||
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32
|
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32
|
||||||
# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set
|
CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y
|
||||||
CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y
|
CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0
|
||||||
CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1
|
CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16
|
||||||
CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32
|
CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=32
|
||||||
# CONFIG_ESP32_WIFI_CSI_ENABLED is not set
|
# CONFIG_ESP32_WIFI_CSI_ENABLED is not set
|
||||||
CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y
|
CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y
|
||||||
CONFIG_ESP32_WIFI_TX_BA_WIN=6
|
CONFIG_ESP32_WIFI_TX_BA_WIN=6
|
||||||
@ -2454,6 +2490,7 @@ CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
|
|||||||
CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
|
CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
|
||||||
CONFIG_ESP32_WIFI_RX_BA_WIN=6
|
CONFIG_ESP32_WIFI_RX_BA_WIN=6
|
||||||
CONFIG_ESP32_WIFI_RX_BA_WIN=6
|
CONFIG_ESP32_WIFI_RX_BA_WIN=6
|
||||||
|
# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set
|
||||||
CONFIG_ESP32_WIFI_NVS_ENABLED=y
|
CONFIG_ESP32_WIFI_NVS_ENABLED=y
|
||||||
CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y
|
CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y
|
||||||
# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set
|
# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set
|
||||||
|
|||||||