Compare commits

..

18 Commits

Author SHA1 Message Date
CalisJI 5787b71940 Update README 2024-08-23 09:48:23 +07:00
CalisJI 6fbaa04235 Update README 2024-08-23 09:42:52 +07:00
CalisJI 21e937596c Update README 2024-08-23 09:41:32 +07:00
CalisJI 951fa4e64f Update README 2024-08-23 09:32:59 +07:00
CalisJI 34cdb971dd Update README 2024-08-23 09:32:26 +07:00
CalisJI cef31f7eb4 Update README 2024-08-21 16:41:02 +07:00
CalisJI 1fd6fa43ab Update 2024-08-21 16:37:46 +07:00
CalisJI 34b7a617d8 Update 2024-08-21 16:26:57 +07:00
CalisJI 8e2fa36506 Update 2024-08-21 14:37:35 +07:00
CalisJI 4ad1b9f450 Update README 2024-08-21 14:35:20 +07:00
CalisJI 65c9585687 Update 2024-08-21 14:15:53 +07:00
CalisJI 194b5ee315 Update 2024-08-20 17:54:41 +07:00
CalisJI 556cc8ace0 update 2024-08-20 16:26:40 +07:00
CalisJI 37a3080b48 initial 2024-08-20 14:02:42 +07:00
CalisJI 761e85023c add animation 2024-08-16 17:57:26 +07:00
CalisJI c9ed38122d full function game 2024-08-16 17:01:10 +07:00
CalisJI e4480b5333 setting pinout 2024-08-16 09:58:19 +07:00
CalisJI be66b93862 add spacecraft 2024-08-16 09:57:25 +07:00
9 changed files with 1355 additions and 407 deletions

49
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,49 @@
{
"files.associations": {
"array": "cpp",
"atomic": "cpp",
"*.tcc": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"unordered_map": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"random": "cpp",
"string": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"new": "cpp",
"ostream": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"cinttypes": "cpp",
"typeinfo": "cpp"
}
}

View File

@ -1,4 +1,38 @@
# Project display object's point on matrix
### Using UART to communicate with each other
Host machine running human detection connect to ESP32 via UART using TypeC cable. They communicate realtime with each other
### Pinout ESP32-S3
![](/img/connector.jpg)
### Hardware
- **ESP32-S3 N8R2 Dual Type-C:**
![ESP32-S3 N8R2 Dual Type-C](/img/esp32s3.jpg)
- **Pinout**
![](/img/esp32-s3_devkitc-1_pinlayout_v1.1.jpg)
```CPP
#define R1_PIN 4
#define G1_PIN 5
#define B1_PIN 6
#define R2_PIN 7
#define G2_PIN 15
#define B2_PIN 16
#define A_PIN 18
#define B_PIN 8 // Changed from library default
#define C_PIN 3
#define D_PIN 42
#define E_PIN 39 // required for 1/32 scan panels, like 64x64px. Any available pin would do, i.e. IO32
#define LAT_PIN 40
#define OE_PIN 2
#define CLK_PIN 41
```
### Data input example Serial Port
```python
@ -19,7 +53,41 @@ header = struct.pack('<II', num_rows, num_cols) # <II cho hai số nguyên khô
data_to_send = header + data_bytes
# Mở cổng serial
ser = serial.Serial('/dev/ttyUSB0', 115200) # Thay 'COM3' bằng cổng serial của bạn
print(data)
# Gửi dữ liệu
ser.write(data_to_send)
# Đóng cổng serial
ser.close()
```
### Testing Game
```python
import numpy as np
import serial
import struct
# Tạo mảng NumPy
n = 2
# Kích thước của mảng
num_rows = 1
num_cols = 0
data = np.array([[60, 120,1]]).astype(np.float32)
num_rows = data.shape[0]
num_cols = data.shape[1]
# Chuyển mảng thành chuỗi byte
data_bytes = data.tobytes()
# Đóng gói kích thước và dữ liệu
header = struct.pack('<II', num_rows, num_cols) # <II cho hai s nguyên không du 32-bit
data_to_send = header + data_bytes
# Mở cổng serial
ser = serial.Serial('/dev/ttyACM0', 115200*2) # Thay 'COM3' bằng cổng serial của bạn
print(data)
# Gửi dữ liệu
ser.write(data_to_send)
@ -27,9 +95,6 @@ ser.write(data_to_send)
ser.close()
```
# Select Game
Set `num_rows = 0` and `num_cols = 0` `(GameHungVat)` or set `num_rows = 1` and `num_cols = 0` `(GameStickMan)`
And send within `data` at first time to select the game then leave `num_rows = data.shape[0]` and `num_cols = data.shape[1]` after that to play game
# Data frame format
```python

BIN
img/connector.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 KiB

BIN
img/esp32s3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -8,12 +8,12 @@
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:nodemcu-32s]
[env:esp32-s3-devkitc-1]
platform = espressif32
board = nodemcu-32s
board_build.mcu = esp32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 230400
board_build.mcu = esp32s3
lib_deps =
mrfaptastic/ESP32 HUB75 LED MATRIX PANEL DMA Display@^3.0.12
https://github.com/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA.git
@ -22,3 +22,6 @@ lib_deps =
mbed-seeed/BluetoothSerial@0.0.0+sha.f56002898ee8
me-no-dev/AsyncTCP@^1.1.1
bblanchon/ArduinoJson@^7.1.0
build_flags =
-DBOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue

710
src/gif_frames.h Normal file
View File

@ -0,0 +1,710 @@
#include <stdint.h>
const uint16_t gif_frame_0[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x18E3, 0x0000, 0x1000, 0x1000, 0x0000, 0x38E3,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0841, 0x0000, 0x18C3, 0x9A49, 0x9A69,
0x18E3, 0x0000, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2104, 0x8C51,
0xB5B6, 0xC659, 0xA534, 0x2945, 0x0841, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31A6, 0x0000,
0x4A49, 0xAD96, 0x9CD3, 0xA555, 0x0000, 0x5AAA, 0x0000, 0x31A6,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x18C3, 0x94D3, 0x9CD3, 0x9C71, 0x9C71, 0xAD34, 0xB5B6,
0x20E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x7BEF, 0x0020, 0x4A8A, 0xA534, 0x99A6, 0xA082, 0xA061,
0xA1E7, 0xC638, 0x5B0C, 0x0020, 0x7BEF, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x1041, 0x9B4D, 0xA1C7, 0x88E3,
0x81C7, 0x81C7, 0x8904, 0xA269, 0xAC10, 0x1061, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x9820,
0x88E3, 0x5ACB, 0x5B4D, 0x5B2C, 0x62EB, 0x8965, 0x8882, 0x0800,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020,
0x39C7, 0x6249, 0x5269, 0x52AA, 0x5ACB, 0x62EB, 0x5B0C, 0x62EB,
0x6AAA, 0x4208, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x1082, 0x0046, 0x0026,
0x2148, 0x5289, 0x528A, 0x4AAA, 0x528A, 0x528A, 0x528A, 0x5AEB,
0x630C, 0x5B0C, 0x5B0C, 0x630C, 0x62EB, 0x2988, 0x0026, 0x0046,
0x10A3, 0x0841, 0x0000, 0x1082, 0x0020, 0x0841, 0x39E7, 0x52AB,
0x099D, 0x019F, 0x29F5, 0x5AA8, 0x4A6A, 0x528A, 0x528A, 0x528A,
0x4A8A, 0x528A, 0x5AEB, 0x630C, 0x62EB, 0x5AEC, 0x6B2A, 0x3236,
0x019F, 0x09BE, 0x630D, 0x4A49, 0x0861, 0x0820, 0x0000, 0x1904,
0x5ACB, 0x4A4A, 0x09DD, 0x023F, 0x29D4, 0x5288, 0x528A, 0x528A,
0x528A, 0x52AA, 0x52AA, 0x52AA, 0x52AA, 0x5AEC, 0x630C, 0x5B0C,
0x630A, 0x3215, 0x021F, 0x09DD, 0x5ACC, 0x6B4D, 0x2124, 0x0000,
0x1800, 0x6124, 0x4AAA, 0x4A6A, 0x09DC, 0x023F, 0x29F5, 0x5AC8,
0x4A6A, 0x528A, 0x31A6, 0x10A2, 0x08A3, 0x08A3, 0x10A2, 0x31A6,
0x52AB, 0x5ACB, 0x6B4B, 0x3236, 0x023F, 0x09DD, 0x5ACC, 0x5B2C,
0x6945, 0x1800, 0x2020, 0xA8C3, 0x81C7, 0x52AC, 0x09DE, 0x01DB,
0x2191, 0x4A27, 0x1082, 0x0841, 0x0021, 0x018F, 0x1B17, 0x1B17,
0x018F, 0x0021, 0x0840, 0x1082, 0x5268, 0x29D2, 0x01DB, 0x09DE,
0x632E, 0x8A07, 0xA8C3, 0x2020, 0x1000, 0x6020, 0x5800, 0x30E4,
0x00AF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0174, 0x02F9, 0x021A,
0x0000, 0x0000, 0x021A, 0x02FA, 0x0174, 0x0000, 0x0000, 0x0000,
0x0000, 0x00CF, 0x3925, 0x5800, 0x6020, 0x1000, 0x0044, 0x11CB,
0x73AD, 0x5B0C, 0x0129, 0x0000, 0x0000, 0x0000, 0x0000, 0x0319,
0x02BB, 0x3B18, 0x0000, 0x0000, 0x3B18, 0x02BB, 0x0319, 0x0000,
0x0000, 0x0000, 0x0000, 0x0129, 0x5B0C, 0x73AE, 0x11CB, 0x0044,
0x02BF, 0x4419, 0x0000, 0x0000, 0x133A, 0x0000, 0x5000, 0x012D,
0x0000, 0x0B38, 0x023A, 0x7C57, 0x0000, 0x0000, 0x7C57, 0x023A,
0x0B38, 0x0000, 0x012D, 0x5000, 0x0000, 0x133A, 0x0000, 0x0000,
0x4419, 0x02BF, 0x01F8, 0x3398, 0x0000, 0xBE3A, 0x0AD7, 0x000F,
0x0000, 0x01F7, 0x0000, 0x0B39, 0x023A, 0x7457, 0x0000, 0x0000,
0x7457, 0x023A, 0x0B39, 0x0000, 0x01F7, 0x0000, 0x000F, 0x0AD7,
0xBE3A, 0x0000, 0x3398, 0x01F8, 0x0AF8, 0x0299, 0x5C59, 0x33BA,
0x0279, 0x0000, 0x0000, 0x01F7, 0x0000, 0x0319, 0x027B, 0x5398,
0x0000, 0x0000, 0x5398, 0x027B, 0x0319, 0x0000, 0x01F7, 0x0000,
0x0000, 0x0279, 0x33BA, 0x5C59, 0x0299, 0x0AF8, 0x0000, 0x0298,
0x02BA, 0x0299, 0x02F7, 0x001F, 0x07FF, 0x03EF, 0x03FF, 0x0298,
0x02D9, 0x027A, 0x5397, 0x5397, 0x027A, 0x02D9, 0x0298, 0x03FF,
0x03EF, 0x07FF, 0x001F, 0x02F7, 0x0299, 0x02BA, 0x0298, 0x0000,
0x03FF, 0x0000, 0x02B8, 0x0AD9, 0x0000, 0x001F, 0x0000, 0x0000,
0x000F, 0x0000, 0x0298, 0x02FA, 0x025A, 0x025A, 0x02FA, 0x0298,
0x0000, 0x000F, 0x0000, 0x0000, 0x001F, 0x0000, 0x0AD9, 0x02B8,
0x0000, 0x03FF, 0x0000, 0x03EF, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x03FF, 0x0000, 0x0297, 0x02D9, 0x02D9,
0x0297, 0x0000, 0x03FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x03EF, 0x0000,
};
const uint16_t gif_frame_1[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x18E3, 0x0000, 0x1000, 0x1000, 0x0000, 0x38E3,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0841, 0x0000, 0x18C3, 0x9A49, 0x9A69,
0x18E3, 0x0000, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2104, 0x8C51,
0xB5B6, 0xC659, 0xA534, 0x2945, 0x0841, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31A6, 0x0000,
0x4A49, 0xAD96, 0x9CD3, 0xA555, 0x0000, 0x5AAA, 0x0000, 0x31A6,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x18C3, 0x94D3, 0x9CD3, 0x9C71, 0x9C71, 0xAD34, 0xB5B6,
0x20E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x7BEF, 0x0020, 0x4A8A, 0xA534, 0x99A6, 0xA082, 0xA061,
0xA1E7, 0xC638, 0x5B0C, 0x0020, 0x7BEF, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x1041, 0x9B4D, 0xA1C7, 0x88E3,
0x81C7, 0x81C7, 0x8904, 0xA269, 0xAC10, 0x1061, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x9820,
0x88E3, 0x5ACB, 0x5B4D, 0x5B2C, 0x62EB, 0x8965, 0x8882, 0x0800,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020,
0x39C7, 0x6249, 0x5269, 0x52AA, 0x5ACB, 0x62EB, 0x5B0C, 0x62EB,
0x6AAA, 0x4208, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x1082, 0x0046, 0x0026,
0x2148, 0x5289, 0x528A, 0x4AAA, 0x528A, 0x528A, 0x528A, 0x5AEB,
0x630C, 0x5B0C, 0x5B0C, 0x630C, 0x62EB, 0x2988, 0x0026, 0x0046,
0x10A3, 0x0841, 0x0000, 0x1082, 0x0020, 0x0841, 0x39E7, 0x52AB,
0x099D, 0x019F, 0x29F5, 0x5AA8, 0x4A6A, 0x528A, 0x528A, 0x528A,
0x4A8A, 0x528A, 0x5AEB, 0x630C, 0x62EB, 0x5AEC, 0x6B2A, 0x3236,
0x019F, 0x09BE, 0x630D, 0x4A49, 0x0861, 0x0820, 0x0000, 0x1904,
0x5ACB, 0x4A4A, 0x09DD, 0x023F, 0x29D4, 0x5288, 0x528A, 0x528A,
0x528A, 0x52AA, 0x52AA, 0x52AA, 0x52AA, 0x5AEC, 0x630C, 0x5B0C,
0x630A, 0x3215, 0x021F, 0x09DD, 0x5ACC, 0x6B4D, 0x2124, 0x0000,
0x1800, 0x6124, 0x4AAA, 0x4A6A, 0x09DC, 0x023F, 0x29F5, 0x5AC8,
0x4A6A, 0x528A, 0x31A6, 0x10A2, 0x08A3, 0x08A3, 0x10A2, 0x31A6,
0x52AA, 0x5ACB, 0x6B4B, 0x3236, 0x023F, 0x09DD, 0x5ACC, 0x5B2C,
0x6945, 0x1800, 0x2020, 0xA8C3, 0x81C7, 0x52AC, 0x09DE, 0x01DB,
0x2191, 0x4A27, 0x1082, 0x0841, 0x0042, 0x016F, 0x1B17, 0x1B17,
0x016F, 0x0042, 0x0841, 0x1082, 0x5268, 0x29D2, 0x01DB, 0x09DE,
0x632E, 0x8A08, 0xA8C3, 0x2020, 0x1020, 0x6861, 0x6000, 0x3904,
0x00F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0299, 0x237B,
0x0000, 0x0000, 0x237B, 0x0299, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x00F1, 0x4145, 0x6000, 0x6861, 0x1020, 0x0000, 0x0046,
0x430F, 0x220C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0239, 0x7CD9, 0x0000, 0x0000, 0x7CD9, 0x0239, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x220C, 0x430F, 0x0046, 0x0000,
0x0000, 0x01FD, 0xAEBF, 0x64FD, 0x00BF, 0x0000, 0x0186, 0x0000,
0x012D, 0x0000, 0x0239, 0x74B9, 0x0000, 0x0000, 0x74B9, 0x0239,
0x0000, 0x012D, 0x0000, 0x0186, 0x0000, 0x00BF, 0x64FD, 0xAEBF,
0x01FD, 0x0000, 0x9800, 0x01D8, 0x6CBA, 0x3BB8, 0x0054, 0xA800,
0x03EF, 0x0000, 0x01F7, 0x0000, 0x02B9, 0x131A, 0x9D78, 0x9D78,
0x131A, 0x02B9, 0x0000, 0x01F7, 0x0000, 0x03EF, 0xA800, 0x0054,
0x3BB8, 0x6CBA, 0x01D8, 0x9800, 0x02B5, 0x02BF, 0x02B9, 0x02B9,
0x001F, 0x03EF, 0x0000, 0x0000, 0x0000, 0x02B5, 0x01F7, 0x0299,
0x02DA, 0x02DA, 0x0299, 0x01F7, 0x02B5, 0x0000, 0x0000, 0x0000,
0x03EF, 0x001F, 0x02B9, 0x02B9, 0x02BF, 0x02B5, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x02B9, 0x02B9, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x03EF, 0x07FF, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x03EF, 0x0000, 0x0000, 0x03EF, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07FF, 0x03EF,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01F7, 0x01F7,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
};
const uint16_t gif_frame_2[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBD97, 0x6ACE,
0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0xC618,
0x528C, 0x41AA, 0x628B, 0x0000, 0x0000, 0x0000, 0xAD55, 0x7BEF,
0x7BEF, 0x7BEF, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x49A8, 0x5B4E, 0x7413, 0x514A, 0x62CC, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x7BF5,
0x3BEF, 0x0000, 0xAD15, 0x30C6, 0x8BB8, 0x8415, 0x7250, 0x3947,
0xC618, 0x0000, 0x8BCF, 0x3A2A, 0x8516, 0x4209, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x3987, 0x69ED, 0xA439, 0x7BB2,
0x9316, 0x4969, 0x5A8A, 0x0000, 0x630D, 0x63B0, 0x84D5, 0x52ED,
0xA4F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x62ED, 0x42AC, 0x532E, 0x7BF0, 0x5189, 0x6AF4,
0x753A, 0x8D39, 0x92D5, 0x6A2F, 0x522A, 0x62CB, 0x4AAC, 0xA5F7,
0x7C93, 0x6BF1, 0x5AAC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xAD15, 0x52CC, 0x63D0, 0x7C93, 0x4188,
0x498B, 0x543B, 0x75FF, 0xC71F, 0x9439, 0x92D5, 0x498A, 0x494A,
0x624E, 0xBE58, 0xA5D7, 0x63B0, 0x62ED, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x83F0, 0x3A4A, 0x7493,
0x630E, 0x5168, 0x5A30, 0x443A, 0x96BF, 0x0000, 0x8D1B, 0x598B,
0x9399, 0x9B99, 0x8272, 0x8B72, 0xADF7, 0x63F1, 0x62ED, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C11,
0x426B, 0x6C32, 0x522B, 0x69CD, 0x82D4, 0x4B55, 0x853A, 0xC65A,
0x6B92, 0x598A, 0xA41D, 0xA3FC, 0x9336, 0x8AB4, 0x7AF1, 0x63B0,
0x62ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x8C11, 0x3A4B, 0x5A6C, 0x61AD, 0x7230, 0x8AB3, 0x5169,
0x61AC, 0x596B, 0x61ED, 0x9B37, 0xA41D, 0xA3FC, 0x82B4, 0x8272,
0x7A10, 0x62CF, 0x5AEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x8C31, 0x3A09, 0x4969, 0x518A, 0x51AB,
0x7230, 0x518A, 0x61CD, 0x59AC, 0x620D, 0x9B36, 0x9BDB, 0x7A72,
0x4969, 0x62CE, 0x7392, 0x52AD, 0xA4F4, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9452, 0x3A2A, 0x530D,
0x4AAC, 0x4188, 0x69EE, 0x518B, 0x6A2E, 0xB3F7, 0x59AB, 0x6A0E,
0x7A51, 0x518B, 0x2906, 0x39E8, 0x4A4A, 0x9CB3, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x738F, 0x4ACC, 0x4A0A, 0x4969, 0x7A71, 0x59CC, 0x9377, 0xE57F,
0x7AD3, 0x6A2E, 0x9337, 0x82B3, 0x61CE, 0x49A9, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x3967, 0x4948, 0x6A0F, 0x7270, 0x516A,
0xA3DB, 0xDD3F, 0x9B9A, 0x7230, 0xA3FD, 0xABFD, 0x9B36, 0x69EF,
0x6AEE, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x9452, 0x3906, 0x59AB, 0x8AB3,
0x7A71, 0x516A, 0x9BBA, 0xC4BF, 0x9B7A, 0x7B32, 0x8437, 0x8C78,
0x9BDA, 0x9B16, 0x61CE, 0x732E, 0x0000, 0x0020, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5A4B, 0x30C6,
0x59AC, 0x6B11, 0x528D, 0x516A, 0x9BBB, 0xAC3F, 0x9419, 0x7473,
0x9535, 0x84F3, 0x8CD6, 0xA3FA, 0x9315, 0x59AD, 0x7B6F, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x83D0,
0x3906, 0x518A, 0x5A8E, 0x5BB0, 0x636F, 0x514A, 0x9BBA, 0xABDC,
0x83B4, 0x7CD4, 0xC6DA, 0xA5F7, 0x8CF4, 0xAC7D, 0xAB9C, 0x9AF6,
0x596C, 0x7BAF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C11, 0x0000,
0xB576, 0x28A5, 0x51AA, 0x71EF, 0x62AF, 0x7493, 0x8473, 0x51AB,
0x8AF5, 0xA3DC, 0x8394, 0x8D15, 0xC699, 0x9DB6, 0x8CF5, 0xA49D,
0x7CFA, 0x74B6, 0x51AC, 0x7B8F, 0x9CB3, 0xB596, 0x0000, 0x0000,
0x83D0, 0x0000, 0xAD55, 0x28C5, 0x71EE, 0x6B10, 0x53F0, 0x7432,
0x84F5, 0x6B90, 0x7A92, 0x9317, 0x7B72, 0x7493, 0x84B4, 0x7C93,
0x8CD5, 0x8BB6, 0x3BCD, 0x442E, 0x49AB, 0x838F, 0x9472, 0xB596,
0x0000, 0x0000, 0x83D0, 0x0000, 0xB576, 0x2064, 0x4929, 0x39C8,
0x434C, 0x5B90, 0x5B8F, 0x63F0, 0x6AAF, 0x71CE, 0x6AEF, 0xA617,
0xA5F7, 0x7453, 0x7C93, 0x4189, 0x4909, 0x516A, 0x38E7, 0x83D0,
0x9452, 0xB596, 0x0000, 0x0000, 0x9452, 0x0000, 0xB596, 0x41C8,
0x526A, 0x3947, 0x4A4B, 0x7453, 0x7412, 0x8494, 0x8432, 0x3968,
0x41E9, 0x8332, 0xB47C, 0x9B76, 0x520C, 0x5A8B, 0x0000, 0x0000,
0x0000, 0x0000, 0x526A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xBDF8, 0x4A09, 0x61EE, 0x9B36, 0x8AD3,
0x4168, 0x8C31, 0x9CB3, 0x40E9, 0x92F6, 0x8273, 0x4969, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CB3, 0x40E9,
0x7A71, 0x7A31, 0x520A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x780F,
0x7BFF, 0x7BEF, 0x780F, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x7BEF, 0x39E7, 0x79F7, 0x79EF, 0x39E7, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
};
const uint16_t gif_frame_3[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBD97, 0x6AAD,
0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0xC618,
0x528B, 0x69F0, 0x7B0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xCE58, 0x72D1, 0x73D4, 0x9355, 0x8252, 0x732F, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x9CF3, 0x7314, 0xABD9, 0x620E, 0x82D3, 0x5A0D,
0xC638, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xB596, 0x6C33, 0x0000, 0x9C56, 0x7C32,
0x8515, 0x7B73, 0x732E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x634F, 0xB71F, 0xC63B,
0x5BB1, 0xBE78, 0xADF7, 0x7C93, 0x7B8F, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x632F,
0x75DE, 0x9456, 0x630F, 0xCF1A, 0xA5D7, 0x7C73, 0x7B8F, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x7390, 0x4CDA, 0x7BF6, 0x62EF, 0x9DB6, 0xADF7, 0x7C73,
0x7B8F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x41C8, 0x598B, 0x6B50, 0x8514,
0x9D96, 0x7C73, 0x7B8F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41A8, 0x514A,
0x6370, 0x7493, 0x7C93, 0x84D4, 0x734E, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x3987, 0x82B0, 0xA459, 0x6C32, 0x7CB4, 0x634E, 0xB576, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x3967, 0xA393, 0xC4BF, 0x82F3, 0x49EB, 0xA514,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xAD55, 0x0000, 0x0000, 0x3966, 0x72B3, 0xA399, 0x8AB4,
0x4109, 0xBDD7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB596, 0x59AB, 0x8B17,
0x9B58, 0x7A71, 0x4128, 0xC618, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDB7, 0x6A6E,
0x7B52, 0x8416, 0x83F5, 0x8292, 0x61EE, 0x7B8F, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x8C31, 0x528D, 0x7CD4, 0x8D14, 0x7CF4, 0x9C76, 0x8252, 0x4989,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xB576, 0x422A, 0x63D0, 0x9556, 0x0000, 0x8D35, 0x94D6,
0x8293, 0x51EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x39C7, 0x83D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xB576, 0x31C9, 0x6C11, 0x9D76, 0xC6B9,
0x8D14, 0x9CF8, 0xAB9B, 0x698E, 0x6B0D, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x7BAF, 0x9CB3, 0xB596, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB555, 0x31E9, 0x6C11,
0x7C93, 0x84B4, 0x7472, 0x9CD7, 0x7C57, 0x526D, 0x72EE, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BB0, 0x9472, 0xB596,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB576,
0x31C9, 0x63D1, 0x84D4, 0xB658, 0x84F4, 0x7BF3, 0x5A8E, 0x41CB,
0x6ACD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x83D0,
0x9472, 0xB596, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x8C52, 0x3927, 0x8315, 0xA3F9, 0x7AB2, 0x3968,
0x5A2B, 0x51EA, 0x7BB0, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000,
0x0000, 0x0000, 0x526A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9432, 0xA3F5, 0xC4DB,
0xA3F5, 0x83F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF,
0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xBDF7, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
};
const uint16_t gif_frame_4[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB596, 0x628C,
0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0xBDF7, 0xAD55, 0x0000, 0xC618,
0x49C9, 0x3147, 0x628C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x49C8, 0x516B, 0x82F3, 0x4108, 0x62CC, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2127, 0x74B5, 0x3A2A,
0xCDF8, 0x0000, 0xA514, 0x30C5, 0x722F, 0x8AB4, 0x59AB, 0x3947,
0x0000, 0x0000, 0x3186, 0x632C, 0x7BEF, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C31, 0x5B2E,
0x9576, 0x638F, 0x9472, 0x0000, 0x3966, 0x516A, 0x8AD4, 0x8AB3,
0x6A0E, 0x4108, 0x6B0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE39,
0x39E9, 0xA5D7, 0xBE99, 0x9556, 0x52CC, 0x6B0C, 0x4989, 0x6A0E,
0x92F5, 0x82B3, 0x69EE, 0x518B, 0x522A, 0x7B8E, 0x4A6B, 0x3A4B,
0x9432, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x420A, 0xAE37, 0xBE99, 0x84F5, 0x7350, 0x4109,
0x5169, 0x8292, 0x9336, 0x82B3, 0x69EE, 0x6A0E, 0x4127, 0x3147,
0x6BF1, 0x6C12, 0x5AED, 0xC5F8, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xCE59, 0x422A, 0x84D4, 0xB658, 0x8D14,
0x93F5, 0x92D5, 0x7270, 0x59AB, 0x8AB3, 0x82B3, 0x69EE, 0x59AB,
0x598B, 0x522B, 0x5B8F, 0x7493, 0x31C9, 0xAD35, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE59, 0x4A4A, 0x7473,
0x9DB6, 0x8514, 0x9415, 0x92D5, 0x9315, 0x722F, 0x59AC, 0x6A0F,
0x59AB, 0x59AB, 0x71EF, 0x5A6E, 0x532E, 0x7453, 0x3A09, 0xAD35,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE38,
0x4209, 0x7CB4, 0x7453, 0x8D15, 0x93D4, 0x8AB4, 0x9315, 0x9315,
0x59AB, 0x61ED, 0x59AB, 0x59CC, 0x71EF, 0x626E, 0x534E, 0x7453,
0x39E9, 0xAD35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x8C31, 0x530D, 0x7CB4, 0x6BF1, 0x5A0C, 0x7A51,
0x92F5, 0x9315, 0x59AB, 0x69EE, 0x59AB, 0x4969, 0x61CD, 0x522C,
0x534E, 0x7453, 0x31E9, 0xAD35, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x7BAF, 0x4209, 0x3167,
0x30E6, 0x61CD, 0x7230, 0x7230, 0x61ED, 0x4969, 0x4968, 0x4147,
0x598B, 0x41E9, 0x63F1, 0x7473, 0x3A09, 0xB555, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xC5F7, 0x4149, 0x722F, 0x720F, 0x69EE, 0x69EE, 0x61EE, 0x4969,
0x6A0F, 0x59AB, 0x4148, 0x4969, 0x528C, 0x4A8C, 0x9472, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x5A2C, 0x7A72, 0x9316, 0x8AD4, 0x69EE, 0x69EE,
0x61EE, 0x4969, 0x8292, 0x7250, 0x4969, 0x720F, 0x4108, 0x62AB,
0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xF81F, 0x0000, 0x0000, 0x5A4C, 0x7231, 0x9315, 0x8AF5, 0x8AF5,
0x7A51, 0x69EE, 0x61EE, 0x4969, 0x7A92, 0x7250, 0x4969, 0x69EE,
0x59AC, 0x4188, 0xAD56, 0x0000, 0xAD55, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x628C, 0x7210, 0x9336, 0x8AF4,
0x92F5, 0x92F5, 0x92F5, 0x7A51, 0x61CD, 0x4969, 0x8292, 0x7250,
0x4969, 0x69EE, 0x720F, 0x30A6, 0x83D0, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ACD, 0x69CF, 0xA2D6,
0x8AD4, 0x8AF5, 0x92F5, 0x8AF4, 0x9315, 0x7A72, 0x61CD, 0x5169,
0x7A71, 0x7A50, 0x4969, 0x61ED, 0x69EE, 0x61CD, 0x4127, 0x9CB3,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4989,
0x62D0, 0x6453, 0x8B35, 0x92F5, 0x9315, 0x9315, 0x9316, 0x7A71,
0x69EE, 0x61CD, 0x518A, 0x598B, 0x4147, 0x518A, 0x69EF, 0x69EF,
0x598B, 0x3946, 0x0000, 0x0881, 0x20A4, 0x0000, 0x0000, 0x0000,
0x0000, 0x51AA, 0x52AE, 0x3C4E, 0x72B1, 0x8272, 0x7A51, 0x7A51,
0x7A51, 0x7210, 0x69EE, 0x69EF, 0x622D, 0x5ACC, 0x4168, 0x4948,
0x61CD, 0x720F, 0x61CC, 0x3926, 0x0000, 0x0881, 0x1884, 0xCE39,
0x0000, 0x0000, 0x0000, 0x49E9, 0x4149, 0x5149, 0x4128, 0x49EA,
0x73D2, 0x6B91, 0x632F, 0x6B50, 0x620E, 0x69CE, 0x6B10, 0x6431,
0x4A6B, 0x4147, 0x4989, 0x4949, 0x4128, 0x30E5, 0x0000, 0x0881,
0x1022, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xC618, 0x41E8, 0x6AAF, 0x9BB8, 0xA41A, 0x5A6D, 0x41C8, 0x41C9,
0x8CB4, 0x7C53, 0x7433, 0x73F1, 0x39A8, 0x41C8, 0x524A, 0x524A,
0x0000, 0x0861, 0x41C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xAD35, 0x4109, 0x92F5, 0x92D4, 0x4128,
0xB5B6, 0x734E, 0x3946, 0x7270, 0x92F4, 0x51CB, 0x5AAB, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0861, 0x0000, 0x30E5, 0x4127, 0x69EE, 0x4109,
0xBDB7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF,
0x780F, 0x7BEF, 0x7BEF, 0x780F, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDF7,
0x39E7, 0x39E7, 0x79EF, 0x39E7, 0xBDF7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
};
const uint16_t gif_frame_5[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB596, 0x628C,
0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0xC618,
0x49C9, 0x3147, 0x628C, 0x0000, 0x0000, 0x0000, 0xAD55, 0x7BEF,
0x7BEF, 0x7BEF, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x49C8, 0x518B, 0x82F3, 0x40E8, 0x62CC, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79EF, 0x7BF5,
0x39E7, 0x0000, 0xAD15, 0x28C5, 0x6A0E, 0x8AB4, 0x61CC, 0x3947,
0xC618, 0x0000, 0x7B8F, 0x42CD, 0x6412, 0x39A8, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x41A8, 0x516A, 0x720F, 0x8AF5,
0x8292, 0x4107, 0x5A8B, 0x0000, 0x736E, 0x7432, 0x8D35, 0x52CC,
0xA514, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x62ED, 0x42CC, 0x39C9, 0x7BAF, 0x4989, 0x61AC,
0x6A0F, 0x8AF4, 0x8AD4, 0x59AC, 0x522A, 0x5AAB, 0x6B6F, 0x9576,
0xC6D9, 0x84B3, 0x528B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xA514, 0x52CD, 0x7473, 0x5B4F, 0x30E5,
0x5169, 0x6A0F, 0x6A0F, 0x8AD4, 0x9316, 0x7250, 0x4948, 0x492A,
0x8412, 0x8D35, 0x0000, 0x8CF3, 0x5ACC, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x83D0, 0x428C, 0x7473,
0x534E, 0x51EB, 0x598B, 0x59AB, 0x6A0F, 0x8AD4, 0x7A71, 0x51AB,
0x82B2, 0x92D5, 0x9455, 0x8D55, 0xB658, 0x6BF1, 0x62EC, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8411,
0x428C, 0x6C32, 0x4B0D, 0x622E, 0x69EF, 0x518A, 0x61CC, 0x6A0F,
0x59AB, 0x7A91, 0x9315, 0x92D5, 0x9475, 0x8D35, 0x9D96, 0x63D0,
0x62ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x8411, 0x428C, 0x6C32, 0x530E, 0x6A2E, 0x71EF, 0x518B,
0x61CD, 0x59AC, 0x620D, 0x9316, 0x92F5, 0x8A93, 0x9495, 0x84D4,
0x7473, 0x6C12, 0x5AAC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x83F0, 0x42AC, 0x6C32, 0x4B0E, 0x51EC,
0x61CD, 0x4968, 0x61CD, 0x59AC, 0x620D, 0x9316, 0x8AF4, 0x7210,
0x5A6C, 0x7452, 0x7473, 0x52CD, 0xA4F4, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9452, 0x426B, 0x7C94,
0x5B8F, 0x4989, 0x598B, 0x4147, 0x4969, 0x518A, 0x69EE, 0x7230,
0x722F, 0x51AB, 0x28E5, 0x39C8, 0x4209, 0x9493, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x738F, 0x4ACC, 0x522B, 0x4949, 0x4148, 0x61CC, 0x61ED, 0x4969,
0x69EE, 0x69EE, 0x69EE, 0x722F, 0x69EE, 0x49A9, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x3946, 0x598B, 0x69EE, 0x4969, 0x8293,
0x7230, 0x4969, 0x69EE, 0x69EE, 0x720F, 0x92F5, 0x9316, 0x69EF,
0x6AEE, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x9451, 0x4148, 0x69EE, 0x61ED,
0x4969, 0x8292, 0x722F, 0x4969, 0x69EE, 0x69EE, 0x8292, 0x92F5,
0x8AF5, 0x9315, 0x61CE, 0x732E, 0x0000, 0x0020, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x524A, 0x4929,
0x720F, 0x61CD, 0x4969, 0x8292, 0x7230, 0x4969, 0x69EE, 0x7A72,
0x9315, 0x92F5, 0x92F5, 0x8AF5, 0x9315, 0x61AD, 0x7B6F, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62EC, 0x0000, 0x83D0,
0x4128, 0x69EE, 0x69EE, 0x61CC, 0x5169, 0x8292, 0x6A0E, 0x518A,
0x69EE, 0x82B3, 0x92F5, 0x8AF4, 0x92F5, 0x8AF4, 0x92D5, 0x9AD6,
0x596C, 0x7BAF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x736E,
0xAD35, 0x28A5, 0x69ED, 0x69EE, 0x69EF, 0x4969, 0x4948, 0x598B,
0x518A, 0x69EE, 0x69EE, 0x82B3, 0x9316, 0x9315, 0x9315, 0x92F5,
0x8374, 0x6C73, 0x51CC, 0x7B8F, 0x9CB3, 0xB596, 0x0000, 0x0000,
0x0000, 0x7B8F, 0xA514, 0x30C5, 0x6A0E, 0x720F, 0x61CC, 0x4127,
0x49A9, 0x5ACD, 0x620E, 0x69EE, 0x69EE, 0x7A30, 0x7A51, 0x7A51,
0x7A51, 0x8272, 0x6B10, 0x3C4E, 0x49AB, 0x8390, 0x9472, 0xB596,
0x0000, 0x0000, 0x0000, 0x7BAF, 0xA515, 0x2064, 0x4949, 0x4949,
0x4968, 0x4168, 0x52ED, 0x6C31, 0x6A8F, 0x69AE, 0x626E, 0x6350,
0x6350, 0x73B1, 0x7391, 0x4168, 0x4148, 0x514A, 0x38E7, 0x83D0,
0x9452, 0xB596, 0x0000, 0x0000, 0x0000, 0x0000, 0xB596, 0x41C8,
0x5A6A, 0x3967, 0x4A4A, 0x7412, 0x7433, 0x8494, 0x8432, 0x3968,
0x41E9, 0x72D1, 0xA41B, 0x9B96, 0x522C, 0x5A8B, 0x0000, 0x0000,
0x0000, 0x0000, 0x526A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xBDD8, 0x4A09, 0x6A0E, 0x92F5, 0x620D,
0x3146, 0x8C31, 0x9CB2, 0x490A, 0x9B16, 0x8272, 0x4969, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9C93, 0x490A,
0x61CC, 0x38E6, 0x49E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x780F,
0x7BFF, 0x7BEF, 0x780F, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x7BEF, 0x39EF, 0x79EF, 0x39E7, 0x39E7, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
};
const uint16_t gif_frame_6[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB596, 0x6AAD,
0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0xC618,
0x6A6F, 0x61EF, 0x630D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xCE59, 0x626E, 0x8A94, 0x8B95, 0x6B74, 0x8352, 0x0000, 0x0000,
0xAD55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xA514, 0x59EE, 0x7AD2, 0x6A2F, 0xB43B, 0x6B11,
0xC617, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x624C, 0x8435, 0x8534, 0x73B1,
0xB57A, 0xBF5F, 0x6BF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630D, 0x8CF5,
0xB678, 0xA5F6, 0x63B2, 0x0000, 0x8599, 0x8C32, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x630D, 0x84D5, 0xB658, 0xB698, 0x624D, 0xA5BC, 0x5498, 0x9431,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x630D, 0x8CF5, 0xB638, 0x8514, 0x62AE, 0x7CD9,
0x43D6, 0x9C72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x630D, 0x8CF5, 0x9D96, 0x7CB3,
0x6B10, 0x4908, 0x6B0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ACC, 0x8D36,
0x7453, 0x7493, 0x62EF, 0x40C7, 0x6B0D, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000,
0x9493, 0x636F, 0x7CB4, 0x7413, 0xAC5A, 0x59AB, 0x62CC, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x8411, 0x51EC, 0x8B36, 0xD51F, 0x724D,
0x62AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x9CD3, 0x490A, 0x92F5,
0xA3DB, 0x51AC, 0x62EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA4F4,
0x4109, 0x8292, 0xA39B, 0x7272, 0x624C, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x6ACD, 0x6A10, 0x82D2, 0x8416, 0x83F5, 0x72F1, 0x72CF,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xBDF7, 0x38E8, 0x9315, 0x94B5, 0x84F4, 0x8D14,
0x7CB4, 0x41EB, 0xAD55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xAD35, 0x496A, 0x9335, 0x8CF5,
0x9D96, 0x0000, 0x84D4, 0x5B6F, 0x4A6B, 0x0000, 0x0000, 0x0000,
0x39C7, 0x83D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49EA, 0x8232,
0xAC1C, 0x8CF6, 0x9D76, 0xC6B9, 0x8CF4, 0x5B90, 0x4209, 0x0000,
0x0000, 0x0000, 0x0000, 0x7BAF, 0x9CB3, 0xB596, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x51AA, 0x5B50, 0x8C58, 0x94D5, 0x7472, 0x84D4, 0x7473, 0x5B90,
0x420A, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BB0, 0x9472, 0xB596,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x4989, 0x4A4D, 0x628F, 0x7C53, 0x8D35, 0xAE38,
0x7452, 0x5B6F, 0x420A, 0x0000, 0x0000, 0x0000, 0x0841, 0x83D0,
0x9472, 0xB596, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x62CC, 0x5A0B, 0x522A, 0x4A0B,
0x9B96, 0xB49C, 0x82F3, 0x41C9, 0xAD35, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x526A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x4188, 0x7A31, 0x92F6, 0x514B, 0x8C11, 0x0000, 0x0000,
0xFD55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xFBFF, 0x7BEF, 0x780F, 0x7BEF, 0x7BFF,
0x7BEF, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
};
const uint16_t gif_frame_7[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDB7, 0x6AAD,
0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x7BEF, 0x7BEF, 0x7BEF, 0x000F, 0xBDF7, 0xAD55, 0x0000, 0xC638,
0x49C9, 0x41CB, 0x632E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x49A8, 0x61ED, 0x7473, 0x4A6B, 0x62AC, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xD639, 0x420A, 0x8D56, 0x3188,
0x0000, 0x0000, 0xA514, 0x30C6, 0x82F2, 0x8457, 0x7AF5, 0x3946,
0x0000, 0x0000, 0x332C, 0x632C, 0x7BEF, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C31, 0x5B4E,
0x84F5, 0x530D, 0x8C31, 0x0000, 0x3146, 0x6A0E, 0x8B15, 0x7C13,
0xABF9, 0x4908, 0x6B0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE39,
0x420A, 0x7473, 0x84B4, 0x9DB7, 0x39E9, 0x6B2D, 0x49A9, 0x7A72,
0x9315, 0x8D9A, 0x6CB9, 0x6250, 0x5A0A, 0x8431, 0x536F, 0x3A2A,
0x9472, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xCE39, 0x4A4A, 0x7453, 0xB678, 0xAD76, 0x59CD, 0x4129,
0x59EC, 0x9316, 0x9CFA, 0xBF3F, 0x5D9E, 0x5BB8, 0x40E7, 0x526B,
0x7C93, 0x5B6F, 0x5AED, 0xBDB7, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xCE59, 0x422A, 0x7CB4, 0xADB6, 0x82D2,
0x8AB3, 0xA3FC, 0x8315, 0x61CC, 0xA65F, 0x0000, 0x761F, 0x4398,
0x61ED, 0x4988, 0x6BB0, 0x7452, 0x31A8, 0xA4F4, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE59, 0x4A4A, 0x7412,
0x7AB1, 0x8AD5, 0x9357, 0xAC3E, 0x9399, 0x5169, 0x7C96, 0xC65B,
0x64B9, 0x5315, 0x82D4, 0x598B, 0x5ACD, 0x6C32, 0x39E9, 0xA4F4,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE38,
0x422A, 0x6AB0, 0x7A11, 0x8272, 0x8AF5, 0xA43E, 0xA3DB, 0x9315,
0x598B, 0x61AD, 0x516A, 0x61AC, 0x8AD4, 0x720F, 0x59AC, 0x5ACD,
0x3A09, 0xA4F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x8C31, 0x5AAD, 0x73B2, 0x526C, 0x516A, 0x82D5,
0xA3DB, 0x92F5, 0x59CB, 0x61CD, 0x59AB, 0x59CC, 0x7230, 0x518A,
0x516A, 0x49A9, 0x31E9, 0xA514, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x83F0, 0x424A, 0x3187,
0x3106, 0x61CD, 0x7A72, 0x59CC, 0x6A0E, 0xB3F8, 0x518B, 0x61CD,
0x61AD, 0x41C9, 0x4ACD, 0x530D, 0x3A09, 0xB555, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xC5D7, 0x4149, 0x6A0F, 0x8AF4, 0x9316, 0x61ED, 0x9377, 0xE57F,
0x72B3, 0x6A0E, 0x7230, 0x4948, 0x4A6B, 0x428C, 0x9472, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x5A2C, 0x7A51, 0x9B37, 0xB43F, 0x9B7A, 0x7A30,
0xAC3C, 0xDD5F, 0x8B17, 0x5169, 0x8292, 0x61CD, 0x38E6, 0x62CC,
0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xF81F, 0x0000, 0x0000, 0x5A4C, 0x7230, 0x9B37, 0x9419, 0x8C78,
0x8416, 0x8312, 0xA3DC, 0xC4DF, 0x8B17, 0x4969, 0x82B3, 0x7A72,
0x4969, 0x4187, 0xB556, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x628D, 0x720F, 0x9337, 0xA45B,
0x84D5, 0x8D14, 0x8D14, 0x7C53, 0x9C1B, 0xAC3F, 0x8B37, 0x4969,
0x5B0F, 0x6AD0, 0x598A, 0x2884, 0x83F0, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ACD, 0x69AF, 0xA317,
0xABBD, 0xA4BB, 0x84F3, 0xBE79, 0xB658, 0x7493, 0x8B95, 0xAC1E,
0x8B16, 0x4969, 0x6BF0, 0x536F, 0x5A2D, 0x5169, 0x3926, 0xA4D4,
0xB5B7, 0x7BAF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4989,
0x62AF, 0x6CF7, 0x84DB, 0xACBC, 0x84F4, 0xAE38, 0xB638, 0x7CB4,
0x8B75, 0xA3DC, 0x8272, 0x5A0B, 0x9515, 0x6411, 0x6A50, 0x69CE,
0x4948, 0x3947, 0xB576, 0x8C11, 0x9C93, 0xB596, 0x0000, 0x0000,
0x0000, 0x49AA, 0x52AE, 0x3C4D, 0x4BAF, 0x9417, 0x84D3, 0x7C94,
0x7C94, 0x7473, 0x8333, 0x9337, 0x7290, 0x7412, 0x8D15, 0x6BF1,
0x5410, 0x6AB0, 0x61AC, 0x3946, 0xAD55, 0x8C31, 0x9452, 0xB596,
0x0000, 0x0000, 0x0000, 0x49E9, 0x4149, 0x514A, 0x40E8, 0x524B,
0x7CB4, 0x7473, 0xB638, 0x9576, 0x624E, 0x71CF, 0x6B10, 0x63F0,
0x5B8F, 0x5B90, 0x3B0B, 0x4188, 0x4108, 0x3106, 0xB576, 0x9452,
0x8C31, 0xBDB7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xC618, 0x41E8, 0x6A6F, 0x9BB8, 0xB49C, 0x6A8E, 0x41C8, 0x41A9,
0x8CB4, 0x7C53, 0x7412, 0x7432, 0x3988, 0x49A8, 0x524A, 0x4A0A,
0x0000, 0x0000, 0x524A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0xAD35, 0x4109, 0x92F5, 0x8A94, 0x4108,
0xBDB6, 0x6B4D, 0x498A, 0x9315, 0x9315, 0x51AB, 0x5AAB, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0861, 0x0000, 0x4128, 0x82B3, 0x7230, 0x40E8,
0xBDD7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF,
0x780F, 0x7BEF, 0x7BEF, 0x780F, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDF7,
0x39E7, 0x79F7, 0x79EF, 0x39E7, 0xBDF7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
};
const int num_frames = 2;
const int frame_width = 26;
const int frame_height = 26;

View File

@ -1,32 +1,44 @@
#include <HardwareSerial.h>
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
#include <FastLED.h>
#include <WebServer.h>
#include <ArduinoJson.h>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <Fonts/FreeMono9pt7b.h>
#include <gif_frames.h>
#include <spacecraft.h>
#pragma region Matrix Config
#define R1_PIN 25
#define G1_PIN 26
#define B1_PIN 27
#define R2_PIN 14
#define G2_PIN 12
#define B2_PIN 13
#define A_PIN 23
#define B_PIN 22 // Changed from library default
#define C_PIN 5
#define D_PIN 17
#define E_PIN 32 // required for 1/32 scan panels, like 64x64px. Any available pin would do, i.e. IO32
#define LAT_PIN 4
#define OE_PIN 15
#define CLK_PIN 16
#define R1_PIN 4
#define G1_PIN 5
#define B1_PIN 6
#define R2_PIN 7
#define G2_PIN 15
#define B2_PIN 16
#define A_PIN 18
#define B_PIN 8 // Changed from library default
#define C_PIN 3
#define D_PIN 42
#define E_PIN 39 // required for 1/32 scan panels, like 64x64px. Any available pin would do, i.e. IO32
#define LAT_PIN 40
#define OE_PIN 2
#define CLK_PIN 41
// Configure for your panel(s) as appropriate!
#define PANEL_WIDTH 64
#define PANEL_HEIGHT 64
#define PANELS_NUMBER 2
#define PANELS_NUMBER 4
#define PANE_WIDTH PANEL_WIDTH *PANELS_NUMBER
#define PANE_HEIGHT PANEL_HEIGHT
#define NUM_PIXELS PANE_WIDTH *PANE_HEIGHT
#define COLOR_GREEN 0x07E0
#define COLOR_RED 0xF800
#define COLOR_BLUE 0x001F
#define COLOR_YELLOW 0xFFE0
#define COLOR_WHITE 0xFFFF
#define COLOR_BLACK 0x0000
MatrixPanel_I2S_DMA *dma_display = nullptr;
// Another way of creating config structure
// Custom pin mapping for all pins
@ -44,15 +56,34 @@ uint8_t buffer[bufferSize];
int bufferIndex = 0;
int numRows = 0;
int numCols = 0;
const int DATA_SIZE = 8192; // Số lượng phần tử trong mảng data
uint16_t data[DATA_SIZE]; // Mảng để lưu trữ dữ liệu RGB565
const int floatSize = sizeof(float);
static int x_moi = 0;
static int y_moi = 0;
int num_moi = 0;
bool reached = false;
bool gen_moi = false;
unsigned long period_time = millis();
const int SCREEN_WIDTH = 128;
const int SCREEN_HEIGHT = 128;
const int PLAYER_WIDTH = frame_width;
const int PLAYER_HEIGHT = frame_height;
const int ENEMY_WIDTH = 8;
const int ENEMY_HEIGHT = 8;
const int BULLET_WIDTH = 2;
const int BULLET_HEIGHT = 4;
const int NUM_ENEMIES = 10;
const int MAX_BULLETS = 10; // Số lượng viên đạn tối đa
struct Player
{
int x, y;
bool alive;
};
struct Enemy
{
int x, y;
bool alive;
};
struct Bullet
{
int x, y;
bool active;
};
uint32_t rgb565_to_rgb888(uint16_t rgb565)
{
@ -69,365 +100,460 @@ uint32_t rgb565_to_rgb888(uint16_t rgb565)
// Ghép các giá trị RGB888 thành một giá trị 32 bit
return (r << 16) | (g << 8) | b;
}
void drawXbm565(int x, int y, int width, int height, const char *xbm, uint16_t color = 0xffff)
Player player;
std::vector<Enemy> enemies(NUM_ENEMIES);
Bullet bullets[MAX_BULLETS];
void Initialize_State()
{
if (width % 8 != 0)
player = {SCREEN_WIDTH / 2 - PLAYER_WIDTH / 2, SCREEN_HEIGHT - PLAYER_HEIGHT - 10, true};
for (int i = 0; i < NUM_ENEMIES; ++i)
{
width = ((width / 8) + 1) * 8;
enemies[i] = {i * (SCREEN_WIDTH / NUM_ENEMIES)+7, 0, true};
}
for (int i = 0; i < width * height / 8; i++)
for (int i = 0; i < MAX_BULLETS; ++i)
{
unsigned char charColumn = pgm_read_byte(xbm + i);
for (int j = 0; j < 8; j++)
{
int targetX = (i * 8 + j) % width + x;
int targetY = (8 * i / (width)) + y;
if (bitRead(charColumn, j))
{
dma_display->drawPixel(targetX, targetY, color);
bullets[i] = {0, 0, false};
}
}
void fireBullet()
{
for (int i = 0; i < MAX_BULLETS; ++i)
{
if (!bullets[i].active)
{
bullets[i].x = player.x + PLAYER_WIDTH / 2 - BULLET_WIDTH / 2;
bullets[i].y = player.y - BULLET_HEIGHT;
bullets[i].active = true;
break; // Chỉ bắn một viên đạn tại một thời điểm
}
}
}
uint16_t rgbToUint16(uint8_t r, uint8_t g, uint8_t b, bool mode)
int X_player = 0;
void updatePlayer(int x)
{
if (mode)
{
uint16_t red = (r >> 3) & 0x1F; // Chuyển từ 8 bit xuống 5 bit
uint16_t green = (g >> 2) & 0x3F; // Chuyển từ 8 bit xuống 6 bit
uint16_t blue = (b >> 3) & 0x1F; // Chuyển từ 8 bit xuống 5 bit
return (red << 11) | (green << 5) | blue;
}
else
{
uint16_t red = (r >> 3) & 0x1F; // Chuyển từ 8 bit xuống 5 bit
uint16_t green = (b >> 2) & 0x3F; // Chuyển từ 8 bit xuống 6 bit
uint16_t blue = (g >> 3) & 0x1F; // Chuyển từ 8 bit xuống 5 bit
return (red << 11) | (green << 5) | blue;
}
}
void draw_true_color(int x, int y, int r, int g, int b)
{
if (y <= 31)
{
dma_display->drawPixelRGB888(x, y, r, g, b);
}
else
{
dma_display->drawPixelRGB888(x, y, r, b, g);
}
}
// Hàm kiểm tra xem điểm (x, y) có đủ xa điểm (x_ref, y_ref) không
bool isFarEnough(int x, int x_ref, int min_distance)
{
int dx = x - x_ref;
return (dx * dx) >= (min_distance * min_distance);
// Example: Move player left or right based on input
player.x = x;
}
// Hàm tạo điểm ngẫu nhiên không gần với điểm đã cho
void drawRandomPoint(int x_ref, int y_ref, int min_distance, bool generated)
unsigned long last_enemies_update = millis();
int enemies_update_rate = 500;
void updateEnemies()
{
// int x, y;
bool point_found = false;
if (generated)
{
for (int i = x_moi - 1; i <= x_moi + 1; i++)
{
for (int j = y_moi - 1; j <= y_moi + 1; j++)
{
draw_true_color(i, j, 0, 0, 255);
}
}
}
else
{
while (!point_found)
{
x_moi = random(PANE_WIDTH);
y_moi = y_ref;
// Kiểm tra khoảng cách giữa điểm ngẫu nhiên và điểm đã cho
if (isFarEnough(x_moi, x_ref, min_distance) && x_moi >= 32 && x_moi < 220)
{
point_found = true;
}
}
for (int i = x_moi - 1; i < x_moi + 1; i++)
{
for (int j = y_moi - 1; j < y_moi + 1; j++)
{
draw_true_color(i, j, 0, 0, 255);
}
}
}
}
int MinX_bar = 0;
int MaxX_bar = 5;
int MinY_bar = 50;
void Drawbar(int x)
{
// measure x dimension
int dodai = 16;
MinX_bar = x - dodai / 2;
MaxX_bar = x + dodai / 2;
dma_display->drawLine(MinX_bar, MinY_bar - 1, MaxX_bar, MinY_bar - 1, dma_display->color333(3, 3, 3));
dma_display->drawLine(MinX_bar, MinY_bar, MaxX_bar, MinY_bar, dma_display->color333(3, 3, 3));
}
bool created = false;
int X_vat = 20;
int Y_vat = 2;
int lastpoint[2];
int r = 2;
int speed = 150;
void DrawObject(bool deleted = false)
{
// measure x dimension
unsigned long now = millis();
if (!created)
if (now - last_enemies_update < enemies_update_rate)
return;
last_enemies_update = now;
for (auto &enemy : enemies)
{
lastpoint[0] = X_vat;
lastpoint[1] = Y_vat;
dma_display->fillCircle(X_vat, Y_vat, r, dma_display->color333(0, 0, 0));
dma_display->drawLine(MinX_bar, MinY_bar - 1, MaxX_bar, MinY_bar - 1, dma_display->color333(3, 3, 3));
dma_display->drawLine(MinX_bar, MinY_bar, MaxX_bar, MinY_bar, dma_display->color333(3, 3, 3));
X_vat = random(20, 109); // random(min, max), max không bao gồm
Y_vat = 2;
created = true;
if (enemy.alive)
{
enemy.y += 1; // Move downwards
if (enemy.y > SCREEN_HEIGHT)
{
for (int i = 0; i < NUM_ENEMIES; ++i)
{
enemies[i] = {i * (SCREEN_WIDTH / NUM_ENEMIES) + 7, 0, true};
}
else
{
if (now - period_time >= speed)
{
dma_display->fillCircle(X_vat, Y_vat, r, dma_display->color333(0, 0, 0));
Y_vat += 1;
if (Y_vat > 52)
created = false;
period_time = now;
//enemy.y = 0; // Reset position if off screen
}
}
// dma_display->drawCircle(X_vat,Y_vat,1,dma_display->color333(7,0,0));
dma_display->fillCircle(X_vat, Y_vat, r, dma_display->color333(7, 0, 0));
}
int score = 0;
#define COLOR_BLACK dma_display->color333(0, 0, 0)
#define COLOR_WHITE dma_display->color333(7, 7, 7)
void HeldObject()
{
if (Y_vat + r >= MinY_bar - 1 && X_vat >= MinX_bar - r && X_vat <= MaxX_bar + r)
{
Serial.println("Created");
created = false;
// DrawObject(true);
DrawObject();
dma_display->setTextColor(COLOR_BLACK);
dma_display->setCursor(2, 11);
dma_display->printf("%d", score);
score += 1;
dma_display->setFont(&FreeMono9pt7b); // Change to the desired font size
dma_display->setTextColor(COLOR_WHITE);
dma_display->setCursor(2, 11);
dma_display->printf("%d", score);
}
else
{
dma_display->setFont(&FreeMono9pt7b); // Change to the desired font size
dma_display->setTextColor(COLOR_WHITE);
dma_display->setCursor(2, 11);
dma_display->printf("%d", score);
}
}
// Stickman
int X_shot = 0;
int Y_shot = 32;
bool created_shot = false;
bool direction = false; // false = left, true = right;
int lastpoint_shot[2];
unsigned long period_shot = millis();
int speed_shot = 100;
void Drawbullet(bool deleted = false)
unsigned long last_bullets_update = millis();
int bullets_update_speed = 10;
void updateBullets()
{
// measure x dimension
unsigned long now = millis();
if (!created_shot)
if (now - last_bullets_update < bullets_update_speed)
return;
last_bullets_update = now;
for (int i = 0; i < MAX_BULLETS; ++i)
{
lastpoint_shot[0] = X_shot;
lastpoint_shot[1] = Y_shot;
dma_display->fillCircle(X_shot, Y_shot, 1, dma_display->color333(0, 0, 0));
int ran = random(1, 3);
if (ran == 1)
if (bullets[i].active)
{
X_shot = 1;
direction = false;
bullets[i].y -= 4; // Di chuyển lên trên
if (bullets[i].y < 0)
{
bullets[i].active = false; // Vô hiệu hóa nếu ra ngoài màn hình
}
else
{
X_shot = 126;
direction = true;
}
created_shot = true;
}
}
unsigned long last_game_over_time = millis();
int restart_time = 2000;
void checkCollisions()
{
// Check collision between bullet and enemies
for (int i = 0; i < MAX_BULLETS; ++i)
{
if (bullets[i].active)
{
for (auto &enemy : enemies)
{
if (enemy.alive &&
bullets[i].x < enemy.x + ENEMY_WIDTH &&
bullets[i].x + BULLET_WIDTH > enemy.x &&
bullets[i].y < enemy.y + ENEMY_HEIGHT &&
bullets[i].y + BULLET_HEIGHT > enemy.y)
{
enemy.alive = false;
bullets[i].active = false;
break;
}
}
}
}
// Check collision between enemies and player
for (auto &enemy : enemies)
{
if (enemy.alive &&
player.x < enemy.x + ENEMY_WIDTH &&
player.x + PLAYER_WIDTH > enemy.x &&
player.y < enemy.y + ENEMY_HEIGHT &&
player.y + PLAYER_HEIGHT > enemy.y)
{
player.alive = false; // Player is hit
last_game_over_time = millis();
}
}
}
bool allEnemiesDefeated() {
for (const auto& enemy : enemies) {
if (enemy.alive) {
return false; // Nếu còn kẻ thù còn sống, chưa thắng
}
}
return true; // Tất cả kẻ thù đều đã bị tiêu diệt
}
unsigned long last_render_time = millis();
int render_rate = 20; // Frame rate in frames per second
void S_frame_0(int x, int y)
{
for (int i = 0; i < frame_width; i++)
{
for (int j = 0; j < frame_height; j++)
{
int x1 = x + i;
int y1 = y + j;
if (y1 >= 64)
{
y1 = y1 - 64;
x1 = x1 + 128;
}
uint16_t color = gif_frame_0[i + j * frame_width];
dma_display->drawPixel(x1, y1, color);
}
}
}
void S_frame_1(int x, int y)
{
for (int i = 0; i < frame_width; i++)
{
for (int j = 0; j < frame_height; j++)
{
int x1 = x + i;
int y1 = y + j;
if (y1 >= 64)
{
y1 = y1 - 64;
x1 = x1 + 128;
}
uint16_t color = gif_frame_1[i + j * frame_width];
dma_display->drawPixel(x1, y1, color);
}
}
}
void S_frame_2(int x, int y)
{
for (int i = 0; i < frame_width; i++)
{
for (int j = 0; j < frame_height; j++)
{
int x1 = x + i;
int y1 = y + j;
if (y1 >= 64)
{
y1 = y1 - 64;
x1 = x1 + 128;
}
uint16_t color = gif_frame_2[i + j * frame_width];
dma_display->drawPixel(x1, y1, color);
}
}
}
void S_frame_3(int x, int y)
{
for (int i = 0; i < frame_width; i++)
{
for (int j = 0; j < frame_height; j++)
{
int x1 = x + i;
int y1 = y + j;
if (y1 >= 64)
{
y1 = y1 - 64;
x1 = x1 + 128;
}
uint16_t color = gif_frame_3[i + j * frame_width];
dma_display->drawPixel(x1, y1, color);
}
}
}
void S_frame_4(int x, int y)
{
for (int i = 0; i < frame_width; i++)
{
for (int j = 0; j < frame_height; j++)
{
int x1 = x + i;
int y1 = y + j;
if (y1 >= 64)
{
y1 = y1 - 64;
x1 = x1 + 128;
}
uint16_t color = gif_frame_4[i + j * frame_width];
dma_display->drawPixel(x1, y1, color);
}
}
}
void S_frame_5(int x, int y)
{
for (int i = 0; i < frame_width; i++)
{
for (int j = 0; j < frame_height; j++)
{
int x1 = x + i;
int y1 = y + j;
if (y1 >= 64)
{
y1 = y1 - 64;
x1 = x1 + 128;
}
uint16_t color = gif_frame_5[i + j * frame_width];
dma_display->drawPixel(x1, y1, color);
}
}
}
void S_frame_6(int x, int y)
{
for (int i = 0; i < frame_width; i++)
{
for (int j = 0; j < frame_height; j++)
{
int x1 = x + i;
int y1 = y + j;
if (y1 >= 64)
{
y1 = y1 - 64;
x1 = x1 + 128;
}
uint16_t color = gif_frame_6[i + j * frame_width];
dma_display->drawPixel(x1, y1, color);
}
}
}
void S_frame_7(int x, int y)
{
for (int i = 0; i < frame_width; i++)
{
for (int j = 0; j < frame_height; j++)
{
int x1 = x + i;
int y1 = y + j;
if (y1 >= 64)
{
y1 = y1 - 64;
x1 = x1 + 128;
}
uint16_t color = gif_frame_7[i + j * frame_width];
dma_display->drawPixel(x1, y1, color);
}
}
}
unsigned long last_frame_time = millis();
int frame_rate =4; // Frame rate in frames per second
int frame_count = -1;
void draw_spacecraft_2(int x, int y)
{
unsigned long now = millis();
if(now - last_frame_time >= 1000/frame_rate){
frame_count++;
last_frame_time = now;
}
switch (frame_count)
{
case 7:
S_frame_7(x, y);
break;
case 6:
S_frame_6(x, y);
break;
case 5:
S_frame_5(x, y);
break;
case 4:
S_frame_4(x, y);
break;
case 3:
S_frame_3(x, y);
break;
case 2:
S_frame_2(x, y);
break;
case 1:
S_frame_1(x, y);
break;
case 0:
S_frame_0(x, y);
break;
default:
S_frame_0(x, y);
break;
}
if (frame_count == num_frames-1)
frame_count = -1;
}
void draw_frame(int x, int y)
{
for (int i = 0; i < ENEMY_WIDTH; i++)
{
for (int j = 0; j < ENEMY_HEIGHT; j++)
{
int x1 = x + i;
int y1 = y + j;
if (y1 >= 64)
{
y1 = y1 - 64;
x1 = x1 + 128;
}
uint16_t color = aircraft[j * ENEMY_WIDTH + i];
dma_display->drawPixel(x1, y1, color);
}
}
}
void render()
{
unsigned long now = millis();
if (now - last_render_time < 1000 / render_rate)
return;
last_render_time = now;
dma_display->clearScreen();
dma_display->fillCircle(X_shot, Y_shot, 1, dma_display->color333(5, 0, 0));
if (player.alive)
{
int x = player.x;
int y = player.y;
if (y >= 64)
{
y = y - 64;
x = x + 128;
}
else
draw_spacecraft_2(x,y);
// dma_display->drawRect(x, y, PLAYER_WIDTH, PLAYER_HEIGHT, COLOR_GREEN);
}
for (auto &enemy : enemies)
{
if (now - period_shot >= speed_shot)
if (enemy.alive)
{
dma_display->fillCircle(lastpoint_shot[0], lastpoint_shot[1], 1, dma_display->color333(0, 0, 0));
int x = enemy.x;
int y = enemy.y;
if (direction == false)
draw_frame(x, y);
//dma_display->drawRect(x, y, ENEMY_WIDTH, ENEMY_HEIGHT, COLOR_RED);
}
}
for (int i = 0; i < MAX_BULLETS; ++i)
{
X_shot += 1;
if (X_shot >= 126)
created_shot = false;
}
else
if (bullets[i].active)
{
X_shot -= 1;
if (X_shot <= 2)
created_shot = false;
int x = bullets[i].x;
int y = bullets[i].y;
if (y >= 64)
{
y = y - 64;
x = x + 128;
}
lastpoint_shot[0] = X_shot;
lastpoint_shot[1] = Y_shot;
dma_display->fillCircle(X_shot, Y_shot, 1, dma_display->color333(5, 0, 0));
period_shot = now;
dma_display->drawRect(x, y, BULLET_WIDTH, BULLET_HEIGHT, COLOR_WHITE);
}
}
// dma_display->fillCircle(X_shot,Y_shot,1,dma_display->color333(5,0,0));
// dma_display->drawCircle(X_vat,Y_vat,1,dma_display->color333(7,0,0));
}
int current_sheildX = 0;
int current_sheildY = 0;
int length_shield = 11;
int current_stickmanX = 0;
int current_stickmanY = 0;
int Shield_open = 0;
unsigned long period_gameover = millis();
void drawStickMan(int x, int y, int defend = 0)
unsigned long period_time = millis();
bool set_FPS(int rate)
{
// Vẽ đầu
dma_display->drawCircle(x, y, 2, rgbToUint16(255, 0, 0, false)); // Đầu stick man
// Vẽ thân
dma_display->drawLine(x, y + 3, x, y + 7, rgbToUint16(255, 0, 0, false)); // Thân stick man
// Vẽ tay
dma_display->drawLine(x - 3, y + 4, x + 3, y + 4, rgbToUint16(255, 0, 0, false)); // Tay trái và tay phải
// Vẽ chân
dma_display->drawLine(x, y + 7, x - 3, y + 10, rgbToUint16(255, 0, 0, false)); // Chân trái
dma_display->drawLine(x, y + 7, x + 3, y + 10, rgbToUint16(255, 0, 0, false)); // Chân phải
current_stickmanX = x;
current_stickmanY = y;
if (defend == 2)
unsigned long now = millis();
int elapsed = 1000 / rate;
if (now - period_time >= elapsed)
{
dma_display->drawLine(x - 4, y - 1, x - 4, y + 10, rgbToUint16(255, 0, 0, false));
dma_display->drawLine(x - 5, y - 1, x - 5, y + 10, rgbToUint16(255, 0, 0, false));
current_sheildX = x - 5;
current_sheildY = y - 1;
length_shield = 11;
}
else if (defend == 1)
{
dma_display->drawLine(x + 4, y - 1, x + 4, y + 10, rgbToUint16(255, 0, 0, false));
dma_display->drawLine(x + 5, y - 1, x + 5, y + 10, rgbToUint16(255, 0, 0, false));
current_sheildX = x + 5;
current_sheildY = y - 1;
length_shield = 11;
period_time = now;
return true;
}
else
{
current_sheildX = 0;
current_sheildY = 0;
}
return false;
}
const char *text = "Game Over";
const char *text1 = "Win!!!";
bool game_over = false;
void Defend()
void Game_Over()
{
if (!direction)
{
// Do duoc ben trai
if (current_sheildX != 0)
{
// co khien trai
if (current_sheildX == current_stickmanX - 5)
{
if (X_shot >= current_sheildX)
{
created_shot = false;
}
else
{
// do nothing
}
}
// ko co khien trai
else
{
if (X_shot >= current_stickmanX - 5)
{
if(!game_over){
game_over = true;
dma_display->setFont(&FreeMono9pt7b); // Change to the desired font size
dma_display->setTextColor(COLOR_WHITE);
dma_display->setCursor(2 + 16, 11 + 20);
dma_display->print("GAME OVER");
period_gameover = millis();
}
else
{
// do nothing
}
}
}
}
else
{
if (current_sheildX != 0)
{
// co khien phai
if (current_sheildX == current_stickmanX + 5)
{
if (X_shot <= current_sheildX)
{
created_shot = false;
}
else
{
// do nothing
created_shot = true;
}
}
// ko co khien trai
else
{
if (X_shot <= current_stickmanX + 5)
{
game_over = true;
dma_display->setFont(&FreeMono9pt7b); // Change to the desired font size
dma_display->setTextColor(COLOR_WHITE);
dma_display->setCursor(2 + 16, 11 + 20);
dma_display->print("GAME OVER");
period_gameover = millis();
}
else
{
// do nothing
}
}
last_game_over_time = millis();
}
// Font metrics
int textWidth = 0;
int textHeight = 0;
int cursorX = 0;
int cursorY = 0;
// Calculate text dimensions (approximated for example)
textWidth = strlen(text) * 11; // Assuming each character is approximately 6 pixels wide
textHeight = 8; // Assuming font height is 8 pixels
// Compute the center position
cursorX = (128 - textWidth) / 2;
cursorY = (64 + textHeight) / 2;
// Set the cursor position
dma_display->setCursor(cursorX, cursorY);
// Print text on the matrix
dma_display->print(text);
}
bool win = false;
unsigned long last_win_time = millis();
void Winner()
{
if(!win){
win = true;
last_win_time = millis();
}
// Font metrics
int textWidth = 0;
int textHeight = 0;
int cursorX = 0;
int cursorY = 0;
// Calculate text dimensions (approximated for example)
textWidth = strlen(text1) * 11; // Assuming each character is approximately 6 pixels wide
textHeight = 8; // Assuming font height is 8 pixels
// Compute the center position
cursorX = (128 - textWidth) / 2;
cursorY = (64 + textHeight) / 2;
// Set the cursor position
dma_display->setCursor(cursorX, cursorY);
// Print text on the matrix
dma_display->print(text1);
}
void setup()
{
@ -436,16 +562,15 @@ void setup()
dma_display->begin(); // setup the LED matrix
dma_display->setBrightness8(200); // 0-255
dma_display->clearScreen();
// draw_cat(10,10,20,20);
// drawXbm565(10,10,20,20,CAT_bits,dma_display->color565(100,0,0));
dma_display->setTextColor(dma_display->color333(7, 7, 7)); //)
dma_display->setTextSize(1);
dma_display->setFont(&FreeMono9pt7b);
Initialize_State();
}
bool mode = false;
int reset_stickman = 2000;
bool Mode_game = false;
void loop()
{
// server.handleClient();
#pragma region Serial processing
while (Serial.available() > 0)
{
@ -469,24 +594,9 @@ void loop()
memcpy(&numRows, buffer, sizeof(int));
memcpy(&numCols, buffer + sizeof(int), sizeof(int));
if (numRows == 1 && numCols == 0)
{
Mode_game = true;
//dma_display->clearScreen();
// Serial.println("Stick Man");
}
else if (numRows == 0 && numCols == 0)
{
Mode_game = false;
// Serial.println("HungVat");
//dma_display->clearScreen();
}
int expectedSize = numRows * numCols * floatSize;
if (bufferIndex >= (2 * sizeof(int) + expectedSize))
{
dma_display->clearScreen();
for (int row = 0; row < numRows; ++row)
{
for (int col = 0; col < numCols; ++col)
@ -497,46 +607,45 @@ void loop()
data[row][col] = value;
}
}
if (!Mode_game)
if (set_FPS(20))
{
Drawbar(int(data[0][0]));
if (player.alive)
{
int x = (int)data[0][0];
int f = (int)data[0][2];
updatePlayer(x);
if (f == 1)
fireBullet();
}
else
{
if (!game_over)
drawStickMan(int(data[0][0]), int(data[0][1]), int(data[0][2]));
//Game_Over();
}
}
// Reset chỉ số chỉ mục sau khi xử lý
}
bufferIndex = 0;
}
if (Mode_game)
if(!player.alive) Game_Over();
unsigned long now = millis();
if (now - last_game_over_time >= restart_time && !player.alive)
{
if (game_over)
Initialize_State();
enemies_update_rate = 500;
}
if (allEnemiesDefeated())
{
if (millis() - period_gameover >= reset_stickman)
{
game_over = false;
dma_display->clearScreen();
}
}
}
// Stickman region
if (Mode_game)
for (int i = 0; i < NUM_ENEMIES; ++i)
{
Drawbullet();
Defend();
enemies[i] = {i * (SCREEN_WIDTH / NUM_ENEMIES) + 7, 0, true};
}
else // Hung Vat
{
DrawObject(true);
DrawObject();
HeldObject();
enemies_update_rate -= 50;
}
//if(game_over) return;
updateEnemies();
updateBullets();
checkCollisions();
render();
#pragma endregion
}

12
src/spacecraft.h Normal file
View File

@ -0,0 +1,12 @@
#include <stdint.h>
const uint16_t aircraft[8 * 8] = {
0x0000, 0x0000, 0xFFE0, 0xF962, 0xF162, 0x0000, 0xF980, 0x0000,
0xF800, 0xF921, 0x0000, 0xF9E3, 0xFA23, 0xF162, 0x0000, 0xFBE0,
0x0000, 0xF9A2, 0xF9C2, 0xFAE3, 0xFB84, 0xF9E2, 0xF101, 0xF940,
0xF800, 0xFA42, 0xFBA4, 0xFCA5, 0xFD26, 0xFB03, 0xF9E2, 0xF942,
0xF941, 0xFAA3, 0xFDA7, 0xFE89, 0xFE89, 0xFD67, 0xFAC3, 0xF941,
0xF960, 0xFB43, 0xFE69, 0xFF8D, 0xFF6D, 0xFE89, 0xFB43, 0xF960,
0xF880, 0xFAE2, 0xFE48, 0xFFF2, 0xFFF2, 0xFE68, 0xFAE2, 0xF8E0,
0x0000, 0xFA21, 0xFC43, 0xFE08, 0xFE08, 0xFC43, 0xFA61, 0x0000,
};