initial commit

main
Gwendolyn 5 months ago
commit ee867edb51
  1. 4
      .gitignore
  2. BIN
      cyber.png
  3. BIN
      cyber96.png
  4. BIN
      gradient.png
  5. 178
      imgtoc.py
  6. 302
      include/FixedPoint.h
  7. 39
      include/README
  8. 36
      include/bitmaps/cyber96.h
  9. 71
      include/bitmaps/gradient.h
  10. 252
      include/demos.cpp
  11. 42
      include/fptrig.h
  12. 15
      include/screen-settings.h
  13. 3
      include/wifi/wifi_command.h
  14. 382
      lib/Commander/Commander.cpp
  15. 318
      lib/Commander/Commander.h
  16. 57
      lib/ExtendedScreen/ExtendedScreen.cpp
  17. 76
      lib/ExtendedScreen/ExtendedScreen.h
  18. 46
      lib/README
  19. 162
      lib/Util/HSL.h
  20. 153
      lib/Util/RGB.h
  21. 24
      lib/Util/bitmap.h
  22. 18
      lib/Util/colors.h
  23. 149
      monitor/filter_esp_exception.py
  24. 54
      platformio.ini
  25. 781
      src/graphs.cpp
  26. 276
      src/pride_flags.cpp
  27. 27
      src/test.cpp
  28. 179
      src/wifi.cpp
  29. 200
      src/wifi/wifi_command.cpp
  30. 18
      test/README

4
.gitignore vendored

@ -0,0 +1,4 @@
.pio
.idea
CMakeLists*.txt
cmake-*

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1,178 @@
#!/usr/bin/env python3
# ##### ## ## #### ####### #### ####
# # # # # # # # # # # # #
# # # # # # # # # #
# # # # # ### # # # #
# # # # # # # # # # #
# ##### # # #### # #### ####
#
# Converts a bitmap image to c source.
import os
import typer
from PIL import Image
class PixelList:
byte_align_rows = 0
align_pixels = 0
depth = 0
current_row = []
rows = []
current_byte = 0
current_byte_length = 0
num_row_bytes = 0
def __init__(self, depth: int, align_pixels: int, byte_align_rows: bool):
if depth not in [1, 2, 4, 8]:
raise 'depth must be 1, 2, 4 or 8'
elif align_pixels % depth != 0:
raise 'align_pixels must be a multiple of depth'
elif align_pixels not in [1, 2, 4, 8]:
raise 'align_pixels must be 1, 2, 4 or 8'
self.depth = depth
self.byte_align_rows = byte_align_rows
self.align_pixels = align_pixels
def append_pixel(self, pixel: int):
self.current_byte = (self.current_byte << self.align_pixels) | (pixel & ((1 << self.depth) - 1))
self.current_byte_length += self.align_pixels
if self.current_byte_length == 8:
self.current_row.append(self.current_byte)
self.num_row_bytes += 1
self.current_byte = 0
self.current_byte_length = 0
pass
def end_row(self):
if self.current_byte_length > 0 and self.byte_align_rows:
byte = self.current_byte << (8 - self.current_byte_length)
self.current_row.append(byte)
self.num_row_bytes += 1
self.current_byte = 0
self.current_byte_length = 0
self.rows.append(self.current_row)
self.current_row = []
def end_image(self):
if self.current_byte_length > 0:
byte = self.current_byte << (8 - self.current_byte_length)
self.rows.append([byte])
def get_rows(self):
return self.rows
def img_to_c(im: Image, fmt: str, invert: bool, depth: int, align_pixels: int, byte_align_rows: bool):
pixels = PixelList(depth, align_pixels, byte_align_rows)
for iy in range(0, im.size[1]): # iterate rows
for ix in range(0, im.size[0]): # iterate columns
pix = im.getpixel((ix, iy))
pixels.append_pixel(pix)
pixels.end_row()
pixels.end_image()
src_c = ''
for row in pixels.get_rows(): # iterate rows
src_c += ' '
for byte in row:
if invert:
byte = 0xff - byte
if fmt == 'hex':
src_c += '0x' + format(byte, '02x')
elif fmt == 'bin':
src_c += 'B' + format(byte, '08b')
elif fmt == 'dec':
src_c += f'{byte:>3}'
src_c += ', '
src_c += '\n'
return src_c
def make_palette(depth: int):
num_colors = 1 << depth
colors = []
color_step = 255 / (num_colors - 1)
for i in range(0, num_colors - 1):
colors.append(int(color_step * i))
colors.append(255)
return colors
def find_closest_palette_color(color: int, palette: [int]) -> (int, int):
return min(enumerate(palette), key=lambda x: abs(x[1] - color))
def dither(original: Image, palette: [int]):
im = Image.new('L', original.size)
im.paste(original)
for iy in range(0, im.size[1]): # iterate rows
for ix in range(0, im.size[0]): # iterate columns
oldpix = im.getpixel((ix, iy))
closest = find_closest_palette_color(oldpix, palette)
im.putpixel((ix, iy), closest[0])
quant_error = oldpix - closest[1]
if ix < im.size[0] - 1:
im.putpixel((ix + 1, iy), int(im.getpixel((ix + 1, iy)) + quant_error * 7 / 16))
if ix > 0 and iy < im.size[1] - 1:
im.putpixel((ix - 1, iy + 1), int(im.getpixel((ix - 1, iy + 1)) + quant_error * 3 / 16))
if iy < im.size[1] - 1:
im.putpixel((ix, iy + 1), int(im.getpixel((ix, iy + 1)) + quant_error * 5 / 16))
if ix < im.size[0] - 1 and iy < im.size[1] - 1:
im.putpixel((ix + 1, iy + 1), int(im.getpixel((ix + 1, iy + 1)) + quant_error * 1 / 16))
return im
def main(input_file: str,
out: str = typer.Option(None, help='File to write to, defaults to standard output'),
name: str = typer.Option(None, help='Name of the bitmap variable in generated source, defaults to the '
'filename without extension.'),
fmt: str = typer.Option('hex', help='Format to generate image data in (hex or bin).'),
invert: bool = typer.Option(False, help='Invert brightness.'),
depth: int = typer.Option(1, help='Bit depth of the output, can be 1, 2, 4 or 8.'),
pixel_align: int = typer.Option(None, help='Bit-alignment of the pixels, defaults to the depth, can be 1, 2, 4 or 8.'),
no_row_align: bool = typer.Option(False, help='Disable byte alignment for rows.'),
):
im: Image = Image.open(input_file)
if im.mode != 'L':
im = im.convert(mode='L')
im = dither(im, make_palette(depth))
if name is None:
name = os.path.splitext(os.path.basename(input_file))[0]
if pixel_align is None:
pixel_align = depth
row_align_val = 0 if no_row_align else 1
ctext = f'// Image definition of: {input_file}\n'
ctext += 'static PROGMEM bitmap_t ' + name + ' { \n'
ctext += f' .width = {im.size[0]},\n'
ctext += f' .height = {im.size[1]},\n'
ctext += f' .depth = {depth},\n'
ctext += f' .pixel_align = {pixel_align},\n'
ctext += f' .row_align = {row_align_val},\n'
ctext += ' .data = (PROGMEM uint8_t[]) {\n'
ctext += img_to_c(im, fmt, invert, depth, pixel_align, not no_row_align)
ctext += ' }\n};\n'
if out:
with open(out, mode='w') as f:
f.write(ctext)
f.close()
else:
print(ctext)
if __name__ == "__main__":
typer.run(main)

@ -0,0 +1,302 @@
template<int ScalingFactor>
class FixedPoint {
int64_t val_;
public:
constexpr FixedPoint() : val_(0) {}
constexpr FixedPoint(int64_t v) : val_(v * ScalingFactor) {}
constexpr FixedPoint(int32_t v) : val_(v * ScalingFactor) {}
constexpr FixedPoint(int16_t v) : val_(v * ScalingFactor) {}
constexpr FixedPoint(int8_t v) : val_(v * ScalingFactor) {}
constexpr FixedPoint(uint64_t v) : val_(v * ScalingFactor) {}
constexpr FixedPoint(uint32_t v) : val_(v * ScalingFactor) {}
constexpr FixedPoint(uint16_t v) : val_(v * ScalingFactor) {}
constexpr FixedPoint(uint8_t v) : val_(v * ScalingFactor) {}
constexpr FixedPoint(float v) : val_(static_cast<int64_t>(v * ScalingFactor)) {}
constexpr FixedPoint(double v) : val_(static_cast<int64_t>(v * ScalingFactor)) {}
constexpr FixedPoint(long double v) : val_(static_cast<int64_t>(v * ScalingFactor)) {}
constexpr double toDouble() {
return static_cast<double>(val_) / ScalingFactor;
}
constexpr int64_t toInt() {
return val_ / ScalingFactor;
}
constexpr int GetScalingFactor() {
return ScalingFactor;
}
constexpr int64_t GetUnderlyingValue() {
return val_;
}
constexpr FixedPoint<ScalingFactor> abs() const {
FixedPoint<ScalingFactor> res;
res.val_ = std::abs(val_);
return res;
}
constexpr FixedPoint<ScalingFactor> exp10(int exp) {
FixedPoint<ScalingFactor> res = *this;
while(exp > 0) {
res *= 10;
exp--;
}
while (exp < 0) {
res *= 10;
exp++;
}
return res;
}
String toString(int min_decimal_digits = 0, bool zero_prefix_if_less_than_one = true) {
if (val_ == 0) {
return "0";
}
constexpr int max_len = std::numeric_limits<int64_t>::max_digits10 + 2; // max digits plus decimal point and sign
char c[max_len];
int len = 0;
int64_t val = val_;
bool negative = false;
if (val < 0) {
negative = true;
val = -val;
}
int64_t decimal_part = val % ScalingFactor;
if (decimal_part != 0) {
while (decimal_part % 10 == 0) {
decimal_part /= 10;
}
do {
len += 1;
c[max_len - len] = '0' + decimal_part % 10;
decimal_part /= 10;
} while (decimal_part > 0);
len += 1;
c[max_len - len] = '.';
}
val /= ScalingFactor;
do {
len += 1;
c[max_len - len] = '0' + val % 10;
val /= 10;
} while (val > 0);
if (negative) {
len += 1;
c[max_len - len] = '-';
}
return String(&c[max_len - len], len);
}
constexpr FixedPoint<ScalingFactor> operator-() {
FixedPoint<ScalingFactor> res;
res.val_ = -val_;
return res;
}
constexpr FixedPoint<ScalingFactor> &operator+=(const FixedPoint<ScalingFactor> &rhs) {
val_ += rhs.val_;
return *this;
}
constexpr FixedPoint<ScalingFactor> &operator+=(int rhs) {
*this += FixedPoint<ScalingFactor>(rhs);
return *this;
}
constexpr FixedPoint<ScalingFactor> &operator+=(double rhs) {
*this += FixedPoint<ScalingFactor>(rhs);
return *this;
}
constexpr FixedPoint<ScalingFactor> &operator-=(const FixedPoint<ScalingFactor> &rhs) {
val_ -= rhs.val_;
return *this;
}
constexpr FixedPoint<ScalingFactor> &operator-=(int rhs) {
*this -= FixedPoint<ScalingFactor>(rhs);
return *this;
}
constexpr FixedPoint<ScalingFactor> &operator-=(double rhs) {
*this -= FixedPoint<ScalingFactor>(rhs);
return *this;
}
constexpr FixedPoint<ScalingFactor> &operator*=(const FixedPoint<ScalingFactor> &rhs) {
val_ = val_ * rhs.val_ / ScalingFactor;
return *this;
}
constexpr FixedPoint<ScalingFactor> &operator*=(int rhs) {
*this *= FixedPoint<ScalingFactor>(rhs);
return *this;
}
constexpr FixedPoint<ScalingFactor> &operator*=(double rhs) {
*this *= FixedPoint<ScalingFactor>(rhs);
return *this;
}
constexpr FixedPoint<ScalingFactor> &operator/=(const FixedPoint<ScalingFactor> &rhs) {
val_ = val_ * ScalingFactor / rhs.val_;
return *this;
}
constexpr FixedPoint<ScalingFactor> &operator/=(int rhs) {
*this /= FixedPoint<ScalingFactor>(rhs);
return *this;
}
constexpr FixedPoint<ScalingFactor> &operator/=(double rhs) {
*this /= FixedPoint<ScalingFactor>(rhs);
return *this;
}
constexpr friend FixedPoint<ScalingFactor> operator+(FixedPoint<ScalingFactor> lhs,
const FixedPoint<ScalingFactor> &rhs) {
lhs += rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator-(FixedPoint<ScalingFactor> lhs,
const FixedPoint<ScalingFactor> &rhs) {
lhs -= rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator*(FixedPoint<ScalingFactor> lhs,
const FixedPoint<ScalingFactor> &rhs) {
lhs *= rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator/(FixedPoint<ScalingFactor> lhs,
const FixedPoint<ScalingFactor> &rhs) {
lhs /= rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator+(FixedPoint<ScalingFactor> lhs, int rhs) {
lhs += rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator+(int lhs, FixedPoint<ScalingFactor> rhs) {
rhs += lhs;
return rhs;
}
constexpr friend FixedPoint<ScalingFactor> operator+(FixedPoint<ScalingFactor> lhs, double rhs) {
lhs += rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator+(double lhs, FixedPoint<ScalingFactor> rhs) {
rhs += lhs;
return rhs;
}
constexpr friend FixedPoint<ScalingFactor> operator-(FixedPoint<ScalingFactor> lhs, int rhs) {
lhs -= rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator-(int lhs, FixedPoint<ScalingFactor> rhs) {
return FixedPoint<ScalingFactor>(lhs) - rhs;
}
constexpr friend FixedPoint<ScalingFactor> operator-(FixedPoint<ScalingFactor> lhs, double rhs) {
lhs -= rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator-(double lhs, FixedPoint<ScalingFactor> rhs) {
return FixedPoint<ScalingFactor>(lhs) - rhs;
}
constexpr friend FixedPoint<ScalingFactor> operator*(FixedPoint<ScalingFactor> lhs, int rhs) {
lhs *= rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator*(int lhs, FixedPoint<ScalingFactor> rhs) {
rhs *= lhs;
return rhs;
}
constexpr friend FixedPoint<ScalingFactor> operator*(FixedPoint<ScalingFactor> lhs, double rhs) {
lhs *= rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator*(double lhs, FixedPoint<ScalingFactor> rhs) {
rhs *= lhs;
return rhs;
}
constexpr friend FixedPoint<ScalingFactor> operator/(FixedPoint<ScalingFactor> lhs, int rhs) {
lhs /= rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator/(int lhs, FixedPoint<ScalingFactor> rhs) {
return FixedPoint<ScalingFactor>(lhs) / rhs;
}
constexpr friend FixedPoint<ScalingFactor> operator/(FixedPoint<ScalingFactor> lhs, double rhs) {
lhs /= rhs;
return lhs;
}
constexpr friend FixedPoint<ScalingFactor> operator/(double lhs, FixedPoint<ScalingFactor> rhs) {
return FixedPoint<ScalingFactor>(lhs) / rhs;
}
constexpr friend bool operator<(FixedPoint<ScalingFactor> lhs, const FixedPoint<ScalingFactor> &rhs) {
return lhs.val_ < rhs.val_;
}
constexpr friend bool operator>(FixedPoint<ScalingFactor> lhs, const FixedPoint<ScalingFactor> &rhs) {
return rhs < lhs;
}
constexpr friend bool operator<=(FixedPoint<ScalingFactor> lhs, const FixedPoint<ScalingFactor> &rhs) {
return !(lhs > rhs);
}
constexpr friend bool operator>=(FixedPoint<ScalingFactor> lhs, const FixedPoint<ScalingFactor> &rhs) {
return !(lhs < rhs);
}
constexpr friend bool operator==(FixedPoint<ScalingFactor> lhs, const FixedPoint<ScalingFactor> &rhs) {
return lhs.val_ == rhs.val_;
}
constexpr friend bool operator!=(FixedPoint<ScalingFactor> lhs, const FixedPoint<ScalingFactor> &rhs) {
return !(lhs == rhs);
}
};

@ -0,0 +1,39 @@
This directory is intended for project header files.
A header file is a file containing C declarations and macro definitions
to be shared between several project source files. You request the use of a
header file in your project source file (C, C++, etc) located in `src` folder
by including it, with the C preprocessing directive `#include'.
```src/main.c
#include "header.h"
int main (void)
{
...
}
```
Including a header file produces the same results as copying the header file
into each source file that needs it. Such copying would be time-consuming
and error-prone. With a header file, the related declarations appear
in only one place. If they need to be changed, they can be changed in one
place, and programs that include the header file will automatically use the
new version when next recompiled. The header file eliminates the labor of
finding and changing all the copies as well as the risk that a failure to
find one copy will result in inconsistencies within a program.
In C, the usual convention is to give header files names that end with `.h'.
It is most portable to use only letters, digits, dashes, and underscores in
header file names, and at most one dot.
Read more about using header files in official GCC documentation:
* Include Syntax
* Include Operation
* Once-Only Headers
* Computed Includes
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html

@ -0,0 +1,36 @@
// Image definition of: cyber96.png
static PROGMEM bitmap_t cyber96 {
.width = 96,
.height = 25,
.depth = 8,
.pixel_align = 8,
.row_align = 1,
.data = (PROGMEM uint8_t[]) {
0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x90, 0xde, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xda, 0xf0, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0xeb, 0xe3, 0x4f, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xe3, 0x9c, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xd7, 0x39, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa8, 0x2f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x38, 0xee, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0x19, 0x00, 0x00, 0x00, 0xe4, 0xfc, 0xff, 0xff, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xfe, 0xfe, 0xfd, 0xf7, 0x0e, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfd, 0x81, 0x01, 0x00, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe2, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfb, 0x5a, 0x00,
0x00, 0x00, 0x00, 0x0e, 0xe5, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x35, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xff, 0xff, 0xff, 0xff, 0x32, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x00, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x05, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfa, 0x2c,
0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xff, 0xd6, 0x06, 0x00, 0x00, 0x11, 0xff, 0xff, 0xff, 0xff, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0xff, 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0x37, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xff, 0xa6, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xff, 0xff, 0xfc, 0xa4,
0x00, 0x00, 0x0e, 0xf0, 0xfe, 0xff, 0xff, 0xfc, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0x10, 0x00, 0x00, 0x00, 0x11, 0xff, 0xff, 0xff, 0xfd, 0xc3, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xfe, 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x88, 0x88, 0x88, 0x88, 0x97, 0xe5, 0xfe, 0xff, 0xff, 0xfc, 0xb0, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xab, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x05, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8c, 0xea, 0xfc, 0xff, 0xff, 0xea,
0x00, 0x00, 0x79, 0xff, 0xff, 0xff, 0xfd, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x27, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xd9, 0xfc, 0xff, 0xff, 0xf8, 0x03, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xfe, 0xff, 0xff, 0xfd,
0x00, 0x0b, 0xec, 0xfe, 0xff, 0xff, 0xfb, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x52, 0x00, 0x00, 0x36, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0x86, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff,
0x00, 0x73, 0xff, 0xff, 0xff, 0xfd, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfe, 0xff, 0xff, 0xfd, 0xf2, 0x23, 0x11, 0xe1, 0xfc, 0xff, 0xff, 0xfd, 0xc0, 0x04, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0x23, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x7c, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0xcf, 0xfc, 0xff, 0xff, 0xf2,
0x08, 0xe8, 0xfd, 0xff, 0xff, 0xfb, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xd4, 0xfc, 0xff, 0xff, 0xfc, 0xd1, 0xb7, 0xfd, 0xff, 0xff, 0xfc, 0xe8, 0x17, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xfe, 0xff, 0xff, 0xff, 0x13, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xfc, 0xb7,
0x5e, 0xff, 0xff, 0xff, 0xfd, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0xf3, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xef, 0xfd, 0xff, 0xff, 0xed, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45,
0xb7, 0xfc, 0xff, 0xff, 0xfb, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xcf, 0xcf, 0xcf, 0xcf, 0xda, 0xfd, 0xfc, 0xff, 0xff, 0xfd, 0x96, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xcf, 0xcf, 0xcf, 0xab, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x88, 0x00,
0xe5, 0xff, 0xff, 0xfc, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf6, 0x1d, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe1, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x60, 0x00, 0x00,
0xfa, 0xff, 0xff, 0xfe, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xc6, 0xfd, 0xff, 0xff, 0xfc, 0xdb, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x6e, 0xc4, 0xfc, 0xff, 0xff, 0xff, 0xa8, 0x27, 0x01, 0x00, 0x00, 0x00,
0xe4, 0xff, 0xff, 0xfc, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xff, 0xff, 0xff, 0xff, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf6, 0x1e, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x30, 0xfd, 0xff, 0xff, 0xfe, 0xf5, 0x1a, 0x00, 0x00, 0x00, 0x00,
0xb6, 0xfc, 0xff, 0xff, 0xfb, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xff, 0xff, 0xff, 0xff, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xbb, 0xbb, 0xbb, 0xbb, 0xcc, 0xfb, 0xfc, 0xff, 0xff, 0xfd, 0x97, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xbb, 0xbb, 0xbb, 0xa2, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x00, 0x9a, 0xfe, 0xff, 0xff, 0xfd, 0xa0, 0x00, 0x00, 0x00, 0x00,
0x5e, 0xff, 0xff, 0xff, 0xfd, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xff, 0xff, 0xff, 0xff, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xed, 0xfd, 0xff, 0xff, 0xee, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x00, 0x16, 0xf2, 0xfe, 0xff, 0xff, 0xfe, 0x36, 0x00, 0x00, 0x00,
0x08, 0xe7, 0xfd, 0xff, 0xff, 0xfb, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xff, 0xff, 0xff, 0xff, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0xfe, 0xff, 0xff, 0xff, 0x13, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x00, 0x00, 0x74, 0xff, 0xff, 0xff, 0xfc, 0xc8, 0x01, 0x00, 0x00,
0x00, 0x71, 0xff, 0xff, 0xff, 0xfd, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xff, 0xff, 0xff, 0xff, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0x23, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x00, 0x00, 0x06, 0xdc, 0xfc, 0xff, 0xff, 0xff, 0x59, 0x00, 0x00,
0x00, 0x08, 0xe8, 0xfd, 0xff, 0xff, 0xfb, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xff, 0xff, 0xff, 0xff, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xff, 0xff, 0xfd, 0xe6, 0x0b, 0x00,
0x00, 0x00, 0x73, 0xff, 0xff, 0xff, 0xfd, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xff, 0xff, 0xff, 0xff, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xd9, 0xfc, 0xff, 0xff, 0xf7, 0x03, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x00, 0x00, 0x00, 0x00, 0xb9, 0xfc, 0xff, 0xff, 0xff, 0x80, 0x00,
0x00, 0x00, 0x0a, 0xec, 0xfe, 0xff, 0xff, 0xfc, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xff, 0xff, 0xff, 0xff, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x88, 0x88, 0x88, 0x88, 0x97, 0xe6, 0xfe, 0xff, 0xff, 0xfc, 0xaf, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xab, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x05, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x29, 0xfb, 0xff, 0xff, 0xff, 0xf8, 0x1f,
0x00, 0x00, 0x00, 0x75, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xff, 0xd8, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xff, 0xff, 0xff, 0xff, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0x36, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xff, 0xa8, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0xfe, 0xff, 0xff, 0xfd, 0xa0,
0x00, 0x00, 0x00, 0x09, 0xdb, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xff, 0xff, 0xff, 0xff, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x00, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x43, 0xff, 0xff, 0xff, 0xff, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xf0, 0xfe, 0xff, 0xff, 0xef,
0x00, 0x00, 0x00, 0x00, 0x2b, 0xe6, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfa, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xf5, 0xfd, 0xfe, 0xfc, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe0, 0x00, 0x00, 0x00, 0x1a, 0xfb, 0xfe, 0xfe, 0xf7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xff, 0xff, 0xfc, 0xcf,
0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x89, 0xdb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xe2, 0xe9, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xe1, 0x9a, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xd6, 0x38, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xe9, 0xe4, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xed, 0xd0, 0x2e,
}
};

@ -0,0 +1,71 @@
// Image definition of: gradient.png
static PROGMEM bitmap_t gradient {
.width = 60,
.height = 60,
.depth = 8,
.pixel_align = 8,
.row_align = 1,
.data = (PROGMEM uint8_t[]) {
0x07, 0x0b, 0x0e, 0x12, 0x15, 0x19, 0x1c, 0x20, 0x23, 0x26, 0x2a, 0x2e, 0x31, 0x34, 0x38, 0x3c, 0x3f, 0x43, 0x46, 0x49, 0x4d, 0x50, 0x54, 0x58, 0x5b, 0x5f, 0x63, 0x66, 0x6a, 0x6d, 0x71, 0x75, 0x78, 0x7c, 0x7f, 0x82, 0x86, 0x8a, 0x8d, 0x91, 0x94, 0x98, 0x9b, 0x9f, 0xa2, 0xa5, 0xa9, 0xad, 0xb0, 0xb4, 0xb7, 0xbb, 0xbe, 0xc1, 0xc5, 0xc9, 0xcc, 0xd0, 0xd3, 0xd7,
0x07, 0x0b, 0x0e, 0x11, 0x15, 0x18, 0x1c, 0x20, 0x23, 0x27, 0x2a, 0x2e, 0x31, 0x34, 0x38, 0x3c, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x50, 0x55, 0x58, 0x5b, 0x5e, 0x62, 0x66, 0x6a, 0x6d, 0x71, 0x75, 0x78, 0x7c, 0x7f, 0x82, 0x86, 0x8a, 0x8d, 0x91, 0x94, 0x98, 0x9b, 0x9f, 0xa2, 0xa6, 0xa9, 0xad, 0xb0, 0xb4, 0xb7, 0xbb, 0xbe, 0xc2, 0xc6, 0xc9, 0xcc, 0xd0, 0xd3, 0xd7,
0x07, 0x0b, 0x0e, 0x12, 0x15, 0x19, 0x1c, 0x20, 0x23, 0x27, 0x2a, 0x2d, 0x31, 0x34, 0x38, 0x3c, 0x3f, 0x43, 0x46, 0x49, 0x4d, 0x50, 0x54, 0x57, 0x5b, 0x5e, 0x62, 0x66, 0x69, 0x6d, 0x70, 0x74, 0x78, 0x7c, 0x7f, 0x82, 0x86, 0x89, 0x8d, 0x91, 0x94, 0x98, 0x9c, 0x9f, 0xa2, 0xa6, 0xa9, 0xac, 0xb0, 0xb3, 0xb7, 0xba, 0xbe, 0xc2, 0xc5, 0xc9, 0xcc, 0xd0, 0xd3, 0xd7,
0x07, 0x0a, 0x0e, 0x12, 0x15, 0x19, 0x1c, 0x20, 0x23, 0x27, 0x2a, 0x2e, 0x31, 0x35, 0x38, 0x3b, 0x3f, 0x42, 0x46, 0x49, 0x4d, 0x51, 0x54, 0x57, 0x5b, 0x5f, 0x62, 0x66, 0x69, 0x6d, 0x70, 0x74, 0x77, 0x7b, 0x7f, 0x83, 0x86, 0x8a, 0x8d, 0x90, 0x94, 0x97, 0x9b, 0x9f, 0xa2, 0xa6, 0xa9, 0xad, 0xb0, 0xb3, 0xb7, 0xbb, 0xbe, 0xc1, 0xc5, 0xc8, 0xcc, 0xd0, 0xd3, 0xd7,
0x06, 0x0a, 0x0d, 0x12, 0x15, 0x18, 0x1c, 0x1f, 0x23, 0x27, 0x2a, 0x2d, 0x31, 0x35, 0x38, 0x3c, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x58, 0x5b, 0x5f, 0x62, 0x66, 0x69, 0x6d, 0x70, 0x74, 0x77, 0x7b, 0x7e, 0x82, 0x85, 0x8a, 0x8d, 0x90, 0x94, 0x97, 0x9b, 0x9f, 0xa2, 0xa6, 0xa9, 0xad, 0xb0, 0xb4, 0xb7, 0xba, 0xbe, 0xc2, 0xc5, 0xc8, 0xcc, 0xd0, 0xd3, 0xd7,
0x06, 0x0a, 0x0d, 0x11, 0x14, 0x18, 0x1c, 0x1f, 0x23, 0x26, 0x2a, 0x2e, 0x31, 0x35, 0x38, 0x3b, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x58, 0x5b, 0x5f, 0x62, 0x65, 0x69, 0x6c, 0x70, 0x74, 0x77, 0x7b, 0x7e, 0x81, 0x85, 0x88, 0x8d, 0x91, 0x94, 0x98, 0x9b, 0x9e, 0xa2, 0xa6, 0xa9, 0xad, 0xb0, 0xb4, 0xb7, 0xbb, 0xbe, 0xc2, 0xc5, 0xc8, 0xcc, 0xcf, 0xd3, 0xd7,
0x06, 0x0a, 0x0d, 0x10, 0x14, 0x18, 0x1b, 0x1f, 0x23, 0x26, 0x2a, 0x2e, 0x31, 0x35, 0x38, 0x3c, 0x3f, 0x42, 0x46, 0x4a, 0x4d, 0x50, 0x54, 0x58, 0x5b, 0x5f, 0x62, 0x65, 0x69, 0x6c, 0x70, 0x73, 0x77, 0x7a, 0x7e, 0x81, 0x85, 0x89, 0x8c, 0x8f, 0x93, 0x97, 0x9b, 0x9f, 0xa2, 0xa5, 0xa9, 0xac, 0xb0, 0xb4, 0xb7, 0xbb, 0xbe, 0xc1, 0xc5, 0xc9, 0xcc, 0xd0, 0xd3, 0xd7,
0x06, 0x0a, 0x0d, 0x11, 0x14, 0x18, 0x1b, 0x1f, 0x22, 0x26, 0x29, 0x2e, 0x31, 0x35, 0x38, 0x3c, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x50, 0x54, 0x58, 0x5b, 0x5e, 0x62, 0x66, 0x69, 0x6d, 0x70, 0x74, 0x77, 0x7b, 0x7e, 0x81, 0x85, 0x89, 0x8c, 0x90, 0x93, 0x97, 0x9a, 0x9e, 0xa1, 0xa6, 0xa9, 0xad, 0xb0, 0xb4, 0xb7, 0xbb, 0xbe, 0xc2, 0xc5, 0xc9, 0xcc, 0xd0, 0xd3, 0xd7,
0x06, 0x0a, 0x0d, 0x11, 0x14, 0x18, 0x1b, 0x1f, 0x22, 0x26, 0x29, 0x2d, 0x30, 0x34, 0x38, 0x3b, 0x3f, 0x43, 0x46, 0x49, 0x4d, 0x51, 0x54, 0x58, 0x5c, 0x5e, 0x62, 0x66, 0x69, 0x6d, 0x70, 0x74, 0x77, 0x7b, 0x7e, 0x82, 0x85, 0x89, 0x8c, 0x8f, 0x93, 0x97, 0x9a, 0x9e, 0xa2, 0xa5, 0xa8, 0xad, 0xb1, 0xb4, 0xb7, 0xbb, 0xbe, 0xc2, 0xc5, 0xc9, 0xcc, 0xd0, 0xd3, 0xd7,
0x06, 0x0a, 0x0d, 0x11, 0x14, 0x17, 0x1b, 0x1f, 0x22, 0x26, 0x29, 0x2d, 0x30, 0x34, 0x38, 0x3a, 0x3e, 0x43, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x58, 0x5b, 0x5f, 0x62, 0x66, 0x69, 0x6d, 0x70, 0x74, 0x77, 0x7b, 0x7e, 0x82, 0x85, 0x89, 0x8c, 0x8f, 0x93, 0x97, 0x9a, 0x9e, 0xa1, 0xa4, 0xa8, 0xab, 0xaf, 0xb2, 0xb7, 0xbb, 0xbe, 0xc1, 0xc5, 0xc9, 0xcc, 0xd0, 0xd3, 0xd7,
0x06, 0x0a, 0x0d, 0x10, 0x14, 0x17, 0x1b, 0x1f, 0x22, 0x26, 0x29, 0x2c, 0x30, 0x34, 0x37, 0x3a, 0x3f, 0x42, 0x45, 0x49, 0x4d, 0x50, 0x54, 0x58, 0x5b, 0x5f, 0x62, 0x66, 0x69, 0x6c, 0x70, 0x74, 0x77, 0x7a, 0x7e, 0x82, 0x85, 0x89, 0x8c, 0x90, 0x93, 0x97, 0x9a, 0x9e, 0xa1, 0xa5, 0xa8, 0xac, 0xaf, 0xb3, 0xb6, 0xba, 0xbd, 0xc1, 0xc5, 0xc9, 0xcc, 0xd0, 0xd3, 0xd7,
0x06, 0x0a, 0x0d, 0x10, 0x14, 0x18, 0x1b, 0x1f, 0x22, 0x25, 0x29, 0x2d, 0x30, 0x34, 0x37, 0x3b, 0x3e, 0x41, 0x46, 0x49, 0x4c, 0x50, 0x54, 0x57, 0x5b, 0x5f, 0x62, 0x65, 0x69, 0x6c, 0x70, 0x74, 0x77, 0x7b, 0x7e, 0x82, 0x85, 0x89, 0x8c, 0x8f, 0x93, 0x97, 0x9a, 0x9e, 0xa1, 0xa5, 0xa8, 0xac, 0xaf, 0xb3, 0xb6, 0xba, 0xbd, 0xc1, 0xc4, 0xc8, 0xcc, 0xd0, 0xd3, 0xd7,
0x06, 0x0a, 0x0d, 0x11, 0x14, 0x18, 0x1b, 0x1f, 0x22, 0x26, 0x29, 0x2d, 0x30, 0x34, 0x37, 0x3a, 0x3e, 0x42, 0x45, 0x49, 0x4c, 0x50, 0x53, 0x56, 0x5a, 0x5f, 0x62, 0x66, 0x69, 0x6c, 0x70, 0x74, 0x77, 0x7b, 0x7e, 0x82, 0x85, 0x89, 0x8c, 0x90, 0x93, 0x97, 0x9a, 0x9e, 0xa1, 0xa4, 0xa8, 0xab, 0xaf, 0xb3, 0xb6, 0xba, 0xbe, 0xc1, 0xc4, 0xc8, 0xcb, 0xcf, 0xd3, 0xd7,
0x06, 0x0a, 0x0d, 0x11, 0x14, 0x18, 0x1b, 0x1f, 0x22, 0x25, 0x2a, 0x2d, 0x30, 0x34, 0x37, 0x3a, 0x3e, 0x42, 0x45, 0x49, 0x4c, 0x50, 0x53, 0x57, 0x5a, 0x5e, 0x61, 0x65, 0x69, 0x6d, 0x70, 0x74, 0x77, 0x7a, 0x7e, 0x81, 0x85, 0x89, 0x8c, 0x90, 0x93, 0x96, 0x9a, 0x9e, 0xa1, 0xa5, 0xa8, 0xac, 0xaf, 0xb3, 0xb6, 0xba, 0xbd, 0xc1, 0xc4, 0xc7, 0xcb, 0xcf, 0xd2, 0xd6,
0x06, 0x0a, 0x0d, 0x10, 0x14, 0x18, 0x1b, 0x1e, 0x22, 0x26, 0x29, 0x2c, 0x30, 0x34, 0x38, 0x3a, 0x3e, 0x42, 0x45, 0x49, 0x4c, 0x50, 0x54, 0x57, 0x5a, 0x5d, 0x61, 0x65, 0x68, 0x6c, 0x70, 0x74, 0x77, 0x7b, 0x7e, 0x81, 0x86, 0x89, 0x8c, 0x90, 0x93, 0x97, 0x9a, 0x9e, 0xa1, 0xa5, 0xa9, 0xac, 0xb0, 0xb3, 0xb6, 0xba, 0xbe, 0xc1, 0xc4, 0xc7, 0xcc, 0xcf, 0xd2, 0xd6,
0x06, 0x0a, 0x0d, 0x10, 0x14, 0x18, 0x1b, 0x1f, 0x22, 0x26, 0x29, 0x2d, 0x30, 0x34, 0x37, 0x3b, 0x3e, 0x42, 0x45, 0x49, 0x4c, 0x50, 0x54, 0x57, 0x5a, 0x5e, 0x61, 0x65, 0x68, 0x6c, 0x6f, 0x73, 0x77, 0x7b, 0x7e, 0x82, 0x85, 0x89, 0x8c, 0x90, 0x94, 0x97, 0x9a, 0x9e, 0xa1, 0xa5, 0xa8, 0xac, 0xaf, 0xb3, 0xb6, 0xba, 0xbd, 0xc1, 0xc4, 0xc8, 0xcb, 0xcf, 0xd2, 0xd6,
0x05, 0x09, 0x0d, 0x10, 0x14, 0x17, 0x1b, 0x1f, 0x22, 0x26, 0x2a, 0x2c, 0x30, 0x34, 0x37, 0x3b, 0x3f, 0x42, 0x45, 0x49, 0x4c, 0x50, 0x53, 0x56, 0x5a, 0x5e, 0x61, 0x65, 0x68, 0x6c, 0x6f, 0x73, 0x76, 0x7a, 0x7d, 0x81, 0x85, 0x89, 0x8c, 0x8f, 0x93, 0x96, 0x9a, 0x9e, 0xa1, 0xa5, 0xa8, 0xac, 0xaf, 0xb3, 0xb7, 0xba, 0xbd, 0xc1, 0xc4, 0xc8, 0xcb, 0xcf, 0xd2, 0xd6,
0x05, 0x09, 0x0c, 0x10, 0x13, 0x18, 0x1b, 0x1f, 0x22, 0x26, 0x29, 0x2d, 0x30, 0x34, 0x38, 0x3b, 0x3e, 0x42, 0x45, 0x48, 0x4c, 0x50, 0x54, 0x57, 0x5a, 0x5e, 0x61, 0x65, 0x68, 0x6c, 0x6f, 0x73, 0x77, 0x7a, 0x7d, 0x81, 0x85, 0x88, 0x8c, 0x8f, 0x93, 0x97, 0x9a, 0x9e, 0xa1, 0xa4, 0xa8, 0xac, 0xaf, 0xb3, 0xb6, 0xba, 0xbd, 0xc1, 0xc4, 0xc8, 0xcb, 0xce, 0xd2, 0xd6,
0x05, 0x09, 0x0c, 0x0f, 0x13, 0x17, 0x1b, 0x1e, 0x22, 0x26, 0x29, 0x2d, 0x30, 0x34, 0x37, 0x3b, 0x3f, 0x41, 0x45, 0x49, 0x4d, 0x50, 0x53, 0x57, 0x5a, 0x5e, 0x62, 0x65, 0x69, 0x6c, 0x70, 0x73, 0x76, 0x79, 0x7e, 0x81, 0x84, 0x88, 0x8b, 0x8f, 0x92, 0x97, 0x9a, 0x9e, 0xa1, 0xa5, 0xa8, 0xab, 0xaf, 0xb3, 0xb6, 0xba, 0xbd, 0xc1, 0xc4, 0xc8, 0xcb, 0xce, 0xd2, 0xd6,
0x05, 0x09, 0x0c, 0x0f, 0x13, 0x17, 0x1a, 0x1e, 0x21, 0x25, 0x29, 0x2d, 0x30, 0x34, 0x37, 0x3b, 0x3e, 0x41, 0x45, 0x49, 0x4c, 0x50, 0x53, 0x57, 0x5a, 0x5e, 0x61, 0x65, 0x68, 0x6c, 0x6f, 0x73, 0x76, 0x7a, 0x7d, 0x81, 0x84, 0x88, 0x8b, 0x8f, 0x93, 0x96, 0x99, 0x9d, 0xa1, 0xa5, 0xa9, 0xab, 0xb0, 0xb3, 0xb6, 0xb9, 0xbe, 0xc1, 0xc4, 0xc8, 0xcb, 0xcf, 0xd3, 0xd6,
0x05, 0x09, 0x0c, 0x10, 0x13, 0x17, 0x1a, 0x1e, 0x21, 0x25, 0x28, 0x2c, 0x2f, 0x33, 0x37, 0x3b, 0x3e, 0x42, 0x45, 0x49, 0x4c, 0x50, 0x53, 0x57, 0x5a, 0x5e, 0x61, 0x65, 0x69, 0x6b, 0x6f, 0x73, 0x76, 0x7a, 0x7d, 0x81, 0x84, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, 0xa4, 0xa7, 0xac, 0xb0, 0xb3, 0xb6, 0xba, 0xbd, 0xc1, 0xc4, 0xc8, 0xcb, 0xcf, 0xd2, 0xd6,
0x05, 0x09, 0x0c, 0x10, 0x14, 0x17, 0x1a, 0x1e, 0x22, 0x25, 0x28, 0x2b, 0x2f, 0x33, 0x36, 0x3a, 0x3e, 0x42, 0x45, 0x49, 0x4c, 0x50, 0x53, 0x56, 0x5a, 0x5e, 0x61, 0x65, 0x69, 0x6c, 0x6f, 0x73, 0x76, 0x7a, 0x7e, 0x81, 0x84, 0x88, 0x8c, 0x8f, 0x93, 0x96, 0x99, 0x9d, 0xa1, 0xa4, 0xa8, 0xab, 0xaf, 0xb3, 0xb6, 0xb9, 0xbd, 0xc1, 0xc4, 0xc8, 0xcb, 0xcf, 0xd3, 0xd6,
0x05, 0x09, 0x0c, 0x10, 0x13, 0x17, 0x1a, 0x1e, 0x21, 0x25, 0x28, 0x2c, 0x2f, 0x32, 0x37, 0x3a, 0x3e, 0x41, 0x44, 0x49, 0x4c, 0x50, 0x54, 0x57, 0x5a, 0x5e, 0x61, 0x65, 0x69, 0x6c, 0x6f, 0x73, 0x76, 0x7a, 0x7d, 0x81, 0x84, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa1, 0xa4, 0xa7, 0xab, 0xae, 0xb2, 0xb5, 0xb8, 0xbd, 0xc1, 0xc4, 0xc8, 0xcc, 0xcf, 0xd2, 0xd6,
0x06, 0x09, 0x0c, 0x10, 0x13, 0x16, 0x1b, 0x1e, 0x21, 0x25, 0x29, 0x2c, 0x30, 0x33, 0x37, 0x3a, 0x3e, 0x41, 0x44, 0x48, 0x4b, 0x50, 0x53, 0x56, 0x5a, 0x5e, 0x61, 0x65, 0x68, 0x6c, 0x6f, 0x73, 0x76, 0x7a, 0x7e, 0x81, 0x84, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, 0xa4, 0xa7, 0xab, 0xae, 0xb2, 0xb6, 0xb9, 0xbc, 0xc0, 0xc3, 0xc7, 0xcb, 0xcf, 0xd2, 0xd6,
0x05, 0x09, 0x0c, 0x10, 0x13, 0x16, 0x1a, 0x1e, 0x22, 0x25, 0x29, 0x2c, 0x2f, 0x32, 0x36, 0x39, 0x3d, 0x41, 0x45, 0x48, 0x4b, 0x4f, 0x52, 0x56, 0x5a, 0x5d, 0x61, 0x65, 0x68, 0x6c, 0x6f, 0x72, 0x76, 0x79, 0x7d, 0x81, 0x84, 0x88, 0x8b, 0x8f, 0x93, 0x96, 0x99, 0x9d, 0xa1, 0xa4, 0xa7, 0xab, 0xaf, 0xb2, 0xb5, 0xb9, 0xbd, 0xc0, 0xc3, 0xc7, 0xca, 0xcf, 0xd2, 0xd6,
0x05, 0x09, 0x0c, 0x10, 0x13, 0x17, 0x1a, 0x1e, 0x21, 0x25, 0x28, 0x2c, 0x2f, 0x33, 0x36, 0x3a, 0x3d, 0x41, 0x44, 0x48, 0x4b, 0x4f, 0x52, 0x56, 0x5a, 0x5d, 0x61, 0x65, 0x69, 0x6c, 0x70, 0x73, 0x77, 0x7a, 0x7d, 0x81, 0x84, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, 0xa4, 0xa8, 0xab, 0xae, 0xb2, 0xb5, 0xb9, 0xbc, 0xc0, 0xc3, 0xc7, 0xca, 0xce, 0xd1, 0xd5,
0x05, 0x09, 0x0c, 0x10, 0x13, 0x17, 0x1a, 0x1d, 0x21, 0x25, 0x29, 0x2c, 0x2f, 0x33, 0x36, 0x3a, 0x3d, 0x41, 0x44, 0x48, 0x4b, 0x4f, 0x52, 0x56, 0x59, 0x5d, 0x61, 0x64, 0x68, 0x6b, 0x6f, 0x73, 0x77, 0x79, 0x7d, 0x81, 0x84, 0x88, 0x8b, 0x8e, 0x93, 0x96, 0x99, 0x9d, 0xa0, 0xa4, 0xa7, 0xab, 0xaf, 0xb1, 0xb6, 0xb9, 0xbd, 0xc0, 0xc3, 0xc7, 0xca, 0xce, 0xd1, 0xd5,
0x05, 0x09, 0x0c, 0x10, 0x13, 0x17, 0x1b, 0x1e, 0x21, 0x25, 0x28, 0x2c, 0x2f, 0x33, 0x37, 0x3a, 0x3d, 0x41, 0x44, 0x48, 0x4b, 0x4f, 0x52, 0x56, 0x59, 0x5d, 0x60, 0x64, 0x67, 0x6b, 0x6e, 0x72, 0x77, 0x79, 0x7e, 0x80, 0x84, 0x88, 0x8b, 0x8f, 0x93, 0x96, 0x99, 0x9d, 0xa0, 0xa4, 0xa7, 0xab, 0xaf, 0xb2, 0xb5, 0xb9, 0xbc, 0xc0, 0xc3, 0xc7, 0xcb, 0xce, 0xd1, 0xd5,
0x04, 0x08, 0x0c, 0x10, 0x13, 0x17, 0x1a, 0x1e, 0x21, 0x25, 0x28, 0x2c, 0x2f, 0x33, 0x36, 0x3a, 0x3e, 0x41, 0x44, 0x48, 0x4b, 0x4f, 0x52, 0x56, 0x59, 0x5d, 0x60, 0x64, 0x67, 0x6b, 0x6e, 0x72, 0x75, 0x79, 0x7c, 0x81, 0x84, 0x88, 0x8c, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, 0xa4, 0xa7, 0xab, 0xaf, 0xb2, 0xb5, 0xb9, 0xbd, 0xc0, 0xc3, 0xc7, 0xca, 0xce, 0xd1, 0xd5,
0x05, 0x08, 0x0b, 0x0f, 0x13, 0x16, 0x1a, 0x1e, 0x21, 0x25, 0x28, 0x2b, 0x30, 0x33, 0x37, 0x3a, 0x3d, 0x40, 0x45, 0x48, 0x4b, 0x4f, 0x52, 0x56, 0x59, 0x5d, 0x60, 0x64, 0x68, 0x6b, 0x6e, 0x72, 0x76, 0x79, 0x7c, 0x80, 0x84, 0x87, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa1, 0xa4, 0xa7, 0xab, 0xae, 0xb2, 0xb5, 0xb9, 0xbc, 0xc0, 0xc4, 0xc7, 0xcb, 0xce, 0xd1, 0xd5,
0x04, 0x08, 0x0c, 0x0e, 0x12, 0x16, 0x19, 0x1e, 0x21, 0x25, 0x28, 0x2c, 0x2f, 0x33, 0x36, 0x39, 0x3e, 0x41, 0x44, 0x48, 0x4c, 0x4f, 0x52, 0x56, 0x59, 0x5d, 0x61, 0x64, 0x67, 0x6b, 0x6f, 0x72, 0x76, 0x79, 0x7c, 0x80, 0x84, 0x87, 0x8a, 0x8e, 0x92, 0x96, 0x99, 0x9d, 0xa0, 0xa3, 0xa7, 0xab, 0xaf, 0xb2, 0xb5, 0xb9, 0xbc, 0xc0, 0xc3, 0xc7, 0xca, 0xce, 0xd2, 0xd5,
0x04, 0x08, 0x0c, 0x0f, 0x13, 0x16, 0x19, 0x1d, 0x20, 0x25, 0x28, 0x2c, 0x30, 0x33, 0x36, 0x3a, 0x3d, 0x41, 0x45, 0x48, 0x4b, 0x4f, 0x53, 0x56, 0x59, 0x5d, 0x61, 0x64, 0x67, 0x6b, 0x6f, 0x72, 0x75, 0x79, 0x7d, 0x80, 0x83, 0x87, 0x8a, 0x8e, 0x91, 0x95, 0x99, 0x9d, 0xa0, 0xa4, 0xa8, 0xab, 0xaf, 0xb2, 0xb5, 0xb9, 0xbc, 0xc0, 0xc3, 0xc7, 0xcb, 0xce, 0xd2, 0xd5,
0x04, 0x08, 0x0b, 0x0f, 0x12, 0x16, 0x19, 0x1d, 0x21, 0x24, 0x27, 0x2b, 0x2f, 0x33, 0x36, 0x3a, 0x3d, 0x41, 0x44, 0x48, 0x4b, 0x4f, 0x52, 0x56, 0x59, 0x5d, 0x60, 0x64, 0x67, 0x6b, 0x6e, 0x72, 0x76, 0x79, 0x7d, 0x80, 0x83, 0x87, 0x8b, 0x8e, 0x92, 0x95, 0x98, 0x9c, 0xa0, 0xa3, 0xa7, 0xab, 0xae, 0xb2, 0xb5, 0xb9, 0xbc, 0xc0, 0xc4, 0xc7, 0xcb, 0xce, 0xd1, 0xd4,
0x04, 0x08, 0x0b, 0x0f, 0x12, 0x16, 0x1a, 0x1d, 0x20, 0x24, 0x27, 0x2b, 0x2e, 0x32, 0x35, 0x3a, 0x3d, 0x41, 0x45, 0x48, 0x4b, 0x4f, 0x52, 0x56, 0x59, 0x5d, 0x60, 0x64, 0x68, 0x6b, 0x6f, 0x72, 0x75, 0x79, 0x7c, 0x80, 0x83, 0x87, 0x8a, 0x8e, 0x92, 0x95, 0x98, 0x9c, 0x9f, 0xa3, 0xa7, 0xaa, 0xaf, 0xb2, 0xb5, 0xb9, 0xbc, 0xc0, 0xc3, 0xc7, 0xca, 0xce, 0xd2, 0xd5,
0x04, 0x08, 0x0b, 0x0f, 0x12, 0x16, 0x19, 0x1d, 0x21, 0x24, 0x28, 0x2b, 0x2e, 0x32, 0x35, 0x39, 0x3d, 0x40, 0x45, 0x48, 0x4b, 0x4f, 0x52, 0x55, 0x59, 0x5d, 0x61, 0x64, 0x67, 0x6b, 0x6e, 0x72, 0x75, 0x79, 0x7c, 0x80, 0x83, 0x87, 0x8b, 0x8e, 0x92, 0x95, 0x99, 0x9c, 0x9f, 0xa3, 0xa7, 0xaa, 0xad, 0xb1, 0xb5, 0xb9, 0xbd, 0xc0, 0xc4, 0xc7, 0xca, 0xce, 0xd1, 0xd5,
0x04, 0x08, 0x0c, 0x0f, 0x12, 0x16, 0x1a, 0x1d, 0x21, 0x24, 0x28, 0x2b, 0x2e, 0x32, 0x35, 0x39, 0x3c, 0x40, 0x44, 0x47, 0x4c, 0x4f, 0x52, 0x56, 0x59, 0x5d, 0x61, 0x64, 0x68, 0x6b, 0x6f, 0x72, 0x75, 0x79, 0x7d, 0x80, 0x84, 0x87, 0x8a, 0x8e, 0x91, 0x95, 0x99, 0x9c, 0xa0, 0xa3, 0xa6, 0xaa, 0xad, 0xb1, 0xb4, 0xb8, 0xbb, 0xbf, 0xc4, 0xc7, 0xca, 0xce, 0xd1, 0xd5,
0x04, 0x08, 0x0b, 0x0f, 0x12, 0x16, 0x19, 0x1d, 0x20, 0x24, 0x27, 0x2b, 0x2e, 0x32, 0x36, 0x39, 0x3d, 0x40, 0x43, 0x47, 0x4a, 0x4e, 0x52, 0x56, 0x59, 0x5d, 0x60, 0x64, 0x68, 0x6b, 0x6e, 0x72, 0x75, 0x79, 0x7c, 0x80, 0x83, 0x87, 0x8b, 0x8e, 0x92, 0x95, 0x98, 0x9c, 0xa0, 0xa3, 0xa7, 0xaa, 0xae, 0xb1, 0xb5, 0xb8, 0xbc, 0xbf, 0xc2, 0xc6, 0xca, 0xce, 0xd1, 0xd5,
0x04, 0x08, 0x0b, 0x0f, 0x13, 0x16, 0x19, 0x1d, 0x21, 0x24, 0x28, 0x2b, 0x2f, 0x32, 0x35, 0x39, 0x3d, 0x40, 0x43, 0x47, 0x4b, 0x4e, 0x52, 0x55, 0x58, 0x5c, 0x60, 0x64, 0x67, 0x6b, 0x6e, 0x72, 0x75, 0x79, 0x7d, 0x80, 0x83, 0x87, 0x8a, 0x8e, 0x92, 0x95, 0x99, 0x9c, 0xa0, 0xa3, 0xa6, 0xaa, 0xad, 0xb1, 0xb5, 0xb8, 0xbb, 0xbf, 0xc3, 0xc6, 0xc9, 0xcd, 0xd1, 0xd5,
0x04, 0x08, 0x0b, 0x0f, 0x12, 0x16, 0x1a, 0x1d, 0x21, 0x24, 0x28, 0x2b, 0x2e, 0x32, 0x35, 0x39, 0x3c, 0x40, 0x44, 0x47, 0x4b, 0x4e, 0x52, 0x55, 0x59, 0x5c, 0x60, 0x63, 0x66, 0x6b, 0x6e, 0x72, 0x75, 0x79, 0x7c, 0x80, 0x83, 0x87, 0x8a, 0x8e, 0x91, 0x95, 0x99, 0x9c, 0x9f, 0xa3, 0xa7, 0xaa, 0xad, 0xb1, 0xb5, 0xb8, 0xbc, 0xbf, 0xc2, 0xc6, 0xc9, 0xcd, 0xd1, 0xd4,
0x04, 0x08, 0x0b, 0x0f, 0x12, 0x16, 0x19, 0x1d, 0x20, 0x24, 0x27, 0x2b, 0x2e, 0x32, 0x36, 0x39, 0x3c, 0x40, 0x43, 0x47, 0x4a, 0x4e, 0x52, 0x55, 0x58, 0x5c, 0x60, 0x63, 0x67, 0x6a, 0x6e, 0x72, 0x75, 0x79, 0x7d, 0x80, 0x84, 0x87, 0x8b, 0x8e, 0x92, 0x95, 0x99, 0x9c, 0x9f, 0xa3, 0xa6, 0xaa, 0xae, 0xb1, 0xb4, 0xb8, 0xbb, 0xbf, 0xc2, 0xc6, 0xca, 0xcd, 0xd1, 0xd4,
0x04, 0x08, 0x0b, 0x0f, 0x12, 0x16, 0x19, 0x1d, 0x20, 0x24, 0x27, 0x2b, 0x2e, 0x32, 0x35, 0x39, 0x3d, 0x40, 0x43, 0x47, 0x4a, 0x4e, 0x52, 0x55, 0x59, 0x5c, 0x5f, 0x63, 0x67, 0x6a, 0x6e, 0x71, 0x74, 0x78, 0x7c, 0x80, 0x84, 0x87, 0x8b, 0x8e, 0x91, 0x95, 0x98, 0x9c, 0x9f, 0xa3, 0xa7, 0xaa, 0xad, 0xb1, 0xb4, 0xb8, 0xbb, 0xbf, 0xc3, 0xc6, 0xca, 0xcd, 0xd0, 0xd4,
0x03, 0x07, 0x0a, 0x0f, 0x12, 0x16, 0x19, 0x1d, 0x20, 0x24, 0x28, 0x2b, 0x2e, 0x32, 0x36, 0x39, 0x3c, 0x40, 0x43, 0x47, 0x4b, 0x4e, 0x51, 0x55, 0x58, 0x5c, 0x60, 0x63, 0x67, 0x6a, 0x6e, 0x71, 0x75, 0x78, 0x7c, 0x7f, 0x82, 0x87, 0x8b, 0x8e, 0x91, 0x95, 0x99, 0x9c, 0xa0, 0xa3, 0xa6, 0xaa, 0xae, 0xb1, 0xb4, 0xb8, 0xbc, 0xbf, 0xc3, 0xc6, 0xca, 0xcd, 0xd1, 0xd4,
0x04, 0x07, 0x0b, 0x0e, 0x12, 0x15, 0x19, 0x1d, 0x21, 0x24, 0x27, 0x2b, 0x2f, 0x32, 0x35, 0x39, 0x3c, 0x40, 0x43, 0x47, 0x4b, 0x4e, 0x52, 0x55, 0x59, 0x5c, 0x60, 0x63, 0x66, 0x6a, 0x6d, 0x71, 0x74, 0x78, 0x7b, 0x7f, 0x82, 0x86, 0x8a, 0x8e, 0x92, 0x95, 0x99, 0x9c, 0x9f, 0xa3, 0xa7, 0xaa, 0xae, 0xb1, 0xb4, 0xb8, 0xbc, 0xbf, 0xc3, 0xc6, 0xca, 0xcd, 0xd1, 0xd4,
0x03, 0x07, 0x0b, 0x0e, 0x12, 0x15, 0x18, 0x1c, 0x1f, 0x24, 0x28, 0x2b, 0x2e, 0x32, 0x35, 0x39, 0x3d, 0x40, 0x44, 0x47, 0x4a, 0x4e, 0x52, 0x55, 0x58, 0x5c, 0x5f, 0x63, 0x67, 0x6a, 0x6d, 0x71, 0x74, 0x78, 0x7b, 0x7f, 0x83, 0x86, 0x8a, 0x8d, 0x90, 0x94, 0x99, 0x9c, 0xa0, 0xa3, 0xa6, 0xaa, 0xad, 0xb1, 0xb4, 0xb8, 0xbb, 0xbf, 0xc3, 0xc6, 0xca, 0xcd, 0xd0, 0xd4,
0x04, 0x07, 0x0b, 0x0e, 0x11, 0x15, 0x18, 0x1c, 0x20, 0x23, 0x27, 0x2b, 0x2f, 0x32, 0x35, 0x39, 0x3c, 0x40, 0x44, 0x47, 0x4a, 0x4e, 0x52, 0x55, 0x59, 0x5c, 0x5f, 0x63, 0x67, 0x6a, 0x6d, 0x71, 0x75, 0x78, 0x7b, 0x7f, 0x83, 0x86, 0x8a, 0x8d, 0x91, 0x94, 0x98, 0x9b, 0x9f, 0xa3, 0xa7, 0xaa, 0xae, 0xb1, 0xb5, 0xb8, 0xbb, 0xbf, 0xc3, 0xc6, 0xc9, 0xcd, 0xd1, 0xd4,
0x04, 0x07, 0x0a, 0x0e, 0x11, 0x15, 0x19, 0x1c, 0x20, 0x23, 0x26, 0x2a, 0x2e, 0x31, 0x35, 0x39, 0x3d, 0x40, 0x43, 0x47, 0x4b, 0x4e, 0x52, 0x55, 0x59, 0x5c, 0x5f, 0x63, 0x67, 0x6a, 0x6e, 0x71, 0x74, 0x78, 0x7b, 0x7f, 0x82, 0x86, 0x89, 0x8d, 0x91, 0x94, 0x98, 0x9b, 0x9e, 0xa2, 0xa5, 0xa9, 0xae, 0xb1, 0xb5, 0xb8, 0xbc, 0xbf, 0xc3, 0xc6, 0xc9, 0xcd, 0xd1, 0xd4,
0x04, 0x07, 0x0b, 0x0e, 0x11, 0x15, 0x19, 0x1c, 0x1f, 0x23, 0x26, 0x2a, 0x2e, 0x31, 0x35, 0x38, 0x3c, 0x40, 0x43, 0x47, 0x4a, 0x4e, 0x52, 0x55, 0x58, 0x5c, 0x60, 0x63, 0x66, 0x6a, 0x6d, 0x71, 0x74, 0x78, 0x7c, 0x7f, 0x83, 0x86, 0x89, 0x8d, 0x90, 0x94, 0x97, 0x9b, 0x9f, 0xa2, 0xa6, 0xa9, 0xad, 0xb0, 0xb5, 0xb8, 0xbb, 0xbf, 0xc2, 0xc6, 0xc9, 0xcd, 0xd0, 0xd4,
0x04, 0x07, 0x0a, 0x0e, 0x12, 0x15, 0x19, 0x1c, 0x20, 0x23, 0x27, 0x2a, 0x2d, 0x31, 0x34, 0x38, 0x3c, 0x3f, 0x43, 0x46, 0x4b, 0x4e, 0x52, 0x55, 0x59, 0x5c, 0x5f, 0x63, 0x66, 0x6a, 0x6e, 0x71, 0x74, 0x78, 0x7c, 0x7f, 0x83, 0x86, 0x89, 0x8d, 0x91, 0x94, 0x97, 0x9b, 0x9f, 0xa2, 0xa5, 0xa9, 0xad, 0xb0, 0xb4, 0xb7, 0xba, 0xbf, 0xc3, 0xc6, 0xca, 0xcd, 0xd1, 0xd4,
0x03, 0x07, 0x0b, 0x0e, 0x12, 0x15, 0x19, 0x1c, 0x1f, 0x23, 0x26, 0x2a, 0x2e, 0x31, 0x34, 0x38, 0x3c, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x52, 0x55, 0x58, 0x5c, 0x60, 0x63, 0x67, 0x6a, 0x6e, 0x71, 0x74, 0x78, 0x7b, 0x7f, 0x82, 0x86, 0x89, 0x8d, 0x91, 0x94, 0x98, 0x9b, 0x9f, 0xa2, 0xa6, 0xa9, 0xad, 0xb0, 0xb4, 0xb7, 0xbb, 0xbe, 0xc1, 0xc5, 0xca, 0xcd, 0xd1, 0xd4,
0x03, 0x07, 0x0a, 0x0e, 0x12, 0x15, 0x19, 0x1c, 0x20, 0x23, 0x26, 0x2a, 0x2e, 0x31, 0x34, 0x38, 0x3c, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x50, 0x54, 0x58, 0x5c, 0x60, 0x63, 0x66, 0x6a, 0x6e, 0x71, 0x75, 0x78, 0x7c, 0x7f, 0x83, 0x86, 0x8a, 0x8d, 0x91, 0x94, 0x98, 0x9b, 0x9e, 0xa2, 0xa6, 0xa9, 0xac, 0xb0, 0xb4, 0xb7, 0xbb, 0xbe, 0xc1, 0xc5, 0xc9, 0xcc, 0xd1, 0xd4,
0x03, 0x07, 0x0a, 0x0e, 0x12, 0x15, 0x19, 0x1c, 0x1f, 0x23, 0x27, 0x2a, 0x2e, 0x31, 0x35, 0x38, 0x3c, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x57, 0x5b, 0x5e, 0x62, 0x67, 0x6a, 0x6d, 0x71, 0x75, 0x78, 0x7c, 0x7f, 0x82, 0x86, 0x89, 0x8d, 0x90, 0x94, 0x97, 0x9b, 0x9f, 0xa3, 0xa6, 0xa9, 0xac, 0xb0, 0xb4, 0xb8, 0xbb, 0xbe, 0xc2, 0xc5, 0xc9, 0xcc, 0xcf, 0xd3,
0x04, 0x07, 0x0a, 0x0e, 0x11, 0x15, 0x18, 0x1c, 0x20, 0x23, 0x27, 0x2a, 0x2d, 0x31, 0x34, 0x38, 0x3b, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x58, 0x5b, 0x5e, 0x62, 0x66, 0x69, 0x6d, 0x71, 0x75, 0x78, 0x7c, 0x7f, 0x83, 0x86, 0x8a, 0x8d, 0x91, 0x94, 0x97, 0x9b, 0x9f, 0xa2, 0xa6, 0xa9, 0xac, 0xb0, 0xb4, 0xb7, 0xba, 0xbe, 0xc2, 0xc5, 0xc9, 0xcc, 0xd0, 0xd3,
0x03, 0x07, 0x0b, 0x0e, 0x12, 0x15, 0x19, 0x1c, 0x1f, 0x23, 0x27, 0x2a, 0x2e, 0x31, 0x35, 0x38, 0x3b, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x58, 0x5b, 0x5f, 0x62, 0x66, 0x69, 0x6c, 0x70, 0x74, 0x78, 0x7b, 0x7f, 0x82, 0x86, 0x8a, 0x8d, 0x91, 0x94, 0x98, 0x9b, 0x9f, 0xa2, 0xa5, 0xa9, 0xac, 0xb0, 0xb4, 0xb7, 0xba, 0xbe, 0xc1, 0xc5, 0xc9, 0xcc, 0xd0, 0xd3,
0x02, 0x06, 0x0a, 0x0e, 0x11, 0x15, 0x19, 0x1c, 0x20, 0x23, 0x27, 0x2a, 0x2d, 0x31, 0x35, 0x38, 0x3c, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x58, 0x5b, 0x5f, 0x62, 0x65, 0x69, 0x6d, 0x70, 0x73, 0x77, 0x7b, 0x7e, 0x83, 0x86, 0x8a, 0x8d, 0x90, 0x95, 0x97, 0x9b, 0x9f, 0xa2, 0xa6, 0xa9, 0xad, 0xb0, 0xb4, 0xb7, 0xbb, 0xbf, 0xc2, 0xc5, 0xc8, 0xcc, 0xd0, 0xd3,
0x03, 0x06, 0x09, 0x0d, 0x11, 0x15, 0x18, 0x1c, 0x1f, 0x23, 0x26, 0x2a, 0x2e, 0x31, 0x34, 0x38, 0x3b, 0x3f, 0x42, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x58, 0x5b, 0x5e, 0x62, 0x66, 0x69, 0x6d, 0x70, 0x74, 0x77, 0x7a, 0x7e, 0x81, 0x85, 0x89, 0x8d, 0x91, 0x94, 0x97, 0x9b, 0x9f, 0xa2, 0xa6, 0xa9, 0xac, 0xb0, 0xb4, 0xb7, 0xba, 0xbe, 0xc2, 0xc5, 0xc9, 0xcc, 0xd0, 0xd3,
0x02, 0x06, 0x0a, 0x0d, 0x11, 0x14, 0x18, 0x1b, 0x1f, 0x23, 0x27, 0x2a, 0x2d, 0x31, 0x35, 0x38, 0x3b, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x58, 0x5b, 0x5f, 0x62, 0x66, 0x69, 0x6c, 0x71, 0x74, 0x77, 0x7b, 0x7e, 0x82, 0x85, 0x89, 0x8c, 0x90, 0x94, 0x98, 0x9b, 0x9e, 0xa2, 0xa6, 0xa9, 0xad, 0xb0, 0xb3, 0xb7, 0xbb, 0xbe, 0xc1, 0xc5, 0xc9, 0xcd, 0xd0, 0xd3,
0x03, 0x06, 0x0a, 0x0d, 0x11, 0x14, 0x17, 0x1b, 0x1f, 0x22, 0x26, 0x2a, 0x2d, 0x31, 0x34, 0x38, 0x3b, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x57, 0x5b, 0x5e, 0x62, 0x65, 0x69, 0x6d, 0x70, 0x74, 0x77, 0x7a, 0x7e, 0x81, 0x85, 0x89, 0x8c, 0x90, 0x93, 0x97, 0x9a, 0x9e, 0xa2, 0xa5, 0xa9, 0xad, 0xb0, 0xb4, 0xb7, 0xba, 0xbe, 0xc1, 0xc5, 0xc8, 0xcc, 0xcf, 0xd3,
0x03, 0x06, 0x0a, 0x0d, 0x11, 0x14, 0x17, 0x1b, 0x1e, 0x22, 0x26, 0x29, 0x2d, 0x31, 0x34, 0x38, 0x3b, 0x3f, 0x42, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x58, 0x5b, 0x5f, 0x62, 0x66, 0x69, 0x6d, 0x70, 0x73, 0x77, 0x7b, 0x7e, 0x82, 0x85, 0x89, 0x8c, 0x90, 0x94, 0x97, 0x9a, 0x9e, 0xa2, 0xa5, 0xa9, 0xad, 0xb0, 0xb4, 0xb7, 0xbb, 0xbe, 0xc2, 0xc5, 0xc9, 0xcd, 0xd0, 0xd3,
0x03, 0x06, 0x0a, 0x0d, 0x11, 0x14, 0x18, 0x1b, 0x1e, 0x22, 0x26, 0x29, 0x2d, 0x30, 0x33, 0x37, 0x3c, 0x3f, 0x43, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x58, 0x5b, 0x5f, 0x62, 0x66, 0x69, 0x6d, 0x70, 0x74, 0x77, 0x7a, 0x7e, 0x82, 0x85, 0x89, 0x8c, 0x90, 0x93, 0x96, 0x9b, 0x9e, 0xa1, 0xa5, 0xa8, 0xac, 0xb0, 0xb4, 0xb7, 0xbb, 0xbe, 0xc2, 0xc5, 0xc9, 0xcc, 0xcf, 0xd3,
0x03, 0x06, 0x0a, 0x0e, 0x11, 0x14, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x29, 0x2d, 0x30, 0x33, 0x37, 0x3b, 0x3e, 0x42, 0x46, 0x4a, 0x4d, 0x51, 0x54, 0x58, 0x5b, 0x5f, 0x62, 0x66, 0x69, 0x6d, 0x70, 0x74, 0x77, 0x7b, 0x7e, 0x82, 0x85, 0x88, 0x8c, 0x8f, 0x93, 0x97, 0x9a, 0x9e, 0xa1, 0xa5, 0xa8, 0xac, 0xaf, 0xb3, 0xb7, 0xba, 0xbe, 0xc2, 0xc5, 0xc8, 0xcc, 0xcf, 0xd3,
}
};

@ -0,0 +1,252 @@
float p = 3.1415926;
typedef struct {
uint8_t width;
uint8_t height;
const uint8_t *data;
} bitmap_t;
/*const uint8_t PROGMEM dvdlogo_data[] = {
B00001111, B11111111, B11111100, B00000011, B11111111, B11000000,
B00001111, B11111111, B11111100, B00000011, B11111111, B11111000,
B00000000, B00111111, B11111100, B00000111, B11100001, B11111110,
B00000000, B00000111, B11011110, B00001111, B00000000, B00111110,
B00011110, B00000011, B11011110, B00011110, B01111000, B00011111,
B00011110, B00000011, B11011110, B00111100, B01111000, B00011111,
B00011110, B00000011, B11001111, B00111100, B11111000, B00011110,
B00011110, B00000111, B11001111, B01111000, B11110000, B00011110,
B00111110, B00001111, B10000111, B11110000, B11110000, B00111100,
B00111110, B00111111, B00000111, B11100000, B11110000, B11111000,
B00111111, B11111100, B00000111, B11000000, B11111111, B11110000,
B00111111, B11110000, B00000011, B10000001, B11111111, B10000000,
B00000000, B00000000, B00000011, B10000000, B00000000, B00000000,
B00000000, B00000000, B00000011, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B00000001, B11111111, B11111111, B11111111, B11111100, B00000000,
B00111111, B11111111, B11100000, B01111111, B11111111, B11100000,
B11111111, B11111111, B10000000, B00011111, B11111111, B11111000,
B01111111, B11111111, B10000000, B00111111, B11111111, B11110000,
B00000111, B11111111, B11111111, B11111111, B11111111, B00000000,
B00000000, B00000011, B11111111, B11111110, B00000000, B00000000 };*/
/* DVD logo */
static PROGMEM bitmap_t dvdlogo = {
.width = 48,
.height = 22,
.data = (PROGMEM uint8_t[]) {
B00001111, B11111111, B11111100, B00000011, B11111111, B11000000,
B00001111, B11111111, B11111100, B00000011, B11111111, B11111000,
B00000000, B00111111, B11111100, B00000111, B11100001, B11111110,
B00000000, B00000111, B11011110, B00001111, B00000000, B00111110,
B00011110, B00000011, B11011110, B00011110, B01111000, B00011111,
B00011110, B00000011, B11011110, B00111100, B01111000, B00011111,
B00011110, B00000011, B11001111, B00111100, B11111000, B00011110,
B00011110, B00000111, B11001111, B01111000, B11110000, B00011110,
B00111110, B00001111, B10000111, B11110000, B11110000, B00111100,
B00111110, B00111111, B00000111, B11100000, B11110000, B11111000,
B00111111, B11111100, B00000111, B11000000, B11111111, B11110000,
B00111111, B11110000, B00000011, B10000001, B11111111, B10000000,
B00000000, B00000000, B00000011, B10000000, B00000000, B00000000,
B00000000, B00000000, B00000011, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B00000001, B11111111, B11111111, B11111111, B11111100, B00000000,
B00111111, B11111111, B11100000, B01111111, B11111111, B11100000,
B11111111, B11111111, B10000000, B00011111, B11111111, B11111000,
B01111111, B11111111, B10000000, B00111111, B11111111, B11110000,
B00000111, B11111111, B11111111, B11111111, B11111111, B00000000,
B00000000, B00000011, B11111111, B11111110, B00000000, B00000000
}
};
void testlines(uint16_t color) {
screen.fillScreen(BLACK);
for (uint16_t x = 0; x < screen.width() - 1; x += 6) {
screen.drawLine(0, 0, x, screen.height() - 1, color);
}
for (uint16_t y = 0; y < screen.height() - 1; y += 6) {
screen.drawLine(0, 0, screen.width() - 1, y, color);
}
screen.fillScreen(BLACK);
for (uint16_t x = 0; x < screen.width() - 1; x += 6) {
screen.drawLine(screen.width() - 1, 0, x, screen.height() - 1, color);
}
for (uint16_t y = 0; y < screen.height() - 1; y += 6) {
screen.drawLine(screen.width() - 1, 0, 0, y, color);
}
screen.fillScreen(BLACK);
for (uint16_t x = 0; x < screen.width() - 1; x += 6) {
screen.drawLine(0, screen.height() - 1, x, 0, color);
}
for (uint16_t y = 0; y < screen.height() - 1; y += 6) {
screen.drawLine(0, screen.height() - 1, screen.width() - 1, y, color);
}
screen.fillScreen(BLACK);
for (uint16_t x = 0; x < screen.width() - 1; x += 6) {
screen.drawLine(screen.width() - 1, screen.height() - 1, x, 0, color);
}
for (uint16_t y = 0; y < screen.height() - 1; y += 6) {
screen.drawLine(screen.width() - 1, screen.height() - 1, 0, y, color);
}
}
void testdrawtext(const char *text, uint16_t color) {
screen.setCursor(0, 0);
screen.setTextColor(color);
screen.print(text);
}
void testfastlines(uint16_t color1, uint16_t color2) {
screen.fillScreen(BLACK);
for (uint16_t y = 0; y < screen.height() - 1; y += 5) {
screen.drawFastHLine(0, y, screen.width() - 1, color1);
}
for (uint16_t x = 0; x < screen.width() - 1; x += 5) {
screen.drawFastVLine(x, 0, screen.height() - 1, color2);
}
}
void testdrawrects(uint16_t color) {
screen.fillScreen(BLACK);
for (uint16_t x = 0; x < screen.height() - 1; x += 6) {
screen.drawRect((screen.width() - 1) / 2 - x / 2, (screen.height() - 1) / 2 - x / 2, x, x, color);
}
}
void testfillrects(uint16_t color1, uint16_t color2) {
screen.fillScreen(BLACK);
for (uint16_t x = screen.height() - 1; x > 6; x -= 6) {
screen.fillRect((screen.width() - 1) / 2 - x / 2, (screen.height() - 1) / 2 - x / 2, x, x, color1);
screen.drawRect((screen.width() - 1) / 2 - x / 2, (screen.height() - 1) / 2 - x / 2, x, x, color2);
}
}
void testfillcircles(uint8_t radius, uint16_t color) {
for (uint8_t x = radius; x < screen.width() - 1; x += radius * 2) {
for (uint8_t y = radius; y < screen.height() - 1; y += radius * 2) {
screen.fillCircle(x, y, radius, color);
}
}
}
void testdrawcircles(uint8_t radius, uint16_t color) {
for (uint8_t x = 0; x < screen.width() - 1 + radius; x += radius * 2) {
for (uint8_t y = 0; y < screen.height() - 1 + radius; y += radius * 2) {
screen.drawCircle(x, y, radius, color);
}
}
}
void testtriangles() {
screen.fillScreen(BLACK);
int color = 0xF800;
int t;
int w = screen.width() / 2;
int x = screen.height();
int y = 0;
int z = screen.width();
for (t = 0; t <= 15; t += 1) {
screen.drawTriangle(w, y, y, x, z, x, color);
x -= 4;
y += 4;
z -= 4;
color += 100;
}
}
void testroundrects() {
screen.fillScreen(BLACK);
int color = 100;
int x = 0;
int y = 0;
int w = screen.width();
int h = screen.height();
for (int i = 0; i <= 24; i++) {
screen.drawRoundRect(x, y, w, h, 5, color);
x += 2;
y += 3;
w -= 4;
h -= 6;
color += 1100;
Serial.println(i);
}
}
void oledPrintTest() {
screen.fillScreen(BLACK);
screen.setCursor(0, 5);
screen.setTextColor(RED);
screen.setTextSize(1);
screen.println("Hello World!");
screen.setTextColor(YELLOW);
screen.setTextSize(2);
screen.println("Hello World!");
screen.setTextColor(BLUE);
screen.setTextSize(3);
screen.print(1234.567);
delay(1500);
screen.setCursor(0, 5);
screen.fillScreen(BLACK);
screen.setTextColor(WHITE);
screen.setTextSize(0);
screen.println("Hello World!");
screen.setTextSize(1);
screen.setTextColor(GREEN);
screen.print(p, 6);
screen.println(" Want pi?");
screen.println(" ");
screen.print(8675309, HEX); // print 8,675,309 out in HEX!
screen.println(" Print HEX!");
screen.println(" ");
screen.setTextColor(WHITE);
screen.println("Sketch has been");
screen.println("running for: ");
screen.setTextColor(MAGENTA);
screen.print(millis() / 1000);
screen.setTextColor(WHITE);
screen.print(" seconds.");
}
void mediabuttons() {
// play
screen.fillScreen(BLACK);
screen.fillRoundRect(25, 10, 78, 60, 8, WHITE);
screen.fillTriangle(42, 20, 42, 60, 90, 40, RED);
delay(500);
// pause
screen.fillRoundRect(25, 90, 78, 60, 8, WHITE);
screen.fillRoundRect(39, 98, 20, 45, 5, GREEN);
screen.fillRoundRect(69, 98, 20, 45, 5, GREEN);
delay(500);
// play color
screen.fillTriangle(42, 20, 42, 60, 90, 40, BLUE);
delay(50);
// pause color
screen.fillRoundRect(39, 98, 20, 45, 5, RED);
screen.fillRoundRect(69, 98, 20, 45, 5, RED);
// play color
screen.fillTriangle(42, 20, 42, 60, 90, 40, GREEN);
}
/**************************************************************************/
/*!
@brief Renders a simple test pattern on the screen
*/
/**************************************************************************/
void lcdTestPattern(void) {
static const uint16_t PROGMEM colors[] =
{RED, YELLOW, GREEN, CYAN, BLUE, MAGENTA, BLACK, WHITE};
for (uint8_t c = 0; c < 8; c++) {
screen.fillRect(0, screen.height() * c / 8, screen.width(), screen.height() / 8,
pgm_read_word(&colors[c]));
}
}

@ -0,0 +1,42 @@
#include <cstdint>
/*
Implements the 5-order polynomial approximation to sin(x).
@param i angle (with 2^15 units/circle)
@return 16 bit fixed point Sine value (4.12) (ie: +4096 = +1 & -4096 = -1)
The result is accurate to within +- 1 count. ie: +/-2.44e-4.
*/
int16_t fpsin(int16_t i)
{
/* Convert (signed) input to a value between 0 and 8192. (8192 is pi/2, which is the region of the curve fit). */
/* ------------------------------------------------------------------- */
i <<= 1;
uint8_t c = i<0; //set carry for output pos/neg
if(i == (i|0x4000)) // flip input value to corresponding value in range [0..8192)
i = (1<<15) - i;
i = (i & 0x7FFF) >> 1;
/* ------------------------------------------------------------------- */