mirror of https://github.com/sqfmi/Watchy.git
Compare commits
105 Commits
Author | SHA1 | Date |
---|---|---|
SQFMI | 667d86737d | |
SQFMI | d65738fbaa | |
SQFMI | 2dd98737fb | |
SQFMI | 5a5b343737 | |
sqfmi | 2da3fd9ede | |
SQFMI | acbb6eeece | |
sqfmi | c1c95f9587 | |
sqfmi | bd1657e9c7 | |
sqfmi | fbbcaabbd1 | |
SQFMI | e9854a7fa2 | |
sqfmi | fddbe504c1 | |
sqfmi | aa3528371d | |
sqfmi | 3ffb0f8697 | |
sqfmi | b786f24240 | |
sqfmi | 2528878570 | |
sqfmi | 1b15c1b5fe | |
Daniel Ansorregui | be185cbd54 | |
Daniel Ansorregui | f369b6f207 | |
Daniel Ansorregui | 8103df1499 | |
Daniel Ansorregui | 84c0cd106c | |
Daniel Ansorregui | 3ce125247d | |
Daniel Ansorregui | f2c0c91a61 | |
Daniel Ansorregui | 2b21e50c2f | |
Sudrien | b84ab91c6b | |
Sean M. Collins | b8eeda70c6 | |
Sean M. Collins | a719bfa116 | |
Sean M. Collins | 459cc2a18f | |
Denis Pitzalis | df5fce8d40 | |
SQFMI | 342eb48a49 | |
wjgeorge | 98fd0abfeb | |
SQFMI | 1d5605c0e9 | |
SQFMI | 704ef60470 | |
SQFMI | cc6c196e37 | |
SQFMI | 35e65a1972 | |
SQFMI | 65061fd30f | |
SQFMI | b1b5eeb890 | |
SQFMI | 2b327c64b8 | |
wjgeorge | 3c73c7e2c8 | |
SQFMI | cc1ff02123 | |
SQFMI | 0e1aa800dd | |
SQFMI | cc882cd9f7 | |
SQFMI | 6682d501a6 | |
SQFMI | dc2795dcd9 | |
SQFMI | 9177aee6d6 | |
SQFMI | c2bbf8a01a | |
Adam Minchinton | 0e319fe3e7 | |
SQFMI | f6f7a38c8e | |
SQFMI | 266ae56458 | |
SQFMI | 96c4465924 | |
SQFMI | b48408be6e | |
SQFMI | c0e814d269 | |
SQFMI | 3300f6f271 | |
SQFMI | e125f85926 | |
SQFMI | ce8c5d4f78 | |
SQFMI | 851467cc86 | |
sqfmi | c3587d04a7 | |
sqfmi | ce71292ea9 | |
Kenneth Henderick | 3a3a926c2a | |
sqfmi | e5556cb700 | |
SQFMI | 83aada6452 | |
Sukhpal Singh | 3a7eff4a8e | |
SQFMI | aaa3d91113 | |
Kenneth Henderick | f49e1a5fab | |
Sukhpal Singh | 9ac9aeded9 | |
SQFMI | ef0534e92b | |
SQFMI | 2cdfeaa0d1 | |
SQFMI | 7333873f08 | |
SQFMI | 9a64af8b3d | |
SQFMI | 5921655691 | |
SQFMI | 472eee733d | |
SQFMI | 6e41b9c982 | |
Olivier Mehani | dd3797f2d5 | |
Alex-K37 | 5e451fbf04 | |
SQFMI | c5344d9d42 | |
Olivier Mehani | cbb4820d85 | |
Olivier Mehani | c750754e8a | |
Olivier Mehani | 5f07f2ec63 | |
Olivier Mehani | b0e405e187 | |
Olivier Mehani | 2bd89ef250 | |
SQFMI | eb43be0634 | |
sqfmi | 9e5d7ad19c | |
sqfmi | 99158e19d4 | |
sqfmi | a24b1d0945 | |
sqfmi | 8adde783be | |
SQFMI | 4c56a38f34 | |
SQFMI | 53acbe6929 | |
sqfmi | c5ceab1a49 | |
sqfmi | 5e0834f309 | |
SQFMI | fdfe7ee2be | |
ITCactus | 819606e892 | |
Daniel Ansorregui | 04126ce5f6 | |
Daniel Ansorregui | 5c27f4721f | |
Daniel Ansorregui | 561673927c | |
sqfmi | 2e957fb80b | |
SQFMI | 5690db077f | |
sqfmi | 44c51fce90 | |
Stuart P. Bentley | 37ea6135da | |
SQFMI | 3e3a8859a9 | |
sqfmi | 715a0e1bd3 | |
SQFMI | 00dc02fe21 | |
SQFMI | 4b739afbd0 | |
SQFMI | c5ddfb4e7b | |
SQFMI | 8440fc7960 | |
Alexandre J. Raymond | 170029672a | |
Christopher Chin | 20dd8a26e0 |
|
@ -0,0 +1,27 @@
|
||||||
|
name: Build Example Watchfaces
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- "dev"
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- "dev"
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build Example Watchfaces
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
- uses: ArminJo/arduino-test-compile@v3
|
||||||
|
with:
|
||||||
|
arduino-board-fqbn: esp32:esp32:watchy:Revision=v20,PartitionScheme=min_spiffs,UploadSpeed=921600,DebugLevel=none,EraseFlash=none
|
||||||
|
platform-url: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
|
||||||
|
required-libraries: Adafruit GFX Library,Arduino_JSON,DS3232RTC,NTPClient,Rtc_Pcf8563,GxEPD2,WiFiManager
|
||||||
|
set-build-path: true
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: binaries
|
||||||
|
path: ${{ github.workspace }}/examples/WatchFaces/**/build/*.bin
|
||||||
|
- uses: actions/download-artifact@v3
|
||||||
|
- name: Display structure of downloaded files
|
||||||
|
run: ls -R
|
|
@ -0,0 +1,38 @@
|
||||||
|
name: Release
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v[0-9]+.[0-9]+.[0-9]+"
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
name: Build and Release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
board-revisions: [v10, v15, v20]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
- uses: ArminJo/arduino-test-compile@v3
|
||||||
|
with:
|
||||||
|
arduino-board-fqbn: esp32:esp32:watchy:Revision=${{ matrix.board-revisions }},PartitionScheme=min_spiffs,UploadSpeed=921600,DebugLevel=none,EraseFlash=none
|
||||||
|
platform-url: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
|
||||||
|
required-libraries: Adafruit GFX Library,Arduino_JSON,DS3232RTC,NTPClient,Rtc_Pcf8563,GxEPD2,WiFiManager
|
||||||
|
set-build-path: true
|
||||||
|
- name: Rename binaries with board revision
|
||||||
|
run: |
|
||||||
|
parent_dir="${{ github.workspace }}/examples/WatchFaces"
|
||||||
|
for dir in "$parent_dir"/*; do
|
||||||
|
if [ -d "$dir" ]; then
|
||||||
|
cd "$dir/build"
|
||||||
|
for file in *; do
|
||||||
|
name="${file%%.*}"
|
||||||
|
ext="${file#$name.}"
|
||||||
|
mv "$file" "$name-${{ matrix.board-revisions }}.$ext"
|
||||||
|
done
|
||||||
|
cd -
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
- uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
name: "Watchy Arduino Library ${{ github.ref_name }}"
|
||||||
|
files: ${{ github.workspace }}/examples/WatchFaces/**/build/*.bin
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2020 SQFMI
|
Copyright (c) 2023 SQFMI
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
![Watchy](https://watchy.sqfmi.com/img/watchy_render.png)
|
![Watchy](https://watchy.sqfmi.com/img/watchy_render.png)
|
||||||
|
|
||||||
**Buy Watchy at [Crowd Supply](https://www.crowdsupply.com/sqfmi/watchy) and [Mouser](https://www.mouser.com/ProductDetail/SQFMI/SQFMI-WATCHY-10?qs=DRkmTr78QARN9VSJRzqRxw%3D%3D)!**
|
**Buy Watchy from [The Pi Hut](https://thepihut.com/collections/sqfmi), [Crowd Supply](https://www.crowdsupply.com/sqfmi/watchy), and [Mouser](https://www.mouser.com/ProductDetail/SQFMI/SQFMI-WATCHY-10?qs=DRkmTr78QARN9VSJRzqRxw%3D%3D)!**
|
||||||
|
|
||||||
[**Watchy Case & Accessories**](https://shop.sqfmi.com)
|
[**Watchy Case & Accessories**](https://shop.sqfmi.com)
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ Visit [**https://watchy.sqfmi.com**](https://watchy.sqfmi.com) for documentation
|
||||||
4. Compile & Upload with these board settings:
|
4. Compile & Upload with these board settings:
|
||||||
* Board: "Watchy"
|
* Board: "Watchy"
|
||||||
* Partition Scheme: "Huge App"
|
* Partition Scheme: "Huge App"
|
||||||
* Board Revision: "Watchy v2.0" (if purchased in 2022)
|
* Board Revision: Choose your Watchy version
|
||||||
* All Other Settings: leave to default
|
* All Other Settings: leave to default
|
||||||
|
|
||||||
You may also have to install the [CP2104 USB to Serial drivers](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers) if the port is not automatically detected.
|
You may also have to install the [CP2104 USB to Serial drivers](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers) if the port is not automatically detected.
|
||||||
|
@ -25,3 +25,8 @@ You may also have to install the [CP2104 USB to Serial drivers](https://www.sila
|
||||||
### Have Fun! :)
|
### Have Fun! :)
|
||||||
|
|
||||||
|
|
||||||
|
### Got Questions?
|
||||||
|
|
||||||
|
Join our [Discord](https://discord.gg/ZXDegGV8E7)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -125,24 +125,29 @@ void Watchy7SEG::drawWeather(){
|
||||||
display.drawBitmap(165, 110, currentWeather.isMetric ? celsius : fahrenheit, 26, 20, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
display.drawBitmap(165, 110, currentWeather.isMetric ? celsius : fahrenheit, 26, 20, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||||||
const unsigned char* weatherIcon;
|
const unsigned char* weatherIcon;
|
||||||
|
|
||||||
//https://openweathermap.org/weather-conditions
|
if(WIFI_CONFIGURED){
|
||||||
if(weatherConditionCode > 801){//Cloudy
|
//https://openweathermap.org/weather-conditions
|
||||||
weatherIcon = cloudy;
|
if(weatherConditionCode > 801){//Cloudy
|
||||||
}else if(weatherConditionCode == 801){//Few Clouds
|
weatherIcon = cloudy;
|
||||||
weatherIcon = cloudsun;
|
}else if(weatherConditionCode == 801){//Few Clouds
|
||||||
}else if(weatherConditionCode == 800){//Clear
|
weatherIcon = cloudsun;
|
||||||
weatherIcon = sunny;
|
}else if(weatherConditionCode == 800){//Clear
|
||||||
}else if(weatherConditionCode >=700){//Atmosphere
|
weatherIcon = sunny;
|
||||||
weatherIcon = atmosphere;
|
}else if(weatherConditionCode >=700){//Atmosphere
|
||||||
}else if(weatherConditionCode >=600){//Snow
|
weatherIcon = atmosphere;
|
||||||
weatherIcon = snow;
|
}else if(weatherConditionCode >=600){//Snow
|
||||||
}else if(weatherConditionCode >=500){//Rain
|
weatherIcon = snow;
|
||||||
weatherIcon = rain;
|
}else if(weatherConditionCode >=500){//Rain
|
||||||
}else if(weatherConditionCode >=300){//Drizzle
|
weatherIcon = rain;
|
||||||
weatherIcon = drizzle;
|
}else if(weatherConditionCode >=300){//Drizzle
|
||||||
}else if(weatherConditionCode >=200){//Thunderstorm
|
weatherIcon = drizzle;
|
||||||
weatherIcon = thunderstorm;
|
}else if(weatherConditionCode >=200){//Thunderstorm
|
||||||
}else
|
weatherIcon = thunderstorm;
|
||||||
return;
|
}else
|
||||||
|
return;
|
||||||
|
}else{
|
||||||
|
weatherIcon = chip;
|
||||||
|
}
|
||||||
|
|
||||||
display.drawBitmap(145, 158, weatherIcon, WEATHER_ICON_WIDTH, WEATHER_ICON_HEIGHT, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
display.drawBitmap(145, 158, weatherIcon, WEATHER_ICON_WIDTH, WEATHER_ICON_HEIGHT, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,6 +150,21 @@ const unsigned char thunderstorm[] PROGMEM = {
|
||||||
0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x01,
|
0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||||
0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
};
|
};
|
||||||
|
// 'cputemp', 48x32px
|
||||||
|
const unsigned char cputemp [] PROGMEM = {
|
||||||
|
0x00, 0x01, 0x8c, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x8c, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x8c, 0xe7,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x8c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
|
||||||
|
0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xef, 0xff, 0xff, 0xef, 0x80,
|
||||||
|
0x03, 0xef, 0xff, 0xff, 0xef, 0x80, 0x03, 0xef, 0xff, 0xff, 0xe7, 0x80, 0x00, 0x0f, 0xff, 0xff,
|
||||||
|
0xe0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xef, 0xff, 0xff, 0xef, 0x80, 0x03, 0xef,
|
||||||
|
0xff, 0xff, 0xef, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xef, 0xff, 0xff, 0xef, 0x80, 0x03, 0xef, 0xff, 0xff,
|
||||||
|
0xef, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f,
|
||||||
|
0xff, 0xff, 0xe0, 0x00, 0x03, 0xef, 0xff, 0xff, 0xef, 0x80, 0x03, 0xef, 0xff, 0xff, 0xef, 0x80,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8c, 0xe7, 0x00, 0x00, 0x00, 0x01,
|
||||||
|
0x8c, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x8c, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x8c, 0xe7, 0x00, 0x00
|
||||||
|
};
|
||||||
// 'steps', 19x23px
|
// 'steps', 19x23px
|
||||||
const unsigned char steps [] PROGMEM = {
|
const unsigned char steps [] PROGMEM = {
|
||||||
0x00, 0x03, 0xc0, 0x00, 0x07, 0xe0, 0x00, 0x07, 0xe0, 0x00, 0x0f, 0xe0, 0x78, 0x0f, 0xe0, 0xfc,
|
0x00, 0x03, 0xc0, 0x00, 0x07, 0xe0, 0x00, 0x07, 0xe0, 0x00, 0x0f, 0xe0, 0x78, 0x0f, 0xe0, 0xfc,
|
||||||
|
@ -174,3 +189,19 @@ const unsigned char wifioff [] PROGMEM = {
|
||||||
0x01, 0xff, 0xc0, 0x00, 0x07, 0xe1, 0xc0, 0x00, 0x0f, 0xc0, 0x80, 0x00, 0x1f, 0x0c, 0x00, 0x00,
|
0x01, 0xff, 0xc0, 0x00, 0x07, 0xe1, 0xc0, 0x00, 0x0f, 0xc0, 0x80, 0x00, 0x1f, 0x0c, 0x00, 0x00,
|
||||||
0x3c, 0x1e, 0x00, 0x00, 0xf8, 0x0c, 0x00, 0x00
|
0x3c, 0x1e, 0x00, 0x00, 0xf8, 0x0c, 0x00, 0x00
|
||||||
};
|
};
|
||||||
|
// 'chip', 48x32px
|
||||||
|
const unsigned char chip [] PROGMEM = {
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x48, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x12, 0x48, 0x00, 0x00, 0x00, 0x00, 0x12, 0x48, 0x00, 0x00, 0x00, 0x00, 0x12, 0x48, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01,
|
||||||
|
0x00, 0x00, 0x00, 0x0f, 0x87, 0xf9, 0xf0, 0x00, 0x00, 0x00, 0x88, 0x09, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x90, 0x09, 0x00, 0x00, 0x00, 0x0f, 0x90, 0x09, 0xf0, 0x00, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x00, 0x0f, 0x90, 0x09, 0xf0, 0x00, 0x00, 0x00, 0x90, 0x09,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x00, 0x0f, 0x9f, 0xf9, 0xf0, 0x00, 0x00, 0x00,
|
||||||
|
0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x12, 0x48, 0x00, 0x00, 0x00, 0x00, 0x12, 0x48, 0x00, 0x00, 0x00, 0x00, 0x12, 0x48,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x12, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
|
|
@ -3,26 +3,41 @@
|
||||||
|
|
||||||
//Weather Settings
|
//Weather Settings
|
||||||
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
||||||
|
|
||||||
|
//You can also use LAT,LON for your location instead of CITY_ID, but not both
|
||||||
|
//#define LAT "40.7127" //New York City, Looked up on https://www.latlong.net/
|
||||||
|
//#define LON "-74.0059"
|
||||||
|
|
||||||
|
#ifdef CITY_ID
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id={cityID}&lang={lang}&units={units}&appid={apiKey}" //open weather api using city ID
|
||||||
|
#else
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&lang={lang}&units={units}&appid={apiKey}" //open weather api using lat lon
|
||||||
|
#endif
|
||||||
|
|
||||||
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
||||||
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id=" //open weather api
|
|
||||||
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
||||||
#define TEMP_LANG "en"
|
#define TEMP_LANG "en"
|
||||||
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
||||||
//NTP Settings
|
//NTP Settings
|
||||||
#define NTP_SERVER "pool.ntp.org"
|
#define NTP_SERVER "pool.ntp.org"
|
||||||
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5
|
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5 EST, -4 EDT, will be overwritten by weather data
|
||||||
#define DST_OFFSET_SEC 3600
|
|
||||||
|
|
||||||
watchySettings settings{
|
watchySettings settings{
|
||||||
CITY_ID,
|
#ifdef CITY_ID
|
||||||
OPENWEATHERMAP_APIKEY,
|
.cityID = CITY_ID,
|
||||||
OPENWEATHERMAP_URL,
|
#else
|
||||||
TEMP_UNIT,
|
.cityID = "",
|
||||||
TEMP_LANG,
|
.lat = LAT,
|
||||||
WEATHER_UPDATE_INTERVAL,
|
.lon = LON,
|
||||||
NTP_SERVER,
|
#endif
|
||||||
GMT_OFFSET_SEC,
|
.weatherAPIKey = OPENWEATHERMAP_APIKEY,
|
||||||
DST_OFFSET_SEC
|
.weatherURL = OPENWEATHERMAP_URL,
|
||||||
|
.weatherUnit = TEMP_UNIT,
|
||||||
|
.weatherLang = TEMP_LANG,
|
||||||
|
.weatherUpdateInterval = WEATHER_UPDATE_INTERVAL,
|
||||||
|
.ntpServer = NTP_SERVER,
|
||||||
|
.gmtOffset = GMT_OFFSET_SEC,
|
||||||
|
.vibrateOClock = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -3,26 +3,41 @@
|
||||||
|
|
||||||
//Weather Settings
|
//Weather Settings
|
||||||
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
||||||
|
|
||||||
|
//You can also use LAT,LON for your location instead of CITY_ID, but not both
|
||||||
|
//#define LAT "40.7127" //New York City, Looked up on https://www.latlong.net/
|
||||||
|
//#define LON "-74.0059"
|
||||||
|
|
||||||
|
#ifdef CITY_ID
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id={cityID}&lang={lang}&units={units}&appid={apiKey}" //open weather api using city ID
|
||||||
|
#else
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&lang={lang}&units={units}&appid={apiKey}" //open weather api using lat lon
|
||||||
|
#endif
|
||||||
|
|
||||||
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
||||||
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id=" //open weather api
|
|
||||||
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
||||||
#define TEMP_LANG "en"
|
#define TEMP_LANG "en"
|
||||||
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
||||||
//NTP Settings
|
//NTP Settings
|
||||||
#define NTP_SERVER "pool.ntp.org"
|
#define NTP_SERVER "pool.ntp.org"
|
||||||
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5
|
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5 EST, -4 EDT, will be overwritten by weather data
|
||||||
#define DST_OFFSET_SEC 3600
|
|
||||||
|
|
||||||
watchySettings settings{
|
watchySettings settings{
|
||||||
CITY_ID,
|
#ifdef CITY_ID
|
||||||
OPENWEATHERMAP_APIKEY,
|
.cityID = CITY_ID,
|
||||||
OPENWEATHERMAP_URL,
|
#else
|
||||||
TEMP_UNIT,
|
.cityID = "",
|
||||||
TEMP_LANG,
|
.lat = LAT,
|
||||||
WEATHER_UPDATE_INTERVAL,
|
.lon = LON,
|
||||||
NTP_SERVER,
|
#endif
|
||||||
GMT_OFFSET_SEC,
|
.weatherAPIKey = OPENWEATHERMAP_APIKEY,
|
||||||
DST_OFFSET_SEC
|
.weatherURL = OPENWEATHERMAP_URL,
|
||||||
|
.weatherUnit = TEMP_UNIT,
|
||||||
|
.weatherLang = TEMP_LANG,
|
||||||
|
.weatherUpdateInterval = WEATHER_UPDATE_INTERVAL,
|
||||||
|
.ntpServer = NTP_SERVER,
|
||||||
|
.gmtOffset = GMT_OFFSET_SEC,
|
||||||
|
.vibrateOClock = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -3,26 +3,41 @@
|
||||||
|
|
||||||
//Weather Settings
|
//Weather Settings
|
||||||
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
||||||
|
|
||||||
|
//You can also use LAT,LON for your location instead of CITY_ID, but not both
|
||||||
|
//#define LAT "40.7127" //New York City, Looked up on https://www.latlong.net/
|
||||||
|
//#define LON "-74.0059"
|
||||||
|
|
||||||
|
#ifdef CITY_ID
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id={cityID}&lang={lang}&units={units}&appid={apiKey}" //open weather api using city ID
|
||||||
|
#else
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&lang={lang}&units={units}&appid={apiKey}" //open weather api using lat lon
|
||||||
|
#endif
|
||||||
|
|
||||||
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
||||||
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id=" //open weather api
|
|
||||||
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
||||||
#define TEMP_LANG "en"
|
#define TEMP_LANG "en"
|
||||||
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
||||||
//NTP Settings
|
//NTP Settings
|
||||||
#define NTP_SERVER "pool.ntp.org"
|
#define NTP_SERVER "pool.ntp.org"
|
||||||
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5
|
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5 EST, -4 EDT, will be overwritten by weather data
|
||||||
#define DST_OFFSET_SEC 3600
|
|
||||||
|
|
||||||
watchySettings settings{
|
watchySettings settings{
|
||||||
CITY_ID,
|
#ifdef CITY_ID
|
||||||
OPENWEATHERMAP_APIKEY,
|
.cityID = CITY_ID,
|
||||||
OPENWEATHERMAP_URL,
|
#else
|
||||||
TEMP_UNIT,
|
.cityID = "",
|
||||||
TEMP_LANG,
|
.lat = LAT,
|
||||||
WEATHER_UPDATE_INTERVAL,
|
.lon = LON,
|
||||||
NTP_SERVER,
|
#endif
|
||||||
GMT_OFFSET_SEC,
|
.weatherAPIKey = OPENWEATHERMAP_APIKEY,
|
||||||
DST_OFFSET_SEC
|
.weatherURL = OPENWEATHERMAP_URL,
|
||||||
|
.weatherUnit = TEMP_UNIT,
|
||||||
|
.weatherLang = TEMP_LANG,
|
||||||
|
.weatherUpdateInterval = WEATHER_UPDATE_INTERVAL,
|
||||||
|
.ntpServer = NTP_SERVER,
|
||||||
|
.gmtOffset = GMT_OFFSET_SEC,
|
||||||
|
.vibrateOClock = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -3,26 +3,41 @@
|
||||||
|
|
||||||
//Weather Settings
|
//Weather Settings
|
||||||
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
||||||
|
|
||||||
|
//You can also use LAT,LON for your location instead of CITY_ID, but not both
|
||||||
|
//#define LAT "40.7127" //New York City, Looked up on https://www.latlong.net/
|
||||||
|
//#define LON "-74.0059"
|
||||||
|
|
||||||
|
#ifdef CITY_ID
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id={cityID}&lang={lang}&units={units}&appid={apiKey}" //open weather api using city ID
|
||||||
|
#else
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&lang={lang}&units={units}&appid={apiKey}" //open weather api using lat lon
|
||||||
|
#endif
|
||||||
|
|
||||||
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
||||||
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id=" //open weather api
|
|
||||||
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
||||||
#define TEMP_LANG "en"
|
#define TEMP_LANG "en"
|
||||||
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
||||||
//NTP Settings
|
//NTP Settings
|
||||||
#define NTP_SERVER "pool.ntp.org"
|
#define NTP_SERVER "pool.ntp.org"
|
||||||
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5
|
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5 EST, -4 EDT, will be overwritten by weather data
|
||||||
#define DST_OFFSET_SEC 3600
|
|
||||||
|
|
||||||
watchySettings settings{
|
watchySettings settings{
|
||||||
CITY_ID,
|
#ifdef CITY_ID
|
||||||
OPENWEATHERMAP_APIKEY,
|
.cityID = CITY_ID,
|
||||||
OPENWEATHERMAP_URL,
|
#else
|
||||||
TEMP_UNIT,
|
.cityID = "",
|
||||||
TEMP_LANG,
|
.lat = LAT,
|
||||||
WEATHER_UPDATE_INTERVAL,
|
.lon = LON,
|
||||||
NTP_SERVER,
|
#endif
|
||||||
GMT_OFFSET_SEC,
|
.weatherAPIKey = OPENWEATHERMAP_APIKEY,
|
||||||
DST_OFFSET_SEC
|
.weatherURL = OPENWEATHERMAP_URL,
|
||||||
|
.weatherUnit = TEMP_UNIT,
|
||||||
|
.weatherLang = TEMP_LANG,
|
||||||
|
.weatherUpdateInterval = WEATHER_UPDATE_INTERVAL,
|
||||||
|
.ntpServer = NTP_SERVER,
|
||||||
|
.gmtOffset = GMT_OFFSET_SEC,
|
||||||
|
.vibrateOClock = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -0,0 +1,10 @@
|
||||||
|
#include "Watchy_Mario.h"
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
WatchyMario watchy(settings);
|
||||||
|
|
||||||
|
void setup(){
|
||||||
|
watchy.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(){}
|
|
@ -0,0 +1,65 @@
|
||||||
|
#include "Watchy_Mario.h"
|
||||||
|
#define NUM_W 44
|
||||||
|
#define NUM_H 44
|
||||||
|
#define COIN_W 24
|
||||||
|
#define COIN_H 30
|
||||||
|
#define PIPE_W 42
|
||||||
|
#define PIPE_H 47
|
||||||
|
#define MARIO_W 56
|
||||||
|
#define MARIO_H 54
|
||||||
|
#define NUM_SPACING 4
|
||||||
|
#define COIN_SPACING 4
|
||||||
|
#define FLOOR_H 19
|
||||||
|
#define PIPE_PADDING DISPLAY_HEIGHT - FLOOR_H - PIPE_H
|
||||||
|
#define X_PADDING (DISPLAY_WIDTH - (4*NUM_W) - (3*NUM_SPACING))/2
|
||||||
|
#define Y_PADDING 2*COIN_SPACING+COIN_H
|
||||||
|
|
||||||
|
|
||||||
|
const unsigned char *numbers [10] = {mario0, mario1, mario2, mario3, mario4, mario5, mario6, mario7, mario8, mario9};
|
||||||
|
|
||||||
|
void WatchyMario::drawWatchFace(){
|
||||||
|
display.fillScreen(GxEPD_WHITE);
|
||||||
|
display.drawBitmap(0, 0, mariobg, DISPLAY_WIDTH, DISPLAY_HEIGHT, GxEPD_BLACK);
|
||||||
|
|
||||||
|
int hour10 = currentTime.Hour/10;
|
||||||
|
int hour01 = currentTime.Hour%10;
|
||||||
|
int minute10 = currentTime.Minute/10;
|
||||||
|
int minute01 = currentTime.Minute%10;
|
||||||
|
|
||||||
|
int pos = 0;
|
||||||
|
|
||||||
|
if(hour01 == 0 && minute10 == 0 && minute01 == 0){
|
||||||
|
pos = 0;
|
||||||
|
}
|
||||||
|
else if(minute10 == 0 && minute01 == 0){
|
||||||
|
pos = 1;
|
||||||
|
}
|
||||||
|
else if(minute01 == 0){
|
||||||
|
pos = 2;
|
||||||
|
}else{
|
||||||
|
pos = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
display.drawBitmap(X_PADDING + pos*(NUM_SPACING + NUM_W) + (NUM_W/2 - MARIO_W/2) + (pos < 2 ? 8 : -8), Y_PADDING+NUM_H + 4, pos < 2 ? mariomariol : mariomarior, MARIO_W, MARIO_H, GxEPD_BLACK); //mario
|
||||||
|
display.drawBitmap(X_PADDING + pos*(NUM_SPACING + NUM_W) + (NUM_W/2 - COIN_W/2), COIN_SPACING, mariocoin, COIN_W, COIN_H, GxEPD_BLACK); //coin
|
||||||
|
|
||||||
|
if(pos == 0){
|
||||||
|
display.drawBitmap(DISPLAY_WIDTH - 2*PIPE_W, PIPE_PADDING, mariopipe, PIPE_W, PIPE_H, GxEPD_BLACK); //pipe
|
||||||
|
}
|
||||||
|
else if(pos == 1 || pos == 2){
|
||||||
|
display.drawBitmap(X_PADDING, PIPE_PADDING, mariopipe, PIPE_W, PIPE_H, GxEPD_BLACK); //pipe
|
||||||
|
display.drawBitmap(DISPLAY_WIDTH - PIPE_W - X_PADDING, PIPE_PADDING, mariopipe, PIPE_W, PIPE_H, GxEPD_BLACK); //pipe
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
display.drawBitmap(2*PIPE_W, PIPE_PADDING, mariopipe, PIPE_W, PIPE_H, GxEPD_BLACK); //pipe
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Hour
|
||||||
|
display.drawBitmap(X_PADDING, pos == 0 ? Y_PADDING : Y_PADDING + 20, numbers[hour10], NUM_W, NUM_H, GxEPD_BLACK); //first digit
|
||||||
|
display.drawBitmap(X_PADDING+NUM_SPACING+NUM_W, pos == 1 ? Y_PADDING : Y_PADDING + 20, numbers[hour01], NUM_W, NUM_H, GxEPD_BLACK); //second digit
|
||||||
|
|
||||||
|
//Minute
|
||||||
|
display.drawBitmap(X_PADDING+2*(NUM_SPACING+NUM_W), pos == 2 ? Y_PADDING : Y_PADDING + 20, numbers[minute10], NUM_W, NUM_H, GxEPD_BLACK); //first digit
|
||||||
|
display.drawBitmap(X_PADDING+3*(NUM_SPACING+NUM_W), pos == 3 ? Y_PADDING : Y_PADDING + 20, numbers[minute01], NUM_W, NUM_H, GxEPD_BLACK); //second digit
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef WATCHY_MARIO_H
|
||||||
|
#define WATCHY_MARIO_H
|
||||||
|
|
||||||
|
#include <Watchy.h>
|
||||||
|
#include "mario.h"
|
||||||
|
|
||||||
|
class WatchyMario: public Watchy{
|
||||||
|
using Watchy::Watchy;
|
||||||
|
public:
|
||||||
|
void drawWatchFace();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,600 @@
|
||||||
|
// '0', 44x44px
|
||||||
|
const unsigned char mario0 [] PROGMEM = {
|
||||||
|
0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x35, 0x55, 0x55, 0x55,
|
||||||
|
0x55, 0xc0, 0x38, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0xd0, 0x00, 0x00, 0x00, 0x05, 0x70, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd0, 0x0f, 0xff, 0xfc, 0x01, 0x70, 0xe0, 0x0f, 0xff, 0xfc, 0x02, 0xb0,
|
||||||
|
0xd0, 0x0c, 0x00, 0x0c, 0x01, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0xfc, 0x00, 0x0f,
|
||||||
|
0xc1, 0x70, 0xe0, 0xfc, 0x00, 0x0f, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80,
|
||||||
|
0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80,
|
||||||
|
0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xfc, 0x00, 0x0f, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xfc, 0x00, 0x0f, 0xc1, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0x0c, 0x00, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0x0f, 0xff, 0xfc, 0x02, 0xb0, 0xd0, 0x0f, 0xff, 0xfc, 0x01, 0x70, 0xe8, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd4, 0x00, 0x00, 0x00, 0x05, 0x70, 0xea, 0x00, 0x00, 0x00, 0x0a, 0xb0,
|
||||||
|
0x35, 0x55, 0x55, 0x55, 0x55, 0xc0, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x0f, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00
|
||||||
|
};
|
||||||
|
// '1', 44x44px
|
||||||
|
const unsigned char mario1 [] PROGMEM = {
|
||||||
|
0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x35, 0x55, 0x55, 0x55,
|
||||||
|
0x55, 0xc0, 0x38, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0xd0, 0x00, 0x00, 0x00, 0x05, 0x70, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd0, 0x00, 0xff, 0xc0, 0x01, 0x70, 0xe0, 0x00, 0xff, 0xc0, 0x02, 0xb0,
|
||||||
|
0xd0, 0x00, 0xc0, 0xc0, 0x01, 0x70, 0xe0, 0x00, 0xc0, 0xc0, 0x02, 0xb0, 0xd0, 0x03, 0x00, 0xc0,
|
||||||
|
0x01, 0x70, 0xe0, 0x03, 0x00, 0xc0, 0x02, 0xb0, 0xd0, 0x0c, 0x00, 0xc0, 0x01, 0x70, 0xe0, 0x0c,
|
||||||
|
0x00, 0xc0, 0x02, 0xb0, 0xd0, 0x0c, 0x00, 0xc0, 0x01, 0x70, 0xe0, 0x0c, 0x00, 0xc0, 0x02, 0xb0,
|
||||||
|
0xd0, 0x0c, 0x00, 0xc0, 0x01, 0x70, 0xe0, 0x0f, 0xc0, 0xc0, 0x02, 0xb0, 0xd0, 0x0f, 0xc0, 0xc0,
|
||||||
|
0x01, 0x70, 0xe0, 0x00, 0xc0, 0xc0, 0x02, 0xb0, 0xd0, 0x00, 0xc0, 0xc0, 0x01, 0x70, 0xe0, 0x00,
|
||||||
|
0xc0, 0xc0, 0x02, 0xb0, 0xd0, 0x00, 0xc0, 0xc0, 0x01, 0x70, 0xe0, 0x00, 0xc0, 0xc0, 0x02, 0xb0,
|
||||||
|
0xd0, 0x00, 0xc0, 0xc0, 0x01, 0x70, 0xe0, 0x00, 0xc0, 0xc0, 0x02, 0xb0, 0xd0, 0x00, 0xc0, 0xc0,
|
||||||
|
0x01, 0x70, 0xe0, 0x00, 0xc0, 0xc0, 0x02, 0xb0, 0xd0, 0x00, 0xc0, 0xc0, 0x01, 0x70, 0xe0, 0x0f,
|
||||||
|
0xc0, 0xfc, 0x02, 0xb0, 0xd0, 0x0f, 0xc0, 0xfc, 0x01, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0,
|
||||||
|
0xd0, 0x0c, 0x00, 0x0c, 0x01, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0x0c, 0x00, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0x0f, 0xff, 0xfc, 0x02, 0xb0, 0xd0, 0x0f, 0xff, 0xfc, 0x01, 0x70, 0xe8, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd4, 0x00, 0x00, 0x00, 0x05, 0x70, 0xea, 0x00, 0x00, 0x00, 0x0a, 0xb0,
|
||||||
|
0x35, 0x55, 0x55, 0x55, 0x55, 0xc0, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x0f, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00
|
||||||
|
};
|
||||||
|
// '2', 44x44px
|
||||||
|
const unsigned char mario2 [] PROGMEM = {
|
||||||
|
0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x35, 0x55, 0x55, 0x55,
|
||||||
|
0x55, 0xc0, 0x38, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0xd0, 0x00, 0x00, 0x00, 0x05, 0x70, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd0, 0x0f, 0xff, 0xfc, 0x01, 0x70, 0xe0, 0x0f, 0xff, 0xfc, 0x02, 0xb0,
|
||||||
|
0xd0, 0x0c, 0x00, 0x0c, 0x01, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0xfc, 0x00, 0x0f,
|
||||||
|
0xc1, 0x70, 0xe0, 0xfc, 0x00, 0x0f, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xff, 0xe1, 0x80, 0xc1, 0x70, 0xe0, 0xff, 0xe1, 0x80, 0xc2, 0xb0, 0xd0, 0x00, 0x01, 0x80,
|
||||||
|
0xc1, 0x70, 0xe0, 0x00, 0x07, 0x80, 0xc2, 0xb0, 0xd0, 0x00, 0x07, 0x80, 0xc1, 0x70, 0xe0, 0x00,
|
||||||
|
0x38, 0x0f, 0xc2, 0xb0, 0xd0, 0x00, 0x38, 0x0f, 0xc1, 0x70, 0xe0, 0x00, 0xc0, 0x0c, 0x02, 0xb0,
|
||||||
|
0xd0, 0x00, 0xc0, 0x0c, 0x01, 0x70, 0xe0, 0x0f, 0x00, 0xfc, 0x02, 0xb0, 0xd0, 0x0f, 0x00, 0xfc,
|
||||||
|
0x01, 0x70, 0xe0, 0x30, 0x00, 0xc0, 0x02, 0xb0, 0xd0, 0x30, 0x00, 0xc0, 0x01, 0x70, 0xe0, 0xc0,
|
||||||
|
0x00, 0xff, 0xc2, 0xb0, 0xd0, 0xc0, 0x00, 0xff, 0xc1, 0x70, 0xe0, 0xc0, 0x00, 0x00, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x00, 0x00, 0xc1, 0x70, 0xe0, 0xc0, 0x00, 0x00, 0xc2, 0xb0, 0xd0, 0xc0, 0x00, 0x00,
|
||||||
|
0xc1, 0x70, 0xe0, 0xff, 0xff, 0xff, 0xc2, 0xb0, 0xd0, 0xff, 0xff, 0xff, 0xc1, 0x70, 0xe8, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd4, 0x00, 0x00, 0x00, 0x05, 0x70, 0xea, 0x00, 0x00, 0x00, 0x0a, 0xb0,
|
||||||
|
0x35, 0x55, 0x55, 0x55, 0x55, 0xc0, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x0f, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00
|
||||||
|
};
|
||||||
|
// '3', 44x44px
|
||||||
|
const unsigned char mario3 [] PROGMEM = {
|
||||||
|
0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x35, 0x55, 0x55, 0x55,
|
||||||
|
0x55, 0xc0, 0x38, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0xd0, 0x00, 0x00, 0x00, 0x05, 0x70, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd0, 0x0f, 0xff, 0xfc, 0x01, 0x70, 0xe0, 0x0f, 0xff, 0xfc, 0x02, 0xb0,
|
||||||
|
0xd0, 0x0c, 0x00, 0x0c, 0x01, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0xfc, 0x00, 0x0f,
|
||||||
|
0xc1, 0x70, 0xe0, 0xfc, 0x00, 0x0f, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xff, 0xe1, 0x80, 0xc1, 0x70, 0xe0, 0xff, 0xe1, 0x80, 0xc2, 0xb0, 0xd0, 0x00, 0x07, 0x80,
|
||||||
|
0xc1, 0x70, 0xe0, 0x00, 0x07, 0x80, 0xc2, 0xb0, 0xd0, 0x00, 0x18, 0x03, 0xc1, 0x70, 0xe0, 0x00,
|
||||||
|
0x18, 0x03, 0xc2, 0xb0, 0xd0, 0x00, 0x18, 0x03, 0xc1, 0x70, 0xe0, 0x00, 0x07, 0x83, 0xc2, 0xb0,
|
||||||
|
0xd0, 0x00, 0x07, 0x80, 0xc1, 0x70, 0xe0, 0xff, 0xe1, 0x80, 0xc2, 0xb0, 0xd0, 0xff, 0xe1, 0x80,
|
||||||
|
0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xfc, 0x00, 0x0f, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xfc, 0x00, 0x0f, 0xc1, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0x0c, 0x00, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0x0f, 0xff, 0xfc, 0x02, 0xb0, 0xd0, 0x0f, 0xff, 0xfc, 0x01, 0x70, 0xe8, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd4, 0x00, 0x00, 0x00, 0x05, 0x70, 0xea, 0x00, 0x00, 0x00, 0x0a, 0xb0,
|
||||||
|
0x35, 0x55, 0x55, 0x55, 0x55, 0xc0, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x0f, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00
|
||||||
|
};
|
||||||
|
// '4', 44x44px
|
||||||
|
const unsigned char mario4 [] PROGMEM = {
|
||||||
|
0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x35, 0x55, 0x55, 0x55,
|
||||||
|
0x55, 0xc0, 0x38, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0xd0, 0x00, 0x00, 0x00, 0x05, 0x70, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd0, 0x00, 0xff, 0xfc, 0x01, 0x70, 0xe0, 0x00, 0xff, 0xfc, 0x02, 0xb0,
|
||||||
|
0xd0, 0x03, 0x00, 0x0c, 0x01, 0x70, 0xe0, 0x03, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0x0c, 0x00, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0x30, 0x00, 0x0c, 0x01, 0x70, 0xe0, 0x30,
|
||||||
|
0x00, 0x0c, 0x02, 0xb0, 0xd0, 0x30, 0x1e, 0x0c, 0x01, 0x70, 0xe0, 0x30, 0x1e, 0x0c, 0x02, 0xb0,
|
||||||
|
0xd0, 0x30, 0x66, 0x0c, 0x01, 0x70, 0xe0, 0x30, 0x66, 0x0c, 0x02, 0xb0, 0xd0, 0x30, 0x7e, 0x0f,
|
||||||
|
0xc1, 0x70, 0xe0, 0x30, 0x7e, 0x0f, 0xc2, 0xb0, 0xd0, 0xc0, 0x00, 0x00, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x00, 0x00, 0xc2, 0xb0, 0xd0, 0xc0, 0x00, 0x00, 0xc1, 0x70, 0xe0, 0xc0, 0x00, 0x00, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x00, 0x00, 0xc1, 0x70, 0xe0, 0xc0, 0x00, 0x00, 0xc2, 0xb0, 0xd0, 0xc0, 0x00, 0x00,
|
||||||
|
0xc1, 0x70, 0xe0, 0xff, 0xfc, 0x0f, 0xc2, 0xb0, 0xd0, 0xff, 0xfc, 0x0f, 0xc1, 0x70, 0xe0, 0x00,
|
||||||
|
0x0c, 0x0c, 0x02, 0xb0, 0xd0, 0x00, 0x0c, 0x0c, 0x01, 0x70, 0xe0, 0x00, 0x0c, 0x0c, 0x02, 0xb0,
|
||||||
|
0xd0, 0x00, 0x0c, 0x0c, 0x01, 0x70, 0xe0, 0x00, 0x0c, 0x0c, 0x02, 0xb0, 0xd0, 0x00, 0x0c, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0x00, 0x0f, 0xfc, 0x02, 0xb0, 0xd0, 0x00, 0x0f, 0xfc, 0x01, 0x70, 0xe8, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd4, 0x00, 0x00, 0x00, 0x05, 0x70, 0xea, 0x00, 0x00, 0x00, 0x0a, 0xb0,
|
||||||
|
0x35, 0x55, 0x55, 0x55, 0x55, 0xc0, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x0f, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00
|
||||||
|
};
|
||||||
|
// '5', 44x44px
|
||||||
|
const unsigned char mario5 [] PROGMEM = {
|
||||||
|
0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x35, 0x55, 0x55, 0x55,
|
||||||
|
0x55, 0xc0, 0x38, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0xd0, 0x00, 0x00, 0x00, 0x05, 0x70, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd0, 0xff, 0xff, 0xff, 0xc1, 0x70, 0xe0, 0xff, 0xff, 0xff, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x00, 0x00, 0xc1, 0x70, 0xe0, 0xc0, 0x00, 0x00, 0xc2, 0xb0, 0xd0, 0xc0, 0x00, 0x00,
|
||||||
|
0xc1, 0x70, 0xe0, 0xc0, 0x00, 0x00, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0xff, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0xff, 0xc2, 0xb0, 0xd0, 0xc0, 0x60, 0x00, 0x01, 0x70, 0xe0, 0xc0, 0x60, 0x00, 0x02, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x7f, 0xfc, 0x01, 0x70, 0xe0, 0xc0, 0x7f, 0xfc, 0x02, 0xb0, 0xd0, 0xc0, 0x00, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0xc0, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0xc0, 0x00, 0x0f, 0xc1, 0x70, 0xe0, 0xff,
|
||||||
|
0xfe, 0x0f, 0xc2, 0xb0, 0xd0, 0x3f, 0xff, 0x80, 0xc1, 0x70, 0xe0, 0x00, 0x01, 0x80, 0xc2, 0xb0,
|
||||||
|
0xd0, 0x00, 0x01, 0x80, 0xc1, 0x70, 0xe0, 0xff, 0xe1, 0x80, 0xc2, 0xb0, 0xd0, 0xff, 0xe1, 0x80,
|
||||||
|
0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xfc, 0x00, 0x0f, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xfc, 0x00, 0x0f, 0xc1, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0x0c, 0x00, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0x0f, 0xff, 0xfc, 0x02, 0xb0, 0xd0, 0x0f, 0xff, 0xfc, 0x01, 0x70, 0xe8, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd4, 0x00, 0x00, 0x00, 0x05, 0x70, 0xea, 0x00, 0x00, 0x00, 0x0a, 0xb0,
|
||||||
|
0x35, 0x55, 0x55, 0x55, 0x55, 0xc0, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x0f, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00
|
||||||
|
};
|
||||||
|
// '6', 44x44px
|
||||||
|
const unsigned char mario6 [] PROGMEM = {
|
||||||
|
0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x35, 0x55, 0x55, 0x55,
|
||||||
|
0x55, 0xc0, 0x38, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0xd0, 0x00, 0x00, 0x00, 0x05, 0x70, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd0, 0x03, 0xff, 0xff, 0xc1, 0x70, 0xe0, 0x03, 0xff, 0xff, 0xc2, 0xb0,
|
||||||
|
0xd0, 0x0c, 0x00, 0x00, 0xc1, 0x70, 0xe0, 0x0c, 0x00, 0x00, 0xc2, 0xb0, 0xd0, 0x30, 0x00, 0x00,
|
||||||
|
0xc1, 0x70, 0xe0, 0x30, 0x00, 0x00, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0xff, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0xff, 0xc2, 0xb0, 0xd0, 0xc0, 0x60, 0x00, 0x01, 0x70, 0xe0, 0xc0, 0x60, 0x00, 0x02, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x7f, 0xfc, 0x01, 0x70, 0xe0, 0xc0, 0x7f, 0xfc, 0x02, 0xb0, 0xd0, 0xc0, 0x00, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0xc0, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0xc0, 0x00, 0x0f, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x00, 0x0f, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x7f, 0x80, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80,
|
||||||
|
0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xfc, 0x00, 0x0f, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xfc, 0x00, 0x0f, 0xc1, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0x0c, 0x00, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0x0f, 0xff, 0xfc, 0x02, 0xb0, 0xd0, 0x0f, 0xff, 0xfc, 0x01, 0x70, 0xe8, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd4, 0x00, 0x00, 0x00, 0x05, 0x70, 0xea, 0x00, 0x00, 0x00, 0x0a, 0xb0,
|
||||||
|
0x35, 0x55, 0x55, 0x55, 0x55, 0xc0, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x0f, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00
|
||||||
|
};
|
||||||
|
// '7', 44x44px
|
||||||
|
const unsigned char mario7 [] PROGMEM = {
|
||||||
|
0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x35, 0x55, 0x55, 0x55,
|
||||||
|
0x55, 0xc0, 0x38, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0xd0, 0x00, 0x00, 0x00, 0x05, 0x70, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd0, 0xff, 0xff, 0xff, 0xc1, 0x70, 0xe0, 0xff, 0xff, 0xff, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x00, 0x00, 0xc1, 0x70, 0xe0, 0xc0, 0x00, 0x00, 0xc2, 0xb0, 0xd0, 0xc0, 0x00, 0x00,
|
||||||
|
0xc1, 0x70, 0xe0, 0xc0, 0x00, 0x00, 0xc2, 0xb0, 0xd0, 0xff, 0xff, 0x80, 0xc1, 0x70, 0xe0, 0xff,
|
||||||
|
0xff, 0x80, 0xc2, 0xb0, 0xd0, 0x00, 0x01, 0x80, 0xc1, 0x70, 0xe0, 0x00, 0x01, 0x80, 0xc2, 0xb0,
|
||||||
|
0xd0, 0x00, 0x06, 0x03, 0x01, 0x70, 0xe0, 0x00, 0x06, 0x03, 0x02, 0xb0, 0xd0, 0x00, 0x18, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0x00, 0x18, 0x0c, 0x02, 0xb0, 0xd0, 0x00, 0x60, 0x30, 0x01, 0x70, 0xe0, 0x00,
|
||||||
|
0x60, 0x30, 0x02, 0xb0, 0xd0, 0x01, 0x80, 0xc0, 0x01, 0x70, 0xe0, 0x01, 0x80, 0xc0, 0x02, 0xb0,
|
||||||
|
0xd0, 0x01, 0x80, 0xc0, 0x01, 0x70, 0xe0, 0x01, 0x80, 0xc0, 0x02, 0xb0, 0xd0, 0x01, 0x80, 0xc0,
|
||||||
|
0x01, 0x70, 0xe0, 0x01, 0x80, 0xc0, 0x02, 0xb0, 0xd0, 0x01, 0x80, 0xc0, 0x01, 0x70, 0xe0, 0x01,
|
||||||
|
0x80, 0xc0, 0x02, 0xb0, 0xd0, 0x01, 0x80, 0xc0, 0x01, 0x70, 0xe0, 0x01, 0x80, 0xc0, 0x02, 0xb0,
|
||||||
|
0xd0, 0x01, 0x80, 0xc0, 0x01, 0x70, 0xe0, 0x01, 0x80, 0xc0, 0x02, 0xb0, 0xd0, 0x01, 0x80, 0xc0,
|
||||||
|
0x01, 0x70, 0xe0, 0x01, 0xff, 0xc0, 0x02, 0xb0, 0xd0, 0x01, 0xff, 0xc0, 0x01, 0x70, 0xe8, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd4, 0x00, 0x00, 0x00, 0x05, 0x70, 0xea, 0x00, 0x00, 0x00, 0x0a, 0xb0,
|
||||||
|
0x35, 0x55, 0x55, 0x55, 0x55, 0xc0, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x0f, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00
|
||||||
|
};
|
||||||
|
// '8', 44x44px
|
||||||
|
const unsigned char mario8 [] PROGMEM = {
|
||||||
|
0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x35, 0x55, 0x55, 0x55,
|
||||||
|
0x55, 0xc0, 0x38, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0xd0, 0x00, 0x00, 0x00, 0x05, 0x70, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd0, 0x0f, 0xff, 0xfc, 0x01, 0x70, 0xe0, 0x0f, 0xff, 0xfc, 0x02, 0xb0,
|
||||||
|
0xd0, 0x0c, 0x00, 0x0c, 0x01, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0xfc, 0x00, 0x0f,
|
||||||
|
0xc1, 0x70, 0xe0, 0xfc, 0x00, 0x0f, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80,
|
||||||
|
0xc1, 0x70, 0xe0, 0xc0, 0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xf0, 0x00, 0x03, 0xc1, 0x70, 0xe0, 0xf0,
|
||||||
|
0x00, 0x03, 0xc2, 0xb0, 0xd0, 0xf0, 0x00, 0x03, 0xc1, 0x70, 0xe0, 0xf0, 0x7f, 0x83, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80,
|
||||||
|
0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xfc, 0x00, 0x0f, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xfc, 0x00, 0x0f, 0xc1, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0x0c, 0x00, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0x0f, 0xff, 0xfc, 0x02, 0xb0, 0xd0, 0x0f, 0xff, 0xfc, 0x01, 0x70, 0xe8, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd4, 0x00, 0x00, 0x00, 0x05, 0x70, 0xea, 0x00, 0x00, 0x00, 0x0a, 0xb0,
|
||||||
|
0x35, 0x55, 0x55, 0x55, 0x55, 0xc0, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x0f, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00
|
||||||
|
};
|
||||||
|
// '9', 44x44px
|
||||||
|
const unsigned char mario9 [] PROGMEM = {
|
||||||
|
0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x35, 0x55, 0x55, 0x55,
|
||||||
|
0x55, 0xc0, 0x38, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0xd0, 0x00, 0x00, 0x00, 0x05, 0x70, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd0, 0x0f, 0xff, 0xfc, 0x01, 0x70, 0xe0, 0x0f, 0xff, 0xfc, 0x02, 0xb0,
|
||||||
|
0xd0, 0x0c, 0x00, 0x0c, 0x01, 0x70, 0xe0, 0x0c, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0xfc, 0x00, 0x0f,
|
||||||
|
0xc1, 0x70, 0xe0, 0xfc, 0x00, 0x0f, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xc0,
|
||||||
|
0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x61, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x61, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x61, 0x80,
|
||||||
|
0xc1, 0x70, 0xe0, 0xc0, 0x7f, 0x80, 0xc2, 0xb0, 0xd0, 0xc0, 0x7f, 0x80, 0xc1, 0x70, 0xe0, 0xfc,
|
||||||
|
0x00, 0x00, 0xc2, 0xb0, 0xd0, 0xfc, 0x00, 0x00, 0xc1, 0x70, 0xe0, 0x0c, 0x00, 0x00, 0xc2, 0xb0,
|
||||||
|
0xd0, 0x0c, 0x00, 0x00, 0xc1, 0x70, 0xe0, 0x0f, 0xff, 0x80, 0xc2, 0xb0, 0xd0, 0x0f, 0xff, 0x80,
|
||||||
|
0xc1, 0x70, 0xe0, 0x00, 0x01, 0x80, 0xc2, 0xb0, 0xd0, 0x00, 0x01, 0x80, 0xc1, 0x70, 0xe0, 0xff,
|
||||||
|
0xff, 0x80, 0xc2, 0xb0, 0xd0, 0xff, 0xff, 0x80, 0xc1, 0x70, 0xe0, 0xc0, 0x00, 0x03, 0x02, 0xb0,
|
||||||
|
0xd0, 0xc0, 0x00, 0x03, 0x01, 0x70, 0xe0, 0xc0, 0x00, 0x0c, 0x02, 0xb0, 0xd0, 0xc0, 0x00, 0x0c,
|
||||||
|
0x01, 0x70, 0xe0, 0xff, 0xff, 0xf0, 0x02, 0xb0, 0xd0, 0xff, 0xff, 0xf0, 0x01, 0x70, 0xe8, 0x00,
|
||||||
|
0x00, 0x00, 0x02, 0xb0, 0xd4, 0x00, 0x00, 0x00, 0x05, 0x70, 0xea, 0x00, 0x00, 0x00, 0x0a, 0xb0,
|
||||||
|
0x35, 0x55, 0x55, 0x55, 0x55, 0xc0, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x0f, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00
|
||||||
|
};
|
||||||
|
// 'bg', 200x200px
|
||||||
|
const unsigned char mariobg [] PROGMEM = {
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfe, 0xbf,
|
||||||
|
0xff, 0xaf, 0xff, 0xeb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfe, 0xbf, 0xff, 0xaf, 0xff, 0xef, 0xff,
|
||||||
|
0xeb, 0xff, 0xfa, 0xe4, 0x7f, 0xfc, 0x7f, 0xfc, 0x4f, 0xff, 0x47, 0xff, 0xc5, 0xff, 0xe4, 0xff,
|
||||||
|
0xf4, 0x7f, 0xfc, 0x5f, 0xfe, 0x47, 0xff, 0xc7, 0xff, 0xc4, 0xff, 0xf4, 0xaa, 0xaf, 0xea, 0xaf,
|
||||||
|
0xea, 0xab, 0xfa, 0xaa, 0xfe, 0xaa, 0xbf, 0xaa, 0xbf, 0xaa, 0xaf, 0xea, 0xab, 0xfa, 0xaa, 0xfe,
|
||||||
|
0xaa, 0xfe, 0xaa, 0xbf, 0xaa, 0x11, 0x17, 0x91, 0x13, 0xd1, 0x11, 0xf1, 0x11, 0x79, 0x11, 0x1f,
|
||||||
|
0x11, 0x1f, 0x11, 0x13, 0xd1, 0x11, 0xf1, 0x11, 0x79, 0x11, 0x3d, 0x11, 0x1f, 0x11, 0xaa, 0xaa,
|
||||||
|
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
|
||||||
|
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
|
||||||
|
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
|
||||||
|
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
|
||||||
|
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
|
||||||
|
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
|
||||||
|
0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
|
||||||
|
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x44, 0x44, 0x44, 0x44, 0x44,
|
||||||
|
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
|
||||||
|
0x44, 0x44, 0x44, 0x44, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
|
||||||
|
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x11, 0x11, 0x11,
|
||||||
|
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
|
||||||
|
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
|
||||||
|
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x44,
|
||||||
|
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
|
||||||
|
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44
|
||||||
|
};
|
||||||
|
// 'coin', 24x30px
|
||||||
|
const unsigned char mariocoin [] PROGMEM = {
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x30, 0x00, 0x0c, 0x30,
|
||||||
|
0x00, 0x0c, 0x30, 0x14, 0x0c, 0x30, 0x28, 0x0c, 0xc0, 0x43, 0x03, 0xc0, 0x83, 0x03, 0xc0, 0x43,
|
||||||
|
0x03, 0xc0, 0x83, 0x03, 0xc0, 0x43, 0x03, 0xc0, 0x83, 0x03, 0xc0, 0x43, 0x03, 0xc0, 0x83, 0x03,
|
||||||
|
0xc0, 0x43, 0x03, 0xc0, 0x83, 0x03, 0xc0, 0x43, 0x03, 0xc0, 0x83, 0x03, 0xc0, 0x43, 0x03, 0xc0,
|
||||||
|
0x83, 0x03, 0x30, 0x3c, 0x0c, 0x30, 0x3c, 0x0c, 0x30, 0x00, 0x0c, 0x30, 0x00, 0x0c, 0x0f, 0x00,
|
||||||
|
0xf0, 0x0f, 0x00, 0xf0, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00
|
||||||
|
};
|
||||||
|
// 'mario', 56x54px
|
||||||
|
const unsigned char mariomarior [] PROGMEM = {
|
||||||
|
0x00, 0x00, 0x03, 0xfc, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x3f, 0x00, 0x00, 0x00,
|
||||||
|
0x03, 0x03, 0x3f, 0xf3, 0xfc, 0x00, 0x00, 0x03, 0x03, 0x3f, 0xf3, 0xfc, 0x00, 0x00, 0x03, 0x00,
|
||||||
|
0xff, 0xf3, 0x03, 0x00, 0x00, 0x03, 0x00, 0xff, 0xf3, 0x03, 0x00, 0x00, 0x03, 0x00, 0xff, 0xfc,
|
||||||
|
0x03, 0x00, 0x00, 0x03, 0x00, 0xff, 0xfc, 0x03, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0xcc, 0x00,
|
||||||
|
0x00, 0x03, 0x03, 0xff, 0xff, 0xcc, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x03,
|
||||||
|
0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x03, 0xff, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x03, 0xff, 0x00,
|
||||||
|
0x03, 0xc0, 0x00, 0x00, 0x0f, 0xfc, 0x0c, 0xc3, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x0c, 0xc3, 0x00,
|
||||||
|
0x00, 0x00, 0x3c, 0xfc, 0x0c, 0xc3, 0x00, 0x00, 0x00, 0x3c, 0xfc, 0x0c, 0xc3, 0x00, 0x00, 0x00,
|
||||||
|
0x30, 0xff, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x30, 0xff, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00,
|
||||||
|
0x30, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0xc0, 0x00, 0x00, 0x3c, 0x00, 0xff, 0x03,
|
||||||
|
0xf0, 0x00, 0x00, 0x3c, 0x00, 0xff, 0x03, 0xf0, 0x00, 0x00, 0x03, 0xc0, 0x0f, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x03, 0xc0, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0x03, 0xff,
|
||||||
|
0xfc, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0xf0, 0xfc, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0xf0, 0xfc, 0x00,
|
||||||
|
0x00, 0x3c, 0x03, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x3c, 0x03, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x3c,
|
||||||
|
0x00, 0xc0, 0x3c, 0x03, 0xc0, 0x00, 0x3c, 0x00, 0xc0, 0x3c, 0x03, 0xc0, 0x00, 0x3f, 0xf0, 0xc3,
|
||||||
|
0xff, 0xff, 0xc0, 0x3f, 0xff, 0xf0, 0xc3, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xff, 0xf0, 0xfc,
|
||||||
|
0xf0, 0xfc, 0x3f, 0xff, 0xff, 0xf0, 0xfc, 0xf0, 0xfc, 0x3f, 0xc3, 0xff, 0xf0, 0xff, 0x0c, 0xfc,
|
||||||
|
0x3f, 0xc3, 0xff, 0xf0, 0xff, 0x0c, 0xfc, 0x3f, 0xcc, 0x0f, 0xff, 0xfc, 0x0c, 0xfc, 0x3f, 0xcc,
|
||||||
|
0x0f, 0xff, 0xfc, 0x0c, 0xfc, 0x3f, 0xfc, 0xff, 0xff, 0xfc, 0x0c, 0xfc, 0x3f, 0xfc, 0xff, 0xff,
|
||||||
|
0xfc, 0x0c, 0x3f, 0xff, 0xf0, 0xff, 0xff, 0xfc, 0x0c, 0x3f, 0xff, 0xf0, 0xff, 0xff, 0xfc, 0x0c,
|
||||||
|
0x00, 0x00, 0x30, 0xff, 0xc0, 0x06, 0x3c, 0x00, 0x00, 0x30, 0xff, 0xc0, 0x06, 0x3c, 0x00, 0x00,
|
||||||
|
0x30, 0xc0, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x3f, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
// 'mariol', 56x54px
|
||||||
|
const unsigned char mariomariol [] PROGMEM = {
|
||||||
|
0x00, 0xfc, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x3f, 0xcf,
|
||||||
|
0xfc, 0xc0, 0xc0, 0x00, 0x00, 0x3f, 0xcf, 0xfc, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xcf, 0xff, 0x00,
|
||||||
|
0xc0, 0x00, 0x00, 0xc0, 0xcf, 0xff, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x3f, 0xff, 0x00, 0xc0, 0x00,
|
||||||
|
0x00, 0xc0, 0x3f, 0xff, 0x00, 0xc0, 0x00, 0x00, 0x33, 0xff, 0xff, 0x00, 0xc0, 0x00, 0x00, 0x33,
|
||||||
|
0xff, 0xff, 0xc0, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0xff,
|
||||||
|
0xff, 0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0xff, 0xc0,
|
||||||
|
0x00, 0x00, 0x00, 0xc3, 0x30, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0xc3, 0x30, 0x3f, 0xf0, 0x00, 0x00,
|
||||||
|
0x00, 0xc3, 0x30, 0x3f, 0x3c, 0x00, 0x00, 0x00, 0xc3, 0x30, 0x3f, 0x3c, 0x00, 0x00, 0x03, 0x00,
|
||||||
|
0x00, 0xff, 0x0c, 0x00, 0x00, 0x03, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00,
|
||||||
|
0x0c, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x0f, 0xc0, 0xff, 0x00, 0x3c, 0x00,
|
||||||
|
0x00, 0x0f, 0xc0, 0xff, 0x00, 0x3c, 0x00, 0x00, 0x00, 0xff, 0xf0, 0x03, 0xc0, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xf0, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, 0xf0,
|
||||||
|
0x00, 0x00, 0x00, 0x3f, 0x0f, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x3f, 0x0f, 0x00, 0x3f, 0xf0, 0x00,
|
||||||
|
0x00, 0xf0, 0x3c, 0x00, 0xc0, 0x3c, 0x00, 0x00, 0xf0, 0x3c, 0x00, 0xc0, 0x3c, 0x00, 0x03, 0xc0,
|
||||||
|
0x3c, 0x03, 0x00, 0x3c, 0x00, 0x03, 0xc0, 0x3c, 0x03, 0x00, 0x3c, 0x00, 0x03, 0xff, 0xff, 0xc3,
|
||||||
|
0x0f, 0xfc, 0x00, 0x03, 0xff, 0xff, 0xc3, 0x0f, 0xff, 0xfc, 0x0f, 0x3f, 0x0f, 0xff, 0xff, 0xff,
|
||||||
|
0xfc, 0x0f, 0x3f, 0x0f, 0xff, 0xff, 0xfc, 0x3f, 0x30, 0xff, 0x0f, 0xff, 0xc3, 0xfc, 0x3f, 0x30,
|
||||||
|
0xff, 0x0f, 0xff, 0xc3, 0xfc, 0x3f, 0x30, 0x3f, 0xff, 0xf0, 0x33, 0xfc, 0x3f, 0x30, 0x3f, 0xff,
|
||||||
|
0xf0, 0x33, 0xfc, 0x3f, 0x30, 0x3f, 0xff, 0xff, 0x3f, 0xfc, 0x3f, 0x30, 0x3f, 0xff, 0xff, 0x3f,
|
||||||
|
0xfc, 0x3f, 0x30, 0x3f, 0xff, 0xff, 0x0f, 0xff, 0xfc, 0x30, 0x3f, 0xff, 0xff, 0x0f, 0xff, 0xfc,
|
||||||
|
0x3c, 0x60, 0x03, 0xff, 0x0c, 0x00, 0x00, 0x3c, 0x60, 0x03, 0xff, 0x0c, 0x00, 0x00, 0x1f, 0x80,
|
||||||
|
0x00, 0x03, 0x0c, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00
|
||||||
|
};
|
||||||
|
// 'pipe', 42x47px
|
||||||
|
const unsigned char mariopipe [] PROGMEM = {
|
||||||
|
0x3f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x50, 0x01, 0x11, 0x15, 0x55, 0x80, 0xa8, 0x02, 0xaa, 0xaa,
|
||||||
|
0xab, 0xc0, 0xd0, 0x04, 0x44, 0x45, 0x55, 0xc0, 0xa8, 0x02, 0xaa, 0xaa, 0xab, 0xc0, 0xd0, 0x01,
|
||||||
|
0x11, 0x15, 0x55, 0xc0, 0xa8, 0x02, 0xaa, 0xaa, 0xab, 0xc0, 0xd0, 0x04, 0x44, 0x45, 0x55, 0xc0,
|
||||||
|
0xa8, 0x02, 0xaa, 0xaa, 0xab, 0xc0, 0xd0, 0x01, 0x11, 0x15, 0x55, 0xc0, 0xa8, 0x02, 0xaa, 0xaa,
|
||||||
|
0xab, 0xc0, 0xd0, 0x04, 0x44, 0x45, 0x55, 0xc0, 0xa8, 0x02, 0xaa, 0xaa, 0xab, 0xc0, 0xd0, 0x01,
|
||||||
|
0x11, 0x15, 0x55, 0xc0, 0xa8, 0x02, 0xaa, 0xaa, 0xab, 0xc0, 0xd0, 0x04, 0x44, 0x45, 0x55, 0xc0,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x2a, 0x05, 0x55, 0x55,
|
||||||
|
0x57, 0x00, 0x34, 0x08, 0x88, 0x8a, 0xaf, 0x00, 0x2a, 0x05, 0x55, 0x55, 0x57, 0x00, 0x34, 0x02,
|
||||||
|
0x22, 0x2a, 0xaf, 0x00, 0x2a, 0x05, 0x55, 0x55, 0x57, 0x00, 0x34, 0x08, 0x88, 0x8a, 0xaf, 0x00,
|
||||||
|
0x2a, 0x05, 0x55, 0x55, 0x57, 0x00, 0x34, 0x02, 0x22, 0x2a, 0xaf, 0x00, 0x2a, 0x05, 0x55, 0x55,
|
||||||
|
0x57, 0x00, 0x34, 0x08, 0x88, 0x8a, 0xaf, 0x00, 0x2a, 0x05, 0x55, 0x55, 0x57, 0x00, 0x34, 0x02,
|
||||||
|
0x22, 0x2a, 0xaf, 0x00, 0x2a, 0x05, 0x55, 0x55, 0x57, 0x00, 0x34, 0x08, 0x88, 0x8a, 0xaf, 0x00,
|
||||||
|
0x2a, 0x05, 0x55, 0x55, 0x57, 0x00, 0x34, 0x02, 0x22, 0x2a, 0xaf, 0x00, 0x2a, 0x05, 0x55, 0x55,
|
||||||
|
0x57, 0x00, 0x34, 0x08, 0x88, 0x8a, 0xaf, 0x00, 0x2a, 0x05, 0x55, 0x55, 0x57, 0x00, 0x34, 0x02,
|
||||||
|
0x22, 0x2a, 0xaf, 0x00, 0x2a, 0x05, 0x55, 0x55, 0x57, 0x00, 0x34, 0x08, 0x88, 0x8a, 0xaf, 0x00,
|
||||||
|
0x2a, 0x05, 0x55, 0x55, 0x57, 0x00, 0x34, 0x02, 0x22, 0x2a, 0xaf, 0x00, 0x2a, 0x05, 0x55, 0x55,
|
||||||
|
0x57, 0x00, 0x34, 0x08, 0x88, 0x8a, 0xaf, 0x00, 0x2a, 0x05, 0x55, 0x55, 0x57, 0x00, 0x34, 0x02,
|
||||||
|
0x22, 0x2a, 0xaf, 0x00, 0x2a, 0x05, 0x55, 0x55, 0x57, 0x00
|
||||||
|
};
|
|
@ -0,0 +1,43 @@
|
||||||
|
#ifndef SETTINGS_H
|
||||||
|
#define SETTINGS_H
|
||||||
|
|
||||||
|
//Weather Settings
|
||||||
|
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
||||||
|
|
||||||
|
//You can also use LAT,LON for your location instead of CITY_ID, but not both
|
||||||
|
//#define LAT "40.7127" //New York City, Looked up on https://www.latlong.net/
|
||||||
|
//#define LON "-74.0059"
|
||||||
|
|
||||||
|
#ifdef CITY_ID
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id={cityID}&lang={lang}&units={units}&appid={apiKey}" //open weather api using city ID
|
||||||
|
#else
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&lang={lang}&units={units}&appid={apiKey}" //open weather api using lat lon
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
||||||
|
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
||||||
|
#define TEMP_LANG "en"
|
||||||
|
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
||||||
|
//NTP Settings
|
||||||
|
#define NTP_SERVER "pool.ntp.org"
|
||||||
|
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5 EST, -4 EDT, will be overwritten by weather data
|
||||||
|
|
||||||
|
watchySettings settings{
|
||||||
|
#ifdef CITY_ID
|
||||||
|
.cityID = CITY_ID,
|
||||||
|
#else
|
||||||
|
.cityID = "",
|
||||||
|
.lat = LAT,
|
||||||
|
.lon = LON,
|
||||||
|
#endif
|
||||||
|
.weatherAPIKey = OPENWEATHERMAP_APIKEY,
|
||||||
|
.weatherURL = OPENWEATHERMAP_URL,
|
||||||
|
.weatherUnit = TEMP_UNIT,
|
||||||
|
.weatherLang = TEMP_LANG,
|
||||||
|
.weatherUpdateInterval = WEATHER_UPDATE_INTERVAL,
|
||||||
|
.ntpServer = NTP_SERVER,
|
||||||
|
.gmtOffset = GMT_OFFSET_SEC,
|
||||||
|
.vibrateOClock = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -3,26 +3,41 @@
|
||||||
|
|
||||||
//Weather Settings
|
//Weather Settings
|
||||||
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
||||||
|
|
||||||
|
//You can also use LAT,LON for your location instead of CITY_ID, but not both
|
||||||
|
//#define LAT "40.7127" //New York City, Looked up on https://www.latlong.net/
|
||||||
|
//#define LON "-74.0059"
|
||||||
|
|
||||||
|
#ifdef CITY_ID
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id={cityID}&lang={lang}&units={units}&appid={apiKey}" //open weather api using city ID
|
||||||
|
#else
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&lang={lang}&units={units}&appid={apiKey}" //open weather api using lat lon
|
||||||
|
#endif
|
||||||
|
|
||||||
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
||||||
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id=" //open weather api
|
|
||||||
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
||||||
#define TEMP_LANG "en"
|
#define TEMP_LANG "en"
|
||||||
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
||||||
//NTP Settings
|
//NTP Settings
|
||||||
#define NTP_SERVER "pool.ntp.org"
|
#define NTP_SERVER "pool.ntp.org"
|
||||||
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5
|
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5 EST, -4 EDT, will be overwritten by weather data
|
||||||
#define DST_OFFSET_SEC 3600
|
|
||||||
|
|
||||||
watchySettings settings{
|
watchySettings settings{
|
||||||
CITY_ID,
|
#ifdef CITY_ID
|
||||||
OPENWEATHERMAP_APIKEY,
|
.cityID = CITY_ID,
|
||||||
OPENWEATHERMAP_URL,
|
#else
|
||||||
TEMP_UNIT,
|
.cityID = "",
|
||||||
TEMP_LANG,
|
.lat = LAT,
|
||||||
WEATHER_UPDATE_INTERVAL,
|
.lon = LON,
|
||||||
NTP_SERVER,
|
#endif
|
||||||
GMT_OFFSET_SEC,
|
.weatherAPIKey = OPENWEATHERMAP_APIKEY,
|
||||||
DST_OFFSET_SEC
|
.weatherURL = OPENWEATHERMAP_URL,
|
||||||
|
.weatherUnit = TEMP_UNIT,
|
||||||
|
.weatherLang = TEMP_LANG,
|
||||||
|
.weatherUpdateInterval = WEATHER_UPDATE_INTERVAL,
|
||||||
|
.ntpServer = NTP_SERVER,
|
||||||
|
.gmtOffset = GMT_OFFSET_SEC,
|
||||||
|
.vibrateOClock = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -3,26 +3,41 @@
|
||||||
|
|
||||||
//Weather Settings
|
//Weather Settings
|
||||||
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
||||||
|
|
||||||
|
//You can also use LAT,LON for your location instead of CITY_ID, but not both
|
||||||
|
//#define LAT "40.7127" //New York City, Looked up on https://www.latlong.net/
|
||||||
|
//#define LON "-74.0059"
|
||||||
|
|
||||||
|
#ifdef CITY_ID
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id={cityID}&lang={lang}&units={units}&appid={apiKey}" //open weather api using city ID
|
||||||
|
#else
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&lang={lang}&units={units}&appid={apiKey}" //open weather api using lat lon
|
||||||
|
#endif
|
||||||
|
|
||||||
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
||||||
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id=" //open weather api
|
|
||||||
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
||||||
#define TEMP_LANG "en"
|
#define TEMP_LANG "en"
|
||||||
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
||||||
//NTP Settings
|
//NTP Settings
|
||||||
#define NTP_SERVER "pool.ntp.org"
|
#define NTP_SERVER "pool.ntp.org"
|
||||||
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5
|
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5 EST, -4 EDT, will be overwritten by weather data
|
||||||
#define DST_OFFSET_SEC 3600
|
|
||||||
|
|
||||||
watchySettings settings{
|
watchySettings settings{
|
||||||
CITY_ID,
|
#ifdef CITY_ID
|
||||||
OPENWEATHERMAP_APIKEY,
|
.cityID = CITY_ID,
|
||||||
OPENWEATHERMAP_URL,
|
#else
|
||||||
TEMP_UNIT,
|
.cityID = "",
|
||||||
TEMP_LANG,
|
.lat = LAT,
|
||||||
WEATHER_UPDATE_INTERVAL,
|
.lon = LON,
|
||||||
NTP_SERVER,
|
#endif
|
||||||
GMT_OFFSET_SEC,
|
.weatherAPIKey = OPENWEATHERMAP_APIKEY,
|
||||||
DST_OFFSET_SEC
|
.weatherURL = OPENWEATHERMAP_URL,
|
||||||
|
.weatherUnit = TEMP_UNIT,
|
||||||
|
.weatherLang = TEMP_LANG,
|
||||||
|
.weatherUpdateInterval = WEATHER_UPDATE_INTERVAL,
|
||||||
|
.ntpServer = NTP_SERVER,
|
||||||
|
.gmtOffset = GMT_OFFSET_SEC,
|
||||||
|
.vibrateOClock = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -3,26 +3,41 @@
|
||||||
|
|
||||||
//Weather Settings
|
//Weather Settings
|
||||||
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
#define CITY_ID "5128581" //New York City https://openweathermap.org/current#cityid
|
||||||
|
|
||||||
|
//You can also use LAT,LON for your location instead of CITY_ID, but not both
|
||||||
|
//#define LAT "40.7127" //New York City, Looked up on https://www.latlong.net/
|
||||||
|
//#define LON "-74.0059"
|
||||||
|
|
||||||
|
#ifdef CITY_ID
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id={cityID}&lang={lang}&units={units}&appid={apiKey}" //open weather api using city ID
|
||||||
|
#else
|
||||||
|
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&lang={lang}&units={units}&appid={apiKey}" //open weather api using lat lon
|
||||||
|
#endif
|
||||||
|
|
||||||
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
#define OPENWEATHERMAP_APIKEY "f058fe1cad2afe8e2ddc5d063a64cecb" //use your own API key :)
|
||||||
#define OPENWEATHERMAP_URL "http://api.openweathermap.org/data/2.5/weather?id=" //open weather api
|
|
||||||
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
#define TEMP_UNIT "metric" //metric = Celsius , imperial = Fahrenheit
|
||||||
#define TEMP_LANG "en"
|
#define TEMP_LANG "en"
|
||||||
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
#define WEATHER_UPDATE_INTERVAL 30 //must be greater than 5, measured in minutes
|
||||||
//NTP Settings
|
//NTP Settings
|
||||||
#define NTP_SERVER "pool.ntp.org"
|
#define NTP_SERVER "pool.ntp.org"
|
||||||
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5
|
#define GMT_OFFSET_SEC 3600 * -5 //New York is UTC -5 EST, -4 EDT, will be overwritten by weather data
|
||||||
#define DST_OFFSET_SEC 3600
|
|
||||||
|
|
||||||
watchySettings settings{
|
watchySettings settings{
|
||||||
CITY_ID,
|
#ifdef CITY_ID
|
||||||
OPENWEATHERMAP_APIKEY,
|
.cityID = CITY_ID,
|
||||||
OPENWEATHERMAP_URL,
|
#else
|
||||||
TEMP_UNIT,
|
.cityID = "",
|
||||||
TEMP_LANG,
|
.lat = LAT,
|
||||||
WEATHER_UPDATE_INTERVAL,
|
.lon = LON,
|
||||||
NTP_SERVER,
|
#endif
|
||||||
GMT_OFFSET_SEC,
|
.weatherAPIKey = OPENWEATHERMAP_APIKEY,
|
||||||
DST_OFFSET_SEC
|
.weatherURL = OPENWEATHERMAP_URL,
|
||||||
|
.weatherUnit = TEMP_UNIT,
|
||||||
|
.weatherLang = TEMP_LANG,
|
||||||
|
.weatherUpdateInterval = WEATHER_UPDATE_INTERVAL,
|
||||||
|
.ntpServer = NTP_SERVER,
|
||||||
|
.gmtOffset = GMT_OFFSET_SEC,
|
||||||
|
.vibrateOClock = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "Watchy",
|
"name": "Watchy",
|
||||||
"version": "1.4.0",
|
"version": "1.4.10",
|
||||||
"description": "Watchy - An Open Source E-Paper Watch by SQFMI",
|
"description": "Watchy - An Open Source E-Paper Watch by SQFMI",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name=Watchy
|
name=Watchy
|
||||||
version=1.4.0
|
version=1.4.10
|
||||||
author=SQFMI
|
author=SQFMI
|
||||||
maintainer=SQFMI
|
maintainer=SQFMI
|
||||||
sentence=Watchy - An Open Source E-Paper Watch by SQFMI
|
sentence=Watchy - An Open Source E-Paper Watch by SQFMI
|
||||||
|
|
|
@ -0,0 +1,502 @@
|
||||||
|
// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare.
|
||||||
|
// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines!
|
||||||
|
//
|
||||||
|
// based on Demo Example from Good Display, available here: http://www.e-paper-display.com/download_detail/downloadsId=806.html
|
||||||
|
// Panel: GDEH0154D67 : http://www.e-paper-display.com/products_detail/productId=455.html
|
||||||
|
// Controller : SSD1681 : http://www.e-paper-display.com/download_detail/downloadsId=825.html
|
||||||
|
//
|
||||||
|
// Author: Jean-Marc Zingg
|
||||||
|
//
|
||||||
|
// Version: see library.properties
|
||||||
|
//
|
||||||
|
// Library: https://github.com/ZinggJM/GxEPD2
|
||||||
|
//
|
||||||
|
// The original code from the author has been slightly modified to improve the performance for Watchy Project:
|
||||||
|
// Link: https://github.com/sqfmi/Watchy
|
||||||
|
|
||||||
|
#include "Display.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
RTC_DATA_ATTR bool displayFullInit = true;
|
||||||
|
|
||||||
|
void WatchyDisplay::busyCallback(const void *) {
|
||||||
|
gpio_wakeup_enable((gpio_num_t)DISPLAY_BUSY, GPIO_INTR_LOW_LEVEL);
|
||||||
|
esp_sleep_enable_gpio_wakeup();
|
||||||
|
esp_light_sleep_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
WatchyDisplay::WatchyDisplay() :
|
||||||
|
GxEPD2_EPD(DISPLAY_CS, DISPLAY_DC, DISPLAY_RES, DISPLAY_BUSY, HIGH, 10000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate)
|
||||||
|
{
|
||||||
|
// Setup callback and SPI by default
|
||||||
|
selectSPI(SPI, SPISettings(20000000, MSBFIRST, SPI_MODE0));
|
||||||
|
setBusyCallback(busyCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::initWatchy() {
|
||||||
|
// Watchy default initialization
|
||||||
|
init(0, displayFullInit, 2, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::asyncPowerOn() {
|
||||||
|
// This is expensive if unused
|
||||||
|
if (!waitingPowerOn && !_hibernating) {
|
||||||
|
_InitDisplay();
|
||||||
|
_PowerOnAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::setDarkBorder(bool dark) {
|
||||||
|
if (_hibernating) return;
|
||||||
|
darkBorder = dark;
|
||||||
|
_startTransfer();
|
||||||
|
_transferCommand(0x3C); // BorderWavefrom
|
||||||
|
_transfer(dark ? 0x02 : 0x05);
|
||||||
|
_endTransfer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::clearScreen(uint8_t value)
|
||||||
|
{
|
||||||
|
writeScreenBuffer(value);
|
||||||
|
refresh(true);
|
||||||
|
writeScreenBufferAgain(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::writeScreenBuffer(uint8_t value)
|
||||||
|
{
|
||||||
|
if (!_using_partial_mode) _Init_Part();
|
||||||
|
if (_initial_write) _writeScreenBuffer(0x26, value); // set previous
|
||||||
|
_writeScreenBuffer(0x24, value); // set current
|
||||||
|
_initial_write = false; // initial full screen buffer clean done
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::writeScreenBufferAgain(uint8_t value)
|
||||||
|
{
|
||||||
|
if (!_using_partial_mode) _Init_Part();
|
||||||
|
_writeScreenBuffer(0x24, value); // set current
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_writeScreenBuffer(uint8_t command, uint8_t value)
|
||||||
|
{
|
||||||
|
_startTransfer();
|
||||||
|
_transferCommand(command);
|
||||||
|
for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
|
||||||
|
{
|
||||||
|
_transfer(value);
|
||||||
|
}
|
||||||
|
_endTransfer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
_writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
_writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
_writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
_writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean
|
||||||
|
#if defined(ESP8266) || defined(ESP32)
|
||||||
|
yield(); // avoid wdt
|
||||||
|
#endif
|
||||||
|
int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded
|
||||||
|
x -= x % 8; // byte boundary
|
||||||
|
w = wb * 8; // byte boundary
|
||||||
|
int16_t x1 = x < 0 ? 0 : x; // limit
|
||||||
|
int16_t y1 = y < 0 ? 0 : y; // limit
|
||||||
|
int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit
|
||||||
|
int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit
|
||||||
|
int16_t dx = x1 - x;
|
||||||
|
int16_t dy = y1 - y;
|
||||||
|
w1 -= dx;
|
||||||
|
h1 -= dy;
|
||||||
|
if ((w1 <= 0) || (h1 <= 0)) return;
|
||||||
|
if (!_using_partial_mode) _Init_Part();
|
||||||
|
_setPartialRamArea(x1, y1, w1, h1);
|
||||||
|
_startTransfer();
|
||||||
|
_transferCommand(command);
|
||||||
|
for (int16_t i = 0; i < h1; i++)
|
||||||
|
{
|
||||||
|
for (int16_t j = 0; j < w1 / 8; j++)
|
||||||
|
{
|
||||||
|
uint8_t data;
|
||||||
|
// use wb, h of bitmap for index!
|
||||||
|
int16_t idx = mirror_y ? j + dx / 8 + ((h - 1 - (i + dy))) * wb : j + dx / 8 + (i + dy) * wb;
|
||||||
|
if (pgm)
|
||||||
|
{
|
||||||
|
#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
|
||||||
|
data = pgm_read_byte(&bitmap[idx]);
|
||||||
|
#else
|
||||||
|
data = bitmap[idx];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data = bitmap[idx];
|
||||||
|
}
|
||||||
|
if (invert) data = ~data;
|
||||||
|
_transfer(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_endTransfer();
|
||||||
|
#if defined(ESP8266) || defined(ESP32)
|
||||||
|
yield(); // avoid wdt
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
_writeImagePart(0x24, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
_writeImagePart(0x24, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean
|
||||||
|
#if defined(ESP8266) || defined(ESP32)
|
||||||
|
yield(); // avoid wdt
|
||||||
|
#endif
|
||||||
|
if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return;
|
||||||
|
if ((x_part < 0) || (x_part >= w_bitmap)) return;
|
||||||
|
if ((y_part < 0) || (y_part >= h_bitmap)) return;
|
||||||
|
int16_t wb_bitmap = (w_bitmap + 7) / 8; // width bytes, bitmaps are padded
|
||||||
|
x_part -= x_part % 8; // byte boundary
|
||||||
|
w = w_bitmap - x_part < w ? w_bitmap - x_part : w; // limit
|
||||||
|
h = h_bitmap - y_part < h ? h_bitmap - y_part : h; // limit
|
||||||
|
x -= x % 8; // byte boundary
|
||||||
|
w = 8 * ((w + 7) / 8); // byte boundary, bitmaps are padded
|
||||||
|
int16_t x1 = x < 0 ? 0 : x; // limit
|
||||||
|
int16_t y1 = y < 0 ? 0 : y; // limit
|
||||||
|
int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit
|
||||||
|
int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit
|
||||||
|
int16_t dx = x1 - x;
|
||||||
|
int16_t dy = y1 - y;
|
||||||
|
w1 -= dx;
|
||||||
|
h1 -= dy;
|
||||||
|
if ((w1 <= 0) || (h1 <= 0)) return;
|
||||||
|
if (!_using_partial_mode) _Init_Part();
|
||||||
|
_setPartialRamArea(x1, y1, w1, h1);
|
||||||
|
_startTransfer();
|
||||||
|
_transferCommand(command);
|
||||||
|
for (int16_t i = 0; i < h1; i++)
|
||||||
|
{
|
||||||
|
for (int16_t j = 0; j < w1 / 8; j++)
|
||||||
|
{
|
||||||
|
uint8_t data;
|
||||||
|
// use wb_bitmap, h_bitmap of bitmap for index!
|
||||||
|
int16_t idx = mirror_y ? x_part / 8 + j + dx / 8 + ((h_bitmap - 1 - (y_part + i + dy))) * wb_bitmap : x_part / 8 + j + dx / 8 + (y_part + i + dy) * wb_bitmap;
|
||||||
|
if (pgm)
|
||||||
|
{
|
||||||
|
#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
|
||||||
|
data = pgm_read_byte(&bitmap[idx]);
|
||||||
|
#else
|
||||||
|
data = bitmap[idx];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data = bitmap[idx];
|
||||||
|
}
|
||||||
|
if (invert) data = ~data;
|
||||||
|
_transfer(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_endTransfer();
|
||||||
|
#if defined(ESP8266) || defined(ESP32)
|
||||||
|
yield(); // avoid wdt
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
if (black)
|
||||||
|
{
|
||||||
|
writeImage(black, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
if (black)
|
||||||
|
{
|
||||||
|
writeImagePart(black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
if (data1)
|
||||||
|
{
|
||||||
|
writeImage(data1, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
refresh(x, y, w, h);
|
||||||
|
writeImageAgain(bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
refresh(x, y, w, h);
|
||||||
|
writeImagePartAgain(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
if (black)
|
||||||
|
{
|
||||||
|
drawImage(black, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
if (black)
|
||||||
|
{
|
||||||
|
drawImagePart(black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
|
||||||
|
{
|
||||||
|
if (data1)
|
||||||
|
{
|
||||||
|
drawImage(data1, x, y, w, h, invert, mirror_y, pgm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::refresh(bool partial_update_mode)
|
||||||
|
{
|
||||||
|
if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_using_partial_mode) _Init_Full();
|
||||||
|
_Update_Full();
|
||||||
|
_initial_refresh = false; // initial full update done
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::refresh(int16_t x, int16_t y, int16_t w, int16_t h)
|
||||||
|
{
|
||||||
|
if (_initial_refresh) return refresh(false); // initial update needs be full update
|
||||||
|
// intersection with screen
|
||||||
|
int16_t w1 = x < 0 ? w + x : w; // reduce
|
||||||
|
int16_t h1 = y < 0 ? h + y : h; // reduce
|
||||||
|
int16_t x1 = x < 0 ? 0 : x; // limit
|
||||||
|
int16_t y1 = y < 0 ? 0 : y; // limit
|
||||||
|
w1 = x1 + w1 < int16_t(WIDTH) ? w1 : int16_t(WIDTH) - x1; // limit
|
||||||
|
h1 = y1 + h1 < int16_t(HEIGHT) ? h1 : int16_t(HEIGHT) - y1; // limit
|
||||||
|
if ((w1 <= 0) || (h1 <= 0)) return;
|
||||||
|
// make x1, w1 multiple of 8
|
||||||
|
w1 += x1 % 8;
|
||||||
|
if (w1 % 8 > 0) w1 += 8 - w1 % 8;
|
||||||
|
x1 -= x1 % 8;
|
||||||
|
if (!_using_partial_mode) _Init_Part();
|
||||||
|
_setPartialRamArea(x1, y1, w1, h1);
|
||||||
|
_Update_Part();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::powerOff()
|
||||||
|
{
|
||||||
|
_PowerOff();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::hibernate()
|
||||||
|
{
|
||||||
|
//_PowerOff(); // Not needed before entering deep sleep
|
||||||
|
if (_rst >= 0)
|
||||||
|
{
|
||||||
|
_writeCommand(0x10); // deep sleep mode
|
||||||
|
_writeData(0x1); // enter deep sleep
|
||||||
|
_hibernating = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
|
||||||
|
{
|
||||||
|
_startTransfer();
|
||||||
|
_transferCommand(0x11); // set ram entry mode
|
||||||
|
_transfer(0x03); // x increase, y increase : normal mode
|
||||||
|
_transferCommand(0x44);
|
||||||
|
_transfer(x / 8);
|
||||||
|
_transfer((x + w - 1) / 8);
|
||||||
|
_transferCommand(0x45);
|
||||||
|
_transfer(y % 256);
|
||||||
|
_transfer(y / 256);
|
||||||
|
_transfer((y + h - 1) % 256);
|
||||||
|
_transfer((y + h - 1) / 256);
|
||||||
|
_transferCommand(0x4e);
|
||||||
|
_transfer(x / 8);
|
||||||
|
_transferCommand(0x4f);
|
||||||
|
_transfer(y % 256);
|
||||||
|
_transfer(y / 256);
|
||||||
|
_endTransfer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_PowerOnAsync()
|
||||||
|
{
|
||||||
|
if (_power_is_on)
|
||||||
|
return;
|
||||||
|
_startTransfer();
|
||||||
|
_transferCommand(0x22);
|
||||||
|
_transfer(0xf8);
|
||||||
|
_transferCommand(0x20);
|
||||||
|
_endTransfer();
|
||||||
|
waitingPowerOn = true;
|
||||||
|
_power_is_on = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_PowerOn()
|
||||||
|
{
|
||||||
|
if (waitingPowerOn)
|
||||||
|
{
|
||||||
|
waitingPowerOn = false;
|
||||||
|
_waitWhileBusy("_PowerOn", power_on_time);
|
||||||
|
}
|
||||||
|
if (_power_is_on)
|
||||||
|
return;
|
||||||
|
_startTransfer();
|
||||||
|
_transferCommand(0x22);
|
||||||
|
_transfer(0xf8);
|
||||||
|
_transferCommand(0x20);
|
||||||
|
_endTransfer();
|
||||||
|
_waitWhileBusy("_PowerOn", power_on_time);
|
||||||
|
_power_is_on = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_PowerOff()
|
||||||
|
{
|
||||||
|
if (waitingPowerOn)
|
||||||
|
{
|
||||||
|
waitingPowerOn = false;
|
||||||
|
_waitWhileBusy("_PowerOn", power_on_time);
|
||||||
|
}
|
||||||
|
if (!_power_is_on)
|
||||||
|
return;
|
||||||
|
_startTransfer();
|
||||||
|
_transferCommand(0x22);
|
||||||
|
_transfer(0x83);
|
||||||
|
_transferCommand(0x20);
|
||||||
|
_endTransfer();
|
||||||
|
_waitWhileBusy("_PowerOff", power_off_time);
|
||||||
|
_power_is_on = false;
|
||||||
|
_using_partial_mode = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_InitDisplay()
|
||||||
|
{
|
||||||
|
if (_hibernating) _reset();
|
||||||
|
|
||||||
|
// No need to soft reset, the Display goes to same state after hard reset
|
||||||
|
// _writeCommand(0x12); // soft reset
|
||||||
|
// _waitWhileBusy("_SoftReset", 10); // 10ms max according to specs*/
|
||||||
|
|
||||||
|
_startTransfer();
|
||||||
|
_transferCommand(0x01); // Driver output control
|
||||||
|
_transfer(0xC7);
|
||||||
|
_transfer(0x00);
|
||||||
|
_transfer(0x00);
|
||||||
|
|
||||||
|
if (reduceBoosterTime) {
|
||||||
|
// SSD1675B controller datasheet
|
||||||
|
_transferCommand(0x0C); // BOOSTER_SOFT_START_CONTROL
|
||||||
|
// Set the driving strength of GDR for all phases to maximun 0b111 -> 0xF
|
||||||
|
// Set the minimum off time of GDR to minimum 0x4 (values below sould be same)
|
||||||
|
_transfer(0xF4); // Phase1 Default value 0x8B
|
||||||
|
_transfer(0xF4); // Phase2 Default value 0x9C
|
||||||
|
_transfer(0xF4); // Phase3 Default value 0x96
|
||||||
|
_transfer(0x00); // Duration of phases, Default 0xF = 0b00 11 11 (40ms Phase 1/2, 10ms Phase 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
_transferCommand(0x18); // Read built-in temperature sensor
|
||||||
|
_transfer(0x80);
|
||||||
|
_endTransfer();
|
||||||
|
|
||||||
|
setDarkBorder(darkBorder);
|
||||||
|
|
||||||
|
_setPartialRamArea(0, 0, WIDTH, HEIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_reset()
|
||||||
|
{
|
||||||
|
// Call default method if not configured the same way
|
||||||
|
if (_rst < 0 || !_pulldown_rst_mode) {
|
||||||
|
GxEPD2_EPD::_reset();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
digitalWrite(_rst, LOW);
|
||||||
|
pinMode(_rst, OUTPUT);
|
||||||
|
delay(_reset_duration);
|
||||||
|
pinMode(_rst, INPUT_PULLUP);
|
||||||
|
// Tested calling _powerOn() inmediately, and works ok, no need to sleep
|
||||||
|
// delay(_reset_duration > 10 ? _reset_duration : 0);
|
||||||
|
_hibernating = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_Init_Full()
|
||||||
|
{
|
||||||
|
_InitDisplay();
|
||||||
|
_PowerOn();
|
||||||
|
_using_partial_mode = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_Init_Part()
|
||||||
|
{
|
||||||
|
_InitDisplay();
|
||||||
|
_PowerOn();
|
||||||
|
_using_partial_mode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_Update_Full()
|
||||||
|
{
|
||||||
|
_startTransfer();
|
||||||
|
_transferCommand(0x22);
|
||||||
|
_transfer(0xf4);
|
||||||
|
_transferCommand(0x20);
|
||||||
|
_endTransfer();
|
||||||
|
_waitWhileBusy("_Update_Full", full_refresh_time);
|
||||||
|
displayFullInit = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_Update_Part()
|
||||||
|
{
|
||||||
|
_startTransfer();
|
||||||
|
_transferCommand(0x22);
|
||||||
|
//_transfer(0xcc); // skip temperature load (-5ms)
|
||||||
|
_transfer(0xfc);
|
||||||
|
_transferCommand(0x20);
|
||||||
|
_endTransfer();
|
||||||
|
_waitWhileBusy("_Update_Part", partial_refresh_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WatchyDisplay::_transferCommand(uint8_t value)
|
||||||
|
{
|
||||||
|
if (_dc >= 0) digitalWrite(_dc, LOW);
|
||||||
|
SPI.transfer(value);
|
||||||
|
if (_dc >= 0) digitalWrite(_dc, HIGH);
|
||||||
|
}
|
|
@ -0,0 +1,97 @@
|
||||||
|
// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare.
|
||||||
|
// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines!
|
||||||
|
//
|
||||||
|
// based on Demo Example from Good Display, available here: http://www.e-paper-display.com/download_detail/downloadsId=806.html
|
||||||
|
// Panel: GDEH0154D67 : http://www.e-paper-display.com/products_detail/productId=455.html
|
||||||
|
// Controller : SSD1681 : http://www.e-paper-display.com/download_detail/downloadsId=825.html
|
||||||
|
//
|
||||||
|
// Author: Jean-Marc Zingg
|
||||||
|
//
|
||||||
|
// Version: see library.properties
|
||||||
|
//
|
||||||
|
// Library: https://github.com/ZinggJM/GxEPD2
|
||||||
|
//
|
||||||
|
// The original code from the author has been slightly modified to improve the performance for Watchy Project:
|
||||||
|
// Link: https://github.com/sqfmi/Watchy
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <GxEPD2_EPD.h>
|
||||||
|
|
||||||
|
class WatchyDisplay : public GxEPD2_EPD
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// attributes
|
||||||
|
static const uint16_t WIDTH = 200;
|
||||||
|
static const uint16_t WIDTH_VISIBLE = WIDTH;
|
||||||
|
static const uint16_t HEIGHT = 200;
|
||||||
|
static const GxEPD2::Panel panel = GxEPD2::GDEH0154D67;
|
||||||
|
static const bool hasColor = false;
|
||||||
|
static const bool hasPartialUpdate = true;
|
||||||
|
static const bool hasFastPartialUpdate = true;
|
||||||
|
static const uint16_t power_on_time = 100; // ms, e.g. 95583us
|
||||||
|
static const uint16_t power_off_time = 150; // ms, e.g. 140621us
|
||||||
|
static const uint16_t full_refresh_time = 2600; // ms, e.g. 2509602us
|
||||||
|
static const uint16_t partial_refresh_time = 500; // ms, e.g. 457282us
|
||||||
|
// constructor
|
||||||
|
WatchyDisplay();
|
||||||
|
void initWatchy();
|
||||||
|
void setDarkBorder(bool darkBorder);
|
||||||
|
void asyncPowerOn();
|
||||||
|
void _PowerOnAsync();
|
||||||
|
bool waitingPowerOn = false;
|
||||||
|
static void busyCallback(const void *);
|
||||||
|
// methods (virtual)
|
||||||
|
// Support for Bitmaps (Sprites) to Controller Buffer and to Screen
|
||||||
|
void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white)
|
||||||
|
void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white)
|
||||||
|
void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white)
|
||||||
|
// write to controller memory, without screen refresh; x and w should be multiple of 8
|
||||||
|
void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
void writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
// for differential update: set current and previous buffers equal (for fast partial update to work correctly)
|
||||||
|
void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
// write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8
|
||||||
|
void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
// write to controller memory, with screen refresh; x and w should be multiple of 8
|
||||||
|
void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
// write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8
|
||||||
|
void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen
|
||||||
|
void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen
|
||||||
|
void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time
|
||||||
|
void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0)
|
||||||
|
|
||||||
|
bool darkBorder = false; // adds a dark border outside the normal screen area
|
||||||
|
|
||||||
|
static constexpr bool reduceBoosterTime = true; // Saves ~200ms
|
||||||
|
private:
|
||||||
|
void _writeScreenBuffer(uint8_t command, uint8_t value);
|
||||||
|
void _writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
void _writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
|
||||||
|
int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
|
||||||
|
void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h);
|
||||||
|
void _PowerOn();
|
||||||
|
void _PowerOff();
|
||||||
|
void _InitDisplay();
|
||||||
|
void _Init_Full();
|
||||||
|
void _Init_Part();
|
||||||
|
void _Update_Full();
|
||||||
|
void _Update_Part();
|
||||||
|
|
||||||
|
void _reset();
|
||||||
|
|
||||||
|
void _transferCommand(uint8_t command);
|
||||||
|
};
|
173
src/Watchy.cpp
173
src/Watchy.cpp
|
@ -1,8 +1,8 @@
|
||||||
#include "Watchy.h"
|
#include "Watchy.h"
|
||||||
|
|
||||||
WatchyRTC Watchy::RTC;
|
WatchyRTC Watchy::RTC;
|
||||||
GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> Watchy::display(
|
GxEPD2_BW<WatchyDisplay, WatchyDisplay::HEIGHT> Watchy::display(
|
||||||
GxEPD2_154_D67(DISPLAY_CS, DISPLAY_DC, DISPLAY_RES, DISPLAY_BUSY));
|
WatchyDisplay{});
|
||||||
|
|
||||||
RTC_DATA_ATTR int guiState;
|
RTC_DATA_ATTR int guiState;
|
||||||
RTC_DATA_ATTR int menuIndex;
|
RTC_DATA_ATTR int menuIndex;
|
||||||
|
@ -11,7 +11,11 @@ RTC_DATA_ATTR bool WIFI_CONFIGURED;
|
||||||
RTC_DATA_ATTR bool BLE_CONFIGURED;
|
RTC_DATA_ATTR bool BLE_CONFIGURED;
|
||||||
RTC_DATA_ATTR weatherData currentWeather;
|
RTC_DATA_ATTR weatherData currentWeather;
|
||||||
RTC_DATA_ATTR int weatherIntervalCounter = -1;
|
RTC_DATA_ATTR int weatherIntervalCounter = -1;
|
||||||
RTC_DATA_ATTR bool displayFullInit = true;
|
RTC_DATA_ATTR long gmtOffset = 0;
|
||||||
|
RTC_DATA_ATTR bool alreadyInMenu = true;
|
||||||
|
RTC_DATA_ATTR tmElements_t bootTime;
|
||||||
|
RTC_DATA_ATTR uint32_t lastIPAddress;
|
||||||
|
RTC_DATA_ATTR char lastSSID[30];
|
||||||
|
|
||||||
void Watchy::init(String datetime) {
|
void Watchy::init(String datetime) {
|
||||||
esp_sleep_wakeup_cause_t wakeup_reason;
|
esp_sleep_wakeup_cause_t wakeup_reason;
|
||||||
|
@ -19,16 +23,31 @@ void Watchy::init(String datetime) {
|
||||||
Wire.begin(SDA, SCL); // init i2c
|
Wire.begin(SDA, SCL); // init i2c
|
||||||
RTC.init();
|
RTC.init();
|
||||||
|
|
||||||
// Init the display here for all cases, if unused, it will do nothing
|
// Init the display since is almost sure we will use it
|
||||||
display.init(0, displayFullInit, 10,
|
display.epd2.initWatchy();
|
||||||
true); // 10ms by spec, and fast pulldown reset
|
|
||||||
display.epd2.setBusyCallback(displayBusyCallback);
|
|
||||||
|
|
||||||
switch (wakeup_reason) {
|
switch (wakeup_reason) {
|
||||||
case ESP_SLEEP_WAKEUP_EXT0: // RTC Alarm
|
case ESP_SLEEP_WAKEUP_EXT0: // RTC Alarm
|
||||||
if (guiState == WATCHFACE_STATE) {
|
RTC.read(currentTime);
|
||||||
RTC.read(currentTime);
|
switch (guiState) {
|
||||||
|
case WATCHFACE_STATE:
|
||||||
showWatchFace(true); // partial updates on tick
|
showWatchFace(true); // partial updates on tick
|
||||||
|
if (settings.vibrateOClock) {
|
||||||
|
if (currentTime.Minute == 0) {
|
||||||
|
// The RTC wakes us up once per minute
|
||||||
|
vibMotor(75, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAIN_MENU_STATE:
|
||||||
|
// Return to watchface if in menu for more than one tick
|
||||||
|
if (alreadyInMenu) {
|
||||||
|
guiState = WATCHFACE_STATE;
|
||||||
|
showWatchFace(false);
|
||||||
|
} else {
|
||||||
|
alreadyInMenu = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ESP_SLEEP_WAKEUP_EXT1: // button Press
|
case ESP_SLEEP_WAKEUP_EXT1: // button Press
|
||||||
|
@ -37,25 +56,26 @@ void Watchy::init(String datetime) {
|
||||||
default: // reset
|
default: // reset
|
||||||
RTC.config(datetime);
|
RTC.config(datetime);
|
||||||
_bmaConfig();
|
_bmaConfig();
|
||||||
|
gmtOffset = settings.gmtOffset;
|
||||||
RTC.read(currentTime);
|
RTC.read(currentTime);
|
||||||
|
RTC.read(bootTime);
|
||||||
showWatchFace(false); // full update on reset
|
showWatchFace(false); // full update on reset
|
||||||
|
vibMotor(75, 4);
|
||||||
|
// For some reason, seems to be enabled on first boot
|
||||||
|
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
deepSleep();
|
deepSleep();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Watchy::displayBusyCallback(const void *) {
|
|
||||||
gpio_wakeup_enable((gpio_num_t)DISPLAY_BUSY, GPIO_INTR_LOW_LEVEL);
|
|
||||||
esp_sleep_enable_gpio_wakeup();
|
|
||||||
esp_light_sleep_start();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Watchy::deepSleep() {
|
void Watchy::deepSleep() {
|
||||||
display.hibernate();
|
display.hibernate();
|
||||||
displayFullInit = false; // Notify not to init it again
|
|
||||||
RTC.clearAlarm(); // resets the alarm flag in the RTC
|
RTC.clearAlarm(); // resets the alarm flag in the RTC
|
||||||
// Set pins 0-39 to input to avoid power leaking out
|
|
||||||
for (int i = 0; i < 40; i++) {
|
// Set GPIOs 0-39 to input to avoid power leaking out
|
||||||
|
const uint64_t ignore = 0b11110001000000110000100111000010; // Ignore some GPIOs due to resets
|
||||||
|
for (int i = 0; i < GPIO_NUM_MAX; i++) {
|
||||||
|
if ((ignore >> i) & 0b1)
|
||||||
|
continue;
|
||||||
pinMode(i, INPUT);
|
pinMode(i, INPUT);
|
||||||
}
|
}
|
||||||
esp_sleep_enable_ext0_wakeup((gpio_num_t)RTC_INT_PIN,
|
esp_sleep_enable_ext0_wakeup((gpio_num_t)RTC_INT_PIN,
|
||||||
|
@ -250,6 +270,7 @@ void Watchy::showMenu(byte menuIndex, bool partialRefresh) {
|
||||||
display.display(partialRefresh);
|
display.display(partialRefresh);
|
||||||
|
|
||||||
guiState = MAIN_MENU_STATE;
|
guiState = MAIN_MENU_STATE;
|
||||||
|
alreadyInMenu = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Watchy::showFastMenu(byte menuIndex) {
|
void Watchy::showFastMenu(byte menuIndex) {
|
||||||
|
@ -294,15 +315,37 @@ void Watchy::showAbout() {
|
||||||
display.print("LibVer: ");
|
display.print("LibVer: ");
|
||||||
display.println(WATCHY_LIB_VER);
|
display.println(WATCHY_LIB_VER);
|
||||||
|
|
||||||
const char *RTC_HW[3] = {"<UNKNOWN>", "DS3231", "PCF8563"};
|
display.print("Rev: v");
|
||||||
display.print("RTC: ");
|
display.println(getBoardRevision());
|
||||||
display.println(RTC_HW[RTC.rtcType]); // 0 = UNKNOWN, 1 = DS3231, 2 = PCF8563
|
|
||||||
|
|
||||||
display.print("Batt: ");
|
display.print("Batt: ");
|
||||||
float voltage = getBatteryVoltage();
|
float voltage = getBatteryVoltage();
|
||||||
display.print(voltage);
|
display.print(voltage);
|
||||||
display.println("V");
|
display.println("V");
|
||||||
|
|
||||||
|
display.print("Uptime: ");
|
||||||
|
RTC.read(currentTime);
|
||||||
|
time_t b = makeTime(bootTime);
|
||||||
|
time_t c = makeTime(currentTime);
|
||||||
|
int totalSeconds = c-b;
|
||||||
|
//int seconds = (totalSeconds % 60);
|
||||||
|
int minutes = (totalSeconds % 3600) / 60;
|
||||||
|
int hours = (totalSeconds % 86400) / 3600;
|
||||||
|
int days = (totalSeconds % (86400 * 30)) / 86400;
|
||||||
|
display.print(days);
|
||||||
|
display.print("d");
|
||||||
|
display.print(hours);
|
||||||
|
display.print("h");
|
||||||
|
display.print(minutes);
|
||||||
|
display.println("m");
|
||||||
|
if(WIFI_CONFIGURED){
|
||||||
|
display.print("SSID: ");
|
||||||
|
display.println(lastSSID);
|
||||||
|
display.print("IP: ");
|
||||||
|
display.println(IPAddress(lastIPAddress).toString());
|
||||||
|
}else{
|
||||||
|
display.println("WiFi Not Connected");
|
||||||
|
}
|
||||||
display.display(false); // full refresh
|
display.display(false); // full refresh
|
||||||
|
|
||||||
guiState = APP_STATE;
|
guiState = APP_STATE;
|
||||||
|
@ -560,6 +603,8 @@ void Watchy::showAccelerometer() {
|
||||||
|
|
||||||
void Watchy::showWatchFace(bool partialRefresh) {
|
void Watchy::showWatchFace(bool partialRefresh) {
|
||||||
display.setFullWindow();
|
display.setFullWindow();
|
||||||
|
// At this point it is sure we are going to update
|
||||||
|
display.epd2.asyncPowerOn();
|
||||||
drawWatchFace();
|
drawWatchFace();
|
||||||
display.display(partialRefresh); // partial refresh
|
display.display(partialRefresh); // partial refresh
|
||||||
guiState = WATCHFACE_STATE;
|
guiState = WATCHFACE_STATE;
|
||||||
|
@ -580,12 +625,12 @@ void Watchy::drawWatchFace() {
|
||||||
}
|
}
|
||||||
|
|
||||||
weatherData Watchy::getWeatherData() {
|
weatherData Watchy::getWeatherData() {
|
||||||
return getWeatherData(settings.cityID, settings.weatherUnit,
|
return _getWeatherData(settings.cityID, settings.lat, settings.lon,
|
||||||
settings.weatherLang, settings.weatherURL,
|
settings.weatherUnit, settings.weatherLang, settings.weatherURL,
|
||||||
settings.weatherAPIKey, settings.weatherUpdateInterval);
|
settings.weatherAPIKey, settings.weatherUpdateInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
weatherData Watchy::getWeatherData(String cityID, String units, String lang,
|
weatherData Watchy::_getWeatherData(String cityID, String lat, String lon, String units, String lang,
|
||||||
String url, String apiKey,
|
String url, String apiKey,
|
||||||
uint8_t updateInterval) {
|
uint8_t updateInterval) {
|
||||||
currentWeather.isMetric = units == String("metric");
|
currentWeather.isMetric = units == String("metric");
|
||||||
|
@ -598,9 +643,16 @@ weatherData Watchy::getWeatherData(String cityID, String units, String lang,
|
||||||
if (connectWiFi()) {
|
if (connectWiFi()) {
|
||||||
HTTPClient http; // Use Weather API for live data if WiFi is connected
|
HTTPClient http; // Use Weather API for live data if WiFi is connected
|
||||||
http.setConnectTimeout(3000); // 3 second max timeout
|
http.setConnectTimeout(3000); // 3 second max timeout
|
||||||
String weatherQueryURL = url + cityID + String("&units=") + units +
|
String weatherQueryURL = url;
|
||||||
String("&lang=") + lang + String("&appid=") +
|
if(cityID != ""){
|
||||||
apiKey;
|
weatherQueryURL.replace("{cityID}", cityID);
|
||||||
|
}else{
|
||||||
|
weatherQueryURL.replace("{lat}", lat);
|
||||||
|
weatherQueryURL.replace("{lon}", lon);
|
||||||
|
}
|
||||||
|
weatherQueryURL.replace("{units}", units);
|
||||||
|
weatherQueryURL.replace("{lang}", lang);
|
||||||
|
weatherQueryURL.replace("{apiKey}", apiKey);
|
||||||
http.begin(weatherQueryURL.c_str());
|
http.begin(weatherQueryURL.c_str());
|
||||||
int httpResponseCode = http.GET();
|
int httpResponseCode = http.GET();
|
||||||
if (httpResponseCode == 200) {
|
if (httpResponseCode == 200) {
|
||||||
|
@ -610,7 +662,13 @@ weatherData Watchy::getWeatherData(String cityID, String units, String lang,
|
||||||
currentWeather.weatherConditionCode =
|
currentWeather.weatherConditionCode =
|
||||||
int(responseObject["weather"][0]["id"]);
|
int(responseObject["weather"][0]["id"]);
|
||||||
currentWeather.weatherDescription =
|
currentWeather.weatherDescription =
|
||||||
responseObject["weather"][0]["main"];
|
JSONVar::stringify(responseObject["weather"][0]["main"]);
|
||||||
|
currentWeather.external = true;
|
||||||
|
breakTime((time_t)(int)responseObject["sys"]["sunrise"], currentWeather.sunrise);
|
||||||
|
breakTime((time_t)(int)responseObject["sys"]["sunset"], currentWeather.sunset);
|
||||||
|
// sync NTP during weather API call and use timezone of lat & lon
|
||||||
|
gmtOffset = int(responseObject["timezone"]);
|
||||||
|
syncNTP(gmtOffset);
|
||||||
} else {
|
} else {
|
||||||
// http error
|
// http error
|
||||||
}
|
}
|
||||||
|
@ -625,6 +683,7 @@ weatherData Watchy::getWeatherData(String cityID, String units, String lang,
|
||||||
}
|
}
|
||||||
currentWeather.temperature = temperature;
|
currentWeather.temperature = temperature;
|
||||||
currentWeather.weatherConditionCode = 800;
|
currentWeather.weatherConditionCode = 800;
|
||||||
|
currentWeather.external = false;
|
||||||
}
|
}
|
||||||
weatherIntervalCounter = 0;
|
weatherIntervalCounter = 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -642,6 +701,31 @@ float Watchy::getBatteryVoltage() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t Watchy::getBoardRevision() {
|
||||||
|
esp_chip_info_t chip_info;
|
||||||
|
esp_chip_info(&chip_info);
|
||||||
|
if(chip_info.model == CHIP_ESP32){ //Revision 1.0 - 2.0
|
||||||
|
Wire.beginTransmission(0x68); //v1.0 has DS3231
|
||||||
|
if (Wire.endTransmission() == 0){
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
delay(1);
|
||||||
|
Wire.beginTransmission(0x51); //v1.5 and v2.0 have PCF8563
|
||||||
|
if (Wire.endTransmission() == 0){
|
||||||
|
pinMode(35, INPUT);
|
||||||
|
if(digitalRead(35) == 0){
|
||||||
|
return 20; //in rev 2.0, pin 35 is BTN 3 and has a pulldown
|
||||||
|
}else{
|
||||||
|
return 15; //in rev 1.5, pin 35 is the battery ADC
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(chip_info.model == CHIP_ESP32S3){ //Revision 3.0
|
||||||
|
return 30;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t Watchy::_readRegister(uint8_t address, uint8_t reg, uint8_t *data,
|
uint16_t Watchy::_readRegister(uint8_t address, uint8_t reg, uint8_t *data,
|
||||||
uint16_t len) {
|
uint16_t len) {
|
||||||
Wire.beginTransmission(address);
|
Wire.beginTransmission(address);
|
||||||
|
@ -773,15 +857,20 @@ void Watchy::setupWifi() {
|
||||||
display.println("Setup failed &");
|
display.println("Setup failed &");
|
||||||
display.println("timed out!");
|
display.println("timed out!");
|
||||||
} else {
|
} else {
|
||||||
display.println("Connected to");
|
display.println("Connected to:");
|
||||||
display.println(WiFi.SSID());
|
display.println(WiFi.SSID());
|
||||||
|
display.println("Local IP:");
|
||||||
|
display.println(WiFi.localIP());
|
||||||
|
weatherIntervalCounter = -1; // Reset to force weather to be read again
|
||||||
|
lastIPAddress = WiFi.localIP();
|
||||||
|
WiFi.SSID().toCharArray(lastSSID, 30);
|
||||||
}
|
}
|
||||||
display.display(false); // full refresh
|
display.display(false); // full refresh
|
||||||
// turn off radios
|
// turn off radios
|
||||||
WiFi.mode(WIFI_OFF);
|
WiFi.mode(WIFI_OFF);
|
||||||
btStop();
|
btStop();
|
||||||
display.epd2.setBusyCallback(displayBusyCallback); // enable lightsleep on
|
// enable lightsleep on busy
|
||||||
// busy
|
display.epd2.setBusyCallback(WatchyDisplay::busyCallback);
|
||||||
guiState = APP_STATE;
|
guiState = APP_STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -796,6 +885,8 @@ void Watchy::_configModeCallback(WiFiManager *myWiFiManager) {
|
||||||
display.println(WIFI_AP_SSID);
|
display.println(WIFI_AP_SSID);
|
||||||
display.print("IP: ");
|
display.print("IP: ");
|
||||||
display.println(WiFi.softAPIP());
|
display.println(WiFi.softAPIP());
|
||||||
|
display.println("MAC address:");
|
||||||
|
display.println(WiFi.softAPmacAddress().c_str());
|
||||||
display.display(false); // full refresh
|
display.display(false); // full refresh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -807,6 +898,8 @@ bool Watchy::connectWiFi() {
|
||||||
} else {
|
} else {
|
||||||
if (WL_CONNECTED ==
|
if (WL_CONNECTED ==
|
||||||
WiFi.waitForConnectResult()) { // attempt to connect for 10s
|
WiFi.waitForConnectResult()) { // attempt to connect for 10s
|
||||||
|
lastIPAddress = WiFi.localIP();
|
||||||
|
WiFi.SSID().toCharArray(lastSSID, 30);
|
||||||
WIFI_CONFIGURED = true;
|
WIFI_CONFIGURED = true;
|
||||||
} else { // connection failed, time out
|
} else { // connection failed, time out
|
||||||
WIFI_CONFIGURED = false;
|
WIFI_CONFIGURED = false;
|
||||||
|
@ -931,6 +1024,8 @@ void Watchy::showSyncNTP() {
|
||||||
display.setTextColor(GxEPD_WHITE);
|
display.setTextColor(GxEPD_WHITE);
|
||||||
display.setCursor(0, 30);
|
display.setCursor(0, 30);
|
||||||
display.println("Syncing NTP... ");
|
display.println("Syncing NTP... ");
|
||||||
|
display.print("GMT offset: ");
|
||||||
|
display.println(gmtOffset);
|
||||||
display.display(false); // full refresh
|
display.display(false); // full refresh
|
||||||
if (connectWiFi()) {
|
if (connectWiFi()) {
|
||||||
if (syncNTP()) {
|
if (syncNTP()) {
|
||||||
|
@ -968,13 +1063,17 @@ void Watchy::showSyncNTP() {
|
||||||
|
|
||||||
bool Watchy::syncNTP() { // NTP sync - call after connecting to WiFi and
|
bool Watchy::syncNTP() { // NTP sync - call after connecting to WiFi and
|
||||||
// remember to turn it back off
|
// remember to turn it back off
|
||||||
return syncNTP(settings.gmtOffset, settings.dstOffset,
|
return syncNTP(gmtOffset,
|
||||||
settings.ntpServer.c_str());
|
settings.ntpServer.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Watchy::syncNTP(long gmt, int dst,
|
bool Watchy::syncNTP(long gmt) {
|
||||||
String ntpServer) { // NTP sync - call after connecting to
|
return syncNTP(gmt, settings.ntpServer.c_str());
|
||||||
// WiFi and remember to turn it back off
|
}
|
||||||
|
|
||||||
|
bool Watchy::syncNTP(long gmt, String ntpServer) {
|
||||||
|
// NTP sync - call after connecting to
|
||||||
|
// WiFi and remember to turn it back off
|
||||||
WiFiUDP ntpUDP;
|
WiFiUDP ntpUDP;
|
||||||
NTPClient timeClient(ntpUDP, ntpServer.c_str(), gmt);
|
NTPClient timeClient(ntpUDP, ntpServer.c_str(), gmt);
|
||||||
timeClient.begin();
|
timeClient.begin();
|
||||||
|
|
41
src/Watchy.h
41
src/Watchy.h
|
@ -1,31 +1,38 @@
|
||||||
#ifndef WATCHY_H
|
#ifndef WATCHY_H
|
||||||
#define WATCHY_H
|
#define WATCHY_H
|
||||||
|
|
||||||
#include "BLE.h"
|
|
||||||
#include "DSEG7_Classic_Bold_53.h"
|
|
||||||
#include "WatchyRTC.h"
|
|
||||||
#include "bma.h"
|
|
||||||
#include "config.h"
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Arduino_JSON.h>
|
#include <WiFiManager.h>
|
||||||
#include <Fonts/FreeMonoBold9pt7b.h>
|
|
||||||
#include <GxEPD2_BW.h>
|
|
||||||
#include <HTTPClient.h>
|
#include <HTTPClient.h>
|
||||||
#include <NTPClient.h>
|
#include <NTPClient.h>
|
||||||
#include <WiFiManager.h>
|
|
||||||
#include <WiFiUdp.h>
|
#include <WiFiUdp.h>
|
||||||
|
#include <Arduino_JSON.h>
|
||||||
|
#include <GxEPD2_BW.h>
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
#include <Fonts/FreeMonoBold9pt7b.h>
|
||||||
|
#include "DSEG7_Classic_Bold_53.h"
|
||||||
|
#include "Display.h"
|
||||||
|
#include "WatchyRTC.h"
|
||||||
|
#include "BLE.h"
|
||||||
|
#include "bma.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "esp_chip_info.h"
|
||||||
|
|
||||||
typedef struct weatherData {
|
typedef struct weatherData {
|
||||||
int8_t temperature;
|
int8_t temperature;
|
||||||
int16_t weatherConditionCode;
|
int16_t weatherConditionCode;
|
||||||
bool isMetric;
|
bool isMetric;
|
||||||
String weatherDescription;
|
String weatherDescription;
|
||||||
|
bool external;
|
||||||
|
tmElements_t sunrise;
|
||||||
|
tmElements_t sunset;
|
||||||
} weatherData;
|
} weatherData;
|
||||||
|
|
||||||
typedef struct watchySettings {
|
typedef struct watchySettings {
|
||||||
// Weather Settings
|
// Weather Settings
|
||||||
String cityID;
|
String cityID;
|
||||||
|
String lat;
|
||||||
|
String lon;
|
||||||
String weatherAPIKey;
|
String weatherAPIKey;
|
||||||
String weatherURL;
|
String weatherURL;
|
||||||
String weatherUnit;
|
String weatherUnit;
|
||||||
|
@ -34,13 +41,14 @@ typedef struct watchySettings {
|
||||||
// NTP Settings
|
// NTP Settings
|
||||||
String ntpServer;
|
String ntpServer;
|
||||||
int gmtOffset;
|
int gmtOffset;
|
||||||
int dstOffset;
|
//
|
||||||
|
bool vibrateOClock;
|
||||||
} watchySettings;
|
} watchySettings;
|
||||||
|
|
||||||
class Watchy {
|
class Watchy {
|
||||||
public:
|
public:
|
||||||
static WatchyRTC RTC;
|
static WatchyRTC RTC;
|
||||||
static GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display;
|
static GxEPD2_BW<WatchyDisplay, WatchyDisplay::HEIGHT> display;
|
||||||
tmElements_t currentTime;
|
tmElements_t currentTime;
|
||||||
watchySettings settings;
|
watchySettings settings;
|
||||||
|
|
||||||
|
@ -48,11 +56,11 @@ public:
|
||||||
explicit Watchy(const watchySettings &s) : settings(s) {} // constructor
|
explicit Watchy(const watchySettings &s) : settings(s) {} // constructor
|
||||||
void init(String datetime = "");
|
void init(String datetime = "");
|
||||||
void deepSleep();
|
void deepSleep();
|
||||||
static void displayBusyCallback(const void *);
|
|
||||||
float getBatteryVoltage();
|
float getBatteryVoltage();
|
||||||
|
uint8_t getBoardRevision();
|
||||||
void vibMotor(uint8_t intervalMs = 100, uint8_t length = 20);
|
void vibMotor(uint8_t intervalMs = 100, uint8_t length = 20);
|
||||||
|
|
||||||
void handleButtonPress();
|
virtual void handleButtonPress();
|
||||||
void showMenu(byte menuIndex, bool partialRefresh);
|
void showMenu(byte menuIndex, bool partialRefresh);
|
||||||
void showFastMenu(byte menuIndex);
|
void showFastMenu(byte menuIndex);
|
||||||
void showAbout();
|
void showAbout();
|
||||||
|
@ -61,13 +69,12 @@ public:
|
||||||
void showUpdateFW();
|
void showUpdateFW();
|
||||||
void showSyncNTP();
|
void showSyncNTP();
|
||||||
bool syncNTP();
|
bool syncNTP();
|
||||||
bool syncNTP(long gmt, int dst, String ntpServer);
|
bool syncNTP(long gmt);
|
||||||
|
bool syncNTP(long gmt, String ntpServer);
|
||||||
void setTime();
|
void setTime();
|
||||||
void setupWifi();
|
void setupWifi();
|
||||||
bool connectWiFi();
|
bool connectWiFi();
|
||||||
weatherData getWeatherData();
|
weatherData getWeatherData();
|
||||||
weatherData getWeatherData(String cityID, String units, String lang,
|
|
||||||
String url, String apiKey, uint8_t updateInterval);
|
|
||||||
void updateFWBegin();
|
void updateFWBegin();
|
||||||
|
|
||||||
void showWatchFace(bool partialRefresh);
|
void showWatchFace(bool partialRefresh);
|
||||||
|
@ -81,6 +88,8 @@ private:
|
||||||
uint16_t len);
|
uint16_t len);
|
||||||
static uint16_t _writeRegister(uint8_t address, uint8_t reg, uint8_t *data,
|
static uint16_t _writeRegister(uint8_t address, uint8_t reg, uint8_t *data,
|
||||||
uint16_t len);
|
uint16_t len);
|
||||||
|
weatherData _getWeatherData(String cityID, String lat, String lon, String units, String lang,
|
||||||
|
String url, String apiKey, uint8_t updateInterval);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern RTC_DATA_ATTR int guiState;
|
extern RTC_DATA_ATTR int guiState;
|
||||||
|
|
|
@ -47,6 +47,7 @@ void WatchyRTC::read(tmElements_t &tm) {
|
||||||
if (rtcType == DS3231) {
|
if (rtcType == DS3231) {
|
||||||
rtc_ds.read(tm);
|
rtc_ds.read(tm);
|
||||||
} else {
|
} else {
|
||||||
|
rtc_pcf.getDate();
|
||||||
tm.Year = y2kYearToTm(rtc_pcf.getYear());
|
tm.Year = y2kYearToTm(rtc_pcf.getYear());
|
||||||
tm.Month = rtc_pcf.getMonth();
|
tm.Month = rtc_pcf.getMonth();
|
||||||
tm.Day = rtc_pcf.getDay();
|
tm.Day = rtc_pcf.getDay();
|
||||||
|
|
55
src/config.h
55
src/config.h
|
@ -1,8 +1,57 @@
|
||||||
#ifndef CONFIG_H
|
#ifndef CONFIG_H
|
||||||
#define CONFIG_H
|
#define CONFIG_H
|
||||||
|
|
||||||
// display
|
// Versioning
|
||||||
#define DISPLAY_WIDTH 200
|
#define WATCHY_LIB_VER "1.4.10"
|
||||||
|
|
||||||
|
//pins
|
||||||
|
#if !defined(ARDUINO_WATCHY_V10) && !defined(ARDUINO_WATCHY_V15) && !defined(ARDUINO_WATCHY_V20)
|
||||||
|
|
||||||
|
#pragma message "Please install the latest ESP32 Arduino Core (2.0.5+) and choose Watchy as the target board"
|
||||||
|
#pragma message "Hardware revision is not defined at the project level, please define in config.h. Defaulting to ARDUINO_WATCHY_V20"
|
||||||
|
|
||||||
|
//Change to your board version
|
||||||
|
#define ARDUINO_WATCHY_V20
|
||||||
|
|
||||||
|
#define MENU_BTN_PIN 26
|
||||||
|
#define BACK_BTN_PIN 25
|
||||||
|
#define DOWN_BTN_PIN 4
|
||||||
|
#define DISPLAY_CS 5
|
||||||
|
#define DISPLAY_RES 9
|
||||||
|
#define DISPLAY_DC 10
|
||||||
|
#define DISPLAY_BUSY 19
|
||||||
|
#define ACC_INT_1_PIN 14
|
||||||
|
#define ACC_INT_2_PIN 12
|
||||||
|
#define VIB_MOTOR_PIN 13
|
||||||
|
#define RTC_INT_PIN 27
|
||||||
|
|
||||||
|
#if defined (ARDUINO_WATCHY_V10)
|
||||||
|
#define UP_BTN_PIN 32
|
||||||
|
#define BATT_ADC_PIN 33
|
||||||
|
#define UP_BTN_MASK GPIO_SEL_32
|
||||||
|
#define RTC_TYPE 1 //DS3231
|
||||||
|
#elif defined (ARDUINO_WATCHY_V15)
|
||||||
|
#define UP_BTN_PIN 32
|
||||||
|
#define BATT_ADC_PIN 35
|
||||||
|
#define UP_BTN_MASK GPIO_SEL_32
|
||||||
|
#define RTC_TYPE 2 //PCF8563
|
||||||
|
#elif defined (ARDUINO_WATCHY_V20)
|
||||||
|
#define UP_BTN_PIN 35
|
||||||
|
#define BATT_ADC_PIN 34
|
||||||
|
#define UP_BTN_MASK GPIO_SEL_35
|
||||||
|
#define RTC_TYPE 2 //PCF8563
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MENU_BTN_MASK GPIO_SEL_26
|
||||||
|
#define BACK_BTN_MASK GPIO_SEL_25
|
||||||
|
#define DOWN_BTN_MASK GPIO_SEL_4
|
||||||
|
#define ACC_INT_MASK GPIO_SEL_14
|
||||||
|
#define BTN_PIN_MASK MENU_BTN_MASK|BACK_BTN_MASK|UP_BTN_MASK|DOWN_BTN_MASK
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//display
|
||||||
|
#define DISPLAY_WIDTH 200
|
||||||
#define DISPLAY_HEIGHT 200
|
#define DISPLAY_HEIGHT 200
|
||||||
// wifi
|
// wifi
|
||||||
#define WIFI_AP_TIMEOUT 60
|
#define WIFI_AP_TIMEOUT 60
|
||||||
|
@ -29,6 +78,4 @@
|
||||||
#define SOFTWARE_VERSION_PATCH 0
|
#define SOFTWARE_VERSION_PATCH 0
|
||||||
#define HARDWARE_VERSION_MAJOR 1
|
#define HARDWARE_VERSION_MAJOR 1
|
||||||
#define HARDWARE_VERSION_MINOR 0
|
#define HARDWARE_VERSION_MINOR 0
|
||||||
// Versioning
|
|
||||||
#define WATCHY_LIB_VER "1.4.0"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue