Compare commits
34
Commits
a680363bf9
...
support
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b2813d62a3 | ||
|
|
202b926eb7 | ||
|
|
8bddceca66 | ||
|
|
cfc307ee72 | ||
|
|
a9e44145f0 | ||
|
|
15e8630a88 | ||
|
|
4e75aeb69c | ||
|
|
4a47558ef6 | ||
|
|
e27fb6f015 | ||
|
|
1267d1356d | ||
|
|
9cc1a93e73 | ||
|
|
72ff92b444 | ||
|
|
e1ce43d57c | ||
|
|
ee30fce074 | ||
|
|
219f1f1507 | ||
|
|
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`.
|
||||||
|
|||||||
@@ -6,15 +6,21 @@ set(SOURCES
|
|||||||
"esp_lcd_ili9488/esp_lcd_ili9488.c"
|
"esp_lcd_ili9488/esp_lcd_ili9488.c"
|
||||||
"bottom_half.cpp"
|
"bottom_half.cpp"
|
||||||
"char_lcd.cpp"
|
"char_lcd.cpp"
|
||||||
|
"game_info.cpp"
|
||||||
"game_timer.cpp"
|
"game_timer.cpp"
|
||||||
"i2c_lcd_pcf8574.c"
|
"i2c_lcd_pcf8574.c"
|
||||||
|
"i2c.cpp"
|
||||||
"leds.cpp"
|
"leds.cpp"
|
||||||
|
"perh.cpp"
|
||||||
"power.cpp"
|
"power.cpp"
|
||||||
"sd.cpp"
|
"sd.cpp"
|
||||||
"speaker.cpp"
|
"speaker.cpp"
|
||||||
"sseg.cpp"
|
"sseg.cpp"
|
||||||
|
"starcode.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})
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ Arduino Uno (any 'duino should do)
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#include "SparkFunBQ27441.h"
|
#include "SparkFunBQ27441.h"
|
||||||
|
#include "../i2c.h"
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
************************** Initialization Functions *************************
|
************************** Initialization Functions *************************
|
||||||
@@ -710,7 +711,9 @@ bool BQ27441::writeExtendedData(uint8_t classID, uint8_t offset, uint8_t * data,
|
|||||||
int16_t BQ27441::i2cReadBytes(uint8_t subAddress, uint8_t * dest, uint8_t count)
|
int16_t BQ27441::i2cReadBytes(uint8_t subAddress, uint8_t * dest, uint8_t count)
|
||||||
{
|
{
|
||||||
int16_t timeout = BQ72441_I2C_TIMEOUT;
|
int16_t timeout = BQ72441_I2C_TIMEOUT;
|
||||||
|
xSemaphoreTake(main_i2c_mutex, portMAX_DELAY);
|
||||||
i2c_master_write_read_device(BQ72441_I2C_NUM, _deviceAddress, &subAddress, 1, dest, count, timeout);
|
i2c_master_write_read_device(BQ72441_I2C_NUM, _deviceAddress, &subAddress, 1, dest, count, timeout);
|
||||||
|
xSemaphoreGive(main_i2c_mutex);
|
||||||
return timeout;
|
return timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-35
@@ -1,49 +1,19 @@
|
|||||||
#include "all.h"
|
#include "all.h"
|
||||||
|
|
||||||
static const char *TAG = "driver_all";
|
|
||||||
static void init_i2c();
|
|
||||||
|
|
||||||
void init_drivers() {
|
void init_drivers() {
|
||||||
init_i2c();
|
init_i2c();
|
||||||
// init char_lcd so we can use it to report other initialization errors.
|
// init char_lcd so we can use it to report other initialization errors.
|
||||||
init_lcd();
|
init_lcd();
|
||||||
|
init_star_code_system();
|
||||||
// init the bottom half so that we can get user input.
|
// init the bottom half so that we can get user input.
|
||||||
init_bottom_half();
|
init_bottom_half();
|
||||||
init_sd();
|
init_sd();
|
||||||
init_speaker();
|
init_speaker();
|
||||||
init_sseg();
|
init_sseg();
|
||||||
init_game_timers();
|
init_game_timers();
|
||||||
|
init_tft();
|
||||||
|
init_leds();
|
||||||
|
init_power_board();
|
||||||
|
|
||||||
}
|
set_lcd_header_enabled(true);
|
||||||
|
|
||||||
/// @brief Initializes I2C_NUM_0.
|
|
||||||
///
|
|
||||||
/// This is hooked up the to:
|
|
||||||
/// - The bottom half
|
|
||||||
/// - The char lcd
|
|
||||||
/// - The power board
|
|
||||||
/// - The MPU6050
|
|
||||||
/// - The PERH port
|
|
||||||
/// - The Capacitive Touch Panel
|
|
||||||
static void init_i2c() {
|
|
||||||
ESP_LOGI(TAG, "Initializing i2c...");
|
|
||||||
|
|
||||||
i2c_config_t conf = {
|
|
||||||
.mode = I2C_MODE_MASTER,
|
|
||||||
.sda_io_num = GPIO_NUM_5,
|
|
||||||
.scl_io_num = GPIO_NUM_6,
|
|
||||||
.sda_pullup_en = GPIO_PULLUP_DISABLE,
|
|
||||||
.scl_pullup_en = GPIO_PULLUP_DISABLE,
|
|
||||||
// .sda_pullup_en = GPIO_PULLUP_ENABLE,
|
|
||||||
// .scl_pullup_en = GPIO_PULLUP_ENABLE,
|
|
||||||
.master = {
|
|
||||||
.clk_speed = 100*1000,
|
|
||||||
},
|
|
||||||
.clk_flags = I2C_SCLK_SRC_FLAG_FOR_NOMAL
|
|
||||||
};
|
|
||||||
|
|
||||||
ESP_ERROR_CHECK(i2c_param_config(I2C_NUM_0, &conf));
|
|
||||||
ESP_ERROR_CHECK(i2c_driver_install(I2C_NUM_0, conf.mode, 0, 0, 0));
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "i2c initialized!");
|
|
||||||
}
|
}
|
||||||
+10
-12
@@ -1,21 +1,19 @@
|
|||||||
#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 "bottom_half.h"
|
#include "bottom_half.h"
|
||||||
|
#include "char_lcd.h"
|
||||||
|
#include "game_timer.h"
|
||||||
|
#include "i2c.h"
|
||||||
|
#include "leds.h"
|
||||||
|
#include "power.h"
|
||||||
#include "sd.h"
|
#include "sd.h"
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
#include "game_timer.h"
|
#include "sseg.h"
|
||||||
|
#include "starcode.h"
|
||||||
|
#include "state_tracking.h"
|
||||||
|
#include "tft.h"
|
||||||
|
#include "wires.h"
|
||||||
|
|
||||||
void init_drivers();
|
void init_drivers();
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#include "bottom_half.h"
|
#include "bottom_half.h"
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
|
#include "state_tracking.h"
|
||||||
|
#include "starcode.h"
|
||||||
|
|
||||||
static const char *TAG = "bottom_half";
|
static const char *TAG = "bottom_half";
|
||||||
|
|
||||||
@@ -29,6 +31,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)
|
||||||
// {
|
// {
|
||||||
@@ -39,8 +46,14 @@ static void receive_touch();
|
|||||||
void init_bottom_half() {
|
void init_bottom_half() {
|
||||||
ESP_LOGI(TAG, "Initializing bottom half...");
|
ESP_LOGI(TAG, "Initializing bottom half...");
|
||||||
|
|
||||||
ESP_ERROR_CHECK(gpio_set_direction(BOTTOM_PIN_INTERUPT, GPIO_MODE_INPUT));
|
gpio_config_t int_conf = {
|
||||||
ESP_ERROR_CHECK(gpio_set_pull_mode(BOTTOM_PIN_INTERUPT, GPIO_PULLUP_ONLY));
|
.pin_bit_mask = 1ULL << BOTTOM_PIN_INTERUPT,
|
||||||
|
.mode = GPIO_MODE_INPUT,
|
||||||
|
.pull_up_en = GPIO_PULLUP_ENABLE,
|
||||||
|
.pull_down_en = GPIO_PULLDOWN_DISABLE,
|
||||||
|
.intr_type = GPIO_INTR_DISABLE,
|
||||||
|
};
|
||||||
|
ESP_ERROR_CHECK(gpio_config(&int_conf));
|
||||||
|
|
||||||
// TODO: do interupt stuff.
|
// TODO: do interupt stuff.
|
||||||
// ESP_ERROR_CHECK(gpio_intr_enable(BOTTOM_PIN_INTERUPT));
|
// ESP_ERROR_CHECK(gpio_intr_enable(BOTTOM_PIN_INTERUPT));
|
||||||
@@ -56,35 +69,60 @@ 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!");
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t receive_delta(void) {
|
static uint8_t receive_delta(void) {
|
||||||
uint8_t reg = 1;
|
uint8_t reg = 1;
|
||||||
buf[0] = 0;
|
esp_err_t result = i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, ®, 1, buf, 1, (100 / portTICK_PERIOD_MS));
|
||||||
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, ®, 1, buf, 1, (100 / portTICK_PERIOD_MS)));
|
ESP_ERROR_CHECK_WITHOUT_ABORT(result);
|
||||||
|
if (result != ESP_OK) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return buf[0];
|
return buf[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void receive_keypad(void) {
|
static void receive_keypad(void) {
|
||||||
|
// TODO: use mutex
|
||||||
|
// TODO: change the bottom half polling scheme from a state-based protocol to an event based protocol
|
||||||
uint8_t reg = 2;
|
uint8_t reg = 2;
|
||||||
buf[0] = 0;
|
esp_err_t result = i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, ®, 1, buf, 2, (100 / portTICK_PERIOD_MS));
|
||||||
buf[1] = 0;
|
ESP_ERROR_CHECK_WITHOUT_ABORT(result);
|
||||||
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, ®, 1, buf, 2, (100 / portTICK_PERIOD_MS)));
|
if (result != ESP_OK) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
uint16_t new_keypad_state = buf[0] | (buf[1] << 8);
|
uint16_t new_keypad_state = buf[0] | (buf[1] << 8);
|
||||||
|
|
||||||
uint16_t just_pressed = new_keypad_state & ~keypad_state;
|
uint16_t just_pressed = new_keypad_state & ~keypad_state;
|
||||||
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;
|
if (is_state_tracking() && just_released) {
|
||||||
|
char buf[6];
|
||||||
|
sprintf(buf, "%d", just_released);
|
||||||
|
event_occured("KP_RELEASE", buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
star_code_handle_keypad(&just_pressed, &just_released);
|
||||||
|
|
||||||
|
keypad_pressed |= just_pressed;
|
||||||
|
keypad_released |= just_released;
|
||||||
keypad_state = new_keypad_state;
|
keypad_state = new_keypad_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void receive_button_switch(void) {
|
static void receive_button_switch(void) {
|
||||||
uint8_t reg = 3;
|
uint8_t reg = 3;
|
||||||
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, ®, 1, buf, 2, (100 / portTICK_PERIOD_MS)));
|
esp_err_t result = i2c_master_write_read_device(BOTTOM_I2C_NUM, BOTTOM_I2C_ADDR, ®, 1, buf, 2, (100 / portTICK_PERIOD_MS));
|
||||||
|
ESP_ERROR_CHECK_WITHOUT_ABORT(result);
|
||||||
|
if (result != ESP_OK) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t new_button_state = buf[1] & 0xF;
|
uint8_t new_button_state = buf[1] & 0xF;
|
||||||
uint8_t new_switch_state = (~buf[0]) & 0xF;
|
uint8_t new_switch_state = (~buf[0]) & 0xF;
|
||||||
uint8_t new_switch_touch_state = (buf[1] >> 4) & 0xF;
|
uint8_t new_switch_touch_state = (buf[1] >> 4) & 0xF;
|
||||||
@@ -92,27 +130,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 +193,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;
|
||||||
}
|
}
|
||||||
@@ -163,7 +237,8 @@ void clear_all_pressed_released(void) {
|
|||||||
touch_released = 0;
|
touch_released = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool _take_key(KeypadKey* kp, uint16_t* keypad_bitfield) {
|
// TODO: this is public, but it won't need to be after the event-based protocol refactor
|
||||||
|
bool take_key(KeypadKey* kp, uint16_t* keypad_bitfield) {
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
int bit_selector = (1 << i);
|
int bit_selector = (1 << i);
|
||||||
if ((*keypad_bitfield) & bit_selector) {
|
if ((*keypad_bitfield) & bit_selector) {
|
||||||
@@ -179,10 +254,10 @@ static bool _take_key(KeypadKey* kp, uint16_t* keypad_bitfield) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool get_keypad_pressed(KeypadKey* kp) {
|
bool get_keypad_pressed(KeypadKey* kp) {
|
||||||
return _take_key(kp, &keypad_pressed);
|
return take_key(kp, &keypad_pressed);
|
||||||
}
|
}
|
||||||
bool get_keypad_released(KeypadKey* kp) {
|
bool get_keypad_released(KeypadKey* kp) {
|
||||||
return _take_key(kp, &keypad_released);
|
return take_key(kp, &keypad_released);
|
||||||
}
|
}
|
||||||
|
|
||||||
char char_of_keypad_key(KeypadKey kp) {
|
char char_of_keypad_key(KeypadKey kp) {
|
||||||
@@ -307,7 +382,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;
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-13
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#define BOTTOM_I2C_NUM I2C_NUM_0
|
#define BOTTOM_I2C_NUM I2C_NUM_0
|
||||||
#define BOTTOM_I2C_ADDR 126
|
#define BOTTOM_I2C_ADDR 126
|
||||||
#define BOTTOM_PIN_INTERUPT GPIO_NUM_0
|
#define BOTTOM_PIN_INTERUPT GPIO_NUM_13
|
||||||
|
|
||||||
#define DELTA_BIT_KP 0
|
#define DELTA_BIT_KP 0
|
||||||
#define DELTA_BIT_BUTTON_SWITCH 1
|
#define DELTA_BIT_BUTTON_SWITCH 1
|
||||||
@@ -14,22 +14,22 @@
|
|||||||
|
|
||||||
/// @brief An enum for the possible keypad buttons.
|
/// @brief An enum for the possible keypad buttons.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
k1 = 0,
|
kd = 0,
|
||||||
k4 = 1,
|
pound = 1,
|
||||||
k7 = 2,
|
k0 = 2,
|
||||||
star = 3,
|
star = 3,
|
||||||
k2 = 4,
|
kc = 4,
|
||||||
k5 = 5,
|
k9 = 5,
|
||||||
k8 = 6,
|
k8 = 6,
|
||||||
k0 = 7,
|
k7 = 7,
|
||||||
k3 = 8,
|
kb = 8,
|
||||||
k6 = 9,
|
k6 = 9,
|
||||||
k9 = 10,
|
k5 = 10,
|
||||||
pound = 11,
|
k4 = 11,
|
||||||
ka = 12,
|
ka = 12,
|
||||||
kb = 13,
|
k3 = 13,
|
||||||
kc = 14,
|
k2 = 14,
|
||||||
kd = 15,
|
k1 = 15,
|
||||||
} KeypadKey;
|
} KeypadKey;
|
||||||
|
|
||||||
/// @brief An enum for the possible buttons.
|
/// @brief An enum for the possible buttons.
|
||||||
@@ -126,6 +126,14 @@ bool get_touch_pressed();
|
|||||||
/// @return true if the touch sensor was just released
|
/// @return true if the touch sensor was just released
|
||||||
bool get_touch_released();
|
bool get_touch_released();
|
||||||
|
|
||||||
|
/// @brief A helper function for internal use.
|
||||||
|
///
|
||||||
|
/// Takes one key from the bitfield and sets the `kp` variable accordingly if the bitfield is not 0.
|
||||||
|
/// @param kp Out. The keypad key to set.
|
||||||
|
/// @param keypad_bitfield A pointer to the keypad bitfield to take a key from
|
||||||
|
/// @return true if a key was taken from the bitfield
|
||||||
|
bool take_key(KeypadKey* kp, uint16_t* keypad_bitfield);
|
||||||
|
|
||||||
// TODO: add touch sensor for switch
|
// TODO: add touch sensor for switch
|
||||||
|
|
||||||
#endif /* BOTTOM_HALF_HPP */
|
#endif /* BOTTOM_HALF_HPP */
|
||||||
+211
-14
@@ -2,10 +2,100 @@
|
|||||||
|
|
||||||
#include "./i2c_lcd_pcf8574.h"
|
#include "./i2c_lcd_pcf8574.h"
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
|
#include "state_tracking.h"
|
||||||
|
#include <cstring>
|
||||||
|
#include "power.h"
|
||||||
|
#include "starcode.h"
|
||||||
|
#include "game_info.h"
|
||||||
|
|
||||||
i2c_lcd_pcf8574_handle_t lcd;
|
i2c_lcd_pcf8574_handle_t lcd;
|
||||||
|
|
||||||
|
static volatile bool header_enabled = false;
|
||||||
|
|
||||||
static const char *TAG = "char_lcd";
|
static const char *TAG = "char_lcd";
|
||||||
|
static const char* EMPTY_ROW = " ";
|
||||||
|
|
||||||
|
static char buf[65];
|
||||||
|
|
||||||
|
static void monitor_battery_task(void* _arg) {
|
||||||
|
(void) _arg;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1'000));
|
||||||
|
lcd_print_header_bat();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
lcd_set_backlight(strcmp(arg, "true") == 0);
|
||||||
|
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_PRINT") == 0) {
|
||||||
|
// TODO: handle \r and \n
|
||||||
|
lcd_print(&lcd, arg);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void init_lcd() {
|
void init_lcd() {
|
||||||
ESP_LOGI(TAG, "Initializing LCD...");
|
ESP_LOGI(TAG, "Initializing LCD...");
|
||||||
@@ -15,20 +105,40 @@ void init_lcd() {
|
|||||||
|
|
||||||
lcd_set_backlight(&lcd, 255);
|
lcd_set_backlight(&lcd, 255);
|
||||||
|
|
||||||
|
register_replay_fn(replay_handler);
|
||||||
|
|
||||||
|
xTaskCreate(monitor_battery_task, "bat_monitor", 1024*2, nullptr, 0, nullptr);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "LCD initialized!");
|
ESP_LOGI(TAG, "LCD initialized!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void lcd_clear() {
|
void lcd_clear() {
|
||||||
lcd_clear(&lcd);
|
if (!header_enabled) {
|
||||||
|
lcd_clear(&lcd);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
event_occured("LCD_CLEAR", NULL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lcd_print(0, 1, EMPTY_ROW);
|
||||||
|
lcd_print(0, 2, EMPTY_ROW);
|
||||||
|
lcd_print(0, 3, EMPTY_ROW);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: rm
|
||||||
void lcd_cursor_home() {
|
void lcd_cursor_home() {
|
||||||
lcd_home(&lcd);
|
lcd_set_cursor_pos(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: with print requiring you to set a pos every time, this function is not helpful
|
||||||
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 +147,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 +159,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 +171,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 +213,84 @@ 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(bool backlight) {
|
||||||
lcd_set_backlight(&lcd, brightness);
|
lcd_set_backlight(&lcd, backlight);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
sprintf(buf, "%d", backlight);
|
||||||
|
event_occured("LCD_BACKLIGHT", backlight ? "true" : "false");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_create_char(uint8_t location, uint8_t charmap[]) {
|
void lcd_create_char(uint8_t location, const 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) {
|
// TODO: switch to row, col
|
||||||
lcd_write(&lcd, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void lcd_print(const char* str) {
|
|
||||||
lcd_print(&lcd, 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(&lcd, str);
|
||||||
|
|
||||||
|
if (is_state_tracking()) {
|
||||||
|
// TODO: handle \r and \n
|
||||||
|
event_occured("LCD_PRINT", str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_lcd_header_enabled(bool enable) {
|
||||||
|
bool old_header_enabled = header_enabled;
|
||||||
|
header_enabled = enable;
|
||||||
|
|
||||||
|
// update header in response to enabling/disabling the header
|
||||||
|
if (enable && !old_header_enabled) {
|
||||||
|
lcd_print_header();
|
||||||
|
} else if (!enable && old_header_enabled) {
|
||||||
|
lcd_print(0, 0, EMPTY_ROW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool lcd_header_enabled() {
|
||||||
|
return header_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcd_print_header() {
|
||||||
|
lcd_print_header_star_code();
|
||||||
|
lcd_print_header_step();
|
||||||
|
lcd_print_header_bat();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcd_do_splash() {
|
||||||
|
const uint8_t custom_char[6][8] = {
|
||||||
|
{ 0x01, 0x01, 0x02, 0x02, 0x07, 0x07, 0x0F, 0x0D },
|
||||||
|
{ 0x10, 0x10, 0x18, 0x18, 0x1C, 0x0C, 0x0E, 0x06 },
|
||||||
|
{ 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07 },
|
||||||
|
{ 0x19, 0x1B, 0x13, 0x17, 0x07, 0x0F, 0x0F, 0x1F },
|
||||||
|
{ 0x13, 0x1B, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x1F },
|
||||||
|
{ 0x00, 0x00, 0x10, 0x10, 0x00, 0x18, 0x1C, 0x1C },
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: make the lcd_lib somehow support the custom character 0 which would otherwise be a null terminator
|
||||||
|
lcd_create_char(1, custom_char[0]);
|
||||||
|
lcd_create_char(2, custom_char[1]);
|
||||||
|
lcd_create_char(3, custom_char[2]);
|
||||||
|
lcd_create_char(4, custom_char[3]);
|
||||||
|
lcd_create_char(5, custom_char[4]);
|
||||||
|
lcd_create_char(6, custom_char[5]);
|
||||||
|
|
||||||
|
lcd_print(6, 1, "\x01\x02Marino");
|
||||||
|
lcd_print(5, 2, "\x03\x04\x05\x06""DEV");
|
||||||
}
|
}
|
||||||
+20
-9
@@ -44,18 +44,29 @@ void lcd_right_to_left();
|
|||||||
void lcd_set_autoscroll(bool autoscroll);
|
void lcd_set_autoscroll(bool autoscroll);
|
||||||
|
|
||||||
// Set backlight brightness
|
// Set backlight brightness
|
||||||
void lcd_set_backlight(uint8_t brightness);
|
void lcd_set_backlight(bool backlight);
|
||||||
|
|
||||||
// Create a custom character
|
// Create a custom character
|
||||||
void lcd_create_char(uint8_t location, uint8_t charmap[]);
|
void lcd_create_char(uint8_t location, const uint8_t charmap[]);
|
||||||
|
|
||||||
// Write a character to the LCD
|
/// @brief Print a string to the LCD at a given pos.
|
||||||
void lcd_write(uint8_t value);
|
/// @param col the column to print the string at.
|
||||||
|
/// @param row the row the print the string at.
|
||||||
// Print a string to the LCD
|
/// @param str the string to print.
|
||||||
void lcd_print(const char* str);
|
|
||||||
|
|
||||||
// Print a string to the LCD at a given pos
|
|
||||||
void lcd_print(uint8_t col, uint8_t row, const char* str);
|
void lcd_print(uint8_t col, uint8_t row, const char* str);
|
||||||
|
|
||||||
|
/// @brief Enables or disables the header on the LCD.
|
||||||
|
/// @param enable `true` to enable the header, `false` to disable.
|
||||||
|
void set_lcd_header_enabled(bool enable);
|
||||||
|
|
||||||
|
/// @brief Returns weather or not the lcd_header is enabled.
|
||||||
|
/// @return `true` if the header is enabled, `false` otherwise.
|
||||||
|
bool lcd_header_enabled();
|
||||||
|
|
||||||
|
/// @brief Prints the header in the LCD.
|
||||||
|
void lcd_print_header();
|
||||||
|
|
||||||
|
/// @brief Prints the splash screen for the BLK_BOX.
|
||||||
|
void lcd_do_splash();
|
||||||
|
|
||||||
#endif /* CHAR_LCD_H */
|
#endif /* CHAR_LCD_H */
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#include "game_info.h"
|
||||||
|
#include "starcode.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "char_lcd.h"
|
||||||
|
|
||||||
|
static char game_state[GAME_STATE_MAX_LEN+2] = " MENU ";
|
||||||
|
|
||||||
|
void set_game_state(const char* new_state) {
|
||||||
|
snprintf(game_state, sizeof(game_state), " %-5s", new_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset_game_state() {
|
||||||
|
set_game_state("");
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcd_print_header_step() {
|
||||||
|
if (!lcd_header_enabled()) return;
|
||||||
|
if (lcd_starcode_displaying_result()) return;
|
||||||
|
|
||||||
|
lcd_print(10, 0, game_state);
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#ifndef GAME_INFO_H
|
||||||
|
#define GAME_INFO_H
|
||||||
|
|
||||||
|
#define GAME_STATE_MAX_LEN 5
|
||||||
|
|
||||||
|
/// @brief Sets the game state, used for the header.
|
||||||
|
///
|
||||||
|
/// Must be <= 5 characters
|
||||||
|
void set_game_state(const char* new_state);
|
||||||
|
|
||||||
|
/// @brief Resets the game state to be blank.
|
||||||
|
void reset_game_state();
|
||||||
|
|
||||||
|
/// @brief Prints the game state section of the header to the char_lcd. (row 0, columns 11-15)
|
||||||
|
void lcd_print_header_step();
|
||||||
|
|
||||||
|
#endif /* GAME_INFO_H */
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#include "i2c.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "esp_err.h"
|
||||||
|
#include "driver/i2c.h"
|
||||||
|
|
||||||
|
static const char *TAG = "i2c";
|
||||||
|
|
||||||
|
SemaphoreHandle_t main_i2c_mutex;
|
||||||
|
|
||||||
|
void init_i2c() {
|
||||||
|
ESP_LOGI(TAG, "Initializing i2c...");
|
||||||
|
|
||||||
|
i2c_config_t conf = {
|
||||||
|
.mode = I2C_MODE_MASTER,
|
||||||
|
.sda_io_num = PIN_I2C_SDA,
|
||||||
|
.scl_io_num = PIN_I2C_SCL,
|
||||||
|
.sda_pullup_en = GPIO_PULLUP_DISABLE,
|
||||||
|
.scl_pullup_en = GPIO_PULLUP_DISABLE,
|
||||||
|
// .sda_pullup_en = GPIO_PULLUP_ENABLE,
|
||||||
|
// .scl_pullup_en = GPIO_PULLUP_ENABLE,
|
||||||
|
.master = {
|
||||||
|
// TODO: 400k?
|
||||||
|
.clk_speed = 100*1000,
|
||||||
|
},
|
||||||
|
.clk_flags = I2C_SCLK_SRC_FLAG_FOR_NOMAL
|
||||||
|
};
|
||||||
|
|
||||||
|
ESP_ERROR_CHECK(i2c_param_config(MAIN_I2C_BUS_NUM, &conf));
|
||||||
|
ESP_ERROR_CHECK(i2c_driver_install(MAIN_I2C_BUS_NUM, conf.mode, 0, 0, 0));
|
||||||
|
|
||||||
|
main_i2c_mutex = xSemaphoreCreateMutex();
|
||||||
|
assert(main_i2c_mutex != NULL);
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "i2c initialized!");
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
#ifndef I2C_H
|
||||||
|
#define I2C_H
|
||||||
|
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/semphr.h"
|
||||||
|
|
||||||
|
#define MAIN_I2C_BUS_NUM I2C_NUM_0
|
||||||
|
|
||||||
|
#define PIN_I2C_SDA GPIO_NUM_7
|
||||||
|
#define PIN_I2C_SCL GPIO_NUM_15
|
||||||
|
|
||||||
|
/// The mutex for accessing `I2C_NUM_0`.
|
||||||
|
extern SemaphoreHandle_t main_i2c_mutex;
|
||||||
|
|
||||||
|
/// @brief Initializes `I2C_NUM_0`.
|
||||||
|
///
|
||||||
|
/// This is hooked up the to:
|
||||||
|
/// - The bottom half
|
||||||
|
/// - The char lcd
|
||||||
|
/// - The power board
|
||||||
|
/// - The MPU6050
|
||||||
|
/// - The PERH port
|
||||||
|
/// - The Capacitive Touch Panel
|
||||||
|
void init_i2c();
|
||||||
|
|
||||||
|
#endif /* I2C_H */
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
#include "esp_check.h"
|
#include "esp_check.h"
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
|
#include "i2c.h"
|
||||||
|
|
||||||
#define TAG "I2C_LCD_PCF8574"
|
#define TAG "I2C_LCD_PCF8574"
|
||||||
|
|
||||||
@@ -58,6 +59,7 @@ void lcd_begin(i2c_lcd_pcf8574_handle_t* lcd, uint8_t cols, uint8_t rows) {
|
|||||||
lcd->entrymode = 0x02;
|
lcd->entrymode = 0x02;
|
||||||
|
|
||||||
// The following are the reset sequence: Please see "Initialization instruction in the PCF8574 datasheet."
|
// The following are the reset sequence: Please see "Initialization instruction in the PCF8574 datasheet."
|
||||||
|
xSemaphoreTake(main_i2c_mutex, portMAX_DELAY);
|
||||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||||||
i2c_master_start(cmd);
|
i2c_master_start(cmd);
|
||||||
// We left-shift the device addres and add the read/write command
|
// We left-shift the device addres and add the read/write command
|
||||||
@@ -95,6 +97,7 @@ void lcd_begin(i2c_lcd_pcf8574_handle_t* lcd, uint8_t cols, uint8_t rows) {
|
|||||||
i2c_master_stop(cmd);
|
i2c_master_stop(cmd);
|
||||||
i2c_master_cmd_begin(lcd->i2c_port, cmd, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
|
i2c_master_cmd_begin(lcd->i2c_port, cmd, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
|
||||||
i2c_cmd_link_delete(cmd);
|
i2c_cmd_link_delete(cmd);
|
||||||
|
xSemaphoreGive(main_i2c_mutex);
|
||||||
|
|
||||||
// Instruction: function set = 0x20
|
// Instruction: function set = 0x20
|
||||||
lcd_send(lcd, 0x20 | (rows > 1 ? 0x08 : 0x00), false);
|
lcd_send(lcd, 0x20 | (rows > 1 ? 0x08 : 0x00), false);
|
||||||
@@ -110,7 +113,7 @@ void lcd_clear(i2c_lcd_pcf8574_handle_t* lcd) {
|
|||||||
// Instruction: Clear display = 0x01
|
// Instruction: Clear display = 0x01
|
||||||
lcd_send(lcd, 0x01, false);
|
lcd_send(lcd, 0x01, false);
|
||||||
// Clearing the display takes a while: takes approx. 1.5ms
|
// Clearing the display takes a while: takes approx. 1.5ms
|
||||||
esp_rom_delay_us(1600);
|
esp_rom_delay_us(2000);
|
||||||
} // lcd_clear()
|
} // lcd_clear()
|
||||||
|
|
||||||
// Set the display to home
|
// Set the display to home
|
||||||
@@ -118,7 +121,7 @@ void lcd_home(i2c_lcd_pcf8574_handle_t* lcd) {
|
|||||||
// Instruction: Return home = 0x02
|
// Instruction: Return home = 0x02
|
||||||
lcd_send(lcd, 0x02, false);
|
lcd_send(lcd, 0x02, false);
|
||||||
// Same as clearing the display: takes approx. 1.5ms
|
// Same as clearing the display: takes approx. 1.5ms
|
||||||
esp_rom_delay_us(1600);
|
esp_rom_delay_us(2000);
|
||||||
} // lcd_home()
|
} // lcd_home()
|
||||||
|
|
||||||
// Set the cursor to a new position.
|
// Set the cursor to a new position.
|
||||||
@@ -238,7 +241,7 @@ void lcd_set_backlight(i2c_lcd_pcf8574_handle_t* lcd, uint8_t brightness) {
|
|||||||
} // lcd_set_backlight()
|
} // lcd_set_backlight()
|
||||||
|
|
||||||
// Custom character creation: allows us to create up to 8 custom characters in the CGRAM locations
|
// Custom character creation: allows us to create up to 8 custom characters in the CGRAM locations
|
||||||
void lcd_create_char(i2c_lcd_pcf8574_handle_t* lcd, uint8_t location, uint8_t charmap[]) {
|
void lcd_create_char(i2c_lcd_pcf8574_handle_t* lcd, uint8_t location, const uint8_t charmap[]) {
|
||||||
location &= 0x7; // Only 8 locations are available
|
location &= 0x7; // Only 8 locations are available
|
||||||
// Set the CGRAM address
|
// Set the CGRAM address
|
||||||
lcd_send(lcd, 0x40 | (location << 3), false);
|
lcd_send(lcd, 0x40 | (location << 3), false);
|
||||||
@@ -295,6 +298,7 @@ void lcd_print_number(i2c_lcd_pcf8574_handle_t* lcd, uint8_t col, uint8_t row, u
|
|||||||
|
|
||||||
|
|
||||||
static void lcd_send(i2c_lcd_pcf8574_handle_t* lcd, uint8_t value, bool is_data) {
|
static void lcd_send(i2c_lcd_pcf8574_handle_t* lcd, uint8_t value, bool is_data) {
|
||||||
|
xSemaphoreTake(main_i2c_mutex, portMAX_DELAY);
|
||||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||||||
i2c_master_start(cmd);
|
i2c_master_start(cmd);
|
||||||
i2c_master_write_byte(cmd, (lcd->i2c_addr << 1) | I2C_MASTER_WRITE, true);
|
i2c_master_write_byte(cmd, (lcd->i2c_addr << 1) | I2C_MASTER_WRITE, true);
|
||||||
@@ -303,6 +307,7 @@ static void lcd_send(i2c_lcd_pcf8574_handle_t* lcd, uint8_t value, bool is_data)
|
|||||||
i2c_master_stop(cmd);
|
i2c_master_stop(cmd);
|
||||||
esp_err_t ret = i2c_master_cmd_begin(lcd->i2c_port, cmd, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
|
esp_err_t ret = i2c_master_cmd_begin(lcd->i2c_port, cmd, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
|
||||||
i2c_cmd_link_delete(cmd);
|
i2c_cmd_link_delete(cmd);
|
||||||
|
xSemaphoreGive(main_i2c_mutex);
|
||||||
|
|
||||||
if (ret != ESP_OK) {
|
if (ret != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Failed to send data to LCD: %s", esp_err_to_name(ret));
|
ESP_LOGE(TAG, "Failed to send data to LCD: %s", esp_err_to_name(ret));
|
||||||
@@ -341,6 +346,7 @@ static void lcd_write_i2c(i2c_lcd_pcf8574_handle_t* lcd, uint8_t data, bool is_d
|
|||||||
data |= lcd->backlight_mask;
|
data |= lcd->backlight_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xSemaphoreTake(main_i2c_mutex, portMAX_DELAY);
|
||||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||||||
i2c_master_start(cmd);
|
i2c_master_start(cmd);
|
||||||
i2c_master_write_byte(cmd, (lcd->i2c_addr << 1) | I2C_MASTER_WRITE, true);
|
i2c_master_write_byte(cmd, (lcd->i2c_addr << 1) | I2C_MASTER_WRITE, true);
|
||||||
@@ -348,6 +354,7 @@ static void lcd_write_i2c(i2c_lcd_pcf8574_handle_t* lcd, uint8_t data, bool is_d
|
|||||||
i2c_master_stop(cmd);
|
i2c_master_stop(cmd);
|
||||||
esp_err_t ret = i2c_master_cmd_begin(lcd->i2c_port, cmd, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
|
esp_err_t ret = i2c_master_cmd_begin(lcd->i2c_port, cmd, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
|
||||||
i2c_cmd_link_delete(cmd);
|
i2c_cmd_link_delete(cmd);
|
||||||
|
xSemaphoreGive(main_i2c_mutex);
|
||||||
|
|
||||||
if (ret != ESP_OK) {
|
if (ret != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Failed to write to LCD: %s", esp_err_to_name(ret));
|
ESP_LOGE(TAG, "Failed to write to LCD: %s", esp_err_to_name(ret));
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ void lcd_no_autoscroll(i2c_lcd_pcf8574_handle_t* lcd);
|
|||||||
void lcd_set_backlight(i2c_lcd_pcf8574_handle_t* lcd, uint8_t brightness);
|
void lcd_set_backlight(i2c_lcd_pcf8574_handle_t* lcd, uint8_t brightness);
|
||||||
|
|
||||||
// Create a custom character
|
// Create a custom character
|
||||||
void lcd_create_char(i2c_lcd_pcf8574_handle_t* lcd, uint8_t location, uint8_t charmap[]);
|
void lcd_create_char(i2c_lcd_pcf8574_handle_t* lcd, uint8_t location, const uint8_t charmap[]);
|
||||||
|
|
||||||
// Write a character to the LCD
|
// Write a character to the LCD
|
||||||
void lcd_write(i2c_lcd_pcf8574_handle_t* lcd, uint8_t value);
|
void lcd_write(i2c_lcd_pcf8574_handle_t* lcd, uint8_t value);
|
||||||
|
|||||||
+62
-6
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(led_strip_refresh(leds));
|
|
||||||
}
|
}
|
||||||
+62
-28
@@ -1,40 +1,74 @@
|
|||||||
#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_0
|
||||||
// 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 {
|
// TODO: sepperate the indicator leds from the shape display.
|
||||||
shape1 = 0,
|
enum IndicatorLED {
|
||||||
shape2 = 1,
|
LED_SHAPE1 = 0u,
|
||||||
shape3 = 2,
|
LED_SHAPE2 = 1u,
|
||||||
shape4 = 3,
|
LED_SHAPE3 = 2u,
|
||||||
module_sseg = 4,
|
LED_SHAPE4 = 3u,
|
||||||
game_sseg = 5,
|
LED_MODULE_SSEG = 4u,
|
||||||
tft = 6,
|
LED_GAME_SSEG = 5u,
|
||||||
mic = 7,
|
LED_TFT = 6u,
|
||||||
ir_led = 8,
|
LED_MIC = 7u,
|
||||||
speaker = 9,
|
LED_IR_LED = 8u,
|
||||||
rfid = 10,
|
LED_SPEAKER = 9u,
|
||||||
keypad = 11,
|
LED_RFID = 10u,
|
||||||
char_lcd = 12,
|
LED_KEYPAD = 11u,
|
||||||
switch4 = 13,
|
LED_LCD = 12u,
|
||||||
switch3 = 14,
|
LED_S4 = 13u,
|
||||||
switch2 = 15,
|
LED_S3 = 14u,
|
||||||
switch1 = 16,
|
LED_S2 = 15u,
|
||||||
button4 = 17,
|
LED_S1 = 16u,
|
||||||
button3 = 18,
|
LED_B4 = 17u,
|
||||||
button2 = 19,
|
LED_B3 = 18u,
|
||||||
button1 = 20,
|
LED_B2 = 19u,
|
||||||
} Led;
|
LED_B1 = 20u,
|
||||||
|
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 */
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
#include "perh.h"
|
||||||
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#ifndef PERH_H
|
||||||
|
#define PERH_H
|
||||||
|
|
||||||
|
#include "driver/gpio.h"
|
||||||
|
|
||||||
|
#define PIN_PERH0 GPIO_NUM_6
|
||||||
|
#define PIN_PERH1 GPIO_NUM_5
|
||||||
|
#define PIN_PERH2 GPIO_NUM_4
|
||||||
|
#define PIN_PERH3 GPIO_NUM_2
|
||||||
|
#define PIN_PERH4 GPIO_NUM_1
|
||||||
|
|
||||||
|
#endif /* PERH_H */
|
||||||
+32
-1
@@ -1,7 +1,9 @@
|
|||||||
#include "power.h"
|
#include "power.h"
|
||||||
#include "char_lcd.h"
|
#include "char_lcd.h"
|
||||||
|
#include "starcode.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 +38,41 @@ 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!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t get_bat_voltage() {
|
||||||
|
return lipo.voltage();
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcd_print_header_bat() {
|
||||||
|
if (!lcd_header_enabled()) return;
|
||||||
|
if (lcd_starcode_displaying_result()) return;
|
||||||
|
|
||||||
|
uint8_t soc = lipo.soc();
|
||||||
|
uint8_t current = lipo.current();
|
||||||
|
char buf[6];
|
||||||
|
if (soc < 5 && current <= 0) {
|
||||||
|
snprintf(buf, sizeof(buf), " LOW");
|
||||||
|
} else if (soc == 100) {
|
||||||
|
snprintf(buf, sizeof(buf), " 100");
|
||||||
|
} else {
|
||||||
|
if (current > 0) {
|
||||||
|
snprintf(buf, sizeof(buf), " %2d+", soc);
|
||||||
|
} else {
|
||||||
|
snprintf(buf, sizeof(buf), " %2d%%", soc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lcd_print(16, 0, buf);
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,12 +2,19 @@
|
|||||||
#define POWER_H
|
#define POWER_H
|
||||||
|
|
||||||
#include "SparkFunBQ27441/SparkFunBQ27441.h"
|
#include "SparkFunBQ27441/SparkFunBQ27441.h"
|
||||||
#include <esp_log.h>
|
|
||||||
|
extern volatile uint32_t battery_charge;
|
||||||
|
|
||||||
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();
|
||||||
|
|
||||||
|
/// @brief Prints the battery section of the header to the char_lcd. (row 0, columns 17-19)
|
||||||
|
void lcd_print_header_bat();
|
||||||
|
|
||||||
#endif /* POWER_H */
|
#endif /* POWER_H */
|
||||||
+6
-6
@@ -12,12 +12,12 @@
|
|||||||
|
|
||||||
extern sdmmc_card_t *card;
|
extern sdmmc_card_t *card;
|
||||||
|
|
||||||
#define SD_PIN_CLK GPIO_NUM_48
|
#define SD_PIN_CLK GPIO_NUM_39
|
||||||
#define SD_PIN_CMD GPIO_NUM_45
|
#define SD_PIN_CMD GPIO_NUM_40
|
||||||
#define SD_PIN_D0 GPIO_NUM_47
|
#define SD_PIN_D0 GPIO_NUM_38
|
||||||
#define SD_PIN_D1 GPIO_NUM_21
|
#define SD_PIN_D1 GPIO_NUM_45
|
||||||
#define SD_PIN_D2 GPIO_NUM_39
|
#define SD_PIN_D2 GPIO_NUM_42
|
||||||
#define SD_PIN_D3 GPIO_NUM_38
|
#define SD_PIN_D3 GPIO_NUM_41
|
||||||
|
|
||||||
/// @brief Initializes the SD card
|
/// @brief Initializes the SD card
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -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!");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,8 +15,8 @@
|
|||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "sd.h"
|
#include "sd.h"
|
||||||
|
|
||||||
#define SPEAKER_PIN_BCLK GPIO_NUM_46
|
#define SPEAKER_PIN_BCLK GPIO_NUM_11
|
||||||
#define SPEAKER_PIN_WS GPIO_NUM_9
|
#define SPEAKER_PIN_WS GPIO_NUM_12
|
||||||
#define SPEAKER_PIN_DOUT GPIO_NUM_3
|
#define SPEAKER_PIN_DOUT GPIO_NUM_3
|
||||||
#define SAMPLE_RATE 44100
|
#define SAMPLE_RATE 44100
|
||||||
// The maximum number of clips that can be queued at one time.
|
// The maximum number of clips that can be queued at one time.
|
||||||
@@ -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.
|
||||||
|
|||||||
+82
-1
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -4,8 +4,8 @@
|
|||||||
#include "TM1640/TM1640.h"
|
#include "TM1640/TM1640.h"
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
|
|
||||||
#define SSEG_PIN_DATA GPIO_NUM_10
|
#define SSEG_PIN_DATA GPIO_NUM_46
|
||||||
#define SSEG_PIN_CLK GPIO_NUM_11
|
#define SSEG_PIN_CLK GPIO_NUM_48
|
||||||
|
|
||||||
extern TM1640* sseg;
|
extern TM1640* sseg;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,256 @@
|
|||||||
|
#include "starcode.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <esp_log.h>
|
||||||
|
#include "drivers/bottom_half.h"
|
||||||
|
#include "char_lcd.h"
|
||||||
|
#include "esp_timer.h"
|
||||||
|
|
||||||
|
static const char* TAG = "star_code";
|
||||||
|
|
||||||
|
volatile bool handling_new_starcodes = false;
|
||||||
|
static volatile bool system_initialized = false;
|
||||||
|
|
||||||
|
// TODO: use the semaphore, convert to RWLock?
|
||||||
|
static volatile SemaphoreHandle_t star_codes_sem;
|
||||||
|
static std::vector<StarCodeEntry> star_codes;
|
||||||
|
|
||||||
|
static const char EMPTY_STAR_CODE_HEADER[] = " ";
|
||||||
|
|
||||||
|
esp_timer_handle_t starcode_delay_timer;
|
||||||
|
/// @brief `true` if we are delaying for a starcode
|
||||||
|
static volatile bool delaying_for_starcode;
|
||||||
|
static volatile StarCodeEntry* current_starcode = nullptr;
|
||||||
|
/// @brief `true` when we are handling user input for a starcode
|
||||||
|
static volatile bool doing_starcode = false;
|
||||||
|
static uint16_t starcode_waiting_on_release;
|
||||||
|
static char current[STARCODE_MAX_LEN + 1];
|
||||||
|
static size_t current_idx;
|
||||||
|
|
||||||
|
static void starcode_trigger_cb(void* arg) {
|
||||||
|
(void) arg;
|
||||||
|
|
||||||
|
delaying_for_starcode = false;
|
||||||
|
|
||||||
|
if (current_starcode != nullptr) {
|
||||||
|
if (current_starcode->triggered_sem != nullptr)
|
||||||
|
xSemaphoreGive(current_starcode->triggered_sem);
|
||||||
|
if (current_starcode->callback != nullptr)
|
||||||
|
(current_starcode->callback)();
|
||||||
|
|
||||||
|
current_starcode = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: rename star code everywhere to starcode
|
||||||
|
lcd_print_header();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void star_code_handle_keypad(uint16_t* just_pressed, uint16_t* just_released) {
|
||||||
|
if ((!delaying_for_starcode) && handling_new_starcodes && (*just_pressed & (1 << KeypadKey::star))) {
|
||||||
|
current_idx = 0;
|
||||||
|
current[current_idx] = '\0';
|
||||||
|
doing_starcode = true;
|
||||||
|
}
|
||||||
|
if (doing_starcode) {
|
||||||
|
// If we get a press while handling a starcode, we also want to capture the release of that key.
|
||||||
|
starcode_waiting_on_release |= *just_pressed;
|
||||||
|
|
||||||
|
KeypadKey key;
|
||||||
|
while (take_key(&key, just_pressed)) {
|
||||||
|
if (key == KeypadKey::star) {
|
||||||
|
current_idx = 0;
|
||||||
|
current[current_idx] = '\0';
|
||||||
|
} else if (key == KeypadKey::pound) {
|
||||||
|
doing_starcode = false;
|
||||||
|
if (current_idx != 0) {
|
||||||
|
trigger_star_code(current);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// shift the digits left if neccesary
|
||||||
|
if (current_idx >= STARCODE_MAX_LEN) {
|
||||||
|
for (int i = 1; i < current_idx; i++) {
|
||||||
|
current[i-1] = current[i];
|
||||||
|
}
|
||||||
|
current_idx--;
|
||||||
|
}
|
||||||
|
// append the character
|
||||||
|
current[current_idx++] = char_of_keypad_key(key);
|
||||||
|
current[current_idx] = '\0';
|
||||||
|
}
|
||||||
|
lcd_print_header_star_code();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// capture any releases from starcodes
|
||||||
|
uint16_t new_just_released = (*just_released) & (~starcode_waiting_on_release);
|
||||||
|
starcode_waiting_on_release = starcode_waiting_on_release & (~*just_released);
|
||||||
|
*just_released = new_just_released;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_star_code_system() {
|
||||||
|
star_codes_sem = xSemaphoreCreateBinary();
|
||||||
|
xSemaphoreGive(star_codes_sem);
|
||||||
|
|
||||||
|
const esp_timer_create_args_t timer_args = {
|
||||||
|
.callback = &starcode_trigger_cb,
|
||||||
|
.arg = nullptr,
|
||||||
|
.dispatch_method = ESP_TIMER_TASK,
|
||||||
|
.name = "starcode_trigger",
|
||||||
|
.skip_unhandled_events = false,
|
||||||
|
};
|
||||||
|
|
||||||
|
ESP_ERROR_CHECK(esp_timer_create(&timer_args, &starcode_delay_timer));
|
||||||
|
|
||||||
|
handling_new_starcodes = true;
|
||||||
|
system_initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Checks if a triggered code matches an expected code.
|
||||||
|
/// @return true iff the codes match, where '*'s in the expected code can match any character in the triggered code
|
||||||
|
static bool check_code_match(const char* triggered, const char* expected) {
|
||||||
|
size_t triggered_len = strlen(triggered);
|
||||||
|
size_t match_len = strlen(triggered);
|
||||||
|
|
||||||
|
if (triggered_len != match_len)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (int i = 0; i < triggered_len; i++) {
|
||||||
|
if (!(expected[i] == '*' || expected[i] == triggered[i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool add_star_code(StarCodeEntry code) {
|
||||||
|
ESP_LOGI(TAG, "Adding starcode: %s", code.code);
|
||||||
|
if (code.code == nullptr || strlen(code.code) > STARCODE_MAX_LEN) {
|
||||||
|
ESP_LOGW(TAG, "invalid code");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (code.display_text != nullptr && strlen(code.display_text) > STARCODE_DISPLAY_TEXT_MAX_LEN) {
|
||||||
|
ESP_LOGW(TAG, "invalid display_text");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for a existing entry
|
||||||
|
auto it = std::find_if(star_codes.begin(), star_codes.end(), [&](const StarCodeEntry& other) {
|
||||||
|
return check_code_match(code.code, other.code);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (it != star_codes.end()) {
|
||||||
|
// existing star code found!
|
||||||
|
ESP_LOGW(TAG, "Duplicate starcode %s", code.code);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
star_codes.push_back(code);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool add_star_codes(const StarCodeEntry* codes, size_t len) {
|
||||||
|
bool success = true;
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
if (!add_star_code(codes[i])) {
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rm_star_code(const char* code) {
|
||||||
|
ESP_LOGI(TAG, "Removing starcode: %s", code);
|
||||||
|
|
||||||
|
auto it = std::find_if(star_codes.begin(), star_codes.end(), [&](const StarCodeEntry& star_code) {
|
||||||
|
return strcmp(code, star_code.code) == 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (it == star_codes.end()) {
|
||||||
|
ESP_LOGW(TAG, "Failed to remove star code %s", code);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
star_codes.erase(it);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rm_star_codes(const StarCodeEntry* codes, size_t len) {
|
||||||
|
bool success = true;
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
if (!rm_star_code(codes[i].code)) {
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rm_star_codes_str(const char** codes, size_t len) {
|
||||||
|
bool success = true;
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
if (!rm_star_code(codes[i])) {
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_star_codes() {
|
||||||
|
star_codes.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool trigger_star_code(const char* code) {
|
||||||
|
auto it = std::find_if(star_codes.begin(), star_codes.end(), [&](const StarCodeEntry& other) {
|
||||||
|
return check_code_match(code, other.code);
|
||||||
|
});
|
||||||
|
|
||||||
|
uint64_t delay_us = 2'000'000;
|
||||||
|
delaying_for_starcode = true;
|
||||||
|
if (it != star_codes.end()) {
|
||||||
|
current_starcode = &*it;
|
||||||
|
delay_us = current_starcode->delay_us;
|
||||||
|
}
|
||||||
|
|
||||||
|
ESP_ERROR_CHECK(esp_timer_start_once(starcode_delay_timer, delay_us));
|
||||||
|
|
||||||
|
return current_starcode != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pause_star_code_system() {
|
||||||
|
doing_starcode = false;
|
||||||
|
handling_new_starcodes = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void resume_star_code_system() {
|
||||||
|
handling_new_starcodes = system_initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcd_print_header_star_code() {
|
||||||
|
if (!lcd_header_enabled()) return;
|
||||||
|
|
||||||
|
// TODO: consider upping the display text size to be able to overwrite the game_state area.
|
||||||
|
if (delaying_for_starcode) {
|
||||||
|
if (current_starcode == nullptr) {
|
||||||
|
lcd_print(0, 0, "Invalid starcode ");
|
||||||
|
} else if (current_starcode->display_text != nullptr) {
|
||||||
|
char buf[21];
|
||||||
|
snprintf(buf, sizeof(buf), "%-20s", current_starcode->display_text);
|
||||||
|
lcd_print(0, 0, buf);
|
||||||
|
} else {
|
||||||
|
lcd_print(0, 0, EMPTY_STAR_CODE_HEADER);
|
||||||
|
}
|
||||||
|
} else if (doing_starcode) {
|
||||||
|
char buf[STARCODE_MAX_LEN + 2];
|
||||||
|
snprintf(buf, sizeof(buf), "*%-9s", current);
|
||||||
|
lcd_print(0, 0, buf);
|
||||||
|
} else {
|
||||||
|
lcd_print(0, 0, EMPTY_STAR_CODE_HEADER);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool lcd_starcode_displaying_result() {
|
||||||
|
return delaying_for_starcode;
|
||||||
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
#ifndef STAR_CODE_H
|
||||||
|
#define STAR_CODE_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <freertos/FreeRTOS.h>
|
||||||
|
#include <freertos/semphr.h>
|
||||||
|
|
||||||
|
/// The max length of a starcode (not counting the star)
|
||||||
|
#define STARCODE_MAX_LEN 9
|
||||||
|
#define STARCODE_DISPLAY_TEXT_MAX_LEN 20
|
||||||
|
|
||||||
|
/// @brief A handler for a specific star code
|
||||||
|
struct StarCodeEntry {
|
||||||
|
/// @brief The star code without the star
|
||||||
|
///
|
||||||
|
/// This must be <= 9 characters.
|
||||||
|
///
|
||||||
|
/// You may include a * in the code to match on any character
|
||||||
|
const char* code;
|
||||||
|
/// @brief The text to display when the star code is entered (or null).
|
||||||
|
///
|
||||||
|
/// This must be <= 20 characters.
|
||||||
|
const char* display_text;
|
||||||
|
/// @brief The number of microseconds to delay when the star code is entered before calling the handler.
|
||||||
|
uint64_t delay_us;
|
||||||
|
/// @brief The function to call when the star code is entered.
|
||||||
|
/// Can be null.
|
||||||
|
void (*callback)(void);
|
||||||
|
/// @brief The binary semaphore that will be given when this star code is triggered.
|
||||||
|
/// Can be null.
|
||||||
|
SemaphoreHandle_t triggered_sem;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @brief Initializes the star code system.
|
||||||
|
void init_star_code_system();
|
||||||
|
|
||||||
|
/// @brief Handles any keypad presses and releases before they bubble up to the rest of the BLK_BOX.
|
||||||
|
void star_code_handle_keypad(uint16_t* just_pressed, uint16_t* just_released);
|
||||||
|
|
||||||
|
/// @brief Adds a star code to be handled.
|
||||||
|
/// @param code the star code to add
|
||||||
|
/// @return true iff the star code was added
|
||||||
|
bool add_star_code(StarCodeEntry code);
|
||||||
|
|
||||||
|
/// @brief Adds a list of star codes to be handled.
|
||||||
|
/// @param codes the list of star codes to add
|
||||||
|
/// @param len the length of the list
|
||||||
|
/// @return true iff all the star codes were added
|
||||||
|
bool add_star_codes(const StarCodeEntry* codes, size_t len);
|
||||||
|
|
||||||
|
/// @brief removes a star code to stop handling it.
|
||||||
|
/// @param code the star code to remove
|
||||||
|
/// @return true iff the star code was removed
|
||||||
|
bool rm_star_code(const char* code);
|
||||||
|
|
||||||
|
/// @brief removes all given star codes to stop handling them.
|
||||||
|
/// @param codes the list of star codes to remove
|
||||||
|
/// @param len the length of the list
|
||||||
|
/// @return true iff all star codes were removed
|
||||||
|
bool rm_star_codes(const StarCodeEntry* codes, size_t len);
|
||||||
|
|
||||||
|
/// @brief removes all given star codes to stop handling them.
|
||||||
|
/// @param codes the list of star codes to remove
|
||||||
|
/// @param len the length of the list
|
||||||
|
/// @return true iff all star codes were removed
|
||||||
|
bool rm_star_codes_str(const char** codes, size_t len);
|
||||||
|
|
||||||
|
/// @brief clears all star codes.
|
||||||
|
void clear_star_codes();
|
||||||
|
|
||||||
|
/// @brief Triggers the given star code.
|
||||||
|
/// @param code the star code to trigger (without the *)
|
||||||
|
/// @return true iff a star code was triggered
|
||||||
|
bool trigger_star_code(const char* code);
|
||||||
|
|
||||||
|
|
||||||
|
/// @brief Starts/stops the star code system from handling new star codes.
|
||||||
|
/// If one is being handled currently, it is canceled.
|
||||||
|
void set_star_code_sys_enabled(bool enable);
|
||||||
|
|
||||||
|
/// @return `true` iff the star code system is handling star codes.
|
||||||
|
bool star_code_sys_enabled();
|
||||||
|
|
||||||
|
/// @brief Prints the star code section of the header to the char_lcd. (row 0, columns 0-9)
|
||||||
|
void lcd_print_header_star_code();
|
||||||
|
|
||||||
|
/// @return `true` iff the starcode system is using the full header.
|
||||||
|
bool lcd_starcode_displaying_result();
|
||||||
|
|
||||||
|
#endif /* STAR_CODE_H */
|
||||||
@@ -0,0 +1,225 @@
|
|||||||
|
#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;
|
||||||
|
}
|
||||||
@@ -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 */
|
||||||
+59
-13
@@ -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!");
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -44,11 +44,11 @@
|
|||||||
#define SPI_MAX_TRANSFER_SIZE 32768
|
#define SPI_MAX_TRANSFER_SIZE 32768
|
||||||
|
|
||||||
#define TFT_PIN_MOSI GPIO_NUM_17
|
#define TFT_PIN_MOSI GPIO_NUM_17
|
||||||
#define TFT_PIN_MISO GPIO_NUM_18
|
#define TFT_PIN_MISO GPIO_NUM_16
|
||||||
#define TFT_PIN_CLK GPIO_NUM_16
|
#define TFT_PIN_CLK GPIO_NUM_18
|
||||||
#define TFT_PIN_CS GPIO_NUM_NC
|
#define TFT_PIN_CS GPIO_NUM_NC
|
||||||
#define TFT_PIN_DC GPIO_NUM_15
|
#define TFT_PIN_DC GPIO_NUM_8
|
||||||
#define TFT_PIN_RESET GPIO_NUM_8
|
#define TFT_PIN_RESET GPIO_NUM_9
|
||||||
|
|
||||||
#define TFT_INVERT_COLOR false
|
#define TFT_INVERT_COLOR false
|
||||||
|
|
||||||
|
|||||||
+14
-7
@@ -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;
|
||||||
@@ -22,17 +26,17 @@ static void receive_button(void);
|
|||||||
void init_wires(void) {
|
void init_wires(void) {
|
||||||
i2c_config_t wires_conf = {
|
i2c_config_t wires_conf = {
|
||||||
.mode = I2C_MODE_MASTER,
|
.mode = I2C_MODE_MASTER,
|
||||||
.sda_io_num = GPIO_NUM_41,
|
.sda_io_num = PIN_WIRES_SDA,
|
||||||
.scl_io_num = GPIO_NUM_42,
|
.scl_io_num = PIN_WIRES_SCL,
|
||||||
.sda_pullup_en = GPIO_PULLUP_ENABLE,
|
.sda_pullup_en = GPIO_PULLUP_ENABLE,
|
||||||
.scl_pullup_en = GPIO_PULLUP_ENABLE,
|
.scl_pullup_en = GPIO_PULLUP_ENABLE,
|
||||||
.master = {
|
.master = {
|
||||||
.clk_speed = 100000,
|
.clk_speed = 100000,
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio_reset_pin(GPIO_NUM_41);
|
gpio_reset_pin(PIN_WIRES_SDA);
|
||||||
gpio_reset_pin(GPIO_NUM_42);
|
gpio_reset_pin(PIN_WIRES_SCL);
|
||||||
|
|
||||||
ESP_ERROR_CHECK(i2c_param_config(WIRES_I2C_NUM, &wires_conf));
|
ESP_ERROR_CHECK(i2c_param_config(WIRES_I2C_NUM, &wires_conf));
|
||||||
ESP_ERROR_CHECK(i2c_driver_install(WIRES_I2C_NUM, wires_conf.mode, 0, 0, 0));
|
ESP_ERROR_CHECK(i2c_driver_install(WIRES_I2C_NUM, wires_conf.mode, 0, 0, 0));
|
||||||
@@ -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,14 +7,22 @@
|
|||||||
#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"
|
||||||
|
#include "perh.h"
|
||||||
|
|
||||||
#define WIRES_PIN_DELTA GPIO_NUM_2
|
#define WIRES_PIN_DELTA PIN_PERH3
|
||||||
|
#define PIN_WIRES_SDA PIN_PERH1
|
||||||
|
#define PIN_WIRES_SCL PIN_PERH2
|
||||||
#define WIRES_I2C_NUM I2C_NUM_1
|
#define WIRES_I2C_NUM I2C_NUM_1
|
||||||
#define WIRES_I2C_ADDR 125
|
#define WIRES_I2C_ADDR 125
|
||||||
|
|
||||||
#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);
|
||||||
|
|||||||
@@ -0,0 +1,152 @@
|
|||||||
|
#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;
|
||||||
|
|
||||||
|
static int index_of_style(lv_style_t* style) {
|
||||||
|
for (size_t i = 0; i < style_table.size(); i++) {
|
||||||
|
if (style_table[i] == style) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int index_of_obj(lv_obj_t* obj) {
|
||||||
|
for (size_t i = 0; i < obj_table.size(); i++) {
|
||||||
|
if (obj_table[i] == obj) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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()) {
|
||||||
|
int obj_index = index_of_obj(obj);
|
||||||
|
char buf[64];
|
||||||
|
sprintf(buf, "%d,%d,%ld", obj_index, value.full, selector);
|
||||||
|
event_occured("lv_obj_set_style_bg_color", buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wlv_style_set_text_color() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_style_set_text_align() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_obj_align() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_obj_set_size() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_obj_add_style() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_obj_set_style_text_align() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_label_set_text() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_scr_load() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_scr_act() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_style_set_bg_color() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_style_set_bg_opa() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_obj_set_width() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_style_set_text_font() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_label_create() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_obj_del() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_obj_center() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_obj_remove_style() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_obj_add_flag() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlv_obj_clear_flag() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#ifndef WLVGL_H
|
||||||
|
#define WLVGL_H
|
||||||
|
|
||||||
|
#include "lvgl.h"
|
||||||
|
#include "state_tracking.h"
|
||||||
|
|
||||||
|
void reset_wlv_tables();
|
||||||
|
|
||||||
|
lv_obj_t* 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);
|
||||||
|
void wlv_style_set_text_color();
|
||||||
|
void wlv_style_set_text_align();
|
||||||
|
void wlv_obj_align();
|
||||||
|
void wlv_obj_set_size();
|
||||||
|
void wlv_obj_add_style();
|
||||||
|
void wlv_obj_set_style_text_align();
|
||||||
|
void wlv_label_set_text();
|
||||||
|
void wlv_scr_load();
|
||||||
|
void wlv_scr_act();
|
||||||
|
void wlv_style_set_bg_color();
|
||||||
|
void wlv_style_set_bg_opa();
|
||||||
|
void wlv_obj_set_width();
|
||||||
|
void wlv_style_set_text_font();
|
||||||
|
void wlv_label_create();
|
||||||
|
void wlv_obj_del();
|
||||||
|
void wlv_obj_center();
|
||||||
|
void wlv_obj_remove_style();
|
||||||
|
void wlv_obj_add_flag();
|
||||||
|
void wlv_obj_clear_flag();
|
||||||
|
|
||||||
|
#endif /* WLVGL_H */
|
||||||
+91
-92
@@ -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();
|
||||||
@@ -17,112 +17,111 @@ void clean_bomb(void) {
|
|||||||
set_module_sseg_raw(clear);
|
set_module_sseg_raw(clear);
|
||||||
|
|
||||||
// clear char lcd
|
// clear char lcd
|
||||||
lcd_clear();
|
|
||||||
lcd_set_cursor_vis(false);
|
lcd_set_cursor_vis(false);
|
||||||
lcd_cursor_home();
|
lcd_clear();
|
||||||
|
|
||||||
|
// TODO: add stuff for starcode system
|
||||||
}
|
}
|
||||||
|
|
||||||
static const int STRING_MAX_LEN = 8;
|
static lv_obj_t* old_scr;
|
||||||
void do_star_codes(StarCodeHandler* star_codes, int star_codes_len) {
|
static lv_obj_t* scr;
|
||||||
KeypadKey key;
|
|
||||||
|
|
||||||
int current_idx = 0;
|
|
||||||
char current[STRING_MAX_LEN+1] = {0};
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
while (get_keypad_pressed(&key)) {
|
|
||||||
if (key == KeypadKey::star) {
|
|
||||||
current[0] = '*';
|
|
||||||
for (int i = 1; i < STRING_MAX_LEN; i++) {
|
|
||||||
current[i] = 0;
|
|
||||||
}
|
|
||||||
current_idx = 1;
|
|
||||||
} else if (key == KeypadKey::pound) {
|
|
||||||
// submit
|
|
||||||
if (current[0] == '\0') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hit = false;
|
|
||||||
for (int i = 0; i < star_codes_len; i++) {
|
|
||||||
StarCodeHandler sch = star_codes[i];
|
|
||||||
if (strcmp(current, sch.code) == 0) {
|
|
||||||
hit = true;
|
|
||||||
lcd_print(1, 2, sch.display_text);
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(2000));
|
|
||||||
if (sch.callback != nullptr) {
|
|
||||||
(sch.callback)();
|
|
||||||
}
|
|
||||||
if (sch.should_exit) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hit) {
|
|
||||||
lcd_print(1, 2, "Invalid Star Code");
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(2000));
|
|
||||||
}
|
|
||||||
|
|
||||||
// clear
|
|
||||||
for (int i = 0; i < STRING_MAX_LEN; i++) {
|
|
||||||
current[i] = 0;
|
|
||||||
}
|
|
||||||
current_idx = 0;
|
|
||||||
} else {
|
|
||||||
// out of room. skip
|
|
||||||
if (current_idx >= STRING_MAX_LEN) break;
|
|
||||||
// no code started.
|
|
||||||
if (current[0] != '*') continue;
|
|
||||||
|
|
||||||
char c = char_of_keypad_key(key);
|
|
||||||
current[current_idx++] = c;
|
|
||||||
}
|
|
||||||
// ESP_LOGI(STEP0_TAG, "Pressed: %c", c);
|
|
||||||
|
|
||||||
lcd_clear();
|
|
||||||
lcd_print(1, 1, current);
|
|
||||||
}
|
|
||||||
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(10));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static lv_style_t game_results_style;
|
static lv_style_t game_results_style;
|
||||||
static lv_obj_t* game_results_label;
|
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_set_text_align(&game_results_style, LV_TEXT_ALIGN_CENTER);
|
|
||||||
|
|
||||||
game_results_label = lv_label_create(lv_scr_act());
|
lv_style_init(&game_results_style);
|
||||||
lv_obj_align(game_results_label, LV_ALIGN_CENTER, 0, 0);
|
lv_style_set_text_color(&game_results_style, lv_color_white());
|
||||||
lv_obj_add_style(game_results_label, &game_results_style, LV_STATE_DEFAULT);
|
lv_style_set_text_align(&game_results_style, LV_TEXT_ALIGN_LEFT);
|
||||||
|
|
||||||
char buf[100] = {0};
|
overall_results_label = lv_label_create(scr);
|
||||||
int32_t time_s = get_game_time();
|
lv_obj_align(overall_results_label, LV_ALIGN_TOP_LEFT, 20, 20);
|
||||||
int32_t time_spent = initial_game_time - time_s;
|
lv_obj_set_size(overall_results_label, 460, 140);
|
||||||
char* time = write_time(time_spent);
|
lv_obj_add_style(overall_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);
|
breakdown_results_label = lv_label_create(scr);
|
||||||
|
lv_obj_align(breakdown_results_label, LV_ALIGN_BOTTOM_LEFT, 20, 0);
|
||||||
|
lv_obj_set_size(breakdown_results_label, 460, 140);
|
||||||
|
lv_obj_add_style(breakdown_results_label, &game_results_style, LV_STATE_DEFAULT);
|
||||||
|
|
||||||
xSemaphoreGive(xGuiSemaphore);
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,20 +10,11 @@
|
|||||||
#include "drivers/speaker.h"
|
#include "drivers/speaker.h"
|
||||||
#include "drivers/tft.h"
|
#include "drivers/tft.h"
|
||||||
|
|
||||||
struct StarCodeHandler {
|
|
||||||
const char* code;
|
|
||||||
const char* display_text;
|
|
||||||
bool should_exit;
|
|
||||||
void (*callback)(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
// TODO: add something for RNG.
|
// TODO: add something for RNG.
|
||||||
// TODO: add something for colors, to make everything consistant.
|
|
||||||
|
|
||||||
/// Clears most persistant bomb state
|
/// Clears most persistant bomb state
|
||||||
void clean_bomb(void);
|
void clean_bomb(void);
|
||||||
void poster_child_task(void* arg);
|
void poster_child_task(void* arg);
|
||||||
void do_star_codes(StarCodeHandler* star_codes, int star_codes_len);
|
|
||||||
void display_game_results();
|
void display_game_results();
|
||||||
|
|
||||||
#endif /* HELPER_H */
|
#endif /* HELPER_H */
|
||||||
|
|||||||
+111
-25
@@ -1,50 +1,67 @@
|
|||||||
|
#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"
|
||||||
|
|
||||||
#include "steps/step0.h"
|
#include "steps/step0.h"
|
||||||
#include "steps/step1.h"
|
#include "steps/p001_step1.h"
|
||||||
#include "steps/step2.h"
|
#include "steps/p001_step2.h"
|
||||||
#include "steps/step3.h"
|
#include "steps/p001_step3.h"
|
||||||
#include "steps/step4.h"
|
#include "steps/p001_step4.h"
|
||||||
#include "steps/step5.h"
|
#include "steps/p001_step5.h"
|
||||||
#include "steps/step6.h"
|
#include "steps/p001_step6.h"
|
||||||
|
#include "steps/p002_step1.h"
|
||||||
|
#include "steps/p002_step2.h"
|
||||||
|
#include "steps/p002_step3.h"
|
||||||
|
#include "steps/p002_step4.h"
|
||||||
|
#include "steps/p002_step5.h"
|
||||||
|
#include "steps/p002_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;
|
||||||
|
uint32_t puzzle = 0;
|
||||||
|
extern uint32_t total_strikes;
|
||||||
|
|
||||||
extern "C" void app_main(void) {
|
static void do_p001() {
|
||||||
printf("app_main\n");
|
set_game_time(initial_game_time);
|
||||||
|
|
||||||
init_drivers();
|
|
||||||
init_tft();
|
|
||||||
init_leds();
|
|
||||||
init_wires();
|
|
||||||
init_power_board();
|
|
||||||
|
|
||||||
clean_bomb();
|
|
||||||
step0();
|
|
||||||
set_game_time(initial_game_time + 1000);
|
|
||||||
start_game_timer();
|
start_game_timer();
|
||||||
|
total_strikes = 0;
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
if (skip_to_step <= 1) step1();
|
current_step = 1;
|
||||||
|
if (skip_to_step <= 1) p001_step1();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
if (skip_to_step <= 2) step2();
|
current_step = 2;
|
||||||
|
if (skip_to_step <= 2) p001_step2();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
if (skip_to_step <= 3) step3();
|
current_step = 3;
|
||||||
|
if (skip_to_step <= 3) p001_step3();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
if (skip_to_step <= 4) step4();
|
current_step = 4;
|
||||||
|
if (skip_to_step <= 4) p001_step4();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
if (skip_to_step <= 5) step5();
|
current_step = 5;
|
||||||
|
if (skip_to_step <= 5) p001_step5();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
if (skip_to_step <= 6) step6();
|
current_step = 6;
|
||||||
|
if (skip_to_step <= 6) p001_step6();
|
||||||
|
start_game_timer();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
|
|
||||||
stop_game_timer();
|
stop_game_timer();
|
||||||
@@ -54,3 +71,72 @@ extern "C" void app_main(void) {
|
|||||||
display_game_results();
|
display_game_results();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void do_p002() {
|
||||||
|
set_game_time(initial_game_time);
|
||||||
|
start_game_timer();
|
||||||
|
total_strikes = 0;
|
||||||
|
clean_bomb();
|
||||||
|
current_step = 1;
|
||||||
|
if (skip_to_step <= 1) p002_step1();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
|
clean_bomb();
|
||||||
|
current_step = 2;
|
||||||
|
if (skip_to_step <= 2) p002_step2();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
|
clean_bomb();
|
||||||
|
current_step = 3;
|
||||||
|
if (skip_to_step <= 3) p002_step3();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
|
clean_bomb();
|
||||||
|
current_step = 4;
|
||||||
|
if (skip_to_step <= 4) p002_step4();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
|
clean_bomb();
|
||||||
|
current_step = 5;
|
||||||
|
if (skip_to_step <= 5) p002_step5();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
|
clean_bomb();
|
||||||
|
current_step = 6;
|
||||||
|
if (skip_to_step <= 6) p002_step6();
|
||||||
|
start_game_timer();
|
||||||
|
step_finish_times[current_step-1] = get_game_time();
|
||||||
|
clean_bomb();
|
||||||
|
|
||||||
|
stop_game_timer();
|
||||||
|
ESP_LOGI(TAG, "Bomb has been diffused. Counter-Terrorists win.");
|
||||||
|
play_clip_wav(MOUNT_POINT "/diffuse.wav", true, false, 3, 0);
|
||||||
|
|
||||||
|
display_game_results();
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void app_main(void) {
|
||||||
|
printf("app_main\n");
|
||||||
|
|
||||||
|
init_drivers();
|
||||||
|
|
||||||
|
// TODO: get wires out of the drivers
|
||||||
|
// TODO: generify the strike system out of wires
|
||||||
|
init_wires();
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
|
||||||
|
clean_bomb();
|
||||||
|
lcd_do_splash();
|
||||||
|
step0();
|
||||||
|
|
||||||
|
if (puzzle == 1) {
|
||||||
|
do_p001();
|
||||||
|
} else {
|
||||||
|
do_p002();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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();
|
||||||
|
|
||||||
|
// stop_recording();
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef MAIN_H
|
||||||
|
#define MAIN_H
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
constexpr size_t N_STEPS = 6;
|
||||||
|
|
||||||
|
#endif /* MAIN_H */
|
||||||
@@ -1,13 +1,21 @@
|
|||||||
set(SOURCES
|
set(SOURCES
|
||||||
"setup_wires.cpp"
|
"setup_wires.cpp"
|
||||||
"step0.cpp"
|
"step0.cpp"
|
||||||
"step1.cpp"
|
"p001_step1.cpp"
|
||||||
"step2.cpp"
|
"p001_step2.cpp"
|
||||||
"step3.cpp"
|
"p001_step3.cpp"
|
||||||
"step4.cpp"
|
"p001_step4.cpp"
|
||||||
"step5.cpp"
|
"p001_step5.cpp"
|
||||||
"step6.cpp"
|
"p001_step6.cpp"
|
||||||
|
"p002_step1.cpp"
|
||||||
|
"p002_step2.cpp"
|
||||||
|
"p002_step3.cpp"
|
||||||
|
"p002_step4.cpp"
|
||||||
|
"p002_step5.cpp"
|
||||||
|
"p002_step6.cpp"
|
||||||
"wires_puzzle.cpp"
|
"wires_puzzle.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_subdirectory(tetris_resources)
|
||||||
|
|
||||||
target_sources(${COMPONENT_LIB} PRIVATE ${SOURCES})
|
target_sources(${COMPONENT_LIB} PRIVATE ${SOURCES})
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "step1.h"
|
#include "p001_step1.h"
|
||||||
|
|
||||||
__attribute__((unused))
|
__attribute__((unused))
|
||||||
static const char *TAG = "step1";
|
static const char *TAG = "step1";
|
||||||
@@ -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,26 +203,24 @@ 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();
|
||||||
lcd_set_cursor_pos(1, 1);
|
|
||||||
switch (part) {
|
switch (part) {
|
||||||
case 0:
|
case 0:
|
||||||
lcd_print("COLOR");
|
lcd_print(1, 1, "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(1, 1, "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(1, 1, "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,26 +254,28 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
void step1(void) {
|
void p001_step1(void) {
|
||||||
while (get_switch_flipped(nullptr));
|
while (get_switch_flipped(nullptr));
|
||||||
|
|
||||||
init_step();
|
init_step();
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef P001_STEP_1_H
|
||||||
|
#define P001_STEP_1_H
|
||||||
|
|
||||||
|
#include <random>
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
#include "../helper.h"
|
||||||
|
|
||||||
|
void p001_step1(void);
|
||||||
|
|
||||||
|
#endif /* P001_STEP_1_H */
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "step2.h"
|
#include "p001_step2.h"
|
||||||
|
|
||||||
__attribute__((unused))
|
__attribute__((unused))
|
||||||
static const char *TAG = "step2";
|
static const char *TAG = "step2";
|
||||||
@@ -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,9 +88,10 @@ 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 p001_step2(void) {
|
||||||
KeypadKey key;
|
KeypadKey key;
|
||||||
int solved_times = 0;
|
int solved_times = 0;
|
||||||
|
|
||||||
@@ -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 {
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#ifndef P001_STEP_2_H
|
||||||
|
#define P001_STEP_2_H
|
||||||
|
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
#include "../helper.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <random>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
void p001_step2(void);
|
||||||
|
|
||||||
|
#endif /* P001_STEP_2_H */
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "step3.h"
|
#include "p001_step3.h"
|
||||||
|
|
||||||
#define ONE_SECOND_TIME 90'000
|
#define ONE_SECOND_TIME 90'000
|
||||||
#define THREE_SECOND_TIME 90'000
|
#define THREE_SECOND_TIME 90'000
|
||||||
@@ -21,6 +21,8 @@ static const char* TONE_FILES[] = {
|
|||||||
MOUNT_POINT "/high-6.wav",
|
MOUNT_POINT "/high-6.wav",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const size_t LCD_STRING_SOMETHING = 0;
|
||||||
|
static const size_t LCD_STRING_NOTHING = 1;
|
||||||
static const char* LCD_STRINGS[] = {
|
static const char* LCD_STRINGS[] = {
|
||||||
"something",
|
"something",
|
||||||
"nothing",
|
"nothing",
|
||||||
@@ -49,31 +51,46 @@ 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] = {
|
const static uint32_t NEOPIXEL_COLOR_IDX_RED = 0;
|
||||||
{20, 0, 0}, // red
|
const static uint32_t NEOPIXEL_COLOR_IDX_YELLOW = 1;
|
||||||
{20, 10, 0}, // orange
|
const static uint32_t NEOPIXEL_COLOR_IDX_GREEN = 2;
|
||||||
{20, 20, 0}, // yellow
|
const static uint32_t NEOPIXEL_COLOR_IDX_BLUE = 3;
|
||||||
{0, 20, 0}, // green
|
const static uint32_t NEOPIXEL_COLOR_IDX_PINK = 4;
|
||||||
{0, 0, 20}, // blue
|
const static uint32_t NEOPIXEL_COLOR_IDX_WHITE = 5;
|
||||||
{20, 0, 20}, // purple
|
const static uint32_t NEOPIXEL_COLOR_IDX_OFF = 6;
|
||||||
{0, 0, 0}, // off
|
static uint32_t NEOPIXEL_COLORS[7] = {
|
||||||
|
LEDColor::LED_COLOR_RED,
|
||||||
|
LEDColor::LED_COLOR_YELLOW,
|
||||||
|
LEDColor::LED_COLOR_GREEN,
|
||||||
|
LEDColor::LED_COLOR_BLUE,
|
||||||
|
LEDColor::LED_COLOR_PINK,
|
||||||
|
LEDColor::LED_COLOR_WHITE,
|
||||||
|
LEDColor::LED_COLOR_OFF,
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool one_second();
|
static bool one_second();
|
||||||
static bool three_second();
|
static bool three_second();
|
||||||
static bool six_second();
|
static bool six_second();
|
||||||
|
|
||||||
void step3(void) {
|
void p001_step3(void) {
|
||||||
StarCodeHandler star_codes[] = {
|
SemaphoreHandle_t continue_sem = xSemaphoreCreateBinary();
|
||||||
{
|
if (continue_sem == nullptr) {
|
||||||
.code = "*1642",
|
ESP_LOGE(TAG, "could not create semaphore");
|
||||||
.display_text = "Starting...",
|
return;
|
||||||
.should_exit = true,
|
}
|
||||||
.callback = nullptr,
|
|
||||||
},
|
StarCodeEntry start_code = {
|
||||||
|
.code = "1642",
|
||||||
|
.display_text = "Starting...",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = nullptr,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
};
|
};
|
||||||
int len = sizeof(star_codes)/sizeof(StarCodeHandler);
|
|
||||||
do_star_codes(star_codes, len);
|
add_star_code(start_code);
|
||||||
|
xSemaphoreTake(continue_sem, portMAX_DELAY);
|
||||||
|
rm_star_code(start_code.code);
|
||||||
|
vSemaphoreDelete(continue_sem);
|
||||||
|
|
||||||
while (times < TIMES_TO_COMPLETE) {
|
while (times < TIMES_TO_COMPLETE) {
|
||||||
tone = tone_dist(gen);
|
tone = tone_dist(gen);
|
||||||
@@ -81,7 +98,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, 1 + (tone/3) * 4, 0);
|
||||||
|
|
||||||
bool correct = false;
|
bool correct = false;
|
||||||
switch (tone % 3) {
|
switch (tone % 3) {
|
||||||
@@ -99,9 +117,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 +156,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 +228,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();
|
||||||
@@ -221,26 +238,26 @@ static bool one_second() {
|
|||||||
int red_led_count = 0;
|
int red_led_count = 0;
|
||||||
int blue_led_count = 0;
|
int blue_led_count = 0;
|
||||||
for (int i = 0; i < LED_COUNT; i++) {
|
for (int i = 0; i < LED_COUNT; i++) {
|
||||||
if (indicator_led_idxs[i] == 0) {
|
if (indicator_led_idxs[i] == NEOPIXEL_COLOR_IDX_RED) {
|
||||||
red_led_count++;
|
red_led_count++;
|
||||||
} else if (indicator_led_idxs[i] == 4) {
|
} else if (indicator_led_idxs[i] == NEOPIXEL_COLOR_IDX_BLUE) {
|
||||||
blue_led_count++;
|
blue_led_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t correct_switches = four_bit_flag(
|
uint8_t correct_switches = four_bit_flag(
|
||||||
speaker_color == 0 || speaker_color == 1 || speaker_color == 2,
|
speaker_color == NEOPIXEL_COLOR_IDX_RED || speaker_color == NEOPIXEL_COLOR_IDX_YELLOW || speaker_color == NEOPIXEL_COLOR_IDX_PINK,
|
||||||
lcd_string_idx == 0 || lcd_string_idx == 1,
|
lcd_string_idx == LCD_STRING_SOMETHING || lcd_string_idx == LCD_STRING_NOTHING,
|
||||||
was_high,
|
was_high,
|
||||||
!was_high
|
!was_high
|
||||||
);
|
);
|
||||||
|
|
||||||
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);
|
||||||
@@ -280,9 +297,9 @@ static bool three_second() {
|
|||||||
int red_led_count = 0;
|
int red_led_count = 0;
|
||||||
int blue_led_count = 0;
|
int blue_led_count = 0;
|
||||||
for (int i = 0; i < LED_COUNT; i++) {
|
for (int i = 0; i < LED_COUNT; i++) {
|
||||||
if (indicator_led_idxs[i] == 0) {
|
if (indicator_led_idxs[i] == NEOPIXEL_COLOR_IDX_RED) {
|
||||||
red_led_count++;
|
red_led_count++;
|
||||||
} else if (indicator_led_idxs[i] == 4) {
|
} else if (indicator_led_idxs[i] == NEOPIXEL_COLOR_IDX_BLUE) {
|
||||||
blue_led_count++;
|
blue_led_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -345,7 +362,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] == NEOPIXEL_COLOR_IDX_RED) || (indicator_led_idxs[IndicatorLED::LED_S2] == NEOPIXEL_COLOR_IDX_OFF);
|
||||||
second_switch_correct_state = second_switch_correct_state || was_high;
|
second_switch_correct_state = second_switch_correct_state || was_high;
|
||||||
|
|
||||||
rng_leds();
|
rng_leds();
|
||||||
@@ -354,17 +371,17 @@ static bool six_second() {
|
|||||||
int green_led_count = 0;
|
int green_led_count = 0;
|
||||||
int blue_led_count = 0;
|
int blue_led_count = 0;
|
||||||
for (int i = 0; i < LED_COUNT; i++) {
|
for (int i = 0; i < LED_COUNT; i++) {
|
||||||
if (indicator_led_idxs[i] == 4) {
|
if (indicator_led_idxs[i] == NEOPIXEL_COLOR_IDX_BLUE) {
|
||||||
blue_led_count++;
|
blue_led_count++;
|
||||||
} else if (indicator_led_idxs[i] == 3) {
|
} else if (indicator_led_idxs[i] == NEOPIXEL_COLOR_IDX_GREEN) {
|
||||||
green_led_count++;
|
green_led_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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] == NEOPIXEL_COLOR_IDX_PINK) {
|
||||||
purple_led_on_bottom_count++;
|
pink_led_on_bottom_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -372,12 +389,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
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef P001_STEP_3_H
|
||||||
|
#define P001_STEP_3_H
|
||||||
|
|
||||||
|
#include <random>
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
#include "../helper.h"
|
||||||
|
|
||||||
|
void p001_step3(void);
|
||||||
|
|
||||||
|
#endif /* P001_STEP_3_H */
|
||||||
@@ -1,31 +1,57 @@
|
|||||||
#include "step4.h"
|
#include "p001_step4.h"
|
||||||
|
|
||||||
__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,32 +374,48 @@ 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 p001_step4() {
|
||||||
StarCodeHandler star_code = {
|
// TODO: extract to helper function
|
||||||
.code = "*3850",
|
SemaphoreHandle_t continue_sem = xSemaphoreCreateBinary();
|
||||||
|
if (continue_sem == nullptr) {
|
||||||
|
ESP_LOGE(TAG, "could not create semaphore");
|
||||||
|
}
|
||||||
|
|
||||||
|
StarCodeEntry start_code = {
|
||||||
|
.code = "3850",
|
||||||
.display_text = "Starting...",
|
.display_text = "Starting...",
|
||||||
.should_exit = true,
|
.delay_us = 2'000'000,
|
||||||
.callback = nullptr,
|
.callback = nullptr,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
};
|
};
|
||||||
do_star_codes(&star_code, 1);
|
|
||||||
|
add_star_code(start_code);
|
||||||
|
xSemaphoreTake(continue_sem, portMAX_DELAY);
|
||||||
|
rm_star_code(start_code.code);
|
||||||
|
vSemaphoreDelete(continue_sem);
|
||||||
|
|
||||||
init_screen();
|
init_screen();
|
||||||
|
|
||||||
while (!play_game(4*60*1000, 2)) fail();
|
while (!play_game(4*60*1000, 2)) fail();
|
||||||
|
// TODO: create constants for common assets, and put them in a folder.
|
||||||
|
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 +429,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 +439,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 +474,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 +552,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 +564,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 +578,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 +591,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 +611,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 +700,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 +714,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 +751,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;
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#ifndef P001_STEP_4_H
|
||||||
|
#define P001_STEP_4_H
|
||||||
|
|
||||||
|
#include <random>
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
#include "../helper.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
|
||||||
|
#define TETRIS_USE_FLASH_IMG
|
||||||
|
#define TETRIS_USE_FLASH_BG_IMG
|
||||||
|
|
||||||
|
void p001_step4(void);
|
||||||
|
|
||||||
|
#endif /* P001_STEP_4_H */
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "step5.h"
|
#include "p001_step5.h"
|
||||||
|
|
||||||
#define TIME_CLEAR 30'000
|
#define TIME_CLEAR 30'000
|
||||||
#define TIME_PLANK 40'000
|
#define TIME_PLANK 40'000
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -178,17 +178,24 @@ bool submit_6(bool* buttons_cycling, bool button_turned_on, int led_off) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void step5(void) {
|
void p001_step5(void) {
|
||||||
StarCodeHandler star_codes[] = {
|
SemaphoreHandle_t continue_sem = xSemaphoreCreateBinary();
|
||||||
{
|
if (continue_sem == nullptr) {
|
||||||
.code = "*2648",
|
ESP_LOGE(TAG, "could not create semaphore");
|
||||||
.display_text = "Starting...",
|
}
|
||||||
.should_exit = true,
|
|
||||||
.callback = nullptr,
|
StarCodeEntry start_code = {
|
||||||
},
|
.code = "2648",
|
||||||
|
.display_text = "Starting...",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = nullptr,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
};
|
};
|
||||||
int len = sizeof(star_codes)/sizeof(StarCodeHandler);
|
|
||||||
do_star_codes(star_codes, len);
|
add_star_code(start_code);
|
||||||
|
xSemaphoreTake(continue_sem, portMAX_DELAY);
|
||||||
|
rm_star_code(start_code.code);
|
||||||
|
vSemaphoreDelete(continue_sem);
|
||||||
|
|
||||||
std::vector<int> all_leds;
|
std::vector<int> all_leds;
|
||||||
|
|
||||||
@@ -196,9 +203,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 +219,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++;
|
||||||
}
|
}
|
||||||
@@ -217,15 +229,13 @@ void step5(void) {
|
|||||||
clean_bomb();
|
clean_bomb();
|
||||||
int solved_puzzles = 0;
|
int solved_puzzles = 0;
|
||||||
while (solved_puzzles < TIMES_TO_SOLVE) {
|
while (solved_puzzles < TIMES_TO_SOLVE) {
|
||||||
lcd_set_cursor_pos(1, 1);
|
|
||||||
bool solved_correctly = false;
|
bool solved_correctly = false;
|
||||||
|
|
||||||
int puzzle = puzzle_dist(gen);
|
int puzzle = puzzle_dist(gen);
|
||||||
// int puzzle = 2;
|
|
||||||
|
|
||||||
switch (puzzle) {
|
switch (puzzle) {
|
||||||
case 0: {
|
case 0: {
|
||||||
lcd_print("Clear");
|
lcd_print(1, 1, "Clear");
|
||||||
set_module_time(TIME_CLEAR);
|
set_module_time(TIME_CLEAR);
|
||||||
start_module_timer();
|
start_module_timer();
|
||||||
|
|
||||||
@@ -234,16 +244,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;
|
||||||
@@ -258,7 +270,7 @@ void step5(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1: {
|
case 1: {
|
||||||
lcd_print("Blank");
|
lcd_print(1, 1, "Blank");
|
||||||
set_module_time(TIME_BLANK);
|
set_module_time(TIME_BLANK);
|
||||||
start_module_timer();
|
start_module_timer();
|
||||||
|
|
||||||
@@ -266,12 +278,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 +324,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;
|
||||||
@@ -375,13 +384,16 @@ void step5(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 3: {
|
case 3: {
|
||||||
lcd_print("Nothing");
|
lcd_print(1, 1, "Nothing");
|
||||||
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 +401,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;
|
||||||
|
|
||||||
@@ -431,35 +443,41 @@ void step5(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 4: {
|
case 4: {
|
||||||
lcd_print("Blink");
|
lcd_print(1, 1, "Blink");
|
||||||
set_module_time(TIME_BLINK);
|
set_module_time(TIME_BLINK);
|
||||||
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 +493,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);
|
||||||
@@ -490,24 +507,27 @@ void step5(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 5: {
|
case 5: {
|
||||||
lcd_print("Ummm");
|
lcd_print(1, 1, "Ummm");
|
||||||
set_module_time(TIME_UMMM);
|
set_module_time(TIME_UMMM);
|
||||||
start_module_timer();
|
start_module_timer();
|
||||||
|
|
||||||
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;
|
||||||
@@ -543,17 +563,21 @@ void step5(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 6: {
|
case 6: {
|
||||||
lcd_print("Plank");
|
lcd_print(1, 1, "Plank");
|
||||||
set_module_time(TIME_PLANK);
|
set_module_time(TIME_PLANK);
|
||||||
start_module_timer();
|
start_module_timer();
|
||||||
|
|
||||||
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 +586,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 +617,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 +634,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();
|
||||||
}
|
}
|
||||||
@@ -632,7 +656,7 @@ void step5(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 7: {
|
case 7: {
|
||||||
lcd_print("What");
|
lcd_print(1, 1, "What");
|
||||||
set_module_time(TIME_WHAT);
|
set_module_time(TIME_WHAT);
|
||||||
start_module_timer();
|
start_module_timer();
|
||||||
|
|
||||||
@@ -708,11 +732,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 +759,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 = "";
|
||||||
@@ -779,7 +804,7 @@ void step5(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 8: {
|
case 8: {
|
||||||
lcd_print("Plink");
|
lcd_print(1, 1, "Plink");
|
||||||
set_module_time(TIME_PLINK);
|
set_module_time(TIME_PLINK);
|
||||||
start_module_timer();
|
start_module_timer();
|
||||||
|
|
||||||
@@ -787,10 +812,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 +827,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 +839,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);
|
||||||
@@ -878,13 +905,13 @@ void step5(void) {
|
|||||||
stop_module_timer();
|
stop_module_timer();
|
||||||
if (solved_correctly) {
|
if (solved_correctly) {
|
||||||
solved_puzzles++;
|
solved_puzzles++;
|
||||||
play_clip_wav(MOUNT_POINT "/correct.wav", true, false, 3, 0);
|
play_clip_wav(MOUNT_POINT "/partdone.wav", true, false, 0, 0);
|
||||||
vTaskDelay(pdMS_TO_TICKS(500));
|
vTaskDelay(pdMS_TO_TICKS(500));
|
||||||
solved_correctly = false;
|
solved_correctly = false;
|
||||||
} else {
|
} else {
|
||||||
vTaskDelay(pdMS_TO_TICKS(3000));
|
vTaskDelay(pdMS_TO_TICKS(3000));
|
||||||
}
|
}
|
||||||
clear_all_pressed_released();
|
play_clip_wav(MOUNT_POINT "/stepdone.wav", true, false, 1, 0);
|
||||||
clean_bomb();
|
clean_bomb();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef P001_STEP_5_H
|
||||||
|
#define P001_STEP_5_H
|
||||||
|
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
#include "../helper.h"
|
||||||
|
#include <random>
|
||||||
|
#include <iostream>
|
||||||
|
#include <set>
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
void p001_step5(void);
|
||||||
|
|
||||||
|
#endif /* P001_STEP_5_H */
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
#include "step6.h"
|
#include "p001_step6.h"
|
||||||
|
|
||||||
__attribute__((unused))
|
__attribute__((unused))
|
||||||
static const char *TAG = "step6";
|
static const char *TAG = "step6";
|
||||||
|
|
||||||
static uint8_t cut_wires = 0;
|
static uint8_t cut_wires = 0;
|
||||||
|
|
||||||
void step6(void) {
|
void p001_step6(void) {
|
||||||
get_cut_wires();
|
get_cut_wires();
|
||||||
clear_all_pressed_released();
|
clear_all_pressed_released();
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef P001_STEP_6_H
|
||||||
|
#define P001_STEP_6_H
|
||||||
|
|
||||||
|
#include "wires_puzzle.h"
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
#include "../helper.h"
|
||||||
|
|
||||||
|
void p001_step6(void);
|
||||||
|
|
||||||
|
#endif /* P001_STEP_6_H */
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#include "p002_step1.h"
|
||||||
|
|
||||||
|
__attribute__((unused))
|
||||||
|
static const char *TAG = "step1";
|
||||||
|
|
||||||
|
void p002_step1(void) {
|
||||||
|
// TODO: implement step 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef P002_STEP_1_H
|
||||||
|
#define P002_STEP_1_H
|
||||||
|
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
|
||||||
|
void p002_step1(void);
|
||||||
|
|
||||||
|
#endif /* P002_STEP_1_H */
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include "p002_step2.h"
|
||||||
|
|
||||||
|
__attribute__((unused))
|
||||||
|
static const char *TAG = "step2";
|
||||||
|
|
||||||
|
void p002_step2(void) {
|
||||||
|
// TODO: implement step 2
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef P002_STEP_2_H
|
||||||
|
#define P002_STEP_2_H
|
||||||
|
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
|
||||||
|
void p002_step2(void);
|
||||||
|
|
||||||
|
#endif /* P002_STEP_2_H */
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include "p002_step3.h"
|
||||||
|
|
||||||
|
__attribute__((unused))
|
||||||
|
static const char *TAG = "step3";
|
||||||
|
|
||||||
|
void p002_step3(void) {
|
||||||
|
// TODO: implement step 3
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef P002_STEP_3_H
|
||||||
|
#define P002_STEP_3_H
|
||||||
|
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
|
||||||
|
void p002_step3(void);
|
||||||
|
|
||||||
|
#endif /* P002_STEP_3_H */
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include "p002_step4.h"
|
||||||
|
|
||||||
|
__attribute__((unused))
|
||||||
|
static const char *TAG = "step4";
|
||||||
|
|
||||||
|
void p002_step4(void) {
|
||||||
|
// TODO: implement step 4
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef P002_STEP_4_H
|
||||||
|
#define P002_STEP_4_H
|
||||||
|
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
|
||||||
|
void p002_step4(void);
|
||||||
|
|
||||||
|
#endif /* P002_STEP_4_H */
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include "p002_step5.h"
|
||||||
|
|
||||||
|
__attribute__((unused))
|
||||||
|
static const char *TAG = "step5";
|
||||||
|
|
||||||
|
void p002_step5(void) {
|
||||||
|
// TODO: implement step 5
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef P002_STEP_5_H
|
||||||
|
#define P002_STEP_5_H
|
||||||
|
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
|
||||||
|
void p002_step5(void);
|
||||||
|
|
||||||
|
#endif /* P002_STEP_5_H */
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include "p002_step6.h"
|
||||||
|
|
||||||
|
__attribute__((unused))
|
||||||
|
static const char *TAG = "step6";
|
||||||
|
|
||||||
|
void p002_step6(void) {
|
||||||
|
// TODO: implement step 6
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef P002_STEP_6_H
|
||||||
|
#define P002_STEP_6_H
|
||||||
|
|
||||||
|
#include "../drivers/all.h"
|
||||||
|
|
||||||
|
void p002_step6(void);
|
||||||
|
|
||||||
|
#endif /* P002_STEP_6_H */
|
||||||
@@ -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);
|
||||||
|
|||||||
+220
-136
@@ -1,26 +1,29 @@
|
|||||||
#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;
|
||||||
|
extern uint32_t puzzle;
|
||||||
|
|
||||||
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(); p001_step1(); }
|
||||||
static void try_step2(void) { clean_bomb(); step2(); }
|
static void try_step2() { clean_bomb(); p001_step2(); }
|
||||||
static void try_step3(void) { clean_bomb(); step3(); }
|
static void try_step3() { clean_bomb(); p001_step3(); }
|
||||||
static void try_step4(void) { clean_bomb(); step4(); }
|
static void try_step4() { clean_bomb(); p001_step4(); }
|
||||||
static void try_step5(void) { clean_bomb(); step5(); }
|
static void try_step5() { clean_bomb(); p001_step5(); }
|
||||||
static void try_step6(void) { clean_bomb(); step6(); }
|
static void try_step6() { clean_bomb(); p001_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,124 +36,190 @@ static void battery_stats(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Wait for "*9819"
|
// TODO: remove. This is temperary
|
||||||
void step0(void) {
|
static void replay_last() {
|
||||||
led_strip_set_pixel(leds, Led::speaker, 0, 0, 20);
|
FILE* record_file = fopen(MOUNT_POINT "/record.txt", "r");
|
||||||
led_strip_refresh(leds);
|
if (record_file == nullptr) {
|
||||||
StarCodeHandler star_codes[] = {
|
ESP_LOGE("main", "failed to open record.txt");
|
||||||
{
|
}
|
||||||
.code = "*9819",
|
set_playback_source(record_file, true);
|
||||||
.display_text = "Diffusal Initiated",
|
start_playback();
|
||||||
.should_exit = true,
|
|
||||||
.callback = nullptr,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59861",
|
|
||||||
.display_text = "Set Up Wires",
|
|
||||||
.should_exit = false,
|
|
||||||
.callback = setup_wires,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59862",
|
|
||||||
.display_text = "Set Game Time",
|
|
||||||
.should_exit = false,
|
|
||||||
.callback = set_game_time,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59863",
|
|
||||||
.display_text = "Debug Switches",
|
|
||||||
.should_exit = false,
|
|
||||||
.callback = debug_switches,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59864",
|
|
||||||
.display_text = "Battery Stats",
|
|
||||||
.should_exit = false,
|
|
||||||
.callback = battery_stats,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59871",
|
|
||||||
.display_text = "Try Step 1",
|
|
||||||
.should_exit = false,
|
|
||||||
.callback = try_step1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59872",
|
|
||||||
.display_text = "Try Step 2",
|
|
||||||
.should_exit = false,
|
|
||||||
.callback = try_step2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59873",
|
|
||||||
.display_text = "Try Step 3",
|
|
||||||
.should_exit = false,
|
|
||||||
.callback = try_step3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59874",
|
|
||||||
.display_text = "Try Step 4",
|
|
||||||
.should_exit = false,
|
|
||||||
.callback = try_step4,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59875",
|
|
||||||
.display_text = "Try Step 5",
|
|
||||||
.should_exit = false,
|
|
||||||
.callback = try_step5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59876",
|
|
||||||
.display_text = "Try Step 6",
|
|
||||||
.should_exit = false,
|
|
||||||
.callback = try_step6,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59881",
|
|
||||||
.display_text = "Skip To Step 1",
|
|
||||||
.should_exit = true,
|
|
||||||
.callback = skip_to_step1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59882",
|
|
||||||
.display_text = "Skip To Step 2",
|
|
||||||
.should_exit = true,
|
|
||||||
.callback = skip_to_step2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59883",
|
|
||||||
.display_text = "Skip To Step 3",
|
|
||||||
.should_exit = true,
|
|
||||||
.callback = skip_to_step3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59884",
|
|
||||||
.display_text = "Skip To Step 4",
|
|
||||||
.should_exit = true,
|
|
||||||
.callback = skip_to_step4,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59885",
|
|
||||||
.display_text = "Skip To Step 5",
|
|
||||||
.should_exit = true,
|
|
||||||
.callback = skip_to_step5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*59886",
|
|
||||||
.display_text = "Skip To Step 6",
|
|
||||||
.should_exit = true,
|
|
||||||
.callback = skip_to_step6,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.code = "*1111",
|
|
||||||
.display_text = "Issue Strike",
|
|
||||||
.should_exit = false,
|
|
||||||
.callback = issue_strike,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
int len = sizeof(star_codes)/sizeof(StarCodeHandler);
|
|
||||||
do_star_codes(star_codes, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void do_p001() {
|
||||||
|
puzzle = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void do_p002() {
|
||||||
|
puzzle = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void step0() {
|
||||||
|
led_set(IndicatorLED::LED_SPEAKER, LEDColor::LED_COLOR_BLUE);
|
||||||
|
leds_flush();
|
||||||
|
|
||||||
|
SemaphoreHandle_t continue_sem = xSemaphoreCreateBinary();
|
||||||
|
if (continue_sem == nullptr) {
|
||||||
|
ESP_LOGE(TAG, "could not create semaphore");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
StarCodeEntry star_codes[] = {
|
||||||
|
{
|
||||||
|
.code = "9819",
|
||||||
|
.display_text = "Start P001",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = do_p001,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "3141",
|
||||||
|
.display_text = "Start P002",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = do_p002,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59861",
|
||||||
|
.display_text = "Setup Wires",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = setup_wires,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59862",
|
||||||
|
.display_text = "Set Game Time",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = set_game_time,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59863",
|
||||||
|
.display_text = "Debug switches",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = debug_switches,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59864",
|
||||||
|
.display_text = "Battery Stats",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = battery_stats,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59871",
|
||||||
|
.display_text = "Try Step 1",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = try_step1,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59872",
|
||||||
|
.display_text = "Try Step 2",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = try_step2,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59873",
|
||||||
|
.display_text = "Try Step 3",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = try_step3,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59874",
|
||||||
|
.display_text = "Try Step 4",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = try_step4,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59875",
|
||||||
|
.display_text = "Try Step 5",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = try_step5,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59876",
|
||||||
|
.display_text = "Try Step 6",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = try_step6,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59881",
|
||||||
|
.display_text = "Skip To Step 1",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = skip_to_step1,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59882",
|
||||||
|
.display_text = "Skip To Step 2",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = skip_to_step2,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59883",
|
||||||
|
.display_text = "Skip To Step 3",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = skip_to_step3,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59884",
|
||||||
|
.display_text = "Skip To Step 4",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = skip_to_step4,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59885",
|
||||||
|
.display_text = "Skip To Step 5",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = skip_to_step5,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "59886",
|
||||||
|
.display_text = "Skip To Step 6",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = skip_to_step6,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "1111",
|
||||||
|
.display_text = "Issue Strike",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = issue_strike,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "1112",
|
||||||
|
.display_text = "????",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = flashbang,
|
||||||
|
.triggered_sem = nullptr,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.code = "1113",
|
||||||
|
.display_text = "replay",
|
||||||
|
.delay_us = 2'000'000,
|
||||||
|
.callback = replay_last,
|
||||||
|
.triggered_sem = continue_sem,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
size_t len = sizeof(star_codes)/sizeof(star_codes[0]);
|
||||||
|
|
||||||
|
add_star_codes(star_codes, len);
|
||||||
|
xSemaphoreTake(continue_sem, portMAX_DELAY);
|
||||||
|
rm_star_codes(star_codes, len);
|
||||||
|
vSemaphoreDelete(continue_sem);
|
||||||
|
}
|
||||||
|
|
||||||
static const int CURSOR_POS_MAP[5] = {1, 3, 4, 6, 7};
|
static const int CURSOR_POS_MAP[5] = {1, 3, 4, 6, 7};
|
||||||
static char str_buf[18] = {0};
|
static char str_buf[18] = {0};
|
||||||
@@ -163,7 +232,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 +264,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 +335,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 +415,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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-12
@@ -1,19 +1,15 @@
|
|||||||
#ifndef STEP_0_H
|
#ifndef STEP_0_H
|
||||||
#define STEP_0_H
|
#define STEP_0_H
|
||||||
|
|
||||||
#include "../drivers/bottom_half.h"
|
#include "../drivers/all.h"
|
||||||
#include "../drivers/char_lcd.h"
|
|
||||||
#include "../drivers/wires.h"
|
|
||||||
#include "../drivers/power.h"
|
|
||||||
#include "setup_wires.h"
|
|
||||||
#include "../helper.h"
|
|
||||||
|
|
||||||
#include "step1.h"
|
#include "setup_wires.h"
|
||||||
#include "step2.h"
|
#include "p001_step1.h"
|
||||||
#include "step3.h"
|
#include "p001_step2.h"
|
||||||
#include "step4.h"
|
#include "p001_step3.h"
|
||||||
#include "step5.h"
|
#include "p001_step4.h"
|
||||||
#include "step6.h"
|
#include "p001_step5.h"
|
||||||
|
#include "p001_step6.h"
|
||||||
|
|
||||||
/// Wait for "*9819"
|
/// Wait for "*9819"
|
||||||
void step0(void);
|
void step0(void);
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
#ifndef STEP_1_H
|
|
||||||
#define STEP_1_H
|
|
||||||
|
|
||||||
#include <random>
|
|
||||||
#include "../drivers/bottom_half.h"
|
|
||||||
#include "../drivers/tft.h"
|
|
||||||
#include "../drivers/leds.h"
|
|
||||||
#include "../drivers/wires.h"
|
|
||||||
#include "../drivers/speaker.h"
|
|
||||||
#include "../drivers/game_timer.h"
|
|
||||||
#include "../drivers/char_lcd.h"
|
|
||||||
|
|
||||||
void step1(void);
|
|
||||||
|
|
||||||
#endif /* STEP_1_H */
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#ifndef STEP_2_H
|
|
||||||
#define STEP_2_H
|
|
||||||
|
|
||||||
#include "../drivers/bottom_half.h"
|
|
||||||
#include "../drivers/wires.h"
|
|
||||||
#include "../drivers/game_timer.h"
|
|
||||||
#include "../drivers/leds.h"
|
|
||||||
#include "../drivers/speaker.h"
|
|
||||||
#include "../helper.h"
|
|
||||||
#include <iostream>
|
|
||||||
#include <random>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
void step2(void);
|
|
||||||
|
|
||||||
#endif /* STEP_2_H */
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#ifndef STEP_3_H
|
|
||||||
#define STEP_3_H
|
|
||||||
|
|
||||||
#include <random>
|
|
||||||
#include "../drivers/bottom_half.h"
|
|
||||||
#include "../drivers/wires.h"
|
|
||||||
#include "../drivers/speaker.h"
|
|
||||||
#include "../drivers/leds.h"
|
|
||||||
#include "../drivers/char_lcd.h"
|
|
||||||
#include "../drivers/game_timer.h"
|
|
||||||
#include "../helper.h"
|
|
||||||
|
|
||||||
void step3(void);
|
|
||||||
|
|
||||||
#endif /* STEP_3_H */
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
#ifndef STEP_4_H
|
|
||||||
#define STEP_4_H
|
|
||||||
|
|
||||||
#include <random>
|
|
||||||
#include "../drivers/tft.h"
|
|
||||||
#include "../drivers/speaker.h"
|
|
||||||
#include "../drivers/bottom_half.h"
|
|
||||||
#include "../drivers/game_timer.h"
|
|
||||||
#include "../drivers/wires.h"
|
|
||||||
#include "../drivers/char_lcd.h"
|
|
||||||
#include "../helper.h"
|
|
||||||
|
|
||||||
// TODO:
|
|
||||||
// - [ ] set up real game loop
|
|
||||||
// - [ ] stop music
|
|
||||||
// - [ ] set up strike on falure
|
|
||||||
// - [ ] set up module timer
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void step4(void);
|
|
||||||
|
|
||||||
#endif /* STEP_4_H */
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#ifndef STEP_5_H
|
|
||||||
#define STEP_5_H
|
|
||||||
|
|
||||||
#include "../drivers/bottom_half.h"
|
|
||||||
#include "../drivers/game_timer.h"
|
|
||||||
#include "../drivers/char_lcd.h"
|
|
||||||
#include "../drivers/leds.h"
|
|
||||||
#include "../drivers/wires.h"
|
|
||||||
#include "../helper.h"
|
|
||||||
#include <random>
|
|
||||||
#include <iostream>
|
|
||||||
#include <set>
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
#include <cmath>
|
|
||||||
#include <array>
|
|
||||||
|
|
||||||
void step5(void);
|
|
||||||
|
|
||||||
#endif /* STEP_5_H */
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#ifndef STEP_6_H
|
|
||||||
#define STEP_6_H
|
|
||||||
|
|
||||||
#include "wires_puzzle.h"
|
|
||||||
#include "drivers/wires.h"
|
|
||||||
#include "drivers/bottom_half.h"
|
|
||||||
#include "drivers/sd.h"
|
|
||||||
#include "drivers/speaker.h"
|
|
||||||
|
|
||||||
void step6(void);
|
|
||||||
|
|
||||||
#endif /* STEP_6_H */
|
|
||||||
@@ -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})
|
||||||
File diff suppressed because one or more lines are too long
@@ -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,
|
||||||
|
};
|
||||||
@@ -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,
|
||||||
|
};
|
||||||
@@ -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,
|
||||||
|
};
|
||||||
@@ -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,
|
||||||
|
};
|
||||||
@@ -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,
|
||||||
|
};
|
||||||
@@ -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,
|
||||||
|
};
|
||||||
@@ -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,
|
||||||
|
};
|
||||||
@@ -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,
|
||||||
|
};
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# ESP-IDF Partition Table
|
||||||
|
# Name, Type, SubType, Offset, Size, Flags
|
||||||
|
nvs,data,nvs,0x9000,0x6000,,
|
||||||
|
phy_init,data,phy,0xf000,0x1000,,
|
||||||
|
ota,data,ota,0x10000,0x2000,,
|
||||||
|
factory,app,factory,0x20000,2M,,
|
||||||
|
ota0,app,ota_0,0x220000,2M,,
|
||||||
|
ota1,app,ota_1,0x420000,2M,,
|
||||||
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user