From f4282d8d1e6b265e520170a9efaae813c1f0aa2b Mon Sep 17 00:00:00 2001 From: tommasopolonelli Date: Fri, 28 Feb 2025 13:52:14 +0000 Subject: [PATCH 01/23] Setup and dependecies --- tools/install.sh | 44 +++++++++++++++++++++++++++++----- web_app/requirements.txt | 2 -- web_app/requirements_build.txt | 2 ++ 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100755 web_app/requirements_build.txt diff --git a/tools/install.sh b/tools/install.sh index cf97628a..3650e39b 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -3,7 +3,7 @@ ### RTKBASE INSTALLATION SCRIPT ### declare -a detected_gnss declare RTKBASE_USER -APT_TIMEOUT='-o dpkg::lock::timeout=3000' #Timeout on lock file (Could not get lock /var/lib/dpkg/lock-frontend) +APT_TIMEOUT='-o dpkg::lock::timeout=6000' #Timeout on lock file (Could not get lock /var/lib/dpkg/lock-frontend) MODEM_AT_PORT=/dev/ttymodemAT man_help(){ @@ -108,9 +108,13 @@ install_dependencies() { echo 'INSTALLING DEPENDENCIES' echo '################################' apt-get "${APT_TIMEOUT}" update -y || exit 1 + apt-get "${APT_TIMEOUT}" upgrade -y apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-venv python3-dev python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables || exit 1 - apt-get install -y libxml2-dev libxslt-dev || exit 1 # needed for lxml (for pystemd) - #apt-get "${APT_TIMEOUT}" upgrade -y + apt-get "${APT_TIMEOUT}" install -y libxml2-dev libxslt-dev || exit 1 # needed for lxml (for pystemd) + apt-get "${APT_TIMEOUT}" install -y wireless-tools wpasupplicant || exit 1 + apt-get "${APT_TIMEOUT}" clean -y + apt-get "${APT_TIMEOUT}" autoclean -y + apt-get "${APT_TIMEOUT}" autoremove -y } install_gpsd_chrony() { @@ -317,14 +321,36 @@ _add_rtkbase_path_to_environment(){ } rtkbase_requirements(){ + platform=$(uname -m) + if [[ $platform =~ 'riscv64' ]] + then + if command -v rustc &>/dev/null; then + echo "Rust is already installed. Skipping installation." + else + # More dependencies needed for aarch64 as there is no prebuilt wheel on piwheels.org + apt-get "${APT_TIMEOUT}" install -y gcc gcc-riscv64-unknown-elf libc6-dev-riscv64-cross || exit 1 + echo "Installing rustup..." + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + echo "Setting up Rust environment..." + source $HOME/.cargo/env + echo 'source $HOME/.cargo/env' >> ~/.bashrc + echo "Verifying Rust installation..." + + rustc --version + cargo --version + + echo "Rust and rustup installation completed for RISC-V!" + fi + fi echo '################################' echo 'INSTALLING RTKBASE REQUIREMENTS' - echo '################################' + echo 'Platform:' + echo $platform + echo '################################' # create virtual environnement for rtkbase sudo -u "${RTKBASE_USER}" python3 -m venv "${rtkbase_path}"/venv python_venv="${rtkbase_path}"/venv/bin/python - platform=$(uname -m) - if [[ $platform =~ 'aarch64' ]] || [[ $platform =~ 'x86_64' ]] + if [[ $platform =~ 'aarch64' || $platform =~ 'x86_64' || $platform =~ 'riscv64' ]] then # More dependencies needed for aarch64 as there is no prebuilt wheel on piwheels.org apt-get "${APT_TIMEOUT}" install -y libssl-dev libffi-dev || exit 1 @@ -334,6 +360,7 @@ rtkbase_requirements(){ cp "${rtkbase_path}"/tools/udev_rules/*.rules /etc/udev/rules.d/ udevadm control --reload && udevadm trigger # Copying polkitd rules and add rtkbase group + echo '################################ 1' "${rtkbase_path}"/tools/install_polkit_rules.sh "${RTKBASE_USER}" #Copying settings.conf.default as settings.conf if [[ ! -f "${rtkbase_path}/settings.conf" ]] @@ -341,8 +368,10 @@ rtkbase_requirements(){ cp "${rtkbase_path}/settings.conf.default" "${rtkbase_path}/settings.conf" fi #Then launch check cpu temp script for OPI zero LTS + echo '################################ 2' source "${rtkbase_path}/tools/opizero_temp_offset.sh" #venv module installation + echo '################################ 3' sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install --upgrade pip setuptools wheel --extra-index-url https://www.piwheels.org/simple # install prebuilt wheel for cryptography because it is unavailable on piwheels (2023/01) # not needed anymore (2023/11) @@ -353,12 +382,15 @@ rtkbase_requirements(){ # then # sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install "${rtkbase_path}"/tools/wheel/cryptography-38.0.0-cp37-cp37m-linux_armv6l.whl #fi + echo '################################ 4' sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install -r "${rtkbase_path}"/web_app/requirements.txt --extra-index-url https://www.piwheels.org/simple #when we will be able to launch the web server without root, we will use #sudo -u $(logname) python3 -m pip install -r requirements.txt --user. #Installing requirements for Cellular modem. Installing them during the Armbian firstrun doesn't work because the network isn't fully up. + echo '################################ 5' sudo -u "${RTKBASE_USER}" "${rtkbase_path}/venv/bin/python" -m pip install nmcli --extra-index-url https://www.piwheels.org/simple + echo '################################ 6' sudo -u "${RTKBASE_USER}" "${rtkbase_path}/venv/bin/python" -m pip install git+https://github.com/Stefal/sim-modem.git } diff --git a/web_app/requirements.txt b/web_app/requirements.txt index ac559b3d..68644700 100644 --- a/web_app/requirements.txt +++ b/web_app/requirements.txt @@ -2,10 +2,8 @@ bidict==0.22.1 blinker==1.6.3 Bootstrap-Flask==2.4.0 certifi==2024.2.2 -cffi==1.16.0 charset-normalizer==3.3.2 click==8.1.7 -cryptography==42.0.7 distro==1.8.0 dnspython==2.6.1 Flask==3.0.3 diff --git a/web_app/requirements_build.txt b/web_app/requirements_build.txt new file mode 100755 index 00000000..7f8c48c1 --- /dev/null +++ b/web_app/requirements_build.txt @@ -0,0 +1,2 @@ +cryptography==42.0.7 +cffi==1.16.0 \ No newline at end of file From 8c72c5be0424c56f041ff061003983f0b17456b5 Mon Sep 17 00:00:00 2001 From: topolonelli Date: Sat, 1 Mar 2025 17:01:01 +0000 Subject: [PATCH 02/23] Install requirements local build --- tools/install.sh | 12 +++++++++--- tools/swap.sh | 34 ++++++++++++++++++++++++++++++++++ web_app/requirements.txt | 3 --- web_app/requirements_build.txt | 5 ++++- 4 files changed, 47 insertions(+), 7 deletions(-) create mode 100755 tools/swap.sh diff --git a/tools/install.sh b/tools/install.sh index 3650e39b..5443a761 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -109,12 +109,18 @@ install_dependencies() { echo '################################' apt-get "${APT_TIMEOUT}" update -y || exit 1 apt-get "${APT_TIMEOUT}" upgrade -y - apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-venv python3-dev python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables || exit 1 + apt-get "${APT_TIMEOUT}" install -y python3.12 python3.12-dev python3.12-venv || exit 1 + apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables wget curl || exit 1 apt-get "${APT_TIMEOUT}" install -y libxml2-dev libxslt-dev || exit 1 # needed for lxml (for pystemd) apt-get "${APT_TIMEOUT}" install -y wireless-tools wpasupplicant || exit 1 apt-get "${APT_TIMEOUT}" clean -y apt-get "${APT_TIMEOUT}" autoclean -y apt-get "${APT_TIMEOUT}" autoremove -y + sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 2 + sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.12 2 + sudo update-alternatives --set python /usr/bin/python3.12 + sudo update-alternatives --set python3 /usr/bin/python3.12 + python3 --version } install_gpsd_chrony() { @@ -316,8 +322,8 @@ _add_rtkbase_path_to_environment(){ echo "rtkbase_path=$(pwd)/rtkbase" >> /etc/environment fi fi - rtkbase_path=$(pwd)/rtkbase - export rtkbase_path + + } rtkbase_requirements(){ diff --git a/tools/swap.sh b/tools/swap.sh new file mode 100755 index 00000000..aaf9d93c --- /dev/null +++ b/tools/swap.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +# Ensure script is run as root +if [[ $EUID -ne 0 ]]; then + echo "Please run this script as root or with sudo." + exit 1 +fi + +# Check if swap is already enabled +if swapon --show | grep -q 'partition\|file'; then + echo "Swap is already enabled. Exiting script." + exit 0 +fi + +# Define swap file size and location +SWAPFILE=/swapfile +SWAPSIZE=1G + +# Create the swap file with the specified size +sudo fallocate -l $SWAPSIZE $SWAPFILE + +# Set the correct permissions +sudo chmod 600 $SWAPFILE + +# Set up the swap area +sudo mkswap $SWAPFILE + +# Enable the swap file +sudo swapon $SWAPFILE + +# Make the swap file permanent by adding it to /etc/fstab +echo "$SWAPFILE none swap sw 0 0" | sudo tee -a /etc/fstab + +echo "Swap file of size $SWAPSIZE created and enabled successfully." diff --git a/web_app/requirements.txt b/web_app/requirements.txt index 68644700..eeafcfb9 100644 --- a/web_app/requirements.txt +++ b/web_app/requirements.txt @@ -10,13 +10,11 @@ Flask==3.0.3 Flask-Login==0.6.3 Flask-SocketIO==5.3.6 Flask-WTF==1.2.1 -gevent==24.2.1 gunicorn==22.0.0 h11==0.14.0 idna==3.7 itsdangerous==2.1.2 Jinja2==3.1.4 -lxml==4.9.3 MarkupSafe==2.1.3 nmcli==1.3.0 pexpect==4.8.0 @@ -25,7 +23,6 @@ ptyprocess==0.7.0 pycparser==2.21 pyOpenSSL==24.1.0 pyserial==3.5 -pystemd==0.13.2 python-engineio==4.8.0 python-socketio==5.10.0 requests==2.32.3 diff --git a/web_app/requirements_build.txt b/web_app/requirements_build.txt index 7f8c48c1..a4c6ac9d 100755 --- a/web_app/requirements_build.txt +++ b/web_app/requirements_build.txt @@ -1,2 +1,5 @@ cryptography==42.0.7 -cffi==1.16.0 \ No newline at end of file +cffi==1.16.0 +gevent==24.2.1 +lxml==4.9.3 +pystemd==0.13.2 \ No newline at end of file From fae8ffb5153bb29e519c7ad3441a47ce1ebdff96 Mon Sep 17 00:00:00 2001 From: tommasopolonelli Date: Sat, 1 Mar 2025 18:18:15 +0100 Subject: [PATCH 03/23] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f50f545a..06cf74bf 100644 --- a/README.md +++ b/README.md @@ -337,7 +337,7 @@ A gnss receiver with a timepulse output is a very accurate [stratum 0](https://e ``` ## Requirements: Debian base distro >= 11 (Bullseye) -Python >= 3.8 +Python >= 3.8 <=3.12 ## History: See the [changelog](./CHANGELOG.md) From efb1aebaaaefef34069ee3a585f490b3e1c49277 Mon Sep 17 00:00:00 2001 From: topolonelli Date: Wed, 5 Mar 2025 21:29:47 +0000 Subject: [PATCH 04/23] fixed install dependecies sudo rtkbase_riscv/tools/install.sh -u debian -q --- tools/install.sh | 54 ++++++++-------------------------- web_app/requirements.txt | 1 - web_app/requirements_build.txt | 7 +++-- 3 files changed, 17 insertions(+), 45 deletions(-) diff --git a/tools/install.sh b/tools/install.sh index 5443a761..52a8e75a 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -109,17 +109,17 @@ install_dependencies() { echo '################################' apt-get "${APT_TIMEOUT}" update -y || exit 1 apt-get "${APT_TIMEOUT}" upgrade -y - apt-get "${APT_TIMEOUT}" install -y python3.12 python3.12-dev python3.12-venv || exit 1 + #apt-get "${APT_TIMEOUT}" install -y python3.12 python3.12-dev python3.12-venv || exit 1 apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables wget curl || exit 1 - apt-get "${APT_TIMEOUT}" install -y libxml2-dev libxslt-dev || exit 1 # needed for lxml (for pystemd) + apt-get "${APT_TIMEOUT}" install -y libxml2-dev libxslt-dev libc6 || exit 1 # needed for lxml (for pystemd) apt-get "${APT_TIMEOUT}" install -y wireless-tools wpasupplicant || exit 1 apt-get "${APT_TIMEOUT}" clean -y apt-get "${APT_TIMEOUT}" autoclean -y apt-get "${APT_TIMEOUT}" autoremove -y - sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 2 - sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.12 2 - sudo update-alternatives --set python /usr/bin/python3.12 - sudo update-alternatives --set python3 /usr/bin/python3.12 + #sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 2 + #sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.12 2 + #sudo update-alternatives --set python /usr/bin/python3.12 + #sudo update-alternatives --set python3 /usr/bin/python3.12 python3 --version } @@ -215,9 +215,9 @@ _compil_rtklib() { _rtkbase_repo(){ #Get rtkbase repository if [[ -n "${1}" ]]; then - sudo -u "${RTKBASE_USER}" git clone --branch "${1}" --single-branch https://github.com/stefal/rtkbase.git + sudo -u "${RTKBASE_USER}" git clone --branch "${1}" --single-branch https://github.com/tommasopolonelli/rtkbase_riscv.git else - sudo -u "${RTKBASE_USER}" git clone https://github.com/stefal/rtkbase.git + sudo -u "${RTKBASE_USER}" git clone https://github.com/tommasopolonelli/rtkbase_riscv.git fi _add_rtkbase_path_to_environment @@ -328,33 +328,15 @@ _add_rtkbase_path_to_environment(){ rtkbase_requirements(){ platform=$(uname -m) - if [[ $platform =~ 'riscv64' ]] - then - if command -v rustc &>/dev/null; then - echo "Rust is already installed. Skipping installation." - else - # More dependencies needed for aarch64 as there is no prebuilt wheel on piwheels.org - apt-get "${APT_TIMEOUT}" install -y gcc gcc-riscv64-unknown-elf libc6-dev-riscv64-cross || exit 1 - echo "Installing rustup..." - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y - echo "Setting up Rust environment..." - source $HOME/.cargo/env - echo 'source $HOME/.cargo/env' >> ~/.bashrc - echo "Verifying Rust installation..." - - rustc --version - cargo --version - - echo "Rust and rustup installation completed for RISC-V!" - fi - fi echo '################################' echo 'INSTALLING RTKBASE REQUIREMENTS' echo 'Platform:' echo $platform echo '################################' + # install system python pre-built packages + apt-get "${APT_TIMEOUT}" install -y python3-lxml python3-pystemd python3-cryptography python3-cffi python3-gevent || exit 1 # create virtual environnement for rtkbase - sudo -u "${RTKBASE_USER}" python3 -m venv "${rtkbase_path}"/venv + sudo -u "${RTKBASE_USER}" python3 -m venv --system-site-packages "${rtkbase_path}"/venv python_venv="${rtkbase_path}"/venv/bin/python if [[ $platform =~ 'aarch64' || $platform =~ 'x86_64' || $platform =~ 'riscv64' ]] then @@ -379,19 +361,9 @@ rtkbase_requirements(){ #venv module installation echo '################################ 3' sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install --upgrade pip setuptools wheel --extra-index-url https://www.piwheels.org/simple - # install prebuilt wheel for cryptography because it is unavailable on piwheels (2023/01) - # not needed anymore (2023/11) - #if [[ $platform == 'armv7l' ]] && [[ $("${python_venv}" --version) =~ '3.7' ]] - # then - # sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install "${rtkbase_path}"/tools/wheel/cryptography-38.0.0-cp37-cp37m-linux_armv7l.whl - #elif [[ $platform == 'armv6l' ]] && [[ $("${python_venv}" --version) =~ '3.7' ]] - # then - # sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install "${rtkbase_path}"/tools/wheel/cryptography-38.0.0-cp37-cp37m-linux_armv6l.whl - #fi + echo '################################ 4' sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install -r "${rtkbase_path}"/web_app/requirements.txt --extra-index-url https://www.piwheels.org/simple - #when we will be able to launch the web server without root, we will use - #sudo -u $(logname) python3 -m pip install -r requirements.txt --user. #Installing requirements for Cellular modem. Installing them during the Armbian firstrun doesn't work because the network isn't fully up. echo '################################ 5' @@ -742,7 +714,7 @@ main() { then source /etc/environment else - export rtkbase_path='rtkbase' + export rtkbase_path='rtkbase_riscv' fi fi diff --git a/web_app/requirements.txt b/web_app/requirements.txt index eeafcfb9..20129dbf 100644 --- a/web_app/requirements.txt +++ b/web_app/requirements.txt @@ -21,7 +21,6 @@ pexpect==4.8.0 psutil==5.9.6 ptyprocess==0.7.0 pycparser==2.21 -pyOpenSSL==24.1.0 pyserial==3.5 python-engineio==4.8.0 python-socketio==5.10.0 diff --git a/web_app/requirements_build.txt b/web_app/requirements_build.txt index a4c6ac9d..5dde2a9f 100755 --- a/web_app/requirements_build.txt +++ b/web_app/requirements_build.txt @@ -1,5 +1,6 @@ cryptography==42.0.7 cffi==1.16.0 -gevent==24.2.1 -lxml==4.9.3 -pystemd==0.13.2 \ No newline at end of file +gevent==24.2.1 #compilato con pip download +lxml==4.9.3 #ancora no +pystemd==0.13.2 #ancora no +pyOpenSSL==24.1.0 \ No newline at end of file From 5d0614c8b72c982abcd265743633de194e9d9897 Mon Sep 17 00:00:00 2001 From: topolonelli Date: Tue, 11 Mar 2025 20:05:49 +0000 Subject: [PATCH 05/23] Success run on MilkV Duo - geventmp installed - removed monkey-patch.all --- web_app/requirements_riscv.txt | 63 ++++++++++++++++++++++++++++++++++ web_app/server.py | 2 +- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 web_app/requirements_riscv.txt diff --git a/web_app/requirements_riscv.txt b/web_app/requirements_riscv.txt new file mode 100644 index 00000000..6a1b935e --- /dev/null +++ b/web_app/requirements_riscv.txt @@ -0,0 +1,63 @@ +autocommand==2.2.2 +bcrypt==4.2.0 +beautifulsoup4==4.13.3 +bidict==0.22.1 +blinker==1.6.3 +Bootstrap-Flask==2.4.0 +certifi==2024.2.2 +cffi==1.17.1 +chardet==5.2.0 +charset-normalizer==3.3.2 +click==8.1.7 +cryptography==43.0.0 +cssselect==1.2.0 +distro==1.8.0 +dnspython==2.6.1 +Flask==3.0.3 +Flask-Login==0.6.3 +Flask-SocketIO==5.3.6 +Flask-WTF==1.2.1 +gevent==24.11.1 +geventmp==0.0.9 +greenlet==3.1.1 +gunicorn==22.0.0 +h11==0.14.0 +html5lib-modern==1.2 +idna==3.7 +inflect==7.3.1 +itsdangerous==2.1.2 +jaraco.context==6.0.0 +jaraco.functools==4.1.0 +jaraco.text==4.0.0 +Jinja2==3.1.4 +lxml==5.3.1 +MarkupSafe==2.1.3 +more-itertools==10.6.0 +nmcli==1.3.0 +packaging==24.2 +pexpect==4.8.0 +ply==3.11 +psutil==5.9.6 +ptyprocess==0.7.0 +pycparser==2.21 +pyserial==3.5 +pystemd==0.13.2 +python-engineio==4.8.0 +python-socketio==5.10.0 +requests==2.32.3 +setuptools==75.8.2 +sim-modem @ git+https://github.com/Stefal/sim-modem.git@bd2416794f446d1be92ec425d18a87622a04a2b6 +simple-websocket==1.0.0 +six==1.16.0 +soupsieve==2.6 +typeguard==4.4.2 +typing_extensions==4.12.2 +urllib3==2.0.7 +webencodings==0.5.1 +Werkzeug==3.0.3 +wheel==0.45.1 +wsproto==1.2.0 +WTForms==3.1.0 +zipp==3.21.0 +zope.event==5.0 +zope.interface==7.2 diff --git a/web_app/server.py b/web_app/server.py index 74b6b2a1..915f7bd7 100755 --- a/web_app/server.py +++ b/web_app/server.py @@ -29,7 +29,7 @@ # along with ReachView. If not, see . from gevent import monkey -monkey.patch_all() +#monkey.patch_all() import time import json From 60ba1debd93825d0bbf654ea0b226cb6c952964a Mon Sep 17 00:00:00 2001 From: topolonelli Date: Tue, 11 Mar 2025 20:26:52 +0000 Subject: [PATCH 06/23] Default config to run stably --- settings.conf.default | 2 +- unit/rtkbase_web.service | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/settings.conf.default b/settings.conf.default index 99b709c3..d97503f1 100644 --- a/settings.conf.default +++ b/settings.conf.default @@ -31,7 +31,7 @@ cpu_temp_offset=0 #base coordinates: lat long height position='47.0983869 -1.2655108 36.40' #gnss receiver com port -com_port='' +com_port='ttyS0' #gnss receiver com port settings com_port_settings='38400:8:n:1' #receiver model diff --git a/unit/rtkbase_web.service b/unit/rtkbase_web.service index 09f0c6ac..83c877ca 100644 --- a/unit/rtkbase_web.service +++ b/unit/rtkbase_web.service @@ -5,7 +5,7 @@ Description=RTKBase Web Server [Service] User=root -ExecStart={python_path} {script_path}/web_app/server.py +ExecStart={python_path} {script_path}/web_app/server.py --debug Restart=on-failure RestartSec=30 #ProtectHome=read-only From 504fe7e29fd7a96ca64b6b99716643b2ea2ed3b3 Mon Sep 17 00:00:00 2001 From: topolonelli Date: Mon, 17 Mar 2025 16:03:09 +0000 Subject: [PATCH 07/23] E2E test with UBlox F9P and NTRIP - CPU temp and Uptime still not functional --- settings.conf.default | 2 +- tools/install.sh | 22 ++++++++++++++++------ web_app/network_infos.py | 2 +- web_app/server.py | 3 ++- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/settings.conf.default b/settings.conf.default index d97503f1..8146193c 100644 --- a/settings.conf.default +++ b/settings.conf.default @@ -31,7 +31,7 @@ cpu_temp_offset=0 #base coordinates: lat long height position='47.0983869 -1.2655108 36.40' #gnss receiver com port -com_port='ttyS0' +com_port='ttyS1' #gnss receiver com port settings com_port_settings='38400:8:n:1' #receiver model diff --git a/tools/install.sh b/tools/install.sh index 52a8e75a..03932e32 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -104,23 +104,33 @@ _check_user() { } install_dependencies() { + + # Run swap.sh + echo '################################' + echo 'CONFIGURING SWAP' + echo '################################' + "${rtkbase_path}"/tools/swap.sh + echo '################################' echo 'INSTALLING DEPENDENCIES' echo '################################' apt-get "${APT_TIMEOUT}" update -y || exit 1 apt-get "${APT_TIMEOUT}" upgrade -y - #apt-get "${APT_TIMEOUT}" install -y python3.12 python3.12-dev python3.12-venv || exit 1 - apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables wget curl || exit 1 + apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables wget curl lrzsz || exit 1 apt-get "${APT_TIMEOUT}" install -y libxml2-dev libxslt-dev libc6 || exit 1 # needed for lxml (for pystemd) apt-get "${APT_TIMEOUT}" install -y wireless-tools wpasupplicant || exit 1 apt-get "${APT_TIMEOUT}" clean -y apt-get "${APT_TIMEOUT}" autoclean -y apt-get "${APT_TIMEOUT}" autoremove -y - #sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 2 - #sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.12 2 - #sudo update-alternatives --set python /usr/bin/python3.12 - #sudo update-alternatives --set python3 /usr/bin/python3.12 python3 --version + + #enable Debian terminal via ttyS0 + echo '################################' + echo 'CONFIGURING TERMINAL VIA ttyS0' + echo '################################' + systemctl enable serial-getty@ttyS0.service + systemctl start serial-getty@ttyS0.service + } install_gpsd_chrony() { diff --git a/web_app/network_infos.py b/web_app/network_infos.py index c2840da8..fce09f57 100644 --- a/web_app/network_infos.py +++ b/web_app/network_infos.py @@ -44,7 +44,7 @@ def get_up_if(): if_stats.pop('lo') log.debug(if_stats) if_stats = {k:v for (k,v) in if_stats.items() if if_stats[k].isup} # keep only up interface - if_stats = {k:v for (k,v) in if_stats.items() if if_stats[k].speed > 0 or 'pointopoint' in if_stats[k].flags} # keep only interface with speed > 0 + #if_stats = {k:v for (k,v) in if_stats.items() if if_stats[k].speed > 0 or 'pointopoint' in if_stats[k].flags} # keep only interface with speed > 0 if_stats = {k:v for (k,v) in if_stats.items() if not k.startswith('docker')} # remove docker interface return if_stats diff --git a/web_app/server.py b/web_app/server.py index 915f7bd7..925a7bdf 100755 --- a/web_app/server.py +++ b/web_app/server.py @@ -197,6 +197,7 @@ def manager(): "volume_total" : round(volume_usage.total / 10E8, 2), "volume_percent_used" : volume_usage.percent, "network_infos" : interfaces_infos} + print(sys_infos) socketio.emit("sys_informations", json.dumps(sys_infos), namespace="/test") if rtk.sleep_count > rtkcv_standby_delay and rtk.state != "inactive" or \ @@ -245,7 +246,7 @@ def old_get_cpu_temp(): def get_cpu_temp(): try: temps = psutil.sensors_temperatures() - current_cpu_temp = round(temps.get('cpu_thermal')[0].current, 1) + current_cpu_temp = round(temps.get('soc_thermal_0')[0].current, 1) except: current_cpu_temp = 0 return current_cpu_temp From d7a82ad577342ad9247eb2eea06125d6deb3b3c1 Mon Sep 17 00:00:00 2001 From: tommasopolonelli Date: Mon, 24 Mar 2025 20:35:26 +0100 Subject: [PATCH 08/23] Update install.sh --- tools/install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/install.sh b/tools/install.sh index 03932e32..66eecbb7 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -344,6 +344,7 @@ rtkbase_requirements(){ echo $platform echo '################################' # install system python pre-built packages + apt-get "${APT_TIMEOUT}" install -y python3.13-venv apt-get "${APT_TIMEOUT}" install -y python3-lxml python3-pystemd python3-cryptography python3-cffi python3-gevent || exit 1 # create virtual environnement for rtkbase sudo -u "${RTKBASE_USER}" python3 -m venv --system-site-packages "${rtkbase_path}"/venv From 060ec5476369d0bb67d2f27344abc05c432849d5 Mon Sep 17 00:00:00 2001 From: tommasopolonelli Date: Mon, 24 Mar 2025 21:27:02 +0100 Subject: [PATCH 09/23] Update rtkbase_web.service --- unit/rtkbase_web.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit/rtkbase_web.service b/unit/rtkbase_web.service index 83c877ca..f0c5b7df 100644 --- a/unit/rtkbase_web.service +++ b/unit/rtkbase_web.service @@ -5,7 +5,7 @@ Description=RTKBase Web Server [Service] User=root -ExecStart={python_path} {script_path}/web_app/server.py --debug +ExecStart=/home/debian/{python_path} {script_path}/web_app/server.py --debug Restart=on-failure RestartSec=30 #ProtectHome=read-only From 178b59a0c6187678518dbb01d5f6421a8a65248a Mon Sep 17 00:00:00 2001 From: topolonelli Date: Sun, 30 Mar 2025 16:43:22 +0000 Subject: [PATCH 10/23] CPU Temp --- web_app/server.py | 77 ++++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/web_app/server.py b/web_app/server.py index 925a7bdf..6913dc57 100755 --- a/web_app/server.py +++ b/web_app/server.py @@ -47,12 +47,6 @@ from RTKBaseConfigManager import RTKBaseConfigManager import network_infos -#print("Installing all required packages") -#provisioner.provision_reach() - -#import reach_bluetooth.bluetoothctl -#import reach_bluetooth.tcp_bridge - from flask_bootstrap import Bootstrap4 from flask import Flask, render_template, session, request, flash, url_for from flask import send_from_directory, redirect, abort @@ -73,6 +67,10 @@ from werkzeug.utils import safe_join import gunicorn.app.base +#Delay before rtkrcv will stop if no user is on status.html page +rtkcv_standby_delay = 600 +connected_clients = 0 + app = Flask(__name__) app.debug = False app.config["SECRET_KEY"] = "secret!" @@ -111,10 +109,6 @@ {'service_unit' : 'rtkbase_gnss_web_proxy.service', "name": "RTKBase Reverse Proxy for Gnss receiver Web Server"} ] -#Delay before rtkrcv will stop if no user is on status.html page -rtkcv_standby_delay = 600 -connected_clients = 0 - class StandaloneApplication(gunicorn.app.base.BaseApplication): def __init__(self, app, options=None): self.options = options or {} @@ -158,47 +152,58 @@ def update_password(config_object): config_object.update_setting("general", "web_password_hash", generate_password_hash(new_password)) config_object.update_setting("general", "new_web_password", "") + +def update_sys_informations(): + + if not hasattr(update_sys_informations, "max_cpu_temp"): + update_sys_informations.max_cpu_temp = 0 # it doesn't exist yet, so initialize it + + cpu_temp_offset = int(rtkbaseconfig.get("general", "cpu_temp_offset")) + + cpu_temp = get_cpu_temp() + cpu_temp_offset + update_sys_informations.max_cpu_temp = max(cpu_temp, update_sys_informations.max_cpu_temp) + + try: + interfaces_infos = network_infos.get_interfaces_infos() + except Exception: + # network-manager not installed ? + interfaces_infos = None + + volume_usage = get_volume_usage() + sys_infos = {"cpu_temp" : cpu_temp, + "max_cpu_temp" : update_sys_informations.max_cpu_temp, + "uptime" : get_uptime(), + "volume_free" : round(volume_usage.free / 10E8, 2), + "volume_used" : round(volume_usage.used / 10E8, 2), + "volume_total" : round(volume_usage.total / 10E8, 2), + "volume_percent_used" : volume_usage.percent, + "network_infos" : interfaces_infos} + + return sys_infos + def manager(): """ This manager runs inside a separate thread It checks how long rtkrcv is running since the last user leaves the status web page, and stop rtkrcv when sleep_count reaches rtkrcv_standby delay And it sends various system informations to the web interface """ - max_cpu_temp = 0 - cpu_temp_offset = int(rtkbaseconfig.get("general", "cpu_temp_offset")) services_status = getServicesStatus(emit_pingback=False) main_service = {} while True: - # Make sure max_cpu_temp is always updated - cpu_temp = get_cpu_temp() + cpu_temp_offset - max_cpu_temp = max(cpu_temp, max_cpu_temp) if connected_clients > 0: + # We only need to emit to the socket if there are clients able to receive it. updated_services_status = getServicesStatus(emit_pingback=False) main_service = updated_services_status[0] if services_status != updated_services_status: services_status = updated_services_status socketio.emit("services status", json.dumps(services_status), namespace="/test") - #print("service status", services_status) - - try: - interfaces_infos = network_infos.get_interfaces_infos() - except Exception: - # network-manager not installed ? - interfaces_infos = None - - volume_usage = get_volume_usage() - sys_infos = {"cpu_temp" : cpu_temp, - "max_cpu_temp" : max_cpu_temp, - "uptime" : get_uptime(), - "volume_free" : round(volume_usage.free / 10E8, 2), - "volume_used" : round(volume_usage.used / 10E8, 2), - "volume_total" : round(volume_usage.total / 10E8, 2), - "volume_percent_used" : volume_usage.percent, - "network_infos" : interfaces_infos} - print(sys_infos) - socketio.emit("sys_informations", json.dumps(sys_infos), namespace="/test") + print("service status", services_status) + + # Make sure max_cpu_temp is always updated + sys_infos = update_sys_informations() + socketio.emit("sys_informations", json.dumps(sys_infos), namespace="/test") if rtk.sleep_count > rtkcv_standby_delay and rtk.state != "inactive" or \ main_service.get("active") == False and rtk.state != "inactive": @@ -557,11 +562,13 @@ def clientConnect(): rtkbaseconfig.write_file() socketio.emit("update_successful", json.dumps({"result": 'true'}), namespace="/test") rtk.sendState() + sys_infos = update_sys_informations() + socketio.emit("sys_informations", json.dumps(sys_infos), namespace="/test") @socketio.on("disconnect", namespace="/test") def clientDisconnect(): global connected_clients - connected_clients -=1 + connected_clients -= 1 print("Browser client disconnected") #### Log list handling ### From 74bbd8eae29b59e06b986db161dda004b8d73c5f Mon Sep 17 00:00:00 2001 From: topolonelli Date: Wed, 2 Apr 2025 20:19:55 +0000 Subject: [PATCH 11/23] Test UM980 --- receiver_cfg/Unicore_UM980_rtcm3.cfg | 2 +- tools/install.sh | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/receiver_cfg/Unicore_UM980_rtcm3.cfg b/receiver_cfg/Unicore_UM980_rtcm3.cfg index cf8247c7..bd9d620b 100644 --- a/receiver_cfg/Unicore_UM980_rtcm3.cfg +++ b/receiver_cfg/Unicore_UM980_rtcm3.cfg @@ -1,6 +1,6 @@ # Config file for using a Unicore UM980 with RTKBase (RTCM3) # SIGNALGROUP will reset the device -CONFIG SIGNALGROUP 2 +# CONFIG SIGNALGROUP 2 CONFIG SBAS ENABLE AUTO MODE BASE 1 TIME 60 1 rtcm1019 1 diff --git a/tools/install.sh b/tools/install.sh index 66eecbb7..da5c6ec0 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -455,7 +455,7 @@ detect_gnss() { detected_gnss[2]=$port_speed #echo 'U-blox ZED-F9P DETECTED ON '$port $port_speed break - elif { model=$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/$port --baudrate $port_speed --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;}; then + elif { model=$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/$port --baudrate $port_speed --retry 2 --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;}; then detected_gnss[0]=$port detected_gnss[1]='unicore' detected_gnss[2]=$port_speed @@ -589,10 +589,10 @@ configure_gnss(){ return $? fi - elif { model=$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;} + elif { model=$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --retry 2 --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;} then #get UM98x firmware release - firmware="$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command get_firmware 2>/dev/null)" || firmware='?' + firmware="$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --retry 2 --command get_firmware 2>/dev/null)" || firmware='?' echo 'Unicore-' "${model}" 'Firmware: ' "${firmware}" sudo -u "${RTKBASE_USER}" sed -i s/^receiver_firmware=.*/receiver_firmware=\'${firmware}\'/ "${rtkbase_path}"/settings.conf #configure the UM980/UM982 for RTKBase @@ -600,7 +600,7 @@ configure_gnss(){ python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command reset --retry 5 sleep_time=10 ; echo 'Waiting '$sleep_time's for ' "${model}" ' reboot' ; sleep $sleep_time echo 'Sending settings....' - python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Unicore_"${model}"_rtcm3.cfg --store --retry 2 + python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Unicore_"${model}"_rtcm3.cfg --store if [[ $? -eq 0 ]] then echo 'Unicore UM980 successfuly configured' From fc4a00e31d86f085ef7da8e06b0e78ee23d7ee40 Mon Sep 17 00:00:00 2001 From: topolonelli Date: Mon, 7 Apr 2025 08:55:58 +0000 Subject: [PATCH 12/23] Satellite test Unicore UM980 - via UART0 --- duo-pinmux/duos/Makefile | 15 ++ duo-pinmux/duos/devmem.c | 105 +++++++++ duo-pinmux/duos/devmem.h | 12 + duo-pinmux/duos/duo-pinmux | Bin 0 -> 31432 bytes duo-pinmux/duos/duo_pinmux.c | 201 ++++++++++++++++ duo-pinmux/duos/func.h | 329 +++++++++++++++++++++++++++ receiver_cfg/Unicore_UM980_rtcm3.cfg | 33 ++- tools/install.sh | 2 +- unit/rtkbase_web.service | 2 +- 9 files changed, 685 insertions(+), 14 deletions(-) create mode 100644 duo-pinmux/duos/Makefile create mode 100644 duo-pinmux/duos/devmem.c create mode 100644 duo-pinmux/duos/devmem.h create mode 100755 duo-pinmux/duos/duo-pinmux create mode 100644 duo-pinmux/duos/duo_pinmux.c create mode 100644 duo-pinmux/duos/func.h diff --git a/duo-pinmux/duos/Makefile b/duo-pinmux/duos/Makefile new file mode 100644 index 00000000..8a4d64c0 --- /dev/null +++ b/duo-pinmux/duos/Makefile @@ -0,0 +1,15 @@ +CC = riscv64-unknown-linux-musl-gcc + +source = duo_pinmux.c devmem.c +object = $(source:%.cc=%.o) + +CFLAGS += -mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d -static + +all: $(object) + $(CC) $(CFLAGS) $(object) -o duo-pinmux + +%.o: %.c + $(CC) $(CFLAGS) -c $< + +clean: + $(RM) *.o duo-pinmux diff --git a/duo-pinmux/duos/devmem.c b/duo-pinmux/duos/devmem.c new file mode 100644 index 00000000..2e37710c --- /dev/null +++ b/duo-pinmux/duos/devmem.c @@ -0,0 +1,105 @@ +/* + ** read/write phy addr in userspace + ** open /dev/mem + ** taiqiang.cao@bitmain.com + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "devmem.h" + +// DEBUG_SET_LEVEL(DEBUG_LEVEL_ERR); +#define ERR printf +#define DEBUG printf + +static int devmem_fd; + +void *devm_map(unsigned long addr, int len) +{ + off_t offset; + void *map_base; + + devmem_fd = open("/dev/mem", O_RDWR | O_SYNC); + if (devmem_fd == -1) { + ERR("cannot open '/dev/mem'\n"); + goto open_err; + } + // DEBUG("/dev/mem opened.\n"); + + offset = addr & ~(sysconf(_SC_PAGE_SIZE) - 1); + + map_base = mmap(NULL, len + addr - offset, PROT_READ | PROT_WRITE, MAP_SHARED, devmem_fd, offset); + if (map_base == MAP_FAILED) { + ERR("mmap failed\n"); + goto mmap_err; + } + + // DEBUG("Memory mapped at address %p.\n", map_base + addr - offset); + + return map_base + addr - offset; + +mmap_err: + close(devmem_fd); + +open_err: + return NULL; +} + +void devm_unmap(void *virt_addr, int len) +{ + unsigned long addr; + + if (devmem_fd == -1) { + ERR("'/dev/mem' is closed\n"); + return; + } + + /* page align */ + addr = (((unsigned long)virt_addr) & ~(sysconf(_SC_PAGE_SIZE) - 1)); + munmap((void *)addr, len + (unsigned long)virt_addr - addr); + close(devmem_fd); +} + +/* read/write 32bit data*/ +uint32_t devmem_readl(unsigned long addr) +{ + uint32_t val; + void *virt_addr; + + virt_addr = devm_map(addr, 4); + if (virt_addr == NULL) { + ERR("readl addr map failed\n"); + return 0; + } + + val = *(uint32_t *)virt_addr; + + devm_unmap(virt_addr, 4); + + return val; +} + +void devmem_writel(unsigned long addr, uint32_t val) +{ + void *virt_addr; + + virt_addr = devm_map(addr, 4); + if (virt_addr == NULL) { + ERR("writel addr map failed\n"); + return; + } + + *(uint32_t *)virt_addr = val; + + devm_unmap(virt_addr, 4); +} diff --git a/duo-pinmux/duos/devmem.h b/duo-pinmux/duos/devmem.h new file mode 100644 index 00000000..79fd8f9f --- /dev/null +++ b/duo-pinmux/duos/devmem.h @@ -0,0 +1,12 @@ +#ifndef _DEVMEM_H_ +#define _DEVMEM_H_ + +#include + +void *devm_map(unsigned long addr, int len); +void devm_unmap(void *virt_addr, int len); + +uint32_t devmem_readl(unsigned long addr); +void devmem_writel(unsigned long addr, uint32_t val); + +#endif diff --git a/duo-pinmux/duos/duo-pinmux b/duo-pinmux/duos/duo-pinmux new file mode 100755 index 0000000000000000000000000000000000000000..d1a6f1fdc1016bb47a48ae05bc7e9f06e077b5b0 GIT binary patch literal 31432 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 literal 0 HcmV?d00001 diff --git a/duo-pinmux/duos/duo_pinmux.c b/duo-pinmux/duos/duo_pinmux.c new file mode 100644 index 00000000..54d9dded --- /dev/null +++ b/duo-pinmux/duos/duo_pinmux.c @@ -0,0 +1,201 @@ +#include "devmem.h" +#include "func.h" +#include +#include +#include +#include +#include + +#define NELEMS(x) (sizeof(x) / sizeof((x)[0])) +#define PINMUX_BASE 0x03001000 +#define INVALID_PIN 9999 + +struct pinlist { + char name[32]; + uint32_t offset; +} pinlist_st; + +struct pinlist cv181x_pin[] = { + { "A16", 0x40 }, // UART0_TX + { "A17", 0x44 }, // UART0_RX + { "A19", 0x64 }, // JTAG_CPU_TMS + { "A18", 0x68 }, // JTAG_CPU_TCK + { "A20", 0x6c }, // JTAG_CPU_TRST + { "A28", 0x70 }, // IIC0_SCL + { "A29", 0x74 }, // IIC0_SDA + { "E0", 0xa4 }, // PWR_GPIO0 + { "E1", 0xa8 }, // PWR_GPIO1 + { "E2", 0xac }, // PWR_GPIO2 + { "B1", 0xf0 }, // ADC3 + { "B2", 0xf4 }, // ADC2 + { "B3", 0xf8 }, // ADC1 + { "B11", 0x134 }, // VIVO_D10 + { "B12", 0x138 }, // VIVO_D9 + { "B13", 0x13c }, // VIVO_D8 + { "B14", 0x140 }, // VIVO_D7 + { "B15", 0x144 }, // VIVO_D6 + { "B16", 0x148 }, // VIVO_D5 + { "B17", 0x14c }, // VIVO_D4 + { "B18", 0x150 }, // VIVO_D3 + { "B19", 0x154 }, // VIVO_D2 + { "B20", 0x158 }, // VIVO_D1 + { "B21", 0x15c }, // VIVO_D0 + { "B22", 0x160 }, // VIVO_CLK + { "C18", 0x194 }, // PAD_MIPI_TXM4 + { "C19", 0x198 }, // PAD_MIPI_TXP4 + { "C20", 0x19c }, // PAD_MIPI_TXM3 + { "C21", 0x1a0 }, // PAD_MIPI_TXP3 + { "C16", 0x1a4 }, // PAD_MIPI_TXM2 + { "C17", 0x1a8 }, // PAD_MIPI_TXP2 + { "C14", 0x1ac }, // PAD_MIPI_TXM1 + { "C15", 0x1b0 }, // PAD_MIPI_TXP1 + { "C12", 0x1b4 }, // PAD_MIPI_TXM0 + { "C13", 0x1b8 }, // PAD_MIPI_TXP0 +}; + +uint32_t convert_func_to_value(char *pin, char *func) +{ + uint32_t i = 0; + uint32_t max_fun_num = NELEMS(cv181x_pin_func); + char v; + + for (i = 0; i < max_fun_num; i++) { + if (strcmp(cv181x_pin_func[i].func, func) == 0) { + if (strncmp(cv181x_pin_func[i].name, pin, strlen(pin)) == 0) { + v = cv181x_pin_func[i].name[strlen(cv181x_pin_func[i].name) - 1]; + break; + } + } + } + + if (i == max_fun_num) { + printf("ERROR: invalid pin or func\n"); + return INVALID_PIN; + } + + return (v - 0x30); +} + +void print_fun(char *name, uint32_t value) +{ + uint32_t i = 0; + uint32_t max_fun_num = NELEMS(cv181x_pin_func); + char pinname[128]; + + sprintf(pinname, "%s%d", name, value); + + printf("%s function:\n", name); + for (i = 0; i < max_fun_num; i++) { + if (strlen(cv181x_pin_func[i].name) != (strlen(name) + 1)) { + continue; + } + if (strncmp(pinname, cv181x_pin_func[i].name, strlen(name)) == 0) { + if (strcmp(pinname, cv181x_pin_func[i].name) == 0) + printf("[v] %s\n", cv181x_pin_func[i].func); + else + printf("[ ] %s\n", cv181x_pin_func[i].func); + // break; + } + } + printf("\n"); +} + +void print_usage(const char *prog) +{ + printf("pinmux for duos\n"); + printf("%s -p <== List all pins\n", prog); + printf("%s -l <== List all pins and its func\n", prog); + printf("%s -r pin <== Get func from pin\n", prog); + printf("%s -w pin/func <== Set func to pin\n", prog); +} + +int main(int argc, char *argv[]) +{ + int opt = 0; + uint32_t i = 0; + uint32_t value; + char pin[32]; + char func[32]; + uint32_t f_val; + + if (argc == 1) { + print_usage(argv[0]); + return 1; + } + + while ((opt = getopt(argc, argv, "hplr:w:")) != -1) { + switch (opt) { + case 'r': + for (i = 0; i < NELEMS(cv181x_pin); i++) { + if (strcmp(optarg, cv181x_pin[i].name) == 0) + break; + } + if (i != NELEMS(cv181x_pin)) { + value = devmem_readl(PINMUX_BASE + cv181x_pin[i].offset); + // printf("value %d\n", value); + print_fun(optarg, value); + + printf("register: 0x%x\n", PINMUX_BASE + cv181x_pin[i].offset); + printf("value: %d\n", value); + } else { + printf("\nInvalid option: %s", optarg); + } + break; + + case 'w': + // printf("optarg %s\n", optarg); + if (sscanf(optarg, "%[^/]/%s", pin, func) != 2) + print_usage(argv[0]); + + printf("pin %s\n", pin); + printf("func %s\n", func); + + for (i = 0; i < NELEMS(cv181x_pin); i++) { + if (strcmp(pin, cv181x_pin[i].name) == 0) + break; + } + + if (i != NELEMS(cv181x_pin)) { + f_val = convert_func_to_value(pin, func); + if (f_val == INVALID_PIN) + return 1; + devmem_writel(PINMUX_BASE + cv181x_pin[i].offset, f_val); + + printf("register: %x\n", PINMUX_BASE + cv181x_pin[i].offset); + printf("value: %d\n", f_val); + // printf("value %d\n", value); + } else { + printf("\nInvalid option: %s\n", optarg); + } + break; + + case 'p': + printf("Pinlist:\n"); + for (i = 0; i < NELEMS(cv181x_pin); i++) + printf("%s\n", cv181x_pin[i].name); + break; + + case 'l': + for (i = 0; i < NELEMS(cv181x_pin); i++) { + value = devmem_readl(PINMUX_BASE + cv181x_pin[i].offset); + // printf("value %d\n", value); + print_fun(cv181x_pin[i].name, value); + } + break; + + case 'h': + print_usage(argv[0]); + break; + + case '?': + print_usage(argv[0]); + break; + + default: + print_usage(argv[0]); + break; + } + } + + return 0; +} diff --git a/duo-pinmux/duos/func.h b/duo-pinmux/duos/func.h new file mode 100644 index 00000000..333c6808 --- /dev/null +++ b/duo-pinmux/duos/func.h @@ -0,0 +1,329 @@ +struct funlist { + char name[32]; + char func[32]; +} funlist_st; + +struct funlist cv181x_pin_func[] = { + // A16 - UART0_TX + { "A160", "UART0_TX"}, + { "A161", "CAM_MCLK1"}, + { "A162", "PWM_4"}, + { "A163", "A16"}, + { "A164", "UART1_TX"}, + { "A165", "AUX1"}, + { "A167", "DBG_6"}, + + // A17 - UART0_RX + { "A170", "UART0_RX"}, + { "A171", "CAM_MCLK0"}, + { "A172", "PWM_5"}, + { "A173", "A17"}, + { "A174", "UART1_RX"}, + { "A175", "AUX0"}, + { "A177", "DBG_7"}, + + // A19 - JTAG_CPU_TMS + { "A190", "CV_2WTMS_CR_4WTMS"}, + { "A191", "CAM_MCLK0"}, + { "A192", "PWM_7"}, + { "A193", "A19"}, + { "A194", "UART1_RTS"}, + { "A195", "AUX0"}, + { "A196", "UART1_TX"}, + { "A197", "VO_D_28"}, + + // A18 - JTAG_CPU_TCK + { "A180", "CV_2WTCK_CR_4WTCK"}, + { "A181", "CAM_MCLK1"}, + { "A182", "PWM_6"}, + { "A183", "A18"}, + { "A184", "UART1_CTS"}, + { "A185", "AUX1"}, + { "A186", "UART1_RX"}, + { "A187", "VO_D_29"}, + + // A20 - JTAG_CPU_TRST + { "A200", "JTAG_CPU_TRST"}, + { "A203", "A20"}, + { "A206", "VO_D_30"}, + + // A28 - IIC0_SCL + { "A280", "CV_SCL0"}, + { "A281", "UART1_TX"}, + { "A282", "UART2_TX"}, + { "A283", "A28"}, + { "A285", "WG0_D0"}, + { "A287", "DBG_10"}, + + // A29 - IIC0_SDA + { "A290", "CV_SDA0"}, + { "A291", "UART1_RX"}, + { "A292", "UART2_RX"}, + { "A293", "A29"}, + { "A295", "WG0_D1"}, + { "A296", "WG1_D0"}, + { "A297", "DBG_11"}, + + // E0 - PWR_GPIO0 + { "E00", "E0"}, + { "E01", "UART2_TX"}, + { "E02", "PWR_UART0_RX"}, + { "E04", "PWM_8"}, + + // E1 - PWR_GPIO1 + { "E10", "E1"}, + { "E11", "UART2_RX"}, + { "E13", "EPHY_LNK_LED"}, + { "E14", "PWM_9"}, + { "E15", "PWR_IIC_SCL"}, + { "E16", "IIC2_SCL"}, + { "E17", "CV_4WTMS_CR_SDA0"}, + + // E2 - PWR_GPIO2 + { "E20", "E2"}, + { "E22", "PWR_SECTICK"}, + { "E23", "EPHY_SPD_LED"}, + { "E24", "PWM_10"}, + { "E25", "PWR_IIC_SDA"}, + { "E26", "IIC2_SDA"}, + { "E27", "CV_4WTCK_CR_2WTCK"}, + + // B1 - ADC3 + { "B11", "CAM_MCLK0"}, + { "B12", "IIC4_SCL"}, + { "B13", "B1"}, + { "B14", "PWM_12"}, + { "B15", "EPHY_LNK_LED"}, + { "B16", "WG2_D0"}, + { "B17", "UART3_TX"}, + + // B2 - ADC2 + { "B21", "CAM_MCLK1"}, + { "B22", "IIC4_SDA"}, + { "B23", "B2"}, + { "B24", "PWM_13"}, + { "B25", "EPHY_SPD_LED"}, + { "B26", "WG2_D1"}, + { "B27", "UART3_RX"}, + + // B3 - ADC1 + { "B33", "B3"}, + { "B34", "KEY_COL2"}, + + // B11 - VIVO_D10 + { "B110", "PWM_1"}, + { "B111", "VI1_D_10"}, + { "B112", "VO_D_23"}, + { "B113", "B11"}, + { "B114", "RMII0_IRQ"}, + { "B115", "CAM_MCLK0"}, + { "B116", "IIC1_SDA"}, + { "B117", "UART2_TX"}, + + // B12 - VIVO_D9 + { "B120", "PWM_2"}, + { "B121", "VI1_D_9"}, + { "B122", "VO_D_22"}, + { "B123", "B12"}, + { "B125", "CAM_MCLK1"}, + { "B126", "IIC1_SCL"}, + { "B127", "UART2_RX"}, + + // B13 - VIVO_D8 + { "B130", "PWM_3"}, + { "B131", "VI1_D_8"}, + { "B132", "VO_D_21"}, + { "B133", "B13"}, + { "B134", "RMII0_MDIO"}, + { "B135", "SPI3_SDO"}, + { "B136", "IIC2_SCL"}, + { "B137", "CAM_VS0"}, + + // B14 - VIVO_D7 + { "B140", "VI2_D_7"}, + { "B141", "VI1_D_7"}, + { "B142", "VO_D_20"}, + { "B143", "B14"}, + { "B144", "RMII0_RXD1"}, + { "B145", "SPI3_SDI"}, + { "B146", "IIC2_SDA"}, + { "B147", "CAM_HS0"}, + + // B15 - VIVO_D6 + { "B150", "VI2_D_6"}, + { "B151", "VI1_D_6"}, + { "B152", "VO_D_19"}, + { "B153", "B15"}, + { "B154", "RMII0_REFCLKI"}, + { "B155", "SPI3_SCK"}, + { "B156", "UART2_TX"}, + { "B157", "CAM_VS0"}, + + // B16 - VIVO_D5 + { "B160", "VI2_D_5"}, + { "B161", "VI1_D_5"}, + { "B162", "VO_D_18"}, + { "B163", "B16"}, + { "B164", "RMII0_RXD0"}, + { "B165", "SPI3_CS_X"}, + { "B166", "UART2_RX"}, + { "B167", "CAM_HS0"}, + + // B17 - VIVO_D4 + { "B170", "VI2_D_4"}, + { "B171", "VI1_D_4"}, + { "B172", "VO_D_17"}, + { "B173", "B17"}, + { "B174", "RMII0_MDC"}, + { "B175", "IIC1_SDA"}, + { "B176", "UART2_CTS"}, + { "B177", "CAM_VS0"}, + + // B18 - VIVO_D3 + { "B180", "VI2_D_3"}, + { "B181", "VI1_D_3"}, + { "B182", "VO_D_16"}, + { "B183", "B18"}, + { "B184", "RMII0_TXD0"}, + { "B185", "IIC1_SCL"}, + { "B186", "UART2_RTS"}, + { "B187", "CAM_HS0"}, + + // B19 - VIVO_D2 + { "B190", "VI2_D_2"}, + { "B191", "VI1_D_2"}, + { "B192", "VO_D_15"}, + { "B193", "B19"}, + { "B194", "RMII0_TXD1"}, + { "B195", "CAM_MCLK1"}, + { "B196", "PWM_2"}, + { "B197", "UART2_TX"}, + + // B20 - VIVO_D1 + { "B200", "VI2_D_1"}, + { "B201", "VI1_D_1"}, + { "B202", "VO_D_14"}, + { "B203", "B20"}, + { "B204", "RMII0_RXDV"}, + { "B205", "IIC3_SDA"}, + { "B206", "PWM_3"}, + { "B207", "IIC4_SCL"}, + + // B21 - VIVO_D0 + { "B210", "VI2_D_0"}, + { "B211", "VI1_D_0"}, + { "B212", "VO_D_13"}, + { "B213", "B21"}, + { "B214", "RMII0_TXCLK"}, + { "B215", "IIC3_SCL"}, + { "B216", "WG1_D0"}, + { "B217", "IIC4_SDA"}, + + // B22 - VIVO_CLK + { "B220", "VI2_CLK"}, + { "B221", "VI1_CLK"}, + { "B222", "VO_CLK1"}, + { "B223", "B22"}, + { "B224", "RMII0_TXEN"}, + { "B225", "CAM_MCLK0"}, + { "B226", "WG1_D1"}, + { "B227", "UART2_RX"}, + + // C18 - PAD_MIPI_TXM4 + { "C180", "VI0_D_15"}, + { "C181", "SD1_CLK"}, + { "C182", "VO_D_24"}, + { "C183", "C18"}, + { "C184", "CAM_MCLK1"}, + { "C185", "PWM_12"}, + { "C186", "IIC1_SDA"}, + { "C187", "DBG_18"}, + + // C19 - PAD_MIPI_TXP4 + { "C190", "VI0_D_16"}, + { "C191", "SD1_CMD"}, + { "C192", "VO_D_25"}, + { "C193", "C19"}, + { "C194", "CAM_MCLK0"}, + { "C195", "PWM_13"}, + { "C196", "IIC1_SCL"}, + { "C197", "DBG_19"}, + + // C20 - PAD_MIPI_TXM3 + { "C200", "VI0_D_17"}, + { "C201", "SD1_D0"}, + { "C202", "VO_D_26"}, + { "C203", "C20"}, + { "C204", "IIC2_SDA"}, + { "C205", "PWM_14"}, + { "C206", "IIC1_SDA"}, + { "C207", "CAM_VS0"}, + + // C21 - PAD_MIPI_TXP3 + { "C210", "VI0_D_18"}, + { "C211", "SD1_D1"}, + { "C212", "VO_D_27"}, + { "C213", "C21"}, + { "C214", "IIC2_SCL"}, + { "C215", "PWM_15"}, + { "C216", "IIC1_SCL"}, + { "C217", "CAM_HS0"}, + + // C16 - PAD_MIPI_TXM2 + { "C160", "CV_4WTMS_CR_SDA0"}, + { "C161", "VI0_D_13"}, + { "C162", "VO_D_0"}, + { "C163", "C16"}, + { "C164", "IIC1_SDA"}, + { "C165", "PWM_8"}, + { "C166", "SPI0_SCK"}, + { "C167", "SD1_D2"}, + + // C17 - PAD_MIPI_TXP2 + { "C170", "CV_4WTDI_CR_SCL0"}, + { "C171", "VI0_D_14"}, + { "C172", "VO_CLK0"}, + { "C173", "C17"}, + { "C174", "IIC1_SCL"}, + { "C175", "PWM_9"}, + { "C176", "SPI0_CS_X"}, + { "C177", "SD1_D3"}, + + // C14 - PAD_MIPI_TXM1 + { "C140", "CV_4WTDO_CR_2WTMS"}, + { "C141", "VI0_D_11"}, + { "C142", "VO_D_2"}, + { "C143", "C14"}, + { "C144", "IIC2_SDA"}, + { "C145", "PWM_10"}, + { "C146", "SPI0_SDO"}, + { "C147", "DBG_14"}, + + // C15 - PAD_MIPI_TXP1 + { "C150", "CV_4WTCK_CR_2WTCK"}, + { "C151", "VI0_D_12"}, + { "C152", "VO_D_1"}, + { "C153", "C15"}, + { "C154", "IIC2_SCL"}, + { "C155", "PWM_11"}, + { "C156", "SPI0_SDI"}, + { "C157", "DBG_15"}, + + // C12 - PAD_MIPI_TXM0 + { "C121", "VI0_D_9"}, + { "C122", "VO_D_4"}, + { "C123", "C12"}, + { "C124", "CAM_MCLK1"}, + { "C125", "PWM_14"}, + { "C126", "CAM_VS0"}, + { "C127", "DBG_12"}, + + // C13 - PAD_MIPI_TXP0 + { "C131", "VI0_D_10"}, + { "C132", "VO_D_3"}, + { "C133", "C13"}, + { "C134", "CAM_MCLK0"}, + { "C135", "PWM_15"}, + { "C136", "CAM_HS0"}, + { "C137", "DBG_13"}, +}; diff --git a/receiver_cfg/Unicore_UM980_rtcm3.cfg b/receiver_cfg/Unicore_UM980_rtcm3.cfg index bd9d620b..0712a7f0 100644 --- a/receiver_cfg/Unicore_UM980_rtcm3.cfg +++ b/receiver_cfg/Unicore_UM980_rtcm3.cfg @@ -3,15 +3,24 @@ # CONFIG SIGNALGROUP 2 CONFIG SBAS ENABLE AUTO MODE BASE 1 TIME 60 1 -rtcm1019 1 -rtcm1020 1 -rtcm1042 1 -rtcm1044 1 -rtcm1045 1 -rtcm1046 1 -rtcm1077 1 -rtcm1087 1 -rtcm1097 1 -rtcm1107 1 -rtcm1117 1 -rtcm1127 1 \ No newline at end of file +rtcm1003 com2 1 +rtcm1006 com2 10 +rtcm1011 com2 1 +rtcm1019 com2 1 +rtcm1020 com2 1 +rtcm1033 com2 10 +rtcm1042 com2 1 +rtcm1044 com2 1 +rtcm1045 com2 1 +rtcm1046 com2 1 +rtcm1074 com2 1 +rtcm1077 com2 1 +rtcm1084 com2 1 +rtcm1087 com2 1 +rtcm1094 com2 1 +rtcm1097 com2 1 +rtcm1107 com2 1 +rtcm1117 com2 1 +rtcm1124 com2 1 +rtcm1127 com2 1 +CONFIG PPS ENABLE GPS POSITIVE 500000 1000 0 0*6E \ No newline at end of file diff --git a/tools/install.sh b/tools/install.sh index da5c6ec0..ff62aed0 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -600,7 +600,7 @@ configure_gnss(){ python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command reset --retry 5 sleep_time=10 ; echo 'Waiting '$sleep_time's for ' "${model}" ' reboot' ; sleep $sleep_time echo 'Sending settings....' - python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Unicore_"${model}"_rtcm3.cfg --store + python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Unicore_"${model}"_rtcm3.cfg --store --retry 2 if [[ $? -eq 0 ]] then echo 'Unicore UM980 successfuly configured' diff --git a/unit/rtkbase_web.service b/unit/rtkbase_web.service index f0c5b7df..09f4529b 100644 --- a/unit/rtkbase_web.service +++ b/unit/rtkbase_web.service @@ -5,7 +5,7 @@ Description=RTKBase Web Server [Service] User=root -ExecStart=/home/debian/{python_path} {script_path}/web_app/server.py --debug +ExecStart=/home/debian/{python_path} {script_path}/web_app/server.py Restart=on-failure RestartSec=30 #ProtectHome=read-only From d73dafe81af145196543e24c3980c781c59d4b5f Mon Sep 17 00:00:00 2001 From: topolonelli Date: Mon, 7 Apr 2025 11:21:55 +0000 Subject: [PATCH 13/23] Fixed detect and configure on the Web page --- unit/rtkbase_web.service | 7 +++++-- web_app/server.py | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/unit/rtkbase_web.service b/unit/rtkbase_web.service index 09f4529b..21d0c932 100644 --- a/unit/rtkbase_web.service +++ b/unit/rtkbase_web.service @@ -5,12 +5,15 @@ Description=RTKBase Web Server [Service] User=root -ExecStart=/home/debian/{python_path} {script_path}/web_app/server.py +WorkingDirectory=/home/debian +Environment="PATH=/usr/local/bin:/usr/bin:/bin" +Environment="HOME=/home/debian" +ExecStart=/home/debian/rtkbase_riscv/venv/bin/python /home/debian/rtkbase_riscv/web_app/server.py Restart=on-failure RestartSec=30 #ProtectHome=read-only #ProtectSystem=strict -#ReadWritePaths={script_path} /var/tmp /usr/local/bin +#ReadWritePaths=/home/debian/rtkbase_riscv /var/tmp /usr/local/bin [Install] WantedBy=multi-user.target diff --git a/web_app/server.py b/web_app/server.py index 6913dc57..8e613690 100755 --- a/web_app/server.py +++ b/web_app/server.py @@ -635,9 +635,11 @@ def deleteLog(json_msg): @socketio.on("detect_receiver", namespace="/test") def detect_receiver(json_msg): - print("Detecting gnss receiver") + #print("Detecting gnss receiver") #print("DEBUG json_msg: ", json_msg) + #print([os.path.join(rtkbase_path, "tools", "install.sh"), "--user", rtkbaseconfig.get("general", "user"), "--detect-gnss", "--no-write-port"]) answer = subprocess.run([os.path.join(rtkbase_path, "tools", "install.sh"), "--user", rtkbaseconfig.get("general", "user"), "--detect-gnss", "--no-write-port"], encoding="UTF-8", stderr=subprocess.PIPE, stdout=subprocess.PIPE, check=False) + #print(answer) if answer.returncode == 0 and "/dev/" in answer.stdout: #print("DEBUG ok stdout: ", answer.stdout) try: @@ -673,13 +675,15 @@ def configure_receiver(brand="", model=""): # configure the receiver. We wait a few seconds before stopping it to remove conflicting calls. time.sleep(4) main_service = services_list[0] + #print(main_service) if main_service.get("active") is True: main_service["unit"].stop() restart_main = True else: restart_main = False - print("configuring {} gnss receiver model {}".format(brand, model)) + #print("configuring {} gnss receiver model {}".format(brand, model)) + #print([os.path.join(rtkbase_path, "tools", "install.sh"), "--user", rtkbaseconfig.get("general", "user"), "--configure-gnss"]) answer = subprocess.run([os.path.join(rtkbase_path, "tools", "install.sh"), "--user", rtkbaseconfig.get("general", "user"), "--configure-gnss"], encoding="UTF-8", stderr=subprocess.PIPE, stdout=subprocess.PIPE, check=False) #print("DEBUG - stdout: ", answer.stdout) #print("DEBUG - returncode: ", answer.returncode) From 4e211e1c7e4431647e6a95bf957d8842f082c91d Mon Sep 17 00:00:00 2001 From: tommasopolonelli Date: Mon, 7 Apr 2025 20:00:22 +0200 Subject: [PATCH 14/23] Update swap.sh --- tools/swap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/swap.sh b/tools/swap.sh index aaf9d93c..549d26c2 100755 --- a/tools/swap.sh +++ b/tools/swap.sh @@ -14,7 +14,7 @@ fi # Define swap file size and location SWAPFILE=/swapfile -SWAPSIZE=1G +SWAPSIZE=256M # Create the swap file with the specified size sudo fallocate -l $SWAPSIZE $SWAPFILE From d1b79eb3ceb953f621112ece565b62f1131d97f4 Mon Sep 17 00:00:00 2001 From: tommasopolonelli Date: Wed, 9 Apr 2025 18:24:38 +0000 Subject: [PATCH 15/23] Fix configure and detect via webpage --- tools/install.sh | 63 +++++++++++++++++++++++++++++----------- tools/swap.sh | 20 +++++++++---- unit/rtkbase_web.service | 6 ++++ 3 files changed, 66 insertions(+), 23 deletions(-) diff --git a/tools/install.sh b/tools/install.sh index ff62aed0..ff8a6219 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -402,7 +402,30 @@ install_unit_files() { fi } +MilkV_DuoS_Pin_Mux() { + + platform=$(uname -m) + # Only execute the function if $platform contains 'riscv64'. + if [[ "$platform" =~ riscv64 ]]; then + + # Check if rtkbase_path variable is set. + if [ -z "$rtkbase_path" ]; then + echo "Error: rtkbase_path is not set. Please set rtkbase_path to the base directory." + return 1 + fi + + # Execute the duo-pinmux commands using the rtkbase_path. + #sudo "${rtkbase_path}/duo-pinmux/duos/duo-pinmux" -r B11 + #sudo "${rtkbase_path}/duo-pinmux/duos/duo-pinmux" -r B12 + sudo "${rtkbase_path}/duo-pinmux/duos/duo-pinmux" -w B11/UART2_TX + sudo "${rtkbase_path}/duo-pinmux/duos/duo-pinmux" -w B12/UART2_RX + + fi + +} + detect_gnss() { + python_venv="${rtkbase_path}"/venv/bin/python echo '################################' echo 'USB GNSS RECEIVER DETECTION' echo '################################' @@ -445,17 +468,19 @@ detect_gnss() { echo 'UART GNSS RECEIVER DETECTION' echo '################################' systemctl is-active --quiet str2str_tcp.service && sudo systemctl stop str2str_tcp.service && echo 'Stopping str2str_tcp service' + # Set correct PIN Multiplexer + MilkV_DuoS_Pin_Mux # TODO remove port if not available in /dev/ - for port in ttyS0 ttyUSB0 ttyUSB1 ttyUSB2 serial0 ttyS1 ttyS2 ttyS3 ttyS4 ttyS5; do + for port in ttyS2 ttyUSB0 ttyUSB1 ttyUSB2 serial0 ttyS1 ttyS0 ttyS3 ttyS4 ttyS5; do for port_speed in 115200 57600 38400 19200 9600; do echo 'DETECTION ON ' $port ' at ' $port_speed - if [[ $(python3 "${rtkbase_path}"/tools/ubxtool -f /dev/$port -s $port_speed -p MON-VER -w 5 2>/dev/null) =~ 'ZED-F9P' ]]; then + if [[ $(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/ubxtool -f /dev/$port -s $port_speed -p MON-VER -w 5 2>/dev/null) =~ 'ZED-F9P' ]]; then detected_gnss[0]=$port detected_gnss[1]='u-blox' detected_gnss[2]=$port_speed #echo 'U-blox ZED-F9P DETECTED ON '$port $port_speed break - elif { model=$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/$port --baudrate $port_speed --retry 2 --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;}; then + elif { model=$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/$port --baudrate $port_speed --retry 2 --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;}; then detected_gnss[0]=$port detected_gnss[1]='unicore' detected_gnss[2]=$port_speed @@ -476,16 +501,16 @@ detect_gnss() { if [[ "${detected_gnss[1]}" =~ 'u-blox' ]] then #get F9P firmware release - detected_gnss[3]=$(python3 "${rtkbase_path}"/tools/ubxtool -f /dev/"${detected_gnss[0]}" -s ${detected_gnss[2]} -p MON-VER | grep 'FWVER' | awk '{print $NF}') + detected_gnss[3]=$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/ubxtool -f /dev/"${detected_gnss[0]}" -s ${detected_gnss[2]} -p MON-VER | grep 'FWVER' | awk '{print $NF}') sudo -u "${RTKBASE_USER}" sed -i s/^receiver_firmware=.*/receiver_firmware=\'${firmware}\'/ "${rtkbase_path}"/settings.conf elif [[ "${detected_gnss[1]}" =~ 'Septentrio' ]] then #get mosaic-X5 firmware release - detected_gnss[3]="$(python3 "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${detected_gnss[2]} --command get_firmware --retry 5)" || firmware='?' + detected_gnss[3]="$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${detected_gnss[2]} --command get_firmware --retry 5)" || firmware='?' elif [[ "${detected_gnss[1]}" =~ 'unicore' ]] then #get Unicore UM98X firmware release - detected_gnss[3]="$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/"${detected_gnss[0]}" --baudrate ${detected_gnss[2]} --command get_firmware 2>/dev/null)" || firmware='?' + detected_gnss[3]="$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/"${detected_gnss[0]}" --baudrate ${detected_gnss[2]} --command get_firmware 2>/dev/null)" || firmware='?' fi # "send" result echo '/dev/'"${detected_gnss[0]}" ' - ' "${detected_gnss[1]}"' - ' "${detected_gnss[2]}"' - ' "${detected_gnss[3]}" @@ -528,6 +553,7 @@ _get_device_path() { } configure_gnss(){ + python_venv="${rtkbase_path}"/venv/bin/python echo '################################' echo 'CONFIGURE GNSS RECEIVER' echo '################################' @@ -536,10 +562,10 @@ configure_gnss(){ source <( grep -v '^#' "${rtkbase_path}"/settings.conf | grep '=' ) systemctl is-active --quiet str2str_tcp.service && sudo systemctl stop str2str_tcp.service #if the receiver is a U-Blox F9P, launch the set_zed-f9p.sh. This script will reset the F9P and configure it with the corrects settings for rtkbase - if [[ $(python3 "${rtkbase_path}"/tools/ubxtool -f /dev/"${com_port}" -s ${com_port_settings%%:*} -p MON-VER) =~ 'ZED-F9P' ]] + if [[ $(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/ubxtool -f /dev/"${com_port}" -s ${com_port_settings%%:*} -p MON-VER) =~ 'ZED-F9P' ]] then #get F9P firmware release - firmware=$(python3 "${rtkbase_path}"/tools/ubxtool -f /dev/"${com_port}" -s ${com_port_settings%%:*} -p MON-VER | grep 'FWVER' | awk '{print $NF}') + firmware=$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/ubxtool -f /dev/"${com_port}" -s ${com_port_settings%%:*} -p MON-VER | grep 'FWVER' | awk '{print $NF}') echo 'F9P Firmware: ' "${firmware}" sudo -u "${RTKBASE_USER}" sed -i s/^receiver_firmware=.*/receiver_firmware=\'${firmware}\'/ "${rtkbase_path}"/settings.conf #configure the F9P for RTKBase @@ -562,18 +588,18 @@ configure_gnss(){ sudo -u "${RTKBASE_USER}" sed -i -r '/^rtcm_/s/1107(\([0-9]+\))?,//' "${rtkbase_path}"/settings.conf && \ return $? - elif [[ $(python3 "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command get_model) =~ 'mosaic-X5' ]] + elif [[ $(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command get_model) =~ 'mosaic-X5' ]] then #get mosaic-X5 firmware release - firmware="$(python3 "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command get_firmware --retry 5)" || firmware='?' + firmware="$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command get_firmware --retry 5)" || firmware='?' echo 'Mosaic-X5 Firmware: ' "${firmware}" sudo -u "${RTKBASE_USER}" sed -i s/^receiver_firmware=.*/receiver_firmware=\'${firmware}\'/ "${rtkbase_path}"/settings.conf #configure the mosaic-X5 for RTKBase echo 'Resetting the mosaic-X5 settings....' - python3 "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command reset --retry 5 + sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command reset --retry 5 sleep_time=30 ; echo 'Waiting '$sleep_time's for mosaic-X5 reboot' ; sleep $sleep_time echo 'Sending settings....' - python3 "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Septentrio_Mosaic-X5.cfg --store --retry 5 + sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Septentrio_Mosaic-X5.cfg --store --retry 5 if [[ $? -eq 0 ]] then echo 'Septentrio Mosaic-X5 successfuly configured' @@ -589,18 +615,18 @@ configure_gnss(){ return $? fi - elif { model=$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --retry 2 --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;} + elif { model=$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --retry 2 --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;} then #get UM98x firmware release - firmware="$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --retry 2 --command get_firmware 2>/dev/null)" || firmware='?' + firmware="$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --retry 2 --command get_firmware 2>/dev/null)" || firmware='?' echo 'Unicore-' "${model}" 'Firmware: ' "${firmware}" sudo -u "${RTKBASE_USER}" sed -i s/^receiver_firmware=.*/receiver_firmware=\'${firmware}\'/ "${rtkbase_path}"/settings.conf #configure the UM980/UM982 for RTKBase echo 'Resetting the ' "${model}" ' settings....' - python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command reset --retry 5 + sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command reset --retry 5 sleep_time=10 ; echo 'Waiting '$sleep_time's for ' "${model}" ' reboot' ; sleep $sleep_time echo 'Sending settings....' - python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Unicore_"${model}"_rtcm3.cfg --store --retry 2 + sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Unicore_"${model}"_rtcm3.cfg --store --retry 2 if [[ $? -eq 0 ]] then echo 'Unicore UM980 successfuly configured' @@ -756,9 +782,10 @@ main() { ARG_DETECT_MODEM=0 ARG_START_SERVICES=0 ARG_ZEROCONF=0 + ARG_PIN_MUX=0 ARG_ALL=0 - PARSED_ARGUMENTS=$(getopt --name install --options hu:drbi:jf:qtgencmsza: --longoptions help,user:,dependencies,rtklib,rtkbase-release,rtkbase-repo:,rtkbase-bundled,rtkbase-custom:,rtkbase-requirements,unit-files,gpsd-chrony,detect-gnss,no-write-port,configure-gnss,detect-modem,start-services,zeroconf,all: -- "$@") + PARSED_ARGUMENTS=$(getopt --name install --options hu:drbi:jf:qtgencmsza: --longoptions help,user:,dependencies,rtklib,rtkbase-release,rtkbase-repo:,rtkbase-bundled,rtkbase-custom:,rtkbase-requirements,unit-files,gpsd-chrony,detect-gnss,no-write-port,configure-gnss,detect-modem,start-services,zeroconf,pin-mux,all: -- "$@") VALID_ARGUMENTS=$? if [ "$VALID_ARGUMENTS" != "0" ]; then #man_help @@ -788,6 +815,7 @@ main() { -m | --detect-modem) ARG_DETECT_MODEM=1 ; shift ;; -s | --start-services) ARG_START_SERVICES=1 ; shift ;; -z | --zeroconf) ARG_ZEROCONF=1 ; shift ;; + -p | --pin-mux) ARG_PIN_MUX=1 ; shift ;; -a | --all) ARG_ALL="${2}" ; shift 2 ;; # -- means the end of the arguments; drop this, and break out of the while loop --) shift; break ;; @@ -851,6 +879,7 @@ main() { [ $ARG_DETECT_MODEM -eq 1 ] && { detect_usb_modem && _add_modem_port && _configure_modem ; ((cumulative_exit+=$?)) ;} [ $ARG_ZEROCONF -eq 1 ] && { install_zeroconf_service; ((cumulative_exit+=$?)) ;} [ $ARG_START_SERVICES -eq 1 ] && { start_services ; ((cumulative_exit+=$?)) ;} + [ $ARG_PIN_MUX -eq 1 ] && { MilkV_DuoS_Pin_Mux ; ((cumulative_exit+=$?)) ;} } main "$@" diff --git a/tools/swap.sh b/tools/swap.sh index 549d26c2..54613818 100755 --- a/tools/swap.sh +++ b/tools/swap.sh @@ -16,19 +16,27 @@ fi SWAPFILE=/swapfile SWAPSIZE=256M +# Check if the swap file already exists +if [[ -f "$SWAPFILE" ]]; then + echo "$SWAPFILE already exists. Exiting script." + exit 0 +fi + # Create the swap file with the specified size -sudo fallocate -l $SWAPSIZE $SWAPFILE +fallocate -l $SWAPSIZE $SWAPFILE # Set the correct permissions -sudo chmod 600 $SWAPFILE +chmod 600 $SWAPFILE # Set up the swap area -sudo mkswap $SWAPFILE +mkswap $SWAPFILE # Enable the swap file -sudo swapon $SWAPFILE +swapon $SWAPFILE -# Make the swap file permanent by adding it to /etc/fstab -echo "$SWAPFILE none swap sw 0 0" | sudo tee -a /etc/fstab +# Check if the fstab entry already exists before appending +if ! grep -q "^$SWAPFILE" /etc/fstab; then + echo "$SWAPFILE none swap sw 0 0" >> /etc/fstab +fi echo "Swap file of size $SWAPSIZE created and enabled successfully." diff --git a/unit/rtkbase_web.service b/unit/rtkbase_web.service index 21d0c932..27816277 100644 --- a/unit/rtkbase_web.service +++ b/unit/rtkbase_web.service @@ -8,6 +8,12 @@ User=root WorkingDirectory=/home/debian Environment="PATH=/usr/local/bin:/usr/bin:/bin" Environment="HOME=/home/debian" +Environment="LOGNAME=debian" +#StandardOutput=append:/var/log/rtkbase_web.log + +# Run the install.sh command before starting the main service +ExecStartPre=/home/debian/rtkbase_riscv/tools/install.sh -u debian --pin-mux + ExecStart=/home/debian/rtkbase_riscv/venv/bin/python /home/debian/rtkbase_riscv/web_app/server.py Restart=on-failure RestartSec=30 From aba15ed3b69c0752910f7867c1419196fa3ae08f Mon Sep 17 00:00:00 2001 From: tommasopolonelli Date: Wed, 9 Apr 2025 18:32:58 +0000 Subject: [PATCH 16/23] update default settings --- settings.conf.default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.conf.default b/settings.conf.default index 8146193c..2ca26881 100644 --- a/settings.conf.default +++ b/settings.conf.default @@ -29,7 +29,7 @@ cpu_temp_offset=0 [main] #base coordinates: lat long height -position='47.0983869 -1.2655108 36.40' +position='47.1983869 -1.1655108 36.40' #gnss receiver com port com_port='ttyS1' #gnss receiver com port settings From 2b0a59ebf4a865c6169b7fe46677e5fb1e826cdf Mon Sep 17 00:00:00 2001 From: tommasopolonelli Date: Wed, 16 Apr 2025 22:32:05 +0200 Subject: [PATCH 17/23] Update install.sh --- tools/install.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/install.sh b/tools/install.sh index ff8a6219..8b08b616 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -116,7 +116,7 @@ install_dependencies() { echo '################################' apt-get "${APT_TIMEOUT}" update -y || exit 1 apt-get "${APT_TIMEOUT}" upgrade -y - apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables wget curl lrzsz || exit 1 + apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables wget curl lrzsz musl-tools || exit 1 apt-get "${APT_TIMEOUT}" install -y libxml2-dev libxslt-dev libc6 || exit 1 # needed for lxml (for pystemd) apt-get "${APT_TIMEOUT}" install -y wireless-tools wpasupplicant || exit 1 apt-get "${APT_TIMEOUT}" clean -y @@ -131,6 +131,12 @@ install_dependencies() { systemctl enable serial-getty@ttyS0.service systemctl start serial-getty@ttyS0.service + # Run swap.sh + echo '################################' + echo 'CONFIGURING SWAP' + echo '################################' + "${rtkbase_path}"/tools/swap.sh + } install_gpsd_chrony() { From c60db5fcc1fa8bb67a93b4af86aabc68d79ef2e4 Mon Sep 17 00:00:00 2001 From: tommasopolonelli Date: Wed, 23 Apr 2025 08:23:40 +0000 Subject: [PATCH 18/23] display_app --- .gitignore | 3 +- display_app/2in15_e-Paper_B/Makefile | 63 + display_app/2in15_e-Paper_B/epd | Bin 0 -> 69048 bytes .../2in15_e-Paper_B/lib/Config/DEV_Config.c | 231 ++ .../2in15_e-Paper_B/lib/Config/DEV_Config.h | 52 + .../2in15_e-Paper_B/lib/Config/Debug.h | 47 + .../lib/Config/dev_hardware_SPI.c | 366 +++ .../lib/Config/dev_hardware_SPI.h | 120 + .../lib/Config/sysfs_software_spi.c | 204 ++ .../lib/Config/sysfs_software_spi.h | 111 + .../2in15_e-Paper_B/lib/Fonts/font12.c | 1384 +++++++++ .../2in15_e-Paper_B/lib/Fonts/font12CN.c | 120 + .../2in15_e-Paper_B/lib/Fonts/font16.c | 1764 ++++++++++++ .../2in15_e-Paper_B/lib/Fonts/font20.c | 2142 ++++++++++++++ .../2in15_e-Paper_B/lib/Fonts/font24.c | 2520 +++++++++++++++++ .../2in15_e-Paper_B/lib/Fonts/font24CN.c | 465 +++ display_app/2in15_e-Paper_B/lib/Fonts/font8.c | 1004 +++++++ display_app/2in15_e-Paper_B/lib/Fonts/fonts.h | 97 + .../2in15_e-Paper_B/lib/GUI/GUI_BMPfile.c | 529 ++++ .../2in15_e-Paper_B/lib/GUI/GUI_BMPfile.h | 94 + .../2in15_e-Paper_B/lib/GUI/GUI_Paint.c | 847 ++++++ .../2in15_e-Paper_B/lib/GUI/GUI_Paint.h | 217 ++ .../2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.c | 261 ++ .../2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.h | 45 + display_app/2in15_e-Paper_B/pic/2.15__b.bmp | Bin 0 -> 5982 bytes display_app/2in15_e-Paper_B/pic/2.15__r.bmp | Bin 0 -> 5982 bytes .../2in15_e-Paper_B/src/EPD_2in15b_Manager.c | 103 + .../2in15_e-Paper_B/src/EPD_2in15b_Manager.h | 13 + display_app/2in15_e-Paper_B/src/ImageData.c | 781 +++++ display_app/2in15_e-Paper_B/src/ImageData.h | 43 + display_app/2in15_e-Paper_B/src/main.c | 22 + display_app/duos/devmem.c | 105 + display_app/duos/devmem.h | 12 + display_app/duos/duos_pinmux.c | 108 + display_app/duos/duos_pinmux.h | 6 + display_app/duos/func.h | 329 +++ display_app/include/system/wiringx.h | 115 + .../libs/system/musl_riscv64/libwiringx.so | Bin 0 -> 373104 bytes 38 files changed, 14322 insertions(+), 1 deletion(-) create mode 100755 display_app/2in15_e-Paper_B/Makefile create mode 100755 display_app/2in15_e-Paper_B/epd create mode 100755 display_app/2in15_e-Paper_B/lib/Config/DEV_Config.c create mode 100755 display_app/2in15_e-Paper_B/lib/Config/DEV_Config.h create mode 100755 display_app/2in15_e-Paper_B/lib/Config/Debug.h create mode 100755 display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.c create mode 100755 display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.h create mode 100755 display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.c create mode 100755 display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.h create mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font12.c create mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font12CN.c create mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font16.c create mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font20.c create mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font24.c create mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font24CN.c create mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font8.c create mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/fonts.h create mode 100755 display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.c create mode 100755 display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.h create mode 100755 display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.c create mode 100755 display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.h create mode 100755 display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.c create mode 100755 display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.h create mode 100755 display_app/2in15_e-Paper_B/pic/2.15__b.bmp create mode 100755 display_app/2in15_e-Paper_B/pic/2.15__r.bmp create mode 100755 display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.c create mode 100755 display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h create mode 100755 display_app/2in15_e-Paper_B/src/ImageData.c create mode 100755 display_app/2in15_e-Paper_B/src/ImageData.h create mode 100755 display_app/2in15_e-Paper_B/src/main.c create mode 100755 display_app/duos/devmem.c create mode 100755 display_app/duos/devmem.h create mode 100755 display_app/duos/duos_pinmux.c create mode 100755 display_app/duos/duos_pinmux.h create mode 100755 display_app/duos/func.h create mode 100755 display_app/include/system/wiringx.h create mode 100755 display_app/libs/system/musl_riscv64/libwiringx.so diff --git a/.gitignore b/.gitignore index 6befdb70..5db1458c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ test.sh test.conf *.FCStd1 **/venv*/* -**/build/ \ No newline at end of file +**/build/ +*.o \ No newline at end of file diff --git a/display_app/2in15_e-Paper_B/Makefile b/display_app/2in15_e-Paper_B/Makefile new file mode 100755 index 00000000..83c0f36b --- /dev/null +++ b/display_app/2in15_e-Paper_B/Makefile @@ -0,0 +1,63 @@ +DIR_Config = ./lib/Config +DIR_EPD = ./lib/e-Paper +DIR_FONTS = ./lib/Fonts +DIR_GUI = ./lib/GUI +DIR_Examples = ./examples +DIR_BIN = ./bin + +EPD = NULL +OBJ_C = $(wildcard ${DIR_EPD}/*.c ${DIR_GUI}/*.c ${DIR_Examples}/*.c ${DIR_FONTS}/*.c ) + +OBJ_O = $(patsubst %.c,${DIR_BIN}/%.o,$(notdir ${OBJ_C})) +DUO_DEV_C = $(wildcard $(DIR_BIN)/dev_hardware_SPI.o $(DIR_BIN)/DUO_sysfs_gpio.o $(DIR_BIN)/DEV_Config.o) + +DEBUG = -D DEBUG + +.PHONY : DUO clean + +DUO:DUO_DEV DUO_epd + +TARGET = epd +CC = musl-gcc +MSG = -ffunction-sections -fdata-sections -Wall +CFLAGS += $(MSG) -D $(EPD) + +debug_cflags=-g -O -ggdb3 -ggdb -g3 -ggdb2 -g1 -g0 +#debug_cflags=-O3 -DNDEBUG +arch_cflags=-mcpu=c906fdv -mcmodel=medany +arch_ldflags=-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 +sys_lib=../libs/system/musl_riscv64 +sys_inc=../include/system +CFLAGS+=${debug_cflags} -I${sys_inc} + +LDFLAGS=${arch_ldflags} -L${sys_lib} +LDFLAGS += -Wl,-rpath,../libs/system/musl_riscv64 -lwiringx + + +DUO_epd:${OBJ_O} + echo $(@) + $(CC) $(CFLAGS) -D DUO $(OBJ_O) $(DUO_DEV_C) -o $(TARGET) $(DEBUG) $(LDFLAGS) + +$(shell mkdir -p $(DIR_BIN)) + +${DIR_BIN}/%.o:$(DIR_Examples)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_GUI) -I $(DIR_EPD) $(DEBUG) $(LDFLAGS) + +${DIR_BIN}/%.o:$(DIR_EPD)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) $(DEBUG) $(LDFLAGS) + +${DIR_BIN}/%.o:$(DIR_FONTS)/%.c + $(CC) $(CFLAGS) -c $< -o $@ $(DEBUG) $(LDFLAGS) + +${DIR_BIN}/%.o:$(DIR_GUI)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) $(DEBUG) $(LDFLAGS) + +DUO_DEV: +# $(CC) $(CFLAGS) -c $(DIR_Config)/dev_hardware_SPI.c -o $(DIR_BIN)/dev_hardware_SPI.o $(DEBUG) + $(CC) $(CFLAGS) -c $(DIR_Config)/DEV_Config.c -o $(DIR_BIN)/DEV_Config.o $(DEBUG) + + + +clean : + rm $(DIR_BIN)/*.* + rm $(TARGET) \ No newline at end of file diff --git a/display_app/2in15_e-Paper_B/epd b/display_app/2in15_e-Paper_B/epd new file mode 100755 index 0000000000000000000000000000000000000000..71c1568beac4c0c45ea53cc64e90c9b84dd86c4b GIT binary patch literal 69048 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

K|-*5xMCS2X>Ex?q+2evMD6 zTiFgprl)%V8h5fz>2DH{cT(d_l!{szcnrLlqLbvG04F;r%l?mM$T_F+f)YRTn=I%H zjLSSPZrKIK#qZMJ-+|}isHvB|Z~b9Lx&Op+Wd9<4;3tfWf2hBCg#1@CG$5-`N2_2%P%E5$>=F^q_E5;}i6sYU&{UZJFtx ze9++Zy#R%KfKNcu-P|q)RjLl0^cVkg7iVl~T&Vi-M>6n7fEW8@z0_Z@eDO2o+rX~_ zr+)H+rT+zu?^Jg`ZbY1C!+l4~>51(nz6YG@W$)`>%%J~wjTe;otNPnNNSnfa8QDSn ztG93oKL$|wow`iP+Qqg;WOP@@^ zYL4ZIKl~q@c_-uIubyPQ!MN;$^!LHY+h$z$aokfB{}Y|DZ6-{YUmM`g=m)tBlLONq@@<{A7lFU(3h$ z|JM9@Kg*H*ss3IXavo${{O8{GUJgn3ZT${z-1_IOanh~Vao$?Jvux$AydtF&7!+&b9sJkI^o*qZOv=DP8A z8avUA!sFq55OtXtp`mXrO?|dZdVd1Q5WwfxZ?n_)bbiW6@fI}!62%) z!(^u1OH@`Qd4Ln;X-VwwC3;l10-9gA)2+0_deFd&>mFU3U0!e(R_0xo4#BAmcm6{w zv&%~r<*u$BuPn^pv9{nITUzf~(xcW5?%akGaQ>9$jBJAt=>GTcFi( z*B0m8{grmJ9i?qiY5HE|&NXo|uN7HbT{`YAw`;!YM6f~~3UQ-%+IaV)eQECXrtf#u zQJA2-zp~<gYKQ?+OKaFNa%KYWV#GDoZE&(k}-22rE?{Ss!*+0@_H5bcdDVg zC65$$jUG>uccTB)sCkWT`g7!f zb&L?xgLUhb(YKAsxX60D;J8*ywdb5+Z4#eR~i$*~|bZGS8Cq^3SC8hxq8^eg^p zqb!-7N8Q2}MqM5AcI@+|rBN$2;ucm?<;?}jve!v>cz3@xf2v%WEv0p73f8@ufO#Ji zsoSDOVqk#wi#-vvq}!4fYp}5wHqdunzeY1Q)`nVd2$1Yh3-_rex&$)~=s{%l_cfGi zUyY0D*?xUJDs++Ce_f?HjoO**JzxWxFyC#uYFY&|38+%M-NFqu;v_Qhrlj;d*-@oN z*ez{(@un)(wnLDc7+t;;!C(Y(s?$tVDe<@PjM~~BC4bW_jjDu8=ftdvszf)?k_Nli z3UG7UXoC-rk``mw(YsU$i*pNWE`-uoJ0&l{Y`f9LQU*o*jcx;y&N8}2Wbj)oJ}Oc zFZaI^%lCyuOTpIvFffr#`EpMz@r^9l)?dnBWd1o~Mz~-OID2uLpRR^%{f_}7o#2M+ zAm@q_f67u=_OlXy5L{_~+2>1Ku+IC%PF$S2i}?kYdu)l<9~Mdzi~fST7QftgOZ*z| zvxVN~50F8=x!70k5uf}=!(r3QyTo0PkzIvf?$7`Hf64zb@RIF?U(S2K#QZO?{rPyI z*M4GuG7pgmznuS`eGwo+$3(rS=q>Rh$Vv0dz5UC~|6GsLB!o}m$1Hx?Z=Szo==pfW zyx=K(0?_`PFwtN3nbZGlC~g!&j&1&@fRp~y7M<{0*9)4KNQsBS=kbTKZ8NEm%dcyy z{zLc#c@_y9qrC4kzpa-|`<)E_k$)j6N-bIp)~ot^(AXI9ec;FR#Cf=hdQY47C&;le zBEFd!YdubruxbAbu#FMrW6b}0?MKYSZ`a*V#S&O|Ger%zc7Ue3JP;!3WuI0Y-C8fie+f{-^2Q iGLg=I=`|gxM|YT5p0@sz$QZ`|z=)x|&0?@#)&Bs-eTKyV literal 0 HcmV?d00001 diff --git a/display_app/2in15_e-Paper_B/lib/Config/DEV_Config.c b/display_app/2in15_e-Paper_B/lib/Config/DEV_Config.c new file mode 100755 index 00000000..6b0746cf --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Config/DEV_Config.c @@ -0,0 +1,231 @@ +#include "DEV_Config.h" + +/** + * GPIO read and write +**/ +void DEV_Digital_Write(UWORD Pin, UBYTE Value) +{ + + digitalWrite(Pin, Value); + +} + +UBYTE DEV_Digital_Read(UWORD Pin) +{ + UBYTE Read_value = 0; + + Read_value = digitalRead(Pin); + + return Read_value; +} + +/** + * SPI +**/ +void DEV_SPI_WriteByte(uint8_t Value) +{ + wiringXSPIDataRW(SPI_PORT, &Value,1); +} + +void DEV_SPI_Write_nByte(uint8_t *pData, uint32_t Len) +{ + wiringXSPIDataRW(SPI_PORT, pData,Len); +} + +/** + * GPIO Mode +**/ +void DEV_GPIO_Mode(UWORD Pin, UWORD Mode) +{ + + Debug("not support"); + +} + +/** + * delay x ms +**/ +void DEV_Delay_ms(UDOUBLE xms) +{ + Debug("Sleep for :%d ms\n", xms); + usleep(xms*1000); +} + +static int DEV_Equipment_Testing(void) +{ + FILE *fp; + char issue_str[64]; + + fp = fopen("/etc/issue", "r"); + if (fp == NULL) { + Debug("Unable to open /etc/issue"); + return -1; + } + if (fread(issue_str, 1, sizeof(issue_str), fp) <= 0) { + Debug("Unable to read from /etc/issue"); + return -1; + } + issue_str[sizeof(issue_str)-1] = '\0'; + fclose(fp); + + printf("Current environment: "); + + char systems[][9] = {"Raspbian", "Debian", "NixOS"}; + int detected = 0; + for(int i=0; i<3; i++) { + if (strstr(issue_str, systems[i]) != NULL) { + printf("%s\n", systems[i]); + detected = 1; + } + } + if (!detected) { + printf("OS not recognized\n"); + printf("Built for Debian, but unable to detect environment.\n"); + return -1; + } + + return 0; +} + + + +void DEV_GPIO_Init(void) +{ + + if(wiringXValidGPIO(EPD_RST_PIN) != 0) { + printf("Invalid GPIO %d\n", EPD_RST_PIN); + } + pinMode(EPD_RST_PIN, PINMODE_OUTPUT); + + if(wiringXValidGPIO(EPD_DC_PIN) != 0) { + printf("Invalid GPIO %d\n", EPD_DC_PIN); + } + pinMode(EPD_DC_PIN, PINMODE_OUTPUT); + + if(wiringXValidGPIO(EPD_CS_PIN) != 0) { + printf("Invalid GPIO %d\n", EPD_CS_PIN); + } + pinMode(EPD_CS_PIN, PINMODE_OUTPUT); + + + if(wiringXValidGPIO(EPD_BUSY_PIN) != 0) { + printf("Invalid GPIO %d\n", EPD_BUSY_PIN); + } + pinMode(EPD_BUSY_PIN, PINMODE_INPUT); + + if(wiringXValidGPIO(EPD_PWR_PIN) != 0) { + printf("Invalid GPIO %d\n", EPD_PWR_PIN); + } + pinMode(EPD_PWR_PIN, PINMODE_OUTPUT); + + + DEV_Digital_Write(EPD_CS_PIN, HIGH); + DEV_Digital_Write(EPD_PWR_PIN, HIGH); + + DEV_Delay_ms(100); + +} + +void DEV_SPI_SendnData(UBYTE *Reg) +{ + UDOUBLE size; + size = sizeof(Reg); + for(UDOUBLE i=0 ; i +#include +#include +#include +#include +#include +#include "Debug.h" + +/* Support for MilkV Duo S*/ +#include "wiringx.h" + +/** + * GPIO +**/ + +/* SPI2 is routed to J3 B13-B15 */ +#define SPI_PORT 0 +#define EPD_DC_PIN (3) //26 +#define EPD_CS_PIN (5) //21 +#define EPD_RST_PIN (7) +#define EPD_BUSY_PIN (24) +#define EPD_PWR_PIN (15) +#define EPD_SCLK_PIN (23) +#define EPD_MOSI_PIN (19) + +/** + * data +**/ +#define UBYTE uint8_t +#define UWORD uint16_t +#define UDOUBLE uint32_t + +/*------------------------------------------------------------------------------------------------------*/ +void DEV_Digital_Write(UWORD Pin, UBYTE Value); +UBYTE DEV_Digital_Read(UWORD Pin); + +void DEV_SPI_WriteByte(UBYTE Value); +void DEV_SPI_Write_nByte(uint8_t *pData, uint32_t Len); +void DEV_Delay_ms(UDOUBLE xms); + +void DEV_SPI_SendData(UBYTE Reg); +void DEV_SPI_SendnData(UBYTE *Reg); +UBYTE DEV_SPI_ReadData(); + +UBYTE DEV_Module_Init(void); +void DEV_Module_Exit(void); + + +#endif diff --git a/display_app/2in15_e-Paper_B/lib/Config/Debug.h b/display_app/2in15_e-Paper_B/lib/Config/Debug.h new file mode 100755 index 00000000..af3c30e1 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Config/Debug.h @@ -0,0 +1,47 @@ +/***************************************************************************** +* | File : Debug.h +* | Author : Waveshare team +* | Function : debug with printf +* | Info : +* Image scanning +* Please use progressive scanning to generate images or fonts +*---------------- +* | This version: V2.0 +* | Date : 2018-10-30 +* | Info : +* 1.USE_DEBUG -> DEBUG, If you need to see the debug information, +* clear the execution: make DEBUG=-DDEBUG +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +******************************************************************************/ +#ifndef __DEBUG_H +#define __DEBUG_H + +#include + +#if DEBUG + #define Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) +#else + #define Debug(__info,...) +#endif + +#endif + diff --git a/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.c b/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.c new file mode 100755 index 00000000..d6010ca0 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.c @@ -0,0 +1,366 @@ +/***************************************************************************** +* | File : dev_hardware_SPI.c +* | Author : Waveshare team +* | Function : Read and write /dev/SPI, hardware SPI +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-26 +* | Info : Basic version +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "dev_hardware_SPI.h" + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +HARDWARE_SPI hardware_SPI; + +static uint8_t bits = 8; + +#define SPI_CS_HIGH 0x04 //Chip select high +#define SPI_LSB_FIRST 0x08 //LSB +#define SPI_3WIRE 0x10 //3-wire mode SI and SO same line +#define SPI_LOOP 0x20 //Loopback mode +#define SPI_NO_CS 0x40 //A single device occupies one SPI bus, so there is no chip select +#define SPI_READY 0x80 //Slave pull low to stop data transmission + +struct spi_ioc_transfer tr; + + +/****************************************************************************** +function: SPI port initialization +parameter: + SPI_device : Device name +Info: + /dev/spidev0.0 + /dev/spidev0.1 +******************************************************************************/ +void DEV_HARDWARE_SPI_begin(char *SPI_device) +{ + //device + int ret = 0; + if((hardware_SPI.fd = open(SPI_device, O_RDWR )) < 0) { + perror("Failed to open SPI device.\n"); + printf("Failed to open SPI device\r\n"); + DEV_HARDWARE_SPI_Debug("Failed to open SPI device\r\n"); + exit(1); + } else { + printf("open : %s\r\n", SPI_device); + DEV_HARDWARE_SPI_Debug("open : %s\r\n", SPI_device); + } + hardware_SPI.mode = 0; + + ret = ioctl(hardware_SPI.fd, SPI_IOC_WR_BITS_PER_WORD, &bits); + if (ret == -1) { + printf("can't set bits per word\r\n"); + DEV_HARDWARE_SPI_Debug("can't set bits per word\r\n"); + } + + ret = ioctl(hardware_SPI.fd, SPI_IOC_RD_BITS_PER_WORD, &bits); + if (ret == -1) { + printf("can't get bits per word\r\n"); + DEV_HARDWARE_SPI_Debug("can't get bits per word\r\n"); + } + tr.bits_per_word = bits; + + DEV_HARDWARE_SPI_Mode(SPI_MODE_0); + DEV_HARDWARE_SPI_ChipSelect(SPI_CS_Mode_LOW); + DEV_HARDWARE_SPI_SetBitOrder(SPI_BIT_ORDER_LSBFIRST); + DEV_HARDWARE_SPI_setSpeed(20000000); + DEV_HARDWARE_SPI_SetDataInterval(5); +} + +void DEV_HARDWARE_SPI_beginSet(char *SPI_device, SPIMode mode, uint32_t speed) +{ + //device + int ret = 0; + hardware_SPI.mode = 0; + if((hardware_SPI.fd = open(SPI_device, O_RDWR )) < 0) { + perror("Failed to open SPI device.\n"); + exit(1); + } else { + DEV_HARDWARE_SPI_Debug("open : %s\r\n", SPI_device); + } + + ret = ioctl(hardware_SPI.fd, SPI_IOC_WR_BITS_PER_WORD, &bits); + if (ret == -1) + DEV_HARDWARE_SPI_Debug("can't set bits per word\r\n"); + + ret = ioctl(hardware_SPI.fd, SPI_IOC_RD_BITS_PER_WORD, &bits); + if (ret == -1) + DEV_HARDWARE_SPI_Debug("can't get bits per word\r\n"); + + DEV_HARDWARE_SPI_Mode(mode); + DEV_HARDWARE_SPI_ChipSelect(SPI_CS_Mode_LOW); + DEV_HARDWARE_SPI_setSpeed(speed); + DEV_HARDWARE_SPI_SetDataInterval(0); +} + + +/****************************************************************************** +function: SPI device End +parameter: +Info: +******************************************************************************/ +void DEV_HARDWARE_SPI_end(void) +{ + hardware_SPI.mode = 0; + if (close(hardware_SPI.fd) != 0){ + DEV_HARDWARE_SPI_Debug("Failed to close SPI device\r\n"); + perror("Failed to close SPI device.\n"); + } +} + +/****************************************************************************** +function: Set SPI speed +parameter: +Info: Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_setSpeed(uint32_t speed) +{ + uint32_t speed1 = hardware_SPI.speed; + + hardware_SPI.speed = speed; + + //Write speed + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1) { + DEV_HARDWARE_SPI_Debug("can't set max speed hz\r\n"); + hardware_SPI.speed = speed1;//Setting failure rate unchanged + return -1; + } + + //Read the speed of just writing + if (ioctl(hardware_SPI.fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) == -1) { + DEV_HARDWARE_SPI_Debug("can't get max speed hz\r\n"); + hardware_SPI.speed = speed1;//Setting failure rate unchanged + return -1; + } + hardware_SPI.speed = speed; + tr.speed_hz = hardware_SPI.speed; + return 1; +} + +/****************************************************************************** +function: Set SPI Mode +parameter: +Info: + SPIMode: + SPI_MODE0 + SPI_MODE1 + SPI_MODE2 + SPI_MODE3 + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_Mode(SPIMode mode) +{ + hardware_SPI.mode &= 0xfC;//Clear low 2 digits + hardware_SPI.mode |= mode;//Setting mode + + //Write device + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Set SPI CS Enable +parameter: +Info: + EN: + DISABLE + ENABLE + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_CSEN(SPICSEN EN) +{ + if(EN == ENABLE){ + hardware_SPI.mode |= SPI_NO_CS; + }else { + hardware_SPI.mode &= ~SPI_NO_CS; + } + //Write device + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi CS EN\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Chip Select +parameter: +Info: + CS_Mode: + SPI_CS_Mode_LOW + SPI_CS_Mode_HIGH + SPI_CS_Mode_NONE + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_ChipSelect(SPIChipSelect CS_Mode) +{ + if(CS_Mode == SPI_CS_Mode_HIGH){ + hardware_SPI.mode |= SPI_CS_HIGH; + hardware_SPI.mode &= ~SPI_NO_CS; + DEV_HARDWARE_SPI_Debug("CS HIGH \r\n"); + }else if(CS_Mode == SPI_CS_Mode_LOW){ + hardware_SPI.mode &= ~SPI_CS_HIGH; + hardware_SPI.mode &= ~SPI_NO_CS; + }else if(CS_Mode == SPI_CS_Mode_NONE){ + hardware_SPI.mode |= SPI_NO_CS; + } + + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Sets the SPI bit order +parameter: +Info: + Order: + SPI_BIT_ORDER_LSBFIRST + SPI_BIT_ORDER_MSBFIRST + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_SetBitOrder(SPIBitOrder Order) +{ + if(Order == SPI_BIT_ORDER_LSBFIRST){ + hardware_SPI.mode |= SPI_LSB_FIRST; + DEV_HARDWARE_SPI_Debug("SPI_LSB_FIRST\r\n"); + }else if(Order == SPI_BIT_ORDER_MSBFIRST){ + hardware_SPI.mode &= ~SPI_LSB_FIRST; + DEV_HARDWARE_SPI_Debug("SPI_MSB_FIRST\r\n"); + } + + // DEV_HARDWARE_SPI_Debug("hardware_SPI.mode = 0x%02x\r\n", hardware_SPI.mode); + int fd = ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode); + DEV_HARDWARE_SPI_Debug("fd = %d\r\n",fd); + if (fd == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi SPI_LSB_FIRST\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Sets the SPI Bus Mode +parameter: +Info: + Order: + SPI_3WIRE_Mode + SPI_4WIRE_Mode + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_SetBusMode(BusMode mode) +{ + if(mode == SPI_3WIRE_Mode){ + hardware_SPI.mode |= SPI_3WIRE; + }else if(mode == SPI_4WIRE_Mode){ + hardware_SPI.mode &= ~SPI_3WIRE; + } + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: + Time interval after transmission of one byte during continuous transmission +parameter: + us : Interval time (us) +Info: +******************************************************************************/ +void DEV_HARDWARE_SPI_SetDataInterval(uint16_t us) +{ + hardware_SPI.delay = us; + tr.delay_usecs = hardware_SPI.delay; +} + +/****************************************************************************** +function: SPI port sends one byte of data +parameter: + buf : Sent data +Info: +******************************************************************************/ +uint8_t DEV_HARDWARE_SPI_TransferByte(uint8_t buf) +{ + uint8_t rbuf[1]; + tr.len = 1; + tr.tx_buf = (unsigned long)&buf; + tr.rx_buf = (unsigned long)rbuf; + + //ioctl Operation, transmission of data + if ( ioctl(hardware_SPI.fd, SPI_IOC_MESSAGE(1), &tr) < 1 ) + DEV_HARDWARE_SPI_Debug("can't send spi message\r\n"); + return rbuf[0]; +} + +/****************************************************************************** +function: The SPI port reads a byte +parameter: +Info: Return read data +******************************************************************************/ +int DEV_HARDWARE_SPI_Transfer(uint8_t *buf, uint32_t len) +{ + tr.len = len; + tr.tx_buf = (unsigned long)buf; + tr.rx_buf = (unsigned long)buf; + + //ioctl Operation, transmission of data + if (ioctl(hardware_SPI.fd, SPI_IOC_MESSAGE(1), &tr) < 1 ){ + DEV_HARDWARE_SPI_Debug("can't send spi message\r\n"); + return -1; + } + + return 1; +} + diff --git a/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.h b/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.h new file mode 100755 index 00000000..b22d195a --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.h @@ -0,0 +1,120 @@ +/***************************************************************************** +* | File : dev_hardware_SPI.h +* | Author : Waveshare team +* | Function : Read and write /dev/SPI, hardware SPI +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-26 +* | Info : Basic version +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef __DEV_HARDWARE_SPI_ +#define __DEV_HARDWARE_SPI_ + +#include + +#define DEV_HARDWARE_SPI_DEBUG 0 +#if DEV_HARDWARE_SPI_DEBUG +#define DEV_HARDWARE_SPI_Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) +#else +#define DEV_HARDWARE_SPI_Debug(__info,...) +#endif + +#define SPI_CPHA 0x01 +#define SPI_CPOL 0x02 +#define SPI_MODE_0 (0|0) +#define SPI_MODE_1 (0|SPI_CPHA) +#define SPI_MODE_2 (SPI_CPOL|0) +#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) + +typedef enum{ + SPI_MODE0 = SPI_MODE_0, /*!< CPOL = 0, CPHA = 0 */ + SPI_MODE1 = SPI_MODE_1, /*!< CPOL = 0, CPHA = 1 */ + SPI_MODE2 = SPI_MODE_2, /*!< CPOL = 1, CPHA = 0 */ + SPI_MODE3 = SPI_MODE_3 /*!< CPOL = 1, CPHA = 1 */ +}SPIMode; + +typedef enum{ + DISABLE = 0, + ENABLE = 1 +}SPICSEN; + +typedef enum{ + SPI_CS_Mode_LOW = 0, /*!< Chip Select 0 */ + SPI_CS_Mode_HIGH = 1, /*!< Chip Select 1 */ + SPI_CS_Mode_NONE = 3 /*!< No CS, control it yourself */ +}SPIChipSelect; + +typedef enum +{ + SPI_BIT_ORDER_LSBFIRST = 0, /*!< LSB First */ + SPI_BIT_ORDER_MSBFIRST = 1 /*!< MSB First */ +}SPIBitOrder; + +typedef enum +{ + SPI_3WIRE_Mode = 0, + SPI_4WIRE_Mode = 1 +}BusMode; + + +/** + * Define SPI attribute +**/ +typedef struct SPIStruct { + //GPIO + uint16_t SCLK_PIN; + uint16_t MOSI_PIN; + uint16_t MISO_PIN; + + uint16_t CS0_PIN; + uint16_t CS1_PIN; + + + uint32_t speed; + uint16_t mode; + uint16_t delay; + int fd; // +} HARDWARE_SPI; + + + + +void DEV_HARDWARE_SPI_begin(char *SPI_device); +void DEV_HARDWARE_SPI_beginSet(char *SPI_device, SPIMode mode, uint32_t speed); +void DEV_HARDWARE_SPI_end(void); + +int DEV_HARDWARE_SPI_setSpeed(uint32_t speed); + +uint8_t DEV_HARDWARE_SPI_TransferByte(uint8_t buf); +int DEV_HARDWARE_SPI_Transfer(uint8_t *buf, uint32_t len); + +void DEV_HARDWARE_SPI_SetDataInterval(uint16_t us); +int DEV_HARDWARE_SPI_SetBusMode(BusMode mode); +int DEV_HARDWARE_SPI_SetBitOrder(SPIBitOrder Order); +int DEV_HARDWARE_SPI_ChipSelect(SPIChipSelect CS_Mode); +int DEV_HARDWARE_SPI_CSEN(SPICSEN EN); +int DEV_HARDWARE_SPI_Mode(SPIMode mode); + + +#endif \ No newline at end of file diff --git a/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.c b/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.c new file mode 100755 index 00000000..ffd9658e --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.c @@ -0,0 +1,204 @@ +/***************************************************************************** +* | File : sysfs_software_spi.h +* | Author : Waveshare team +* | Function : Read and write /sys/class/gpio, software spi +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-05 +* | Info : Basic version +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# Read_data OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "sysfs_software_spi.h" + +SOFTWARE_SPI software_spi; + +/****************************************************************************** +function: +parameter: +Info: +******************************************************************************/ +void SYSFS_software_spi_begin(void) +{ + // gpio + software_spi.SCLK_PIN = SPI0_SCK; + software_spi.MOSI_PIN = SPI0_MOSI; + software_spi.MISO_PIN = SPI0_MISO; + + //software spi configure + software_spi.Mode = SOFTWARE_SPI_Mode0; + software_spi.Type = SOFTWARE_SPI_Master; + software_spi.Delay = SOFTWARE_SPI_CLOCK_DIV2; + software_spi.Order = SOFTWARE_SPI_MSBFIRST; // MSBFIRST + + SYSFS_GPIO_Export(software_spi.SCLK_PIN); + SYSFS_GPIO_Export(software_spi.MOSI_PIN); + SYSFS_GPIO_Export(software_spi.MISO_PIN); + + SYSFS_GPIO_Direction(software_spi.SCLK_PIN, OUT); + SYSFS_GPIO_Direction(software_spi.MOSI_PIN, OUT); + SYSFS_GPIO_Direction(software_spi.MISO_PIN, IN); +} + +void SYSFS_software_spi_end(void) +{ + SYSFS_GPIO_Write(software_spi.SCLK_PIN, LOW); + SYSFS_GPIO_Write(software_spi.MOSI_PIN, LOW); + + SYSFS_GPIO_Unexport(software_spi.SCLK_PIN); + SYSFS_GPIO_Unexport(software_spi.MOSI_PIN); +} + +void SYSFS_software_spi_setBitOrder(uint8_t order) +{ + software_spi.Order = order & 1; +} + +void SYSFS_software_spi_setDataMode(uint8_t mode) +{ + if(mode > 4) { + SYSFS_SOFTWARE_SPI_Debug("MODE must be 0-3\r\n"); + return; + } + software_spi.Mode = mode; + + switch (software_spi.Mode) { + case SOFTWARE_SPI_Mode0: + software_spi.CPOL = 0; + software_spi.CPHA = 0; + break; + case SOFTWARE_SPI_Mode1: + software_spi.CPOL = 0; + software_spi.CPHA = 1; + break; + case SOFTWARE_SPI_Mode2: + software_spi.CPOL = 1; + software_spi.CPHA = 0; + break; + case SOFTWARE_SPI_Mode3: + software_spi.CPOL = 1; + software_spi.CPHA = 1; + break; + } +} + +void SYSFS_software_spi_setClockDivider(uint8_t div) +{ + if(div > 8) { + SYSFS_SOFTWARE_SPI_Debug("div must be 0-7\r\n"); + return; + } + switch (div) { + case SOFTWARE_SPI_CLOCK_DIV2: + software_spi.Delay = 2; + break; + case SOFTWARE_SPI_CLOCK_DIV4: + software_spi.Delay = 4; + break; + case SOFTWARE_SPI_CLOCK_DIV8: + software_spi.Delay = 8; + break; + case SOFTWARE_SPI_CLOCK_DIV16: + software_spi.Delay = 16; + break; + case SOFTWARE_SPI_CLOCK_DIV32: + software_spi.Delay = 32; + break; + case SOFTWARE_SPI_CLOCK_DIV64: + software_spi.Delay = 64; + break; + case SOFTWARE_SPI_CLOCK_DIV128: + software_spi.Delay = 128; + break; + default: + software_spi.Delay = 128; + break; + } +} + +/****************************************************************************** +function: SPI Mode 0 +parameter: +Info: +******************************************************************************/ +uint8_t SYSFS_software_spi_transfer(uint8_t value) +{ + // printf("value = %d\r\n", value); + uint8_t Read_data; + if (software_spi.Order == SOFTWARE_SPI_LSBFIRST) { + uint8_t temp = + ((value & 0x01) << 7) | + ((value & 0x02) << 5) | + ((value & 0x04) << 3) | + ((value & 0x08) << 1) | + ((value & 0x10) >> 1) | + ((value & 0x20) >> 3) | + ((value & 0x40) >> 5) | + ((value & 0x80) >> 7); + value = temp; + } + + uint8_t delay = software_spi.Delay >> 1; + for(int j=delay; j > 0; j--); + + // printf("value = %d\r\n", value); + uint8_t Read_miso = 0; + + SYSFS_GPIO_Write(software_spi.SCLK_PIN, 0); + for (uint8_t bit = 0; bit < 8; bit++) { + SYSFS_GPIO_Write(software_spi.SCLK_PIN, 0); + // for(int j=delay; j > 0; j--);// DELAY + + if (software_spi.CPHA) { + Read_miso = SYSFS_GPIO_Read(software_spi.MISO_PIN); + if (software_spi.Order == SOFTWARE_SPI_LSBFIRST) { + Read_data <<= 1; + Read_data |= Read_miso; + } else { + Read_data >>= 1; + Read_data |= Read_miso << 7; + } + } else { + SYSFS_GPIO_Write(software_spi.MOSI_PIN, ((value< 0; j--);// DELAY + SYSFS_GPIO_Write(software_spi.SCLK_PIN, 1); + // for(int j=delay; j > 0; j--);// DELAY + + if (software_spi.CPHA) { + SYSFS_GPIO_Write(software_spi.MOSI_PIN, ((value<>= 1; + Read_data |= Read_miso << 7; + } + } + + // for(int j=delay; j > 0; j--);// DELAY + } + return Read_data; +} diff --git a/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.h b/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.h new file mode 100755 index 00000000..3f36463d --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.h @@ -0,0 +1,111 @@ +/***************************************************************************** +* | File : sysfs_software_spi.h +* | Author : Waveshare team +* | Function : Read and write /sys/class/gpio, software spi +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-05 +* | Info : Basic version +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef __SYSFS_SOFTWARE_SPI_ +#define __SYSFS_SOFTWARE_SPI_ + +#include "sysfs_gpio.h" +#include +#include + +#define SYSFS_SOFTWARE_SPI_DEBUG 1 +#if SYSFS_SOFTWARE_SPI_DEBUG +#define SYSFS_SOFTWARE_SPI_Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) +#else +#define SYSFS_SOFTWARE_SPI_Debug(__info,...) +#endif + +/** + * SPI communication mode +**/ +typedef enum { + SOFTWARE_SPI_Mode0, /* Clock Polarity is 0 and Clock Phase is 0 */ + SOFTWARE_SPI_Mode1, /* Clock Polarity is 0 and Clock Phase is 1 */ + SOFTWARE_SPI_Mode2, /* Clock Polarity is 1 and Clock Phase is 0 */ + SOFTWARE_SPI_Mode3, /* Clock Polarity is 1 and Clock Phase is 1 */ +} SOFTWARE_SPI_Mode; + +/** + * SPI clock(div) +**/ +typedef enum { + SOFTWARE_SPI_CLOCK_DIV2, + SOFTWARE_SPI_CLOCK_DIV4, + SOFTWARE_SPI_CLOCK_DIV8, + SOFTWARE_SPI_CLOCK_DIV16, + SOFTWARE_SPI_CLOCK_DIV32, + SOFTWARE_SPI_CLOCK_DIV64, + SOFTWARE_SPI_CLOCK_DIV128, +} SOFTWARE_SPI_Clock; + +/** + * Define SPI type +**/ +typedef enum { + SOFTWARE_SPI_Master, + SOFTWARE_SPI_Slave, +} SOFTWARE_SPI_Type; + +/** + * Define SPI order +**/ +typedef enum { + SOFTWARE_SPI_LSBFIRST, + SOFTWARE_SPI_MSBFIRST, +} SOFTWARE_SPI_Order; + +/** + * Define SPI attribute +**/ +typedef struct SPIStruct { + //GPIO + uint16_t SCLK_PIN; + uint16_t MOSI_PIN; + uint16_t MISO_PIN; + uint16_t CS_PIN; + + //Mode + SOFTWARE_SPI_Mode Mode; + uint8_t CPOL; + uint8_t CPHA; + + SOFTWARE_SPI_Clock Delay; + SOFTWARE_SPI_Type Type; + SOFTWARE_SPI_Order Order; +} SOFTWARE_SPI; + +void SYSFS_software_spi_begin(void); +void SYSFS_software_spi_end(void); +void SYSFS_software_spi_setBitOrder(uint8_t order); +void SYSFS_software_spi_setDataMode(uint8_t mode); +void SYSFS_software_spi_setClockDivider(uint8_t div); +uint8_t SYSFS_software_spi_transfer(uint8_t value); + +#endif \ No newline at end of file diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font12.c b/display_app/2in15_e-Paper_B/lib/Fonts/font12.c new file mode 100755 index 00000000..485c3f01 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Fonts/font12.c @@ -0,0 +1,1384 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font12_Table[] = +{ + // @0 ' ' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @12 '!' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @24 '"' (7 pixels wide) + 0x00, // + 0x6C, // ## ## + 0x48, // # # + 0x48, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @36 '#' (7 pixels wide) + 0x00, // + 0x14, // # # + 0x14, // # # + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + + // @48 '$' (7 pixels wide) + 0x00, // + 0x10, // # + 0x38, // ### + 0x40, // # + 0x40, // # + 0x38, // ### + 0x48, // # # + 0x70, // ### + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @60 '%' (7 pixels wide) + 0x00, // + 0x20, // # + 0x50, // # # + 0x20, // # + 0x0C, // ## + 0x70, // ### + 0x08, // # + 0x14, // # # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + + // @72 '&' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x20, // # + 0x20, // # + 0x54, // # # # + 0x48, // # # + 0x34, // ## # + 0x00, // + 0x00, // + 0x00, // + + // @84 ''' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @96 '(' (7 pixels wide) + 0x00, // + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x00, // + + // @108 ')' (7 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @120 '*' (7 pixels wide) + 0x00, // + 0x10, // # + 0x7C, // ##### + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @132 '+' (7 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0xFE, // ####### + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @144 ',' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x10, // # + 0x30, // ## + 0x20, // # + 0x00, // + + // @156 '-' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @168 '.' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @180 '/' (7 pixels wide) + 0x00, // + 0x04, // # + 0x04, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @192 '0' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @204 '1' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @216 '2' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @228 '3' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x18, // ## + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @240 '4' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x14, // # # + 0x14, // # # + 0x24, // # # + 0x44, // # # + 0x7E, // ###### + 0x04, // # + 0x0E, // ### + 0x00, // + 0x00, // + 0x00, // + + // @252 '5' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x20, // # + 0x20, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @264 '6' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x40, // # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @276 '7' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @288 '8' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @300 '9' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x08, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @312 ':' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @324 ';' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x18, // ## + 0x00, // + 0x00, // + 0x18, // ## + 0x30, // ## + 0x20, // # + 0x00, // + 0x00, // + + // @336 '<' (7 pixels wide) + 0x00, // + 0x00, // + 0x0C, // ## + 0x10, // # + 0x60, // ## + 0x80, // # + 0x60, // ## + 0x10, // # + 0x0C, // ## + 0x00, // + 0x00, // + 0x00, // + + // @348 '=' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @360 '>' (7 pixels wide) + 0x00, // + 0x00, // + 0xC0, // ## + 0x20, // # + 0x18, // ## + 0x04, // # + 0x18, // ## + 0x20, // # + 0xC0, // ## + 0x00, // + 0x00, // + 0x00, // + + // @372 '?' (7 pixels wide) + 0x00, // + 0x00, // + 0x18, // ## + 0x24, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x00, // + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @384 '@' (7 pixels wide) + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @396 'A' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x7C, // ##### + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @408 'B' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @420 'C' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @432 'D' (7 pixels wide) + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + 0x00, // + + // @444 'E' (7 pixels wide) + 0x00, // + 0xFC, // ###### + 0x44, // # # + 0x50, // # # + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x44, // # # + 0xFC, // ###### + 0x00, // + 0x00, // + 0x00, // + + // @456 'F' (7 pixels wide) + 0x00, // + 0x7E, // ###### + 0x22, // # # + 0x28, // # # + 0x38, // ### + 0x28, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @468 'G' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x4E, // # ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @480 'H' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x7C, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @492 'I' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @504 'J' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @516 'K' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x48, // # # + 0x50, // # # + 0x70, // ### + 0x48, // # # + 0x44, // # # + 0xE6, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @528 'L' (7 pixels wide) + 0x00, // + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x24, // # # + 0x24, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @540 'M' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x6C, // ## ## + 0x6C, // ## ## + 0x54, // # # # + 0x54, // # # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @552 'N' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x64, // ## # + 0x64, // ## # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0xEC, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @564 'O' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @576 'P' (7 pixels wide) + 0x00, // + 0x78, // #### + 0x24, // # # + 0x24, // # # + 0x24, // # # + 0x38, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @588 'Q' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x1C, // ### + 0x00, // + 0x00, // + + // @600 'R' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x48, // # # + 0x44, // # # + 0xE2, // ### # + 0x00, // + 0x00, // + 0x00, // + + // @612 'S' (7 pixels wide) + 0x00, // + 0x34, // ## # + 0x4C, // # ## + 0x40, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x64, // ## # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + + // @624 'T' (7 pixels wide) + 0x00, // + 0xFE, // ####### + 0x92, // # # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @636 'U' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @648 'V' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @660 'W' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @672 'X' (7 pixels wide) + 0x00, // + 0xC6, // ## ## + 0x44, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0xC6, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @684 'Y' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @696 'Z' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @708 '[' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x38, // ### + 0x00, // + + // @720 '\' (7 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x00, // + 0x00, // + + // @732 ']' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x38, // ### + 0x00, // + + // @744 '^' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @756 '_' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xFE, // ####### + + // @768 '`' (7 pixels wide) + 0x00, // + 0x10, // # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @780 'a' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x3C, // #### + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @792 'b' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @804 'c' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @816 'd' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x04, // # + 0x34, // ## # + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @828 'e' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x7C, // ##### + 0x40, // # + 0x40, // # + 0x3C, // #### + 0x00, // + 0x00, // + 0x00, // + + // @840 'f' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @852 'g' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x38, // ### + 0x00, // + + // @864 'h' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @876 'i' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @888 'j' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x78, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x70, // ### + 0x00, // + + // @900 'k' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x5C, // # ### + 0x48, // # # + 0x70, // ### + 0x50, // # # + 0x48, // # # + 0xDC, // ## ### + 0x00, // + 0x00, // + 0x00, // + + // @912 'l' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @924 'm' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xE8, // ### # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0xFE, // ####### + 0x00, // + 0x00, // + 0x00, // + + // @936 'n' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @948 'o' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @960 'p' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x40, // # + 0xE0, // ### + 0x00, // + + // @972 'q' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x0E, // ### + 0x00, // + + // @984 'r' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x6C, // ## ## + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @996 's' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x38, // ### + 0x04, // # + 0x44, // # # + 0x78, // #### + 0x00, // + 0x00, // + 0x00, // + + // @1008 't' (7 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x22, // # # + 0x1C, // ### + 0x00, // + 0x00, // + 0x00, // + + // @1020 'u' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x36, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1032 'v' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @1044 'w' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @1056 'x' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0xCC, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1068 'y' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x24, // # # + 0x28, // # # + 0x18, // ## + 0x10, // # + 0x10, // # + 0x78, // #### + 0x00, // + + // @1080 'z' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @1092 '{' (7 pixels wide) + 0x00, // + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x00, // + + // @1104 '|' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @1116 '}' (7 pixels wide) + 0x00, // + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x00, // + + // @1128 '~' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x24, // # # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font12 = { + Font12_Table, + 7, /* Width */ + 12, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font12CN.c b/display_app/2in15_e-Paper_B/lib/Fonts/font12CN.c new file mode 100755 index 00000000..cf29da26 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Fonts/font12CN.c @@ -0,0 +1,120 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + + +// +// Font data for Courier New 12pt +// + +const CH_CN Font12CN_Table[] = +{ +/*-- ÎÄ×Ö: Äã --*/ +/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ +{{"Äã"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0xC0,0x1D,0x80,0x3B,0xFF,0x3B,0x07, +0x3F,0x77,0x7E,0x76,0xF8,0x70,0xFB,0xFE,0xFB,0xFE,0x3F,0x77,0x3F,0x77,0x3E,0x73, +0x38,0x70,0x38,0x70,0x3B,0xE0,0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ºÃ --*/ +/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ +{{"ºÃ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x73,0xFF,0x70,0x0F,0xFE,0x1E, +0x7E,0x3C,0x6E,0x38,0xEE,0x30,0xEF,0xFF,0xFC,0x30,0x7C,0x30,0x38,0x30,0x3E,0x30, +0x7E,0x30,0xE0,0x30,0xC1,0xF0,0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: Ê÷ --*/ +/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ +{{"Ê÷"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0E,0x30,0x0E,0x3F,0xEE,0x30,0xEE, +0xFC,0xFF,0x76,0xCE,0x77,0xFE,0x7B,0xFE,0xFF,0xFE,0xF3,0xDE,0xF3,0xCE,0x37,0xEE, +0x3E,0x6E,0x3C,0x0E,0x30,0x3E,0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: Ý® --*/ +/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ +{{"Ý®"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x70,0xFF,0xFF,0x3E,0x70,0x38,0x00, +0x7F,0xFF,0xE0,0x00,0xFF,0xFC,0x3B,0x8C,0x39,0xCC,0xFF,0xFF,0x73,0x9C,0x71,0xDC, +0x7F,0xFF,0x00,0x1C,0x01,0xF8,0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ÅÉ --*/ +/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ +{{"ÅÉ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0xFF,0xF0,0x3E,0x00,0x0E,0x1F, +0xCF,0xFB,0xFF,0xF8,0x3F,0xFF,0x0F,0xFF,0x7F,0xD8,0x7F,0xDC,0x6F,0xCE,0xED,0xFF, +0xFD,0xF7,0xF9,0xC0,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: a --*/ +/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ +{{"a"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3E,0x00,0x67,0x00,0x07,0x80,0x0F,0x80,0x7F,0x80,0xE3,0x80,0xE7,0x80,0xE7,0x80, +0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: b --*/ +/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ +{{"b"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00, +0x7F,0x00,0x7B,0x80,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x7B,0x80, +0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: c --*/ +/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ +{{"c"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3F,0x00,0x73,0x00,0xF0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xF0,0x00,0x73,0x00, +0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: A --*/ +/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ +{{"A"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x1F,0x00,0x1F,0x00, +0x1F,0x00,0x3B,0x80,0x3B,0x80,0x71,0x80,0x7F,0xC0,0x71,0xC0,0xE0,0xE0,0xE0,0xE0, +0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +}; + +cFONT Font12CN = { + Font12CN_Table, + sizeof(Font12CN_Table)/sizeof(CH_CN), /*size of table*/ + 11, /* ASCII Width */ + 16, /* Width */ + 21, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font16.c b/display_app/2in15_e-Paper_B/lib/Fonts/font16.c new file mode 100755 index 00000000..58ce59b7 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Fonts/font16.c @@ -0,0 +1,1764 @@ +/** + ****************************************************************************** + * @file font16.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font16 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font16_Table[] = +{ + // @0 ' ' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @32 '!' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @64 '"' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @96 '#' (11 pixels wide) + 0x00, 0x00, // + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @128 '$' (11 pixels wide) + 0x04, 0x00, // # + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1E, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '%' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x00, // # # + 0x24, 0x00, // # # + 0x18, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x1E, 0x00, // #### + 0x31, 0x80, // ## ## + 0x02, 0x40, // # # + 0x02, 0x40, // # # + 0x01, 0x80, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @192 '&' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x1D, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x33, 0x00, // ## ## + 0x1D, 0x80, // ### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @224 ''' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @256 '(' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0E, 0x00, // ### + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @288 ')' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '*' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x0F, 0x00, // #### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @352 '+' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x3F, 0x80, // ####### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @384 ',' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + + // @416 '-' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @448 '.' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 '/' (11 pixels wide) + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @512 '0' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @544 '1' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x3E, 0x00, // ##### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @576 '2' (11 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x19, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @608 '3' (11 pixels wide) + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x61, 0x80, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x61, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '4' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0F, 0x00, // #### + 0x0B, 0x00, // # ## + 0x1B, 0x00, // ## ## + 0x13, 0x00, // # ## + 0x33, 0x00, // ## ## + 0x3F, 0x80, // ####### + 0x03, 0x00, // ## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @672 '5' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x11, 0x80, // # ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x21, 0x80, // # ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @704 '6' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @736 '7' (11 pixels wide) + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x43, 0x00, // # ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @768 '8' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '9' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x3C, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @832 ':' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @864 ';' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @896 '<' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @928 '=' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '>' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @992 '?' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x01, 0x80, // ## + 0x07, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1024 '@' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x11, 0x00, // # # + 0x21, 0x00, // # # + 0x21, 0x00, // # # + 0x27, 0x00, // # ### + 0x29, 0x00, // # # # + 0x29, 0x00, // # # # + 0x27, 0x00, // # ### + 0x20, 0x00, // # + 0x11, 0x00, // # # + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1056 'A' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x0F, 0x00, // #### + 0x09, 0x00, // # # + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x79, 0xE0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1088 'B' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 'C' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x40, // ##### # + 0x30, 0xC0, // ## ## + 0x60, 0x40, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x40, // ## # + 0x30, 0x80, // ## # + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1152 'D' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1184 'E' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1216 'F' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x30, 0x40, // ## # + 0x30, 0x40, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1248 'G' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x67, 0xC0, // ## ##### + 0x61, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 'H' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x80, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1312 'I' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1344 'J' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1376 'K' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x33, 0x00, // ## ## + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x79, 0xC0, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1408 'L' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0x00, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'M' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xE0, 0xE0, // ### ### + 0x60, 0xC0, // ## ## + 0x71, 0xC0, // ### ### + 0x7B, 0xC0, // #### #### + 0x6A, 0xC0, // ## # # ## + 0x6E, 0xC0, // ## ### ## + 0x64, 0xC0, // ## # ## + 0x60, 0xC0, // ## ## + 0xFB, 0xE0, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1472 'N' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0xC0, // ### #### + 0x31, 0x80, // ## ## + 0x39, 0x80, // ### ## + 0x3D, 0x80, // #### ## + 0x35, 0x80, // ## # ## + 0x37, 0x80, // ## #### + 0x33, 0x80, // ## ### + 0x31, 0x80, // ## ## + 0x79, 0x80, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1504 'O' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1536 'P' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7E, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1568 'Q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x0C, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'R' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7C, 0xE0, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1632 'S' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1664 'T' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1696 'U' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1728 'V' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0A, 0x00, // # # + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'W' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xFB, 0xE0, // ##### ##### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x6E, 0xC0, // ## ### ## + 0x2A, 0x80, // # # # # + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1792 'X' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1824 'Y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1856 'Z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x23, 0x00, // # ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x18, 0x80, // ## # + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1888 '[' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 '\' (11 pixels wide) + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1952 ']' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1984 '^' (11 pixels wide) + 0x04, 0x00, // # + 0x0A, 0x00, // # # + 0x0A, 0x00, // # # + 0x11, 0x00, // # # + 0x20, 0x80, // # # + 0x20, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2016 '_' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 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, 0xE0, // ########### + + // @2048 '`' (11 pixels wide) + 0x08, 0x00, // # + 0x04, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'a' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2112 'b' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x77, 0x00, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2144 'c' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x80, // ## # + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2176 'd' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1D, 0x80, // ### ## + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2208 'e' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x7F, 0xC0, // ######### + 0x60, 0x00, // ## + 0x30, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'f' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2272 'g' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2304 'h' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2336 'i' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2368 'j' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 'k' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3C, 0x00, // #### + 0x36, 0x00, // ## ## + 0x33, 0x00, // ## ## + 0x77, 0xC0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2432 'l' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2464 'm' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x76, 0xE0, // ### ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2496 'n' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2528 'o' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2560 'p' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2592 'q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2624 'r' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0x80, // #### ### + 0x1C, 0xC0, // ### ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2656 's' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x3C, 0x00, // #### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2688 't' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x80, // ## # + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'u' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2752 'v' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2784 'w' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xF1, 0xE0, // #### #### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2816 'x' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2848 'y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0B, 0x00, // # ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x03, 0x00, // ## + 0x0E, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2912 '{' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2944 '|' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2976 '}' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3008 '~' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x80, // # # # + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + +sFONT Font16 = { + Font16_Table, + 11, /* Width */ + 16, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font20.c b/display_app/2in15_e-Paper_B/lib/Fonts/font20.c new file mode 100755 index 00000000..697e3edd --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Fonts/font20.c @@ -0,0 +1,2142 @@ +/** + ****************************************************************************** + * @file font20.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font20 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// Character bitmaps for Courier New 15pt +const uint8_t Font20_Table[] = +{ + // @0 ' ' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @40 '!' (14 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @80 '"' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @120 '#' (14 pixels wide) + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '$' (14 pixels wide) + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0xE0, // ###### + 0x0F, 0xE0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x0F, 0xC0, // ###### + 0x00, 0xE0, // ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xC0, // ####### + 0x1F, 0x80, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @200 '%' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x1C, 0x60, // ### ## + 0x01, 0xE0, // #### + 0x0F, 0x80, // ##### + 0x3C, 0x00, // #### + 0x31, 0xC0, // ## ### + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @240 '&' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x0F, 0x30, // #### ## + 0x1F, 0xF0, // ######### + 0x19, 0xE0, // ## #### + 0x18, 0xC0, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @280 ''' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '(' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @360 ')' (14 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @400 '*' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1B, 0x60, // ## ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @440 '+' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 ',' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @520 '-' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @560 '.' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @600 '/' (14 pixels wide) + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '0' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @680 '1' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @720 '2' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @760 '3' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x3F, 0xC0, // ######## + 0x30, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0xE0, // ### + 0x07, 0xC0, // ##### + 0x07, 0xC0, // ##### + 0x00, 0xE0, // ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x60, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '4' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0xC0, // ## + 0x03, 0xE0, // ##### + 0x03, 0xE0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @840 '5' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x80, // ###### + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @880 '6' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x1E, 0x00, // #### + 0x18, 0x00, // ## + 0x38, 0x00, // ### + 0x37, 0x80, // ## #### + 0x3F, 0xC0, // ######## + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @920 '7' (14 pixels wide) + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '8' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1000 '9' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x1F, 0xC0, // ####### + 0x38, 0xC0, // ### ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xE0, // ######## + 0x0F, 0x60, // #### ## + 0x00, 0xE0, // ### + 0x00, 0xC0, // ## + 0x03, 0xC0, // #### + 0x3F, 0x80, // ####### + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1040 ':' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1080 ';' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 '<' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x30, // ## + 0x00, 0xF0, // #### + 0x03, 0xC0, // #### + 0x07, 0x00, // ### + 0x1C, 0x00, // ### + 0x78, 0x00, // #### + 0x1C, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0xC0, // #### + 0x00, 0xF0, // #### + 0x00, 0x30, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1160 '=' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1200 '>' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x30, 0x00, // ## + 0x3C, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x00, 0xE0, // ### + 0x00, 0x78, // #### + 0x00, 0xE0, // ### + 0x03, 0x80, // ### + 0x0F, 0x00, // #### + 0x3C, 0x00, // #### + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1240 '?' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x00, 0x60, // ## + 0x01, 0xC0, // ### + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 '@' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x0C, 0x80, // ## # + 0x08, 0x40, // # # + 0x10, 0x40, // # # + 0x10, 0x40, // # # + 0x11, 0xC0, // # ### + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x11, 0xC0, // # ### + 0x10, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x40, // # # + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1320 'A' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x03, 0x80, // ### + 0x06, 0xC0, // ## ## + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x30, 0x30, // ## ## + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1360 'B' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x3F, 0xC0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x1F, 0xE0, // ######## + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1400 'C' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x1C, 0x70, // ### ### + 0x38, 0x30, // ### ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1C, 0x70, // ### ### + 0x0F, 0xE0, // ####### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'D' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x7F, 0xC0, // ######### + 0x30, 0xE0, // ## ### + 0x30, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x70, // ## ### + 0x30, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1480 'E' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1520 'F' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1560 'G' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x31, 0xF8, // ## ###### + 0x31, 0xF8, // ## ###### + 0x30, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'H' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1640 'I' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1680 'J' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xF8, // ####### + 0x03, 0xF8, // ####### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1720 'K' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3E, 0xF8, // ##### ##### + 0x3E, 0xF8, // ##### ##### + 0x18, 0xE0, // ## ### + 0x19, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1F, 0x00, // ##### + 0x1D, 0x80, // ### ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0x60, // ## ## + 0x3E, 0x78, // ##### #### + 0x3E, 0x38, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'L' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1800 'M' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x38, 0x70, // ### ### + 0x3C, 0xF0, // #### #### + 0x34, 0xB0, // ## # # ## + 0x37, 0xB0, // ## #### ## + 0x37, 0xB0, // ## #### ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x30, 0x30, // ## ## + 0x7C, 0xF8, // ##### ##### + 0x7C, 0xF8, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1840 'N' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x39, 0xF0, // ### ##### + 0x3D, 0xF0, // #### ##### + 0x1C, 0x60, // ### ## + 0x1E, 0x60, // #### ## + 0x1E, 0x60, // #### ## + 0x1B, 0x60, // ## ## ## + 0x1B, 0x60, // ## ## ## + 0x19, 0xE0, // ## #### + 0x19, 0xE0, // ## #### + 0x18, 0xE0, // ## ### + 0x3E, 0xE0, // ##### ### + 0x3E, 0x60, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1880 'O' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 'P' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1960 'Q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x0C, 0xE0, // ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2000 'R' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x18, 0x60, // ## ## + 0x18, 0x70, // ## ### + 0x3E, 0x38, // ##### ### + 0x3E, 0x18, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2040 'S' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xB0, // ##### ## + 0x1F, 0xF0, // ######### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x80, // ###### + 0x07, 0xE0, // ###### + 0x00, 0x70, // ### + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x3F, 0xE0, // ######### + 0x37, 0xC0, // ## ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'T' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2120 'U' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2160 'V' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2200 'W' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7C, 0x7C, // ##### ##### + 0x7C, 0x7C, // ##### ##### + 0x30, 0x18, // ## ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x36, 0xD8, // ## ## ## ## + 0x16, 0xD0, // # ## ## # + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x18, 0x30, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'X' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2280 'Y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2320 'Z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2360 '[' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 '\' (14 pixels wide) + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2440 ']' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2480 '^' (14 pixels wide) + 0x00, 0x00, // + 0x02, 0x00, // # + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x20, 0x20, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2520 '_' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 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, 0xFC, // ############## + 0xFF, 0xFC, // ############## + + // @2560 '`' (14 pixels wide) + 0x00, 0x00, // + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0x80, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2600 'a' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xC0, // ###### + 0x1F, 0xE0, // ######## + 0x00, 0x60, // ## + 0x0F, 0xE0, // ####### + 0x1F, 0xE0, // ######## + 0x38, 0x60, // ### ## + 0x30, 0xE0, // ## ### + 0x3F, 0xF0, // ########## + 0x1F, 0x70, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2640 'b' (14 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x3F, 0xE0, // ######### + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x7F, 0xE0, // ########## + 0x77, 0x80, // ### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2680 'c' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1F, 0xF0, // ######### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'd' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x70, // ### + 0x00, 0x70, // ### + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1F, 0xF8, // ########## + 0x07, 0xB8, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2760 'e' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x30, 0x00, // ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2800 'f' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xF0, // ###### + 0x07, 0xF0, // ####### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2840 'g' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x70, // ### + 0x0F, 0xE0, // ####### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'h' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xC0, // ## #### + 0x1F, 0xE0, // ######## + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2920 'i' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2960 'j' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0xC0, // ### + 0x3F, 0x80, // ####### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3000 'k' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xE0, // ## ##### + 0x1B, 0xE0, // ## ##### + 0x1B, 0x00, // ## ## + 0x1E, 0x00, // #### + 0x1E, 0x00, // #### + 0x1B, 0x00, // ## ## + 0x19, 0x80, // ## ## + 0x39, 0xF0, // ### ##### + 0x39, 0xF0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3040 'l' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3080 'm' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0xE0, // ###### ### + 0x7F, 0xF0, // ########### + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x7B, 0xB8, // #### ### ### + 0x7B, 0xB8, // #### ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3120 'n' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3B, 0xC0, // ### #### + 0x3F, 0xE0, // ######### + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3160 'o' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3200 'p' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x80, // ### #### + 0x7F, 0xE0, // ########## + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x3F, 0xE0, // ######### + 0x37, 0x80, // ## #### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3240 'q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x00, 0xF8, // ##### + 0x00, 0xF8, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3280 'r' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xE0, // #### ### + 0x3D, 0xF0, // #### ##### + 0x0F, 0x30, // #### ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3320 's' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x1E, 0x00, // #### + 0x0F, 0xC0, // ###### + 0x01, 0xE0, // #### + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3360 't' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0F, 0xF0, // ######## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3400 'u' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x38, 0xE0, // ### ### + 0x38, 0xE0, // ### ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xF0, // ######### + 0x0F, 0x70, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3440 'v' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3480 'w' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x32, 0x60, // ## # ## + 0x32, 0x60, // ## # ## + 0x37, 0xE0, // ## ###### + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3520 'x' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x07, 0x80, // #### + 0x0C, 0xC0, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3560 'y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0F, 0x80, // ##### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x7F, 0x00, // ####### + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3600 'z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3640 '{' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x0E, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3680 '|' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3720 '}' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x00, // ### + 0x03, 0x80, // ### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x1C, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3760 '~' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x3F, 0x30, // ###### ## + 0x33, 0xF0, // ## ###### + 0x01, 0xE0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + + +sFONT Font20 = { + Font20_Table, + 14, /* Width */ + 20, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font24.c b/display_app/2in15_e-Paper_B/lib/Fonts/font24.c new file mode 100755 index 00000000..fea33212 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Fonts/font24.c @@ -0,0 +1,2520 @@ +/** + ****************************************************************************** + * @file font24.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font24 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +const uint8_t Font24_Table [] = +{ + // @0 ' ' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @72 '!' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @144 '"' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @216 '#' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @288 '$' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0xB0, 0x00, // #### ## + 0x0F, 0xF0, 0x00, // ######## + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x1C, 0x00, 0x00, // ### + 0x0F, 0x80, 0x00, // ##### + 0x07, 0xE0, 0x00, // ###### + 0x00, 0xF0, 0x00, // #### + 0x18, 0x30, 0x00, // ## ## + 0x1C, 0x30, 0x00, // ### ## + 0x1C, 0x70, 0x00, // ### ### + 0x1F, 0xE0, 0x00, // ######## + 0x1B, 0xC0, 0x00, // ## #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @360 '%' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x80, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x1C, 0xE0, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF0, 0x00, // ######### + 0x07, 0x38, 0x00, // ### ### + 0x06, 0x18, 0x00, // ## ## + 0x06, 0x18, 0x00, // ## ## + 0x07, 0x38, 0x00, // ### ### + 0x03, 0xF0, 0x00, // ###### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @432 '&' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xF0, 0x00, // ###### + 0x07, 0xF0, 0x00, // ####### + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x07, 0x00, 0x00, // ### + 0x0F, 0x9C, 0x00, // ##### ### + 0x1D, 0xFC, 0x00, // ### ####### + 0x18, 0xF0, 0x00, // ## #### + 0x18, 0x70, 0x00, // ## ### + 0x0F, 0xFC, 0x00, // ########## + 0x07, 0xDC, 0x00, // ##### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @504 ''' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @576 '(' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @648 ')' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x0F, 0x00, 0x00, // #### + 0x0E, 0x00, 0x00, // ### + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @720 '*' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1D, 0xB8, 0x00, // ### ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @792 '+' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @864 ',' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @936 '-' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1008 '.' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1080 '/' (17 pixels wide) + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1152 '0' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1224 '1' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x07, 0x80, 0x00, // #### + 0x1F, 0x80, 0x00, // ###### + 0x1D, 0x80, 0x00, // ### ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1296 '2' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1368 '3' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x70, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x70, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1440 '4' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x60, 0x00, // ## + 0x03, 0xF8, 0x00, // ####### + 0x03, 0xF8, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1512 '5' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x3F, 0xF0, 0x00, // ########## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1584 '6' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF8, 0x00, // ##### + 0x03, 0xF8, 0x00, // ####### + 0x07, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1656 '7' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1728 '8' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xE0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1800 '9' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xD8, 0x00, // #### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x1F, 0xC0, 0x00, // ####### + 0x1F, 0x00, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1872 ':' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1944 ';' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x02, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2016 '<' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x1C, 0x00, // ### + 0x00, 0x3C, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0xF0, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x3C, 0x00, // #### + 0x00, 0x1C, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2088 '=' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2160 '>' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x70, 0x00, 0x00, // ### + 0x78, 0x00, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x1E, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x70, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2232 '?' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xE0, 0x00, // ####### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x03, 0xC0, 0x00, // #### + 0x03, 0x80, 0x00, // ### + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2304 '@' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xE0, 0x00, // ##### + 0x07, 0xF0, 0x00, // ####### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x78, 0x00, // ## #### + 0x18, 0xF8, 0x00, // ## ##### + 0x19, 0xD8, 0x00, // ## ### ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x18, 0x00, // ### ## + 0x07, 0xF8, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2376 'A' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0xC0, 0x00, // ####### + 0x01, 0xC0, 0x00, // ### + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFC, 0x7F, 0x00, // ###### ####### + 0xFC, 0x7F, 0x00, // ###### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2448 'B' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x1C, 0x00, // ## ### + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF0, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2520 'C' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2592 'D' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xC0, 0x00, // ######### + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0xF0, 0x00, // ########### + 0x7F, 0xE0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2664 'E' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x19, 0x80, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2736 'F' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0xCC, 0x00, // ## ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0F, 0xC0, 0x00, // ###### + 0x0F, 0xC0, 0x00, // ###### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2808 'G' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xFC, 0x00, // ########## + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2880 'H' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2952 'I' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3024 'J' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xFE, 0x00, // ########## + 0x07, 0xFE, 0x00, // ########## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xE0, 0x00, // ######### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3096 'K' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x3E, 0x00, // ####### ##### + 0x7F, 0x3E, 0x00, // ####### ##### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1B, 0x80, 0x00, // ## ### + 0x1F, 0xC0, 0x00, // ####### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3168 'L' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x80, 0x00, // ######## + 0x7F, 0x80, 0x00, // ######## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3240 'M' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF0, 0x0F, 0x00, // #### #### + 0xF8, 0x1F, 0x00, // ##### ##### + 0x38, 0x1C, 0x00, // ### ### + 0x3C, 0x3C, 0x00, // #### #### + 0x3C, 0x3C, 0x00, // #### #### + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFE, 0x7F, 0x00, // ####### ####### + 0xFE, 0x7F, 0x00, // ####### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3312 'N' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0xFE, 0x00, // #### ####### + 0x78, 0xFE, 0x00, // #### ####### + 0x1C, 0x18, 0x00, // ### ## + 0x1E, 0x18, 0x00, // #### ## + 0x1F, 0x18, 0x00, // ##### ## + 0x1B, 0x18, 0x00, // ## ## ## + 0x1B, 0x98, 0x00, // ## ### ## + 0x19, 0xD8, 0x00, // ## ### ## + 0x18, 0xD8, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x18, 0x00, // ####### ## + 0x7F, 0x18, 0x00, // ####### ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3384 'O' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3456 'P' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0x1C, 0x00, // ## ### + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3528 'Q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xC0, 0x00, // ##### + 0x07, 0xCC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x0C, 0x38, 0x00, // ## ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3600 'R' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xC0, 0x00, // ####### + 0x18, 0xE0, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1E, 0x00, // ####### #### + 0x7F, 0x0E, 0x00, // ####### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3672 'S' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xD8, 0x00, // ##### ## + 0x0F, 0xF8, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1E, 0x00, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x78, 0x00, // #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x1F, 0xF0, 0x00, // ######### + 0x1B, 0xE0, 0x00, // ## ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3744 'T' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3816 'U' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3888 'V' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x7F, 0x00, // ####### ####### + 0x7F, 0x7F, 0x00, // ####### ####### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0x80, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3960 'W' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xFE, 0x3F, 0x80, // ####### ####### + 0xFE, 0x3F, 0x80, // ####### ####### + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x86, 0x00, // ## # ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1E, 0x7C, 0x00, // #### ##### + 0x0E, 0x38, 0x00, // ### ### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4032 'X' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4104 'Y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x7E, 0x00, // ##### ###### + 0x7C, 0x7E, 0x00, // ##### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4176 'Z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4248 '[' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4320 '\' (17 pixels wide) + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4392 ']' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4464 '^' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x01, 0xC0, 0x00, // ### + 0x03, 0xE0, 0x00, // ##### + 0x07, 0x70, 0x00, // ### ### + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x10, 0x04, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4536 '_' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 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, 0x00, // ################ + 0xFF, 0xFF, 0x00, // ################ + + // @4608 '`' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x03, 0x00, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4680 'a' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0xC0, 0x00, // ###### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x07, 0xF0, 0x00, // ####### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x70, 0x00, // ## ### + 0x1F, 0xFC, 0x00, // ########### + 0x0F, 0xBC, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4752 'b' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF8, 0x00, // ########## + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x7F, 0xF8, 0x00, // ############ + 0x7B, 0xE0, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4824 'c' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x38, 0x0C, 0x00, // ### ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4896 'd' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x78, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x07, 0xD8, 0x00, // ##### ## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xFE, 0x00, // ############ + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4968 'e' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1F, 0xFC, 0x00, // ########### + 0x07, 0xF0, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5040 'f' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xFC, 0x00, // ####### + 0x03, 0xFC, 0x00, // ######## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5112 'g' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5184 'h' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5256 'i' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5328 'j' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x1F, 0xE0, 0x00, // ######## + 0x1F, 0x80, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5400 'k' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3C, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xC0, 0x00, // ## ## + 0x0D, 0x80, 0x00, // ## ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x00, 0x00, // #### + 0x0F, 0x80, 0x00, // ##### + 0x0D, 0xC0, 0x00, // ## ### + 0x0C, 0xE0, 0x00, // ## ### + 0x3C, 0x7C, 0x00, // #### ##### + 0x3C, 0x7C, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5472 'l' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5544 'm' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF7, 0x78, 0x00, // #### ### #### + 0xFF, 0xFC, 0x00, // ############## + 0x39, 0xCC, 0x00, // ### ### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0xFD, 0xEF, 0x00, // ###### #### #### + 0xFD, 0xEF, 0x00, // ###### #### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5616 'n' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF0, 0x00, // ########### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5688 'o' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5760 'p' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF8, 0x00, // ############ + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x1F, 0xF8, 0x00, // ########## + 0x1B, 0xE0, 0x00, // ## ##### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x7F, 0x00, 0x00, // ####### + 0x7F, 0x00, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5832 'q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0xFE, 0x00, // ####### + 0x00, 0xFE, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5904 'r' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x78, 0x00, // ##### #### + 0x3E, 0xFC, 0x00, // ##### ###### + 0x07, 0xCC, 0x00, // ##### ## + 0x07, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5976 's' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xF8, 0x00, // ######## + 0x0F, 0xF8, 0x00, // ######### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0xF8, 0x00, // ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6048 't' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x1C, 0x00, // ## ### + 0x07, 0xFC, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6120 'u' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x78, 0x00, // #### #### + 0x78, 0x78, 0x00, // #### #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x0F, 0xFE, 0x00, // ########### + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6192 'v' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x3E, 0x00, // ##### ##### + 0x7C, 0x3E, 0x00, // ##### ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6264 'w' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x3C, 0x00, // #### #### + 0x78, 0x3C, 0x00, // #### #### + 0x31, 0x18, 0x00, // ## # ## + 0x33, 0x98, 0x00, // ## ### ## + 0x33, 0x98, 0x00, // ## ### ## + 0x1A, 0xB0, 0x00, // ## # # ## + 0x1E, 0xF0, 0x00, // #### #### + 0x1E, 0xF0, 0x00, // #### #### + 0x1C, 0x60, 0x00, // ### ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6336 'x' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6408 'y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x1F, 0x00, // ###### ##### + 0x7E, 0x1F, 0x00, // ###### ##### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0xE0, 0x00, // ##### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6480 'z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6552 '{' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xE0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6624 '|' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6696 '}' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x80, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0x80, 0x00, // #### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6768 '~' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x00, 0x00, // ### + 0x1F, 0x18, 0x00, // ##### ## + 0x3B, 0xB8, 0x00, // ### ### ### + 0x31, 0xF0, 0x00, // ## ##### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // +}; + +sFONT Font24 = { + Font24_Table, + 17, /* Width */ + 24, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font24CN.c b/display_app/2in15_e-Paper_B/lib/Fonts/font24CN.c new file mode 100755 index 00000000..d3c9584f --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Fonts/font24CN.c @@ -0,0 +1,465 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + + +// +// Font data for Courier New 12pt +// + +const CH_CN Font24CN_Table[] = +{ +/*-- ÎÄ×Ö: Äã --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"Äã"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC1,0xC0,0x00, +0x01,0xE3,0xE0,0x00,0x03,0xE3,0xC0,0x00,0x03,0xC7,0x80,0x00,0x03,0xC7,0xFF,0xFF, +0x07,0x8F,0xFF,0xFF,0x07,0x8F,0x00,0x0F,0x0F,0x1E,0x00,0x1E,0x0F,0x3C,0x1E,0x1E, +0x1F,0x3C,0x1E,0x3E,0x1F,0x18,0x1E,0x3C,0x3F,0x00,0x1E,0x1C,0x7F,0x00,0x1E,0x00, +0x7F,0x07,0x9E,0x70,0xFF,0x07,0x9E,0xF0,0xEF,0x0F,0x9E,0x78,0x6F,0x0F,0x1E,0x78, +0x0F,0x0F,0x1E,0x3C,0x0F,0x1E,0x1E,0x3C,0x0F,0x1E,0x1E,0x1E,0x0F,0x3C,0x1E,0x1E, +0x0F,0x3C,0x1E,0x1F,0x0F,0x7C,0x1E,0x0F,0x0F,0x78,0x1E,0x0E,0x0F,0x00,0x1E,0x00, +0x0F,0x00,0x1E,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x07,0xFC,0x00,0x0F,0x07,0xF8,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ºÃ --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"ºÃ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00, +0x0F,0x07,0xFF,0xFE,0x0F,0x07,0xFF,0xFE,0x0F,0x00,0x00,0x3E,0x1E,0x00,0x00,0xFC, +0xFF,0xF8,0x01,0xF0,0xFF,0xF8,0x03,0xE0,0x1E,0x78,0x07,0xC0,0x1E,0x78,0x0F,0x80, +0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00, +0x3C,0x7F,0xFF,0xFF,0x78,0xFF,0xFF,0xFF,0x78,0xF0,0x0F,0x00,0x78,0xF0,0x0F,0x00, +0x3D,0xE0,0x0F,0x00,0x1F,0xE0,0x0F,0x00,0x0F,0xE0,0x0F,0x00,0x07,0xC0,0x0F,0x00, +0x07,0xE0,0x0F,0x00,0x07,0xF0,0x0F,0x00,0x0F,0xF8,0x0F,0x00,0x1E,0x7C,0x0F,0x00, +0x3C,0x38,0x0F,0x00,0x78,0x00,0x0F,0x00,0xF0,0x03,0xFF,0x00,0x60,0x01,0xFE,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ΢ --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"΢"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x01,0xE0,0x07,0x87,0x01,0xE0, +0x07,0x07,0x01,0xC0,0x0F,0xF7,0x79,0xC0,0x1E,0xF7,0x7B,0xC0,0x1E,0xF7,0x7B,0x80, +0x3C,0xF7,0x7B,0xFF,0x78,0xF7,0x7B,0xFF,0xF8,0xF7,0x7F,0x9E,0xF7,0xFF,0xFF,0x9E, +0x67,0xFF,0xFF,0x9E,0x07,0x00,0x7F,0x9C,0x0F,0x00,0x0F,0x9C,0x1E,0x00,0x1F,0x9C, +0x1E,0x7F,0xFF,0xBC,0x3E,0x7F,0xF3,0xFC,0x3E,0x00,0x03,0xFC,0x7E,0x00,0x01,0xF8, +0xFE,0x00,0x01,0xF8,0xFE,0x7F,0xE1,0xF8,0xDE,0x7F,0xE1,0xF8,0x1E,0x78,0xE0,0xF0, +0x1E,0x78,0xEE,0xF0,0x1E,0x78,0xFF,0xF0,0x1E,0x78,0xFD,0xF8,0x1E,0x79,0xFB,0xFC, +0x1E,0xF1,0xF7,0xBC,0x1E,0xF0,0xEF,0x9E,0x1F,0xE0,0x0F,0x0F,0x1E,0xC0,0x1E,0x0F, +0x1E,0x00,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: Èí --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"Èí"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x03,0xC0,0x78,0x00,0x07,0x80,0x78,0x00,0x07,0x80,0x78,0x00, +0x07,0x80,0xF0,0x00,0x0F,0x00,0xF0,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0x1E,0x03,0xC0,0x1F,0x1E,0x03,0xC0,0x1E,0x1F,0xE7,0x8F,0x3E,0x3D,0xE7,0x8F,0x3C, +0x3D,0xEF,0x0F,0x7C,0x3D,0xE7,0x0F,0x78,0x79,0xE0,0x0F,0x00,0x79,0xE0,0x0E,0x00, +0x7F,0xFE,0x0E,0x00,0x7F,0xFE,0x1F,0x00,0x01,0xE0,0x1F,0x00,0x01,0xE0,0x1F,0x00, +0x01,0xE0,0x1F,0x80,0x01,0xE0,0x1F,0x80,0x01,0xE0,0x3F,0x80,0x01,0xFF,0x3F,0xC0, +0x0F,0xFF,0x7B,0xC0,0xFF,0xF0,0x79,0xE0,0xF9,0xE0,0xF1,0xF0,0x01,0xE1,0xF0,0xF0, +0x01,0xE3,0xE0,0xF8,0x01,0xE7,0xC0,0x7C,0x01,0xFF,0x80,0x3F,0x01,0xFF,0x00,0x1F, +0x01,0xEC,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ÑÅ --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"ÑÅ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0xFF,0x00, +0x7F,0xFC,0xF7,0x80,0x7F,0xFD,0xE3,0xC0,0x01,0xC1,0xE3,0xC0,0x01,0xC3,0xC1,0x80, +0x3D,0xC7,0xFF,0xFF,0x39,0xC7,0xFF,0xFF,0x39,0xCF,0x83,0x80,0x79,0xDF,0x83,0x80, +0x79,0xFF,0x83,0x80,0x79,0xDF,0x83,0x80,0x71,0xC3,0x83,0x80,0x7F,0xFF,0xFF,0xFE, +0x7F,0xFF,0xFF,0xFE,0x03,0xC3,0x83,0x80,0x07,0xC3,0x83,0x80,0x07,0xC3,0x83,0x80, +0x0F,0xC3,0x83,0x80,0x0F,0xC3,0x83,0x80,0x1F,0xC3,0xFF,0xFE,0x1D,0xC3,0xFF,0xFE, +0x3D,0xC3,0x83,0x80,0x79,0xC3,0x83,0x80,0xF1,0xC3,0x83,0x80,0xF1,0xC3,0x83,0x80, +0x61,0xC3,0x83,0x80,0x01,0xC3,0xFF,0xFF,0x03,0xC3,0xFF,0xFF,0x1F,0xC3,0x80,0x00, +0x1F,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ºÚ --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"ºÚ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x1E,0x03,0xC0,0x3C,0x1E,0xC3,0xC7,0x3C, +0x1F,0xE3,0xC7,0xBC,0x1E,0xF3,0xCF,0x3C,0x1E,0xFB,0xDF,0x3C,0x1E,0x7B,0xDE,0x3C, +0x1E,0x33,0xDC,0x3C,0x1E,0x03,0xC0,0x3C,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC, +0x1E,0x03,0xC0,0x3C,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x3F,0xFF,0xFF,0xFC, +0x3F,0xFF,0xFF,0xFC,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x1C,0x38,0x70,0x70, +0x3E,0x78,0xF8,0xF8,0x3C,0x7C,0x78,0x7C,0x7C,0x3C,0x3C,0x3E,0xF8,0x3E,0x3C,0x1F, +0xF0,0x1C,0x18,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ´Ë --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"´Ë"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x3C,0x00, +0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00, +0x00,0x78,0x3C,0x0C,0x3C,0x78,0x3C,0x1E,0x3C,0x78,0x3C,0x3F,0x3C,0x78,0x3C,0xF8, +0x3C,0x7F,0xFD,0xF0,0x3C,0x7F,0xFF,0xE0,0x3C,0x78,0x3F,0x80,0x3C,0x78,0x3E,0x00, +0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00, +0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x0E,0x3C,0x78,0x3C,0x0F, +0x3C,0x78,0x3C,0x0F,0x3C,0x79,0xFC,0x0F,0x3C,0x7F,0xFC,0x0F,0x3F,0xFF,0x3C,0x0F, +0x3F,0xF0,0x3E,0x1E,0xFF,0x00,0x1F,0xFE,0xF0,0x00,0x0F,0xFC,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ×Ö --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"×Ö"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0xC0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x01,0xE0,0x00,0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE, +0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E, +0x7B,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xC0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00, +0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, +0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xFF,0xC0,0x00,0x00,0xFF,0x80,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: Ìå --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"Ìå"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x3C,0x00, +0x03,0xC0,0x3C,0x00,0x03,0xC0,0x3C,0x00,0x07,0x80,0x3C,0x00,0x07,0x80,0x3C,0x00, +0x07,0x80,0x3C,0x00,0x0F,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0x1F,0x01,0xFE,0x00, +0x1F,0x01,0xFF,0x00,0x3F,0x01,0xFF,0x00,0x3F,0x03,0xFF,0x00,0x7F,0x03,0xFF,0x80, +0x7F,0x07,0xBF,0x80,0xFF,0x07,0xBF,0xC0,0xEF,0x0F,0x3D,0xC0,0xCF,0x0F,0x3D,0xE0, +0x0F,0x1E,0x3D,0xE0,0x0F,0x1E,0x3C,0xF0,0x0F,0x3C,0x3C,0x78,0x0F,0x7C,0x3C,0x7C, +0x0F,0xF8,0x3C,0x3E,0x0F,0xF7,0xFF,0xDF,0x0F,0xE7,0xFF,0xCF,0x0F,0xC0,0x3C,0x06, +0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00, +0x0F,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: Ï --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"ÏÂ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0xE0,0x00,0x00,0x0F,0xF8,0x00,0x00,0x0F,0xFC,0x00,0x00,0x0F,0xBF,0x00, +0x00,0x0F,0x9F,0x80,0x00,0x0F,0x87,0xE0,0x00,0x0F,0x83,0xF0,0x00,0x0F,0x80,0xF8, +0x00,0x0F,0x80,0x7C,0x00,0x0F,0x80,0x38,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ¶Ô --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"¶Ô"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78, +0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x7F,0xFC,0x00,0x78,0x7F,0xFC,0x00,0x78, +0x00,0x3C,0x00,0x78,0x00,0x3F,0xFF,0xFF,0x30,0x3F,0xFF,0xFF,0x78,0x3C,0x00,0x78, +0x3C,0x38,0x00,0x78,0x3E,0x78,0x00,0x78,0x1E,0x78,0xC0,0x78,0x0F,0x79,0xE0,0x78, +0x0F,0xF0,0xF0,0x78,0x07,0xF0,0xF8,0x78,0x03,0xF0,0x78,0x78,0x01,0xE0,0x3C,0x78, +0x03,0xF0,0x3E,0x78,0x03,0xF0,0x18,0x78,0x07,0xF8,0x00,0x78,0x07,0xFC,0x00,0x78, +0x0F,0x3E,0x00,0x78,0x1F,0x1E,0x00,0x78,0x3E,0x1F,0x00,0x78,0x7C,0x0E,0x00,0xF8, +0xF8,0x00,0x00,0xF0,0xF0,0x00,0x3F,0xF0,0x60,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: Ó¦ --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"Ó¦"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0x01,0xE0,0x00, +0x00,0x01,0xF0,0x00,0x00,0x00,0xF0,0x00,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF, +0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E,0x01,0xE0,0x78,0x1E,0x01,0xE0,0x78, +0x1E,0xE1,0xE0,0x78,0x1F,0xF1,0xF0,0xF8,0x1E,0xF0,0xF0,0xF0,0x1E,0xF0,0xF0,0xF0, +0x1E,0xF8,0xF0,0xF0,0x1E,0x78,0xF1,0xF0,0x1E,0x78,0xF9,0xE0,0x1E,0x78,0x79,0xE0, +0x1E,0x7C,0x7B,0xE0,0x1E,0x3C,0x7B,0xC0,0x1E,0x3C,0x7B,0xC0,0x1E,0x3C,0x7B,0xC0, +0x3C,0x3E,0x07,0x80,0x3C,0x1C,0x07,0x80,0x3C,0x00,0x07,0x80,0x3C,0x00,0x0F,0x00, +0x78,0x00,0x0F,0x00,0x7B,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00, +0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: µÄ --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"µÄ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x3C,0x00,0x07,0xC0,0x3E,0x00, +0x07,0x80,0x3C,0x00,0x07,0x80,0x7C,0x00,0x0F,0x00,0x78,0x00,0x7F,0xFE,0x7F,0xFE, +0x7F,0xFE,0xFF,0xFE,0x78,0x1E,0xF0,0x1E,0x78,0x1F,0xE0,0x1E,0x78,0x1F,0xE0,0x1E, +0x78,0x1F,0xC0,0x1E,0x78,0x1F,0xC0,0x1E,0x78,0x1F,0xF0,0x1E,0x78,0x1E,0xF8,0x1E, +0x78,0x1E,0x7C,0x1E,0x7F,0xFE,0x3C,0x1E,0x7F,0xFE,0x1E,0x1E,0x78,0x1E,0x1F,0x1E, +0x78,0x1E,0x0F,0x9E,0x78,0x1E,0x07,0x9E,0x78,0x1E,0x07,0x1E,0x78,0x1E,0x00,0x1E, +0x78,0x1E,0x00,0x1E,0x78,0x1E,0x00,0x3E,0x78,0x1E,0x00,0x3C,0x78,0x1E,0x00,0x3C, +0x7F,0xFE,0x00,0x3C,0x7F,0xFE,0x00,0x7C,0x78,0x1E,0x3F,0xF8,0x78,0x1E,0x3F,0xF0, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: µã --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"µã"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xFF,0xFF,0x00,0x03,0xFF,0xFF, +0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF8,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78, +0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78, +0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF8,0x0F,0x00,0x00,0x78,0x00,0x00,0x00,0x00, +0x0C,0x38,0x38,0x30,0x1E,0x7C,0x78,0x78,0x3E,0x3C,0x78,0x78,0x3C,0x3C,0x3C,0x3C, +0x7C,0x3E,0x3C,0x3E,0xF8,0x1E,0x3C,0x1E,0xF0,0x1E,0x1E,0x1F,0x70,0x1E,0x1C,0x0E, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: Õó --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"Õó"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x78,0x00, +0x7F,0xF0,0x78,0x00,0x7F,0xF0,0x78,0x00,0x79,0xFF,0xFF,0xFF,0x79,0xFF,0xFF,0xFF, +0x79,0xE1,0xE0,0x00,0x79,0xE1,0xE0,0x00,0x7B,0xC1,0xEF,0x80,0x7B,0xC3,0xCF,0x80, +0x7B,0xC3,0xCF,0x80,0x7F,0x87,0xCF,0x80,0x7F,0x87,0x8F,0x80,0x7F,0x87,0x8F,0x80, +0x7B,0xCF,0x0F,0x80,0x7B,0xCF,0xFF,0xFE,0x79,0xEF,0xFF,0xFE,0x79,0xE0,0x0F,0x80, +0x78,0xE0,0x0F,0x80,0x78,0xF0,0x0F,0x80,0x78,0xF0,0x0F,0x80,0x78,0xF0,0x0F,0x80, +0x78,0xFF,0xFF,0xFF,0x79,0xFF,0xFF,0xFF,0x7F,0xE0,0x0F,0x80,0x7F,0xC0,0x0F,0x80, +0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80, +0x78,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: Ϊ --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"Ϊ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00, +0x0E,0x07,0x80,0x00,0x1F,0x07,0x80,0x00,0x0F,0x87,0x80,0x00,0x07,0xC7,0x80,0x00, +0x01,0xE7,0x80,0x00,0x00,0xC7,0x80,0x00,0x00,0x07,0x80,0x00,0x7F,0xFF,0xFF,0xFC, +0x7F,0xFF,0xFF,0xFC,0x00,0x07,0x80,0x3C,0x00,0x0F,0x80,0x3C,0x00,0x0F,0x00,0x3C, +0x00,0x0F,0x00,0x3C,0x00,0x0F,0x60,0x3C,0x00,0x1F,0xF0,0x3C,0x00,0x1E,0x78,0x3C, +0x00,0x3E,0x3C,0x3C,0x00,0x3C,0x3E,0x3C,0x00,0x7C,0x1F,0x3C,0x00,0x78,0x0F,0x3C, +0x00,0xF8,0x06,0x3C,0x01,0xF0,0x00,0x3C,0x03,0xE0,0x00,0x7C,0x07,0xC0,0x00,0x7C, +0x0F,0x80,0x00,0x78,0x1F,0x00,0x00,0xF8,0x3E,0x00,0xFF,0xF0,0x7C,0x00,0xFF,0xE0, +0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: Ê÷ --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"Ê÷"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x38, +0x0F,0x00,0x00,0x38,0x0F,0x00,0x00,0x38,0x0F,0x3F,0xF8,0x38,0x0F,0x3F,0xF8,0x38, +0x0F,0x00,0x78,0x38,0xFF,0xE0,0x7F,0xFF,0xFF,0xE0,0x7F,0xFF,0x0F,0x00,0x70,0x38, +0x0F,0x18,0xF0,0x38,0x1F,0x3C,0xF0,0x38,0x1F,0x1C,0xFE,0x38,0x1F,0xDE,0xFE,0x38, +0x3F,0xEF,0xEF,0x38,0x3F,0xFF,0xEF,0x38,0x3F,0xF7,0xE7,0xB8,0x7F,0x67,0xC7,0xB8, +0x7F,0x03,0xC3,0xB8,0xFF,0x07,0xE0,0x38,0xEF,0x07,0xE0,0x38,0xEF,0x0F,0xF0,0x38, +0xCF,0x1F,0xF0,0x38,0x0F,0x1E,0x78,0x38,0x0F,0x3C,0x7C,0x38,0x0F,0x78,0x3C,0x38, +0x0F,0xF8,0x38,0x38,0x0F,0x60,0x00,0x78,0x0F,0x00,0x0F,0xF8,0x0F,0x00,0x07,0xF0, +0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: Ý® --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"Ý®"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1E,0x00,0x00,0x3C,0x1E,0x00, +0x00,0x3C,0x1E,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x3C,0x1E,0x00, +0x07,0xBC,0x1E,0x00,0x07,0x80,0x00,0x00,0x0F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFC, +0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xF0, +0xF7,0xFF,0xFF,0xF0,0x37,0x83,0x80,0xF0,0x07,0x87,0xC0,0xF0,0x07,0x83,0xF0,0xF0, +0x07,0x00,0xE0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x00,0xE0, +0x0F,0x0F,0x81,0xE0,0x0E,0x03,0xE1,0xE0,0x1E,0x01,0xC1,0xE0,0x1F,0xFF,0xFF,0xFE, +0x1F,0xFF,0xFF,0xFE,0x00,0x00,0x01,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xFF,0xC0, +0x00,0x00,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ÅÉ --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"ÅÉ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x3E, +0x7C,0x00,0x3F,0xFE,0x3F,0x3F,0xFF,0xF0,0x1F,0xBF,0xE0,0x00,0x07,0xBC,0x00,0x00, +0x03,0x3C,0x00,0x00,0x00,0x3C,0x00,0x3C,0x00,0x3C,0x0F,0xFE,0x70,0x3D,0xFF,0xF8, +0xF8,0x3D,0xFF,0x00,0x7C,0x3D,0xE7,0x80,0x3F,0x3D,0xE7,0x80,0x1F,0x3D,0xE7,0x8E, +0x0E,0x3D,0xE7,0x9F,0x00,0x3D,0xE7,0xFE,0x00,0x39,0xE7,0xF8,0x00,0x39,0xE3,0xF0, +0x1C,0x39,0xE3,0xC0,0x1E,0x79,0xE3,0xC0,0x1E,0x79,0xE1,0xE0,0x1E,0x79,0xE1,0xE0, +0x3C,0x79,0xE0,0xF0,0x3C,0x79,0xE0,0xF8,0x3C,0xF1,0xE0,0x7C,0x3C,0xF1,0xE3,0x7C, +0x7D,0xF1,0xEF,0x3F,0x79,0xE1,0xFE,0x1F,0x7B,0xE1,0xF8,0x0E,0x7B,0xC3,0xE0,0x00, +0x79,0x81,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: A --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{ +"A"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7C,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00, +0x01,0xFF,0x00,0x00,0x01,0xFF,0x00,0x00,0x01,0xEF,0x00,0x00,0x03,0xEF,0x80,0x00, +0x03,0xCF,0x80,0x00,0x07,0xC7,0x80,0x00,0x07,0xC7,0xC0,0x00,0x07,0x87,0xC0,0x00, +0x0F,0x83,0xE0,0x00,0x0F,0x83,0xE0,0x00,0x0F,0x01,0xE0,0x00,0x1F,0xFF,0xF0,0x00, +0x1F,0xFF,0xF0,0x00,0x3F,0xFF,0xF8,0x00,0x3E,0x00,0xF8,0x00,0x3C,0x00,0xF8,0x00, +0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x78,0x00,0x3C,0x00,0xF8,0x00,0x3E,0x00, +0xF8,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: a --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"a"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF8,0x00,0x00, +0x1F,0xFE,0x00,0x00,0x3F,0xFE,0x00,0x00,0x3E,0x3F,0x00,0x00,0x38,0x1F,0x00,0x00, +0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x03,0xFF,0x00,0x00,0x1F,0xFF,0x00,0x00, +0x3F,0x8F,0x00,0x00,0x7C,0x0F,0x00,0x00,0x7C,0x0F,0x00,0x00,0x78,0x1F,0x00,0x00, +0x7C,0x1F,0x00,0x00,0x7E,0x7F,0x00,0x00,0x7F,0xFF,0x00,0x00,0x3F,0xFF,0x00,0x00, +0x0F,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: b --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"b"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00, +0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00, +0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0xFE,0x00,0x00, +0x3D,0xFF,0x80,0x00,0x3F,0xFF,0xC0,0x00,0x3F,0x8F,0xC0,0x00,0x3F,0x07,0xE0,0x00, +0x3E,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00,0x3C,0x01,0xE0,0x00,0x3C,0x01,0xE0,0x00, +0x3C,0x01,0xE0,0x00,0x3C,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00, +0x3F,0x07,0xC0,0x00,0x3F,0x8F,0xC0,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0x00,0x00, +0x3C,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: c --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"c"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x00, +0x07,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x3F,0x86,0x00,0x00,0x3E,0x00,0x00,0x00, +0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x78,0x00,0x00,0x00, +0x78,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, +0x3E,0x00,0x00,0x00,0x3F,0x86,0x00,0x00,0x1F,0xFE,0x00,0x00,0x0F,0xFE,0x00,0x00, +0x03,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ΢ --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"΢"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x01,0xE0,0x07,0x87,0x01,0xE0, +0x07,0x07,0x01,0xC0,0x0F,0xF7,0x79,0xC0,0x1E,0xF7,0x7B,0xC0,0x1E,0xF7,0x7B,0x80, +0x3C,0xF7,0x7B,0xFF,0x78,0xF7,0x7B,0xFF,0xF8,0xF7,0x7F,0x9E,0xF7,0xFF,0xFF,0x9E, +0x67,0xFF,0xFF,0x9E,0x07,0x00,0x7F,0x9C,0x0F,0x00,0x0F,0x9C,0x1E,0x00,0x1F,0x9C, +0x1E,0x7F,0xFF,0xBC,0x3E,0x7F,0xF3,0xFC,0x3E,0x00,0x03,0xFC,0x7E,0x00,0x01,0xF8, +0xFE,0x00,0x01,0xF8,0xFE,0x7F,0xE1,0xF8,0xDE,0x7F,0xE1,0xF8,0x1E,0x78,0xE0,0xF0, +0x1E,0x78,0xEE,0xF0,0x1E,0x78,0xFF,0xF0,0x1E,0x78,0xFD,0xF8,0x1E,0x79,0xFB,0xFC, +0x1E,0xF1,0xF7,0xBC,0x1E,0xF0,0xEF,0x9E,0x1F,0xE0,0x0F,0x0F,0x1E,0xC0,0x1E,0x0F, +0x1E,0x00,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: Ñ© --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"Ñ©"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x78,0x03,0xC0,0x1E,0x78,0x03,0xC0,0x1E, +0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78, +0x00,0x00,0x00,0x78,0x3F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: µç --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"µç"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00, +0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, +0x78,0x07,0x80,0x0E,0x78,0x07,0x80,0x0F,0x00,0x07,0x80,0x0F,0x00,0x07,0x80,0x0F, +0x00,0x07,0x80,0x1F,0x00,0x07,0x80,0x1E,0x00,0x03,0xFF,0xFE,0x00,0x01,0xFF,0xFC, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- ÎÄ×Ö: ×Ó --*/ +/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ +{{"×Ó"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0, +0x00,0x00,0x0F,0xC0,0x00,0x00,0x1F,0x80,0x00,0x00,0x3E,0x00,0x00,0x00,0xFC,0x00, +0x00,0x01,0xF8,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xC0,0x00,0x01,0xFF,0xC0,0x00,0x00,0xFF,0x80,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + + +}; + +cFONT Font24CN = { + Font24CN_Table, + sizeof(Font24CN_Table)/sizeof(CH_CN), /*size of table*/ + 24, /* ASCII Width */ + 32, /* Width */ + 41, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font8.c b/display_app/2in15_e-Paper_B/lib/Fonts/font8.c new file mode 100755 index 00000000..88450d98 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Fonts/font8.c @@ -0,0 +1,1004 @@ +/** + ****************************************************************************** + * @file Font8.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font8 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font8_Table[] = +{ + // @0 ' ' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @8 '!' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @16 '"' (5 pixels wide) + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @24 '#' (5 pixels wide) + 0x28, // # # + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xA0, // # # + 0x00, // + + // @32 '$' (5 pixels wide) + 0x20, // # + 0x30, // ## + 0x60, // ## + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x20, // # + 0x00, // + + // @40 '%' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x18, // ## + 0x60, // ## + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @48 '&' (5 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x60, // ## + 0x50, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @56 ''' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @64 '(' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @72 ')' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @80 '*' (5 pixels wide) + 0x20, // # + 0x70, // ### + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @88 '+' (5 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @96 ',' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @104 '-' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @112 '.' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @120 '/' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x40, // # + 0x80, // # + 0x00, // + + // @128 '0' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @136 '1' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @144 '2' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @152 '3' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @160 '4' (5 pixels wide) + 0x10, // # + 0x30, // ## + 0x50, // # # + 0x78, // #### + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + + // @168 '5' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x60, // ## + 0x10, // # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @176 '6' (5 pixels wide) + 0x30, // ## + 0x40, // # + 0x60, // ## + 0x50, // # # + 0x50, // # # + 0x60, // ## + 0x00, // + 0x00, // + + // @184 '7' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @192 '8' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @200 '9' (5 pixels wide) + 0x30, // ## + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @208 ':' (5 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @216 ';' (5 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x10, // # + 0x20, // # + 0x00, // + 0x00, // + + // @224 '<' (5 pixels wide) + 0x00, // + 0x10, // # + 0x20, // # + 0xC0, // ## + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + + // @232 '=' (5 pixels wide) + 0x00, // + 0x70, // ### + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @240 '>' (5 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x18, // ## + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @248 '?' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @256 '@' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x58, // # ## + 0x48, // # # + 0x40, // # + 0x38, // ### + 0x00, // + + // @264 'A' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x50, // # # + 0x70, // ### + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @272 'B' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @280 'C' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @288 'D' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @296 'E' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @304 'F' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @312 'G' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x40, // # + 0x58, // # ## + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @320 'H' (5 pixels wide) + 0xE8, // ### # + 0x48, // # # + 0x78, // #### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @328 'I' (5 pixels wide) + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @336 'J' (5 pixels wide) + 0x38, // ### + 0x10, // # + 0x10, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @344 'K' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x60, // ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @352 'L' (5 pixels wide) + 0xE0, // ### + 0x40, // # + 0x40, // # + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @360 'M' (5 pixels wide) + 0xD8, // ## ## + 0xD8, // ## ## + 0xD8, // ## ## + 0xA8, // # # # + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @368 'N' (5 pixels wide) + 0xD8, // ## ## + 0x68, // ## # + 0x68, // ## # + 0x58, // # ## + 0x58, // # ## + 0xE8, // ### # + 0x00, // + 0x00, // + + // @376 'O' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @384 'P' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @392 'Q' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x18, // ## + 0x00, // + + // @400 'R' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @408 'S' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x20, // # + 0x10, // # + 0x50, // # # + 0x70, // ### + 0x00, // + 0x00, // + + // @416 'T' (5 pixels wide) + 0xF8, // ##### + 0xA8, // # # # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @424 'U' (5 pixels wide) + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @432 'V' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x48, // # # + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @440 'W' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @448 'X' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x20, // # + 0x20, // # + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @456 'Y' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @464 'Z' (5 pixels wide) + 0x78, // #### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x48, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @472 '[' (5 pixels wide) + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x00, // + + // @480 '\' (5 pixels wide) + 0x80, // # + 0x40, // # + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @488 ']' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x00, // + + // @496 '^' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @504 '_' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xF8, // ##### + + // @512 '`' (5 pixels wide) + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @520 'a' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x10, // # + 0x70, // ### + 0x78, // #### + 0x00, // + 0x00, // + + // @528 'b' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @536 'c' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x40, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @544 'd' (5 pixels wide) + 0x18, // ## + 0x08, // # + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @552 'e' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x70, // ### + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @560 'f' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x70, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @568 'g' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x30, // ## + + // @576 'h' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @584 'i' (5 pixels wide) + 0x20, // # + 0x00, // + 0x60, // ## + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @592 'j' (5 pixels wide) + 0x20, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x70, // ### + + // @600 'k' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @608 'l' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @616 'm' (5 pixels wide) + 0x00, // + 0x00, // + 0xD0, // ## # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x00, // + 0x00, // + + // @624 'n' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0xC8, // ## # + 0x00, // + 0x00, // + + // @632 'o' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @640 'p' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + + // @648 'q' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x18, // ## + + // @656 'r' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @664 's' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @672 't' (5 pixels wide) + 0x00, // + 0x40, // # + 0xF0, // #### + 0x40, // # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @680 'u' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @688 'v' (5 pixels wide) + 0x00, // + 0x00, // + 0xC8, // ## # + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + + // @696 'w' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @704 'x' (5 pixels wide) + 0x00, // + 0x00, // + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0x00, // + 0x00, // + + // @712 'y' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x60, // ## + + // @720 'z' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x50, // # # + 0x28, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @728 '{' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @736 '|' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @744 '}' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @752 '~' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x28, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font8 = { + Font8_Table, + 5, /* Width */ + 8, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/fonts.h b/display_app/2in15_e-Paper_B/lib/Fonts/fonts.h new file mode 100755 index 00000000..c183f047 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/Fonts/fonts.h @@ -0,0 +1,97 @@ +/** + ****************************************************************************** + * @file fonts.h + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief Header for fonts.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FONTS_H +#define __FONTS_H + +/*×î´ó×ÖÌå΢ÈíÑźÚ24 (32x41) */ +#define MAX_HEIGHT_FONT 41 +#define MAX_WIDTH_FONT 32 +#define OFFSET_BITMAP + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include + +//ASCII +typedef struct _tFont +{ + const uint8_t *table; + uint16_t Width; + uint16_t Height; + +} sFONT; + + +//GB2312 +typedef struct // ºº×Ö×ÖÄ£Êý¾Ý½á¹¹ +{ + const char index[2]; // ºº×ÖÄÚÂëË÷Òý + const char matrix[MAX_HEIGHT_FONT*MAX_WIDTH_FONT/8+2]; // µãÕóÂëÊý¾Ý +}CH_CN; + + +typedef struct +{ + const CH_CN *table; + uint16_t size; + uint16_t ASCII_Width; + uint16_t Width; + uint16_t Height; + +}cFONT; + +extern sFONT Font24; +extern sFONT Font20; +extern sFONT Font16; +extern sFONT Font12; +extern sFONT Font8; + +extern cFONT Font12CN; +extern cFONT Font24CN; +#ifdef __cplusplus +} +#endif + +#endif /* __FONTS_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.c b/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.c new file mode 100755 index 00000000..57cd5f78 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.c @@ -0,0 +1,529 @@ +/***************************************************************************** +* | File : GUI_BMPfile.h +* | Author : Waveshare team +* | Function : Hardware underlying interface +* | Info : +* Used to shield the underlying layers of each master +* and enhance portability +*---------------- +* | This version: V2.3 +* | Date : 2022-07-27 +* | Info : +* ----------------------------------------------------------------------------- +* V2.3(2022-07-27): +* 1.Add GUI_ReadBmp_RGB_4Color() +* V2.2(2020-07-08): +* 1.Add GUI_ReadBmp_RGB_7Color() +* V2.1(2019-10-10): +* 1.Add GUI_ReadBmp_4Gray() +* V2.0(2018-11-12): +* 1.Change file name: GUI_BMP.h -> GUI_BMPfile.h +* 2.fix: GUI_ReadBmp() +* Now Xstart and Xstart can control the position of the picture normally, +* and support the display of images of any size. If it is larger than +* the actual display range, it will not be displayed. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ + +#include "GUI_BMPfile.h" +#include "GUI_Paint.h" +#include "Debug.h" + +#include +#include +#include +#include //exit() +#include //memset() +#include //memset() +#include + +UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UWORD Image_Width_Byte = (bmpInfoHeader.biWidth % 8 == 0)? (bmpInfoHeader.biWidth / 8): (bmpInfoHeader.biWidth / 8 + 1); + UWORD Bmp_Width_Byte = (Image_Width_Byte % 4 == 0) ? Image_Width_Byte: ((Image_Width_Byte / 4 + 1) * 4); + UBYTE Image[Image_Width_Byte * bmpInfoHeader.biHeight]; + memset(Image, 0xFF, Image_Width_Byte * bmpInfoHeader.biHeight); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + if(readbyte != 1) { + Debug("the bmp Image is not a monochrome bitmap!\n"); + exit(0); + } + + // Determine black and white based on the palette + UWORD i; + UWORD Bcolor, Wcolor; + UWORD bmprgbquadsize = pow(2, bmpInfoHeader.biBitCount);// 2^1 = 2 + BMPRGBQUAD bmprgbquad[bmprgbquadsize]; //palette + // BMPRGBQUAD bmprgbquad[2]; //palette + + for(i = 0; i < bmprgbquadsize; i++){ + // for(i = 0; i < 2; i++) { + fread(&bmprgbquad[i], sizeof(BMPRGBQUAD), 1, fp); + } + if(bmprgbquad[0].rgbBlue == 0xff && bmprgbquad[0].rgbGreen == 0xff && bmprgbquad[0].rgbRed == 0xff) { + Bcolor = BLACK; + Wcolor = WHITE; + } else { + Bcolor = WHITE; + Wcolor = BLACK; + } + + // Read image data into the cache + UWORD x, y; + UBYTE Rdata; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < Bmp_Width_Byte; x++) {//Show a line in the line + if(fread((char *)&Rdata, 1, readbyte, fp) != readbyte) { + perror("get bmpdata:\r\n"); + break; + } + if(x < Image_Width_Byte) { //bmp + Image[x + (bmpInfoHeader.biHeight - y - 1) * Image_Width_Byte] = Rdata; + // printf("rdata = %d\r\n", Rdata); + } + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + UBYTE color, temp; + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + temp = Image[(x / 8) + (y * Image_Width_Byte)]; + color = (((temp << (x%8)) & 0x80) == 0x80) ?Bcolor:Wcolor; + Paint_SetPixel(Xstart + x, Ystart + y, color); + } + } + return 0; +} +/************************************************************************* + +*************************************************************************/ +UBYTE GUI_ReadBmp_4Gray(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UWORD Image_Width_Byte = (bmpInfoHeader.biWidth % 4 == 0)? (bmpInfoHeader.biWidth / 4): (bmpInfoHeader.biWidth / 4 + 1); + UWORD Bmp_Width_Byte = (bmpInfoHeader.biWidth % 2 == 0)? (bmpInfoHeader.biWidth / 2): (bmpInfoHeader.biWidth / 2 + 1); + UBYTE Image[Image_Width_Byte * bmpInfoHeader.biHeight * 2]; + memset(Image, 0xFF, Image_Width_Byte * bmpInfoHeader.biHeight * 2); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + printf("biBitCount = %d\r\n",readbyte); + if(readbyte != 4){ + Debug("Bmp image is not a 4-color bitmap!\n"); + exit(0); + } + // Read image data into the cache + UWORD x, y; + UBYTE Rdata; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < Bmp_Width_Byte; x++) {//Show a line in the line + if(fread((char *)&Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(x < Image_Width_Byte*2) { //bmp + Image[x + (bmpInfoHeader.biHeight - y - 1) * Image_Width_Byte*2] = Rdata; + } + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + UBYTE color, temp; + printf("bmpInfoHeader.biWidth = %d\r\n",bmpInfoHeader.biWidth); + printf("bmpInfoHeader.biHeight = %d\r\n",bmpInfoHeader.biHeight); + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + temp = Image[x/2 + y * bmpInfoHeader.biWidth/2] >> ((x%2)? 0:4);//0xf 0x8 0x7 0x0 + color = temp>>2; //11 10 01 00 + Paint_SetPixel(Xstart + x, Ystart + y, color); + } + } + return 0; +} + +UBYTE GUI_ReadBmp_16Gray(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + // They are both the same width in bytes + // round up to the next byte + UWORD Width_Byte = (bmpInfoHeader.biWidth + 1) / 2; + UBYTE Image[Width_Byte * bmpInfoHeader.biHeight]; + memset(Image, 0xFF, Width_Byte * bmpInfoHeader.biHeight); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + printf("biBitCount = %d\r\n",readbyte); + if(readbyte != 4) { + Debug("Bmp image is not a 4-bit bitmap!\n"); + exit(0); + } + + // Determine colors based on the palette + + // A map from palette entry to color + UBYTE colors[16]; + UBYTE i; + BMPRGBQUAD rgbData; + + for (i = 0; i < 16; i++){ + fread(&rgbData, sizeof(BMPRGBQUAD), 1, fp); + + // Work out the closest colour + // 16 colours over 0-255 => 0-8 => 0, 9-25 => 1 (17), 26-42 => 2 (34), etc + + // Base it on red + colors[i] = (rgbData.rgbRed + 8) / 17; + } + + // Read image data into the cache + UWORD x, y; + UBYTE Rdata; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + + for (y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for (x = 0; x < Width_Byte; x++) {//Show a line in the line + if (fread((char *) &Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + Image[x + (bmpInfoHeader.biHeight - y - 1) * Width_Byte] = Rdata; + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + UBYTE coloridx; + printf("bmpInfoHeader.biWidth = %d\r\n", bmpInfoHeader.biWidth); + printf("bmpInfoHeader.biHeight = %d\r\n", bmpInfoHeader.biHeight); + for (y = 0; y < bmpInfoHeader.biHeight; y++) { + for (x = 0; x < bmpInfoHeader.biWidth; x++) { + if (Xstart + x > Paint.Width || Ystart + y > Paint.Height) + break; + + coloridx = (Image[x / 2 + y * Width_Byte] >> ((x % 2) ? 0 : 4)) & 15; + Paint_SetPixel(Xstart + x, Ystart + y, colors[coloridx]); + } + } + return 0; +} + +UBYTE GUI_ReadBmp_RGB_7Color(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UDOUBLE Image_Byte = bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3; + UBYTE Image[Image_Byte]; + memset(Image, 0xFF, Image_Byte); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + if(readbyte != 24){ + Debug("Bmp image is not 24 bitmap!\n"); + exit(0); + } + // Read image data into the cache + UWORD x, y; + UBYTE Rdata[3]; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < bmpInfoHeader.biWidth ; x++) {//Show a line in the line + if(fread((char *)Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(fread((char *)Rdata+1, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(fread((char *)Rdata+2, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + + if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 0;//Black + }else if(Rdata[0] == 255 && Rdata[1] == 255 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 1;//White + }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 2;//Green + }else if(Rdata[0] == 255 && Rdata[1] == 0 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 3;//Blue + }else if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 4;//Red + }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 5;//Yellow + }else if(Rdata[0] == 0 && Rdata[1] == 128 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 6;//Orange + } + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + Paint_SetPixel(Xstart + x, Ystart + y, Image[bmpInfoHeader.biHeight * bmpInfoHeader.biWidth - 1 -(bmpInfoHeader.biWidth-x-1+(y* bmpInfoHeader.biWidth))]); + } + } + return 0; +} + +UBYTE GUI_ReadBmp_RGB_4Color(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UDOUBLE Image_Byte = bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3; + UBYTE Image[Image_Byte]; + memset(Image, 0xFF, Image_Byte); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + if(readbyte != 24){ + Debug("Bmp image is not 24 bitmap!\n"); + exit(0); + } + // Read image data into the cache + UWORD x, y; + UBYTE Rdata[3]; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < bmpInfoHeader.biWidth ; x++) {//Show a line in the line + if(fread((char *)Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(fread((char *)Rdata+1, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(fread((char *)Rdata+2, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(Rdata[0] < 128 && Rdata[1] < 128 && Rdata[2] < 128){ + Image[x+(y* bmpInfoHeader.biWidth )] = 0;//Black + }else if(Rdata[0] > 127 && Rdata[1] > 127 && Rdata[2] > 127){ + Image[x+(y* bmpInfoHeader.biWidth )] = 1;//White + }else if(Rdata[0] < 128 && Rdata[1] > 127 && Rdata[2] > 127){ + Image[x+(y* bmpInfoHeader.biWidth )] = 2;//Yellow + }else if(Rdata[0] < 128 && Rdata[1] < 128 && Rdata[2] > 127){ + Image[x+(y* bmpInfoHeader.biWidth )] = 3;//Red + } + } + if(bmpInfoHeader.biWidth % 4 != 0) + { + for (UWORD i = 0; i < (bmpInfoHeader.biWidth % 4); i++) + { + if(fread((char *)Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + } + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + Paint_SetPixel(Xstart + x, Ystart + y, Image[bmpInfoHeader.biHeight * bmpInfoHeader.biWidth - 1 -(bmpInfoHeader.biWidth-x-1+(y* bmpInfoHeader.biWidth))]); + } + } + return 0; +} + +UBYTE GUI_ReadBmp_RGB_6Color(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UDOUBLE Image_Byte = bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3; + UBYTE Image[Image_Byte]; + memset(Image, 0xFF, Image_Byte); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + if(readbyte != 24){ + Debug("Bmp image is not 24 bitmap!\n"); + exit(0); + } + // Read image data into the cache + UWORD x, y; + UBYTE Rdata[3]; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < bmpInfoHeader.biWidth ; x++) {//Show a line in the line + if(fread((char *)Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(fread((char *)Rdata+1, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(fread((char *)Rdata+2, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + + if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 0;//Black + }else if(Rdata[0] == 255 && Rdata[1] == 255 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 1;//White + }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 2;//Yellow + }else if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 3;//Red + // }else if(Rdata[0] == 0 && Rdata[1] == 128 && Rdata[2] == 255){ + // Image[x+(y* bmpInfoHeader.biWidth )] = 4;//Orange + }else if(Rdata[0] == 255 && Rdata[1] == 0 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 5;//Blue + }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 6;//Green + } + + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + Paint_SetPixel(Xstart + x, Ystart + y, Image[bmpInfoHeader.biHeight * bmpInfoHeader.biWidth - 1 -(bmpInfoHeader.biWidth-x-1+(y* bmpInfoHeader.biWidth))]); + } + } + return 0; +} + diff --git a/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.h b/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.h new file mode 100755 index 00000000..8c110f93 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.h @@ -0,0 +1,94 @@ +/***************************************************************************** +* | File : GUI_BMPfile.h +* | Author : Waveshare team +* | Function : Hardware underlying interface +* | Info : +* Used to shield the underlying layers of each master +* and enhance portability +*---------------- +* | This version: V2.3 +* | Date : 2020-07-27 +* | Info : +* ----------------------------------------------------------------------------- +* V2.3(2022-07-27): +* 1.Add GUI_ReadBmp_RGB_4Color() +* V2.2(2020-07-08): +* 1.Add GUI_ReadBmp_RGB_7Color() +* V2.1(2019-10-10): +* 1.Add GUI_ReadBmp_4Gray() +* V2.0(2018-11-12): +* 1.Change file name: GUI_BMP.h -> GUI_BMPfile.h +* 2.fix: GUI_ReadBmp() +* Now Xstart and Xstart can control the position of the picture normally, +* and support the display of images of any size. If it is larger than +* the actual display range, it will not be displayed. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef __GUI_BMPFILE_H +#define __GUI_BMPFILE_H + +#include +#include +#include +#include + +#include "DEV_Config.h" + +/*Bitmap file header 14bit*/ +typedef struct BMP_FILE_HEADER { + UWORD bType; //File identifier + UDOUBLE bSize; //The size of the file + UWORD bReserved1; //Reserved value, must be set to 0 + UWORD bReserved2; //Reserved value, must be set to 0 + UDOUBLE bOffset; //The offset from the beginning of the file header to the beginning of the image data bit +} __attribute__ ((packed)) BMPFILEHEADER; // 14bit + +/*Bitmap information header 40bit*/ +typedef struct BMP_INFO { + UDOUBLE biInfoSize; //The size of the header + UDOUBLE biWidth; //The width of the image + UDOUBLE biHeight; //The height of the image + UWORD biPlanes; //The number of planes in the image + UWORD biBitCount; //The number of bits per pixel + UDOUBLE biCompression; //Compression type + UDOUBLE bimpImageSize; //The size of the image, in bytes + UDOUBLE biXPelsPerMeter; //Horizontal resolution + UDOUBLE biYPelsPerMeter; //Vertical resolution + UDOUBLE biClrUsed; //The number of colors used + UDOUBLE biClrImportant; //The number of important colors +} __attribute__ ((packed)) BMPINFOHEADER; + +/*Color table: palette */ +typedef struct RGB_QUAD { + UBYTE rgbBlue; //Blue intensity + UBYTE rgbGreen; //Green strength + UBYTE rgbRed; //Red intensity + UBYTE rgbReversed; //Reserved value +} __attribute__ ((packed)) BMPRGBQUAD; +/**************************************** end ***********************************************/ + +UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart); +UBYTE GUI_ReadBmp_4Gray(const char *path, UWORD Xstart, UWORD Ystart); +UBYTE GUI_ReadBmp_16Gray(const char *path, UWORD Xstart, UWORD Ystart); +UBYTE GUI_ReadBmp_RGB_4Color(const char *path, UWORD Xstart, UWORD Ystart); +UBYTE GUI_ReadBmp_RGB_6Color(const char *path, UWORD Xstart, UWORD Ystart); +UBYTE GUI_ReadBmp_RGB_7Color(const char *path, UWORD Xstart, UWORD Ystart); +#endif diff --git a/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.c b/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.c new file mode 100755 index 00000000..672b716c --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.c @@ -0,0 +1,847 @@ +/****************************************************************************** +* | File : GUI_Paint.c +* | Author : Waveshare electronics +* | Function : Achieve drawing: draw points, lines, boxes, circles and +* their size, solid dotted line, solid rectangle hollow +* rectangle, solid circle hollow circle. +* | Info : +* Achieve display characters: Display a single character, string, number +* Achieve time display: adaptive size display time minutes and seconds +*---------------- +* | This version: V3.2 +* | Date : 2020-07-10 +* | Info : +* ----------------------------------------------------------------------------- +* V3.2(2020-07-10): +* 1.Change: Paint_SetScale(UBYTE scale) +* Add scale 7 for 5.65f e-Parper +* 2.Change: Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) +* Add the branch for scale 7 +* 3.Change: Paint_Clear(UWORD Color) +* Add the branch for scale 7 +* ----------------------------------------------------------------------------- +* V3.1(2019-10-10): +* 1. Add gray level +* PAINT Add Scale +* 2. Add void Paint_SetScale(UBYTE scale); +* ----------------------------------------------------------------------------- +* V3.0(2019-04-18): +* 1.Change: +* Paint_DrawPoint(..., DOT_STYLE DOT_STYLE) +* => Paint_DrawPoint(..., DOT_STYLE Dot_Style) +* Paint_DrawLine(..., LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel) +* => Paint_DrawLine(..., DOT_PIXEL Line_width, LINE_STYLE Line_Style) +* Paint_DrawRectangle(..., DRAW_FILL Filled, DOT_PIXEL Dot_Pixel) +* => Paint_DrawRectangle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +* Paint_DrawCircle(..., DRAW_FILL Draw_Fill, DOT_PIXEL Dot_Pixel) +* => Paint_DrawCircle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Filll) +* +* ----------------------------------------------------------------------------- +* V2.0(2018-11-15): +* 1.add: Paint_NewImage() +* Create an image's properties +* 2.add: Paint_SelectImage() +* Select the picture to be drawn +* 3.add: Paint_SetRotate() +* Set the direction of the cache +* 4.add: Paint_RotateImage() +* Can flip the picture, Support 0-360 degrees, +* but only 90.180.270 rotation is better +* 4.add: Paint_SetMirroring() +* Can Mirroring the picture, horizontal, vertical, origin +* 5.add: Paint_DrawString_CN() +* Can display Chinese(GB1312) +* +* ----------------------------------------------------------------------------- +* V1.0(2018-07-17): +* Create library +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documnetation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +* +******************************************************************************/ +#include "GUI_Paint.h" +#include "DEV_Config.h" +#include "Debug.h" +#include +#include +#include //memset() +#include + +PAINT Paint; + +/****************************************************************************** +function: Create Image +parameter: + image : Pointer to the image cache + width : The width of the picture + Height : The height of the picture + Color : Whether the picture is inverted +******************************************************************************/ +void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color) +{ + Paint.Image = NULL; + Paint.Image = image; + + Paint.WidthMemory = Width; + Paint.HeightMemory = Height; + Paint.Color = Color; + Paint.Scale = 2; + Paint.WidthByte = (Width % 8 == 0)? (Width / 8 ): (Width / 8 + 1); + Paint.HeightByte = Height; +// printf("WidthByte = %d, HeightByte = %d\r\n", Paint.WidthByte, Paint.HeightByte); +// printf(" EPD_WIDTH / 8 = %d\r\n", 122 / 8); + + Paint.Rotate = Rotate; + Paint.Mirror = MIRROR_NONE; + + if(Rotate == ROTATE_0 || Rotate == ROTATE_180) { + Paint.Width = Width; + Paint.Height = Height; + } else { + Paint.Width = Height; + Paint.Height = Width; + } +} + +/****************************************************************************** +function: Select Image +parameter: + image : Pointer to the image cache +******************************************************************************/ +void Paint_SelectImage(UBYTE *image) +{ + Paint.Image = image; +} + +/****************************************************************************** +function: Select Image Rotate +parameter: + Rotate : 0,90,180,270 +******************************************************************************/ +void Paint_SetRotate(UWORD Rotate) +{ + if(Rotate == ROTATE_0 || Rotate == ROTATE_90 || Rotate == ROTATE_180 || Rotate == ROTATE_270) { + Debug("Set image Rotate %d\r\n", Rotate); + Paint.Rotate = Rotate; + } else { + Debug("rotate = 0, 90, 180, 270\r\n"); + } +} + +/****************************************************************************** +function: Select Image mirror +parameter: + mirror :Not mirror,Horizontal mirror,Vertical mirror,Origin mirror +******************************************************************************/ +void Paint_SetMirroring(UBYTE mirror) +{ + if(mirror == MIRROR_NONE || mirror == MIRROR_HORIZONTAL || + mirror == MIRROR_VERTICAL || mirror == MIRROR_ORIGIN) { + Debug("mirror image x:%s, y:%s\r\n",(mirror & 0x01)? "mirror":"none", ((mirror >> 1) & 0x01)? "mirror":"none"); + Paint.Mirror = mirror; + } else { + Debug("mirror should be MIRROR_NONE, MIRROR_HORIZONTAL, \ + MIRROR_VERTICAL or MIRROR_ORIGIN\r\n"); + } +} + +void Paint_SetScale(UBYTE scale) +{ + if(scale == 2){ + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory % 8 == 0)? (Paint.WidthMemory / 8 ): (Paint.WidthMemory / 8 + 1); + }else if(scale == 4){ + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory % 4 == 0)? (Paint.WidthMemory / 4 ): (Paint.WidthMemory / 4 + 1); + }else if(scale == 6 || scale == 7 || scale == 16){ + /* 7 colours are only applicable with 5in65 e-Paper */ + /* 16 colours are used for dithering */ + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory % 2 == 0)? (Paint.WidthMemory / 2 ): (Paint.WidthMemory / 2 + 1);; + }else{ + Debug("Set Scale Input parameter error\r\n"); + Debug("Scale Only support: 2 4 7 16\r\n"); + } +} +/****************************************************************************** +function: Draw Pixels +parameter: + Xpoint : At point X + Ypoint : At point Y + Color : Painted colors +******************************************************************************/ +void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) +{ + if(Xpoint > Paint.Width || Ypoint > Paint.Height){ + Debug("Exceeding display boundaries\r\n"); + return; + } + UWORD X, Y; + switch(Paint.Rotate) { + case 0: + X = Xpoint; + Y = Ypoint; + break; + case 90: + X = Paint.WidthMemory - Ypoint - 1; + Y = Xpoint; + break; + case 180: + X = Paint.WidthMemory - Xpoint - 1; + Y = Paint.HeightMemory - Ypoint - 1; + break; + case 270: + X = Ypoint; + Y = Paint.HeightMemory - Xpoint - 1; + break; + default: + return; + } + + switch(Paint.Mirror) { + case MIRROR_NONE: + break; + case MIRROR_HORIZONTAL: + X = Paint.WidthMemory - X - 1; + break; + case MIRROR_VERTICAL: + Y = Paint.HeightMemory - Y - 1; + break; + case MIRROR_ORIGIN: + X = Paint.WidthMemory - X - 1; + Y = Paint.HeightMemory - Y - 1; + break; + default: + return; + } + + if(X > Paint.WidthMemory || Y > Paint.HeightMemory){ + Debug("Exceeding display boundaries\r\n"); + return; + } + + if(Paint.Scale == 2){ + UDOUBLE Addr = X / 8 + Y * Paint.WidthByte; + UBYTE Rdata = Paint.Image[Addr]; + if(Color == BLACK) + Paint.Image[Addr] = Rdata & ~(0x80 >> (X % 8)); + else + Paint.Image[Addr] = Rdata | (0x80 >> (X % 8)); + }else if(Paint.Scale == 4){ + UDOUBLE Addr = X / 4 + Y * Paint.WidthByte; + Color = Color % 4;//Guaranteed color scale is 4 --- 0~3 + UBYTE Rdata = Paint.Image[Addr]; + Rdata = Rdata & (~(0xC0 >> ((X % 4)*2)));//Clear first, then set value + Paint.Image[Addr] = Rdata | ((Color << 6) >> ((X % 4)*2)); + }else if(Paint.Scale == 6 || Paint.Scale == 7 || Paint.Scale == 16){ + UDOUBLE Addr = X / 2 + Y * Paint.WidthByte; + UBYTE Rdata = Paint.Image[Addr]; + Rdata = Rdata & (~(0xF0 >> ((X % 2)*4)));//Clear first, then set value + Paint.Image[Addr] = Rdata | ((Color << 4) >> ((X % 2)*4)); + // printf("Add = %d ,data = %d\r\n",Addr,Rdata); + } +} + +/****************************************************************************** +function: Clear the color of the picture +parameter: + Color : Painted colors +******************************************************************************/ +void Paint_Clear(UWORD Color) +{ + if(Paint.Scale == 2) { + for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { + for (UWORD X = 0; X < Paint.WidthByte; X++ ) {//8 pixel = 1 byte + UDOUBLE Addr = X + Y*Paint.WidthByte; + Paint.Image[Addr] = Color; + } + } + }else if(Paint.Scale == 4) { + for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { + for (UWORD X = 0; X < Paint.WidthByte; X++ ) { + UDOUBLE Addr = X + Y*Paint.WidthByte; + Paint.Image[Addr] = (Color<<6)|(Color<<4)|(Color<<2)|Color; + } + } + }else if(Paint.Scale == 6 || Paint.Scale == 7 || Paint.Scale == 16) { + for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { + for (UWORD X = 0; X < Paint.WidthByte; X++ ) { + UDOUBLE Addr = X + Y*Paint.WidthByte; + Paint.Image[Addr] = (Color<<4)|Color; + } + } + } +} + +/****************************************************************************** +function: Clear the color of a window +parameter: + Xstart : x starting point + Ystart : Y starting point + Xend : x end point + Yend : y end point + Color : Painted colors +******************************************************************************/ +void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color) +{ + UWORD X, Y; + for (Y = Ystart; Y < Yend; Y++) { + for (X = Xstart; X < Xend; X++) {//8 pixel = 1 byte + Paint_SetPixel(X, Y, Color); + } + } +} + +/****************************************************************************** +function: Draw Point(Xpoint, Ypoint) Fill the color +parameter: + Xpoint : The Xpoint coordinate of the point + Ypoint : The Ypoint coordinate of the point + Color : Painted color + Dot_Pixel : point size + Dot_Style : point Style +******************************************************************************/ +void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, + DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style) +{ + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DrawPoint Input exceeds the normal display range\r\n"); + return; + } + + int16_t XDir_Num , YDir_Num; + if (Dot_Style == DOT_FILL_AROUND) { + for (XDir_Num = 0; XDir_Num < 2 * Dot_Pixel - 1; XDir_Num++) { + for (YDir_Num = 0; YDir_Num < 2 * Dot_Pixel - 1; YDir_Num++) { + if(Xpoint + XDir_Num - Dot_Pixel < 0 || Ypoint + YDir_Num - Dot_Pixel < 0) + break; + // printf("x = %d, y = %d\r\n", Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel); + Paint_SetPixel(Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel, Color); + } + } + } else { + for (XDir_Num = 0; XDir_Num < Dot_Pixel; XDir_Num++) { + for (YDir_Num = 0; YDir_Num < Dot_Pixel; YDir_Num++) { + Paint_SetPixel(Xpoint + XDir_Num - 1, Ypoint + YDir_Num - 1, Color); + } + } + } +} + +/****************************************************************************** +function: Draw a line of arbitrary slope +parameter: + Xstart :Starting Xpoint point coordinates + Ystart :Starting Xpoint point coordinates + Xend :End point Xpoint coordinate + Yend :End point Ypoint coordinate + Color :The color of the line segment + Line_width : Line width + Line_Style: Solid and dotted lines +******************************************************************************/ +void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, + UWORD Color, DOT_PIXEL Line_width, LINE_STYLE Line_Style) +{ + if (Xstart > Paint.Width || Ystart > Paint.Height || + Xend > Paint.Width || Yend > Paint.Height) { + Debug("Paint_DrawLine Input exceeds the normal display range\r\n"); + return; + } + + UWORD Xpoint = Xstart; + UWORD Ypoint = Ystart; + int dx = (int)Xend - (int)Xstart >= 0 ? Xend - Xstart : Xstart - Xend; + int dy = (int)Yend - (int)Ystart <= 0 ? Yend - Ystart : Ystart - Yend; + + // Increment direction, 1 is positive, -1 is counter; + int XAddway = Xstart < Xend ? 1 : -1; + int YAddway = Ystart < Yend ? 1 : -1; + + //Cumulative error + int Esp = dx + dy; + char Dotted_Len = 0; + + for (;;) { + Dotted_Len++; + //Painted dotted line, 2 point is really virtual + if (Line_Style == LINE_STYLE_DOTTED && Dotted_Len % 3 == 0) { + //Debug("LINE_DOTTED\r\n"); + Paint_DrawPoint(Xpoint, Ypoint, IMAGE_BACKGROUND, Line_width, DOT_STYLE_DFT); + Dotted_Len = 0; + } else { + Paint_DrawPoint(Xpoint, Ypoint, Color, Line_width, DOT_STYLE_DFT); + } + if (2 * Esp >= dy) { + if (Xpoint == Xend) + break; + Esp += dy; + Xpoint += XAddway; + } + if (2 * Esp <= dx) { + if (Ypoint == Yend) + break; + Esp += dx; + Ypoint += YAddway; + } + } +} + +/****************************************************************************** +function: Draw a rectangle +parameter: + Xstart :Rectangular Starting Xpoint point coordinates + Ystart :Rectangular Starting Xpoint point coordinates + Xend :Rectangular End point Xpoint coordinate + Yend :Rectangular End point Ypoint coordinate + Color :The color of the Rectangular segment + Line_width: Line width + Draw_Fill : Whether to fill the inside of the rectangle +******************************************************************************/ +void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, + UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +{ + if (Xstart > Paint.Width || Ystart > Paint.Height || + Xend > Paint.Width || Yend > Paint.Height) { + Debug("Input exceeds the normal display range\r\n"); + return; + } + + if (Draw_Fill) { + UWORD Ypoint; + for(Ypoint = Ystart; Ypoint < Yend; Ypoint++) { + Paint_DrawLine(Xstart, Ypoint, Xend, Ypoint, Color , Line_width, LINE_STYLE_SOLID); + } + } else { + Paint_DrawLine(Xstart, Ystart, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xstart, Ystart, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xend, Yend, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xend, Yend, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID); + } +} + +/****************************************************************************** +function: Use the 8-point method to draw a circle of the + specified size at the specified position-> +parameter: + X_Center :Center X coordinate + Y_Center :Center Y coordinate + Radius :circle Radius + Color :The color of the :circle segment + Line_width: Line width + Draw_Fill : Whether to fill the inside of the Circle +******************************************************************************/ +void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, + UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +{ + if (X_Center > Paint.Width || Y_Center >= Paint.Height) { + Debug("Paint_DrawCircle Input exceeds the normal display range\r\n"); + return; + } + + //Draw a circle from(0, R) as a starting point + int16_t XCurrent, YCurrent; + XCurrent = 0; + YCurrent = Radius; + + //Cumulative error,judge the next point of the logo + int16_t Esp = 3 - (Radius << 1 ); + + int16_t sCountY; + if (Draw_Fill == DRAW_FILL_FULL) { + while (XCurrent <= YCurrent ) { //Realistic circles + for (sCountY = XCurrent; sCountY <= YCurrent; sCountY ++ ) { + Paint_DrawPoint(X_Center + XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//1 + Paint_DrawPoint(X_Center - XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//2 + Paint_DrawPoint(X_Center - sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//3 + Paint_DrawPoint(X_Center - sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//4 + Paint_DrawPoint(X_Center - XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//5 + Paint_DrawPoint(X_Center + XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//6 + Paint_DrawPoint(X_Center + sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//7 + Paint_DrawPoint(X_Center + sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + if (Esp < 0 ) + Esp += 4 * XCurrent + 6; + else { + Esp += 10 + 4 * (XCurrent - YCurrent ); + YCurrent --; + } + XCurrent ++; + } + } else { //Draw a hollow circle + while (XCurrent <= YCurrent ) { + Paint_DrawPoint(X_Center + XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//1 + Paint_DrawPoint(X_Center - XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//2 + Paint_DrawPoint(X_Center - YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//3 + Paint_DrawPoint(X_Center - YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//4 + Paint_DrawPoint(X_Center - XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//5 + Paint_DrawPoint(X_Center + XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//6 + Paint_DrawPoint(X_Center + YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//7 + Paint_DrawPoint(X_Center + YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//0 + + if (Esp < 0 ) + Esp += 4 * XCurrent + 6; + else { + Esp += 10 + 4 * (XCurrent - YCurrent ); + YCurrent --; + } + XCurrent ++; + } + } +} + +/****************************************************************************** +function: Show English characters +parameter: + Xpoint :X coordinate + Ypoint :Y coordinate + Acsii_Char :To display the English characters + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawChar(UWORD Xpoint, UWORD Ypoint, const char Acsii_Char, + sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) +{ + UWORD Page, Column; + + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DrawChar Input exceeds the normal display range\r\n"); + return; + } + + uint32_t Char_Offset = (Acsii_Char - ' ') * Font->Height * (Font->Width / 8 + (Font->Width % 8 ? 1 : 0)); + const unsigned char *ptr = &Font->table[Char_Offset]; + + for (Page = 0; Page < Font->Height; Page ++ ) { + for (Column = 0; Column < Font->Width; Column ++ ) { + + //To determine whether the font background color and screen background color is consistent + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (Column % 8))) + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + if (*ptr & (0x80 >> (Column % 8))) { + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Background); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + //One pixel is 8 bits + if (Column % 8 == 7) + ptr++; + }// Write a line + if (Font->Width % 8 != 0) + ptr++; + }// Write all +} + +/****************************************************************************** +function: Display the string +parameter: + Xstart :X coordinate + Ystart :Y coordinate + pString :The first address of the English string to be displayed + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, + sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) +{ + UWORD Xpoint = Xstart; + UWORD Ypoint = Ystart; + + if (Xstart > Paint.Width || Ystart > Paint.Height) { + Debug("Paint_DrawString_EN Input exceeds the normal display range\r\n"); + return; + } + + while (* pString != '\0') { + //if X direction filled , reposition to(Xstart,Ypoint),Ypoint is Y direction plus the Height of the character + if ((Xpoint + Font->Width ) > Paint.Width ) { + Xpoint = Xstart; + Ypoint += Font->Height; + } + + // If the Y direction is full, reposition to(Xstart, Ystart) + if ((Ypoint + Font->Height ) > Paint.Height ) { + Xpoint = Xstart; + Ypoint = Ystart; + } + Paint_DrawChar(Xpoint, Ypoint, * pString, Font, Color_Background, Color_Foreground); + + //The next character of the address + pString ++; + + //The next word of the abscissa increases the font of the broadband + Xpoint += Font->Width; + } +} + + +/****************************************************************************** +function: Display the string +parameter: + Xstart :X coordinate + Ystart :Y coordinate + pString :The first address of the Chinese string and English + string to be displayed + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, + UWORD Color_Foreground, UWORD Color_Background) +{ + const char* p_text = pString; + int x = Xstart, y = Ystart; + int i, j,Num; + + /* Send the string character by character on EPD */ + while (*p_text != 0) { + if(*p_text <= 0x7F) { //ASCII < 126 + for(Num = 0; Num < font->size; Num++) { + if(*p_text== font->table[Num].index[0]) { + const char* ptr = &font->table[Num].matrix[0]; + + for (j = 0; j < font->Height; j++) { + for (i = 0; i < font->Width; i++) { + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } else { + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(x + i, y + j, Color_Background); + // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + if (i % 8 == 7) { + ptr++; + } + } + if (font->Width % 8 != 0) { + ptr++; + } + } + break; + } + } + /* Point on the next character */ + p_text += 1; + /* Decrement the column position by 16 */ + x += font->ASCII_Width; + } else { //Chinese + for(Num = 0; Num < font->size; Num++) { + if((*p_text== font->table[Num].index[0]) && (*(p_text+1) == font->table[Num].index[1])) { + const char* ptr = &font->table[Num].matrix[0]; + + for (j = 0; j < font->Height; j++) { + for (i = 0; i < font->Width; i++) { + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } else { + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(x + i, y + j, Color_Background); + // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + if (i % 8 == 7) { + ptr++; + } + } + if (font->Width % 8 != 0) { + ptr++; + } + } + break; + } + } + /* Point on the next character */ + p_text += 2; + /* Decrement the column position by 16 */ + x += font->Width; + } + } +} + +/****************************************************************************** +function: Display nummber +parameter: + Xstart :X coordinate + Ystart : Y coordinate + Nummber : The number displayed + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +#define ARRAY_LEN 255 +void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, + sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) +{ + + int16_t Num_Bit = 0, Str_Bit = 0; + uint8_t Str_Array[ARRAY_LEN] = {0}, Num_Array[ARRAY_LEN] = {0}; + uint8_t *pStr = Str_Array; + + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DisNum Input exceeds the normal display range\r\n"); + return; + } + + //Converts a number to a string + do { + Num_Array[Num_Bit] = Nummber % 10 + '0'; + Num_Bit++; + Nummber /= 10; + } while(Nummber); + + + //The string is inverted + while (Num_Bit > 0) { + Str_Array[Str_Bit] = Num_Array[Num_Bit - 1]; + Str_Bit ++; + Num_Bit --; + } + + //show + Paint_DrawString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground); +} + +/****************************************************************************** +function: Display nummber (Able to display decimals) +parameter: + Xstart :X coordinate + Ystart : Y coordinate + Nummber : The number displayed + Font :A structure pointer that displays a character size + Digit : Fractional width + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawNumDecimals(UWORD Xpoint, UWORD Ypoint, double Nummber, + sFONT* Font, UWORD Digit, UWORD Color_Foreground, UWORD Color_Background) +{ + int16_t Num_Bit = 0, Str_Bit = 0; + uint8_t Str_Array[ARRAY_LEN] = {0}, Num_Array[ARRAY_LEN] = {0}; + uint8_t *pStr = Str_Array; + int temp = Nummber; + float decimals; + uint8_t i; + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DisNum Input exceeds the normal display range\r\n"); + return; + } + + if(Digit > 0) { + decimals = Nummber - temp; + for(i=Digit; i > 0; i--) { + decimals*=10; + } + temp = decimals; + //Converts a number to a string + for(i=Digit; i>0; i--) { + Num_Array[Num_Bit] = temp % 10 + '0'; + Num_Bit++; + temp /= 10; + } + Num_Array[Num_Bit] = '.'; + Num_Bit++; + } + + temp = Nummber; + //Converts a number to a string + do { + Num_Array[Num_Bit] = temp % 10 + '0'; + Num_Bit++; + temp /= 10; + } while(temp); + + //The string is inverted + while (Num_Bit > 0) { + Str_Array[Str_Bit] = Num_Array[Num_Bit - 1]; + Str_Bit ++; + Num_Bit --; + } + + //show + Paint_DrawString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground); +} + +/****************************************************************************** +function: Display time +parameter: + Xstart :X coordinate + Ystart : Y coordinate + pTime : Time-related structures + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, + UWORD Color_Foreground, UWORD Color_Background) +{ + uint8_t value[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; + + UWORD Dx = Font->Width; + + //Write data into the cache + Paint_DrawChar(Xstart , Ystart, value[pTime->Hour / 10], Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx , Ystart, value[pTime->Hour % 10], Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx + Dx / 4 + Dx / 2 , Ystart, ':' , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 2 + Dx / 2 , Ystart, value[pTime->Min / 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 3 + Dx / 2 , Ystart, value[pTime->Min % 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 4 + Dx / 2 - Dx / 4, Ystart, ':' , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 5 , Ystart, value[pTime->Sec / 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 6 , Ystart, value[pTime->Sec % 10] , Font, Color_Background, Color_Foreground); +} + +/****************************************************************************** +function: Display monochrome bitmap +parameter: + image_buffer :A picture data converted to a bitmap +info: + Use a computer to convert the image into a corresponding array, + and then embed the array directly into Imagedata.cpp as a .c file. +******************************************************************************/ +void Paint_DrawBitMap(const unsigned char* image_buffer) +{ + UWORD x, y; + UDOUBLE Addr = 0; + + for (y = 0; y < Paint.HeightByte; y++) { + for (x = 0; x < Paint.WidthByte; x++) {//8 pixel = 1 byte + Addr = x + y * Paint.WidthByte; + Paint.Image[Addr] = (unsigned char)image_buffer[Addr]; + } + } +} diff --git a/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.h b/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.h new file mode 100755 index 00000000..ceeacfd6 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.h @@ -0,0 +1,217 @@ +/****************************************************************************** +* | File : GUI_Paint.h +* | Author : Waveshare electronics +* | Function : Achieve drawing: draw points, lines, boxes, circles and +* their size, solid dotted line, solid rectangle hollow +* rectangle, solid circle hollow circle. +* | Info : +* Achieve display characters: Display a single character, string, number +* Achieve time display: adaptive size display time minutes and seconds +*---------------- +* | This version: V3.1 +* | Date : 2019-10-10 +* | Info : +* ----------------------------------------------------------------------------- +* V3.1(2019-10-10): +* 1. Add gray level +* PAINT Add Scale +* 2. Add void Paint_SetScale(UBYTE scale); +* +* V3.0(2019-04-18): +* 1.Change: +* Paint_DrawPoint(..., DOT_STYLE DOT_STYLE) +* => Paint_DrawPoint(..., DOT_STYLE Dot_Style) +* Paint_DrawLine(..., LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel) +* => Paint_DrawLine(..., DOT_PIXEL Line_width, LINE_STYLE Line_Style) +* Paint_DrawRectangle(..., DRAW_FILL Filled, DOT_PIXEL Dot_Pixel) +* => Paint_DrawRectangle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +* Paint_DrawCircle(..., DRAW_FILL Draw_Fill, DOT_PIXEL Dot_Pixel) +* => Paint_DrawCircle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Filll) +* +* ----------------------------------------------------------------------------- +* V2.0(2018-11-15): +* 1.add: Paint_NewImage() +* Create an image's properties +* 2.add: Paint_SelectImage() +* Select the picture to be drawn +* 3.add: Paint_SetRotate() +* Set the direction of the cache +* 4.add: Paint_RotateImage() +* Can flip the picture, Support 0-360 degrees, +* but only 90.180.270 rotation is better +* 4.add: Paint_SetMirroring() +* Can Mirroring the picture, horizontal, vertical, origin +* 5.add: Paint_DrawString_CN() +* Can display Chinese(GB1312) +* +* ----------------------------------------------------------------------------- +* V1.0(2018-07-17): +* Create library +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documnetation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +* +******************************************************************************/ +#ifndef __GUI_PAINT_H +#define __GUI_PAINT_H + +#include "DEV_Config.h" +#include "../Fonts/fonts.h" + +/** + * Image attributes +**/ +typedef struct { + UBYTE *Image; + UWORD Width; + UWORD Height; + UWORD WidthMemory; + UWORD HeightMemory; + UWORD Color; + UWORD Rotate; + UWORD Mirror; + UWORD WidthByte; + UWORD HeightByte; + UWORD Scale; +} PAINT; +extern PAINT Paint; + +/** + * Display rotate +**/ +#define ROTATE_0 0 +#define ROTATE_90 90 +#define ROTATE_180 180 +#define ROTATE_270 270 + +/** + * Display Flip +**/ +typedef enum { + MIRROR_NONE = 0x00, + MIRROR_HORIZONTAL = 0x01, + MIRROR_VERTICAL = 0x02, + MIRROR_ORIGIN = 0x03, +} MIRROR_IMAGE; +#define MIRROR_IMAGE_DFT MIRROR_NONE + +/** + * image color +**/ +#define WHITE 0xFF +#define BLACK 0x00 +#define RED BLACK + +#define IMAGE_BACKGROUND WHITE +#define FONT_FOREGROUND BLACK +#define FONT_BACKGROUND WHITE + +//4 Gray level +#define GRAY1 0x03 //Blackest +#define GRAY2 0x02 +#define GRAY3 0x01 //gray +#define GRAY4 0x00 //white + +/** + * The size of the point +**/ +typedef enum { + DOT_PIXEL_1X1 = 1, // 1 x 1 + DOT_PIXEL_2X2 , // 2 X 2 + DOT_PIXEL_3X3 , // 3 X 3 + DOT_PIXEL_4X4 , // 4 X 4 + DOT_PIXEL_5X5 , // 5 X 5 + DOT_PIXEL_6X6 , // 6 X 6 + DOT_PIXEL_7X7 , // 7 X 7 + DOT_PIXEL_8X8 , // 8 X 8 +} DOT_PIXEL; +#define DOT_PIXEL_DFT DOT_PIXEL_1X1 //Default dot pilex + +/** + * Point size fill style +**/ +typedef enum { + DOT_FILL_AROUND = 1, // dot pixel 1 x 1 + DOT_FILL_RIGHTUP , // dot pixel 2 X 2 +} DOT_STYLE; +#define DOT_STYLE_DFT DOT_FILL_AROUND //Default dot pilex + +/** + * Line style, solid or dashed +**/ +typedef enum { + LINE_STYLE_SOLID = 0, + LINE_STYLE_DOTTED, +} LINE_STYLE; + +/** + * Whether the graphic is filled +**/ +typedef enum { + DRAW_FILL_EMPTY = 0, + DRAW_FILL_FULL, +} DRAW_FILL; + +/** + * Custom structure of a time attribute +**/ +typedef struct { + UWORD Year; //0000 + UBYTE Month; //1 - 12 + UBYTE Day; //1 - 30 + UBYTE Hour; //0 - 23 + UBYTE Min; //0 - 59 + UBYTE Sec; //0 - 59 +} PAINT_TIME; +extern PAINT_TIME sPaint_time; + +//init and Clear +void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color); +void Paint_SelectImage(UBYTE *image); +void Paint_SetRotate(UWORD Rotate); +void Paint_SetMirroring(UBYTE mirror); +void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color); +void Paint_SetScale(UBYTE scale); + +void Paint_Clear(UWORD Color); +void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color); + +//Drawing +void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_FillWay); +void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, LINE_STYLE Line_Style); +void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill); +void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill); + +//Display string +void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Acsii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawNumDecimals(UWORD Xpoint, UWORD Ypoint, double Nummber, sFONT* Font, UWORD Digit, UWORD Color_Foreground, UWORD Color_Background); // Able to display decimals +void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); + +//pic +void Paint_DrawBitMap(const unsigned char* image_buffer); + + +#endif + + + + + diff --git a/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.c b/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.c new file mode 100755 index 00000000..31b6e500 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.c @@ -0,0 +1,261 @@ +/***************************************************************************** +* | File : EPD_2in15b.c +* | Author : Waveshare team +* | Function : 2.15inch e-paper b +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2024-08-07 +* | Info : +* ----------------------------------------------------------------------------- +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "EPD_2in15b.h" +#include "Debug.h" +#include "time.h" + +/****************************************************************************** +function : Software reset +parameter: +******************************************************************************/ +static void EPD_2IN15B_Reset(void) +{ + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(200); + DEV_Digital_Write(EPD_RST_PIN, 0); + DEV_Delay_ms(2); + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(200); +} + +/****************************************************************************** +function : send command +parameter: + Reg : Command register +******************************************************************************/ +static void EPD_2IN15B_SendCommand(UBYTE Reg) +{ + DEV_Digital_Write(EPD_DC_PIN, 0); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_WriteByte(Reg); + DEV_Digital_Write(EPD_CS_PIN, 1); +} + +/****************************************************************************** +function : send data +parameter: + Data : Write data +******************************************************************************/ +static void EPD_2IN15B_SendData(UBYTE Data) +{ + DEV_Digital_Write(EPD_DC_PIN, 1); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_WriteByte(Data); + DEV_Digital_Write(EPD_CS_PIN, 1); +} + +/****************************************************************************** +function : Wait until the busy_pin goes LOW +parameter: +******************************************************************************/ +static void EPD_2IN15B_ReadBusy(void) +{ + Debug("e-Paper busy\r\n"); + DEV_Delay_ms(50); + while(DEV_Digital_Read(EPD_BUSY_PIN) == 1) { //LOW: idle, HIGH: busy + DEV_Delay_ms(10); + } + DEV_Delay_ms(50); + Debug("e-Paper busy release\r\n"); +} + +/****************************************************************************** +function : Turn On Display +parameter: +******************************************************************************/ +static void EPD_2IN15B_TurnOnDisplay(void) +{ + EPD_2IN15B_SendCommand(0x20); + EPD_2IN15B_ReadBusy(); +} + +/****************************************************************************** +function : Setting the display window +parameter: +******************************************************************************/ +static void EPD_2IN15B_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend) +{ + EPD_2IN15B_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION + EPD_2IN15B_SendData((Xstart>>3) & 0x1F); + EPD_2IN15B_SendData((Xend>>3) & 0x1F); + + EPD_2IN15B_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION + EPD_2IN15B_SendData(Ystart & 0xFF); + EPD_2IN15B_SendData((Ystart >> 8) & 0x01); + EPD_2IN15B_SendData(Yend & 0xFF); + EPD_2IN15B_SendData((Yend >> 8) & 0x01); +} + +/****************************************************************************** +function : Set Cursor +parameter: +******************************************************************************/ +static void EPD_2IN15B_SetCursor(UWORD Xstart, UWORD Ystart) +{ + EPD_2IN15B_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER + EPD_2IN15B_SendData(Xstart & 0x1F); + + EPD_2IN15B_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER + EPD_2IN15B_SendData(Ystart & 0xFF); + EPD_2IN15B_SendData((Ystart >> 8) & 0x01); +} + +/****************************************************************************** +function : Initialize the e-Paper register +parameter: +******************************************************************************/ +void EPD_2IN15B_Init(void) +{ + EPD_2IN15B_Reset(); + EPD_2IN15B_ReadBusy(); + EPD_2IN15B_SendCommand(0x12);//soft reset + EPD_2IN15B_ReadBusy(); + + EPD_2IN15B_SendCommand(0x11); //data entry mode + EPD_2IN15B_SendData(0x03); + + EPD_2IN15B_SetWindows(0, 0, EPD_2IN15B_WIDTH-1, EPD_2IN15B_HEIGHT-1); + + EPD_2IN15B_SendCommand(0x3C); // Display update control + EPD_2IN15B_SendData(0x05); + + EPD_2IN15B_SetCursor(0, 0); + EPD_2IN15B_ReadBusy(); +} + +/****************************************************************************** +function : Sends the image buffer in RAM to e-Paper and displays +parameter: +******************************************************************************/ +void EPD_2IN15B_Display(UBYTE *ImageBlack, UBYTE*ImageRed) +{ + UWORD Width, Height; + Width = (EPD_2IN15B_WIDTH % 8 == 0)? (EPD_2IN15B_WIDTH / 8 ): (EPD_2IN15B_WIDTH / 8 + 1); + Height = EPD_2IN15B_HEIGHT; + + EPD_2IN15B_SendCommand(0x24); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN15B_SendData(ImageBlack[i + j * Width]); + } + } + + EPD_2IN15B_SendCommand(0x26); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN15B_SendData(~ImageRed[i + j * Width]); + } + } + + EPD_2IN15B_TurnOnDisplay(); +} + +/****************************************************************************** +function : Clear screen +parameter: +******************************************************************************/ +void EPD_2IN15B_Clear(void) +{ + UWORD Width, Height; + Width = (EPD_2IN15B_WIDTH % 8 == 0)? (EPD_2IN15B_WIDTH / 8 ): (EPD_2IN15B_WIDTH / 8 + 1); + Height = EPD_2IN15B_HEIGHT; + + EPD_2IN15B_SendCommand(0x24); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN15B_SendData(0xff); + } + } + EPD_2IN15B_SendCommand(0x26); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN15B_SendData(0x00); + } + } + EPD_2IN15B_TurnOnDisplay(); +} + +void EPD_2IN15B_Clear_Black(void) +{ + UWORD Width, Height; + Width = (EPD_2IN15B_WIDTH % 8 == 0)? (EPD_2IN15B_WIDTH / 8 ): (EPD_2IN15B_WIDTH / 8 + 1); + Height = EPD_2IN15B_HEIGHT; + + EPD_2IN15B_SendCommand(0x24); + + for (UWORD j = 0; j < Height-50; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN15B_SendData(0xff); + } + } + for (UWORD j = 0; j < 50; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN15B_SendData(0x00); + } + } + EPD_2IN15B_SendCommand(0x26); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN15B_SendData(0x00); + } + } + EPD_2IN15B_TurnOnDisplay(); +} + +void EPD_2IN15B_Clear_Red(void) +{ + UWORD Width, Height; + Width = (EPD_2IN15B_WIDTH % 8 == 0)? (EPD_2IN15B_WIDTH / 8 ): (EPD_2IN15B_WIDTH / 8 + 1); + Height = EPD_2IN15B_HEIGHT; + + EPD_2IN15B_SendCommand(0x24); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN15B_SendData(0xff); + } + } + EPD_2IN15B_SendCommand(0x26); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN15B_SendData(0xff); + } + } + EPD_2IN15B_TurnOnDisplay(); +} + +/****************************************************************************** +function : Enter sleep mode +parameter: +******************************************************************************/ +void EPD_2IN15B_Sleep(void) +{ + EPD_2IN15B_SendCommand(0x10); + EPD_2IN15B_SendData(0x01); +} diff --git a/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.h b/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.h new file mode 100755 index 00000000..73112ed7 --- /dev/null +++ b/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.h @@ -0,0 +1,45 @@ +/***************************************************************************** +* | File : EPD_2in15b.h +* | Author : Waveshare team +* | Function : 2.15inch e-paper b +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2024-08-07 +* | Info : +* ----------------------------------------------------------------------------- +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# z**/ +#ifndef __EPD_2IN15B_H_ +#define __EPD_2IN15B_H_ + +#include "DEV_Config.h" + +// Display resolution +#define EPD_2IN15B_WIDTH 160 +#define EPD_2IN15B_HEIGHT 296 + + +void EPD_2IN15B_Init(void); +void EPD_2IN15B_Display(UBYTE *ImageBlack, UBYTE*ImageRed); +void EPD_2IN15B_Clear(void); +void EPD_2IN15B_Clear_Black(void); +void EPD_2IN15B_Clear_Red(void); +void EPD_2IN15B_Sleep(void); +#endif diff --git a/display_app/2in15_e-Paper_B/pic/2.15__b.bmp b/display_app/2in15_e-Paper_B/pic/2.15__b.bmp new file mode 100755 index 0000000000000000000000000000000000000000..3a10cf1e75ff2f8dfbf0de3ded6516e8870bb8a5 GIT binary patch literal 5982 zcmd6qy^a+(6vt;l3JqdQlp-2R%9JTkW=RpzGlzlH^~(n1q!6R zKqTf$NVI1~<0#&7&WG>FfBUcuK}h)O&d1NkKF9Vs$DZ$gczn0h@-1KQ^Zz%wA9URT z|MumNJ6$LL8w}*nC4HI_oNhh#Pb(K4o7S?rw?hHvNQKQeTNV$H_52#q=GkF!Y~-jD z9dW~#rDO&=jG-;YmS*pHh)#X%`i3H#w~asw+d&}ARoM27D*KLv;at%(9WTt)?!sfz zJcUu}!%z(UUGLpQL{{BJ24yOCex(~>3Ci0fwcXtT?lwo&!sTm`kS z8i!*uJ!r=^%`Mxdb?nlSqtwIj@uJ7e@Wx9I%jxV2|iyW|>vIPCP?5tg*>5E?b`)jX&?{sKP zH0=xZzw=}4N*0HG?V3CKpM`UkPfY~Ik%FdSWTZiZIh&r0Y{gr!WD0}W+?Q}CR(q@z z;%AjhGf-pXu+x^sTP34TmMo4AgGDj91ba_rsMk6|y~VjL+%9VX|o+ymTPpM-q+?*3w#$8)c4&i(~d z>P!66VPCZjiKUmC^$7UQ+vDAHle1qYXCE|nRq2s6zrs9}dS>w$1m{86Hzmt?1Liri zpB=fgmSKEYy~oOye8Q=$mD;HG;n^pg^il(7A39dH;fkfuiTZt506$DRf4E=T83fNw znZX`m=b$Sjgu(^j&TB|9sbcGJ@~={@0h&q|f=hfn3L1ucgj2 z?w9ZMQ|vCKUI6TQ$<`d^D%%44jCUTohB^6a{;{@({i+&=NHlD$+fjF?Z`tjYtZiHO z_2KU{mThL8&DX$UCuf?!frajv8J=Ir7@Q+0JP^54{x4;U!qD$`#>Pd6A2JiCS&A_{ zM@(@uumI}a=n)q5(${)M0v`%07so{bKg5l=PXxWQNk~OqrW)`&o?lGhyp^kRgq`6k ze^#4A+17F_<|dEvSI#J-DckZi2?HHAb!dxZz_#pKq{JI8#)2)5$FNIS#9WozqM+$r z6N65>7MTwC_G5>VX@YORM4E>2%s@fD7clP<>AJzUA5G$?@lmOrwow?Y2mK@r*Mn{e zL%*U!WiVyb2a!AF|59j}Ms5mzPoww&4T}&zkcQ9}*rk5*{0VKX%`4E6`vF@r^PD4B zeGWIwe`e9^v9%2IUt512LBBW2)y&zCF!pnQkRvjyVqYlwn#rNB8C!eBn6XwEGnwI8 zMIpvamV=nd3}PlTh#6yR$5EewrFDEVSSQ6b-s_7udz^2!ES>$@$fY;y*lIs;a$T$R GqsV{uiF~jC literal 0 HcmV?d00001 diff --git a/display_app/2in15_e-Paper_B/pic/2.15__r.bmp b/display_app/2in15_e-Paper_B/pic/2.15__r.bmp new file mode 100755 index 0000000000000000000000000000000000000000..9d59db77d5fe9e5583388f1e38a0183f90360988 GIT binary patch literal 5982 zcmeI0J#N)N5XWb6ggY!MsMwa014P+~o-1&MP$D7LH{b~2D3(B?%oQ9_&^i^4V!Zrk z{ordla9CUHEXE_EOXTvtgp0gs5P6sW^>RiZuGgy4Osfu7&W)z zjgc_Qxt1?uqy4jD>z&qF`D2w_HzVPT#Zo?;N}s`6X)mQygIPL0>`Hsqx|^Bjf(Uzo z3nEzL2He0VKE#A>Jko4<_E*@}bL}oV1g2xV&#dlsy!o&z`=Cw<%~mp>5}K`KAt%3N z5ib|1vsmgYoU-LyOpJm#bhGbDoyp)_BXxIS*19-4gII%7=X4y%frtb5ht5kd^5;{+ z(q&$(dO*=h9p%HgoQr~E+>SW}Eax_eOft`|h&4j$6^qZ)#$pCxyenH zWTTsmKA2?P+(=VYbLkS16uE-#N;61E=qASxtYR+BmEJRG10<%@fpwBaUP9;sw}xQe z$Z5mogwCoZL`wIISq`)-efeXoE!XAHg2AH96?7I;^@UFDRoF6Eg`=pfIXiP}cFey{ z3VZpXSTZ-%ozzuh(@R!Q{J1FRR&!7~m!h(_JeJG3%VSxv{8$#uIhvfO`dodF1z2K6m$bO=kIwnCT!tBX_zTYbfmJ?pWx&WK|lL zMQ+%ut|oYoG4rKW^{DS$cX+j|%=5i9HwBCA+e{U9)T+xln8^=&1}j;I)?9U1t>w9) z8dtXDbf&|4SeYL&3%aMFUs*uqm{IIj7IP1=FYU^f9%5hCb$=w{zQVeDUr-Ir#vMc0 z*Y>cBmUZiS&-(n1fG;-~Od~eLe1o<89Ut6jt3CX=msxwmmux7rcGck#@s4#}m{x{j voG|N~bqy}~F|z^T?bcw1;m}-1ip}&;F*u}IZ?L=oe!$^ni2ae_Z(=_IWCdBQ literal 0 HcmV?d00001 diff --git a/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.c b/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.c new file mode 100755 index 00000000..6b76a99d --- /dev/null +++ b/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.c @@ -0,0 +1,103 @@ +#include "EPD_Test.h" +#include "EPD_2in15b.h" +#include + +int EPD_2in15b_Manager(void) +{ + printf("EPD_2IN15B_test Demo\r\n"); + if(DEV_Module_Init()!=0){ + return -1; + } + + printf("e-Paper Init and Clear...\r\n"); + EPD_2IN15B_Init(); + EPD_2IN15B_Clear(); + DEV_Delay_ms(500); + + //Create a new image cache + UBYTE *BlackImage, *RedImage; + /* you have to edit the startup_stm32fxxx.s file and set a big enough heap size */ + UWORD Imagesize = ((EPD_2IN15B_WIDTH % 8 == 0)? (EPD_2IN15B_WIDTH / 8 ): (EPD_2IN15B_WIDTH / 8 + 1)) * EPD_2IN15B_HEIGHT; + if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) { + printf("Failed to apply for black memory...\r\n"); + return -1; + } + if((RedImage = (UBYTE *)malloc(Imagesize)) == NULL) { + printf("Failed to apply for red memory...\r\n"); + return -1; + } + printf("Paint_NewImage\r\n"); + Paint_NewImage(BlackImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 270, WHITE); + Paint_Clear(WHITE); + Paint_NewImage(RedImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 270, WHITE); + Paint_Clear(WHITE); + +#if 0 // show bmp + printf("show bmp------------------------\r\n"); + Paint_NewImage(BlackImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 0, WHITE); + Paint_SelectImage(BlackImage); + GUI_ReadBmp("./pic/2.15__b.bmp", 0, 0); + Paint_NewImage(RedImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 0, WHITE); + Paint_SelectImage(RedImage); + GUI_ReadBmp("./pic/2.15__r.bmp", 0, 0); + EPD_2IN15B_Display(BlackImage, RedImage); + DEV_Delay_ms(2000); +#endif + +#if 1 // show image for array + Debug("show image for array\r\n"); + EPD_2IN15B_Display(gImage_2in15b_B, gImage_2in15b_R); + DEV_Delay_ms(2000); +#endif + +#if 1 // Drawing on the image + printf("Drawing\r\n"); + + //1.Draw black image + Paint_NewImage(BlackImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 270, WHITE); + Paint_SelectImage(BlackImage); + Paint_Clear(WHITE); + Paint_DrawPoint(10, 80, BLACK, DOT_PIXEL_1X1, DOT_STYLE_DFT); + Paint_DrawPoint(10, 90, BLACK, DOT_PIXEL_2X2, DOT_STYLE_DFT); + Paint_DrawPoint(10, 100, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT); + Paint_DrawPoint(10, 110, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT); + Paint_DrawLine(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID); + Paint_DrawLine(70, 70, 20, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID); + Paint_DrawRectangle(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY); + Paint_DrawRectangle(80, 70, 130, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL); + Paint_DrawString_EN(10, 0, "waveshare", &Font16, BLACK, WHITE); + Paint_DrawString_CN(130, 20, "΢ѩ����", &Font24CN, WHITE, BLACK); + Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK); + + //2.Draw red image + Paint_NewImage(RedImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 270, WHITE); + Paint_SelectImage(RedImage); + Paint_Clear(WHITE); + Paint_DrawCircle(160, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY); + Paint_DrawCircle(210, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL); + Paint_DrawLine(85, 95, 125, 95, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED); + Paint_DrawLine(105, 75, 105, 115, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED); + Paint_DrawString_CN(130, 0,"���abc", &Font12CN, BLACK, WHITE); + Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK); + Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE); + + EPD_2IN15B_Display(BlackImage, RedImage); + DEV_Delay_ms(2000); + +#endif + + printf("Clear...\r\n"); + EPD_2IN15B_Clear(); + + printf("Goto Sleep...\r\n"); + EPD_2IN15B_Sleep(); + free(BlackImage); + BlackImage = NULL; + DEV_Delay_ms(2000);//important, at least 2s + // close 5V + printf("close 5V, Module enters 0 power consumption ...\r\n"); + DEV_Module_Exit(); + + return 0; +} + diff --git a/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h b/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h new file mode 100755 index 00000000..c7d77e71 --- /dev/null +++ b/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h @@ -0,0 +1,13 @@ + +#ifndef _EPD_TEST_H_ +#define _EPD_TEST_H_ + +#include "DEV_Config.h" +#include "GUI_Paint.h" +#include "GUI_BMPfile.h" +#include "ImageData.h" +#include "Debug.h" +#include // malloc() free() + +int EPD_2in15b_Manager(void); +#endif diff --git a/display_app/2in15_e-Paper_B/src/ImageData.c b/display_app/2in15_e-Paper_B/src/ImageData.c new file mode 100755 index 00000000..ef361b90 --- /dev/null +++ b/display_app/2in15_e-Paper_B/src/ImageData.c @@ -0,0 +1,781 @@ +/***************************************************************************** +* | File : ImageData.c +* | Author : Waveshare team +* | Function : +*---------------- +* | This version: V1.1 +* | Date : 2019-06-12 +* | Info : +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +******************************************************************************/ + +#include "ImageData.h" + +const unsigned char gImage_2in15b_R[5920] = { /* 0X81,0X01,0X28,0X01,0XA0,0X00, */ +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X07,0X80,0X38,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X07,0X80,0X3C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X3C,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X3C,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X7F,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X7F,0XFF,0XE0,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X07,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X07,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0X0F,0X80,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X00,0X00,0X00,0X00,0X00,0X00, +0X0F,0XDF,0XC0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X1F,0XD8,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X70,0X60,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X01,0XFF,0XF8,0X07,0X00,0X00,0X00,0X00,0X18,0X70,0X60,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XF8,0X0F,0X1E,0X00,0X00,0X00, +0X18,0X70,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XF8,0X0F, +0X1E,0X00,0X00,0X00,0X18,0X70,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X07,0XC0,0X00,0X0F,0X1E,0X00,0X00,0X00,0X1C,0XF0,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X07,0X80,0X00,0X0F,0X9E,0X00,0X00,0X00,0X0F,0XDF,0XE0,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X00, +0X07,0X8F,0XC0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X00,0X00,0X07, +0XFF,0XFF,0XE0,0X00,0X00,0X07,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X03,0X80,0X00,0X01,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X03,0X80,0X00,0X00,0X1E,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0XE0,0X00,0X00,0X1E,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0XFF,0XF8,0X07, +0X1E,0X00,0X00,0X00,0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X07,0XFF,0XF8,0X0F,0X1E,0X00,0X00,0X00,0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X07,0XFF,0XF8,0X0F,0X1E,0X00,0X00,0X00,0X1F,0XFF,0XE0,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X0F,0X1E,0X00,0X00,0X00, +0X0C,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X0F, +0X9E,0X00,0X00,0X00,0X0E,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X06,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0XFF,0XF8,0X01,0XFF,0XFF,0XE0,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0XFF,0XF8,0X00, +0X1E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X07,0XFF,0XF8,0X00,0X1E,0X00,0X00,0X00,0X00,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0XE0,0X00,0X1E,0X00,0X00,0X00,0X00,0X00,0XE0,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X30,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X38,0X00, +0X00,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X00,0X38,0X00,0X03,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0X3C,0X00,0X07,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X3C,0X00,0X0F,0XFF,0XE0,0X00, +0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0XF8,0X00, +0X0F,0X01,0XE0,0X00,0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X07,0XFF,0XF8,0X00,0X1E,0X00,0XE0,0X00,0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X07,0XFF,0XF0,0X00,0X1E,0X00,0XF0,0X00,0X0C,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0XFF,0XE0,0X00,0X1C,0X00,0XF0,0X00, +0X0E,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X1E,0X00,0XF0,0X00,0X06,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X00,0X00,0X00,0X1E,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X0F,0X01,0XE0,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X3F,0X80,0X00,0X0F,0XFF,0XE0,0X00, +0X03,0XFF,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0XFF,0XE0,0X00, +0X07,0XFF,0XC0,0X00,0X0F,0XFF,0XC0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X01,0XFF,0XF0,0X00,0X03,0XFF,0X80,0X00,0X1E,0X01,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X03,0XFF,0XF8,0X00,0X00,0XFC,0X00,0X00,0X18,0X00,0XE0,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XC0,0X78,0X00,0X00,0X00,0X00,0X00, +0X18,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X38,0X00, +0X00,0X00,0X00,0X00,0X18,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X07,0X80,0X3C,0X00,0X03,0XC0,0X00,0X00,0X18,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X07,0X00,0X3C,0X00,0X03,0XC0,0X00,0X00,0X1C,0X00,0XE0,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X3C,0X00,0X03,0XC0,0X00,0X00, +0X0F,0XFF,0XC0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X38,0X00, +0X03,0XC0,0X00,0X00,0X07,0XFF,0X80,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X03,0XC0,0X78,0X00,0X03,0XC0,0X00,0X00,0X00,0XFC,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X03,0XFF,0XF8,0X00,0X03,0XC0,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X01,0XFF,0XF0,0X00,0X03,0XC0,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0XFF,0XE0,0X00, +0X03,0XC0,0X00,0X00,0X00,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X3F,0X00,0X00,0X03,0XC0,0X00,0X00,0X00,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XE0,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X80,0X60,0X00, +0X1E,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X01,0XC0,0X70,0X00,0X1E,0X00,0XF0,0X00,0X00,0X07,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X03,0XC0,0XF8,0X00,0X1E,0X00,0XF0,0X00,0X00,0X07,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XE0,0X78,0X00,0X1E,0X00,0XF0,0X00, +0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X38,0X01, +0XFF,0XFF,0XF0,0X00,0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X07,0X80,0X3C,0X01,0XFF,0XFF,0XE0,0X00,0X1C,0X07,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X07,0X00,0X3C,0X01,0XFF,0XFF,0XE0,0X00,0X1F,0X07,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X3C,0X01,0XFF,0XFF,0X80,0X00, +0X07,0XC7,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X38,0X00, +0X1E,0X00,0X00,0X00,0X01,0XE7,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X03,0XC0,0XF8,0X00,0X1E,0X00,0X00,0X00,0X00,0X7F,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X03,0XFF,0XF0,0X00,0X1E,0X00,0X00,0X00,0X00,0X1F,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X01,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00, +0X00,0X0F,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0XFF,0XC0,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X3F,0X00,0X00,0X1F,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XE0,0X00,0X07,0X80,0X60,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X80,0XC0,0X00,0X1F,0XFF,0XE0,0X00, +0X0F,0XE0,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X01,0X83,0XF0,0X00, +0X00,0X03,0X80,0X00,0X1F,0XF0,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X03,0XC7,0XF8,0X00,0X00,0X00,0XC0,0X00,0X18,0X38,0X60,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X03,0XC7,0XF8,0X00,0X00,0X00,0XE0,0X00,0X18,0X1E,0X60,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X8F,0X38,0X00,0X00,0X00,0XE0,0X00, +0X18,0X0F,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X0E,0X1C,0X00, +0X00,0X00,0XF0,0X00,0X18,0X07,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X07,0X0E,0X1C,0X00,0X00,0X00,0XF0,0X00,0X1C,0X03,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X07,0X1E,0X1C,0X00,0X00,0X03,0XE0,0X00,0X0E,0X00,0XE0,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X9C,0X38,0X00,0X1F,0XFF,0XE0,0X00, +0X06,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0XFC,0X78,0X00, +0X1F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X03,0XFC,0XF8,0X00,0X1F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X01,0XF8,0X70,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0XF0,0X60,0X00,0X00,0X00,0X00,0X00, +0X0F,0XFF,0XC0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X1E,0X01,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X00,0X00,0X00,0X02,0X01,0X80,0X00,0X18,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X07,0X01,0XC0,0X00,0X18,0X00,0X60,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XC7,0XFF,0XF8,0X00,0X0F,0X03,0XE0,0X00, +0X18,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X03,0XE7,0XFF,0XF8,0X00, +0X0F,0X81,0XE0,0X00,0X18,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X03, +0XE7,0XFF,0XF8,0X00,0X1E,0X00,0XE0,0X00,0X1C,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X01,0XC7,0XFF,0XF8,0X00,0X1E,0X00,0XF0,0X00,0X0F,0XFF,0XC0,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0XF0,0X00, +0X07,0XFF,0X80,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X1E,0X00,0XF0,0X00,0X00,0XFC,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X00,0X00,0X00,0X1E,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X03,0XFE,0X00,0X00,0X0F,0X03,0XE0,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X0F,0XFF,0X80,0X00,0X0F,0XFF,0XC0,0X00, +0X07,0X80,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X3F,0XFF,0XC0,0X00, +0X07,0XFF,0XC0,0X00,0X0F,0XE0,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X7F,0XFF,0XE0,0X00,0X03,0XFF,0X00,0X00,0X1F,0XF0,0X60,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X7C,0X01,0XF0,0X00,0X00,0XFC,0X00,0X00,0X18,0X38,0X60,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0XF8,0X00,0XF0,0X00,0X00,0X00,0X00,0X00, +0X18,0X1E,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0XF0,0X00,0X78,0X00, +0X00,0X00,0X00,0X00,0X18,0X0F,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0XE0,0X00,0X78,0X00,0X00,0X00,0X00,0X00,0X18,0X07,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X01,0XE0,0X00,0X78,0X00,0X00,0X00,0X00,0X00,0X1C,0X03,0XE0,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XE0,0X00,0X38,0X00,0X00,0X00,0X00,0X00, +0X0E,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XE0,0X00,0X38,0X00, +0X00,0X00,0X00,0X00,0X06,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01, +0XE0,0X00,0X38,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X01,0XE0,0X00,0X38,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XE0,0X00,0X38,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XFF,0XFF,0XF8,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01, +0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X01,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFC,0X0F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XE0, +0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X01,0XFF,0X80,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFF,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFE,0X00,0X00,0X1F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFC,0X00, +0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X01,0XFC,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X00,0X00,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X03, +0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F, +0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X01,0XF8,0X0F,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X0C,0X07, +0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X00,0X00,0X03,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XE0,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XE0,0X07,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01, +0XE0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X00,0X00,0X01,0XF0,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03,0XF0,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03,0XF0,0X3F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFE,0X00,0X03, +0XF8,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFB,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFC, +0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFF,0X80,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFF,0X00,0X00,0X1F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFE,0X00, +0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X01,0XFC,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFC,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X00,0X00,0X07,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X00, +0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X01,0XF8,0X03,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F, +0XFE,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X01,0XF8,0X0F,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07, +0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X00,0X0C,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XE0,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01, +0XE0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X00,0X00,0X01,0XE0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XF0,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03,0XF0,0X1F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03, +0XF0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFE,0X00,0X03,0XF8,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFB,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFC,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFF,0X80,0X00,0X7F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFF,0X00, +0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X01,0XFE,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFC,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFC,0X00,0X00,0X07,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X00, +0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X01,0XF8,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X03,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07, +0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X01,0XF8,0X0F,0XFE,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X01,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F, +0XFE,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X0C,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03,0XF8,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01, +0XE0,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X00,0X00,0X01,0XE0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XE0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XF0,0X0F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03, +0XF0,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X00,0X00,0X03,0XF0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFE,0X00,0X03,0XF8,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFB,0XF8,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XE7,0XFF,0XCF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XC7,0XFF,0XC7, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0X83,0XFF,0X83,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0X00,0X7F,0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0X02,0X1F,0X81,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X06,0X19,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFE,0X0E,0X18,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFE,0X0E,0X18,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X0E,0X18,0XE0,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X06,0X18,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0X02,0X18,0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XC0,0X00,0X07, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XE0,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XF8,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFE,0X00,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFE,0X18,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XDF,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +}; +const unsigned char gImage_2in15b_B[5920] = { /* 0X81,0X01,0X28,0X01,0XA0,0X00, */ +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC1,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XC3,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XE1,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XC1,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF8,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X01, +0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFC,0X01,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X01,0XC3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X01,0X83,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X01, +0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE0,0XE1,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XF0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1, +0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE1,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XE1, +0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF0,0X21,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00, +0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0X01,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X01,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X01,0XC3,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X01, +0X83,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE0,0X01,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XE1,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1, +0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XF0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1, +0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE0,0XE1,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X21,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X03,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00, +0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFC,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,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,0X3F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00, +0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X0C,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X7F, +0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE0,0XFF,0XC0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XE0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF, +0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE1,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XC3,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X3F, +0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,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,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X7F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFC,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE0,0X61,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE1,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1, +0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XF0,0XF0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XF0, +0X60,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF0,0X70,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XF8,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XF8,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XFE, +0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC1,0XE0,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC1,0XE0,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XC1,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XC1,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X03,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00, +0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFC,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE0,0X61,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE1,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1, +0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XF0,0XF0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XF0, +0X60,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF0,0X70,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XF8,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XF8,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XFE, +0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X1F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X7F,0XFF,0XFF,0XFF,0XE0,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X0F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFC,0X71,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XF8,0XE7,0XFF,0XFF,0XFF,0XE1,0XFF, +0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XFC,0XE7,0XFF, +0XFF,0XFF,0XE1,0XFF,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFC,0XE7,0XFF,0XFF,0XFF,0XE1,0XFF,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF0,0XF8,0XC7,0XFF,0XFF,0XFF,0XE1,0XFF,0XE0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X87,0XFF,0XFF,0XFF,0XE1,0XFF, +0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X01,0XCF,0XFF, +0XFF,0XFF,0XE1,0XFF,0XC0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFE,0X03,0XDF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XFE,0XFF,0XFF,0XFF,0XF8,0X00,0X00, +0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,0XFC,0XFF,0XFF, +0XFF,0XF8,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF9,0XF8,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF8,0XF0,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X41,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFE,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0X0F,0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XBF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFC,0XFC, +0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0XFF,0XFF, +0XFF,0XFF,0XF8,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XF0,0X78,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X70,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC7,0XFF,0XFF,0XFF,0XFF,0XE0,0XF0, +0X61,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0X01,0XFF,0XFF, +0XFF,0XFF,0XE1,0XF0,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X1E,0X00,0XFF,0XFF,0XFF,0XFF,0XE1,0XE0,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X1C,0X30,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1C,0X78,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1, +0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1C,0X7C,0X7F,0XFF, +0XFF,0XFF,0XE1,0XC1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X1C,0X7C,0X7F,0XFF,0XFF,0XFF,0XE0,0X83,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X06,0X78,0XFF,0XFF,0XFF,0XFF,0XE0,0X03,0XC1,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X30,0XFF,0XFF,0XFF,0XFF,0XF0,0X03, +0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X31,0XFF,0XFF, +0XFF,0XFF,0XF0,0X07,0XC3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF8,0X3B,0XFF,0XFF,0XFF,0XFF,0XF8,0X0F,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XE3,0X81,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X81,0X00,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0C,0X38,0XFF,0XFF, +0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X1C,0X7C,0X7F,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X1E,0X7C,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1C,0X7C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X38,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X80,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XC1,0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XC1,0XF8,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X78,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X38,0XFF,0XFF, +0XFF,0XFF,0XE0,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X0E,0X18,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X1F,0X08,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X1F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0X80,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0XC0,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X87,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X87,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCF,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0X80, +0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF, +0XFF,0XFF,0XFC,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF8,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XE0,0X00,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XE0,0X07,0XFF,0XFF,0XFF,0XE0,0X07,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XFF,0XE0,0X3F,0XE0,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0XFF,0XFF,0XFF,0XE0,0X1F,0XE0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0F,0XF8,0XFF,0XFF, +0XFF,0XE0,0X03,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X1F,0XFC,0XFF,0XFF,0XFF,0XF0,0X00,0X60,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X1F,0XFC,0X7F,0XFF,0XFF,0XFC,0X00,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0XF8,0XFF,0XFF,0XFF,0XFF,0X80,0X00, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XF0,0XFF,0XFF, +0XFF,0XFF,0XF0,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X80,0X00,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XC0,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +}; + + + + diff --git a/display_app/2in15_e-Paper_B/src/ImageData.h b/display_app/2in15_e-Paper_B/src/ImageData.h new file mode 100755 index 00000000..84d72628 --- /dev/null +++ b/display_app/2in15_e-Paper_B/src/ImageData.h @@ -0,0 +1,43 @@ +/***************************************************************************** +* | File : ImageData.h +* | Author : Waveshare team +* | Function : +*---------------- +* | This version: V1.0 +* | Date : 2018-10-23 +* | Info : +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +******************************************************************************/ + +#ifndef _IMAGEDATA_H_ +#define _IMAGEDATA_H_ + +/* ------------------------------------------------ */ +// Imagedata +extern const unsigned char gImage_2in15b_R[]; +extern const unsigned char gImage_2in15b_B[]; + +#endif +/* FILE END */ + + diff --git a/display_app/2in15_e-Paper_B/src/main.c b/display_app/2in15_e-Paper_B/src/main.c new file mode 100755 index 00000000..6eaa12bc --- /dev/null +++ b/display_app/2in15_e-Paper_B/src/main.c @@ -0,0 +1,22 @@ +#include //exit() +#include //signal() +#include "EPD_2in15b_Manager.h" //Examples + +void Handler(int signo) +{ + //System Exit + printf("\r\nHandler:exit\r\n"); + DEV_Module_Exit(); + + exit(0); +} + +int main(void) +{ + // Exception handling:ctrl + c + signal(SIGINT, Handler); + + EPD_2in15b_Manager(); + + return 0; +} diff --git a/display_app/duos/devmem.c b/display_app/duos/devmem.c new file mode 100755 index 00000000..aade7de4 --- /dev/null +++ b/display_app/duos/devmem.c @@ -0,0 +1,105 @@ +/* + ** read/write phy addr in userspace + ** open /dev/mem + ** taiqiang.cao@bitmain.com + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "devmem.h" + +// DEBUG_SET_LEVEL(DEBUG_LEVEL_ERR); +#define ERR printf +#define DEBUG printf + +static int devmem_fd; + +void *devm_map(unsigned long addr, int len) +{ + off_t offset; + void *map_base; + + devmem_fd = open("/dev/mem", O_RDWR | O_SYNC); + if (devmem_fd == -1) { + ERR("cannot open '/dev/mem'\n"); + goto open_err; + } + // DEBUG("/dev/mem opened.\n"); + + offset = addr & ~(sysconf(_SC_PAGE_SIZE) - 1); + + map_base = mmap(NULL, len + addr - offset, PROT_READ | PROT_WRITE, MAP_SHARED, devmem_fd, offset); + if (map_base == MAP_FAILED) { + ERR("mmap failed\n"); + goto mmap_err; + } + + // DEBUG("Memory mapped at address %p.\n", map_base + addr - offset); + + return map_base + addr - offset; + +mmap_err: + close(devmem_fd); + +open_err: + return NULL; +} + +void devm_unmap(void *virt_addr, int len) +{ + unsigned long addr; + + if (devmem_fd == -1) { + ERR("'/dev/mem' is closed\n"); + return; + } + + /* page align */ + addr = (((unsigned long)virt_addr) & ~(sysconf(_SC_PAGE_SIZE) - 1)); + munmap((void *)addr, len + (unsigned long)virt_addr - addr); + close(devmem_fd); +} + +/* read/write 32bit data*/ +uint32_t devmem_readl(unsigned long addr) +{ + uint32_t val; + void *virt_addr; + + virt_addr = devm_map(addr, 4); + if (virt_addr == NULL) { + ERR("readl addr map failed\n"); + return 0; + } + + val = *(uint32_t *)virt_addr; + + devm_unmap(virt_addr, 4); + + return val; +} + +void devmem_writel(unsigned long addr, uint32_t val) +{ + void *virt_addr; + + virt_addr = devm_map(addr, 4); + if (virt_addr == NULL) { + ERR("writel addr map failed\n"); + return; + } + + *(uint32_t *)virt_addr = val; + + devm_unmap(virt_addr, 4); +} diff --git a/display_app/duos/devmem.h b/display_app/duos/devmem.h new file mode 100755 index 00000000..360df8f5 --- /dev/null +++ b/display_app/duos/devmem.h @@ -0,0 +1,12 @@ +#ifndef _DEVMEM_H_ +#define _DEVMEM_H_ + +#include + +void *devm_map(unsigned long addr, int len); +void devm_unmap(void *virt_addr, int len); + +uint32_t devmem_readl(unsigned long addr); +void devmem_writel(unsigned long addr, uint32_t val); + +#endif diff --git a/display_app/duos/duos_pinmux.c b/display_app/duos/duos_pinmux.c new file mode 100755 index 00000000..20a343ce --- /dev/null +++ b/display_app/duos/duos_pinmux.c @@ -0,0 +1,108 @@ +#include "devmem.h" +#include "func.h" +#include +#include +#include +#include +#include + +#define NELEMS(x) (sizeof(x) / sizeof((x)[0])) +#define PINMUX_BASE 0x03001000 +#define INVALID_PIN 9999 + +struct pinlist { + char name[32]; + uint32_t offset; +} pinlist_st; + +struct pinlist cv181x_pin[] = { + { "A16", 0x40 }, // UART0_TX + { "A17", 0x44 }, // UART0_RX + { "A19", 0x64 }, // JTAG_CPU_TMS + { "A18", 0x68 }, // JTAG_CPU_TCK + { "A20", 0x6c }, // JTAG_CPU_TRST + { "A28", 0x70 }, // IIC0_SCL + { "A29", 0x74 }, // IIC0_SDA + { "E0", 0xa4 }, // PWR_GPIO0 + { "E1", 0xa8 }, // PWR_GPIO1 + { "E2", 0xac }, // PWR_GPIO2 + { "B1", 0xf0 }, // ADC3 + { "B2", 0xf4 }, // ADC2 + { "B3", 0xf8 }, // ADC1 + { "B11", 0x134 }, // VIVO_D10 + { "B12", 0x138 }, // VIVO_D9 + { "B13", 0x13c }, // VIVO_D8 + { "B14", 0x140 }, // VIVO_D7 + { "B15", 0x144 }, // VIVO_D6 + { "B16", 0x148 }, // VIVO_D5 + { "B17", 0x14c }, // VIVO_D4 + { "B18", 0x150 }, // VIVO_D3 + { "B19", 0x154 }, // VIVO_D2 + { "B20", 0x158 }, // VIVO_D1 + { "B21", 0x15c }, // VIVO_D0 + { "B22", 0x160 }, // VIVO_CLK + { "C18", 0x194 }, // PAD_MIPI_TXM4 + { "C19", 0x198 }, // PAD_MIPI_TXP4 + { "C20", 0x19c }, // PAD_MIPI_TXM3 + { "C21", 0x1a0 }, // PAD_MIPI_TXP3 + { "C16", 0x1a4 }, // PAD_MIPI_TXM2 + { "C17", 0x1a8 }, // PAD_MIPI_TXP2 + { "C14", 0x1ac }, // PAD_MIPI_TXM1 + { "C15", 0x1b0 }, // PAD_MIPI_TXP1 + { "C12", 0x1b4 }, // PAD_MIPI_TXM0 + { "C13", 0x1b8 }, // PAD_MIPI_TXP0 +}; + +uint32_t convert_func_to_value(char *pin, char *func) +{ + uint32_t i = 0; + uint32_t max_fun_num = NELEMS(cv181x_pin_func); + char v; + + for (i = 0; i < max_fun_num; i++) { + if (strcmp(cv181x_pin_func[i].func, func) == 0) { + if (strncmp(cv181x_pin_func[i].name, pin, strlen(pin)) == 0) { + v = cv181x_pin_func[i].name[strlen(cv181x_pin_func[i].name) - 1]; + break; + } + } + } + + if (i == max_fun_num) { + printf("ERROR: invalid pin or func\n"); + return INVALID_PIN; + } + + return (v - 0x30); +} + +int duos_pinmux(char *pin, char *func) +{ + int opt = 0; + uint32_t i = 0; + uint32_t value; + uint32_t f_val; + + printf("pin %s\n", pin); + printf("func %s\n", func); + + for (i = 0; i < NELEMS(cv181x_pin); i++) { + if (strcmp(pin, cv181x_pin[i].name) == 0) + break; + } + + if (i != NELEMS(cv181x_pin)) { + f_val = convert_func_to_value(pin, func); + if (f_val == INVALID_PIN) + return 1; + devmem_writel(PINMUX_BASE + cv181x_pin[i].offset, f_val); + + printf("register: %x\n", PINMUX_BASE + cv181x_pin[i].offset); + printf("value: %d\n", f_val); + + } else { + printf("\nInvalid option: %s\n", optarg); + } + + return 0; +} diff --git a/display_app/duos/duos_pinmux.h b/display_app/duos/duos_pinmux.h new file mode 100755 index 00000000..527665b8 --- /dev/null +++ b/display_app/duos/duos_pinmux.h @@ -0,0 +1,6 @@ +#ifndef _DUOS_PINMUX_H_ +#define _DUOS_PINMUX_H_ + +int duos_pinmux(char *pin, char *func); + +#endif diff --git a/display_app/duos/func.h b/display_app/duos/func.h new file mode 100755 index 00000000..bc608071 --- /dev/null +++ b/display_app/duos/func.h @@ -0,0 +1,329 @@ +struct funlist { + char name[32]; + char func[32]; +} funlist_st; + +struct funlist cv181x_pin_func[] = { + // A16 - UART0_TX + { "A160", "UART0_TX"}, + { "A161", "CAM_MCLK1"}, + { "A162", "PWM_4"}, + { "A163", "A16"}, + { "A164", "UART1_TX"}, + { "A165", "AUX1"}, + { "A167", "DBG_6"}, + + // A17 - UART0_RX + { "A170", "UART0_RX"}, + { "A171", "CAM_MCLK0"}, + { "A172", "PWM_5"}, + { "A173", "A17"}, + { "A174", "UART1_RX"}, + { "A175", "AUX0"}, + { "A177", "DBG_7"}, + + // A19 - JTAG_CPU_TMS + { "A190", "CV_2WTMS_CR_4WTMS"}, + { "A191", "CAM_MCLK0"}, + { "A192", "PWM_7"}, + { "A193", "A19"}, + { "A194", "UART1_RTS"}, + { "A195", "AUX0"}, + { "A196", "UART1_TX"}, + { "A197", "VO_D_28"}, + + // A18 - JTAG_CPU_TCK + { "A180", "CV_2WTCK_CR_4WTCK"}, + { "A181", "CAM_MCLK1"}, + { "A182", "PWM_6"}, + { "A183", "A18"}, + { "A184", "UART1_CTS"}, + { "A185", "AUX1"}, + { "A186", "UART1_RX"}, + { "A187", "VO_D_29"}, + + // A20 - JTAG_CPU_TRST + { "A200", "JTAG_CPU_TRST"}, + { "A203", "A20"}, + { "A206", "VO_D_30"}, + + // A28 - IIC0_SCL + { "A280", "CV_SCL0"}, + { "A281", "UART1_TX"}, + { "A282", "UART2_TX"}, + { "A283", "A28"}, + { "A285", "WG0_D0"}, + { "A287", "DBG_10"}, + + // A29 - IIC0_SDA + { "A290", "CV_SDA0"}, + { "A291", "UART1_RX"}, + { "A292", "UART2_RX"}, + { "A293", "A29"}, + { "A295", "WG0_D1"}, + { "A296", "WG1_D0"}, + { "A297", "DBG_11"}, + + // E0 - PWR_GPIO0 + { "E00", "E0"}, + { "E01", "UART2_TX"}, + { "E02", "PWR_UART0_RX"}, + { "E04", "PWM_8"}, + + // E1 - PWR_GPIO1 + { "E10", "E1"}, + { "E11", "UART2_RX"}, + { "E13", "EPHY_LNK_LED"}, + { "E14", "PWM_9"}, + { "E15", "PWR_IIC_SCL"}, + { "E16", "IIC2_SCL"}, + { "E17", "CV_4WTMS_CR_SDA0"}, + + // E2 - PWR_GPIO2 + { "E20", "E2"}, + { "E22", "PWR_SECTICK"}, + { "E23", "EPHY_SPD_LED"}, + { "E24", "PWM_10"}, + { "E25", "PWR_IIC_SDA"}, + { "E26", "IIC2_SDA"}, + { "E27", "CV_4WTCK_CR_2WTCK"}, + + // B1 - ADC3 + { "B11", "CAM_MCLK0"}, + { "B12", "IIC4_SCL"}, + { "B13", "B1"}, + { "B14", "PWM_12"}, + { "B15", "EPHY_LNK_LED"}, + { "B16", "WG2_D0"}, + { "B17", "UART3_TX"}, + + // B2 - ADC2 + { "B21", "CAM_MCLK1"}, + { "B22", "IIC4_SDA"}, + { "B23", "B2"}, + { "B24", "PWM_13"}, + { "B25", "EPHY_SPD_LED"}, + { "B26", "WG2_D1"}, + { "B27", "UART3_RX"}, + + // B3 - ADC1 + { "B33", "B3"}, + { "B34", "KEY_COL2"}, + + // B11 - VIVO_D10 + { "B110", "PWM_1"}, + { "B111", "VI1_D_10"}, + { "B112", "VO_D_23"}, + { "B113", "B11"}, + { "B114", "RMII0_IRQ"}, + { "B115", "CAM_MCLK0"}, + { "B116", "IIC1_SDA"}, + { "B117", "UART2_TX"}, + + // B12 - VIVO_D9 + { "B120", "PWM_2"}, + { "B121", "VI1_D_9"}, + { "B122", "VO_D_22"}, + { "B123", "B12"}, + { "B125", "CAM_MCLK1"}, + { "B126", "IIC1_SCL"}, + { "B127", "UART2_RX"}, + + // B13 - VIVO_D8 + { "B130", "PWM_3"}, + { "B131", "VI1_D_8"}, + { "B132", "VO_D_21"}, + { "B133", "B13"}, + { "B134", "RMII0_MDIO"}, + { "B135", "SPI3_SDO"}, + { "B136", "IIC2_SCL"}, + { "B137", "CAM_VS0"}, + + // B14 - VIVO_D7 + { "B140", "VI2_D_7"}, + { "B141", "VI1_D_7"}, + { "B142", "VO_D_20"}, + { "B143", "B14"}, + { "B144", "RMII0_RXD1"}, + { "B145", "SPI3_SDI"}, + { "B146", "IIC2_SDA"}, + { "B147", "CAM_HS0"}, + + // B15 - VIVO_D6 + { "B150", "VI2_D_6"}, + { "B151", "VI1_D_6"}, + { "B152", "VO_D_19"}, + { "B153", "B15"}, + { "B154", "RMII0_REFCLKI"}, + { "B155", "SPI3_SCK"}, + { "B156", "UART2_TX"}, + { "B157", "CAM_VS0"}, + + // B16 - VIVO_D5 + { "B160", "VI2_D_5"}, + { "B161", "VI1_D_5"}, + { "B162", "VO_D_18"}, + { "B163", "B16"}, + { "B164", "RMII0_RXD0"}, + { "B165", "SPI3_CS_X"}, + { "B166", "UART2_RX"}, + { "B167", "CAM_HS0"}, + + // B17 - VIVO_D4 + { "B170", "VI2_D_4"}, + { "B171", "VI1_D_4"}, + { "B172", "VO_D_17"}, + { "B173", "B17"}, + { "B174", "RMII0_MDC"}, + { "B175", "IIC1_SDA"}, + { "B176", "UART2_CTS"}, + { "B177", "CAM_VS0"}, + + // B18 - VIVO_D3 + { "B180", "VI2_D_3"}, + { "B181", "VI1_D_3"}, + { "B182", "VO_D_16"}, + { "B183", "B18"}, + { "B184", "RMII0_TXD0"}, + { "B185", "IIC1_SCL"}, + { "B186", "UART2_RTS"}, + { "B187", "CAM_HS0"}, + + // B19 - VIVO_D2 + { "B190", "VI2_D_2"}, + { "B191", "VI1_D_2"}, + { "B192", "VO_D_15"}, + { "B193", "B19"}, + { "B194", "RMII0_TXD1"}, + { "B195", "CAM_MCLK1"}, + { "B196", "PWM_2"}, + { "B197", "UART2_TX"}, + + // B20 - VIVO_D1 + { "B200", "VI2_D_1"}, + { "B201", "VI1_D_1"}, + { "B202", "VO_D_14"}, + { "B203", "B20"}, + { "B204", "RMII0_RXDV"}, + { "B205", "IIC3_SDA"}, + { "B206", "PWM_3"}, + { "B207", "IIC4_SCL"}, + + // B21 - VIVO_D0 + { "B210", "VI2_D_0"}, + { "B211", "VI1_D_0"}, + { "B212", "VO_D_13"}, + { "B213", "B21"}, + { "B214", "RMII0_TXCLK"}, + { "B215", "IIC3_SCL"}, + { "B216", "WG1_D0"}, + { "B217", "IIC4_SDA"}, + + // B22 - VIVO_CLK + { "B220", "VI2_CLK"}, + { "B221", "VI1_CLK"}, + { "B222", "VO_CLK1"}, + { "B223", "B22"}, + { "B224", "RMII0_TXEN"}, + { "B225", "CAM_MCLK0"}, + { "B226", "WG1_D1"}, + { "B227", "UART2_RX"}, + + // C18 - PAD_MIPI_TXM4 + { "C180", "VI0_D_15"}, + { "C181", "SD1_CLK"}, + { "C182", "VO_D_24"}, + { "C183", "C18"}, + { "C184", "CAM_MCLK1"}, + { "C185", "PWM_12"}, + { "C186", "IIC1_SDA"}, + { "C187", "DBG_18"}, + + // C19 - PAD_MIPI_TXP4 + { "C190", "VI0_D_16"}, + { "C191", "SD1_CMD"}, + { "C192", "VO_D_25"}, + { "C193", "C19"}, + { "C194", "CAM_MCLK0"}, + { "C195", "PWM_13"}, + { "C196", "IIC1_SCL"}, + { "C197", "DBG_19"}, + + // C20 - PAD_MIPI_TXM3 + { "C200", "VI0_D_17"}, + { "C201", "SD1_D0"}, + { "C202", "VO_D_26"}, + { "C203", "C20"}, + { "C204", "IIC2_SDA"}, + { "C205", "PWM_14"}, + { "C206", "IIC1_SDA"}, + { "C207", "CAM_VS0"}, + + // C21 - PAD_MIPI_TXP3 + { "C210", "VI0_D_18"}, + { "C211", "SD1_D1"}, + { "C212", "VO_D_27"}, + { "C213", "C21"}, + { "C214", "IIC2_SCL"}, + { "C215", "PWM_15"}, + { "C216", "IIC1_SCL"}, + { "C217", "CAM_HS0"}, + + // C16 - PAD_MIPI_TXM2 + { "C160", "CV_4WTMS_CR_SDA0"}, + { "C161", "VI0_D_13"}, + { "C162", "VO_D_0"}, + { "C163", "C16"}, + { "C164", "IIC1_SDA"}, + { "C165", "PWM_8"}, + { "C166", "SPI0_SCK"}, + { "C167", "SD1_D2"}, + + // C17 - PAD_MIPI_TXP2 + { "C170", "CV_4WTDI_CR_SCL0"}, + { "C171", "VI0_D_14"}, + { "C172", "VO_CLK0"}, + { "C173", "C17"}, + { "C174", "IIC1_SCL"}, + { "C175", "PWM_9"}, + { "C176", "SPI0_CS_X"}, + { "C177", "SD1_D3"}, + + // C14 - PAD_MIPI_TXM1 + { "C140", "CV_4WTDO_CR_2WTMS"}, + { "C141", "VI0_D_11"}, + { "C142", "VO_D_2"}, + { "C143", "C14"}, + { "C144", "IIC2_SDA"}, + { "C145", "PWM_10"}, + { "C146", "SPI0_SDO"}, + { "C147", "DBG_14"}, + + // C15 - PAD_MIPI_TXP1 + { "C150", "CV_4WTCK_CR_2WTCK"}, + { "C151", "VI0_D_12"}, + { "C152", "VO_D_1"}, + { "C153", "C15"}, + { "C154", "IIC2_SCL"}, + { "C155", "PWM_11"}, + { "C156", "SPI0_SDI"}, + { "C157", "DBG_15"}, + + // C12 - PAD_MIPI_TXM0 + { "C121", "VI0_D_9"}, + { "C122", "VO_D_4"}, + { "C123", "C12"}, + { "C124", "CAM_MCLK1"}, + { "C125", "PWM_14"}, + { "C126", "CAM_VS0"}, + { "C127", "DBG_12"}, + + // C13 - PAD_MIPI_TXP0 + { "C131", "VI0_D_10"}, + { "C132", "VO_D_3"}, + { "C133", "C13"}, + { "C134", "CAM_MCLK0"}, + { "C135", "PWM_15"}, + { "C136", "CAM_HS0"}, + { "C137", "DBG_13"}, +}; diff --git a/display_app/include/system/wiringx.h b/display_app/include/system/wiringx.h new file mode 100755 index 00000000..649bc60a --- /dev/null +++ b/display_app/include/system/wiringx.h @@ -0,0 +1,115 @@ +/* + Copyright (c) 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _WIRING_X_H_ +#define _WIRING_X_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#define wiringXLog(a, b, ...) _wiringXLog(a, __FILE__, __LINE__, b, ##__VA_ARGS__) + +extern void (*_wiringXLog)(int, char *, int, const char *, ...); + +#define EXPORT __attribute__((visibility("default"))) + +#if !defined(PATH_MAX) + #if defined(_POSIX_PATH_MAX) + #define PATH_MAX _POSIX_PATH_MAX + #else + #define PATH_MAX 1024 + #endif +#endif + +enum function_t { + FUNCTION_UNKNOWN = 0, + FUNCTION_DIGITAL = 2, + FUNCTION_ANALOG = 4, + FUNCTION_I2C = 16, + FUNCTION_INTERRUPT = 32 +}; + +enum pinmode_t { + PINMODE_NOT_SET = 0, + PINMODE_INPUT = 2, + PINMODE_OUTPUT = 4, + PINMODE_INTERRUPT = 8 +}; + +enum isr_mode_t { + ISR_MODE_UNKNOWN = 0, + ISR_MODE_RISING = 2, + ISR_MODE_FALLING = 4, + ISR_MODE_BOTH = 8, + ISR_MODE_NONE = 16 +}; + +enum digital_value_t { + LOW, + HIGH +}; + +typedef struct wiringXSerial_t { + unsigned int baud; + unsigned int databits; + unsigned int parity; + unsigned int stopbits; + unsigned int flowcontrol; +} wiringXSerial_t; + +void delayMicroseconds(unsigned int); +int pinMode(int, enum pinmode_t); +int wiringXSetup(char *name, void (*func)(int, char *, int, const char *, ...)); +int wiringXGC(void); + +// int analogRead(int channel); +int digitalWrite(int, enum digital_value_t); +int digitalRead(int); +int waitForInterrupt(int, int); +int wiringXISR(int, enum isr_mode_t); + +int wiringXI2CRead(int); +int wiringXI2CReadReg8(int, int); +int wiringXI2CReadReg16(int, int); +int wiringXI2CWrite(int, int); +int wiringXI2CWriteReg8(int, int, int); +int wiringXI2CWriteReg16(int, int, int); +int wiringXI2CSetup(const char *, int); + +int wiringXSPIGetFd(int channel); +int wiringXSPIDataRW(int channel, unsigned char *data, int len); +int wiringXSPISetup(int channel, int speed); + +int wiringXSerialOpen(const char *, struct wiringXSerial_t); +void wiringXSerialFlush(int); +void wiringXSerialClose(int); +void wiringXSerialPutChar(int, unsigned char); +void wiringXSerialPuts(int, const char *); +void wiringXSerialPrintf(int, const char *, ...); +int wiringXSerialDataAvail(int); +int wiringXSerialGetChar(int); + +int wiringXPWMSetPeriod(int, long); +int wiringXPWMSetDuty(int, long); +int wiringXPWMSetPolarity(int, int); +int wiringXPWMEnable(int, int); + +char *wiringXPlatform(void); +int wiringXValidGPIO(int); +int wiringXSelectableFd(int); +int wiringXSupportedPlatforms(char ***); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/display_app/libs/system/musl_riscv64/libwiringx.so b/display_app/libs/system/musl_riscv64/libwiringx.so new file mode 100755 index 0000000000000000000000000000000000000000..230a6831d6d3dc446a24caac8c56eedeeec5c229 GIT binary patch literal 373104 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

(}mo+Q}2<2lx85^WF0u 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 literal 0 HcmV?d00001 From bbcccaa72cc7f858feb8af5c29d9d4cba8d8bea9 Mon Sep 17 00:00:00 2001 From: tommasopolonelli Date: Thu, 24 Apr 2025 08:02:37 +0000 Subject: [PATCH 19/23] Executable for 2in15 display with auto mutliplexer configuration --- display_app/2in15_e-Paper_B/Makefile | 12 ++-- display_app/2in15_e-Paper_B/epd | Bin 69048 -> 91656 bytes .../2in15_e-Paper_B/lib/Config/DEV_Config.h | 4 +- .../2in15_e-Paper_B/src/EPD_2in15b_Manager.c | 44 +++++------- .../2in15_e-Paper_B/src/EPD_2in15b_Manager.h | 2 +- display_app/2in15_e-Paper_B/src/main.c | 66 +++++++++++++++--- display_app/duos/devmem.c | 15 ++-- display_app/duos/duos_pinmux.c | 13 ++-- 8 files changed, 99 insertions(+), 57 deletions(-) diff --git a/display_app/2in15_e-Paper_B/Makefile b/display_app/2in15_e-Paper_B/Makefile index 83c0f36b..d547b6da 100755 --- a/display_app/2in15_e-Paper_B/Makefile +++ b/display_app/2in15_e-Paper_B/Makefile @@ -2,11 +2,12 @@ DIR_Config = ./lib/Config DIR_EPD = ./lib/e-Paper DIR_FONTS = ./lib/Fonts DIR_GUI = ./lib/GUI -DIR_Examples = ./examples +DIR_SRC = ./src DIR_BIN = ./bin +DIR_DUOS = ../duos EPD = NULL -OBJ_C = $(wildcard ${DIR_EPD}/*.c ${DIR_GUI}/*.c ${DIR_Examples}/*.c ${DIR_FONTS}/*.c ) +OBJ_C = $(wildcard ${DIR_EPD}/*.c ${DIR_GUI}/*.c ${DIR_SRC}/*.c ${DIR_FONTS}/*.c ${DIR_DUOS}/*.c) OBJ_O = $(patsubst %.c,${DIR_BIN}/%.o,$(notdir ${OBJ_C})) DUO_DEV_C = $(wildcard $(DIR_BIN)/dev_hardware_SPI.o $(DIR_BIN)/DUO_sysfs_gpio.o $(DIR_BIN)/DEV_Config.o) @@ -40,8 +41,8 @@ DUO_epd:${OBJ_O} $(shell mkdir -p $(DIR_BIN)) -${DIR_BIN}/%.o:$(DIR_Examples)/%.c - $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_GUI) -I $(DIR_EPD) $(DEBUG) $(LDFLAGS) +${DIR_BIN}/%.o:$(DIR_SRC)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_GUI) -I $(DIR_EPD) -I $(DIR_DUOS) $(DEBUG) $(LDFLAGS) ${DIR_BIN}/%.o:$(DIR_EPD)/%.c $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) $(DEBUG) $(LDFLAGS) @@ -52,6 +53,9 @@ ${DIR_BIN}/%.o:$(DIR_FONTS)/%.c ${DIR_BIN}/%.o:$(DIR_GUI)/%.c $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) $(DEBUG) $(LDFLAGS) +${DIR_BIN}/%.o:$(DIR_DUOS)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) $(DEBUG) -static + DUO_DEV: # $(CC) $(CFLAGS) -c $(DIR_Config)/dev_hardware_SPI.c -o $(DIR_BIN)/dev_hardware_SPI.o $(DEBUG) $(CC) $(CFLAGS) -c $(DIR_Config)/DEV_Config.c -o $(DIR_BIN)/DEV_Config.o $(DEBUG) diff --git a/display_app/2in15_e-Paper_B/epd b/display_app/2in15_e-Paper_B/epd index 71c1568beac4c0c45ea53cc64e90c9b84dd86c4b..c6a00ac68e3cb1720ceb68350b4ef76ddb7dac6e 100755 GIT binary patch delta 20232 zcmc(Hdt6l2+W+2jLr@SLWK=E!3Mv&hMbJ`Vm{IY{LBh*h4G5#+K~%)jUOfZCh?tjX z<(bk9GH*Xmc`PifPJx{`YMm6#Tb@$9;3Y4EC2IXt-sf4DVKdq9pWh$v@L}(@zUx`f z^L?Im-Fx=zeVa6^{;hqrSC1MWiGGsVN$T=KRn$85HjW(LB)-~f3I z{DmSm2>${_-)3c_SuY zr0GDKc4C?|$Qn7k>b73)i&poyFWdK)8j~b+)A~WxiGn}>h)R)V`!q~b7;8-5TI7(Q)R{UIGzeDrRg?$G*hGm z(=(<)l^zg`e~q9qkXqSET93ZK-<||Wz$cU*;jn1wqTKm~v!r>83+Lr5kSvzmB{`N^ z`Gq+J`7c|gc{v3I^K+$nP(*xmBMpm+i*n~JkQNo^6ie16`NfbbDzFxkbltl?kSxT) z`3s73ie{6abrxHCPJUrAS`tmH=4P|IvqTf`AOauA@qH3?Jx*zgofYBsY8kVfa`#eC!s6Pea@U|H1?5b5=0Nt-`*;4Bx{& z!*1`zAbQ+Kay(;3G$~5`6{V*Yc%TBms=!0ZN1i+6F64PH19{G?8!7SHOD1&f=3T=3 zh8F4tkcnL_av$=3*Qag!6nKb2XM+OotH2K`@Gu45q`<=!_-O^+Pk}cx+$JHR{)&RD ziV6`5yj6imD)9RXe1HOXT$H52>VKxFzfdRY)u|833OG;EOJyIfkY-ChlHnFK*GMwd zdz_6W*A1Sn_L20Ug5`bO^6TQ=%H8to;@ryJ^6O&V%0=GB4X%rE6L8C~i*_q_%ddON zt=uiY?n$?Do`-?MBk+WqfLnfDlv}x5e%&Cqa<}}tfo|n25B3Ft0d4|r`E`+^+z|$I zeX0DLm)+4KNyOgrvwor6?pf0G4mq}*_ z3u)O;cO(32eMi2 zYxUNNhoWAQN0*vG$y;YuYDa%!)@#e}Ia}LnFh{f{D!o?I2Kj1rWO-XzgsF|0jR|uJ=@&QXkOviVQk!Z*%DYkY0_5Wiv_F2X=oQwO4_yukJ$$ zAusDA^zk3ueRbJ@@-}&b;TrUfVQJgQbN)wCf#2lcp5MP~ zHDkX1=aZbd2DJVCF6J2Xa$x@VHg%-tZdt@voOugi^DmIXo+C#5qMn|2_iH=j*m4)} zAFIaXdi~1%Fr%Fd$l7^_$!xpfY>hdO$dO;j)tbbx}+L_Y0tCBTY%sYn_O*VNO<~o{e@>Vyuwt`z#BsuJf z)Yh1H)l>8Co*$E|5#7!F0oZ+wlHSHiZwAs;h)mvEmQa3wf2llrMbFZzNp@%`2l=_r zAZ<02ts$X-PxYol&-@nXSarUR)wgZ}wiRSnV0GB)i-rxYhgU|f+-{!>wVjn012_E4 z@`adRMIwVX`<0>BrQ=G|Sc4u4h6ar!zXg4pI?vf$-RknY`P@~7-_7keI{Dq)e%<9a ztg3o#M1ixp{xtXT{uX)6qIsQwzE3BjiTNps?>R`fj+-e4J$mO{XsgZ1~L;gXZ>A zWN6?0@;Bsu-+sZ9!QMX>egu(iK1aKC>39)^$}2PqFN9X74hNf`cSOPVkunO^pLC8w z^}fzgXiNed+aL;0rPR4cz>dD}K!58$VSZTSfblj&s`t4^!1gz?J8Y142$a=8+Xs?+ zVZHRRpkXt#JdNMB7-0Gq2@kIdtGO7WX!+*8)fangxZ`U1=Du%}xF zJ2bfNke7N&4q!&?+JMRfEY;#qUg|FyV1K38ZTGJ{z)~yqTo2e-e}&q3z2d$qZ%a0= zWvooshy<>aq=9yN@oy{@l88d4SXY>4K#+8bI5%pA$pK`Nz^w?G52!Qqb>mgN+&Q+c8-?h@yoICr3uirPk?uF%vpLyI% z{?f3YFzwsV2Ud7UxtA~ZVEKPFQ){<`wTfo0t=kFTO*#+B&zxJjJz$fLG(`6F=!x5v z#{ZBXBF7JwA^!hnp2!1;uG#lupHq*R)d44$Ck9vVt{^>uWtCqYS|Teie@A8v7~nzE zx}%T|iDKdvN6;xIeC;D1sC&+4=a-x74Ai9k-=t~4L}uQ6fb<_|#_m>jYQR@y!N8~d zX!<}yso4O^p|gBJb`Lb`DLVVJQuFuc7#{fv(GALB_<+5o=C!97e)$9P@}NVQE;~7E zTkeJJUB

S7KhBwQ?(&5%u5NgU;r^SCKPOW&M~fLW4MGhgW3F;Rk10cb6Mq*;UD% ze~pwpQLWwQZ0h@v^nddE0dOr1{c0(#QLsZ7en0ZgxYn#o(dF@#AD8c1ZGdw1)GIHM z{!isg`tFOxM-E$U0r9r@5PblV@Cyis^(_iB({>(J3IGKYjjr*)-6Ibx%;Y1HZ3 zqUc6d7&SFuXw;?L>pOIZZydWiw>5h8$Cbm^G9x>NkZEyNZ9Y_ZmwXxbjhRsk&Aqil zv!!|5{j3`=T$1t9IQyO|^1-A#8LjHkI%#+1u5yDH1lwzF z5IGhfp`8xI*VjIX4^#KMF=J(^*~{*1I&z&U@VK(cLnGzRyXVE&M_wk$LqF1nIGg@{ zg#0#iOusXt#`^DBjRVJNjl6sQoWge`FLAJ(Tl+?0cUh};Hm%=F-b+f5)wLIrPRM@D z?P__f0ivVV={A#t!zbC6F4Wx_cXiUGsLI`yPAU1nb3?Q~;jMM=MORImP=5+O7GFyy>zr*SJH!MB`?_OHji43$M*HO z*2BuswEm_-#s)&LnQd;bz+?Sd6oNf&)8y;h?NF_0@_xNGS?82O|HO=JI}h<#0fw$% zY4?qKt+X6yPv(T7^hk+Q^3}*@Rq=(qEenkKTk_30Fy&E)8jm|0&OKWGtg84&7&GXi zZQDs_L;XX9F614mU;gZ`bk1dk)@Elz`~L;wHdsNLCa+6asJj{2(z`MIT2y)27_C(0 z9GAxxpLI4^el0ac+JDO4mFEoxR|CBmh>qX2FUO3S{pyxa9ay}{O2 z3hDi}`Ym>*V%rbShEbq!c|BeUz@+cpCauZgM1F({H?`&q*;-JIR|zH7@_bO!+V|eB z3az>HiZO3X-nVrS!`Ak;4rG75LyOCW`4`yw13?G)42#DPOso9|r(~;%WT5$nXuDHt zh+w&v|1c3Nh?MkaSOk@*>Bn-7|Dp2XEN7*;<}jAi(wr1Vo3Pb#Ms7iRRdtaog|pW0 z!J%fY*=U1;ggW#%{OUMZ;-V|-diqM0S_5qz?HOl7-`^bfB&px-9fc34=BnB>k(ZW& zFZKVa)zl=PUsJ2Cl(ttGKterW$2|LJ@6qFGz9F~difT*Vg=}M< zDj%cAG+R#qfwQvN*1|i275ahgM?)JZiipSu1;5DVEqT`{HKzW+Y#`u$Ple&%RUTcA zG%VlMdekHjZgWVr+SjGZwa|penU0n`(C0+IS)(zt_M_m?sfVwgD-C<0ziTwJOHIV9se4?Fy+7nMw%j$D+OKh_HPoM7-lq4`Jc2RW(0)E@2dq-HrD zRqovg>^;*|7agW{qysksZmh}WedZ8^_%qq`d5zZee$7d&(`s=>RaVX>755fg)U`b_ zd}+*Kb`HyyB_aI zc)4?1!hT!*0qZVUHG1VPJ7ShS9SS&se*l5^I#Apkia2hAvQdB2YfDBxt+lJb;QOMF zpia0E&|vvTL`xOk1Zb%LARTUGG*~`E08{mQ;D!b;#yqC#|DJ>SPa;|>&6uj+Jp%Ll zupCqM@6+2D4Wr((v;5!4tD^#J){lVSI}7X9ni*f~UdY!htUDp{wUDn~Sa)9JKZN|- z3+p}?`41q!d0`zcPT{SQH*kT<03Ycclm^SzcTCTxO&n)W^R8i?bkw_t?XYSz)Ncv& z_m}h}BH3@?sCPCQ%H>U`DpD>U^mtHe#!lQ`eY>vI{5-l)&4{0So4k-b+J?UN-T014 zuW9YhRD15^D&KfGgxtB)eFJQqs0jx(QGBO69Tl%(YcBm>pXV>_uV<>OH!#(GH^6XS zfa?k_LaMpA3@u)$YjHrYf!klzyeX@piAKCVVt@E~Xv39yousjwyZAyIZi?8y{lVAw z58pY~`fhhwgG01^Gpn?13zSzl95@iKoFv&PPvp|B*!U)RRwnP{QQrirS9s-V&F}1_ z1H9r`WrQZTOMiKb9af5l`t|eL8tZdQJvFc=Wc5L>uEPS8@k_z zayyx142Z(0cYjn$d(QfYrL+fjhckA~^$%G0X7`6{R~Zj#JWSS^i)RlHC3D7vc9BG8 z&lrF5));>!Fz~-b>7qIFUkaT$Z^2W4@bMP6pSiX%^NZ()PARZj7eq%#V)`HOO9 z7Fa{GOeV5qY_!eWYiv$oUV*h}IDX6GEyT=4Me~b>hg#;N?TvIX<4BV>zBg&w_Zm$r7Jm z7?&{9GBKwx$2QvvjB~)jywF+mi;yUU15RF2OrG_{n0eNDv^E^Lg4~=!^mqOOYhmaB zA%i#nc{zTA#Wk{;9Pg0DkmVN4Uu4abB)tF31&XXWc?F?4d3i;lomKGimx}U>t&bDn z<>rix$r-~#^9x^uZ`ATa7vvX)fDGJ&&BYPRWFVpkNzE^Djz{Yz70{mHiC@& zHcIu65oGSSeN-QhAS(gP7)iE&8?D+plAMH7w^2lQI9j!R6d8IrI?O-0y*&UOF#7l! zOI4Hh8-1i{kbO&*Bp)c-N=6(RNZvmjqslUpvxjG>mYK-#BQvynN4K}HB!6leNcJCz z(Vk6fZy!o?!A&u$eG|x}rWsK+liS;8^4R#o`LtS+ZUH9T3kB>3V3#J7V@=_z9_i$6 zQ>1EAIte)%qPm(+Mjj0hNSe~#J`1Se2m9Hp8cAB6NnSiUT=i)t`S9oqs-kB}k7K)4 z*;(YvV=t?I$|57bJEkgTO&)scMx5i_;GpS7|DBa5@Cl@SDCLK+j)u+S~g;nn#b*5FCaR)Q@gLc$gBctL<-3+gT#;)V=kbW>3^u$6izl6&4i!!56 zC^X?TFKk0&S5Q!?%RqXVm;`kW8M~@hv2!NlCE*w@1|5Yn+uJwN(E>`qLv&(JrLO3Z z5wsly_fTVcrS3WO2EWqV36+jRr7TDTKQx?ycIKiP&L9+unm|sK+ulwm3+Q9u+bT^a zRf;O9t~(&(12WM#S}`>4LI~sR6x0<$34(t`!03}ai3J7Y{d%_zKB}2i?;+Y6$Bic_ zX{?tC^@^Y#d@cCcdWX?Rs1^^c$m)SyFZf>r6$j?Ex6`LC*a#Vo(Z#ZzP}V1p_?!xu z@f9R}L5w#o4TcbFhB6;0!!CfnL7*mxvIkJ6gEIF47zCody1^lj{N+?1T@oa{^2pne zoCeAF^2isbqMup=$@@^5eqkzFtx}i8eDR@8y9Z=`1DPdc|EZoN`gDNq5+Eb3WZdZ& zb=k0N`Om8T*Xf@$BzDDX|KI0&deZu1FZm$x zJlj`pB7@GxgeB>i2tP?DiF55*Rx8@n9#Zi6^@7{2ub_ z*%)$sg)eDcHda1OO3#fUt>=7gB@hJs{4bqt|67K+-Kw@8ERIOCo4MwwubXJ~o|O()ZI0!^D}nt3#qrkO_* zXqvH2r)lP0CZ@SZ_^^#Jp4oklrkUMrNTZ9NHXw?Mg0$&VCtA={AVR1wNVGHpSiK3N?pv9aJ!dx`xrR{;64(_^Fu_r&v-m zEJHBCqUJh+;A7bh>tN^7DA>^kMiZ2sCk8&wl94%u`8Di!?1o`@eizVTl(R?HWD9JE zvH$c2l}Sq0spC28j;%K54T7Cn^X5(JU@e*?NwB6}6ip~urwZ0dF4m%Xla#Dou}@O6 z#y|k;_*lx?dt7G97)xsUvzE+^DVgwG9F}nFY#<;&wKA^PVLy!L>$nvy!f1yUlk zTX%HBc;+ER<6WIIUN}kP7>pXJJG!Z3Vl5_A*atC6U5EWOPGGE;P|KziVVU&^ZdrI9 z&w2#6+<^)Qd8deH&Ce{O2WXjf0Knop*s$hjY^a>tOv4zgV)G+p5f1L;DuCF+!QIlQ zW?0yO&zM$q+aGXj)nGcXv7rOiX6hqoLoFeYRcd4O0Yvt}-OTA@r&}gW8gH3kHc@SH z9oo<@)P?~K?uvHP(o(UV;Biubu{ndg02GfHWO@OJfe!8m%}GZbcH$`zUDuf72{Y>y zDmL@0&GFPVYGR5xH8U-BJT(!o;5Y>?9R=INHy$rF%LFAc;FhZI|GP*)&AmKD$=0m4uK$U#hNI_X8A3mu-N9qV0 zh5-2treWiJ*lGcwk`D?XAKEa;2dg3<+B894ENT-?X_KpN2Ovyob`dvwKo|ow*hSMd zpb@1sJ#aITHHA%+(7!25pai|vf&yrLh?1uZRPuCH7p+Ts4pybD%Xwx@GeO{x=a5c3 z(>Tu|N}jIf9n!&btcz!Yk|$O}o(W2xE>OXfZg8oj;E6mio(YtvH;ZS6c{J><(r~qd z5+&8t@tkS`ql(kDYsmuH4yqj?Wm`EOQdEWn*iMc&y$e)Q75#y4<@kJpRoy}gV*^7v zl=AeXO`kf&0xJlPqoGQkuD-~2d9>*}Ldy1eoG02qo@|@PdAdL)PthL|MMx3Akg|Oq zAJ`L3sfCema(Cr;A^Drt)Dz;_i;h0|nP zC*DIdr9eVIn6wYMbm9DVvA!uTZ|Y@)Yu0VFq&+d;=>;`2eCMCz=54ji8bw8$bXGl57A0(3vES8lVc2Sc95YlH}b0 zBo!o4CrI+)BS@kEkmTb>ha~xh3Sdf(Y%&6nbL3Z208ozD{b8l%-3m|zM--rzl^i=H zDaTH0I^3h^)Z7?fB*}&kBgwi8U`mpx3Zg4U4KY|RIh@@5ee{h2MAoVF>AUKYXSuKQ(CDqlziZEQuP&F+`r78!;do5KJU zJs0ia@Zxt&7;h2AIJS~f-q;-jQIPV+JwU8Q>;V8(@D^R1?ehe0FrUG0skjkO<$FKD z8)J{WhtQ6~!Yx8EM9@a(kT%=}G+jJK<5C*Euu3-uMe`AF!v^uQ?>n+xYH zcIm;QC>-Q#02FdIYz=UqTiFu8*tn`vHk}7QzZhXtt7s{9-63Lw-40{JE<6|;(M|Yu z2NZHP?7G9nhEJmGvZK@3=NBEF_L!hX5gKZP#Gc>lxsQI&LVqf0AesvoRQr6$)e9-A zGd{IXTuhZQyWmnXoN7P3l&T&o#NoH3@(fLAn0ncgYE4+U=3RM4wWL#&s$Q0$ShZ{k zqU4FIQ5}}Roe;9@>JWJ>`QWOdxA^)&+5OefySb-x>e?4_UEX zEqO{y%t}d?R>M~uO-CPxcNIUnBrjd_gRe;zUhAp$mQIs*t{LQ=~i0DADgW!H6*6@7tM>nO6`v{TfdpA4PI*8sy9LIEPf- zG{nO%dOLlD=CA(%pQ9(cZbsYwg1=l;d_=WyVUd>!d@FuGsrU#yN%_lCC>Qt_%3p^n z@H=5t37L9pkPO>}TL$n{qdO%#Yf<)1}Q*D3j7vHaT-gI@eXJNT2H=vW6^#!i~wD3;k%JZBu!N(aeSv!AnaTKIKFy7ObbKdAszgbaa_z|Uo%+R z$nYMLh^&~Fc9M5~G01!Hm{SKrzN*{p$e#!iR0(m8yN6Lrr3?uU`!KeylK$KuI^W~(i?xJ?*}ihm~)p&C-eU2OZML}#DzgAIwnSb5$M8C0>|fY8*eaJ8jZE& ziL~x?knx2-v956uDIYDWevdDvb(i6>cPYw%FXCMTr}v*3?*;{k7-UWvo(U%%HWmTIWBtmmmK$oF^yrQ zFFycGEPMeZ?w%ny5K1wOqCYR;wVni=zU3kw#cW0{CdMIs0tQ60xN`A^2BG|UE-z;D zBp`>MLXL}-1|G_$pXF4Kr_?%$e4Q$s8Gx?UwA4DX=$?_a6$ zKDyESQ(k(SPj~&9GN}(6n%GD{{Nqsj2R3|e>J^gT^del^4yc`dOe4(C?Jb6o5fUgurs z1zO9>OYcT7@jPB@3CG3yB)FAeE!!$yDpt`T-kbl*aj`Eb=C-zRJe`l!EN*2F;5cT) zdp?RGj`;bU;=Yo2kB5loS4`e0i5Gp~gID-D3I)EPDtTz6Sh01}!g+kf?nOM47!5cMlwSO0Ac9RI#XTkQ7Lk2CNG4MCo1ynOC`C%{b4eDK z+MegOik@V|-sZf2hNqj5uvpJqS+P{WZHX6<+~<*9!u5#F<=b3-Eyt6%<1;z_7Q=f; zW6ccV!$*1#Y00&C)P4#=IL2)aT+3GW_^|X7*K(ZWV)v8H@fN@_QcHNGZt(VO=L zyMnV^TGOu`o;+~T4ECz@fw1q3w-s1_`jE$f3h|7z2 z>|BK*gdcBs;0}AH*l%ZX&x1HFcJ;kD{v^l6?oe#&-$yIK!+ELL8`B4G!OBF$!Oh_r zkf4ja+n}4qD~ijUm3(rX&+%0$wPzkw$sYJ%Iy{$7=06JXrVn%H6kFjw0NGxa-b(Ye~Gn#lC{t`Kh=e*;O$pBs0HtEa`aQn zPkMEbb4*gpQ{vDw3ow%C>z_LGX6D0>5a1 z<0qc=6z5jQn+S`0GUB|!@jbvj#KWHAyhnEQ@sOi?l(5~iB+ioBF@xf;vBrvrZ^uP>NtbAxJe_89ft z=Ebi3^i4+(PkE@H*maBZSjTivImwgn#eHSRMo+NjnzeXe-)VB30o+e49pe0kqqmow z=qa)ztBwXbioN6@`fj*yf*pIj*7?Ov`9zfK-!(_*IAgoS;guWZpO2UUR;WLn$>m~1`xBm0}^PT5OX5Qbs&&-*b zbIvULL9AP+TGg#{UME4m;%On&iRGbXidk36?{zJ29Fp_%d5ZH=@S-$=LJhylOO&qs z_33hzlG1goF9E~*%sL;X;41L^K}WtW;C%`$ z+A9Cwl>fgY|F}if4ILr1a;r+p9*nwR3sT{OiY{o1EcG|}|Fo1j7->l>k%;f?mE@f;a<6NEI1>$J37#N;hb@_91uEev7ybyQpk0KBu{Izh;br3h(xa%C|? zRwqL%W!z2BWl}lrSV&JdEX+)wnlmeNM$WrNVP@ux8My|WrH*woF3g!HOr2{qO8yg3 zSA0sn4ClB^F{R|rniu(e(kOvcA_fc7hR@8LW=xOFnH3S0m7Yl9NMTH7&a8Qi0O6;l z#=@{=!;X*6cn=!b7AM@5;j3(vZ{iBP$txLy<2>^%PB?G!9ZooJ@;WD+H+kdJxJlrB zdj4s~ldfoS!g-U|u`c0(a+(Lg@%V)_Q|^c3b&CmZ5(J(hXH*tY1-p}jyfTUlZ18aT ziR&rOTae>kbrjb*$sajN@ns~jF7P9Bfh)!2|Fzi7Ej;K5%bRe!w&Pmc;XUv>Zq>*Q z`?_n9JC1U%?@sLTD~}~00^ox?bx21&@yre{mOpkiN!J8nkn%u+a<4L8qfGh}7eM){ zMkxHMK$s?Y2->@Xpp5m1o2K*-G@wrDve>6-4=1{8s1x6bE_;dbP22$oxPup+3^>tc zF;09Zy6gofz7t(Ggz^)3Mji~{bXl~M0Vld_FyrHjj<1*`=vkbfzti0;-GG|esL;$o z4!6pV2^zIo$WPVYf>w-n=_B0~gu>lwKP^Zpqs#%uT2j-9#%Kv7aLKK~hGo?PsTbB( z`;{LkC@ILJ68b1=x#9WJ6}TxX{?GEgYs}`48e~~h?X+H0SSAmbM6SP;;H|z+4TWgS z4>O1T3M8A|@Apj^W;vul&qrYis35N(Z%#dt53q(78>my8 zWvWuSDMOJ>G`O@`mNw}WRJ;-q@pvT_w+LJud8_XPv;<#IvudMAzG5td@smc>DQyEQ zRacV595$ z{ed~v(BTn}^G~q$0Ro$*jZFG?kS-@kdL^FSrKjgd#CkdSI@k)FwfN&MLFfZ)=@KVC zgmx*xDxWA=Xk&Z^d9ExBDSCiLXn%q6^1|@lc(Kokq>DEDXvdrTYL?T;SGJyGk*mPk z_J0$KMqUJwZ~sFXta?}&bdW`U^5pWEouPvl3QU+(Qo-9qziBtf0JXx z%X>5>EdyU)BsA2N(mo5XKHjd+M%NIktKJ;=A5^8Ob_7 zEq}Nca#p@@Gz@w)829M?W6~I#wc^2(ysgc5+vRO_+o6Qjl3b%W=*#e#BtXtb8GW;yw)#BOtV?ze!~0xqBSX? z-E@-WECN+=4tLb`^S^w}YfUT7ajF?CUAoqF%^y$N!0PxJkJs%(jkueCpl>AjJ1}P# zw5+xHq}&QG^HwNrm0Mw{e?^in_}t&t3Z`${w?f6p(ptG0$O1}!gtOs zVD1aKZzK8Ef5-Z+3q<@mK`Op=ZUNJm_;^4+Q473k==+{n8`w>w0Slk z2A2D8zSg^4&x6dh&TH;J>3OT)C-{D#$`zCmu)y`KaUwUmIxLVyn&S`TK)fvaqa3HMCT#$YO*S_y`j8H8zXCmma3I z8;|gUK7uwF#;v;QQR!h?D}KoAfRB|n*~i+F{fg{O8DzPlJaq#J;5R%mIM4(^Xk2c6 zALv^x6izrS;D=gaU6WSWRT0?pkx-CF48U^yty^l~`ddO_(_umLXo1lE)`~(c3E%h8 zo`Sq}P0@ncrJULnoGuFB& z_hHH}+1^uh5lT}GinCp6irw^vX=lB>|H*W}SQ7oM%cJ=H+I^T>5B|JoiHl&kd9yR6 zQ?|<9?s9J~TbZ?vXT8>`T?B8vA-}5YIyJV2__&;v=a4G=IOOF)*P;DS(@anZR$INU z^=SGJ^;%uIB-*!PTM71oD9gQTi6>kI5bmpSk{ES!-^*DAtFC@G5$F8D5)2oyP0daTIHH%k1Qp$a=bbhzuW)s z;#Qk=`&#@*|H437J9UcOh|{axgKr#ve9^wGDDl0TQZ4Y56RO|9mCsd(>tL7{;p71q zLa0WvtTCfn9nczlKg~Y=dRS3p>F%PMpw`9Iv15-nEA+^Mqjl9XGHH3k*#t2IoxANYG5zKw#L!*u;pE16Y?UN!~Ni}#Mz?kFrWNalu)~l1~GL{F-kE(JYqjs zAN;P0sii3h_8pa!z9Ocskm-1}%(rsdO6g`a%$$l+u{zI1qs~x$Wqt*$#M#==SHM<= zDh!-9|JsH=k+qL57KiOOm2eX}S0WDCh_GEL!q8+WRf3*^2c&RqSJGqZ-T8V5#qRlY zek#e3a)Y0v+~8d&VGFHu1?`rn`2C~jUyjkJyS|6v0fXo_uV`x@6YUYwjZnl<&cG(1W2hHU3Qx_;usND;L98z2<@{< zjl~_RNU$Gw3Aamas;Li+erioVi{AEBc2jkfe{;)8IrrQj+N&4$jz0G~m>+)3F~SGdBUQ+hSeZ{Wyx!a*}v9OB_=+Z%F86iaSfAAQr-kYs|!+ zgRL#{DkMya0E(oYQ~^aa8vwe*wnV=p)~QyLt{ ztKs4CAq{T5o(3hZfq)Oqsa?ToXx@s3Ikjszje$Nmr`B|Z10MizU{3A#oGu4?|D4)I zbJX_(?7?@^T1H(TD?hr+0UzF&{O0hHY3AXbDvz7TnxO>_9XG?XwI%&f&n{gA&Aj`b ze?E`z-}f|I^7RC7KDbU>gw{2cBwRb<@;F~lbSe(q^RCU;zo~}|_tU&g`|+@(6ch1L z|NX{fjmqvx{kUym_P?Wc*D$;3-*SJ%qG`A0od=$aE@-m52>a@(>9}vG>H4|=^QPH~ zc~`R&b2jBD-qOR^duNXN1|2tMlNQF0Ml_qC2ZvgQ?hCjAU0keD3o5hT)e92%E@)rX z<72JI@1L@N;)%#R3rj^k8v+Hu-zrIDKUcCFrzQ7)SvF=|1esN%E!4F5cQ9S;o-OJ( zZXw#~TThh+sSK`t&?YlX5|;F@WZVWId9=lCl;7M~>MP~9AC|aEI_h>V)E`lG(~n6`j~qTKA}TR`p7HH@ zx@6$H4*}@6{brzXf> zht9*B;JtvkGfW5N9l*YR74JVApt$-fzIirS(R&>BIM-WIHx7rL3+U=P!Qq$+p^$3` z{8p(1Ve&*g^<0c%`9!?w+!RIPB&=xKrWiOGf7SG^V$Wn8cK)2A$D3Gvp-OS&O}y>G zQbptx9CmS(Vq6AZdNEcpFca^+nAmYsmcyYUFOw5J^6;uNy>Q>3`kKaPI~*B+@#`h1 ztcLF?8vq|eUSubF=%AIREK@0-D^)8S6-N?}CXyxtJYTU)HRed-GF7P>3i?u;yna3d z`rD>C96g9p+R8#NsNMm52jKFz6^e(CC$`Ad4SpS=p@^c4P=OS}C%nGEtDJ_HUg|nI z8LA()*(dRh5^KxQG1xa@;BT<)sQ2ISy$ zyyx#Es@;v_nF% zNCVY3u-)cmvO^B!`hO}1{U02|S6}RPZ@RQ43Vp3u+etd{66!529*nLMA|o0lDE4%! z{UjPCAp*1vLGe)5hQ5H3lmy6q3H9o>mQ7G9L8o|EQ0e>?ix&!N;C}KF3MEotbP}2_ zc@ITCDwWVG;_?QvzZKTHkeUj*%p%PhinI!Q2g)K}X=%+(Se8g@?t=9PD&9e;B<=2_ z>?mv@6)o)tANUrNCq=}fa8!q1`CKC^;allIDH9}X%VJRg>f!w9m-e-*03jZWgJ*y} ze5R${D9naZ0iT|n@wp8D*-75aaQ+dInGx1O1(9Ibmo7f2t7ROr_*Iq+skyYB4fV4eoyxX(dTny_h1tg*{ zG)1}xVp$5iO5O*j7~ZR?lQZPGYRc3uJ`UU@S@bAk-#Pq)HTtSt4JKpcF@fc|%Xm=mm|F7A0=_Ig+KOFGa?68Qx#)~5V z8lNRaBqME_HR`X~j|cxX{uNo@+g&`V-7!*4G79tV`eHjKRF_K;iO?h;lESawRCZE< z%W!Ref`Q}fsa6#&zNEz-S{$Io5432aMKdYKOAW@mw=v^;+~_fl_{`dC9^lIGX=O>CE(t0Tktanb!@iS&g45L zQ2DXYEaa+}-9$7p_N+k^o(nX&t}~p^M{6l8JdoAUW2)^6Ny1s3C(}L?61oBIt@v-e zk8}lcL;dBV`#>TEA@gGu=h@skR63ak9XJBmq(%ANvztYpC2L3IFdzKX2lqXnsZC)G z^eM}zfcjo37nu^1;R^ zOgESmzZLl2?006BA3)(&1r<%5&rd@@j$Gahj|rmm9$E-Gz)4H;BRTvq(m*OdS>V&; z45pAID|iX~s0??UCgcBoJZcOzB=8wYelh@C8Iu19=+K$8cw0&s2_3hB8Ry4jxbfAp zROSX|i!Y7ev6!|ooX;bCU9vFzjE)M*hvlGp9=5||d^qoUnq)T-mzf&hy9F>ew;0aX z!_{nj{2{BE5VOjcrEI3wh2ebG<B{eEhHqu!e1YYUp0$9J0nZOj@o+3M?k4avPj##zew6KYKMiaW72gQ*sG4QA=_d2W z*X0eYwFbaLh}@TKP3X<^9x!kG#8fM5MFh`4M4s=7HZb|F4CkAZEQSYBytBX;3%(PL zl1`3+R(VN6uOO`{k*V`_{x(w|&+y$b6v$xsG=}p%R{;xe5ySZ|k9D2!KEv;_*(HzJ zSx<43z}7y2hgSm(GQm1ea^EmRdpuCjTwW z(5!fh1=B+KLvF7K2V?WS0Gn$CFX%@yy7>`3J`w4pd(ghaBN>~XyaO-Lz2r(@-Ou-3 z<5}2a7#_pgqZ`9BWOFe_*_@Za&)4xW`ZuP=x3`Yd4hhS=Jeai|=1C$Gf941)aH zD>-vsCe&xbG0QN6^x!p=BuyHRB&l^g8ZJ$ofNCVSiRd-SFcE#wOMa_H&u0=7!h)Q+ z@IGwftHycn%$7P%LjKYVlh8`3aT4;aZJmUaNK(8GtKN{;(b!J(WgB^gHZEtT^zG{? zK)U@p>MQxa0kxDjP+0AnH_#3w4V!{8P_p#d6cp~wpY(aTO8SMs{DlB7E2MtuD7-U& zqUU8_h4fZB3hQj4J4At(fY%V5Z*h3J3Q4yK&L>u0x<*N%8GtWKq`k(=SC>m~5#0I% z#d-O-gH!{!J3pCPc}cpOfd;$t6RBG+NdcKa^R3s8OHvll-h6A7*G%ormOjfwL);j3 zM38Q0f;WCk)LE(2LO}}6f=x3Y;sdWxyswm#g`(X!8C!m`r*tq2^&$ttkM;i0fOKwW znCQUrlUgYr5T)v>AQ=p3sN2iesFmx4Wg)`h*C~<>$cNb=yY{*u1!kk6N()pBP;s-| zVy -int EPD_2in15b_Manager(void) +int EPD_2in15b_Manager(const char *file_r, const char *file_b) { - printf("EPD_2IN15B_test Demo\r\n"); + if(DEV_Module_Init()!=0){ return -1; } - printf("e-Paper Init and Clear...\r\n"); + Debug("e-Paper Init and Clear...\r\n"); EPD_2IN15B_Init(); - EPD_2IN15B_Clear(); - DEV_Delay_ms(500); + //EPD_2IN15B_Clear(); + //DEV_Delay_ms(500); //Create a new image cache UBYTE *BlackImage, *RedImage; /* you have to edit the startup_stm32fxxx.s file and set a big enough heap size */ UWORD Imagesize = ((EPD_2IN15B_WIDTH % 8 == 0)? (EPD_2IN15B_WIDTH / 8 ): (EPD_2IN15B_WIDTH / 8 + 1)) * EPD_2IN15B_HEIGHT; if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) { - printf("Failed to apply for black memory...\r\n"); + Debug("Failed to apply for black memory...\r\n"); return -1; } if((RedImage = (UBYTE *)malloc(Imagesize)) == NULL) { - printf("Failed to apply for red memory...\r\n"); + Debug("Failed to apply for red memory...\r\n"); return -1; } - printf("Paint_NewImage\r\n"); - Paint_NewImage(BlackImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 270, WHITE); - Paint_Clear(WHITE); - Paint_NewImage(RedImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 270, WHITE); - Paint_Clear(WHITE); -#if 0 // show bmp - printf("show bmp------------------------\r\n"); + Debug("show bmp------------------------\r\n"); Paint_NewImage(BlackImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 0, WHITE); Paint_SelectImage(BlackImage); - GUI_ReadBmp("./pic/2.15__b.bmp", 0, 0); + GUI_ReadBmp(file_b, 0, 0); Paint_NewImage(RedImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 0, WHITE); Paint_SelectImage(RedImage); - GUI_ReadBmp("./pic/2.15__r.bmp", 0, 0); + GUI_ReadBmp(file_r, 0, 0); EPD_2IN15B_Display(BlackImage, RedImage); - DEV_Delay_ms(2000); -#endif + DEV_Delay_ms(100); -#if 1 // show image for array +#if 0 // show image for array Debug("show image for array\r\n"); EPD_2IN15B_Display(gImage_2in15b_B, gImage_2in15b_R); DEV_Delay_ms(2000); #endif -#if 1 // Drawing on the image - printf("Drawing\r\n"); +#if 0 // Drawing on the image + Debug("Drawing\r\n"); //1.Draw black image Paint_NewImage(BlackImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 270, WHITE); @@ -86,16 +79,13 @@ int EPD_2in15b_Manager(void) #endif - printf("Clear...\r\n"); - EPD_2IN15B_Clear(); - - printf("Goto Sleep...\r\n"); + Debug("Goto Sleep...\r\n"); EPD_2IN15B_Sleep(); free(BlackImage); BlackImage = NULL; DEV_Delay_ms(2000);//important, at least 2s // close 5V - printf("close 5V, Module enters 0 power consumption ...\r\n"); + Debug("Disable VDD, Module enters 0 power consumption ...\r\n"); DEV_Module_Exit(); return 0; diff --git a/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h b/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h index c7d77e71..a39e0acf 100755 --- a/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h +++ b/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h @@ -9,5 +9,5 @@ #include "Debug.h" #include // malloc() free() -int EPD_2in15b_Manager(void); +int EPD_2in15b_Manager(const char *file_r, const char *file_b); #endif diff --git a/display_app/2in15_e-Paper_B/src/main.c b/display_app/2in15_e-Paper_B/src/main.c index 6eaa12bc..c7f99729 100755 --- a/display_app/2in15_e-Paper_B/src/main.c +++ b/display_app/2in15_e-Paper_B/src/main.c @@ -1,6 +1,9 @@ -#include //exit() -#include //signal() -#include "EPD_2in15b_Manager.h" //Examples +#include +#include +#include +#include +#include "EPD_2in15b_Manager.h" +#include "duos_pinmux.h" void Handler(int signo) { @@ -11,12 +14,59 @@ void Handler(int signo) exit(0); } -int main(void) +static int validate_file(const char *path) { - // Exception handling:ctrl + c + struct stat sb; + + if (path == NULL || path[0] == '\0') { + Debug("Error: empty filename\n"); + return 0; + } + if (stat(path, &sb) != 0) { + perror(path); + return 0; + } + if (!S_ISREG(sb.st_mode)) { + Debug("Error: %s is not a regular file\n", path); + return 0; + } + return 1; +} + +int main(int argc, char *argv[]) +{ + const char *file1; + const char *file2; + + /* 1) Check that exactly two arguments were provided */ + if (argc != 3) { + Debug("Usage: %s \n", argv[0]); + return EXIT_FAILURE; + } + file1 = argv[1]; + file2 = argv[2]; + + /* 2) Validate each file */ + if (!validate_file(file1) || !validate_file(file2)) { + return EXIT_FAILURE; + } + + /* 3) Setup Ctrl+C handler */ signal(SIGINT, Handler); - EPD_2in15b_Manager(); - - return 0; + /* 4) Configure pinmux */ + duos_pinmux("B13", "SPI3_SDO"); + duos_pinmux("B14", "B14"); + duos_pinmux("B15", "SPI3_SCK"); + duos_pinmux("B16", "B16"); + duos_pinmux("B22", "B22"); + duos_pinmux("B20", "B20"); + duos_pinmux("B18", "B18"); + + if (EPD_2in15b_Manager(file1, file2) != 0) { + Debug("EPD_2in15b_Manager failed for %s and %s\n", file1, file2); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; } diff --git a/display_app/duos/devmem.c b/display_app/duos/devmem.c index aade7de4..56009979 100755 --- a/display_app/duos/devmem.c +++ b/display_app/duos/devmem.c @@ -17,10 +17,7 @@ #include #include "devmem.h" - -// DEBUG_SET_LEVEL(DEBUG_LEVEL_ERR); -#define ERR printf -#define DEBUG printf +#include "Debug.h" static int devmem_fd; @@ -31,7 +28,7 @@ void *devm_map(unsigned long addr, int len) devmem_fd = open("/dev/mem", O_RDWR | O_SYNC); if (devmem_fd == -1) { - ERR("cannot open '/dev/mem'\n"); + Debug("cannot open '/dev/mem'\n"); goto open_err; } // DEBUG("/dev/mem opened.\n"); @@ -40,7 +37,7 @@ void *devm_map(unsigned long addr, int len) map_base = mmap(NULL, len + addr - offset, PROT_READ | PROT_WRITE, MAP_SHARED, devmem_fd, offset); if (map_base == MAP_FAILED) { - ERR("mmap failed\n"); + Debug("mmap failed\n"); goto mmap_err; } @@ -60,7 +57,7 @@ void devm_unmap(void *virt_addr, int len) unsigned long addr; if (devmem_fd == -1) { - ERR("'/dev/mem' is closed\n"); + Debug("'/dev/mem' is closed\n"); return; } @@ -78,7 +75,7 @@ uint32_t devmem_readl(unsigned long addr) virt_addr = devm_map(addr, 4); if (virt_addr == NULL) { - ERR("readl addr map failed\n"); + Debug("readl addr map failed\n"); return 0; } @@ -95,7 +92,7 @@ void devmem_writel(unsigned long addr, uint32_t val) virt_addr = devm_map(addr, 4); if (virt_addr == NULL) { - ERR("writel addr map failed\n"); + Debug("writel addr map failed\n"); return; } diff --git a/display_app/duos/duos_pinmux.c b/display_app/duos/duos_pinmux.c index 20a343ce..655f0af1 100755 --- a/display_app/duos/duos_pinmux.c +++ b/display_app/duos/duos_pinmux.c @@ -5,6 +5,7 @@ #include #include #include +#include "Debug.h" #define NELEMS(x) (sizeof(x) / sizeof((x)[0])) #define PINMUX_BASE 0x03001000 @@ -69,7 +70,7 @@ uint32_t convert_func_to_value(char *pin, char *func) } if (i == max_fun_num) { - printf("ERROR: invalid pin or func\n"); + Debug("ERROR: invalid pin or func\n"); return INVALID_PIN; } @@ -83,8 +84,8 @@ int duos_pinmux(char *pin, char *func) uint32_t value; uint32_t f_val; - printf("pin %s\n", pin); - printf("func %s\n", func); + Debug("pin %s\n", pin); + Debug("func %s\n", func); for (i = 0; i < NELEMS(cv181x_pin); i++) { if (strcmp(pin, cv181x_pin[i].name) == 0) @@ -97,11 +98,11 @@ int duos_pinmux(char *pin, char *func) return 1; devmem_writel(PINMUX_BASE + cv181x_pin[i].offset, f_val); - printf("register: %x\n", PINMUX_BASE + cv181x_pin[i].offset); - printf("value: %d\n", f_val); + Debug("register: %x\n", PINMUX_BASE + cv181x_pin[i].offset); + Debug("value: %d\n", f_val); } else { - printf("\nInvalid option: %s\n", optarg); + Debug("\nInvalid option: %s\n", optarg); } return 0; From be889f2aeea0bdf197051b0ae73fcc19ffc01d50 Mon Sep 17 00:00:00 2001 From: topolonelli Date: Wed, 14 May 2025 12:19:00 +0200 Subject: [PATCH 20/23] - Deleted app specific files --- display_app/2in15_e-Paper_B/Makefile | 67 - display_app/2in15_e-Paper_B/epd | Bin 91656 -> 0 bytes .../2in15_e-Paper_B/lib/Config/DEV_Config.c | 231 -- .../2in15_e-Paper_B/lib/Config/DEV_Config.h | 52 - .../2in15_e-Paper_B/lib/Config/Debug.h | 47 - .../lib/Config/dev_hardware_SPI.c | 366 --- .../lib/Config/dev_hardware_SPI.h | 120 - .../lib/Config/sysfs_software_spi.c | 204 -- .../lib/Config/sysfs_software_spi.h | 111 - .../2in15_e-Paper_B/lib/Fonts/font12.c | 1384 --------- .../2in15_e-Paper_B/lib/Fonts/font12CN.c | 120 - .../2in15_e-Paper_B/lib/Fonts/font16.c | 1764 ------------ .../2in15_e-Paper_B/lib/Fonts/font20.c | 2142 -------------- .../2in15_e-Paper_B/lib/Fonts/font24.c | 2520 ----------------- .../2in15_e-Paper_B/lib/Fonts/font24CN.c | 465 --- display_app/2in15_e-Paper_B/lib/Fonts/font8.c | 1004 ------- display_app/2in15_e-Paper_B/lib/Fonts/fonts.h | 97 - .../2in15_e-Paper_B/lib/GUI/GUI_BMPfile.c | 529 ---- .../2in15_e-Paper_B/lib/GUI/GUI_BMPfile.h | 94 - .../2in15_e-Paper_B/lib/GUI/GUI_Paint.c | 847 ------ .../2in15_e-Paper_B/lib/GUI/GUI_Paint.h | 217 -- .../2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.c | 261 -- .../2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.h | 45 - display_app/2in15_e-Paper_B/pic/2.15__b.bmp | Bin 5982 -> 0 bytes display_app/2in15_e-Paper_B/pic/2.15__r.bmp | Bin 5982 -> 0 bytes .../2in15_e-Paper_B/src/EPD_2in15b_Manager.c | 93 - .../2in15_e-Paper_B/src/EPD_2in15b_Manager.h | 13 - display_app/2in15_e-Paper_B/src/ImageData.c | 781 ----- display_app/2in15_e-Paper_B/src/ImageData.h | 43 - display_app/2in15_e-Paper_B/src/main.c | 72 - display_app/duos/devmem.c | 102 - display_app/duos/devmem.h | 12 - display_app/duos/duos_pinmux.c | 109 - display_app/duos/duos_pinmux.h | 6 - display_app/duos/func.h | 329 --- display_app/include/system/wiringx.h | 115 - .../libs/system/musl_riscv64/libwiringx.so | Bin 373104 -> 0 bytes duo-pinmux/duos/Makefile | 15 - duo-pinmux/duos/devmem.c | 105 - duo-pinmux/duos/devmem.h | 12 - duo-pinmux/duos/duo-pinmux | Bin 31432 -> 0 bytes duo-pinmux/duos/duo_pinmux.c | 201 -- duo-pinmux/duos/func.h | 329 --- web_app/requirements_build.txt | 6 - 44 files changed, 15030 deletions(-) delete mode 100755 display_app/2in15_e-Paper_B/Makefile delete mode 100755 display_app/2in15_e-Paper_B/epd delete mode 100755 display_app/2in15_e-Paper_B/lib/Config/DEV_Config.c delete mode 100755 display_app/2in15_e-Paper_B/lib/Config/DEV_Config.h delete mode 100755 display_app/2in15_e-Paper_B/lib/Config/Debug.h delete mode 100755 display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.c delete mode 100755 display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.h delete mode 100755 display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.c delete mode 100755 display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.h delete mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font12.c delete mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font12CN.c delete mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font16.c delete mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font20.c delete mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font24.c delete mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font24CN.c delete mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/font8.c delete mode 100755 display_app/2in15_e-Paper_B/lib/Fonts/fonts.h delete mode 100755 display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.c delete mode 100755 display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.h delete mode 100755 display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.c delete mode 100755 display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.h delete mode 100755 display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.c delete mode 100755 display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.h delete mode 100755 display_app/2in15_e-Paper_B/pic/2.15__b.bmp delete mode 100755 display_app/2in15_e-Paper_B/pic/2.15__r.bmp delete mode 100755 display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.c delete mode 100755 display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h delete mode 100755 display_app/2in15_e-Paper_B/src/ImageData.c delete mode 100755 display_app/2in15_e-Paper_B/src/ImageData.h delete mode 100755 display_app/2in15_e-Paper_B/src/main.c delete mode 100755 display_app/duos/devmem.c delete mode 100755 display_app/duos/devmem.h delete mode 100755 display_app/duos/duos_pinmux.c delete mode 100755 display_app/duos/duos_pinmux.h delete mode 100755 display_app/duos/func.h delete mode 100755 display_app/include/system/wiringx.h delete mode 100755 display_app/libs/system/musl_riscv64/libwiringx.so delete mode 100644 duo-pinmux/duos/Makefile delete mode 100644 duo-pinmux/duos/devmem.c delete mode 100644 duo-pinmux/duos/devmem.h delete mode 100755 duo-pinmux/duos/duo-pinmux delete mode 100644 duo-pinmux/duos/duo_pinmux.c delete mode 100644 duo-pinmux/duos/func.h delete mode 100755 web_app/requirements_build.txt diff --git a/display_app/2in15_e-Paper_B/Makefile b/display_app/2in15_e-Paper_B/Makefile deleted file mode 100755 index d547b6da..00000000 --- a/display_app/2in15_e-Paper_B/Makefile +++ /dev/null @@ -1,67 +0,0 @@ -DIR_Config = ./lib/Config -DIR_EPD = ./lib/e-Paper -DIR_FONTS = ./lib/Fonts -DIR_GUI = ./lib/GUI -DIR_SRC = ./src -DIR_BIN = ./bin -DIR_DUOS = ../duos - -EPD = NULL -OBJ_C = $(wildcard ${DIR_EPD}/*.c ${DIR_GUI}/*.c ${DIR_SRC}/*.c ${DIR_FONTS}/*.c ${DIR_DUOS}/*.c) - -OBJ_O = $(patsubst %.c,${DIR_BIN}/%.o,$(notdir ${OBJ_C})) -DUO_DEV_C = $(wildcard $(DIR_BIN)/dev_hardware_SPI.o $(DIR_BIN)/DUO_sysfs_gpio.o $(DIR_BIN)/DEV_Config.o) - -DEBUG = -D DEBUG - -.PHONY : DUO clean - -DUO:DUO_DEV DUO_epd - -TARGET = epd -CC = musl-gcc -MSG = -ffunction-sections -fdata-sections -Wall -CFLAGS += $(MSG) -D $(EPD) - -debug_cflags=-g -O -ggdb3 -ggdb -g3 -ggdb2 -g1 -g0 -#debug_cflags=-O3 -DNDEBUG -arch_cflags=-mcpu=c906fdv -mcmodel=medany -arch_ldflags=-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -sys_lib=../libs/system/musl_riscv64 -sys_inc=../include/system -CFLAGS+=${debug_cflags} -I${sys_inc} - -LDFLAGS=${arch_ldflags} -L${sys_lib} -LDFLAGS += -Wl,-rpath,../libs/system/musl_riscv64 -lwiringx - - -DUO_epd:${OBJ_O} - echo $(@) - $(CC) $(CFLAGS) -D DUO $(OBJ_O) $(DUO_DEV_C) -o $(TARGET) $(DEBUG) $(LDFLAGS) - -$(shell mkdir -p $(DIR_BIN)) - -${DIR_BIN}/%.o:$(DIR_SRC)/%.c - $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_GUI) -I $(DIR_EPD) -I $(DIR_DUOS) $(DEBUG) $(LDFLAGS) - -${DIR_BIN}/%.o:$(DIR_EPD)/%.c - $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) $(DEBUG) $(LDFLAGS) - -${DIR_BIN}/%.o:$(DIR_FONTS)/%.c - $(CC) $(CFLAGS) -c $< -o $@ $(DEBUG) $(LDFLAGS) - -${DIR_BIN}/%.o:$(DIR_GUI)/%.c - $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) $(DEBUG) $(LDFLAGS) - -${DIR_BIN}/%.o:$(DIR_DUOS)/%.c - $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) $(DEBUG) -static - -DUO_DEV: -# $(CC) $(CFLAGS) -c $(DIR_Config)/dev_hardware_SPI.c -o $(DIR_BIN)/dev_hardware_SPI.o $(DEBUG) - $(CC) $(CFLAGS) -c $(DIR_Config)/DEV_Config.c -o $(DIR_BIN)/DEV_Config.o $(DEBUG) - - - -clean : - rm $(DIR_BIN)/*.* - rm $(TARGET) \ No newline at end of file diff --git a/display_app/2in15_e-Paper_B/epd b/display_app/2in15_e-Paper_B/epd deleted file mode 100755 index c6a00ac68e3cb1720ceb68350b4ef76ddb7dac6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91656 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 `RC1=9-Jr7X?k#8 zng{(7%pZ8Xklz4Bp1-5%JPv+G7xw{8XIyx=Iw$Fx$rsRfO9MluO#K?@y=^bA?jH#G zxUo^B_49bj`d*T%zeRMEKe(=WM(gMKkNn0j zL|!!L|EYog3$2Ie8`HW7*pQO`%>BTVn!W`cEa84kud{eMcm?RqaKB2@y9DF{j`($&VQ+aj-%5%Hs=lO>GjwtdjYC6xC9@pjhu++0jT$ogZKD|Wy zq~_;&QC{;uB>8(qS0LXnO8Qpus2-2{H2;^R9)05r9@qRYX#VST+TR%XzYBVwPoASc zmi%3U$DN<+gqJ}l`y33E^EHEh?C46|dH(-bTF)h#&f^ZRJg?Jqo)63K6GP^3r_vML zPq<0)bE((DnAXGVO7@LIn$Gif`Auku-C@v^)%-k9&gd*wG@a*HT>jGrJ!dpO&nM+~ zL!s+FP3L*F{5~=0f2!#`-<2(6zuFck z{~k%-Bo2OFX?RQj z*K0b@54pZOL8oyxI3C3`KhMt}(0UF@y1wxRQ<|UGU-Fx{NcS|oeZOM9Ps=Q8Ic zDrq{ek9rgtf53rFe>x1fZsmXBWO?mep;}vBSU@(JY$dyxtJbm=uU7EVI7-V_an6=0 zd5ihdd@Ao{a8gwDQp+nMT`H9G*;+O;FxZ?!9u9e_N+os5%NA>uQ(~c#DrCLPa-nbv zBECC$?AO4W#5@0@xngA3JW3^R#wH`XV%|))n2DDP1)Q!0$qAfq`DxSHR3^4uJ>{p( zE?0_&i-}ydoKKw+qesTP*u>OAE}um%bT@@l#2V))v-c)a#nfW90^(Q!5y}N|I&MU8 z6328nSIeTVIF(!|6>E_w$SM+_!p6ZAa;;#y3N4!{abZipF^Ss%KxHe=tTdAPp<>gvc6%$`j zkcITT^h%1{8mQlu_2oUeTu9(_w~)$L;TidSDJ@E6oLDbHZ>C!Emf)_aq|d@a7v^Xs zSIY|2PnuEHW+q#kF4f>wYetqfVUr2Ce_5u%4iYly`s(a_%|cMKyv8Oo@`|xjP)myN zVD_5r;<-v1<*R2ulg1&qSdUK_CU|;K+PYr93(koX(4d zYBu{J;f>8sc-*_d*wnWuv-&(-y9KKnjr+lrMxX{j)t2>Zwm|7%YU z_}L=6N6{?o;Q%DMh8j0sUe)BzJ;2YGTmC&++aMVMESYO9W6lSJfyQ+ zD3!BCIO2S@s-Be)=whnbny*shxuWulVJ+k9aiwZ_Sw{0uX75ymB_wo{O|GEHE?~H* zqARFX$YScz0986)^TZ!=uF+z-+C)Pm_qPylNMhtG33uD<0yGv#&nH46iyqx8&}h}r zu&GD&sJ-BE2Y;1kbA>F%u;R%qo-3ig#jBM(bmz<545-l4KqggOL|gE(=;l)hFz%>M z8or#$Re2xV+%mXvVQ-iW*xHvt0v35H} zy(|~&PU=zes@*hN=e#tAiJdI0b&48lGM}`Kn&1hB^-x% zs*uCu5Q`l z94!AhXp{w(1@hv3at_&!I+<3C^5XCVxbw^NJ`sn{?$!c2U^_AOsFr6sKcB+k%qN&r zgiDt!KMq-9VR=5!;P4>Q{1@lT;U6H;FVEk>G01;Y%Lktj3(C_y_kFCB!WXoBSu1!OXs7Xy p?Z^E;b@$wM5UpPaXH`!3uz*ep=8qk&rt(i8SDZHm1Om6>zW_M3ti=ET diff --git a/display_app/2in15_e-Paper_B/lib/Config/DEV_Config.c b/display_app/2in15_e-Paper_B/lib/Config/DEV_Config.c deleted file mode 100755 index 6b0746cf..00000000 --- a/display_app/2in15_e-Paper_B/lib/Config/DEV_Config.c +++ /dev/null @@ -1,231 +0,0 @@ -#include "DEV_Config.h" - -/** - * GPIO read and write -**/ -void DEV_Digital_Write(UWORD Pin, UBYTE Value) -{ - - digitalWrite(Pin, Value); - -} - -UBYTE DEV_Digital_Read(UWORD Pin) -{ - UBYTE Read_value = 0; - - Read_value = digitalRead(Pin); - - return Read_value; -} - -/** - * SPI -**/ -void DEV_SPI_WriteByte(uint8_t Value) -{ - wiringXSPIDataRW(SPI_PORT, &Value,1); -} - -void DEV_SPI_Write_nByte(uint8_t *pData, uint32_t Len) -{ - wiringXSPIDataRW(SPI_PORT, pData,Len); -} - -/** - * GPIO Mode -**/ -void DEV_GPIO_Mode(UWORD Pin, UWORD Mode) -{ - - Debug("not support"); - -} - -/** - * delay x ms -**/ -void DEV_Delay_ms(UDOUBLE xms) -{ - Debug("Sleep for :%d ms\n", xms); - usleep(xms*1000); -} - -static int DEV_Equipment_Testing(void) -{ - FILE *fp; - char issue_str[64]; - - fp = fopen("/etc/issue", "r"); - if (fp == NULL) { - Debug("Unable to open /etc/issue"); - return -1; - } - if (fread(issue_str, 1, sizeof(issue_str), fp) <= 0) { - Debug("Unable to read from /etc/issue"); - return -1; - } - issue_str[sizeof(issue_str)-1] = '\0'; - fclose(fp); - - printf("Current environment: "); - - char systems[][9] = {"Raspbian", "Debian", "NixOS"}; - int detected = 0; - for(int i=0; i<3; i++) { - if (strstr(issue_str, systems[i]) != NULL) { - printf("%s\n", systems[i]); - detected = 1; - } - } - if (!detected) { - printf("OS not recognized\n"); - printf("Built for Debian, but unable to detect environment.\n"); - return -1; - } - - return 0; -} - - - -void DEV_GPIO_Init(void) -{ - - if(wiringXValidGPIO(EPD_RST_PIN) != 0) { - printf("Invalid GPIO %d\n", EPD_RST_PIN); - } - pinMode(EPD_RST_PIN, PINMODE_OUTPUT); - - if(wiringXValidGPIO(EPD_DC_PIN) != 0) { - printf("Invalid GPIO %d\n", EPD_DC_PIN); - } - pinMode(EPD_DC_PIN, PINMODE_OUTPUT); - - if(wiringXValidGPIO(EPD_CS_PIN) != 0) { - printf("Invalid GPIO %d\n", EPD_CS_PIN); - } - pinMode(EPD_CS_PIN, PINMODE_OUTPUT); - - - if(wiringXValidGPIO(EPD_BUSY_PIN) != 0) { - printf("Invalid GPIO %d\n", EPD_BUSY_PIN); - } - pinMode(EPD_BUSY_PIN, PINMODE_INPUT); - - if(wiringXValidGPIO(EPD_PWR_PIN) != 0) { - printf("Invalid GPIO %d\n", EPD_PWR_PIN); - } - pinMode(EPD_PWR_PIN, PINMODE_OUTPUT); - - - DEV_Digital_Write(EPD_CS_PIN, HIGH); - DEV_Digital_Write(EPD_PWR_PIN, HIGH); - - DEV_Delay_ms(100); - -} - -void DEV_SPI_SendnData(UBYTE *Reg) -{ - UDOUBLE size; - size = sizeof(Reg); - for(UDOUBLE i=0 ; i -#include -#include -#include -#include -#include -#include "Debug.h" - -/* Support for MilkV Duo S*/ -#include "wiringx.h" - -/** - * GPIO -**/ - -/* SPI2 is routed to J3 B13-B15 */ -#define SPI_PORT 0 -#define EPD_DC_PIN (3) -#define EPD_CS_PIN (21) -#define EPD_RST_PIN (7) -#define EPD_BUSY_PIN (24) -#define EPD_PWR_PIN (15) -#define EPD_SCLK_PIN (23) -#define EPD_MOSI_PIN (19) - -/** - * data -**/ -#define UBYTE uint8_t -#define UWORD uint16_t -#define UDOUBLE uint32_t - -/*------------------------------------------------------------------------------------------------------*/ -void DEV_Digital_Write(UWORD Pin, UBYTE Value); -UBYTE DEV_Digital_Read(UWORD Pin); - -void DEV_SPI_WriteByte(UBYTE Value); -void DEV_SPI_Write_nByte(uint8_t *pData, uint32_t Len); -void DEV_Delay_ms(UDOUBLE xms); - -void DEV_SPI_SendData(UBYTE Reg); -void DEV_SPI_SendnData(UBYTE *Reg); -UBYTE DEV_SPI_ReadData(); - -UBYTE DEV_Module_Init(void); -void DEV_Module_Exit(void); - - -#endif diff --git a/display_app/2in15_e-Paper_B/lib/Config/Debug.h b/display_app/2in15_e-Paper_B/lib/Config/Debug.h deleted file mode 100755 index af3c30e1..00000000 --- a/display_app/2in15_e-Paper_B/lib/Config/Debug.h +++ /dev/null @@ -1,47 +0,0 @@ -/***************************************************************************** -* | File : Debug.h -* | Author : Waveshare team -* | Function : debug with printf -* | Info : -* Image scanning -* Please use progressive scanning to generate images or fonts -*---------------- -* | This version: V2.0 -* | Date : 2018-10-30 -* | Info : -* 1.USE_DEBUG -> DEBUG, If you need to see the debug information, -* clear the execution: make DEBUG=-DDEBUG -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - -******************************************************************************/ -#ifndef __DEBUG_H -#define __DEBUG_H - -#include - -#if DEBUG - #define Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) -#else - #define Debug(__info,...) -#endif - -#endif - diff --git a/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.c b/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.c deleted file mode 100755 index d6010ca0..00000000 --- a/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.c +++ /dev/null @@ -1,366 +0,0 @@ -/***************************************************************************** -* | File : dev_hardware_SPI.c -* | Author : Waveshare team -* | Function : Read and write /dev/SPI, hardware SPI -* | Info : -*---------------- -* | This version: V1.0 -* | Date : 2019-06-26 -* | Info : Basic version -* -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -******************************************************************************/ -#include "dev_hardware_SPI.h" - - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -HARDWARE_SPI hardware_SPI; - -static uint8_t bits = 8; - -#define SPI_CS_HIGH 0x04 //Chip select high -#define SPI_LSB_FIRST 0x08 //LSB -#define SPI_3WIRE 0x10 //3-wire mode SI and SO same line -#define SPI_LOOP 0x20 //Loopback mode -#define SPI_NO_CS 0x40 //A single device occupies one SPI bus, so there is no chip select -#define SPI_READY 0x80 //Slave pull low to stop data transmission - -struct spi_ioc_transfer tr; - - -/****************************************************************************** -function: SPI port initialization -parameter: - SPI_device : Device name -Info: - /dev/spidev0.0 - /dev/spidev0.1 -******************************************************************************/ -void DEV_HARDWARE_SPI_begin(char *SPI_device) -{ - //device - int ret = 0; - if((hardware_SPI.fd = open(SPI_device, O_RDWR )) < 0) { - perror("Failed to open SPI device.\n"); - printf("Failed to open SPI device\r\n"); - DEV_HARDWARE_SPI_Debug("Failed to open SPI device\r\n"); - exit(1); - } else { - printf("open : %s\r\n", SPI_device); - DEV_HARDWARE_SPI_Debug("open : %s\r\n", SPI_device); - } - hardware_SPI.mode = 0; - - ret = ioctl(hardware_SPI.fd, SPI_IOC_WR_BITS_PER_WORD, &bits); - if (ret == -1) { - printf("can't set bits per word\r\n"); - DEV_HARDWARE_SPI_Debug("can't set bits per word\r\n"); - } - - ret = ioctl(hardware_SPI.fd, SPI_IOC_RD_BITS_PER_WORD, &bits); - if (ret == -1) { - printf("can't get bits per word\r\n"); - DEV_HARDWARE_SPI_Debug("can't get bits per word\r\n"); - } - tr.bits_per_word = bits; - - DEV_HARDWARE_SPI_Mode(SPI_MODE_0); - DEV_HARDWARE_SPI_ChipSelect(SPI_CS_Mode_LOW); - DEV_HARDWARE_SPI_SetBitOrder(SPI_BIT_ORDER_LSBFIRST); - DEV_HARDWARE_SPI_setSpeed(20000000); - DEV_HARDWARE_SPI_SetDataInterval(5); -} - -void DEV_HARDWARE_SPI_beginSet(char *SPI_device, SPIMode mode, uint32_t speed) -{ - //device - int ret = 0; - hardware_SPI.mode = 0; - if((hardware_SPI.fd = open(SPI_device, O_RDWR )) < 0) { - perror("Failed to open SPI device.\n"); - exit(1); - } else { - DEV_HARDWARE_SPI_Debug("open : %s\r\n", SPI_device); - } - - ret = ioctl(hardware_SPI.fd, SPI_IOC_WR_BITS_PER_WORD, &bits); - if (ret == -1) - DEV_HARDWARE_SPI_Debug("can't set bits per word\r\n"); - - ret = ioctl(hardware_SPI.fd, SPI_IOC_RD_BITS_PER_WORD, &bits); - if (ret == -1) - DEV_HARDWARE_SPI_Debug("can't get bits per word\r\n"); - - DEV_HARDWARE_SPI_Mode(mode); - DEV_HARDWARE_SPI_ChipSelect(SPI_CS_Mode_LOW); - DEV_HARDWARE_SPI_setSpeed(speed); - DEV_HARDWARE_SPI_SetDataInterval(0); -} - - -/****************************************************************************** -function: SPI device End -parameter: -Info: -******************************************************************************/ -void DEV_HARDWARE_SPI_end(void) -{ - hardware_SPI.mode = 0; - if (close(hardware_SPI.fd) != 0){ - DEV_HARDWARE_SPI_Debug("Failed to close SPI device\r\n"); - perror("Failed to close SPI device.\n"); - } -} - -/****************************************************************************** -function: Set SPI speed -parameter: -Info: Return 1 success - Return -1 failed -******************************************************************************/ -int DEV_HARDWARE_SPI_setSpeed(uint32_t speed) -{ - uint32_t speed1 = hardware_SPI.speed; - - hardware_SPI.speed = speed; - - //Write speed - if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1) { - DEV_HARDWARE_SPI_Debug("can't set max speed hz\r\n"); - hardware_SPI.speed = speed1;//Setting failure rate unchanged - return -1; - } - - //Read the speed of just writing - if (ioctl(hardware_SPI.fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) == -1) { - DEV_HARDWARE_SPI_Debug("can't get max speed hz\r\n"); - hardware_SPI.speed = speed1;//Setting failure rate unchanged - return -1; - } - hardware_SPI.speed = speed; - tr.speed_hz = hardware_SPI.speed; - return 1; -} - -/****************************************************************************** -function: Set SPI Mode -parameter: -Info: - SPIMode: - SPI_MODE0 - SPI_MODE1 - SPI_MODE2 - SPI_MODE3 - Return : - Return 1 success - Return -1 failed -******************************************************************************/ -int DEV_HARDWARE_SPI_Mode(SPIMode mode) -{ - hardware_SPI.mode &= 0xfC;//Clear low 2 digits - hardware_SPI.mode |= mode;//Setting mode - - //Write device - if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { - DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); - return -1; - } - return 1; -} - -/****************************************************************************** -function: Set SPI CS Enable -parameter: -Info: - EN: - DISABLE - ENABLE - Return : - Return 1 success - Return -1 failed -******************************************************************************/ -int DEV_HARDWARE_SPI_CSEN(SPICSEN EN) -{ - if(EN == ENABLE){ - hardware_SPI.mode |= SPI_NO_CS; - }else { - hardware_SPI.mode &= ~SPI_NO_CS; - } - //Write device - if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { - DEV_HARDWARE_SPI_Debug("can't set spi CS EN\r\n"); - return -1; - } - return 1; -} - -/****************************************************************************** -function: Chip Select -parameter: -Info: - CS_Mode: - SPI_CS_Mode_LOW - SPI_CS_Mode_HIGH - SPI_CS_Mode_NONE - Return : - Return 1 success - Return -1 failed -******************************************************************************/ -int DEV_HARDWARE_SPI_ChipSelect(SPIChipSelect CS_Mode) -{ - if(CS_Mode == SPI_CS_Mode_HIGH){ - hardware_SPI.mode |= SPI_CS_HIGH; - hardware_SPI.mode &= ~SPI_NO_CS; - DEV_HARDWARE_SPI_Debug("CS HIGH \r\n"); - }else if(CS_Mode == SPI_CS_Mode_LOW){ - hardware_SPI.mode &= ~SPI_CS_HIGH; - hardware_SPI.mode &= ~SPI_NO_CS; - }else if(CS_Mode == SPI_CS_Mode_NONE){ - hardware_SPI.mode |= SPI_NO_CS; - } - - if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { - DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); - return -1; - } - return 1; -} - -/****************************************************************************** -function: Sets the SPI bit order -parameter: -Info: - Order: - SPI_BIT_ORDER_LSBFIRST - SPI_BIT_ORDER_MSBFIRST - Return : - Return 1 success - Return -1 failed -******************************************************************************/ -int DEV_HARDWARE_SPI_SetBitOrder(SPIBitOrder Order) -{ - if(Order == SPI_BIT_ORDER_LSBFIRST){ - hardware_SPI.mode |= SPI_LSB_FIRST; - DEV_HARDWARE_SPI_Debug("SPI_LSB_FIRST\r\n"); - }else if(Order == SPI_BIT_ORDER_MSBFIRST){ - hardware_SPI.mode &= ~SPI_LSB_FIRST; - DEV_HARDWARE_SPI_Debug("SPI_MSB_FIRST\r\n"); - } - - // DEV_HARDWARE_SPI_Debug("hardware_SPI.mode = 0x%02x\r\n", hardware_SPI.mode); - int fd = ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode); - DEV_HARDWARE_SPI_Debug("fd = %d\r\n",fd); - if (fd == -1) { - DEV_HARDWARE_SPI_Debug("can't set spi SPI_LSB_FIRST\r\n"); - return -1; - } - return 1; -} - -/****************************************************************************** -function: Sets the SPI Bus Mode -parameter: -Info: - Order: - SPI_3WIRE_Mode - SPI_4WIRE_Mode - Return : - Return 1 success - Return -1 failed -******************************************************************************/ -int DEV_HARDWARE_SPI_SetBusMode(BusMode mode) -{ - if(mode == SPI_3WIRE_Mode){ - hardware_SPI.mode |= SPI_3WIRE; - }else if(mode == SPI_4WIRE_Mode){ - hardware_SPI.mode &= ~SPI_3WIRE; - } - if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { - DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); - return -1; - } - return 1; -} - -/****************************************************************************** -function: - Time interval after transmission of one byte during continuous transmission -parameter: - us : Interval time (us) -Info: -******************************************************************************/ -void DEV_HARDWARE_SPI_SetDataInterval(uint16_t us) -{ - hardware_SPI.delay = us; - tr.delay_usecs = hardware_SPI.delay; -} - -/****************************************************************************** -function: SPI port sends one byte of data -parameter: - buf : Sent data -Info: -******************************************************************************/ -uint8_t DEV_HARDWARE_SPI_TransferByte(uint8_t buf) -{ - uint8_t rbuf[1]; - tr.len = 1; - tr.tx_buf = (unsigned long)&buf; - tr.rx_buf = (unsigned long)rbuf; - - //ioctl Operation, transmission of data - if ( ioctl(hardware_SPI.fd, SPI_IOC_MESSAGE(1), &tr) < 1 ) - DEV_HARDWARE_SPI_Debug("can't send spi message\r\n"); - return rbuf[0]; -} - -/****************************************************************************** -function: The SPI port reads a byte -parameter: -Info: Return read data -******************************************************************************/ -int DEV_HARDWARE_SPI_Transfer(uint8_t *buf, uint32_t len) -{ - tr.len = len; - tr.tx_buf = (unsigned long)buf; - tr.rx_buf = (unsigned long)buf; - - //ioctl Operation, transmission of data - if (ioctl(hardware_SPI.fd, SPI_IOC_MESSAGE(1), &tr) < 1 ){ - DEV_HARDWARE_SPI_Debug("can't send spi message\r\n"); - return -1; - } - - return 1; -} - diff --git a/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.h b/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.h deleted file mode 100755 index b22d195a..00000000 --- a/display_app/2in15_e-Paper_B/lib/Config/dev_hardware_SPI.h +++ /dev/null @@ -1,120 +0,0 @@ -/***************************************************************************** -* | File : dev_hardware_SPI.h -* | Author : Waveshare team -* | Function : Read and write /dev/SPI, hardware SPI -* | Info : -*---------------- -* | This version: V1.0 -* | Date : 2019-06-26 -* | Info : Basic version -* -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -******************************************************************************/ -#ifndef __DEV_HARDWARE_SPI_ -#define __DEV_HARDWARE_SPI_ - -#include - -#define DEV_HARDWARE_SPI_DEBUG 0 -#if DEV_HARDWARE_SPI_DEBUG -#define DEV_HARDWARE_SPI_Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) -#else -#define DEV_HARDWARE_SPI_Debug(__info,...) -#endif - -#define SPI_CPHA 0x01 -#define SPI_CPOL 0x02 -#define SPI_MODE_0 (0|0) -#define SPI_MODE_1 (0|SPI_CPHA) -#define SPI_MODE_2 (SPI_CPOL|0) -#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) - -typedef enum{ - SPI_MODE0 = SPI_MODE_0, /*!< CPOL = 0, CPHA = 0 */ - SPI_MODE1 = SPI_MODE_1, /*!< CPOL = 0, CPHA = 1 */ - SPI_MODE2 = SPI_MODE_2, /*!< CPOL = 1, CPHA = 0 */ - SPI_MODE3 = SPI_MODE_3 /*!< CPOL = 1, CPHA = 1 */ -}SPIMode; - -typedef enum{ - DISABLE = 0, - ENABLE = 1 -}SPICSEN; - -typedef enum{ - SPI_CS_Mode_LOW = 0, /*!< Chip Select 0 */ - SPI_CS_Mode_HIGH = 1, /*!< Chip Select 1 */ - SPI_CS_Mode_NONE = 3 /*!< No CS, control it yourself */ -}SPIChipSelect; - -typedef enum -{ - SPI_BIT_ORDER_LSBFIRST = 0, /*!< LSB First */ - SPI_BIT_ORDER_MSBFIRST = 1 /*!< MSB First */ -}SPIBitOrder; - -typedef enum -{ - SPI_3WIRE_Mode = 0, - SPI_4WIRE_Mode = 1 -}BusMode; - - -/** - * Define SPI attribute -**/ -typedef struct SPIStruct { - //GPIO - uint16_t SCLK_PIN; - uint16_t MOSI_PIN; - uint16_t MISO_PIN; - - uint16_t CS0_PIN; - uint16_t CS1_PIN; - - - uint32_t speed; - uint16_t mode; - uint16_t delay; - int fd; // -} HARDWARE_SPI; - - - - -void DEV_HARDWARE_SPI_begin(char *SPI_device); -void DEV_HARDWARE_SPI_beginSet(char *SPI_device, SPIMode mode, uint32_t speed); -void DEV_HARDWARE_SPI_end(void); - -int DEV_HARDWARE_SPI_setSpeed(uint32_t speed); - -uint8_t DEV_HARDWARE_SPI_TransferByte(uint8_t buf); -int DEV_HARDWARE_SPI_Transfer(uint8_t *buf, uint32_t len); - -void DEV_HARDWARE_SPI_SetDataInterval(uint16_t us); -int DEV_HARDWARE_SPI_SetBusMode(BusMode mode); -int DEV_HARDWARE_SPI_SetBitOrder(SPIBitOrder Order); -int DEV_HARDWARE_SPI_ChipSelect(SPIChipSelect CS_Mode); -int DEV_HARDWARE_SPI_CSEN(SPICSEN EN); -int DEV_HARDWARE_SPI_Mode(SPIMode mode); - - -#endif \ No newline at end of file diff --git a/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.c b/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.c deleted file mode 100755 index ffd9658e..00000000 --- a/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.c +++ /dev/null @@ -1,204 +0,0 @@ -/***************************************************************************** -* | File : sysfs_software_spi.h -* | Author : Waveshare team -* | Function : Read and write /sys/class/gpio, software spi -* | Info : -*---------------- -* | This version: V1.0 -* | Date : 2019-06-05 -* | Info : Basic version -* -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# Read_data OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -******************************************************************************/ -#include "sysfs_software_spi.h" - -SOFTWARE_SPI software_spi; - -/****************************************************************************** -function: -parameter: -Info: -******************************************************************************/ -void SYSFS_software_spi_begin(void) -{ - // gpio - software_spi.SCLK_PIN = SPI0_SCK; - software_spi.MOSI_PIN = SPI0_MOSI; - software_spi.MISO_PIN = SPI0_MISO; - - //software spi configure - software_spi.Mode = SOFTWARE_SPI_Mode0; - software_spi.Type = SOFTWARE_SPI_Master; - software_spi.Delay = SOFTWARE_SPI_CLOCK_DIV2; - software_spi.Order = SOFTWARE_SPI_MSBFIRST; // MSBFIRST - - SYSFS_GPIO_Export(software_spi.SCLK_PIN); - SYSFS_GPIO_Export(software_spi.MOSI_PIN); - SYSFS_GPIO_Export(software_spi.MISO_PIN); - - SYSFS_GPIO_Direction(software_spi.SCLK_PIN, OUT); - SYSFS_GPIO_Direction(software_spi.MOSI_PIN, OUT); - SYSFS_GPIO_Direction(software_spi.MISO_PIN, IN); -} - -void SYSFS_software_spi_end(void) -{ - SYSFS_GPIO_Write(software_spi.SCLK_PIN, LOW); - SYSFS_GPIO_Write(software_spi.MOSI_PIN, LOW); - - SYSFS_GPIO_Unexport(software_spi.SCLK_PIN); - SYSFS_GPIO_Unexport(software_spi.MOSI_PIN); -} - -void SYSFS_software_spi_setBitOrder(uint8_t order) -{ - software_spi.Order = order & 1; -} - -void SYSFS_software_spi_setDataMode(uint8_t mode) -{ - if(mode > 4) { - SYSFS_SOFTWARE_SPI_Debug("MODE must be 0-3\r\n"); - return; - } - software_spi.Mode = mode; - - switch (software_spi.Mode) { - case SOFTWARE_SPI_Mode0: - software_spi.CPOL = 0; - software_spi.CPHA = 0; - break; - case SOFTWARE_SPI_Mode1: - software_spi.CPOL = 0; - software_spi.CPHA = 1; - break; - case SOFTWARE_SPI_Mode2: - software_spi.CPOL = 1; - software_spi.CPHA = 0; - break; - case SOFTWARE_SPI_Mode3: - software_spi.CPOL = 1; - software_spi.CPHA = 1; - break; - } -} - -void SYSFS_software_spi_setClockDivider(uint8_t div) -{ - if(div > 8) { - SYSFS_SOFTWARE_SPI_Debug("div must be 0-7\r\n"); - return; - } - switch (div) { - case SOFTWARE_SPI_CLOCK_DIV2: - software_spi.Delay = 2; - break; - case SOFTWARE_SPI_CLOCK_DIV4: - software_spi.Delay = 4; - break; - case SOFTWARE_SPI_CLOCK_DIV8: - software_spi.Delay = 8; - break; - case SOFTWARE_SPI_CLOCK_DIV16: - software_spi.Delay = 16; - break; - case SOFTWARE_SPI_CLOCK_DIV32: - software_spi.Delay = 32; - break; - case SOFTWARE_SPI_CLOCK_DIV64: - software_spi.Delay = 64; - break; - case SOFTWARE_SPI_CLOCK_DIV128: - software_spi.Delay = 128; - break; - default: - software_spi.Delay = 128; - break; - } -} - -/****************************************************************************** -function: SPI Mode 0 -parameter: -Info: -******************************************************************************/ -uint8_t SYSFS_software_spi_transfer(uint8_t value) -{ - // printf("value = %d\r\n", value); - uint8_t Read_data; - if (software_spi.Order == SOFTWARE_SPI_LSBFIRST) { - uint8_t temp = - ((value & 0x01) << 7) | - ((value & 0x02) << 5) | - ((value & 0x04) << 3) | - ((value & 0x08) << 1) | - ((value & 0x10) >> 1) | - ((value & 0x20) >> 3) | - ((value & 0x40) >> 5) | - ((value & 0x80) >> 7); - value = temp; - } - - uint8_t delay = software_spi.Delay >> 1; - for(int j=delay; j > 0; j--); - - // printf("value = %d\r\n", value); - uint8_t Read_miso = 0; - - SYSFS_GPIO_Write(software_spi.SCLK_PIN, 0); - for (uint8_t bit = 0; bit < 8; bit++) { - SYSFS_GPIO_Write(software_spi.SCLK_PIN, 0); - // for(int j=delay; j > 0; j--);// DELAY - - if (software_spi.CPHA) { - Read_miso = SYSFS_GPIO_Read(software_spi.MISO_PIN); - if (software_spi.Order == SOFTWARE_SPI_LSBFIRST) { - Read_data <<= 1; - Read_data |= Read_miso; - } else { - Read_data >>= 1; - Read_data |= Read_miso << 7; - } - } else { - SYSFS_GPIO_Write(software_spi.MOSI_PIN, ((value< 0; j--);// DELAY - SYSFS_GPIO_Write(software_spi.SCLK_PIN, 1); - // for(int j=delay; j > 0; j--);// DELAY - - if (software_spi.CPHA) { - SYSFS_GPIO_Write(software_spi.MOSI_PIN, ((value<>= 1; - Read_data |= Read_miso << 7; - } - } - - // for(int j=delay; j > 0; j--);// DELAY - } - return Read_data; -} diff --git a/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.h b/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.h deleted file mode 100755 index 3f36463d..00000000 --- a/display_app/2in15_e-Paper_B/lib/Config/sysfs_software_spi.h +++ /dev/null @@ -1,111 +0,0 @@ -/***************************************************************************** -* | File : sysfs_software_spi.h -* | Author : Waveshare team -* | Function : Read and write /sys/class/gpio, software spi -* | Info : -*---------------- -* | This version: V1.0 -* | Date : 2019-06-05 -* | Info : Basic version -* -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -******************************************************************************/ -#ifndef __SYSFS_SOFTWARE_SPI_ -#define __SYSFS_SOFTWARE_SPI_ - -#include "sysfs_gpio.h" -#include -#include - -#define SYSFS_SOFTWARE_SPI_DEBUG 1 -#if SYSFS_SOFTWARE_SPI_DEBUG -#define SYSFS_SOFTWARE_SPI_Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) -#else -#define SYSFS_SOFTWARE_SPI_Debug(__info,...) -#endif - -/** - * SPI communication mode -**/ -typedef enum { - SOFTWARE_SPI_Mode0, /* Clock Polarity is 0 and Clock Phase is 0 */ - SOFTWARE_SPI_Mode1, /* Clock Polarity is 0 and Clock Phase is 1 */ - SOFTWARE_SPI_Mode2, /* Clock Polarity is 1 and Clock Phase is 0 */ - SOFTWARE_SPI_Mode3, /* Clock Polarity is 1 and Clock Phase is 1 */ -} SOFTWARE_SPI_Mode; - -/** - * SPI clock(div) -**/ -typedef enum { - SOFTWARE_SPI_CLOCK_DIV2, - SOFTWARE_SPI_CLOCK_DIV4, - SOFTWARE_SPI_CLOCK_DIV8, - SOFTWARE_SPI_CLOCK_DIV16, - SOFTWARE_SPI_CLOCK_DIV32, - SOFTWARE_SPI_CLOCK_DIV64, - SOFTWARE_SPI_CLOCK_DIV128, -} SOFTWARE_SPI_Clock; - -/** - * Define SPI type -**/ -typedef enum { - SOFTWARE_SPI_Master, - SOFTWARE_SPI_Slave, -} SOFTWARE_SPI_Type; - -/** - * Define SPI order -**/ -typedef enum { - SOFTWARE_SPI_LSBFIRST, - SOFTWARE_SPI_MSBFIRST, -} SOFTWARE_SPI_Order; - -/** - * Define SPI attribute -**/ -typedef struct SPIStruct { - //GPIO - uint16_t SCLK_PIN; - uint16_t MOSI_PIN; - uint16_t MISO_PIN; - uint16_t CS_PIN; - - //Mode - SOFTWARE_SPI_Mode Mode; - uint8_t CPOL; - uint8_t CPHA; - - SOFTWARE_SPI_Clock Delay; - SOFTWARE_SPI_Type Type; - SOFTWARE_SPI_Order Order; -} SOFTWARE_SPI; - -void SYSFS_software_spi_begin(void); -void SYSFS_software_spi_end(void); -void SYSFS_software_spi_setBitOrder(uint8_t order); -void SYSFS_software_spi_setDataMode(uint8_t mode); -void SYSFS_software_spi_setClockDivider(uint8_t div); -uint8_t SYSFS_software_spi_transfer(uint8_t value); - -#endif \ No newline at end of file diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font12.c b/display_app/2in15_e-Paper_B/lib/Fonts/font12.c deleted file mode 100755 index 485c3f01..00000000 --- a/display_app/2in15_e-Paper_B/lib/Fonts/font12.c +++ /dev/null @@ -1,1384 +0,0 @@ -/** - ****************************************************************************** - * @file Font12.c - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2014 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "fonts.h" - -// -// Font data for Courier New 12pt -// - -const uint8_t Font12_Table[] = -{ - // @0 ' ' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @12 '!' (7 pixels wide) - 0x00, // - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - - // @24 '"' (7 pixels wide) - 0x00, // - 0x6C, // ## ## - 0x48, // # # - 0x48, // # # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @36 '#' (7 pixels wide) - 0x00, // - 0x14, // # # - 0x14, // # # - 0x28, // # # - 0x7C, // ##### - 0x28, // # # - 0x7C, // ##### - 0x28, // # # - 0x50, // # # - 0x50, // # # - 0x00, // - 0x00, // - - // @48 '$' (7 pixels wide) - 0x00, // - 0x10, // # - 0x38, // ### - 0x40, // # - 0x40, // # - 0x38, // ### - 0x48, // # # - 0x70, // ### - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - - // @60 '%' (7 pixels wide) - 0x00, // - 0x20, // # - 0x50, // # # - 0x20, // # - 0x0C, // ## - 0x70, // ### - 0x08, // # - 0x14, // # # - 0x08, // # - 0x00, // - 0x00, // - 0x00, // - - // @72 '&' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x18, // ## - 0x20, // # - 0x20, // # - 0x54, // # # # - 0x48, // # # - 0x34, // ## # - 0x00, // - 0x00, // - 0x00, // - - // @84 ''' (7 pixels wide) - 0x00, // - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @96 '(' (7 pixels wide) - 0x00, // - 0x08, // # - 0x08, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x08, // # - 0x08, // # - 0x00, // - - // @108 ')' (7 pixels wide) - 0x00, // - 0x20, // # - 0x20, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x20, // # - 0x20, // # - 0x00, // - - // @120 '*' (7 pixels wide) - 0x00, // - 0x10, // # - 0x7C, // ##### - 0x10, // # - 0x28, // # # - 0x28, // # # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @132 '+' (7 pixels wide) - 0x00, // - 0x00, // - 0x10, // # - 0x10, // # - 0x10, // # - 0xFE, // ####### - 0x10, // # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - - // @144 ',' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x18, // ## - 0x10, // # - 0x30, // ## - 0x20, // # - 0x00, // - - // @156 '-' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @168 '.' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x30, // ## - 0x30, // ## - 0x00, // - 0x00, // - 0x00, // - - // @180 '/' (7 pixels wide) - 0x00, // - 0x04, // # - 0x04, // # - 0x08, // # - 0x08, // # - 0x10, // # - 0x10, // # - 0x20, // # - 0x20, // # - 0x40, // # - 0x00, // - 0x00, // - - // @192 '0' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @204 '1' (7 pixels wide) - 0x00, // - 0x30, // ## - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @216 '2' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x04, // # - 0x08, // # - 0x10, // # - 0x20, // # - 0x44, // # # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @228 '3' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x04, // # - 0x18, // ## - 0x04, // # - 0x04, // # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @240 '4' (7 pixels wide) - 0x00, // - 0x0C, // ## - 0x14, // # # - 0x14, // # # - 0x24, // # # - 0x44, // # # - 0x7E, // ###### - 0x04, // # - 0x0E, // ### - 0x00, // - 0x00, // - 0x00, // - - // @252 '5' (7 pixels wide) - 0x00, // - 0x3C, // #### - 0x20, // # - 0x20, // # - 0x38, // ### - 0x04, // # - 0x04, // # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @264 '6' (7 pixels wide) - 0x00, // - 0x1C, // ### - 0x20, // # - 0x40, // # - 0x78, // #### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @276 '7' (7 pixels wide) - 0x00, // - 0x7C, // ##### - 0x44, // # # - 0x04, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - - // @288 '8' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @300 '9' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x3C, // #### - 0x04, // # - 0x08, // # - 0x70, // ### - 0x00, // - 0x00, // - 0x00, // - - // @312 ':' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x30, // ## - 0x30, // ## - 0x00, // - 0x00, // - 0x30, // ## - 0x30, // ## - 0x00, // - 0x00, // - 0x00, // - - // @324 ';' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x18, // ## - 0x18, // ## - 0x00, // - 0x00, // - 0x18, // ## - 0x30, // ## - 0x20, // # - 0x00, // - 0x00, // - - // @336 '<' (7 pixels wide) - 0x00, // - 0x00, // - 0x0C, // ## - 0x10, // # - 0x60, // ## - 0x80, // # - 0x60, // ## - 0x10, // # - 0x0C, // ## - 0x00, // - 0x00, // - 0x00, // - - // @348 '=' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x7C, // ##### - 0x00, // - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @360 '>' (7 pixels wide) - 0x00, // - 0x00, // - 0xC0, // ## - 0x20, // # - 0x18, // ## - 0x04, // # - 0x18, // ## - 0x20, // # - 0xC0, // ## - 0x00, // - 0x00, // - 0x00, // - - // @372 '?' (7 pixels wide) - 0x00, // - 0x00, // - 0x18, // ## - 0x24, // # # - 0x04, // # - 0x08, // # - 0x10, // # - 0x00, // - 0x30, // ## - 0x00, // - 0x00, // - 0x00, // - - // @384 '@' (7 pixels wide) - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x4C, // # ## - 0x54, // # # # - 0x54, // # # # - 0x4C, // # ## - 0x40, // # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - - // @396 'A' (7 pixels wide) - 0x00, // - 0x30, // ## - 0x10, // # - 0x28, // # # - 0x28, // # # - 0x28, // # # - 0x7C, // ##### - 0x44, // # # - 0xEE, // ### ### - 0x00, // - 0x00, // - 0x00, // - - // @408 'B' (7 pixels wide) - 0x00, // - 0xF8, // ##### - 0x44, // # # - 0x44, // # # - 0x78, // #### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0xF8, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @420 'C' (7 pixels wide) - 0x00, // - 0x3C, // #### - 0x44, // # # - 0x40, // # - 0x40, // # - 0x40, // # - 0x40, // # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @432 'D' (7 pixels wide) - 0x00, // - 0xF0, // #### - 0x48, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x48, // # # - 0xF0, // #### - 0x00, // - 0x00, // - 0x00, // - - // @444 'E' (7 pixels wide) - 0x00, // - 0xFC, // ###### - 0x44, // # # - 0x50, // # # - 0x70, // ### - 0x50, // # # - 0x40, // # - 0x44, // # # - 0xFC, // ###### - 0x00, // - 0x00, // - 0x00, // - - // @456 'F' (7 pixels wide) - 0x00, // - 0x7E, // ###### - 0x22, // # # - 0x28, // # # - 0x38, // ### - 0x28, // # # - 0x20, // # - 0x20, // # - 0x70, // ### - 0x00, // - 0x00, // - 0x00, // - - // @468 'G' (7 pixels wide) - 0x00, // - 0x3C, // #### - 0x44, // # # - 0x40, // # - 0x40, // # - 0x4E, // # ### - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @480 'H' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x44, // # # - 0x7C, // ##### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0xEE, // ### ### - 0x00, // - 0x00, // - 0x00, // - - // @492 'I' (7 pixels wide) - 0x00, // - 0x7C, // ##### - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @504 'J' (7 pixels wide) - 0x00, // - 0x3C, // #### - 0x08, // # - 0x08, // # - 0x08, // # - 0x48, // # # - 0x48, // # # - 0x48, // # # - 0x30, // ## - 0x00, // - 0x00, // - 0x00, // - - // @516 'K' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x48, // # # - 0x50, // # # - 0x70, // ### - 0x48, // # # - 0x44, // # # - 0xE6, // ### ## - 0x00, // - 0x00, // - 0x00, // - - // @528 'L' (7 pixels wide) - 0x00, // - 0x70, // ### - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x24, // # # - 0x24, // # # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @540 'M' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x6C, // ## ## - 0x6C, // ## ## - 0x54, // # # # - 0x54, // # # # - 0x44, // # # - 0x44, // # # - 0xEE, // ### ### - 0x00, // - 0x00, // - 0x00, // - - // @552 'N' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x64, // ## # - 0x64, // ## # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0x4C, // # ## - 0xEC, // ### ## - 0x00, // - 0x00, // - 0x00, // - - // @564 'O' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @576 'P' (7 pixels wide) - 0x00, // - 0x78, // #### - 0x24, // # # - 0x24, // # # - 0x24, // # # - 0x38, // ### - 0x20, // # - 0x20, // # - 0x70, // ### - 0x00, // - 0x00, // - 0x00, // - - // @588 'Q' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x1C, // ### - 0x00, // - 0x00, // - - // @600 'R' (7 pixels wide) - 0x00, // - 0xF8, // ##### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x78, // #### - 0x48, // # # - 0x44, // # # - 0xE2, // ### # - 0x00, // - 0x00, // - 0x00, // - - // @612 'S' (7 pixels wide) - 0x00, // - 0x34, // ## # - 0x4C, // # ## - 0x40, // # - 0x38, // ### - 0x04, // # - 0x04, // # - 0x64, // ## # - 0x58, // # ## - 0x00, // - 0x00, // - 0x00, // - - // @624 'T' (7 pixels wide) - 0x00, // - 0xFE, // ####### - 0x92, // # # # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @636 'U' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @648 'V' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x44, // # # - 0x28, // # # - 0x28, // # # - 0x28, // # # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - - // @660 'W' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x44, // # # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0x28, // # # - 0x00, // - 0x00, // - 0x00, // - - // @672 'X' (7 pixels wide) - 0x00, // - 0xC6, // ## ## - 0x44, // # # - 0x28, // # # - 0x10, // # - 0x10, // # - 0x28, // # # - 0x44, // # # - 0xC6, // ## ## - 0x00, // - 0x00, // - 0x00, // - - // @684 'Y' (7 pixels wide) - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x28, // # # - 0x28, // # # - 0x10, // # - 0x10, // # - 0x10, // # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @696 'Z' (7 pixels wide) - 0x00, // - 0x7C, // ##### - 0x44, // # # - 0x08, // # - 0x10, // # - 0x10, // # - 0x20, // # - 0x44, // # # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @708 '[' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x38, // ### - 0x00, // - - // @720 '\' (7 pixels wide) - 0x00, // - 0x40, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x10, // # - 0x10, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x00, // - 0x00, // - - // @732 ']' (7 pixels wide) - 0x00, // - 0x38, // ### - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x38, // ### - 0x00, // - - // @744 '^' (7 pixels wide) - 0x00, // - 0x10, // # - 0x10, // # - 0x28, // # # - 0x44, // # # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @756 '_' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0xFE, // ####### - - // @768 '`' (7 pixels wide) - 0x00, // - 0x10, // # - 0x08, // # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @780 'a' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x38, // ### - 0x44, // # # - 0x3C, // #### - 0x44, // # # - 0x44, // # # - 0x3E, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @792 'b' (7 pixels wide) - 0x00, // - 0xC0, // ## - 0x40, // # - 0x58, // # ## - 0x64, // ## # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0xF8, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @804 'c' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x3C, // #### - 0x44, // # # - 0x40, // # - 0x40, // # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @816 'd' (7 pixels wide) - 0x00, // - 0x0C, // ## - 0x04, // # - 0x34, // ## # - 0x4C, // # ## - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x3E, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @828 'e' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x38, // ### - 0x44, // # # - 0x7C, // ##### - 0x40, // # - 0x40, // # - 0x3C, // #### - 0x00, // - 0x00, // - 0x00, // - - // @840 'f' (7 pixels wide) - 0x00, // - 0x1C, // ### - 0x20, // # - 0x7C, // ##### - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @852 'g' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x36, // ## ## - 0x4C, // # ## - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x3C, // #### - 0x04, // # - 0x38, // ### - 0x00, // - - // @864 'h' (7 pixels wide) - 0x00, // - 0xC0, // ## - 0x40, // # - 0x58, // # ## - 0x64, // ## # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0xEE, // ### ### - 0x00, // - 0x00, // - 0x00, // - - // @876 'i' (7 pixels wide) - 0x00, // - 0x10, // # - 0x00, // - 0x70, // ### - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @888 'j' (7 pixels wide) - 0x00, // - 0x10, // # - 0x00, // - 0x78, // #### - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x08, // # - 0x70, // ### - 0x00, // - - // @900 'k' (7 pixels wide) - 0x00, // - 0xC0, // ## - 0x40, // # - 0x5C, // # ### - 0x48, // # # - 0x70, // ### - 0x50, // # # - 0x48, // # # - 0xDC, // ## ### - 0x00, // - 0x00, // - 0x00, // - - // @912 'l' (7 pixels wide) - 0x00, // - 0x30, // ## - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @924 'm' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xE8, // ### # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0xFE, // ####### - 0x00, // - 0x00, // - 0x00, // - - // @936 'n' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xD8, // ## ## - 0x64, // ## # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0xEE, // ### ### - 0x00, // - 0x00, // - 0x00, // - - // @948 'o' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x38, // ### - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x38, // ### - 0x00, // - 0x00, // - 0x00, // - - // @960 'p' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xD8, // ## ## - 0x64, // ## # - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x78, // #### - 0x40, // # - 0xE0, // ### - 0x00, // - - // @972 'q' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x36, // ## ## - 0x4C, // # ## - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x3C, // #### - 0x04, // # - 0x0E, // ### - 0x00, // - - // @984 'r' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x6C, // ## ## - 0x30, // ## - 0x20, // # - 0x20, // # - 0x20, // # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @996 's' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x3C, // #### - 0x44, // # # - 0x38, // ### - 0x04, // # - 0x44, // # # - 0x78, // #### - 0x00, // - 0x00, // - 0x00, // - - // @1008 't' (7 pixels wide) - 0x00, // - 0x00, // - 0x20, // # - 0x7C, // ##### - 0x20, // # - 0x20, // # - 0x20, // # - 0x22, // # # - 0x1C, // ### - 0x00, // - 0x00, // - 0x00, // - - // @1020 'u' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xCC, // ## ## - 0x44, // # # - 0x44, // # # - 0x44, // # # - 0x4C, // # ## - 0x36, // ## ## - 0x00, // - 0x00, // - 0x00, // - - // @1032 'v' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x44, // # # - 0x28, // # # - 0x28, // # # - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - - // @1044 'w' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x54, // # # # - 0x54, // # # # - 0x54, // # # # - 0x28, // # # - 0x00, // - 0x00, // - 0x00, // - - // @1056 'x' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xCC, // ## ## - 0x48, // # # - 0x30, // ## - 0x30, // ## - 0x48, // # # - 0xCC, // ## ## - 0x00, // - 0x00, // - 0x00, // - - // @1068 'y' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0xEE, // ### ### - 0x44, // # # - 0x24, // # # - 0x28, // # # - 0x18, // ## - 0x10, // # - 0x10, // # - 0x78, // #### - 0x00, // - - // @1080 'z' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x7C, // ##### - 0x48, // # # - 0x10, // # - 0x20, // # - 0x44, // # # - 0x7C, // ##### - 0x00, // - 0x00, // - 0x00, // - - // @1092 '{' (7 pixels wide) - 0x00, // - 0x08, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x20, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x08, // # - 0x00, // - - // @1104 '|' (7 pixels wide) - 0x00, // - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - - // @1116 '}' (7 pixels wide) - 0x00, // - 0x20, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x08, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x20, // # - 0x00, // - - // @1128 '~' (7 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x24, // # # - 0x58, // # ## - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // -}; - -sFONT Font12 = { - Font12_Table, - 7, /* Width */ - 12, /* Height */ -}; - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font12CN.c b/display_app/2in15_e-Paper_B/lib/Fonts/font12CN.c deleted file mode 100755 index cf29da26..00000000 --- a/display_app/2in15_e-Paper_B/lib/Fonts/font12CN.c +++ /dev/null @@ -1,120 +0,0 @@ -/** - ****************************************************************************** - * @file Font12.c - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2014 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "fonts.h" - - -// -// Font data for Courier New 12pt -// - -const CH_CN Font12CN_Table[] = -{ -/*-- ÎÄ×Ö: Äã --*/ -/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ -{{"Äã"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0xC0,0x1D,0x80,0x3B,0xFF,0x3B,0x07, -0x3F,0x77,0x7E,0x76,0xF8,0x70,0xFB,0xFE,0xFB,0xFE,0x3F,0x77,0x3F,0x77,0x3E,0x73, -0x38,0x70,0x38,0x70,0x3B,0xE0,0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ºÃ --*/ -/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ -{{"ºÃ"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x73,0xFF,0x70,0x0F,0xFE,0x1E, -0x7E,0x3C,0x6E,0x38,0xEE,0x30,0xEF,0xFF,0xFC,0x30,0x7C,0x30,0x38,0x30,0x3E,0x30, -0x7E,0x30,0xE0,0x30,0xC1,0xF0,0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: Ê÷ --*/ -/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ -{{"Ê÷"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0E,0x30,0x0E,0x3F,0xEE,0x30,0xEE, -0xFC,0xFF,0x76,0xCE,0x77,0xFE,0x7B,0xFE,0xFF,0xFE,0xF3,0xDE,0xF3,0xCE,0x37,0xEE, -0x3E,0x6E,0x3C,0x0E,0x30,0x3E,0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: Ý® --*/ -/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ -{{"Ý®"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x70,0xFF,0xFF,0x3E,0x70,0x38,0x00, -0x7F,0xFF,0xE0,0x00,0xFF,0xFC,0x3B,0x8C,0x39,0xCC,0xFF,0xFF,0x73,0x9C,0x71,0xDC, -0x7F,0xFF,0x00,0x1C,0x01,0xF8,0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ÅÉ --*/ -/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ -{{"ÅÉ"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0xFF,0xF0,0x3E,0x00,0x0E,0x1F, -0xCF,0xFB,0xFF,0xF8,0x3F,0xFF,0x0F,0xFF,0x7F,0xD8,0x7F,0xDC,0x6F,0xCE,0xED,0xFF, -0xFD,0xF7,0xF9,0xC0,0x00,0x00,0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: a --*/ -/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ -{{"a"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x3E,0x00,0x67,0x00,0x07,0x80,0x0F,0x80,0x7F,0x80,0xE3,0x80,0xE7,0x80,0xE7,0x80, -0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: b --*/ -/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ -{{"b"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00, -0x7F,0x00,0x7B,0x80,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x7B,0x80, -0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: c --*/ -/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ -{{"c"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x3F,0x00,0x73,0x00,0xF0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xF0,0x00,0x73,0x00, -0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: A --*/ -/*-- ΢ÈíÑźÚ12; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=16x21 --*/ -{{"A"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x1F,0x00,0x1F,0x00, -0x1F,0x00,0x3B,0x80,0x3B,0x80,0x71,0x80,0x7F,0xC0,0x71,0xC0,0xE0,0xE0,0xE0,0xE0, -0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, -}; - -cFONT Font12CN = { - Font12CN_Table, - sizeof(Font12CN_Table)/sizeof(CH_CN), /*size of table*/ - 11, /* ASCII Width */ - 16, /* Width */ - 21, /* Height */ -}; - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font16.c b/display_app/2in15_e-Paper_B/lib/Fonts/font16.c deleted file mode 100755 index 58ce59b7..00000000 --- a/display_app/2in15_e-Paper_B/lib/Fonts/font16.c +++ /dev/null @@ -1,1764 +0,0 @@ -/** - ****************************************************************************** - * @file font16.c - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief This file provides text font16 for STM32xx-EVAL's LCD driver. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2014 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "fonts.h" - -// -// Font data for Courier New 12pt -// - -const uint8_t Font16_Table[] = -{ - // @0 ' ' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @32 '!' (11 pixels wide) - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @64 '"' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1D, 0xC0, // ### ### - 0x1D, 0xC0, // ### ### - 0x08, 0x80, // # # - 0x08, 0x80, // # # - 0x08, 0x80, // # # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @96 '#' (11 pixels wide) - 0x00, 0x00, // - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x3F, 0xC0, // ######## - 0x1B, 0x00, // ## ## - 0x3F, 0xC0, // ######## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @128 '$' (11 pixels wide) - 0x04, 0x00, // # - 0x1F, 0x80, // ###### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x38, 0x00, // ### - 0x1E, 0x00, // #### - 0x0F, 0x00, // #### - 0x03, 0x80, // ### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x04, 0x00, // # - 0x04, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @160 '%' (11 pixels wide) - 0x00, 0x00, // - 0x18, 0x00, // ## - 0x24, 0x00, // # # - 0x24, 0x00, // # # - 0x18, 0xC0, // ## ## - 0x07, 0x80, // #### - 0x1E, 0x00, // #### - 0x31, 0x80, // ## ## - 0x02, 0x40, // # # - 0x02, 0x40, // # # - 0x01, 0x80, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @192 '&' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x0F, 0x00, // #### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x0C, 0x00, // ## - 0x1D, 0x80, // ### ## - 0x37, 0x00, // ## ### - 0x33, 0x00, // ## ## - 0x1D, 0x80, // ### ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @224 ''' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x02, 0x00, // # - 0x02, 0x00, // # - 0x02, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @256 '(' (11 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0E, 0x00, // ### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0E, 0x00, // ### - 0x06, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @288 ')' (11 pixels wide) - 0x00, 0x00, // - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x1C, 0x00, // ### - 0x18, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @320 '*' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x3F, 0xC0, // ######## - 0x0F, 0x00, // #### - 0x1F, 0x80, // ###### - 0x19, 0x80, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @352 '+' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x04, 0x00, // # - 0x04, 0x00, // # - 0x04, 0x00, // # - 0x3F, 0x80, // ####### - 0x04, 0x00, // # - 0x04, 0x00, // # - 0x04, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @384 ',' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x04, 0x00, // # - 0x0C, 0x00, // ## - 0x08, 0x00, // # - 0x08, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - - // @416 '-' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @448 '.' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @480 '/' (11 pixels wide) - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @512 '0' (11 pixels wide) - 0x00, 0x00, // - 0x0E, 0x00, // ### - 0x1B, 0x00, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1B, 0x00, // ## ## - 0x0E, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @544 '1' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x3E, 0x00, // ##### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @576 '2' (11 pixels wide) - 0x00, 0x00, // - 0x0F, 0x00, // #### - 0x19, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x18, 0x00, // ## - 0x30, 0x00, // ## - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @608 '3' (11 pixels wide) - 0x00, 0x00, // - 0x3F, 0x00, // ###### - 0x61, 0x80, // ## ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x1F, 0x00, // ##### - 0x03, 0x80, // ### - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x61, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @640 '4' (11 pixels wide) - 0x00, 0x00, // - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x0F, 0x00, // #### - 0x0B, 0x00, // # ## - 0x1B, 0x00, // ## ## - 0x13, 0x00, // # ## - 0x33, 0x00, // ## ## - 0x3F, 0x80, // ####### - 0x03, 0x00, // ## - 0x0F, 0x80, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @672 '5' (11 pixels wide) - 0x00, 0x00, // - 0x1F, 0x80, // ###### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x1F, 0x00, // ##### - 0x11, 0x80, // # ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x21, 0x80, // # ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @704 '6' (11 pixels wide) - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x1C, 0x00, // ### - 0x18, 0x00, // ## - 0x30, 0x00, // ## - 0x37, 0x00, // ## ### - 0x39, 0x80, // ### ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x19, 0x80, // ## ## - 0x0F, 0x00, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @736 '7' (11 pixels wide) - 0x00, 0x00, // - 0x7F, 0x00, // ####### - 0x43, 0x00, // # ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @768 '8' (11 pixels wide) - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @800 '9' (11 pixels wide) - 0x00, 0x00, // - 0x1E, 0x00, // #### - 0x33, 0x00, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0x80, // ### ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x07, 0x00, // ### - 0x3C, 0x00, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @832 ':' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @864 ';' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x04, 0x00, // # - 0x08, 0x00, // # - 0x08, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @896 '<' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0xC0, // ## - 0x03, 0x00, // ## - 0x04, 0x00, // # - 0x18, 0x00, // ## - 0x60, 0x00, // ## - 0x18, 0x00, // ## - 0x04, 0x00, // # - 0x03, 0x00, // ## - 0x00, 0xC0, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @928 '=' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0xC0, // ######### - 0x00, 0x00, // - 0x7F, 0xC0, // ######### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @960 '>' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x60, 0x00, // ## - 0x18, 0x00, // ## - 0x04, 0x00, // # - 0x03, 0x00, // ## - 0x00, 0xC0, // ## - 0x03, 0x00, // ## - 0x04, 0x00, // # - 0x18, 0x00, // ## - 0x60, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @992 '?' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x01, 0x80, // ## - 0x07, 0x00, // ### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1024 '@' (11 pixels wide) - 0x00, 0x00, // - 0x0E, 0x00, // ### - 0x11, 0x00, // # # - 0x21, 0x00, // # # - 0x21, 0x00, // # # - 0x27, 0x00, // # ### - 0x29, 0x00, // # # # - 0x29, 0x00, // # # # - 0x27, 0x00, // # ### - 0x20, 0x00, // # - 0x11, 0x00, // # # - 0x0E, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1056 'A' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x00, // ###### - 0x0F, 0x00, // #### - 0x09, 0x00, // # # - 0x19, 0x80, // ## ## - 0x19, 0x80, // ## ## - 0x1F, 0x80, // ###### - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x79, 0xE0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1088 'B' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x00, // ####### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x7F, 0x00, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1120 'C' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x40, // ##### # - 0x30, 0xC0, // ## ## - 0x60, 0x40, // ## # - 0x60, 0x00, // ## - 0x60, 0x00, // ## - 0x60, 0x00, // ## - 0x60, 0x40, // ## # - 0x30, 0x80, // ## # - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1152 'D' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x00, // ####### - 0x31, 0x80, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x31, 0x80, // ## ## - 0x7F, 0x00, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1184 'E' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x80, // ######## - 0x30, 0x80, // ## # - 0x30, 0x80, // ## # - 0x32, 0x00, // ## # - 0x3E, 0x00, // ##### - 0x32, 0x00, // ## # - 0x30, 0x80, // ## # - 0x30, 0x80, // ## # - 0x7F, 0x80, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1216 'F' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0xC0, // ######### - 0x30, 0x40, // ## # - 0x30, 0x40, // ## # - 0x32, 0x00, // ## # - 0x3E, 0x00, // ##### - 0x32, 0x00, // ## # - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x7C, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1248 'G' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1E, 0x80, // #### # - 0x31, 0x80, // ## ## - 0x60, 0x80, // ## # - 0x60, 0x00, // ## - 0x60, 0x00, // ## - 0x67, 0xC0, // ## ##### - 0x61, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1280 'H' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3F, 0x80, // ####### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x7B, 0xC0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1312 'I' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xC0, // ######## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1344 'J' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0xC0, // ####### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x63, 0x00, // ## ## - 0x63, 0x00, // ## ## - 0x63, 0x00, // ## ## - 0x3E, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1376 'K' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x33, 0x00, // ## ## - 0x36, 0x00, // ## ## - 0x3C, 0x00, // #### - 0x3E, 0x00, // ##### - 0x33, 0x00, // ## ## - 0x31, 0x80, // ## ## - 0x79, 0xC0, // #### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1408 'L' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7E, 0x00, // ###### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x40, // ## # - 0x18, 0x40, // ## # - 0x18, 0x40, // ## # - 0x7F, 0xC0, // ######### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1440 'M' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0xE0, 0xE0, // ### ### - 0x60, 0xC0, // ## ## - 0x71, 0xC0, // ### ### - 0x7B, 0xC0, // #### #### - 0x6A, 0xC0, // ## # # ## - 0x6E, 0xC0, // ## ### ## - 0x64, 0xC0, // ## # ## - 0x60, 0xC0, // ## ## - 0xFB, 0xE0, // ##### ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1472 'N' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x73, 0xC0, // ### #### - 0x31, 0x80, // ## ## - 0x39, 0x80, // ### ## - 0x3D, 0x80, // #### ## - 0x35, 0x80, // ## # ## - 0x37, 0x80, // ## #### - 0x33, 0x80, // ## ### - 0x31, 0x80, // ## ## - 0x79, 0x80, // #### ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1504 'O' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1536 'P' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x00, // ####### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x7E, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1568 'Q' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x0C, 0xC0, // ## ## - 0x1F, 0x80, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1600 'R' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x00, // ####### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3E, 0x00, // ##### - 0x33, 0x00, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x7C, 0xE0, // ##### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1632 'S' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x80, // ###### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x38, 0x00, // ### - 0x1F, 0x00, // ##### - 0x03, 0x80, // ### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1664 'T' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x80, // ######## - 0x4C, 0x80, // # ## # - 0x4C, 0x80, // # ## # - 0x4C, 0x80, // # ## # - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1696 'U' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1728 'V' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x0A, 0x00, // # # - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1760 'W' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0xFB, 0xE0, // ##### ##### - 0x60, 0xC0, // ## ## - 0x64, 0xC0, // ## # ## - 0x6E, 0xC0, // ## ### ## - 0x6E, 0xC0, // ## ### ## - 0x2A, 0x80, // # # # # - 0x3B, 0x80, // ### ### - 0x3B, 0x80, // ### ### - 0x31, 0x80, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1792 'X' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x1B, 0x00, // ## ## - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x1B, 0x00, // ## ## - 0x31, 0x80, // ## ## - 0x7B, 0xC0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1824 'Y' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x79, 0xE0, // #### #### - 0x30, 0xC0, // ## ## - 0x19, 0x80, // ## ## - 0x0F, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x1F, 0x80, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1856 'Z' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x80, // ####### - 0x21, 0x80, // # ## - 0x23, 0x00, // # ## - 0x06, 0x00, // ## - 0x04, 0x00, // # - 0x0C, 0x00, // ## - 0x18, 0x80, // ## # - 0x30, 0x80, // ## # - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1888 '[' (11 pixels wide) - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1920 '\' (11 pixels wide) - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1952 ']' (11 pixels wide) - 0x00, 0x00, // - 0x1E, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x1E, 0x00, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1984 '^' (11 pixels wide) - 0x04, 0x00, // # - 0x0A, 0x00, // # # - 0x0A, 0x00, // # # - 0x11, 0x00, // # # - 0x20, 0x80, // # # - 0x20, 0x80, // # # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2016 '_' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 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, 0xE0, // ########### - - // @2048 '`' (11 pixels wide) - 0x08, 0x00, // # - 0x04, 0x00, // # - 0x02, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2080 'a' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x1F, 0x80, // ###### - 0x31, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0xC0, // ### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2112 'b' (11 pixels wide) - 0x00, 0x00, // - 0x70, 0x00, // ### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x37, 0x00, // ## ### - 0x39, 0x80, // ### ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x39, 0x80, // ### ## - 0x77, 0x00, // ### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2144 'c' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1E, 0x80, // #### # - 0x31, 0x80, // ## ## - 0x60, 0x80, // ## # - 0x60, 0x00, // ## - 0x60, 0x80, // ## # - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2176 'd' (11 pixels wide) - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x1D, 0x80, // ### ## - 0x33, 0x80, // ## ### - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0xC0, // ### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2208 'e' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x60, 0xC0, // ## ## - 0x7F, 0xC0, // ######### - 0x60, 0x00, // ## - 0x30, 0xC0, // ## ## - 0x1F, 0x80, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2240 'f' (11 pixels wide) - 0x00, 0x00, // - 0x07, 0xE0, // ###### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x3F, 0x80, // ####### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2272 'g' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1D, 0xC0, // ### ### - 0x33, 0x80, // ## ### - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0x80, // ### ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2304 'h' (11 pixels wide) - 0x00, 0x00, // - 0x70, 0x00, // ### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x37, 0x00, // ## ### - 0x39, 0x80, // ### ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x7B, 0xC0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2336 'i' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x00, 0x00, // - 0x1E, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2368 'j' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x00, 0x00, // - 0x3F, 0x00, // ###### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x3E, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2400 'k' (11 pixels wide) - 0x00, 0x00, // - 0x70, 0x00, // ### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x37, 0x80, // ## #### - 0x36, 0x00, // ## ## - 0x3C, 0x00, // #### - 0x3C, 0x00, // #### - 0x36, 0x00, // ## ## - 0x33, 0x00, // ## ## - 0x77, 0xC0, // ### ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2432 'l' (11 pixels wide) - 0x00, 0x00, // - 0x1E, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2464 'm' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x80, // ######## - 0x36, 0xC0, // ## ## ## - 0x36, 0xC0, // ## ## ## - 0x36, 0xC0, // ## ## ## - 0x36, 0xC0, // ## ## ## - 0x36, 0xC0, // ## ## ## - 0x76, 0xE0, // ### ## ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2496 'n' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x77, 0x00, // ### ### - 0x39, 0x80, // ### ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x7B, 0xC0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2528 'o' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x31, 0x80, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x60, 0xC0, // ## ## - 0x31, 0x80, // ## ## - 0x1F, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2560 'p' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x77, 0x00, // ### ### - 0x39, 0x80, // ### ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x39, 0x80, // ### ## - 0x37, 0x00, // ## ### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x7C, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2592 'q' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1D, 0xC0, // ### ### - 0x33, 0x80, // ## ### - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x61, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0x80, // ### ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x07, 0xC0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2624 'r' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0x80, // #### ### - 0x1C, 0xC0, // ### ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x7F, 0x00, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2656 's' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x80, // ###### - 0x31, 0x80, // ## ## - 0x3C, 0x00, // #### - 0x1F, 0x00, // ##### - 0x03, 0x80, // ### - 0x31, 0x80, // ## ## - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2688 't' (11 pixels wide) - 0x00, 0x00, // - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x7F, 0x00, // ####### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x80, // ## # - 0x0F, 0x00, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2720 'u' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x73, 0x80, // ### ### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x33, 0x80, // ## ### - 0x1D, 0xC0, // ### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2752 'v' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x31, 0x80, // ## ## - 0x31, 0x80, // ## ## - 0x1B, 0x00, // ## ## - 0x1B, 0x00, // ## ## - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2784 'w' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0xF1, 0xE0, // #### #### - 0x60, 0xC0, // ## ## - 0x64, 0xC0, // ## # ## - 0x6E, 0xC0, // ## ### ## - 0x3B, 0x80, // ### ### - 0x3B, 0x80, // ### ### - 0x31, 0x80, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2816 'x' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7B, 0xC0, // #### #### - 0x1B, 0x00, // ## ## - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x0E, 0x00, // ### - 0x1B, 0x00, // ## ## - 0x7B, 0xC0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2848 'y' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x79, 0xE0, // #### #### - 0x30, 0xC0, // ## ## - 0x19, 0x80, // ## ## - 0x19, 0x80, // ## ## - 0x0B, 0x00, // # ## - 0x0F, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x3E, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2880 'z' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x80, // ####### - 0x21, 0x80, // # ## - 0x03, 0x00, // ## - 0x0E, 0x00, // ### - 0x18, 0x00, // ## - 0x30, 0x80, // ## # - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2912 '{' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x18, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2944 '|' (11 pixels wide) - 0x00, 0x00, // - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2976 '}' (11 pixels wide) - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3008 '~' (11 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x18, 0x00, // ## - 0x24, 0x80, // # # # - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // -}; - -sFONT Font16 = { - Font16_Table, - 11, /* Width */ - 16, /* Height */ -}; - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font20.c b/display_app/2in15_e-Paper_B/lib/Fonts/font20.c deleted file mode 100755 index 697e3edd..00000000 --- a/display_app/2in15_e-Paper_B/lib/Fonts/font20.c +++ /dev/null @@ -1,2142 +0,0 @@ -/** - ****************************************************************************** - * @file font20.c - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief This file provides text font20 for STM32xx-EVAL's LCD driver. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2014 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "fonts.h" - -// Character bitmaps for Courier New 15pt -const uint8_t Font20_Table[] = -{ - // @0 ' ' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @40 '!' (14 pixels wide) - 0x00, 0x00, // - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x02, 0x00, // # - 0x02, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @80 '"' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1C, 0xE0, // ### ### - 0x1C, 0xE0, // ### ### - 0x1C, 0xE0, // ### ### - 0x08, 0x40, // # # - 0x08, 0x40, // # # - 0x08, 0x40, // # # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @120 '#' (14 pixels wide) - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @160 '$' (14 pixels wide) - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x07, 0xE0, // ###### - 0x0F, 0xE0, // ####### - 0x18, 0x60, // ## ## - 0x18, 0x00, // ## - 0x1F, 0x00, // ##### - 0x0F, 0xC0, // ###### - 0x00, 0xE0, // ### - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x1F, 0xC0, // ####### - 0x1F, 0x80, // ###### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @200 '%' (14 pixels wide) - 0x00, 0x00, // - 0x1C, 0x00, // ### - 0x22, 0x00, // # # - 0x22, 0x00, // # # - 0x22, 0x00, // # # - 0x1C, 0x60, // ### ## - 0x01, 0xE0, // #### - 0x0F, 0x80, // ##### - 0x3C, 0x00, // #### - 0x31, 0xC0, // ## ### - 0x02, 0x20, // # # - 0x02, 0x20, // # # - 0x02, 0x20, // # # - 0x01, 0xC0, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @240 '&' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0xE0, // ##### - 0x0F, 0xE0, // ####### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x0F, 0x30, // #### ## - 0x1F, 0xF0, // ######### - 0x19, 0xE0, // ## #### - 0x18, 0xC0, // ## ## - 0x1F, 0xF0, // ######### - 0x07, 0xB0, // #### ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @280 ''' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x01, 0x00, // # - 0x01, 0x00, // # - 0x01, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @320 '(' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @360 ')' (14 pixels wide) - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @400 '*' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x1B, 0x60, // ## ## ## - 0x1F, 0xE0, // ######## - 0x07, 0x80, // #### - 0x07, 0x80, // #### - 0x0F, 0xC0, // ###### - 0x0C, 0xC0, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @440 '+' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @480 ',' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x04, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @520 '-' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xE0, // ######### - 0x3F, 0xE0, // ######### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @560 '.' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @600 '/' (14 pixels wide) - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @640 '0' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x80, // ##### - 0x1F, 0xC0, // ####### - 0x18, 0xC0, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x1F, 0xC0, // ####### - 0x0F, 0x80, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @680 '1' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x1F, 0x00, // ##### - 0x1F, 0x00, // ##### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @720 '2' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x80, // ##### - 0x1F, 0xC0, // ####### - 0x38, 0xE0, // ### ### - 0x30, 0x60, // ## ## - 0x00, 0x60, // ## - 0x00, 0xC0, // ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x18, 0x00, // ## - 0x3F, 0xE0, // ######### - 0x3F, 0xE0, // ######### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @760 '3' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x80, // ##### - 0x3F, 0xC0, // ######## - 0x30, 0xE0, // ## ### - 0x00, 0x60, // ## - 0x00, 0xE0, // ### - 0x07, 0xC0, // ##### - 0x07, 0xC0, // ##### - 0x00, 0xE0, // ### - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x60, 0xE0, // ## ### - 0x7F, 0xC0, // ######### - 0x3F, 0x80, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @800 '4' (14 pixels wide) - 0x00, 0x00, // - 0x01, 0xC0, // ### - 0x03, 0xC0, // #### - 0x03, 0xC0, // #### - 0x06, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x30, 0xC0, // ## ## - 0x3F, 0xE0, // ######### - 0x3F, 0xE0, // ######### - 0x00, 0xC0, // ## - 0x03, 0xE0, // ##### - 0x03, 0xE0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @840 '5' (14 pixels wide) - 0x00, 0x00, // - 0x1F, 0xC0, // ####### - 0x1F, 0xC0, // ####### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x1F, 0x80, // ###### - 0x1F, 0xC0, // ####### - 0x18, 0xE0, // ## ### - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x30, 0xE0, // ## ### - 0x3F, 0xC0, // ######## - 0x1F, 0x80, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @880 '6' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0xE0, // ##### - 0x0F, 0xE0, // ####### - 0x1E, 0x00, // #### - 0x18, 0x00, // ## - 0x38, 0x00, // ### - 0x37, 0x80, // ## #### - 0x3F, 0xC0, // ######## - 0x38, 0xE0, // ### ### - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x18, 0xE0, // ## ### - 0x1F, 0xC0, // ####### - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @920 '7' (14 pixels wide) - 0x00, 0x00, // - 0x3F, 0xE0, // ######### - 0x3F, 0xE0, // ######### - 0x30, 0x60, // ## ## - 0x00, 0x60, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @960 '8' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x80, // ##### - 0x1F, 0xC0, // ####### - 0x38, 0xE0, // ### ### - 0x30, 0x60, // ## ## - 0x38, 0xE0, // ### ### - 0x1F, 0xC0, // ####### - 0x1F, 0xC0, // ####### - 0x38, 0xE0, // ### ### - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x38, 0xE0, // ### ### - 0x1F, 0xC0, // ####### - 0x0F, 0x80, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1000 '9' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x00, // #### - 0x1F, 0xC0, // ####### - 0x38, 0xC0, // ### ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x38, 0xE0, // ### ### - 0x1F, 0xE0, // ######## - 0x0F, 0x60, // #### ## - 0x00, 0xE0, // ### - 0x00, 0xC0, // ## - 0x03, 0xC0, // #### - 0x3F, 0x80, // ####### - 0x3E, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1040 ':' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x03, 0x80, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1080 ';' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x01, 0xC0, // ### - 0x01, 0xC0, // ### - 0x01, 0xC0, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x04, 0x00, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1120 '<' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x30, // ## - 0x00, 0xF0, // #### - 0x03, 0xC0, // #### - 0x07, 0x00, // ### - 0x1C, 0x00, // ### - 0x78, 0x00, // #### - 0x1C, 0x00, // ### - 0x07, 0x00, // ### - 0x03, 0xC0, // #### - 0x00, 0xF0, // #### - 0x00, 0x30, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1160 '=' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0xF0, // ########### - 0x7F, 0xF0, // ########### - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0xF0, // ########### - 0x7F, 0xF0, // ########### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1200 '>' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x30, 0x00, // ## - 0x3C, 0x00, // #### - 0x0F, 0x00, // #### - 0x03, 0x80, // ### - 0x00, 0xE0, // ### - 0x00, 0x78, // #### - 0x00, 0xE0, // ### - 0x03, 0x80, // ### - 0x0F, 0x00, // #### - 0x3C, 0x00, // #### - 0x30, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1240 '?' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x0F, 0x80, // ##### - 0x1F, 0xC0, // ####### - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x00, 0x60, // ## - 0x01, 0xC0, // ### - 0x03, 0x80, // ### - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1280 '@' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x80, // ### - 0x0C, 0x80, // ## # - 0x08, 0x40, // # # - 0x10, 0x40, // # # - 0x10, 0x40, // # # - 0x11, 0xC0, // # ### - 0x12, 0x40, // # # # - 0x12, 0x40, // # # # - 0x12, 0x40, // # # # - 0x11, 0xC0, // # ### - 0x10, 0x00, // # - 0x08, 0x00, // # - 0x08, 0x40, // # # - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1320 'A' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x80, // ###### - 0x1F, 0x80, // ###### - 0x03, 0x80, // ### - 0x06, 0xC0, // ## ## - 0x06, 0xC0, // ## ## - 0x0C, 0xC0, // ## ## - 0x0C, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x30, 0x30, // ## ## - 0x78, 0x78, // #### #### - 0x78, 0x78, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1360 'B' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x80, // ####### - 0x3F, 0xC0, // ######## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0xE0, // ## ### - 0x1F, 0xC0, // ####### - 0x1F, 0xE0, // ######## - 0x18, 0x70, // ## ### - 0x18, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xE0, // ######### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1400 'C' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xB0, // #### ## - 0x0F, 0xF0, // ######## - 0x1C, 0x70, // ### ### - 0x38, 0x30, // ### ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x38, 0x30, // ### ## - 0x1C, 0x70, // ### ### - 0x0F, 0xE0, // ####### - 0x07, 0xC0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1440 'D' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7F, 0x80, // ######## - 0x7F, 0xC0, // ######### - 0x30, 0xE0, // ## ### - 0x30, 0x70, // ## ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x70, // ## ### - 0x30, 0xE0, // ## ### - 0x7F, 0xC0, // ######### - 0x7F, 0x80, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1480 'E' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x18, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x19, 0x80, // ## ## - 0x1F, 0x80, // ###### - 0x1F, 0x80, // ###### - 0x19, 0x80, // ## ## - 0x18, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1520 'F' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x18, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x19, 0x80, // ## ## - 0x1F, 0x80, // ###### - 0x1F, 0x80, // ###### - 0x19, 0x80, // ## ## - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x3F, 0x00, // ###### - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1560 'G' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xB0, // #### ## - 0x1F, 0xF0, // ######### - 0x18, 0x70, // ## ### - 0x30, 0x30, // ## ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x31, 0xF8, // ## ###### - 0x31, 0xF8, // ## ###### - 0x30, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x1F, 0xF0, // ######### - 0x07, 0xC0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1600 'H' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1640 'I' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1680 'J' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x03, 0xF8, // ####### - 0x03, 0xF8, // ####### - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x30, 0xE0, // ## ### - 0x3F, 0xC0, // ######## - 0x0F, 0x80, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1720 'K' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3E, 0xF8, // ##### ##### - 0x3E, 0xF8, // ##### ##### - 0x18, 0xE0, // ## ### - 0x19, 0x80, // ## ## - 0x1B, 0x00, // ## ## - 0x1F, 0x00, // ##### - 0x1D, 0x80, // ### ## - 0x18, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x18, 0x60, // ## ## - 0x3E, 0x78, // ##### #### - 0x3E, 0x38, // ##### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1760 'L' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0x00, // ###### - 0x3F, 0x00, // ###### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x30, // ## ## - 0x0C, 0x30, // ## ## - 0x0C, 0x30, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1800 'M' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0x78, // #### #### - 0x78, 0x78, // #### #### - 0x38, 0x70, // ### ### - 0x3C, 0xF0, // #### #### - 0x34, 0xB0, // ## # # ## - 0x37, 0xB0, // ## #### ## - 0x37, 0xB0, // ## #### ## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x30, 0x30, // ## ## - 0x7C, 0xF8, // ##### ##### - 0x7C, 0xF8, // ##### ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1840 'N' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x39, 0xF0, // ### ##### - 0x3D, 0xF0, // #### ##### - 0x1C, 0x60, // ### ## - 0x1E, 0x60, // #### ## - 0x1E, 0x60, // #### ## - 0x1B, 0x60, // ## ## ## - 0x1B, 0x60, // ## ## ## - 0x19, 0xE0, // ## #### - 0x19, 0xE0, // ## #### - 0x18, 0xE0, // ## ### - 0x3E, 0xE0, // ##### ### - 0x3E, 0x60, // ##### ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1880 'O' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x0F, 0xC0, // ###### - 0x1C, 0xE0, // ### ### - 0x38, 0x70, // ### ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x38, 0x70, // ### ### - 0x1C, 0xE0, // ### ### - 0x0F, 0xC0, // ###### - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1920 'P' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xC0, // ######## - 0x3F, 0xE0, // ######### - 0x18, 0x70, // ## ### - 0x18, 0x30, // ## ## - 0x18, 0x30, // ## ## - 0x18, 0x70, // ## ### - 0x1F, 0xE0, // ######## - 0x1F, 0xC0, // ####### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x3F, 0x00, // ###### - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @1960 'Q' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x0F, 0xC0, // ###### - 0x1C, 0xE0, // ### ### - 0x38, 0x70, // ### ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x38, 0x70, // ### ### - 0x1C, 0xE0, // ### ### - 0x0F, 0xC0, // ###### - 0x07, 0x80, // #### - 0x07, 0xB0, // #### ## - 0x0F, 0xF0, // ######## - 0x0C, 0xE0, // ## ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2000 'R' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xC0, // ######## - 0x3F, 0xE0, // ######### - 0x18, 0x70, // ## ### - 0x18, 0x30, // ## ## - 0x18, 0x70, // ## ### - 0x1F, 0xE0, // ######## - 0x1F, 0xC0, // ####### - 0x18, 0xE0, // ## ### - 0x18, 0x60, // ## ## - 0x18, 0x70, // ## ### - 0x3E, 0x38, // ##### ### - 0x3E, 0x18, // ##### ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2040 'S' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x0F, 0xB0, // ##### ## - 0x1F, 0xF0, // ######### - 0x38, 0x70, // ### ### - 0x30, 0x30, // ## ## - 0x38, 0x00, // ### - 0x1F, 0x80, // ###### - 0x07, 0xE0, // ###### - 0x00, 0x70, // ### - 0x30, 0x30, // ## ## - 0x38, 0x70, // ### ### - 0x3F, 0xE0, // ######### - 0x37, 0xC0, // ## ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2080 'T' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x0F, 0xC0, // ###### - 0x0F, 0xC0, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2120 'U' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x1C, 0xE0, // ### ### - 0x0F, 0xC0, // ###### - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2160 'V' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x30, 0x60, // ## ## - 0x30, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2200 'W' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x7C, 0x7C, // ##### ##### - 0x7C, 0x7C, // ##### ##### - 0x30, 0x18, // ## ## - 0x33, 0x98, // ## ### ## - 0x33, 0x98, // ## ### ## - 0x33, 0x98, // ## ### ## - 0x36, 0xD8, // ## ## ## ## - 0x16, 0xD0, // # ## ## # - 0x1C, 0x70, // ### ### - 0x1C, 0x70, // ### ### - 0x1C, 0x70, // ### ### - 0x18, 0x30, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2240 'X' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x30, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x0D, 0x80, // ## ## - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x0D, 0x80, // ## ## - 0x18, 0xC0, // ## ## - 0x30, 0x60, // ## ## - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2280 'Y' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x18, 0x60, // ## ## - 0x0C, 0xC0, // ## ## - 0x07, 0x80, // #### - 0x07, 0x80, // #### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x0F, 0xC0, // ###### - 0x0F, 0xC0, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2320 'Z' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x18, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2360 '[' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0xC0, // #### - 0x03, 0xC0, // #### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0xC0, // #### - 0x03, 0xC0, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2400 '\' (14 pixels wide) - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x01, 0x80, // ## - 0x01, 0x80, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0x60, // ## - 0x00, 0x60, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2440 ']' (14 pixels wide) - 0x00, 0x00, // - 0x0F, 0x00, // #### - 0x0F, 0x00, // #### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x0F, 0x00, // #### - 0x0F, 0x00, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2480 '^' (14 pixels wide) - 0x00, 0x00, // - 0x02, 0x00, // # - 0x07, 0x00, // ### - 0x0D, 0x80, // ## ## - 0x18, 0xC0, // ## ## - 0x30, 0x60, // ## ## - 0x20, 0x20, // # # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2520 '_' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 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, 0xFC, // ############## - 0xFF, 0xFC, // ############## - - // @2560 '`' (14 pixels wide) - 0x00, 0x00, // - 0x04, 0x00, // # - 0x03, 0x00, // ## - 0x00, 0x80, // # - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2600 'a' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x0F, 0xC0, // ###### - 0x1F, 0xE0, // ######## - 0x00, 0x60, // ## - 0x0F, 0xE0, // ####### - 0x1F, 0xE0, // ######## - 0x38, 0x60, // ### ## - 0x30, 0xE0, // ## ### - 0x3F, 0xF0, // ########## - 0x1F, 0x70, // ##### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2640 'b' (14 pixels wide) - 0x00, 0x00, // - 0x70, 0x00, // ### - 0x70, 0x00, // ### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x37, 0x80, // ## #### - 0x3F, 0xE0, // ######### - 0x38, 0x60, // ### ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x38, 0x60, // ### ## - 0x7F, 0xE0, // ########## - 0x77, 0x80, // ### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2680 'c' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xB0, // #### ## - 0x1F, 0xF0, // ######### - 0x18, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x38, 0x30, // ### ## - 0x1F, 0xF0, // ######### - 0x0F, 0xC0, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2720 'd' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x70, // ### - 0x00, 0x70, // ### - 0x00, 0x30, // ## - 0x00, 0x30, // ## - 0x07, 0xB0, // #### ## - 0x1F, 0xF0, // ######### - 0x18, 0x70, // ## ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x38, 0x70, // ### ### - 0x1F, 0xF8, // ########## - 0x07, 0xB8, // #### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2760 'e' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x1F, 0xE0, // ######## - 0x18, 0x60, // ## ## - 0x3F, 0xF0, // ########## - 0x3F, 0xF0, // ########## - 0x30, 0x00, // ## - 0x18, 0x30, // ## ## - 0x1F, 0xF0, // ######### - 0x07, 0xC0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2800 'f' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0xF0, // ###### - 0x07, 0xF0, // ####### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2840 'g' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xB8, // #### ### - 0x1F, 0xF8, // ########## - 0x18, 0x70, // ## ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x18, 0x70, // ## ### - 0x1F, 0xF0, // ######### - 0x07, 0xB0, // #### ## - 0x00, 0x30, // ## - 0x00, 0x70, // ### - 0x0F, 0xE0, // ####### - 0x0F, 0xC0, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - - // @2880 'h' (14 pixels wide) - 0x00, 0x00, // - 0x38, 0x00, // ### - 0x38, 0x00, // ### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x1B, 0xC0, // ## #### - 0x1F, 0xE0, // ######## - 0x1C, 0x60, // ### ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2920 'i' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x1F, 0x00, // ##### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @2960 'j' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0xC0, // ####### - 0x1F, 0xC0, // ####### - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x00, 0xC0, // ## - 0x01, 0xC0, // ### - 0x3F, 0x80, // ####### - 0x3F, 0x00, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - - // @3000 'k' (14 pixels wide) - 0x00, 0x00, // - 0x38, 0x00, // ### - 0x38, 0x00, // ### - 0x18, 0x00, // ## - 0x18, 0x00, // ## - 0x1B, 0xE0, // ## ##### - 0x1B, 0xE0, // ## ##### - 0x1B, 0x00, // ## ## - 0x1E, 0x00, // #### - 0x1E, 0x00, // #### - 0x1B, 0x00, // ## ## - 0x19, 0x80, // ## ## - 0x39, 0xF0, // ### ##### - 0x39, 0xF0, // ### ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3040 'l' (14 pixels wide) - 0x00, 0x00, // - 0x1F, 0x00, // ##### - 0x1F, 0x00, // ##### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3080 'm' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x7E, 0xE0, // ###### ### - 0x7F, 0xF0, // ########### - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x33, 0x30, // ## ## ## - 0x7B, 0xB8, // #### ### ### - 0x7B, 0xB8, // #### ### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3120 'n' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3B, 0xC0, // ### #### - 0x3F, 0xE0, // ######### - 0x1C, 0x60, // ### ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3160 'o' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0x80, // #### - 0x1F, 0xE0, // ######## - 0x18, 0x60, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x18, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x07, 0x80, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3200 'p' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x77, 0x80, // ### #### - 0x7F, 0xE0, // ########## - 0x38, 0x60, // ### ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x38, 0x60, // ### ## - 0x3F, 0xE0, // ######### - 0x37, 0x80, // ## #### - 0x30, 0x00, // ## - 0x30, 0x00, // ## - 0x7C, 0x00, // ##### - 0x7C, 0x00, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @3240 'q' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xB8, // #### ### - 0x1F, 0xF8, // ########## - 0x18, 0x70, // ## ### - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x30, 0x30, // ## ## - 0x18, 0x70, // ## ### - 0x1F, 0xF0, // ######### - 0x07, 0xB0, // #### ## - 0x00, 0x30, // ## - 0x00, 0x30, // ## - 0x00, 0xF8, // ##### - 0x00, 0xF8, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - - // @3280 'r' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3C, 0xE0, // #### ### - 0x3D, 0xF0, // #### ##### - 0x0F, 0x30, // #### ## - 0x0E, 0x00, // ### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x3F, 0xC0, // ######## - 0x3F, 0xC0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3320 's' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x07, 0xE0, // ###### - 0x1F, 0xE0, // ######## - 0x18, 0x60, // ## ## - 0x1E, 0x00, // #### - 0x0F, 0xC0, // ###### - 0x01, 0xE0, // #### - 0x18, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x1F, 0x80, // ###### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3360 't' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x3F, 0xE0, // ######### - 0x3F, 0xE0, // ######### - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x00, // ## - 0x0C, 0x30, // ## ## - 0x0F, 0xF0, // ######## - 0x07, 0xC0, // ##### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3400 'u' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x38, 0xE0, // ### ### - 0x38, 0xE0, // ### ### - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0x60, // ## ## - 0x18, 0xE0, // ## ### - 0x1F, 0xF0, // ######### - 0x0F, 0x70, // #### ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3440 'v' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x30, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x0D, 0x80, // ## ## - 0x0D, 0x80, // ## ## - 0x07, 0x00, // ### - 0x07, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3480 'w' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x32, 0x60, // ## # ## - 0x32, 0x60, // ## # ## - 0x37, 0xE0, // ## ###### - 0x1D, 0xC0, // ### ### - 0x1D, 0xC0, // ### ### - 0x18, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3520 'x' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x0C, 0xC0, // ## ## - 0x07, 0x80, // #### - 0x03, 0x00, // ## - 0x07, 0x80, // #### - 0x0C, 0xC0, // ## ## - 0x3C, 0xF0, // #### #### - 0x3C, 0xF0, // #### #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3560 'y' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x78, 0xF0, // #### #### - 0x78, 0xF0, // #### #### - 0x30, 0x60, // ## ## - 0x18, 0xC0, // ## ## - 0x18, 0xC0, // ## ## - 0x0D, 0x80, // ## ## - 0x0F, 0x80, // ##### - 0x07, 0x00, // ### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x00, // ## - 0x7F, 0x00, // ####### - 0x7F, 0x00, // ####### - 0x00, 0x00, // - 0x00, 0x00, // - - // @3600 'z' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x18, 0xC0, // ## ## - 0x01, 0x80, // ## - 0x03, 0x00, // ## - 0x06, 0x00, // ## - 0x0C, 0x60, // ## ## - 0x1F, 0xE0, // ######## - 0x1F, 0xE0, // ######## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3640 '{' (14 pixels wide) - 0x00, 0x00, // - 0x01, 0xC0, // ### - 0x03, 0xC0, // #### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x07, 0x00, // ### - 0x0E, 0x00, // ### - 0x07, 0x00, // ### - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0xC0, // #### - 0x01, 0xC0, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3680 '|' (14 pixels wide) - 0x00, 0x00, // - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x03, 0x00, // ## - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3720 '}' (14 pixels wide) - 0x00, 0x00, // - 0x1C, 0x00, // ### - 0x1E, 0x00, // #### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x07, 0x00, // ### - 0x03, 0x80, // ### - 0x07, 0x00, // ### - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x06, 0x00, // ## - 0x1E, 0x00, // #### - 0x1C, 0x00, // ### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - - // @3760 '~' (14 pixels wide) - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x0E, 0x00, // ### - 0x3F, 0x30, // ###### ## - 0x33, 0xF0, // ## ###### - 0x01, 0xE0, // #### - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // - 0x00, 0x00, // -}; - - -sFONT Font20 = { - Font20_Table, - 14, /* Width */ - 20, /* Height */ -}; - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font24.c b/display_app/2in15_e-Paper_B/lib/Fonts/font24.c deleted file mode 100755 index fea33212..00000000 --- a/display_app/2in15_e-Paper_B/lib/Fonts/font24.c +++ /dev/null @@ -1,2520 +0,0 @@ -/** - ****************************************************************************** - * @file font24.c - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief This file provides text font24 for STM32xx-EVAL's LCD driver. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2014 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "fonts.h" - -const uint8_t Font24_Table [] = -{ - // @0 ' ' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @72 '!' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x01, 0x00, 0x00, // # - 0x01, 0x00, 0x00, // # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @144 '"' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x0E, 0x70, 0x00, // ### ### - 0x0E, 0x70, 0x00, // ### ### - 0x0E, 0x70, 0x00, // ### ### - 0x04, 0x20, 0x00, // # # - 0x04, 0x20, 0x00, // # # - 0x04, 0x20, 0x00, // # # - 0x04, 0x20, 0x00, // # # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @216 '#' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x06, 0x60, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @288 '$' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x07, 0xB0, 0x00, // #### ## - 0x0F, 0xF0, 0x00, // ######## - 0x18, 0x70, 0x00, // ## ### - 0x18, 0x70, 0x00, // ## ### - 0x1C, 0x00, 0x00, // ### - 0x0F, 0x80, 0x00, // ##### - 0x07, 0xE0, 0x00, // ###### - 0x00, 0xF0, 0x00, // #### - 0x18, 0x30, 0x00, // ## ## - 0x1C, 0x30, 0x00, // ### ## - 0x1C, 0x70, 0x00, // ### ### - 0x1F, 0xE0, 0x00, // ######## - 0x1B, 0xC0, 0x00, // ## #### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @360 '%' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0x80, 0x00, // #### - 0x0F, 0xC0, 0x00, // ###### - 0x1C, 0xE0, 0x00, // ### ### - 0x18, 0x60, 0x00, // ## ## - 0x18, 0x60, 0x00, // ## ## - 0x1C, 0xE0, 0x00, // ### ### - 0x0F, 0xF8, 0x00, // ######### - 0x07, 0xE0, 0x00, // ###### - 0x1F, 0xF0, 0x00, // ######### - 0x07, 0x38, 0x00, // ### ### - 0x06, 0x18, 0x00, // ## ## - 0x06, 0x18, 0x00, // ## ## - 0x07, 0x38, 0x00, // ### ### - 0x03, 0xF0, 0x00, // ###### - 0x01, 0xE0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @432 '&' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xF0, 0x00, // ###### - 0x07, 0xF0, 0x00, // ####### - 0x0C, 0x60, 0x00, // ## ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x07, 0x00, 0x00, // ### - 0x0F, 0x9C, 0x00, // ##### ### - 0x1D, 0xFC, 0x00, // ### ####### - 0x18, 0xF0, 0x00, // ## #### - 0x18, 0x70, 0x00, // ## ### - 0x0F, 0xFC, 0x00, // ########## - 0x07, 0xDC, 0x00, // ##### ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @504 ''' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x01, 0x00, 0x00, // # - 0x01, 0x00, 0x00, // # - 0x01, 0x00, 0x00, // # - 0x01, 0x00, 0x00, // # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @576 '(' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x18, 0x00, // ## - 0x00, 0x38, 0x00, // ### - 0x00, 0x70, 0x00, // ### - 0x00, 0xF0, 0x00, // #### - 0x00, 0xE0, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x00, 0x70, 0x00, // ### - 0x00, 0x70, 0x00, // ### - 0x00, 0x38, 0x00, // ### - 0x00, 0x18, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @648 ')' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x18, 0x00, 0x00, // ## - 0x1C, 0x00, 0x00, // ### - 0x0E, 0x00, 0x00, // ### - 0x0E, 0x00, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x0F, 0x00, 0x00, // #### - 0x0E, 0x00, 0x00, // ### - 0x1C, 0x00, 0x00, // ### - 0x18, 0x00, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @720 '*' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x1D, 0xB8, 0x00, // ### ## ### - 0x1F, 0xF8, 0x00, // ########## - 0x07, 0xE0, 0x00, // ###### - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @792 '+' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @864 ',' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xE0, 0x00, // ### - 0x00, 0xC0, 0x00, // ## - 0x01, 0xC0, 0x00, // ### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @936 '-' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1008 '.' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1080 '/' (17 pixels wide) - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x38, 0x00, // ### - 0x00, 0x30, 0x00, // ## - 0x00, 0x70, 0x00, // ### - 0x00, 0x60, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x0E, 0x00, 0x00, // ### - 0x0C, 0x00, 0x00, // ## - 0x1C, 0x00, 0x00, // ### - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1152 '0' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x07, 0xE0, 0x00, // ###### - 0x0C, 0x30, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x07, 0xE0, 0x00, // ###### - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1224 '1' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x80, 0x00, // # - 0x07, 0x80, 0x00, // #### - 0x1F, 0x80, 0x00, // ###### - 0x1D, 0x80, 0x00, // ### ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1296 '2' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xC0, 0x00, // ##### - 0x1F, 0xF0, 0x00, // ######### - 0x38, 0x30, 0x00, // ### ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x01, 0xC0, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x06, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1368 '3' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x0F, 0xE0, 0x00, // ####### - 0x0C, 0x70, 0x00, // ## ### - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x03, 0xC0, 0x00, // #### - 0x03, 0xE0, 0x00, // ##### - 0x00, 0x70, 0x00, // ### - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF0, 0x00, // ######### - 0x0F, 0xC0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1440 '4' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xE0, 0x00, // ### - 0x01, 0xE0, 0x00, // #### - 0x01, 0xE0, 0x00, // #### - 0x03, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x0C, 0x60, 0x00, // ## ## - 0x0C, 0x60, 0x00, // ## ## - 0x18, 0x60, 0x00, // ## ## - 0x30, 0x60, 0x00, // ## ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x00, 0x60, 0x00, // ## - 0x03, 0xF8, 0x00, // ####### - 0x03, 0xF8, 0x00, // ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1512 '5' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF0, 0x00, // ######### - 0x1F, 0xF0, 0x00, // ######### - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x1B, 0xC0, 0x00, // ## #### - 0x1F, 0xF0, 0x00, // ######### - 0x1C, 0x30, 0x00, // ### ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x30, 0x30, 0x00, // ## ## - 0x3F, 0xF0, 0x00, // ########## - 0x0F, 0xC0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1584 '6' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xF8, 0x00, // ##### - 0x03, 0xF8, 0x00, // ####### - 0x07, 0x00, 0x00, // ### - 0x0E, 0x00, 0x00, // ### - 0x0C, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x1B, 0xC0, 0x00, // ## #### - 0x1F, 0xF0, 0x00, // ######### - 0x1C, 0x30, 0x00, // ### ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x38, 0x00, // ## ### - 0x0F, 0xF0, 0x00, // ######## - 0x03, 0xE0, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1656 '7' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x70, 0x00, // ### - 0x00, 0x60, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x00, 0xE0, 0x00, // ### - 0x00, 0xC0, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x01, 0xC0, 0x00, // ### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1728 '8' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xE0, 0x00, // ###### - 0x0F, 0xF0, 0x00, // ######## - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x07, 0xE0, 0x00, // ###### - 0x07, 0xE0, 0x00, // ###### - 0x0C, 0x30, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x1C, 0x38, 0x00, // ### ### - 0x0F, 0xF0, 0x00, // ######## - 0x07, 0xE0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1800 '9' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xC0, 0x00, // ##### - 0x0F, 0xF0, 0x00, // ######## - 0x1C, 0x30, 0x00, // ### ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x38, 0x00, // ## ### - 0x0F, 0xF8, 0x00, // ######### - 0x03, 0xD8, 0x00, // #### ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x70, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x1F, 0xC0, 0x00, // ####### - 0x1F, 0x00, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1872 ':' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @1944 ';' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xF0, 0x00, // #### - 0x00, 0xF0, 0x00, // #### - 0x00, 0xF0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xE0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x02, 0x00, 0x00, // # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2016 '<' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x1C, 0x00, // ### - 0x00, 0x3C, 0x00, // #### - 0x00, 0xF0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x0F, 0x00, 0x00, // #### - 0x3C, 0x00, 0x00, // #### - 0xF0, 0x00, 0x00, // #### - 0x3C, 0x00, 0x00, // #### - 0x0F, 0x00, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x00, 0xF0, 0x00, // #### - 0x00, 0x3C, 0x00, // #### - 0x00, 0x1C, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2088 '=' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xFC, 0x00, // ############# - 0x7F, 0xFC, 0x00, // ############# - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xFC, 0x00, // ############# - 0x7F, 0xFC, 0x00, // ############# - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2160 '>' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x70, 0x00, 0x00, // ### - 0x78, 0x00, 0x00, // #### - 0x1E, 0x00, 0x00, // #### - 0x07, 0x80, 0x00, // #### - 0x01, 0xE0, 0x00, // #### - 0x00, 0x78, 0x00, // #### - 0x00, 0x1E, 0x00, // #### - 0x00, 0x78, 0x00, // #### - 0x01, 0xE0, 0x00, // #### - 0x07, 0x80, 0x00, // #### - 0x1E, 0x00, 0x00, // #### - 0x78, 0x00, 0x00, // #### - 0x70, 0x00, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2232 '?' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xC0, 0x00, // ##### - 0x0F, 0xE0, 0x00, // ####### - 0x18, 0x70, 0x00, // ## ### - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x30, 0x00, // ## ## - 0x00, 0x70, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x03, 0xC0, 0x00, // #### - 0x03, 0x80, 0x00, // ### - 0x03, 0x00, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0x00, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2304 '@' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xE0, 0x00, // ##### - 0x07, 0xF0, 0x00, // ####### - 0x0E, 0x38, 0x00, // ### ### - 0x0C, 0x18, 0x00, // ## ## - 0x18, 0x78, 0x00, // ## #### - 0x18, 0xF8, 0x00, // ## ##### - 0x19, 0xD8, 0x00, // ## ### ## - 0x19, 0x98, 0x00, // ## ## ## - 0x19, 0x98, 0x00, // ## ## ## - 0x19, 0x98, 0x00, // ## ## ## - 0x18, 0xF8, 0x00, // ## ##### - 0x18, 0x78, 0x00, // ## #### - 0x18, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0E, 0x18, 0x00, // ### ## - 0x07, 0xF8, 0x00, // ######## - 0x03, 0xE0, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2376 'A' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0x80, 0x00, // ###### - 0x1F, 0xC0, 0x00, // ####### - 0x01, 0xC0, 0x00, // ### - 0x03, 0x60, 0x00, // ## ## - 0x03, 0x60, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x0F, 0xF8, 0x00, // ######### - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0xFC, 0x7F, 0x00, // ###### ####### - 0xFC, 0x7F, 0x00, // ###### ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2448 'B' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xE0, 0x00, // ########## - 0x7F, 0xF0, 0x00, // ########### - 0x18, 0x38, 0x00, // ## ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF0, 0x00, // ######### - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x1C, 0x00, // ## ### - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x7F, 0xF8, 0x00, // ############ - 0x7F, 0xF0, 0x00, // ########### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2520 'C' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xEC, 0x00, // ##### ## - 0x0F, 0xFC, 0x00, // ########## - 0x1C, 0x1C, 0x00, // ### ### - 0x18, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x18, 0x0C, 0x00, // ## ## - 0x1C, 0x1C, 0x00, // ### ### - 0x0F, 0xF8, 0x00, // ######### - 0x03, 0xF0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2592 'D' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xC0, 0x00, // ######### - 0x7F, 0xF0, 0x00, // ########### - 0x18, 0x38, 0x00, // ## ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x7F, 0xF0, 0x00, // ########### - 0x7F, 0xE0, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2664 'E' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xF8, 0x00, // ############ - 0x7F, 0xF8, 0x00, // ############ - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x19, 0x98, 0x00, // ## ## ## - 0x19, 0x80, 0x00, // ## ## - 0x1F, 0x80, 0x00, // ###### - 0x1F, 0x80, 0x00, // ###### - 0x19, 0x80, 0x00, // ## ## - 0x19, 0x98, 0x00, // ## ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x7F, 0xF8, 0x00, // ############ - 0x7F, 0xF8, 0x00, // ############ - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2736 'F' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0xCC, 0x00, // ## ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x0F, 0xC0, 0x00, // ###### - 0x0F, 0xC0, 0x00, // ###### - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0xC0, 0x00, // ## ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x3F, 0xC0, 0x00, // ######## - 0x3F, 0xC0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2808 'G' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xEC, 0x00, // ##### ## - 0x0F, 0xFC, 0x00, // ########## - 0x1C, 0x1C, 0x00, // ### ### - 0x18, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x30, 0xFE, 0x00, // ## ####### - 0x30, 0xFE, 0x00, // ## ####### - 0x30, 0x0C, 0x00, // ## ## - 0x38, 0x0C, 0x00, // ### ## - 0x1C, 0x1C, 0x00, // ### ### - 0x0F, 0xFC, 0x00, // ########## - 0x03, 0xF0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2880 'H' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @2952 'I' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3024 'J' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xFE, 0x00, // ########## - 0x07, 0xFE, 0x00, // ########## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x30, 0x30, 0x00, // ## ## - 0x30, 0x30, 0x00, // ## ## - 0x30, 0x30, 0x00, // ## ## - 0x30, 0x30, 0x00, // ## ## - 0x30, 0x60, 0x00, // ## ## - 0x3F, 0xE0, 0x00, // ######### - 0x0F, 0x80, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3096 'K' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0x3E, 0x00, // ####### ##### - 0x7F, 0x3E, 0x00, // ####### ##### - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x60, 0x00, // ## ## - 0x18, 0xC0, 0x00, // ## ## - 0x19, 0x80, 0x00, // ## ## - 0x1B, 0x80, 0x00, // ## ### - 0x1F, 0xC0, 0x00, // ####### - 0x1C, 0xE0, 0x00, // ### ### - 0x18, 0x70, 0x00, // ## ### - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x7F, 0x1F, 0x00, // ####### ##### - 0x7F, 0x1F, 0x00, // ####### ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3168 'L' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0x80, 0x00, // ######## - 0x7F, 0x80, 0x00, // ######## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x7F, 0xFC, 0x00, // ############# - 0x7F, 0xFC, 0x00, // ############# - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3240 'M' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0xF0, 0x0F, 0x00, // #### #### - 0xF8, 0x1F, 0x00, // ##### ##### - 0x38, 0x1C, 0x00, // ### ### - 0x3C, 0x3C, 0x00, // #### #### - 0x3C, 0x3C, 0x00, // #### #### - 0x36, 0x6C, 0x00, // ## ## ## ## - 0x36, 0x6C, 0x00, // ## ## ## ## - 0x33, 0xCC, 0x00, // ## #### ## - 0x33, 0xCC, 0x00, // ## #### ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0xFE, 0x7F, 0x00, // ####### ####### - 0xFE, 0x7F, 0x00, // ####### ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3312 'N' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x78, 0xFE, 0x00, // #### ####### - 0x78, 0xFE, 0x00, // #### ####### - 0x1C, 0x18, 0x00, // ### ## - 0x1E, 0x18, 0x00, // #### ## - 0x1F, 0x18, 0x00, // ##### ## - 0x1B, 0x18, 0x00, // ## ## ## - 0x1B, 0x98, 0x00, // ## ### ## - 0x19, 0xD8, 0x00, // ## ### ## - 0x18, 0xD8, 0x00, // ## ## ## - 0x18, 0xF8, 0x00, // ## ##### - 0x18, 0x78, 0x00, // ## #### - 0x18, 0x38, 0x00, // ## ### - 0x7F, 0x18, 0x00, // ####### ## - 0x7F, 0x18, 0x00, // ####### ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3384 'O' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x0F, 0xF0, 0x00, // ######## - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x38, 0x1C, 0x00, // ### ### - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x38, 0x1C, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x1C, 0x38, 0x00, // ### ### - 0x0F, 0xF0, 0x00, // ######## - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3456 'P' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3F, 0xF0, 0x00, // ########## - 0x3F, 0xF8, 0x00, // ########### - 0x0C, 0x1C, 0x00, // ## ### - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x0C, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x0F, 0xF8, 0x00, // ######### - 0x0F, 0xE0, 0x00, // ####### - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x3F, 0xC0, 0x00, // ######## - 0x3F, 0xC0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3528 'Q' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x0F, 0xF0, 0x00, // ######## - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x38, 0x1C, 0x00, // ### ### - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x38, 0x1C, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x1C, 0x38, 0x00, // ### ### - 0x0F, 0xF0, 0x00, // ######## - 0x07, 0xC0, 0x00, // ##### - 0x07, 0xCC, 0x00, // ##### ## - 0x0F, 0xFC, 0x00, // ########## - 0x0C, 0x38, 0x00, // ## ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3600 'R' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0xE0, 0x00, // ########## - 0x7F, 0xF0, 0x00, // ########### - 0x18, 0x38, 0x00, // ## ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF0, 0x00, // ######### - 0x1F, 0xC0, 0x00, // ####### - 0x18, 0xE0, 0x00, // ## ### - 0x18, 0x70, 0x00, // ## ### - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x7F, 0x1E, 0x00, // ####### #### - 0x7F, 0x0E, 0x00, // ####### ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3672 'S' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xD8, 0x00, // ##### ## - 0x0F, 0xF8, 0x00, // ######### - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x1E, 0x00, 0x00, // #### - 0x0F, 0xC0, 0x00, // ###### - 0x03, 0xF0, 0x00, // ###### - 0x00, 0x78, 0x00, // #### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x1C, 0x38, 0x00, // ### ### - 0x1F, 0xF0, 0x00, // ######### - 0x1B, 0xE0, 0x00, // ## ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3744 'T' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x0F, 0xF0, 0x00, // ######## - 0x0F, 0xF0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3816 'U' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x0F, 0xF0, 0x00, // ######## - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3888 'V' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7F, 0x7F, 0x00, // ####### ####### - 0x7F, 0x7F, 0x00, // ####### ####### - 0x18, 0x0C, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x03, 0x60, 0x00, // ## ## - 0x03, 0x60, 0x00, // ## ## - 0x03, 0x60, 0x00, // ## ## - 0x01, 0xC0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x00, 0x80, 0x00, // # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @3960 'W' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0xFE, 0x3F, 0x80, // ####### ####### - 0xFE, 0x3F, 0x80, // ####### ####### - 0x30, 0x06, 0x00, // ## ## - 0x30, 0x06, 0x00, // ## ## - 0x30, 0x86, 0x00, // ## # ## - 0x19, 0xCC, 0x00, // ## ### ## - 0x19, 0xCC, 0x00, // ## ### ## - 0x1B, 0x6C, 0x00, // ## ## ## ## - 0x1B, 0x6C, 0x00, // ## ## ## ## - 0x1E, 0x7C, 0x00, // #### ##### - 0x0E, 0x38, 0x00, // ### ### - 0x0E, 0x38, 0x00, // ### ### - 0x0C, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4032 'X' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x03, 0xC0, 0x00, // #### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0xC0, 0x00, // #### - 0x06, 0x60, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4104 'Y' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7C, 0x7E, 0x00, // ##### ###### - 0x7C, 0x7E, 0x00, // ##### ###### - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x03, 0xC0, 0x00, // #### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x0F, 0xF0, 0x00, // ######## - 0x0F, 0xF0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4176 'Z' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x60, 0x00, // ## ## - 0x18, 0xC0, 0x00, // ## ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x06, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4248 '[' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0xF0, 0x00, // ##### - 0x01, 0xF0, 0x00, // ##### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0xF0, 0x00, // ##### - 0x01, 0xF0, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4320 '\' (17 pixels wide) - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x1C, 0x00, 0x00, // ### - 0x0C, 0x00, 0x00, // ## - 0x0E, 0x00, 0x00, // ### - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x00, 0x60, 0x00, // ## - 0x00, 0x70, 0x00, // ### - 0x00, 0x30, 0x00, // ## - 0x00, 0x38, 0x00, // ### - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4392 ']' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x0F, 0x80, 0x00, // ##### - 0x0F, 0x80, 0x00, // ##### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x0F, 0x80, 0x00, // ##### - 0x0F, 0x80, 0x00, // ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4464 '^' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x80, 0x00, // # - 0x01, 0xC0, 0x00, // ### - 0x03, 0xE0, 0x00, // ##### - 0x07, 0x70, 0x00, // ### ### - 0x06, 0x30, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x10, 0x04, 0x00, // # # - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4536 '_' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 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, 0x00, // ################ - 0xFF, 0xFF, 0x00, // ################ - - // @4608 '`' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x03, 0x00, 0x00, // ## - 0x03, 0x80, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x00, 0x60, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4680 'a' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x0F, 0xC0, 0x00, // ###### - 0x1F, 0xE0, 0x00, // ######## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x07, 0xF0, 0x00, // ####### - 0x1F, 0xF0, 0x00, // ######### - 0x38, 0x30, 0x00, // ### ## - 0x30, 0x30, 0x00, // ## ## - 0x30, 0x70, 0x00, // ## ### - 0x1F, 0xFC, 0x00, // ########### - 0x0F, 0xBC, 0x00, // ##### #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4752 'b' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x78, 0x00, 0x00, // #### - 0x78, 0x00, 0x00, // #### - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x1B, 0xE0, 0x00, // ## ##### - 0x1F, 0xF8, 0x00, // ########## - 0x1C, 0x18, 0x00, // ### ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x1C, 0x18, 0x00, // ### ## - 0x7F, 0xF8, 0x00, // ############ - 0x7B, 0xE0, 0x00, // #### ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4824 'c' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xEC, 0x00, // ##### ## - 0x0F, 0xFC, 0x00, // ########## - 0x1C, 0x1C, 0x00, // ### ### - 0x38, 0x0C, 0x00, // ### ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x38, 0x0C, 0x00, // ### ## - 0x1C, 0x1C, 0x00, // ### ### - 0x0F, 0xF8, 0x00, // ######### - 0x03, 0xF0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4896 'd' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x78, 0x00, // #### - 0x00, 0x78, 0x00, // #### - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x07, 0xD8, 0x00, // ##### ## - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x38, 0x00, // ## ### - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xFE, 0x00, // ############ - 0x07, 0xDE, 0x00, // ##### #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @4968 'e' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xE0, 0x00, // ###### - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x18, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x30, 0x00, 0x00, // ## - 0x30, 0x00, 0x00, // ## - 0x18, 0x0C, 0x00, // ## ## - 0x1F, 0xFC, 0x00, // ########### - 0x07, 0xF0, 0x00, // ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5040 'f' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0xFC, 0x00, // ####### - 0x03, 0xFC, 0x00, // ######## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x3F, 0xF8, 0x00, // ########### - 0x3F, 0xF8, 0x00, // ########### - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x3F, 0xF0, 0x00, // ########## - 0x3F, 0xF0, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5112 'g' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xDE, 0x00, // ##### #### - 0x1F, 0xFE, 0x00, // ############ - 0x18, 0x38, 0x00, // ## ### - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF8, 0x00, // ########## - 0x07, 0xD8, 0x00, // ##### ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x38, 0x00, // ### - 0x0F, 0xF0, 0x00, // ######## - 0x0F, 0xC0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5184 'h' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x78, 0x00, 0x00, // #### - 0x78, 0x00, 0x00, // #### - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x1B, 0xE0, 0x00, // ## ##### - 0x1F, 0xF0, 0x00, // ######### - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5256 'i' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0x80, 0x00, // ###### - 0x1F, 0x80, 0x00, // ###### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5328 'j' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xC0, 0x00, // ## - 0x00, 0xC0, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF0, 0x00, // ######### - 0x1F, 0xF0, 0x00, // ######### - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x30, 0x00, // ## - 0x00, 0x70, 0x00, // ### - 0x1F, 0xE0, 0x00, // ######## - 0x1F, 0x80, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5400 'k' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3C, 0x00, 0x00, // #### - 0x3C, 0x00, 0x00, // #### - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0xF8, 0x00, // ## ##### - 0x0C, 0xF8, 0x00, // ## ##### - 0x0C, 0xC0, 0x00, // ## ## - 0x0D, 0x80, 0x00, // ## ## - 0x0F, 0x80, 0x00, // ##### - 0x0F, 0x00, 0x00, // #### - 0x0F, 0x80, 0x00, // ##### - 0x0D, 0xC0, 0x00, // ## ### - 0x0C, 0xE0, 0x00, // ## ### - 0x3C, 0x7C, 0x00, // #### ##### - 0x3C, 0x7C, 0x00, // #### ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5472 'l' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0x80, 0x00, // ###### - 0x1F, 0x80, 0x00, // ###### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x3F, 0xFC, 0x00, // ############ - 0x3F, 0xFC, 0x00, // ############ - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5544 'm' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0xF7, 0x78, 0x00, // #### ### #### - 0xFF, 0xFC, 0x00, // ############## - 0x39, 0xCC, 0x00, // ### ### ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0x31, 0x8C, 0x00, // ## ## ## - 0xFD, 0xEF, 0x00, // ###### #### #### - 0xFD, 0xEF, 0x00, // ###### #### #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5616 'n' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7B, 0xE0, 0x00, // #### ##### - 0x7F, 0xF0, 0x00, // ########### - 0x1C, 0x38, 0x00, // ### ### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x7E, 0x7E, 0x00, // ###### ###### - 0x7E, 0x7E, 0x00, // ###### ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5688 'o' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x03, 0xC0, 0x00, // #### - 0x0F, 0xF0, 0x00, // ######## - 0x1C, 0x38, 0x00, // ### ### - 0x38, 0x1C, 0x00, // ### ### - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x30, 0x0C, 0x00, // ## ## - 0x38, 0x1C, 0x00, // ### ### - 0x1C, 0x38, 0x00, // ### ### - 0x0F, 0xF0, 0x00, // ######## - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5760 'p' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7B, 0xE0, 0x00, // #### ##### - 0x7F, 0xF8, 0x00, // ############ - 0x1C, 0x18, 0x00, // ### ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x18, 0x0C, 0x00, // ## ## - 0x1C, 0x18, 0x00, // ### ## - 0x1F, 0xF8, 0x00, // ########## - 0x1B, 0xE0, 0x00, // ## ##### - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x18, 0x00, 0x00, // ## - 0x7F, 0x00, 0x00, // ####### - 0x7F, 0x00, 0x00, // ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5832 'q' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xDE, 0x00, // ##### #### - 0x1F, 0xFE, 0x00, // ############ - 0x18, 0x38, 0x00, // ## ### - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x30, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF8, 0x00, // ########## - 0x07, 0xD8, 0x00, // ##### ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0x18, 0x00, // ## - 0x00, 0xFE, 0x00, // ####### - 0x00, 0xFE, 0x00, // ####### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5904 'r' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3E, 0x78, 0x00, // ##### #### - 0x3E, 0xFC, 0x00, // ##### ###### - 0x07, 0xCC, 0x00, // ##### ## - 0x07, 0x00, 0x00, // ### - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x06, 0x00, 0x00, // ## - 0x3F, 0xF0, 0x00, // ########## - 0x3F, 0xF0, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @5976 's' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0xF8, 0x00, // ######## - 0x0F, 0xF8, 0x00, // ######### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x1F, 0x80, 0x00, // ###### - 0x0F, 0xF0, 0x00, // ######## - 0x00, 0xF8, 0x00, // ##### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x1F, 0xF0, 0x00, // ######### - 0x1F, 0xE0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6048 't' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x3F, 0xF0, 0x00, // ########## - 0x3F, 0xF0, 0x00, // ########## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x00, 0x00, // ## - 0x0C, 0x1C, 0x00, // ## ### - 0x07, 0xFC, 0x00, // ######### - 0x03, 0xF0, 0x00, // ###### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6120 'u' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x78, 0x78, 0x00, // #### #### - 0x78, 0x78, 0x00, // #### #### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x38, 0x00, // ## ### - 0x0F, 0xFE, 0x00, // ########### - 0x07, 0xDE, 0x00, // ##### #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6192 'v' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7C, 0x3E, 0x00, // ##### ##### - 0x7C, 0x3E, 0x00, // ##### ##### - 0x18, 0x18, 0x00, // ## ## - 0x18, 0x18, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x07, 0xE0, 0x00, // ###### - 0x03, 0xC0, 0x00, // #### - 0x03, 0xC0, 0x00, // #### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6264 'w' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x78, 0x3C, 0x00, // #### #### - 0x78, 0x3C, 0x00, // #### #### - 0x31, 0x18, 0x00, // ## # ## - 0x33, 0x98, 0x00, // ## ### ## - 0x33, 0x98, 0x00, // ## ### ## - 0x1A, 0xB0, 0x00, // ## # # ## - 0x1E, 0xF0, 0x00, // #### #### - 0x1E, 0xF0, 0x00, // #### #### - 0x1C, 0x60, 0x00, // ### ## - 0x0C, 0x60, 0x00, // ## ## - 0x0C, 0x60, 0x00, // ## ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6336 'x' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x3E, 0x7C, 0x00, // ##### ##### - 0x3E, 0x7C, 0x00, // ##### ##### - 0x0C, 0x30, 0x00, // ## ## - 0x06, 0x60, 0x00, // ## ## - 0x03, 0xC0, 0x00, // #### - 0x01, 0x80, 0x00, // ## - 0x03, 0xC0, 0x00, // #### - 0x06, 0x60, 0x00, // ## ## - 0x0C, 0x30, 0x00, // ## ## - 0x3E, 0x7C, 0x00, // ##### ##### - 0x3E, 0x7C, 0x00, // ##### ##### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6408 'y' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x7E, 0x1F, 0x00, // ###### ##### - 0x7E, 0x1F, 0x00, // ###### ##### - 0x18, 0x0C, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x06, 0x30, 0x00, // ## ## - 0x03, 0x60, 0x00, // ## ## - 0x03, 0xE0, 0x00, // ##### - 0x01, 0xC0, 0x00, // ### - 0x00, 0xC0, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x3F, 0xC0, 0x00, // ######## - 0x3F, 0xC0, 0x00, // ######## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6480 'z' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x18, 0x30, 0x00, // ## ## - 0x18, 0x60, 0x00, // ## ## - 0x00, 0xC0, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x00, 0x00, // ## - 0x06, 0x18, 0x00, // ## ## - 0x0C, 0x18, 0x00, // ## ## - 0x1F, 0xF8, 0x00, // ########## - 0x1F, 0xF8, 0x00, // ########## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6552 '{' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0xE0, 0x00, // ### - 0x01, 0xE0, 0x00, // #### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x03, 0x80, 0x00, // ### - 0x07, 0x00, 0x00, // ### - 0x03, 0x80, 0x00, // ### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0xE0, 0x00, // #### - 0x00, 0xE0, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6624 '|' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6696 '}' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x07, 0x00, 0x00, // ### - 0x07, 0x80, 0x00, // #### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0xC0, 0x00, // ### - 0x00, 0xE0, 0x00, // ### - 0x01, 0xC0, 0x00, // ### - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x01, 0x80, 0x00, // ## - 0x07, 0x80, 0x00, // #### - 0x07, 0x00, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - - // @6768 '~' (17 pixels wide) - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x0E, 0x00, 0x00, // ### - 0x1F, 0x18, 0x00, // ##### ## - 0x3B, 0xB8, 0x00, // ### ### ### - 0x31, 0xF0, 0x00, // ## ##### - 0x00, 0xE0, 0x00, // ### - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // - 0x00, 0x00, 0x00, // -}; - -sFONT Font24 = { - Font24_Table, - 17, /* Width */ - 24, /* Height */ -}; - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font24CN.c b/display_app/2in15_e-Paper_B/lib/Fonts/font24CN.c deleted file mode 100755 index d3c9584f..00000000 --- a/display_app/2in15_e-Paper_B/lib/Fonts/font24CN.c +++ /dev/null @@ -1,465 +0,0 @@ -/** - ****************************************************************************** - * @file Font12.c - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2014 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "fonts.h" - - -// -// Font data for Courier New 12pt -// - -const CH_CN Font24CN_Table[] = -{ -/*-- ÎÄ×Ö: Äã --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"Äã"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC1,0xC0,0x00, -0x01,0xE3,0xE0,0x00,0x03,0xE3,0xC0,0x00,0x03,0xC7,0x80,0x00,0x03,0xC7,0xFF,0xFF, -0x07,0x8F,0xFF,0xFF,0x07,0x8F,0x00,0x0F,0x0F,0x1E,0x00,0x1E,0x0F,0x3C,0x1E,0x1E, -0x1F,0x3C,0x1E,0x3E,0x1F,0x18,0x1E,0x3C,0x3F,0x00,0x1E,0x1C,0x7F,0x00,0x1E,0x00, -0x7F,0x07,0x9E,0x70,0xFF,0x07,0x9E,0xF0,0xEF,0x0F,0x9E,0x78,0x6F,0x0F,0x1E,0x78, -0x0F,0x0F,0x1E,0x3C,0x0F,0x1E,0x1E,0x3C,0x0F,0x1E,0x1E,0x1E,0x0F,0x3C,0x1E,0x1E, -0x0F,0x3C,0x1E,0x1F,0x0F,0x7C,0x1E,0x0F,0x0F,0x78,0x1E,0x0E,0x0F,0x00,0x1E,0x00, -0x0F,0x00,0x1E,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x07,0xFC,0x00,0x0F,0x07,0xF8,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ºÃ --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"ºÃ"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00, -0x0F,0x07,0xFF,0xFE,0x0F,0x07,0xFF,0xFE,0x0F,0x00,0x00,0x3E,0x1E,0x00,0x00,0xFC, -0xFF,0xF8,0x01,0xF0,0xFF,0xF8,0x03,0xE0,0x1E,0x78,0x07,0xC0,0x1E,0x78,0x0F,0x80, -0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00, -0x3C,0x7F,0xFF,0xFF,0x78,0xFF,0xFF,0xFF,0x78,0xF0,0x0F,0x00,0x78,0xF0,0x0F,0x00, -0x3D,0xE0,0x0F,0x00,0x1F,0xE0,0x0F,0x00,0x0F,0xE0,0x0F,0x00,0x07,0xC0,0x0F,0x00, -0x07,0xE0,0x0F,0x00,0x07,0xF0,0x0F,0x00,0x0F,0xF8,0x0F,0x00,0x1E,0x7C,0x0F,0x00, -0x3C,0x38,0x0F,0x00,0x78,0x00,0x0F,0x00,0xF0,0x03,0xFF,0x00,0x60,0x01,0xFE,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ΢ --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"΢"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x01,0xE0,0x07,0x87,0x01,0xE0, -0x07,0x07,0x01,0xC0,0x0F,0xF7,0x79,0xC0,0x1E,0xF7,0x7B,0xC0,0x1E,0xF7,0x7B,0x80, -0x3C,0xF7,0x7B,0xFF,0x78,0xF7,0x7B,0xFF,0xF8,0xF7,0x7F,0x9E,0xF7,0xFF,0xFF,0x9E, -0x67,0xFF,0xFF,0x9E,0x07,0x00,0x7F,0x9C,0x0F,0x00,0x0F,0x9C,0x1E,0x00,0x1F,0x9C, -0x1E,0x7F,0xFF,0xBC,0x3E,0x7F,0xF3,0xFC,0x3E,0x00,0x03,0xFC,0x7E,0x00,0x01,0xF8, -0xFE,0x00,0x01,0xF8,0xFE,0x7F,0xE1,0xF8,0xDE,0x7F,0xE1,0xF8,0x1E,0x78,0xE0,0xF0, -0x1E,0x78,0xEE,0xF0,0x1E,0x78,0xFF,0xF0,0x1E,0x78,0xFD,0xF8,0x1E,0x79,0xFB,0xFC, -0x1E,0xF1,0xF7,0xBC,0x1E,0xF0,0xEF,0x9E,0x1F,0xE0,0x0F,0x0F,0x1E,0xC0,0x1E,0x0F, -0x1E,0x00,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: Èí --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"Èí"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x03,0xC0,0x78,0x00,0x07,0x80,0x78,0x00,0x07,0x80,0x78,0x00, -0x07,0x80,0xF0,0x00,0x0F,0x00,0xF0,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0x1E,0x03,0xC0,0x1F,0x1E,0x03,0xC0,0x1E,0x1F,0xE7,0x8F,0x3E,0x3D,0xE7,0x8F,0x3C, -0x3D,0xEF,0x0F,0x7C,0x3D,0xE7,0x0F,0x78,0x79,0xE0,0x0F,0x00,0x79,0xE0,0x0E,0x00, -0x7F,0xFE,0x0E,0x00,0x7F,0xFE,0x1F,0x00,0x01,0xE0,0x1F,0x00,0x01,0xE0,0x1F,0x00, -0x01,0xE0,0x1F,0x80,0x01,0xE0,0x1F,0x80,0x01,0xE0,0x3F,0x80,0x01,0xFF,0x3F,0xC0, -0x0F,0xFF,0x7B,0xC0,0xFF,0xF0,0x79,0xE0,0xF9,0xE0,0xF1,0xF0,0x01,0xE1,0xF0,0xF0, -0x01,0xE3,0xE0,0xF8,0x01,0xE7,0xC0,0x7C,0x01,0xFF,0x80,0x3F,0x01,0xFF,0x00,0x1F, -0x01,0xEC,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ÑÅ --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"ÑÅ"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0xFF,0x00, -0x7F,0xFC,0xF7,0x80,0x7F,0xFD,0xE3,0xC0,0x01,0xC1,0xE3,0xC0,0x01,0xC3,0xC1,0x80, -0x3D,0xC7,0xFF,0xFF,0x39,0xC7,0xFF,0xFF,0x39,0xCF,0x83,0x80,0x79,0xDF,0x83,0x80, -0x79,0xFF,0x83,0x80,0x79,0xDF,0x83,0x80,0x71,0xC3,0x83,0x80,0x7F,0xFF,0xFF,0xFE, -0x7F,0xFF,0xFF,0xFE,0x03,0xC3,0x83,0x80,0x07,0xC3,0x83,0x80,0x07,0xC3,0x83,0x80, -0x0F,0xC3,0x83,0x80,0x0F,0xC3,0x83,0x80,0x1F,0xC3,0xFF,0xFE,0x1D,0xC3,0xFF,0xFE, -0x3D,0xC3,0x83,0x80,0x79,0xC3,0x83,0x80,0xF1,0xC3,0x83,0x80,0xF1,0xC3,0x83,0x80, -0x61,0xC3,0x83,0x80,0x01,0xC3,0xFF,0xFF,0x03,0xC3,0xFF,0xFF,0x1F,0xC3,0x80,0x00, -0x1F,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ºÚ --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"ºÚ"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x1E,0x03,0xC0,0x3C,0x1E,0xC3,0xC7,0x3C, -0x1F,0xE3,0xC7,0xBC,0x1E,0xF3,0xCF,0x3C,0x1E,0xFB,0xDF,0x3C,0x1E,0x7B,0xDE,0x3C, -0x1E,0x33,0xDC,0x3C,0x1E,0x03,0xC0,0x3C,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC, -0x1E,0x03,0xC0,0x3C,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x3F,0xFF,0xFF,0xFC, -0x3F,0xFF,0xFF,0xFC,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x1C,0x38,0x70,0x70, -0x3E,0x78,0xF8,0xF8,0x3C,0x7C,0x78,0x7C,0x7C,0x3C,0x3C,0x3E,0xF8,0x3E,0x3C,0x1F, -0xF0,0x1C,0x18,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ´Ë --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"´Ë"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x3C,0x00, -0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00, -0x00,0x78,0x3C,0x0C,0x3C,0x78,0x3C,0x1E,0x3C,0x78,0x3C,0x3F,0x3C,0x78,0x3C,0xF8, -0x3C,0x7F,0xFD,0xF0,0x3C,0x7F,0xFF,0xE0,0x3C,0x78,0x3F,0x80,0x3C,0x78,0x3E,0x00, -0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00, -0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x0E,0x3C,0x78,0x3C,0x0F, -0x3C,0x78,0x3C,0x0F,0x3C,0x79,0xFC,0x0F,0x3C,0x7F,0xFC,0x0F,0x3F,0xFF,0x3C,0x0F, -0x3F,0xF0,0x3E,0x1E,0xFF,0x00,0x1F,0xFE,0xF0,0x00,0x0F,0xFC,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ×Ö --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"×Ö"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0xC0,0x00, -0x00,0x03,0xE0,0x00,0x00,0x01,0xE0,0x00,0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE, -0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E, -0x7B,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xC0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00, -0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, -0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, -0x00,0x03,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xFF,0xC0,0x00,0x00,0xFF,0x80,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: Ìå --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"Ìå"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x3C,0x00, -0x03,0xC0,0x3C,0x00,0x03,0xC0,0x3C,0x00,0x07,0x80,0x3C,0x00,0x07,0x80,0x3C,0x00, -0x07,0x80,0x3C,0x00,0x0F,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0x1F,0x01,0xFE,0x00, -0x1F,0x01,0xFF,0x00,0x3F,0x01,0xFF,0x00,0x3F,0x03,0xFF,0x00,0x7F,0x03,0xFF,0x80, -0x7F,0x07,0xBF,0x80,0xFF,0x07,0xBF,0xC0,0xEF,0x0F,0x3D,0xC0,0xCF,0x0F,0x3D,0xE0, -0x0F,0x1E,0x3D,0xE0,0x0F,0x1E,0x3C,0xF0,0x0F,0x3C,0x3C,0x78,0x0F,0x7C,0x3C,0x7C, -0x0F,0xF8,0x3C,0x3E,0x0F,0xF7,0xFF,0xDF,0x0F,0xE7,0xFF,0xCF,0x0F,0xC0,0x3C,0x06, -0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00, -0x0F,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: Ï --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"ÏÂ"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, -0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, -0x00,0x0F,0xE0,0x00,0x00,0x0F,0xF8,0x00,0x00,0x0F,0xFC,0x00,0x00,0x0F,0xBF,0x00, -0x00,0x0F,0x9F,0x80,0x00,0x0F,0x87,0xE0,0x00,0x0F,0x83,0xF0,0x00,0x0F,0x80,0xF8, -0x00,0x0F,0x80,0x7C,0x00,0x0F,0x80,0x38,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, -0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, -0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ¶Ô --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"¶Ô"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78, -0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x7F,0xFC,0x00,0x78,0x7F,0xFC,0x00,0x78, -0x00,0x3C,0x00,0x78,0x00,0x3F,0xFF,0xFF,0x30,0x3F,0xFF,0xFF,0x78,0x3C,0x00,0x78, -0x3C,0x38,0x00,0x78,0x3E,0x78,0x00,0x78,0x1E,0x78,0xC0,0x78,0x0F,0x79,0xE0,0x78, -0x0F,0xF0,0xF0,0x78,0x07,0xF0,0xF8,0x78,0x03,0xF0,0x78,0x78,0x01,0xE0,0x3C,0x78, -0x03,0xF0,0x3E,0x78,0x03,0xF0,0x18,0x78,0x07,0xF8,0x00,0x78,0x07,0xFC,0x00,0x78, -0x0F,0x3E,0x00,0x78,0x1F,0x1E,0x00,0x78,0x3E,0x1F,0x00,0x78,0x7C,0x0E,0x00,0xF8, -0xF8,0x00,0x00,0xF0,0xF0,0x00,0x3F,0xF0,0x60,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: Ó¦ --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"Ó¦"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0x01,0xE0,0x00, -0x00,0x01,0xF0,0x00,0x00,0x00,0xF0,0x00,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF, -0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E,0x01,0xE0,0x78,0x1E,0x01,0xE0,0x78, -0x1E,0xE1,0xE0,0x78,0x1F,0xF1,0xF0,0xF8,0x1E,0xF0,0xF0,0xF0,0x1E,0xF0,0xF0,0xF0, -0x1E,0xF8,0xF0,0xF0,0x1E,0x78,0xF1,0xF0,0x1E,0x78,0xF9,0xE0,0x1E,0x78,0x79,0xE0, -0x1E,0x7C,0x7B,0xE0,0x1E,0x3C,0x7B,0xC0,0x1E,0x3C,0x7B,0xC0,0x1E,0x3C,0x7B,0xC0, -0x3C,0x3E,0x07,0x80,0x3C,0x1C,0x07,0x80,0x3C,0x00,0x07,0x80,0x3C,0x00,0x0F,0x00, -0x78,0x00,0x0F,0x00,0x7B,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00, -0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: µÄ --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"µÄ"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x3C,0x00,0x07,0xC0,0x3E,0x00, -0x07,0x80,0x3C,0x00,0x07,0x80,0x7C,0x00,0x0F,0x00,0x78,0x00,0x7F,0xFE,0x7F,0xFE, -0x7F,0xFE,0xFF,0xFE,0x78,0x1E,0xF0,0x1E,0x78,0x1F,0xE0,0x1E,0x78,0x1F,0xE0,0x1E, -0x78,0x1F,0xC0,0x1E,0x78,0x1F,0xC0,0x1E,0x78,0x1F,0xF0,0x1E,0x78,0x1E,0xF8,0x1E, -0x78,0x1E,0x7C,0x1E,0x7F,0xFE,0x3C,0x1E,0x7F,0xFE,0x1E,0x1E,0x78,0x1E,0x1F,0x1E, -0x78,0x1E,0x0F,0x9E,0x78,0x1E,0x07,0x9E,0x78,0x1E,0x07,0x1E,0x78,0x1E,0x00,0x1E, -0x78,0x1E,0x00,0x1E,0x78,0x1E,0x00,0x3E,0x78,0x1E,0x00,0x3C,0x78,0x1E,0x00,0x3C, -0x7F,0xFE,0x00,0x3C,0x7F,0xFE,0x00,0x7C,0x78,0x1E,0x3F,0xF8,0x78,0x1E,0x3F,0xF0, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: µã --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"µã"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, -0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xFF,0xFF,0x00,0x03,0xFF,0xFF, -0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, -0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF8,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78, -0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78, -0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF8,0x0F,0x00,0x00,0x78,0x00,0x00,0x00,0x00, -0x0C,0x38,0x38,0x30,0x1E,0x7C,0x78,0x78,0x3E,0x3C,0x78,0x78,0x3C,0x3C,0x3C,0x3C, -0x7C,0x3E,0x3C,0x3E,0xF8,0x1E,0x3C,0x1E,0xF0,0x1E,0x1E,0x1F,0x70,0x1E,0x1C,0x0E, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: Õó --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"Õó"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x78,0x00, -0x7F,0xF0,0x78,0x00,0x7F,0xF0,0x78,0x00,0x79,0xFF,0xFF,0xFF,0x79,0xFF,0xFF,0xFF, -0x79,0xE1,0xE0,0x00,0x79,0xE1,0xE0,0x00,0x7B,0xC1,0xEF,0x80,0x7B,0xC3,0xCF,0x80, -0x7B,0xC3,0xCF,0x80,0x7F,0x87,0xCF,0x80,0x7F,0x87,0x8F,0x80,0x7F,0x87,0x8F,0x80, -0x7B,0xCF,0x0F,0x80,0x7B,0xCF,0xFF,0xFE,0x79,0xEF,0xFF,0xFE,0x79,0xE0,0x0F,0x80, -0x78,0xE0,0x0F,0x80,0x78,0xF0,0x0F,0x80,0x78,0xF0,0x0F,0x80,0x78,0xF0,0x0F,0x80, -0x78,0xFF,0xFF,0xFF,0x79,0xFF,0xFF,0xFF,0x7F,0xE0,0x0F,0x80,0x7F,0xC0,0x0F,0x80, -0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80, -0x78,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: Ϊ --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"Ϊ"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00, -0x0E,0x07,0x80,0x00,0x1F,0x07,0x80,0x00,0x0F,0x87,0x80,0x00,0x07,0xC7,0x80,0x00, -0x01,0xE7,0x80,0x00,0x00,0xC7,0x80,0x00,0x00,0x07,0x80,0x00,0x7F,0xFF,0xFF,0xFC, -0x7F,0xFF,0xFF,0xFC,0x00,0x07,0x80,0x3C,0x00,0x0F,0x80,0x3C,0x00,0x0F,0x00,0x3C, -0x00,0x0F,0x00,0x3C,0x00,0x0F,0x60,0x3C,0x00,0x1F,0xF0,0x3C,0x00,0x1E,0x78,0x3C, -0x00,0x3E,0x3C,0x3C,0x00,0x3C,0x3E,0x3C,0x00,0x7C,0x1F,0x3C,0x00,0x78,0x0F,0x3C, -0x00,0xF8,0x06,0x3C,0x01,0xF0,0x00,0x3C,0x03,0xE0,0x00,0x7C,0x07,0xC0,0x00,0x7C, -0x0F,0x80,0x00,0x78,0x1F,0x00,0x00,0xF8,0x3E,0x00,0xFF,0xF0,0x7C,0x00,0xFF,0xE0, -0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: Ê÷ --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"Ê÷"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x38, -0x0F,0x00,0x00,0x38,0x0F,0x00,0x00,0x38,0x0F,0x3F,0xF8,0x38,0x0F,0x3F,0xF8,0x38, -0x0F,0x00,0x78,0x38,0xFF,0xE0,0x7F,0xFF,0xFF,0xE0,0x7F,0xFF,0x0F,0x00,0x70,0x38, -0x0F,0x18,0xF0,0x38,0x1F,0x3C,0xF0,0x38,0x1F,0x1C,0xFE,0x38,0x1F,0xDE,0xFE,0x38, -0x3F,0xEF,0xEF,0x38,0x3F,0xFF,0xEF,0x38,0x3F,0xF7,0xE7,0xB8,0x7F,0x67,0xC7,0xB8, -0x7F,0x03,0xC3,0xB8,0xFF,0x07,0xE0,0x38,0xEF,0x07,0xE0,0x38,0xEF,0x0F,0xF0,0x38, -0xCF,0x1F,0xF0,0x38,0x0F,0x1E,0x78,0x38,0x0F,0x3C,0x7C,0x38,0x0F,0x78,0x3C,0x38, -0x0F,0xF8,0x38,0x38,0x0F,0x60,0x00,0x78,0x0F,0x00,0x0F,0xF8,0x0F,0x00,0x07,0xF0, -0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: Ý® --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"Ý®"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1E,0x00,0x00,0x3C,0x1E,0x00, -0x00,0x3C,0x1E,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x3C,0x1E,0x00, -0x07,0xBC,0x1E,0x00,0x07,0x80,0x00,0x00,0x0F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFC, -0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xF0, -0xF7,0xFF,0xFF,0xF0,0x37,0x83,0x80,0xF0,0x07,0x87,0xC0,0xF0,0x07,0x83,0xF0,0xF0, -0x07,0x00,0xE0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x00,0xE0, -0x0F,0x0F,0x81,0xE0,0x0E,0x03,0xE1,0xE0,0x1E,0x01,0xC1,0xE0,0x1F,0xFF,0xFF,0xFE, -0x1F,0xFF,0xFF,0xFE,0x00,0x00,0x01,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xFF,0xC0, -0x00,0x00,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ÅÉ --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"ÅÉ"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x3E, -0x7C,0x00,0x3F,0xFE,0x3F,0x3F,0xFF,0xF0,0x1F,0xBF,0xE0,0x00,0x07,0xBC,0x00,0x00, -0x03,0x3C,0x00,0x00,0x00,0x3C,0x00,0x3C,0x00,0x3C,0x0F,0xFE,0x70,0x3D,0xFF,0xF8, -0xF8,0x3D,0xFF,0x00,0x7C,0x3D,0xE7,0x80,0x3F,0x3D,0xE7,0x80,0x1F,0x3D,0xE7,0x8E, -0x0E,0x3D,0xE7,0x9F,0x00,0x3D,0xE7,0xFE,0x00,0x39,0xE7,0xF8,0x00,0x39,0xE3,0xF0, -0x1C,0x39,0xE3,0xC0,0x1E,0x79,0xE3,0xC0,0x1E,0x79,0xE1,0xE0,0x1E,0x79,0xE1,0xE0, -0x3C,0x79,0xE0,0xF0,0x3C,0x79,0xE0,0xF8,0x3C,0xF1,0xE0,0x7C,0x3C,0xF1,0xE3,0x7C, -0x7D,0xF1,0xEF,0x3F,0x79,0xE1,0xFE,0x1F,0x7B,0xE1,0xF8,0x0E,0x7B,0xC3,0xE0,0x00, -0x79,0x81,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: A --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{ -"A"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x7C,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00, -0x01,0xFF,0x00,0x00,0x01,0xFF,0x00,0x00,0x01,0xEF,0x00,0x00,0x03,0xEF,0x80,0x00, -0x03,0xCF,0x80,0x00,0x07,0xC7,0x80,0x00,0x07,0xC7,0xC0,0x00,0x07,0x87,0xC0,0x00, -0x0F,0x83,0xE0,0x00,0x0F,0x83,0xE0,0x00,0x0F,0x01,0xE0,0x00,0x1F,0xFF,0xF0,0x00, -0x1F,0xFF,0xF0,0x00,0x3F,0xFF,0xF8,0x00,0x3E,0x00,0xF8,0x00,0x3C,0x00,0xF8,0x00, -0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x78,0x00,0x3C,0x00,0xF8,0x00,0x3E,0x00, -0xF8,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: a --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"a"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF8,0x00,0x00, -0x1F,0xFE,0x00,0x00,0x3F,0xFE,0x00,0x00,0x3E,0x3F,0x00,0x00,0x38,0x1F,0x00,0x00, -0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x03,0xFF,0x00,0x00,0x1F,0xFF,0x00,0x00, -0x3F,0x8F,0x00,0x00,0x7C,0x0F,0x00,0x00,0x7C,0x0F,0x00,0x00,0x78,0x1F,0x00,0x00, -0x7C,0x1F,0x00,0x00,0x7E,0x7F,0x00,0x00,0x7F,0xFF,0x00,0x00,0x3F,0xFF,0x00,0x00, -0x0F,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: b --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"b"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00, -0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00, -0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0xFE,0x00,0x00, -0x3D,0xFF,0x80,0x00,0x3F,0xFF,0xC0,0x00,0x3F,0x8F,0xC0,0x00,0x3F,0x07,0xE0,0x00, -0x3E,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00,0x3C,0x01,0xE0,0x00,0x3C,0x01,0xE0,0x00, -0x3C,0x01,0xE0,0x00,0x3C,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00, -0x3F,0x07,0xC0,0x00,0x3F,0x8F,0xC0,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0x00,0x00, -0x3C,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: c --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"c"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x00, -0x07,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x3F,0x86,0x00,0x00,0x3E,0x00,0x00,0x00, -0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x78,0x00,0x00,0x00, -0x78,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, -0x3E,0x00,0x00,0x00,0x3F,0x86,0x00,0x00,0x1F,0xFE,0x00,0x00,0x0F,0xFE,0x00,0x00, -0x03,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ΢ --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"΢"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x01,0xE0,0x07,0x87,0x01,0xE0, -0x07,0x07,0x01,0xC0,0x0F,0xF7,0x79,0xC0,0x1E,0xF7,0x7B,0xC0,0x1E,0xF7,0x7B,0x80, -0x3C,0xF7,0x7B,0xFF,0x78,0xF7,0x7B,0xFF,0xF8,0xF7,0x7F,0x9E,0xF7,0xFF,0xFF,0x9E, -0x67,0xFF,0xFF,0x9E,0x07,0x00,0x7F,0x9C,0x0F,0x00,0x0F,0x9C,0x1E,0x00,0x1F,0x9C, -0x1E,0x7F,0xFF,0xBC,0x3E,0x7F,0xF3,0xFC,0x3E,0x00,0x03,0xFC,0x7E,0x00,0x01,0xF8, -0xFE,0x00,0x01,0xF8,0xFE,0x7F,0xE1,0xF8,0xDE,0x7F,0xE1,0xF8,0x1E,0x78,0xE0,0xF0, -0x1E,0x78,0xEE,0xF0,0x1E,0x78,0xFF,0xF0,0x1E,0x78,0xFD,0xF8,0x1E,0x79,0xFB,0xFC, -0x1E,0xF1,0xF7,0xBC,0x1E,0xF0,0xEF,0x9E,0x1F,0xE0,0x0F,0x0F,0x1E,0xC0,0x1E,0x0F, -0x1E,0x00,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: Ñ© --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"Ñ©"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, -0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x78,0x03,0xC0,0x1E,0x78,0x03,0xC0,0x1E, -0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, -0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00, -0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78, -0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78, -0x00,0x00,0x00,0x78,0x3F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: µç --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"µç"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00, -0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, -0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8, -0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, -0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8, -0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, -0x78,0x07,0x80,0x0E,0x78,0x07,0x80,0x0F,0x00,0x07,0x80,0x0F,0x00,0x07,0x80,0x0F, -0x00,0x07,0x80,0x1F,0x00,0x07,0x80,0x1E,0x00,0x03,0xFF,0xFE,0x00,0x01,0xFF,0xFC, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - -/*-- ÎÄ×Ö: ×Ó --*/ -/*-- ΢ÈíÑźÚ24; ´Ë×ÖÌå϶ÔÓ¦µÄµãÕóΪ£º¿íx¸ß=32x41 --*/ -{{"×Ó"},{ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0, -0x00,0x00,0x0F,0xC0,0x00,0x00,0x1F,0x80,0x00,0x00,0x3E,0x00,0x00,0x00,0xFC,0x00, -0x00,0x01,0xF8,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, -0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, -0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, -0x00,0x03,0xE0,0x00,0x00,0x03,0xC0,0x00,0x01,0xFF,0xC0,0x00,0x00,0xFF,0x80,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00}}, - - -}; - -cFONT Font24CN = { - Font24CN_Table, - sizeof(Font24CN_Table)/sizeof(CH_CN), /*size of table*/ - 24, /* ASCII Width */ - 32, /* Width */ - 41, /* Height */ -}; - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/font8.c b/display_app/2in15_e-Paper_B/lib/Fonts/font8.c deleted file mode 100755 index 88450d98..00000000 --- a/display_app/2in15_e-Paper_B/lib/Fonts/font8.c +++ /dev/null @@ -1,1004 +0,0 @@ -/** - ****************************************************************************** - * @file Font8.c - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief This file provides text Font8 for STM32xx-EVAL's LCD driver. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2014 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "fonts.h" - -// -// Font data for Courier New 12pt -// - -const uint8_t Font8_Table[] = -{ - // @0 ' ' (5 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @8 '!' (5 pixels wide) - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x00, // - 0x20, // # - 0x00, // - 0x00, // - - // @16 '"' (5 pixels wide) - 0x50, // # # - 0x50, // # # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @24 '#' (5 pixels wide) - 0x28, // # # - 0x50, // # # - 0xF8, // ##### - 0x50, // # # - 0xF8, // ##### - 0x50, // # # - 0xA0, // # # - 0x00, // - - // @32 '$' (5 pixels wide) - 0x20, // # - 0x30, // ## - 0x60, // ## - 0x30, // ## - 0x10, // # - 0x60, // ## - 0x20, // # - 0x00, // - - // @40 '%' (5 pixels wide) - 0x20, // # - 0x20, // # - 0x18, // ## - 0x60, // ## - 0x10, // # - 0x10, // # - 0x00, // - 0x00, // - - // @48 '&' (5 pixels wide) - 0x00, // - 0x38, // ### - 0x20, // # - 0x60, // ## - 0x50, // # # - 0x78, // #### - 0x00, // - 0x00, // - - // @56 ''' (5 pixels wide) - 0x20, // # - 0x20, // # - 0x20, // # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @64 '(' (5 pixels wide) - 0x10, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x10, // # - 0x00, // - - // @72 ')' (5 pixels wide) - 0x40, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x40, // # - 0x00, // - - // @80 '*' (5 pixels wide) - 0x20, // # - 0x70, // ### - 0x20, // # - 0x50, // # # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @88 '+' (5 pixels wide) - 0x00, // - 0x20, // # - 0x20, // # - 0xF8, // ##### - 0x20, // # - 0x20, // # - 0x00, // - 0x00, // - - // @96 ',' (5 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x10, // # - 0x20, // # - 0x20, // # - 0x00, // - - // @104 '-' (5 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x70, // ### - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @112 '.' (5 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x20, // # - 0x00, // - 0x00, // - - // @120 '/' (5 pixels wide) - 0x10, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x40, // # - 0x40, // # - 0x80, // # - 0x00, // - - // @128 '0' (5 pixels wide) - 0x20, // # - 0x50, // # # - 0x50, // # # - 0x50, // # # - 0x50, // # # - 0x20, // # - 0x00, // - 0x00, // - - // @136 '1' (5 pixels wide) - 0x60, // ## - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0xF8, // ##### - 0x00, // - 0x00, // - - // @144 '2' (5 pixels wide) - 0x20, // # - 0x50, // # # - 0x20, // # - 0x20, // # - 0x40, // # - 0x70, // ### - 0x00, // - 0x00, // - - // @152 '3' (5 pixels wide) - 0x20, // # - 0x50, // # # - 0x10, // # - 0x20, // # - 0x10, // # - 0x60, // ## - 0x00, // - 0x00, // - - // @160 '4' (5 pixels wide) - 0x10, // # - 0x30, // ## - 0x50, // # # - 0x78, // #### - 0x10, // # - 0x38, // ### - 0x00, // - 0x00, // - - // @168 '5' (5 pixels wide) - 0x70, // ### - 0x40, // # - 0x60, // ## - 0x10, // # - 0x50, // # # - 0x20, // # - 0x00, // - 0x00, // - - // @176 '6' (5 pixels wide) - 0x30, // ## - 0x40, // # - 0x60, // ## - 0x50, // # # - 0x50, // # # - 0x60, // ## - 0x00, // - 0x00, // - - // @184 '7' (5 pixels wide) - 0x70, // ### - 0x50, // # # - 0x10, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x00, // - 0x00, // - - // @192 '8' (5 pixels wide) - 0x20, // # - 0x50, // # # - 0x20, // # - 0x50, // # # - 0x50, // # # - 0x20, // # - 0x00, // - 0x00, // - - // @200 '9' (5 pixels wide) - 0x30, // ## - 0x50, // # # - 0x50, // # # - 0x30, // ## - 0x10, // # - 0x60, // ## - 0x00, // - 0x00, // - - // @208 ':' (5 pixels wide) - 0x00, // - 0x00, // - 0x20, // # - 0x00, // - 0x00, // - 0x20, // # - 0x00, // - 0x00, // - - // @216 ';' (5 pixels wide) - 0x00, // - 0x00, // - 0x10, // # - 0x00, // - 0x10, // # - 0x20, // # - 0x00, // - 0x00, // - - // @224 '<' (5 pixels wide) - 0x00, // - 0x10, // # - 0x20, // # - 0xC0, // ## - 0x20, // # - 0x10, // # - 0x00, // - 0x00, // - - // @232 '=' (5 pixels wide) - 0x00, // - 0x70, // ### - 0x00, // - 0x70, // ### - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @240 '>' (5 pixels wide) - 0x00, // - 0x40, // # - 0x20, // # - 0x18, // ## - 0x20, // # - 0x40, // # - 0x00, // - 0x00, // - - // @248 '?' (5 pixels wide) - 0x20, // # - 0x50, // # # - 0x10, // # - 0x20, // # - 0x00, // - 0x20, // # - 0x00, // - 0x00, // - - // @256 '@' (5 pixels wide) - 0x30, // ## - 0x48, // # # - 0x48, // # # - 0x58, // # ## - 0x48, // # # - 0x40, // # - 0x38, // ### - 0x00, // - - // @264 'A' (5 pixels wide) - 0x60, // ## - 0x20, // # - 0x50, // # # - 0x70, // ### - 0x88, // # # - 0xD8, // ## ## - 0x00, // - 0x00, // - - // @272 'B' (5 pixels wide) - 0xF0, // #### - 0x48, // # # - 0x70, // ### - 0x48, // # # - 0x48, // # # - 0xF0, // #### - 0x00, // - 0x00, // - - // @280 'C' (5 pixels wide) - 0x70, // ### - 0x50, // # # - 0x40, // # - 0x40, // # - 0x40, // # - 0x30, // ## - 0x00, // - 0x00, // - - // @288 'D' (5 pixels wide) - 0xF0, // #### - 0x48, // # # - 0x48, // # # - 0x48, // # # - 0x48, // # # - 0xF0, // #### - 0x00, // - 0x00, // - - // @296 'E' (5 pixels wide) - 0xF8, // ##### - 0x48, // # # - 0x60, // ## - 0x40, // # - 0x48, // # # - 0xF8, // ##### - 0x00, // - 0x00, // - - // @304 'F' (5 pixels wide) - 0xF8, // ##### - 0x48, // # # - 0x60, // ## - 0x40, // # - 0x40, // # - 0xE0, // ### - 0x00, // - 0x00, // - - // @312 'G' (5 pixels wide) - 0x70, // ### - 0x40, // # - 0x40, // # - 0x58, // # ## - 0x50, // # # - 0x30, // ## - 0x00, // - 0x00, // - - // @320 'H' (5 pixels wide) - 0xE8, // ### # - 0x48, // # # - 0x78, // #### - 0x48, // # # - 0x48, // # # - 0xE8, // ### # - 0x00, // - 0x00, // - - // @328 'I' (5 pixels wide) - 0x70, // ### - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x70, // ### - 0x00, // - 0x00, // - - // @336 'J' (5 pixels wide) - 0x38, // ### - 0x10, // # - 0x10, // # - 0x50, // # # - 0x50, // # # - 0x20, // # - 0x00, // - 0x00, // - - // @344 'K' (5 pixels wide) - 0xD8, // ## ## - 0x50, // # # - 0x60, // ## - 0x70, // ### - 0x50, // # # - 0xD8, // ## ## - 0x00, // - 0x00, // - - // @352 'L' (5 pixels wide) - 0xE0, // ### - 0x40, // # - 0x40, // # - 0x40, // # - 0x48, // # # - 0xF8, // ##### - 0x00, // - 0x00, // - - // @360 'M' (5 pixels wide) - 0xD8, // ## ## - 0xD8, // ## ## - 0xD8, // ## ## - 0xA8, // # # # - 0x88, // # # - 0xD8, // ## ## - 0x00, // - 0x00, // - - // @368 'N' (5 pixels wide) - 0xD8, // ## ## - 0x68, // ## # - 0x68, // ## # - 0x58, // # ## - 0x58, // # ## - 0xE8, // ### # - 0x00, // - 0x00, // - - // @376 'O' (5 pixels wide) - 0x30, // ## - 0x48, // # # - 0x48, // # # - 0x48, // # # - 0x48, // # # - 0x30, // ## - 0x00, // - 0x00, // - - // @384 'P' (5 pixels wide) - 0xF0, // #### - 0x48, // # # - 0x48, // # # - 0x70, // ### - 0x40, // # - 0xE0, // ### - 0x00, // - 0x00, // - - // @392 'Q' (5 pixels wide) - 0x30, // ## - 0x48, // # # - 0x48, // # # - 0x48, // # # - 0x48, // # # - 0x30, // ## - 0x18, // ## - 0x00, // - - // @400 'R' (5 pixels wide) - 0xF0, // #### - 0x48, // # # - 0x48, // # # - 0x70, // ### - 0x48, // # # - 0xE8, // ### # - 0x00, // - 0x00, // - - // @408 'S' (5 pixels wide) - 0x70, // ### - 0x50, // # # - 0x20, // # - 0x10, // # - 0x50, // # # - 0x70, // ### - 0x00, // - 0x00, // - - // @416 'T' (5 pixels wide) - 0xF8, // ##### - 0xA8, // # # # - 0x20, // # - 0x20, // # - 0x20, // # - 0x70, // ### - 0x00, // - 0x00, // - - // @424 'U' (5 pixels wide) - 0xD8, // ## ## - 0x48, // # # - 0x48, // # # - 0x48, // # # - 0x48, // # # - 0x30, // ## - 0x00, // - 0x00, // - - // @432 'V' (5 pixels wide) - 0xD8, // ## ## - 0x88, // # # - 0x48, // # # - 0x50, // # # - 0x50, // # # - 0x30, // ## - 0x00, // - 0x00, // - - // @440 'W' (5 pixels wide) - 0xD8, // ## ## - 0x88, // # # - 0xA8, // # # # - 0xA8, // # # # - 0xA8, // # # # - 0x50, // # # - 0x00, // - 0x00, // - - // @448 'X' (5 pixels wide) - 0xD8, // ## ## - 0x50, // # # - 0x20, // # - 0x20, // # - 0x50, // # # - 0xD8, // ## ## - 0x00, // - 0x00, // - - // @456 'Y' (5 pixels wide) - 0xD8, // ## ## - 0x88, // # # - 0x50, // # # - 0x20, // # - 0x20, // # - 0x70, // ### - 0x00, // - 0x00, // - - // @464 'Z' (5 pixels wide) - 0x78, // #### - 0x48, // # # - 0x10, // # - 0x20, // # - 0x48, // # # - 0x78, // #### - 0x00, // - 0x00, // - - // @472 '[' (5 pixels wide) - 0x30, // ## - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x30, // ## - 0x00, // - - // @480 '\' (5 pixels wide) - 0x80, // # - 0x40, // # - 0x40, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x10, // # - 0x00, // - - // @488 ']' (5 pixels wide) - 0x60, // ## - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x60, // ## - 0x00, // - - // @496 '^' (5 pixels wide) - 0x20, // # - 0x20, // # - 0x50, // # # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @504 '_' (5 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0xF8, // ##### - - // @512 '`' (5 pixels wide) - 0x20, // # - 0x10, // # - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - 0x00, // - - // @520 'a' (5 pixels wide) - 0x00, // - 0x00, // - 0x30, // ## - 0x10, // # - 0x70, // ### - 0x78, // #### - 0x00, // - 0x00, // - - // @528 'b' (5 pixels wide) - 0xC0, // ## - 0x40, // # - 0x70, // ### - 0x48, // # # - 0x48, // # # - 0xF0, // #### - 0x00, // - 0x00, // - - // @536 'c' (5 pixels wide) - 0x00, // - 0x00, // - 0x70, // ### - 0x40, // # - 0x40, // # - 0x70, // ### - 0x00, // - 0x00, // - - // @544 'd' (5 pixels wide) - 0x18, // ## - 0x08, // # - 0x38, // ### - 0x48, // # # - 0x48, // # # - 0x38, // ### - 0x00, // - 0x00, // - - // @552 'e' (5 pixels wide) - 0x00, // - 0x00, // - 0x70, // ### - 0x70, // ### - 0x40, // # - 0x30, // ## - 0x00, // - 0x00, // - - // @560 'f' (5 pixels wide) - 0x10, // # - 0x20, // # - 0x70, // ### - 0x20, // # - 0x20, // # - 0x70, // ### - 0x00, // - 0x00, // - - // @568 'g' (5 pixels wide) - 0x00, // - 0x00, // - 0x38, // ### - 0x48, // # # - 0x48, // # # - 0x38, // ### - 0x08, // # - 0x30, // ## - - // @576 'h' (5 pixels wide) - 0xC0, // ## - 0x40, // # - 0x70, // ### - 0x48, // # # - 0x48, // # # - 0xE8, // ### # - 0x00, // - 0x00, // - - // @584 'i' (5 pixels wide) - 0x20, // # - 0x00, // - 0x60, // ## - 0x20, // # - 0x20, // # - 0x70, // ### - 0x00, // - 0x00, // - - // @592 'j' (5 pixels wide) - 0x20, // # - 0x00, // - 0x70, // ### - 0x10, // # - 0x10, // # - 0x10, // # - 0x10, // # - 0x70, // ### - - // @600 'k' (5 pixels wide) - 0xC0, // ## - 0x40, // # - 0x58, // # ## - 0x70, // ### - 0x50, // # # - 0xD8, // ## ## - 0x00, // - 0x00, // - - // @608 'l' (5 pixels wide) - 0x60, // ## - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x70, // ### - 0x00, // - 0x00, // - - // @616 'm' (5 pixels wide) - 0x00, // - 0x00, // - 0xD0, // ## # - 0xA8, // # # # - 0xA8, // # # # - 0xA8, // # # # - 0x00, // - 0x00, // - - // @624 'n' (5 pixels wide) - 0x00, // - 0x00, // - 0xF0, // #### - 0x48, // # # - 0x48, // # # - 0xC8, // ## # - 0x00, // - 0x00, // - - // @632 'o' (5 pixels wide) - 0x00, // - 0x00, // - 0x30, // ## - 0x48, // # # - 0x48, // # # - 0x30, // ## - 0x00, // - 0x00, // - - // @640 'p' (5 pixels wide) - 0x00, // - 0x00, // - 0xF0, // #### - 0x48, // # # - 0x48, // # # - 0x70, // ### - 0x40, // # - 0xE0, // ### - - // @648 'q' (5 pixels wide) - 0x00, // - 0x00, // - 0x38, // ### - 0x48, // # # - 0x48, // # # - 0x38, // ### - 0x08, // # - 0x18, // ## - - // @656 'r' (5 pixels wide) - 0x00, // - 0x00, // - 0x78, // #### - 0x20, // # - 0x20, // # - 0x70, // ### - 0x00, // - 0x00, // - - // @664 's' (5 pixels wide) - 0x00, // - 0x00, // - 0x30, // ## - 0x20, // # - 0x10, // # - 0x60, // ## - 0x00, // - 0x00, // - - // @672 't' (5 pixels wide) - 0x00, // - 0x40, // # - 0xF0, // #### - 0x40, // # - 0x48, // # # - 0x30, // ## - 0x00, // - 0x00, // - - // @680 'u' (5 pixels wide) - 0x00, // - 0x00, // - 0xD8, // ## ## - 0x48, // # # - 0x48, // # # - 0x38, // ### - 0x00, // - 0x00, // - - // @688 'v' (5 pixels wide) - 0x00, // - 0x00, // - 0xC8, // ## # - 0x48, // # # - 0x30, // ## - 0x30, // ## - 0x00, // - 0x00, // - - // @696 'w' (5 pixels wide) - 0x00, // - 0x00, // - 0xD8, // ## ## - 0xA8, // # # # - 0xA8, // # # # - 0x50, // # # - 0x00, // - 0x00, // - - // @704 'x' (5 pixels wide) - 0x00, // - 0x00, // - 0x48, // # # - 0x30, // ## - 0x30, // ## - 0x48, // # # - 0x00, // - 0x00, // - - // @712 'y' (5 pixels wide) - 0x00, // - 0x00, // - 0xD8, // ## ## - 0x50, // # # - 0x50, // # # - 0x20, // # - 0x20, // # - 0x60, // ## - - // @720 'z' (5 pixels wide) - 0x00, // - 0x00, // - 0x78, // #### - 0x50, // # # - 0x28, // # # - 0x78, // #### - 0x00, // - 0x00, // - - // @728 '{' (5 pixels wide) - 0x10, // # - 0x20, // # - 0x20, // # - 0x60, // ## - 0x20, // # - 0x20, // # - 0x10, // # - 0x00, // - - // @736 '|' (5 pixels wide) - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x20, // # - 0x00, // - - // @744 '}' (5 pixels wide) - 0x40, // # - 0x20, // # - 0x20, // # - 0x30, // ## - 0x20, // # - 0x20, // # - 0x40, // # - 0x00, // - - // @752 '~' (5 pixels wide) - 0x00, // - 0x00, // - 0x00, // - 0x28, // # # - 0x50, // # # - 0x00, // - 0x00, // - 0x00, // -}; - -sFONT Font8 = { - Font8_Table, - 5, /* Width */ - 8, /* Height */ -}; - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/Fonts/fonts.h b/display_app/2in15_e-Paper_B/lib/Fonts/fonts.h deleted file mode 100755 index c183f047..00000000 --- a/display_app/2in15_e-Paper_B/lib/Fonts/fonts.h +++ /dev/null @@ -1,97 +0,0 @@ -/** - ****************************************************************************** - * @file fonts.h - * @author MCD Application Team - * @version V1.0.0 - * @date 18-February-2014 - * @brief Header for fonts.c file - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2014 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FONTS_H -#define __FONTS_H - -/*×î´ó×ÖÌå΢ÈíÑźÚ24 (32x41) */ -#define MAX_HEIGHT_FONT 41 -#define MAX_WIDTH_FONT 32 -#define OFFSET_BITMAP - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include - -//ASCII -typedef struct _tFont -{ - const uint8_t *table; - uint16_t Width; - uint16_t Height; - -} sFONT; - - -//GB2312 -typedef struct // ºº×Ö×ÖÄ£Êý¾Ý½á¹¹ -{ - const char index[2]; // ºº×ÖÄÚÂëË÷Òý - const char matrix[MAX_HEIGHT_FONT*MAX_WIDTH_FONT/8+2]; // µãÕóÂëÊý¾Ý -}CH_CN; - - -typedef struct -{ - const CH_CN *table; - uint16_t size; - uint16_t ASCII_Width; - uint16_t Width; - uint16_t Height; - -}cFONT; - -extern sFONT Font24; -extern sFONT Font20; -extern sFONT Font16; -extern sFONT Font12; -extern sFONT Font8; - -extern cFONT Font12CN; -extern cFONT Font24CN; -#ifdef __cplusplus -} -#endif - -#endif /* __FONTS_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.c b/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.c deleted file mode 100755 index 57cd5f78..00000000 --- a/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.c +++ /dev/null @@ -1,529 +0,0 @@ -/***************************************************************************** -* | File : GUI_BMPfile.h -* | Author : Waveshare team -* | Function : Hardware underlying interface -* | Info : -* Used to shield the underlying layers of each master -* and enhance portability -*---------------- -* | This version: V2.3 -* | Date : 2022-07-27 -* | Info : -* ----------------------------------------------------------------------------- -* V2.3(2022-07-27): -* 1.Add GUI_ReadBmp_RGB_4Color() -* V2.2(2020-07-08): -* 1.Add GUI_ReadBmp_RGB_7Color() -* V2.1(2019-10-10): -* 1.Add GUI_ReadBmp_4Gray() -* V2.0(2018-11-12): -* 1.Change file name: GUI_BMP.h -> GUI_BMPfile.h -* 2.fix: GUI_ReadBmp() -* Now Xstart and Xstart can control the position of the picture normally, -* and support the display of images of any size. If it is larger than -* the actual display range, it will not be displayed. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -******************************************************************************/ - -#include "GUI_BMPfile.h" -#include "GUI_Paint.h" -#include "Debug.h" - -#include -#include -#include -#include //exit() -#include //memset() -#include //memset() -#include - -UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart) -{ - FILE *fp; //Define a file pointer - BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure - BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure - - - // Binary file open - if((fp = fopen(path, "rb")) == NULL) { - Debug("Cann't open the file!\n"); - exit(0); - } - - // Set the file pointer from the beginning - fseek(fp, 0, SEEK_SET); - fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 - fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 - printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); - - UWORD Image_Width_Byte = (bmpInfoHeader.biWidth % 8 == 0)? (bmpInfoHeader.biWidth / 8): (bmpInfoHeader.biWidth / 8 + 1); - UWORD Bmp_Width_Byte = (Image_Width_Byte % 4 == 0) ? Image_Width_Byte: ((Image_Width_Byte / 4 + 1) * 4); - UBYTE Image[Image_Width_Byte * bmpInfoHeader.biHeight]; - memset(Image, 0xFF, Image_Width_Byte * bmpInfoHeader.biHeight); - - // Determine if it is a monochrome bitmap - int readbyte = bmpInfoHeader.biBitCount; - if(readbyte != 1) { - Debug("the bmp Image is not a monochrome bitmap!\n"); - exit(0); - } - - // Determine black and white based on the palette - UWORD i; - UWORD Bcolor, Wcolor; - UWORD bmprgbquadsize = pow(2, bmpInfoHeader.biBitCount);// 2^1 = 2 - BMPRGBQUAD bmprgbquad[bmprgbquadsize]; //palette - // BMPRGBQUAD bmprgbquad[2]; //palette - - for(i = 0; i < bmprgbquadsize; i++){ - // for(i = 0; i < 2; i++) { - fread(&bmprgbquad[i], sizeof(BMPRGBQUAD), 1, fp); - } - if(bmprgbquad[0].rgbBlue == 0xff && bmprgbquad[0].rgbGreen == 0xff && bmprgbquad[0].rgbRed == 0xff) { - Bcolor = BLACK; - Wcolor = WHITE; - } else { - Bcolor = WHITE; - Wcolor = BLACK; - } - - // Read image data into the cache - UWORD x, y; - UBYTE Rdata; - fseek(fp, bmpFileHeader.bOffset, SEEK_SET); - for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column - for(x = 0; x < Bmp_Width_Byte; x++) {//Show a line in the line - if(fread((char *)&Rdata, 1, readbyte, fp) != readbyte) { - perror("get bmpdata:\r\n"); - break; - } - if(x < Image_Width_Byte) { //bmp - Image[x + (bmpInfoHeader.biHeight - y - 1) * Image_Width_Byte] = Rdata; - // printf("rdata = %d\r\n", Rdata); - } - } - } - fclose(fp); - - // Refresh the image to the display buffer based on the displayed orientation - UBYTE color, temp; - for(y = 0; y < bmpInfoHeader.biHeight; y++) { - for(x = 0; x < bmpInfoHeader.biWidth; x++) { - if(x > Paint.Width || y > Paint.Height) { - break; - } - temp = Image[(x / 8) + (y * Image_Width_Byte)]; - color = (((temp << (x%8)) & 0x80) == 0x80) ?Bcolor:Wcolor; - Paint_SetPixel(Xstart + x, Ystart + y, color); - } - } - return 0; -} -/************************************************************************* - -*************************************************************************/ -UBYTE GUI_ReadBmp_4Gray(const char *path, UWORD Xstart, UWORD Ystart) -{ - FILE *fp; //Define a file pointer - BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure - BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure - - // Binary file open - if((fp = fopen(path, "rb")) == NULL) { - Debug("Cann't open the file!\n"); - exit(0); - } - - // Set the file pointer from the beginning - fseek(fp, 0, SEEK_SET); - fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 - fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 - printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); - - UWORD Image_Width_Byte = (bmpInfoHeader.biWidth % 4 == 0)? (bmpInfoHeader.biWidth / 4): (bmpInfoHeader.biWidth / 4 + 1); - UWORD Bmp_Width_Byte = (bmpInfoHeader.biWidth % 2 == 0)? (bmpInfoHeader.biWidth / 2): (bmpInfoHeader.biWidth / 2 + 1); - UBYTE Image[Image_Width_Byte * bmpInfoHeader.biHeight * 2]; - memset(Image, 0xFF, Image_Width_Byte * bmpInfoHeader.biHeight * 2); - - // Determine if it is a monochrome bitmap - int readbyte = bmpInfoHeader.biBitCount; - printf("biBitCount = %d\r\n",readbyte); - if(readbyte != 4){ - Debug("Bmp image is not a 4-color bitmap!\n"); - exit(0); - } - // Read image data into the cache - UWORD x, y; - UBYTE Rdata; - fseek(fp, bmpFileHeader.bOffset, SEEK_SET); - - for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column - for(x = 0; x < Bmp_Width_Byte; x++) {//Show a line in the line - if(fread((char *)&Rdata, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - if(x < Image_Width_Byte*2) { //bmp - Image[x + (bmpInfoHeader.biHeight - y - 1) * Image_Width_Byte*2] = Rdata; - } - } - } - fclose(fp); - - // Refresh the image to the display buffer based on the displayed orientation - UBYTE color, temp; - printf("bmpInfoHeader.biWidth = %d\r\n",bmpInfoHeader.biWidth); - printf("bmpInfoHeader.biHeight = %d\r\n",bmpInfoHeader.biHeight); - for(y = 0; y < bmpInfoHeader.biHeight; y++) { - for(x = 0; x < bmpInfoHeader.biWidth; x++) { - if(x > Paint.Width || y > Paint.Height) { - break; - } - temp = Image[x/2 + y * bmpInfoHeader.biWidth/2] >> ((x%2)? 0:4);//0xf 0x8 0x7 0x0 - color = temp>>2; //11 10 01 00 - Paint_SetPixel(Xstart + x, Ystart + y, color); - } - } - return 0; -} - -UBYTE GUI_ReadBmp_16Gray(const char *path, UWORD Xstart, UWORD Ystart) -{ - FILE *fp; //Define a file pointer - BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure - BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure - - // Binary file open - if((fp = fopen(path, "rb")) == NULL) { - Debug("Cann't open the file!\n"); - exit(0); - } - - // Set the file pointer from the beginning - fseek(fp, 0, SEEK_SET); - fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 - fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 - printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); - - // They are both the same width in bytes - // round up to the next byte - UWORD Width_Byte = (bmpInfoHeader.biWidth + 1) / 2; - UBYTE Image[Width_Byte * bmpInfoHeader.biHeight]; - memset(Image, 0xFF, Width_Byte * bmpInfoHeader.biHeight); - - // Determine if it is a monochrome bitmap - int readbyte = bmpInfoHeader.biBitCount; - printf("biBitCount = %d\r\n",readbyte); - if(readbyte != 4) { - Debug("Bmp image is not a 4-bit bitmap!\n"); - exit(0); - } - - // Determine colors based on the palette - - // A map from palette entry to color - UBYTE colors[16]; - UBYTE i; - BMPRGBQUAD rgbData; - - for (i = 0; i < 16; i++){ - fread(&rgbData, sizeof(BMPRGBQUAD), 1, fp); - - // Work out the closest colour - // 16 colours over 0-255 => 0-8 => 0, 9-25 => 1 (17), 26-42 => 2 (34), etc - - // Base it on red - colors[i] = (rgbData.rgbRed + 8) / 17; - } - - // Read image data into the cache - UWORD x, y; - UBYTE Rdata; - fseek(fp, bmpFileHeader.bOffset, SEEK_SET); - - for (y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column - for (x = 0; x < Width_Byte; x++) {//Show a line in the line - if (fread((char *) &Rdata, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - Image[x + (bmpInfoHeader.biHeight - y - 1) * Width_Byte] = Rdata; - } - } - fclose(fp); - - // Refresh the image to the display buffer based on the displayed orientation - UBYTE coloridx; - printf("bmpInfoHeader.biWidth = %d\r\n", bmpInfoHeader.biWidth); - printf("bmpInfoHeader.biHeight = %d\r\n", bmpInfoHeader.biHeight); - for (y = 0; y < bmpInfoHeader.biHeight; y++) { - for (x = 0; x < bmpInfoHeader.biWidth; x++) { - if (Xstart + x > Paint.Width || Ystart + y > Paint.Height) - break; - - coloridx = (Image[x / 2 + y * Width_Byte] >> ((x % 2) ? 0 : 4)) & 15; - Paint_SetPixel(Xstart + x, Ystart + y, colors[coloridx]); - } - } - return 0; -} - -UBYTE GUI_ReadBmp_RGB_7Color(const char *path, UWORD Xstart, UWORD Ystart) -{ - FILE *fp; //Define a file pointer - BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure - BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure - - // Binary file open - if((fp = fopen(path, "rb")) == NULL) { - Debug("Cann't open the file!\n"); - exit(0); - } - - // Set the file pointer from the beginning - fseek(fp, 0, SEEK_SET); - fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 - fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 - printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); - - UDOUBLE Image_Byte = bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3; - UBYTE Image[Image_Byte]; - memset(Image, 0xFF, Image_Byte); - - // Determine if it is a monochrome bitmap - int readbyte = bmpInfoHeader.biBitCount; - if(readbyte != 24){ - Debug("Bmp image is not 24 bitmap!\n"); - exit(0); - } - // Read image data into the cache - UWORD x, y; - UBYTE Rdata[3]; - fseek(fp, bmpFileHeader.bOffset, SEEK_SET); - - for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column - for(x = 0; x < bmpInfoHeader.biWidth ; x++) {//Show a line in the line - if(fread((char *)Rdata, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - if(fread((char *)Rdata+1, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - if(fread((char *)Rdata+2, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - - if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 0){ - Image[x+(y* bmpInfoHeader.biWidth )] = 0;//Black - }else if(Rdata[0] == 255 && Rdata[1] == 255 && Rdata[2] == 255){ - Image[x+(y* bmpInfoHeader.biWidth )] = 1;//White - }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 0){ - Image[x+(y* bmpInfoHeader.biWidth )] = 2;//Green - }else if(Rdata[0] == 255 && Rdata[1] == 0 && Rdata[2] == 0){ - Image[x+(y* bmpInfoHeader.biWidth )] = 3;//Blue - }else if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 255){ - Image[x+(y* bmpInfoHeader.biWidth )] = 4;//Red - }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 255){ - Image[x+(y* bmpInfoHeader.biWidth )] = 5;//Yellow - }else if(Rdata[0] == 0 && Rdata[1] == 128 && Rdata[2] == 255){ - Image[x+(y* bmpInfoHeader.biWidth )] = 6;//Orange - } - } - } - fclose(fp); - - // Refresh the image to the display buffer based on the displayed orientation - for(y = 0; y < bmpInfoHeader.biHeight; y++) { - for(x = 0; x < bmpInfoHeader.biWidth; x++) { - if(x > Paint.Width || y > Paint.Height) { - break; - } - Paint_SetPixel(Xstart + x, Ystart + y, Image[bmpInfoHeader.biHeight * bmpInfoHeader.biWidth - 1 -(bmpInfoHeader.biWidth-x-1+(y* bmpInfoHeader.biWidth))]); - } - } - return 0; -} - -UBYTE GUI_ReadBmp_RGB_4Color(const char *path, UWORD Xstart, UWORD Ystart) -{ - FILE *fp; //Define a file pointer - BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure - BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure - - // Binary file open - if((fp = fopen(path, "rb")) == NULL) { - Debug("Cann't open the file!\n"); - exit(0); - } - - // Set the file pointer from the beginning - fseek(fp, 0, SEEK_SET); - fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 - fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 - printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); - - UDOUBLE Image_Byte = bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3; - UBYTE Image[Image_Byte]; - memset(Image, 0xFF, Image_Byte); - - // Determine if it is a monochrome bitmap - int readbyte = bmpInfoHeader.biBitCount; - if(readbyte != 24){ - Debug("Bmp image is not 24 bitmap!\n"); - exit(0); - } - // Read image data into the cache - UWORD x, y; - UBYTE Rdata[3]; - fseek(fp, bmpFileHeader.bOffset, SEEK_SET); - - for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column - for(x = 0; x < bmpInfoHeader.biWidth ; x++) {//Show a line in the line - if(fread((char *)Rdata, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - if(fread((char *)Rdata+1, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - if(fread((char *)Rdata+2, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - if(Rdata[0] < 128 && Rdata[1] < 128 && Rdata[2] < 128){ - Image[x+(y* bmpInfoHeader.biWidth )] = 0;//Black - }else if(Rdata[0] > 127 && Rdata[1] > 127 && Rdata[2] > 127){ - Image[x+(y* bmpInfoHeader.biWidth )] = 1;//White - }else if(Rdata[0] < 128 && Rdata[1] > 127 && Rdata[2] > 127){ - Image[x+(y* bmpInfoHeader.biWidth )] = 2;//Yellow - }else if(Rdata[0] < 128 && Rdata[1] < 128 && Rdata[2] > 127){ - Image[x+(y* bmpInfoHeader.biWidth )] = 3;//Red - } - } - if(bmpInfoHeader.biWidth % 4 != 0) - { - for (UWORD i = 0; i < (bmpInfoHeader.biWidth % 4); i++) - { - if(fread((char *)Rdata, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - } - } - } - fclose(fp); - - // Refresh the image to the display buffer based on the displayed orientation - for(y = 0; y < bmpInfoHeader.biHeight; y++) { - for(x = 0; x < bmpInfoHeader.biWidth; x++) { - if(x > Paint.Width || y > Paint.Height) { - break; - } - Paint_SetPixel(Xstart + x, Ystart + y, Image[bmpInfoHeader.biHeight * bmpInfoHeader.biWidth - 1 -(bmpInfoHeader.biWidth-x-1+(y* bmpInfoHeader.biWidth))]); - } - } - return 0; -} - -UBYTE GUI_ReadBmp_RGB_6Color(const char *path, UWORD Xstart, UWORD Ystart) -{ - FILE *fp; //Define a file pointer - BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure - BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure - - // Binary file open - if((fp = fopen(path, "rb")) == NULL) { - Debug("Cann't open the file!\n"); - exit(0); - } - - // Set the file pointer from the beginning - fseek(fp, 0, SEEK_SET); - fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 - fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 - printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); - - UDOUBLE Image_Byte = bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3; - UBYTE Image[Image_Byte]; - memset(Image, 0xFF, Image_Byte); - - // Determine if it is a monochrome bitmap - int readbyte = bmpInfoHeader.biBitCount; - if(readbyte != 24){ - Debug("Bmp image is not 24 bitmap!\n"); - exit(0); - } - // Read image data into the cache - UWORD x, y; - UBYTE Rdata[3]; - fseek(fp, bmpFileHeader.bOffset, SEEK_SET); - - for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column - for(x = 0; x < bmpInfoHeader.biWidth ; x++) {//Show a line in the line - if(fread((char *)Rdata, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - if(fread((char *)Rdata+1, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - if(fread((char *)Rdata+2, 1, 1, fp) != 1) { - perror("get bmpdata:\r\n"); - break; - } - - if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 0){ - Image[x+(y* bmpInfoHeader.biWidth )] = 0;//Black - }else if(Rdata[0] == 255 && Rdata[1] == 255 && Rdata[2] == 255){ - Image[x+(y* bmpInfoHeader.biWidth )] = 1;//White - }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 255){ - Image[x+(y* bmpInfoHeader.biWidth )] = 2;//Yellow - }else if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 255){ - Image[x+(y* bmpInfoHeader.biWidth )] = 3;//Red - // }else if(Rdata[0] == 0 && Rdata[1] == 128 && Rdata[2] == 255){ - // Image[x+(y* bmpInfoHeader.biWidth )] = 4;//Orange - }else if(Rdata[0] == 255 && Rdata[1] == 0 && Rdata[2] == 0){ - Image[x+(y* bmpInfoHeader.biWidth )] = 5;//Blue - }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 0){ - Image[x+(y* bmpInfoHeader.biWidth )] = 6;//Green - } - - } - } - fclose(fp); - - // Refresh the image to the display buffer based on the displayed orientation - for(y = 0; y < bmpInfoHeader.biHeight; y++) { - for(x = 0; x < bmpInfoHeader.biWidth; x++) { - if(x > Paint.Width || y > Paint.Height) { - break; - } - Paint_SetPixel(Xstart + x, Ystart + y, Image[bmpInfoHeader.biHeight * bmpInfoHeader.biWidth - 1 -(bmpInfoHeader.biWidth-x-1+(y* bmpInfoHeader.biWidth))]); - } - } - return 0; -} - diff --git a/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.h b/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.h deleted file mode 100755 index 8c110f93..00000000 --- a/display_app/2in15_e-Paper_B/lib/GUI/GUI_BMPfile.h +++ /dev/null @@ -1,94 +0,0 @@ -/***************************************************************************** -* | File : GUI_BMPfile.h -* | Author : Waveshare team -* | Function : Hardware underlying interface -* | Info : -* Used to shield the underlying layers of each master -* and enhance portability -*---------------- -* | This version: V2.3 -* | Date : 2020-07-27 -* | Info : -* ----------------------------------------------------------------------------- -* V2.3(2022-07-27): -* 1.Add GUI_ReadBmp_RGB_4Color() -* V2.2(2020-07-08): -* 1.Add GUI_ReadBmp_RGB_7Color() -* V2.1(2019-10-10): -* 1.Add GUI_ReadBmp_4Gray() -* V2.0(2018-11-12): -* 1.Change file name: GUI_BMP.h -> GUI_BMPfile.h -* 2.fix: GUI_ReadBmp() -* Now Xstart and Xstart can control the position of the picture normally, -* and support the display of images of any size. If it is larger than -* the actual display range, it will not be displayed. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -******************************************************************************/ -#ifndef __GUI_BMPFILE_H -#define __GUI_BMPFILE_H - -#include -#include -#include -#include - -#include "DEV_Config.h" - -/*Bitmap file header 14bit*/ -typedef struct BMP_FILE_HEADER { - UWORD bType; //File identifier - UDOUBLE bSize; //The size of the file - UWORD bReserved1; //Reserved value, must be set to 0 - UWORD bReserved2; //Reserved value, must be set to 0 - UDOUBLE bOffset; //The offset from the beginning of the file header to the beginning of the image data bit -} __attribute__ ((packed)) BMPFILEHEADER; // 14bit - -/*Bitmap information header 40bit*/ -typedef struct BMP_INFO { - UDOUBLE biInfoSize; //The size of the header - UDOUBLE biWidth; //The width of the image - UDOUBLE biHeight; //The height of the image - UWORD biPlanes; //The number of planes in the image - UWORD biBitCount; //The number of bits per pixel - UDOUBLE biCompression; //Compression type - UDOUBLE bimpImageSize; //The size of the image, in bytes - UDOUBLE biXPelsPerMeter; //Horizontal resolution - UDOUBLE biYPelsPerMeter; //Vertical resolution - UDOUBLE biClrUsed; //The number of colors used - UDOUBLE biClrImportant; //The number of important colors -} __attribute__ ((packed)) BMPINFOHEADER; - -/*Color table: palette */ -typedef struct RGB_QUAD { - UBYTE rgbBlue; //Blue intensity - UBYTE rgbGreen; //Green strength - UBYTE rgbRed; //Red intensity - UBYTE rgbReversed; //Reserved value -} __attribute__ ((packed)) BMPRGBQUAD; -/**************************************** end ***********************************************/ - -UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart); -UBYTE GUI_ReadBmp_4Gray(const char *path, UWORD Xstart, UWORD Ystart); -UBYTE GUI_ReadBmp_16Gray(const char *path, UWORD Xstart, UWORD Ystart); -UBYTE GUI_ReadBmp_RGB_4Color(const char *path, UWORD Xstart, UWORD Ystart); -UBYTE GUI_ReadBmp_RGB_6Color(const char *path, UWORD Xstart, UWORD Ystart); -UBYTE GUI_ReadBmp_RGB_7Color(const char *path, UWORD Xstart, UWORD Ystart); -#endif diff --git a/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.c b/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.c deleted file mode 100755 index 672b716c..00000000 --- a/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.c +++ /dev/null @@ -1,847 +0,0 @@ -/****************************************************************************** -* | File : GUI_Paint.c -* | Author : Waveshare electronics -* | Function : Achieve drawing: draw points, lines, boxes, circles and -* their size, solid dotted line, solid rectangle hollow -* rectangle, solid circle hollow circle. -* | Info : -* Achieve display characters: Display a single character, string, number -* Achieve time display: adaptive size display time minutes and seconds -*---------------- -* | This version: V3.2 -* | Date : 2020-07-10 -* | Info : -* ----------------------------------------------------------------------------- -* V3.2(2020-07-10): -* 1.Change: Paint_SetScale(UBYTE scale) -* Add scale 7 for 5.65f e-Parper -* 2.Change: Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) -* Add the branch for scale 7 -* 3.Change: Paint_Clear(UWORD Color) -* Add the branch for scale 7 -* ----------------------------------------------------------------------------- -* V3.1(2019-10-10): -* 1. Add gray level -* PAINT Add Scale -* 2. Add void Paint_SetScale(UBYTE scale); -* ----------------------------------------------------------------------------- -* V3.0(2019-04-18): -* 1.Change: -* Paint_DrawPoint(..., DOT_STYLE DOT_STYLE) -* => Paint_DrawPoint(..., DOT_STYLE Dot_Style) -* Paint_DrawLine(..., LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel) -* => Paint_DrawLine(..., DOT_PIXEL Line_width, LINE_STYLE Line_Style) -* Paint_DrawRectangle(..., DRAW_FILL Filled, DOT_PIXEL Dot_Pixel) -* => Paint_DrawRectangle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) -* Paint_DrawCircle(..., DRAW_FILL Draw_Fill, DOT_PIXEL Dot_Pixel) -* => Paint_DrawCircle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Filll) -* -* ----------------------------------------------------------------------------- -* V2.0(2018-11-15): -* 1.add: Paint_NewImage() -* Create an image's properties -* 2.add: Paint_SelectImage() -* Select the picture to be drawn -* 3.add: Paint_SetRotate() -* Set the direction of the cache -* 4.add: Paint_RotateImage() -* Can flip the picture, Support 0-360 degrees, -* but only 90.180.270 rotation is better -* 4.add: Paint_SetMirroring() -* Can Mirroring the picture, horizontal, vertical, origin -* 5.add: Paint_DrawString_CN() -* Can display Chinese(GB1312) -* -* ----------------------------------------------------------------------------- -* V1.0(2018-07-17): -* Create library -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documnetation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is -* furished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in -* all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -* THE SOFTWARE. -* -******************************************************************************/ -#include "GUI_Paint.h" -#include "DEV_Config.h" -#include "Debug.h" -#include -#include -#include //memset() -#include - -PAINT Paint; - -/****************************************************************************** -function: Create Image -parameter: - image : Pointer to the image cache - width : The width of the picture - Height : The height of the picture - Color : Whether the picture is inverted -******************************************************************************/ -void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color) -{ - Paint.Image = NULL; - Paint.Image = image; - - Paint.WidthMemory = Width; - Paint.HeightMemory = Height; - Paint.Color = Color; - Paint.Scale = 2; - Paint.WidthByte = (Width % 8 == 0)? (Width / 8 ): (Width / 8 + 1); - Paint.HeightByte = Height; -// printf("WidthByte = %d, HeightByte = %d\r\n", Paint.WidthByte, Paint.HeightByte); -// printf(" EPD_WIDTH / 8 = %d\r\n", 122 / 8); - - Paint.Rotate = Rotate; - Paint.Mirror = MIRROR_NONE; - - if(Rotate == ROTATE_0 || Rotate == ROTATE_180) { - Paint.Width = Width; - Paint.Height = Height; - } else { - Paint.Width = Height; - Paint.Height = Width; - } -} - -/****************************************************************************** -function: Select Image -parameter: - image : Pointer to the image cache -******************************************************************************/ -void Paint_SelectImage(UBYTE *image) -{ - Paint.Image = image; -} - -/****************************************************************************** -function: Select Image Rotate -parameter: - Rotate : 0,90,180,270 -******************************************************************************/ -void Paint_SetRotate(UWORD Rotate) -{ - if(Rotate == ROTATE_0 || Rotate == ROTATE_90 || Rotate == ROTATE_180 || Rotate == ROTATE_270) { - Debug("Set image Rotate %d\r\n", Rotate); - Paint.Rotate = Rotate; - } else { - Debug("rotate = 0, 90, 180, 270\r\n"); - } -} - -/****************************************************************************** -function: Select Image mirror -parameter: - mirror :Not mirror,Horizontal mirror,Vertical mirror,Origin mirror -******************************************************************************/ -void Paint_SetMirroring(UBYTE mirror) -{ - if(mirror == MIRROR_NONE || mirror == MIRROR_HORIZONTAL || - mirror == MIRROR_VERTICAL || mirror == MIRROR_ORIGIN) { - Debug("mirror image x:%s, y:%s\r\n",(mirror & 0x01)? "mirror":"none", ((mirror >> 1) & 0x01)? "mirror":"none"); - Paint.Mirror = mirror; - } else { - Debug("mirror should be MIRROR_NONE, MIRROR_HORIZONTAL, \ - MIRROR_VERTICAL or MIRROR_ORIGIN\r\n"); - } -} - -void Paint_SetScale(UBYTE scale) -{ - if(scale == 2){ - Paint.Scale = scale; - Paint.WidthByte = (Paint.WidthMemory % 8 == 0)? (Paint.WidthMemory / 8 ): (Paint.WidthMemory / 8 + 1); - }else if(scale == 4){ - Paint.Scale = scale; - Paint.WidthByte = (Paint.WidthMemory % 4 == 0)? (Paint.WidthMemory / 4 ): (Paint.WidthMemory / 4 + 1); - }else if(scale == 6 || scale == 7 || scale == 16){ - /* 7 colours are only applicable with 5in65 e-Paper */ - /* 16 colours are used for dithering */ - Paint.Scale = scale; - Paint.WidthByte = (Paint.WidthMemory % 2 == 0)? (Paint.WidthMemory / 2 ): (Paint.WidthMemory / 2 + 1);; - }else{ - Debug("Set Scale Input parameter error\r\n"); - Debug("Scale Only support: 2 4 7 16\r\n"); - } -} -/****************************************************************************** -function: Draw Pixels -parameter: - Xpoint : At point X - Ypoint : At point Y - Color : Painted colors -******************************************************************************/ -void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) -{ - if(Xpoint > Paint.Width || Ypoint > Paint.Height){ - Debug("Exceeding display boundaries\r\n"); - return; - } - UWORD X, Y; - switch(Paint.Rotate) { - case 0: - X = Xpoint; - Y = Ypoint; - break; - case 90: - X = Paint.WidthMemory - Ypoint - 1; - Y = Xpoint; - break; - case 180: - X = Paint.WidthMemory - Xpoint - 1; - Y = Paint.HeightMemory - Ypoint - 1; - break; - case 270: - X = Ypoint; - Y = Paint.HeightMemory - Xpoint - 1; - break; - default: - return; - } - - switch(Paint.Mirror) { - case MIRROR_NONE: - break; - case MIRROR_HORIZONTAL: - X = Paint.WidthMemory - X - 1; - break; - case MIRROR_VERTICAL: - Y = Paint.HeightMemory - Y - 1; - break; - case MIRROR_ORIGIN: - X = Paint.WidthMemory - X - 1; - Y = Paint.HeightMemory - Y - 1; - break; - default: - return; - } - - if(X > Paint.WidthMemory || Y > Paint.HeightMemory){ - Debug("Exceeding display boundaries\r\n"); - return; - } - - if(Paint.Scale == 2){ - UDOUBLE Addr = X / 8 + Y * Paint.WidthByte; - UBYTE Rdata = Paint.Image[Addr]; - if(Color == BLACK) - Paint.Image[Addr] = Rdata & ~(0x80 >> (X % 8)); - else - Paint.Image[Addr] = Rdata | (0x80 >> (X % 8)); - }else if(Paint.Scale == 4){ - UDOUBLE Addr = X / 4 + Y * Paint.WidthByte; - Color = Color % 4;//Guaranteed color scale is 4 --- 0~3 - UBYTE Rdata = Paint.Image[Addr]; - Rdata = Rdata & (~(0xC0 >> ((X % 4)*2)));//Clear first, then set value - Paint.Image[Addr] = Rdata | ((Color << 6) >> ((X % 4)*2)); - }else if(Paint.Scale == 6 || Paint.Scale == 7 || Paint.Scale == 16){ - UDOUBLE Addr = X / 2 + Y * Paint.WidthByte; - UBYTE Rdata = Paint.Image[Addr]; - Rdata = Rdata & (~(0xF0 >> ((X % 2)*4)));//Clear first, then set value - Paint.Image[Addr] = Rdata | ((Color << 4) >> ((X % 2)*4)); - // printf("Add = %d ,data = %d\r\n",Addr,Rdata); - } -} - -/****************************************************************************** -function: Clear the color of the picture -parameter: - Color : Painted colors -******************************************************************************/ -void Paint_Clear(UWORD Color) -{ - if(Paint.Scale == 2) { - for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { - for (UWORD X = 0; X < Paint.WidthByte; X++ ) {//8 pixel = 1 byte - UDOUBLE Addr = X + Y*Paint.WidthByte; - Paint.Image[Addr] = Color; - } - } - }else if(Paint.Scale == 4) { - for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { - for (UWORD X = 0; X < Paint.WidthByte; X++ ) { - UDOUBLE Addr = X + Y*Paint.WidthByte; - Paint.Image[Addr] = (Color<<6)|(Color<<4)|(Color<<2)|Color; - } - } - }else if(Paint.Scale == 6 || Paint.Scale == 7 || Paint.Scale == 16) { - for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { - for (UWORD X = 0; X < Paint.WidthByte; X++ ) { - UDOUBLE Addr = X + Y*Paint.WidthByte; - Paint.Image[Addr] = (Color<<4)|Color; - } - } - } -} - -/****************************************************************************** -function: Clear the color of a window -parameter: - Xstart : x starting point - Ystart : Y starting point - Xend : x end point - Yend : y end point - Color : Painted colors -******************************************************************************/ -void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color) -{ - UWORD X, Y; - for (Y = Ystart; Y < Yend; Y++) { - for (X = Xstart; X < Xend; X++) {//8 pixel = 1 byte - Paint_SetPixel(X, Y, Color); - } - } -} - -/****************************************************************************** -function: Draw Point(Xpoint, Ypoint) Fill the color -parameter: - Xpoint : The Xpoint coordinate of the point - Ypoint : The Ypoint coordinate of the point - Color : Painted color - Dot_Pixel : point size - Dot_Style : point Style -******************************************************************************/ -void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, - DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style) -{ - if (Xpoint > Paint.Width || Ypoint > Paint.Height) { - Debug("Paint_DrawPoint Input exceeds the normal display range\r\n"); - return; - } - - int16_t XDir_Num , YDir_Num; - if (Dot_Style == DOT_FILL_AROUND) { - for (XDir_Num = 0; XDir_Num < 2 * Dot_Pixel - 1; XDir_Num++) { - for (YDir_Num = 0; YDir_Num < 2 * Dot_Pixel - 1; YDir_Num++) { - if(Xpoint + XDir_Num - Dot_Pixel < 0 || Ypoint + YDir_Num - Dot_Pixel < 0) - break; - // printf("x = %d, y = %d\r\n", Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel); - Paint_SetPixel(Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel, Color); - } - } - } else { - for (XDir_Num = 0; XDir_Num < Dot_Pixel; XDir_Num++) { - for (YDir_Num = 0; YDir_Num < Dot_Pixel; YDir_Num++) { - Paint_SetPixel(Xpoint + XDir_Num - 1, Ypoint + YDir_Num - 1, Color); - } - } - } -} - -/****************************************************************************** -function: Draw a line of arbitrary slope -parameter: - Xstart :Starting Xpoint point coordinates - Ystart :Starting Xpoint point coordinates - Xend :End point Xpoint coordinate - Yend :End point Ypoint coordinate - Color :The color of the line segment - Line_width : Line width - Line_Style: Solid and dotted lines -******************************************************************************/ -void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, - UWORD Color, DOT_PIXEL Line_width, LINE_STYLE Line_Style) -{ - if (Xstart > Paint.Width || Ystart > Paint.Height || - Xend > Paint.Width || Yend > Paint.Height) { - Debug("Paint_DrawLine Input exceeds the normal display range\r\n"); - return; - } - - UWORD Xpoint = Xstart; - UWORD Ypoint = Ystart; - int dx = (int)Xend - (int)Xstart >= 0 ? Xend - Xstart : Xstart - Xend; - int dy = (int)Yend - (int)Ystart <= 0 ? Yend - Ystart : Ystart - Yend; - - // Increment direction, 1 is positive, -1 is counter; - int XAddway = Xstart < Xend ? 1 : -1; - int YAddway = Ystart < Yend ? 1 : -1; - - //Cumulative error - int Esp = dx + dy; - char Dotted_Len = 0; - - for (;;) { - Dotted_Len++; - //Painted dotted line, 2 point is really virtual - if (Line_Style == LINE_STYLE_DOTTED && Dotted_Len % 3 == 0) { - //Debug("LINE_DOTTED\r\n"); - Paint_DrawPoint(Xpoint, Ypoint, IMAGE_BACKGROUND, Line_width, DOT_STYLE_DFT); - Dotted_Len = 0; - } else { - Paint_DrawPoint(Xpoint, Ypoint, Color, Line_width, DOT_STYLE_DFT); - } - if (2 * Esp >= dy) { - if (Xpoint == Xend) - break; - Esp += dy; - Xpoint += XAddway; - } - if (2 * Esp <= dx) { - if (Ypoint == Yend) - break; - Esp += dx; - Ypoint += YAddway; - } - } -} - -/****************************************************************************** -function: Draw a rectangle -parameter: - Xstart :Rectangular Starting Xpoint point coordinates - Ystart :Rectangular Starting Xpoint point coordinates - Xend :Rectangular End point Xpoint coordinate - Yend :Rectangular End point Ypoint coordinate - Color :The color of the Rectangular segment - Line_width: Line width - Draw_Fill : Whether to fill the inside of the rectangle -******************************************************************************/ -void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, - UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) -{ - if (Xstart > Paint.Width || Ystart > Paint.Height || - Xend > Paint.Width || Yend > Paint.Height) { - Debug("Input exceeds the normal display range\r\n"); - return; - } - - if (Draw_Fill) { - UWORD Ypoint; - for(Ypoint = Ystart; Ypoint < Yend; Ypoint++) { - Paint_DrawLine(Xstart, Ypoint, Xend, Ypoint, Color , Line_width, LINE_STYLE_SOLID); - } - } else { - Paint_DrawLine(Xstart, Ystart, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID); - Paint_DrawLine(Xstart, Ystart, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID); - Paint_DrawLine(Xend, Yend, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID); - Paint_DrawLine(Xend, Yend, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID); - } -} - -/****************************************************************************** -function: Use the 8-point method to draw a circle of the - specified size at the specified position-> -parameter: - X_Center :Center X coordinate - Y_Center :Center Y coordinate - Radius :circle Radius - Color :The color of the :circle segment - Line_width: Line width - Draw_Fill : Whether to fill the inside of the Circle -******************************************************************************/ -void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, - UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) -{ - if (X_Center > Paint.Width || Y_Center >= Paint.Height) { - Debug("Paint_DrawCircle Input exceeds the normal display range\r\n"); - return; - } - - //Draw a circle from(0, R) as a starting point - int16_t XCurrent, YCurrent; - XCurrent = 0; - YCurrent = Radius; - - //Cumulative error,judge the next point of the logo - int16_t Esp = 3 - (Radius << 1 ); - - int16_t sCountY; - if (Draw_Fill == DRAW_FILL_FULL) { - while (XCurrent <= YCurrent ) { //Realistic circles - for (sCountY = XCurrent; sCountY <= YCurrent; sCountY ++ ) { - Paint_DrawPoint(X_Center + XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//1 - Paint_DrawPoint(X_Center - XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//2 - Paint_DrawPoint(X_Center - sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//3 - Paint_DrawPoint(X_Center - sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//4 - Paint_DrawPoint(X_Center - XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//5 - Paint_DrawPoint(X_Center + XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//6 - Paint_DrawPoint(X_Center + sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//7 - Paint_DrawPoint(X_Center + sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT); - } - if (Esp < 0 ) - Esp += 4 * XCurrent + 6; - else { - Esp += 10 + 4 * (XCurrent - YCurrent ); - YCurrent --; - } - XCurrent ++; - } - } else { //Draw a hollow circle - while (XCurrent <= YCurrent ) { - Paint_DrawPoint(X_Center + XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//1 - Paint_DrawPoint(X_Center - XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//2 - Paint_DrawPoint(X_Center - YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//3 - Paint_DrawPoint(X_Center - YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//4 - Paint_DrawPoint(X_Center - XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//5 - Paint_DrawPoint(X_Center + XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//6 - Paint_DrawPoint(X_Center + YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//7 - Paint_DrawPoint(X_Center + YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//0 - - if (Esp < 0 ) - Esp += 4 * XCurrent + 6; - else { - Esp += 10 + 4 * (XCurrent - YCurrent ); - YCurrent --; - } - XCurrent ++; - } - } -} - -/****************************************************************************** -function: Show English characters -parameter: - Xpoint :X coordinate - Ypoint :Y coordinate - Acsii_Char :To display the English characters - Font :A structure pointer that displays a character size - Color_Foreground : Select the foreground color - Color_Background : Select the background color -******************************************************************************/ -void Paint_DrawChar(UWORD Xpoint, UWORD Ypoint, const char Acsii_Char, - sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) -{ - UWORD Page, Column; - - if (Xpoint > Paint.Width || Ypoint > Paint.Height) { - Debug("Paint_DrawChar Input exceeds the normal display range\r\n"); - return; - } - - uint32_t Char_Offset = (Acsii_Char - ' ') * Font->Height * (Font->Width / 8 + (Font->Width % 8 ? 1 : 0)); - const unsigned char *ptr = &Font->table[Char_Offset]; - - for (Page = 0; Page < Font->Height; Page ++ ) { - for (Column = 0; Column < Font->Width; Column ++ ) { - - //To determine whether the font background color and screen background color is consistent - if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan - if (*ptr & (0x80 >> (Column % 8))) - Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground); - // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); - } else { - if (*ptr & (0x80 >> (Column % 8))) { - Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground); - // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); - } else { - Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Background); - // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); - } - } - //One pixel is 8 bits - if (Column % 8 == 7) - ptr++; - }// Write a line - if (Font->Width % 8 != 0) - ptr++; - }// Write all -} - -/****************************************************************************** -function: Display the string -parameter: - Xstart :X coordinate - Ystart :Y coordinate - pString :The first address of the English string to be displayed - Font :A structure pointer that displays a character size - Color_Foreground : Select the foreground color - Color_Background : Select the background color -******************************************************************************/ -void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, - sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) -{ - UWORD Xpoint = Xstart; - UWORD Ypoint = Ystart; - - if (Xstart > Paint.Width || Ystart > Paint.Height) { - Debug("Paint_DrawString_EN Input exceeds the normal display range\r\n"); - return; - } - - while (* pString != '\0') { - //if X direction filled , reposition to(Xstart,Ypoint),Ypoint is Y direction plus the Height of the character - if ((Xpoint + Font->Width ) > Paint.Width ) { - Xpoint = Xstart; - Ypoint += Font->Height; - } - - // If the Y direction is full, reposition to(Xstart, Ystart) - if ((Ypoint + Font->Height ) > Paint.Height ) { - Xpoint = Xstart; - Ypoint = Ystart; - } - Paint_DrawChar(Xpoint, Ypoint, * pString, Font, Color_Background, Color_Foreground); - - //The next character of the address - pString ++; - - //The next word of the abscissa increases the font of the broadband - Xpoint += Font->Width; - } -} - - -/****************************************************************************** -function: Display the string -parameter: - Xstart :X coordinate - Ystart :Y coordinate - pString :The first address of the Chinese string and English - string to be displayed - Font :A structure pointer that displays a character size - Color_Foreground : Select the foreground color - Color_Background : Select the background color -******************************************************************************/ -void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, - UWORD Color_Foreground, UWORD Color_Background) -{ - const char* p_text = pString; - int x = Xstart, y = Ystart; - int i, j,Num; - - /* Send the string character by character on EPD */ - while (*p_text != 0) { - if(*p_text <= 0x7F) { //ASCII < 126 - for(Num = 0; Num < font->size; Num++) { - if(*p_text== font->table[Num].index[0]) { - const char* ptr = &font->table[Num].matrix[0]; - - for (j = 0; j < font->Height; j++) { - for (i = 0; i < font->Width; i++) { - if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan - if (*ptr & (0x80 >> (i % 8))) { - Paint_SetPixel(x + i, y + j, Color_Foreground); - // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); - } - } else { - if (*ptr & (0x80 >> (i % 8))) { - Paint_SetPixel(x + i, y + j, Color_Foreground); - // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); - } else { - Paint_SetPixel(x + i, y + j, Color_Background); - // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); - } - } - if (i % 8 == 7) { - ptr++; - } - } - if (font->Width % 8 != 0) { - ptr++; - } - } - break; - } - } - /* Point on the next character */ - p_text += 1; - /* Decrement the column position by 16 */ - x += font->ASCII_Width; - } else { //Chinese - for(Num = 0; Num < font->size; Num++) { - if((*p_text== font->table[Num].index[0]) && (*(p_text+1) == font->table[Num].index[1])) { - const char* ptr = &font->table[Num].matrix[0]; - - for (j = 0; j < font->Height; j++) { - for (i = 0; i < font->Width; i++) { - if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan - if (*ptr & (0x80 >> (i % 8))) { - Paint_SetPixel(x + i, y + j, Color_Foreground); - // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); - } - } else { - if (*ptr & (0x80 >> (i % 8))) { - Paint_SetPixel(x + i, y + j, Color_Foreground); - // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); - } else { - Paint_SetPixel(x + i, y + j, Color_Background); - // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); - } - } - if (i % 8 == 7) { - ptr++; - } - } - if (font->Width % 8 != 0) { - ptr++; - } - } - break; - } - } - /* Point on the next character */ - p_text += 2; - /* Decrement the column position by 16 */ - x += font->Width; - } - } -} - -/****************************************************************************** -function: Display nummber -parameter: - Xstart :X coordinate - Ystart : Y coordinate - Nummber : The number displayed - Font :A structure pointer that displays a character size - Color_Foreground : Select the foreground color - Color_Background : Select the background color -******************************************************************************/ -#define ARRAY_LEN 255 -void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, - sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) -{ - - int16_t Num_Bit = 0, Str_Bit = 0; - uint8_t Str_Array[ARRAY_LEN] = {0}, Num_Array[ARRAY_LEN] = {0}; - uint8_t *pStr = Str_Array; - - if (Xpoint > Paint.Width || Ypoint > Paint.Height) { - Debug("Paint_DisNum Input exceeds the normal display range\r\n"); - return; - } - - //Converts a number to a string - do { - Num_Array[Num_Bit] = Nummber % 10 + '0'; - Num_Bit++; - Nummber /= 10; - } while(Nummber); - - - //The string is inverted - while (Num_Bit > 0) { - Str_Array[Str_Bit] = Num_Array[Num_Bit - 1]; - Str_Bit ++; - Num_Bit --; - } - - //show - Paint_DrawString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground); -} - -/****************************************************************************** -function: Display nummber (Able to display decimals) -parameter: - Xstart :X coordinate - Ystart : Y coordinate - Nummber : The number displayed - Font :A structure pointer that displays a character size - Digit : Fractional width - Color_Foreground : Select the foreground color - Color_Background : Select the background color -******************************************************************************/ -void Paint_DrawNumDecimals(UWORD Xpoint, UWORD Ypoint, double Nummber, - sFONT* Font, UWORD Digit, UWORD Color_Foreground, UWORD Color_Background) -{ - int16_t Num_Bit = 0, Str_Bit = 0; - uint8_t Str_Array[ARRAY_LEN] = {0}, Num_Array[ARRAY_LEN] = {0}; - uint8_t *pStr = Str_Array; - int temp = Nummber; - float decimals; - uint8_t i; - if (Xpoint > Paint.Width || Ypoint > Paint.Height) { - Debug("Paint_DisNum Input exceeds the normal display range\r\n"); - return; - } - - if(Digit > 0) { - decimals = Nummber - temp; - for(i=Digit; i > 0; i--) { - decimals*=10; - } - temp = decimals; - //Converts a number to a string - for(i=Digit; i>0; i--) { - Num_Array[Num_Bit] = temp % 10 + '0'; - Num_Bit++; - temp /= 10; - } - Num_Array[Num_Bit] = '.'; - Num_Bit++; - } - - temp = Nummber; - //Converts a number to a string - do { - Num_Array[Num_Bit] = temp % 10 + '0'; - Num_Bit++; - temp /= 10; - } while(temp); - - //The string is inverted - while (Num_Bit > 0) { - Str_Array[Str_Bit] = Num_Array[Num_Bit - 1]; - Str_Bit ++; - Num_Bit --; - } - - //show - Paint_DrawString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground); -} - -/****************************************************************************** -function: Display time -parameter: - Xstart :X coordinate - Ystart : Y coordinate - pTime : Time-related structures - Font :A structure pointer that displays a character size - Color_Foreground : Select the foreground color - Color_Background : Select the background color -******************************************************************************/ -void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, - UWORD Color_Foreground, UWORD Color_Background) -{ - uint8_t value[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; - - UWORD Dx = Font->Width; - - //Write data into the cache - Paint_DrawChar(Xstart , Ystart, value[pTime->Hour / 10], Font, Color_Background, Color_Foreground); - Paint_DrawChar(Xstart + Dx , Ystart, value[pTime->Hour % 10], Font, Color_Background, Color_Foreground); - Paint_DrawChar(Xstart + Dx + Dx / 4 + Dx / 2 , Ystart, ':' , Font, Color_Background, Color_Foreground); - Paint_DrawChar(Xstart + Dx * 2 + Dx / 2 , Ystart, value[pTime->Min / 10] , Font, Color_Background, Color_Foreground); - Paint_DrawChar(Xstart + Dx * 3 + Dx / 2 , Ystart, value[pTime->Min % 10] , Font, Color_Background, Color_Foreground); - Paint_DrawChar(Xstart + Dx * 4 + Dx / 2 - Dx / 4, Ystart, ':' , Font, Color_Background, Color_Foreground); - Paint_DrawChar(Xstart + Dx * 5 , Ystart, value[pTime->Sec / 10] , Font, Color_Background, Color_Foreground); - Paint_DrawChar(Xstart + Dx * 6 , Ystart, value[pTime->Sec % 10] , Font, Color_Background, Color_Foreground); -} - -/****************************************************************************** -function: Display monochrome bitmap -parameter: - image_buffer :A picture data converted to a bitmap -info: - Use a computer to convert the image into a corresponding array, - and then embed the array directly into Imagedata.cpp as a .c file. -******************************************************************************/ -void Paint_DrawBitMap(const unsigned char* image_buffer) -{ - UWORD x, y; - UDOUBLE Addr = 0; - - for (y = 0; y < Paint.HeightByte; y++) { - for (x = 0; x < Paint.WidthByte; x++) {//8 pixel = 1 byte - Addr = x + y * Paint.WidthByte; - Paint.Image[Addr] = (unsigned char)image_buffer[Addr]; - } - } -} diff --git a/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.h b/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.h deleted file mode 100755 index ceeacfd6..00000000 --- a/display_app/2in15_e-Paper_B/lib/GUI/GUI_Paint.h +++ /dev/null @@ -1,217 +0,0 @@ -/****************************************************************************** -* | File : GUI_Paint.h -* | Author : Waveshare electronics -* | Function : Achieve drawing: draw points, lines, boxes, circles and -* their size, solid dotted line, solid rectangle hollow -* rectangle, solid circle hollow circle. -* | Info : -* Achieve display characters: Display a single character, string, number -* Achieve time display: adaptive size display time minutes and seconds -*---------------- -* | This version: V3.1 -* | Date : 2019-10-10 -* | Info : -* ----------------------------------------------------------------------------- -* V3.1(2019-10-10): -* 1. Add gray level -* PAINT Add Scale -* 2. Add void Paint_SetScale(UBYTE scale); -* -* V3.0(2019-04-18): -* 1.Change: -* Paint_DrawPoint(..., DOT_STYLE DOT_STYLE) -* => Paint_DrawPoint(..., DOT_STYLE Dot_Style) -* Paint_DrawLine(..., LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel) -* => Paint_DrawLine(..., DOT_PIXEL Line_width, LINE_STYLE Line_Style) -* Paint_DrawRectangle(..., DRAW_FILL Filled, DOT_PIXEL Dot_Pixel) -* => Paint_DrawRectangle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) -* Paint_DrawCircle(..., DRAW_FILL Draw_Fill, DOT_PIXEL Dot_Pixel) -* => Paint_DrawCircle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Filll) -* -* ----------------------------------------------------------------------------- -* V2.0(2018-11-15): -* 1.add: Paint_NewImage() -* Create an image's properties -* 2.add: Paint_SelectImage() -* Select the picture to be drawn -* 3.add: Paint_SetRotate() -* Set the direction of the cache -* 4.add: Paint_RotateImage() -* Can flip the picture, Support 0-360 degrees, -* but only 90.180.270 rotation is better -* 4.add: Paint_SetMirroring() -* Can Mirroring the picture, horizontal, vertical, origin -* 5.add: Paint_DrawString_CN() -* Can display Chinese(GB1312) -* -* ----------------------------------------------------------------------------- -* V1.0(2018-07-17): -* Create library -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documnetation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is -* furished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in -* all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -* THE SOFTWARE. -* -******************************************************************************/ -#ifndef __GUI_PAINT_H -#define __GUI_PAINT_H - -#include "DEV_Config.h" -#include "../Fonts/fonts.h" - -/** - * Image attributes -**/ -typedef struct { - UBYTE *Image; - UWORD Width; - UWORD Height; - UWORD WidthMemory; - UWORD HeightMemory; - UWORD Color; - UWORD Rotate; - UWORD Mirror; - UWORD WidthByte; - UWORD HeightByte; - UWORD Scale; -} PAINT; -extern PAINT Paint; - -/** - * Display rotate -**/ -#define ROTATE_0 0 -#define ROTATE_90 90 -#define ROTATE_180 180 -#define ROTATE_270 270 - -/** - * Display Flip -**/ -typedef enum { - MIRROR_NONE = 0x00, - MIRROR_HORIZONTAL = 0x01, - MIRROR_VERTICAL = 0x02, - MIRROR_ORIGIN = 0x03, -} MIRROR_IMAGE; -#define MIRROR_IMAGE_DFT MIRROR_NONE - -/** - * image color -**/ -#define WHITE 0xFF -#define BLACK 0x00 -#define RED BLACK - -#define IMAGE_BACKGROUND WHITE -#define FONT_FOREGROUND BLACK -#define FONT_BACKGROUND WHITE - -//4 Gray level -#define GRAY1 0x03 //Blackest -#define GRAY2 0x02 -#define GRAY3 0x01 //gray -#define GRAY4 0x00 //white - -/** - * The size of the point -**/ -typedef enum { - DOT_PIXEL_1X1 = 1, // 1 x 1 - DOT_PIXEL_2X2 , // 2 X 2 - DOT_PIXEL_3X3 , // 3 X 3 - DOT_PIXEL_4X4 , // 4 X 4 - DOT_PIXEL_5X5 , // 5 X 5 - DOT_PIXEL_6X6 , // 6 X 6 - DOT_PIXEL_7X7 , // 7 X 7 - DOT_PIXEL_8X8 , // 8 X 8 -} DOT_PIXEL; -#define DOT_PIXEL_DFT DOT_PIXEL_1X1 //Default dot pilex - -/** - * Point size fill style -**/ -typedef enum { - DOT_FILL_AROUND = 1, // dot pixel 1 x 1 - DOT_FILL_RIGHTUP , // dot pixel 2 X 2 -} DOT_STYLE; -#define DOT_STYLE_DFT DOT_FILL_AROUND //Default dot pilex - -/** - * Line style, solid or dashed -**/ -typedef enum { - LINE_STYLE_SOLID = 0, - LINE_STYLE_DOTTED, -} LINE_STYLE; - -/** - * Whether the graphic is filled -**/ -typedef enum { - DRAW_FILL_EMPTY = 0, - DRAW_FILL_FULL, -} DRAW_FILL; - -/** - * Custom structure of a time attribute -**/ -typedef struct { - UWORD Year; //0000 - UBYTE Month; //1 - 12 - UBYTE Day; //1 - 30 - UBYTE Hour; //0 - 23 - UBYTE Min; //0 - 59 - UBYTE Sec; //0 - 59 -} PAINT_TIME; -extern PAINT_TIME sPaint_time; - -//init and Clear -void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color); -void Paint_SelectImage(UBYTE *image); -void Paint_SetRotate(UWORD Rotate); -void Paint_SetMirroring(UBYTE mirror); -void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color); -void Paint_SetScale(UBYTE scale); - -void Paint_Clear(UWORD Color); -void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color); - -//Drawing -void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_FillWay); -void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, LINE_STYLE Line_Style); -void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill); -void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill); - -//Display string -void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Acsii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); -void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); -void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background); -void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); -void Paint_DrawNumDecimals(UWORD Xpoint, UWORD Ypoint, double Nummber, sFONT* Font, UWORD Digit, UWORD Color_Foreground, UWORD Color_Background); // Able to display decimals -void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); - -//pic -void Paint_DrawBitMap(const unsigned char* image_buffer); - - -#endif - - - - - diff --git a/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.c b/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.c deleted file mode 100755 index 31b6e500..00000000 --- a/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.c +++ /dev/null @@ -1,261 +0,0 @@ -/***************************************************************************** -* | File : EPD_2in15b.c -* | Author : Waveshare team -* | Function : 2.15inch e-paper b -* | Info : -*---------------- -* | This version: V1.0 -* | Date : 2024-08-07 -* | Info : -* ----------------------------------------------------------------------------- -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -******************************************************************************/ -#include "EPD_2in15b.h" -#include "Debug.h" -#include "time.h" - -/****************************************************************************** -function : Software reset -parameter: -******************************************************************************/ -static void EPD_2IN15B_Reset(void) -{ - DEV_Digital_Write(EPD_RST_PIN, 1); - DEV_Delay_ms(200); - DEV_Digital_Write(EPD_RST_PIN, 0); - DEV_Delay_ms(2); - DEV_Digital_Write(EPD_RST_PIN, 1); - DEV_Delay_ms(200); -} - -/****************************************************************************** -function : send command -parameter: - Reg : Command register -******************************************************************************/ -static void EPD_2IN15B_SendCommand(UBYTE Reg) -{ - DEV_Digital_Write(EPD_DC_PIN, 0); - DEV_Digital_Write(EPD_CS_PIN, 0); - DEV_SPI_WriteByte(Reg); - DEV_Digital_Write(EPD_CS_PIN, 1); -} - -/****************************************************************************** -function : send data -parameter: - Data : Write data -******************************************************************************/ -static void EPD_2IN15B_SendData(UBYTE Data) -{ - DEV_Digital_Write(EPD_DC_PIN, 1); - DEV_Digital_Write(EPD_CS_PIN, 0); - DEV_SPI_WriteByte(Data); - DEV_Digital_Write(EPD_CS_PIN, 1); -} - -/****************************************************************************** -function : Wait until the busy_pin goes LOW -parameter: -******************************************************************************/ -static void EPD_2IN15B_ReadBusy(void) -{ - Debug("e-Paper busy\r\n"); - DEV_Delay_ms(50); - while(DEV_Digital_Read(EPD_BUSY_PIN) == 1) { //LOW: idle, HIGH: busy - DEV_Delay_ms(10); - } - DEV_Delay_ms(50); - Debug("e-Paper busy release\r\n"); -} - -/****************************************************************************** -function : Turn On Display -parameter: -******************************************************************************/ -static void EPD_2IN15B_TurnOnDisplay(void) -{ - EPD_2IN15B_SendCommand(0x20); - EPD_2IN15B_ReadBusy(); -} - -/****************************************************************************** -function : Setting the display window -parameter: -******************************************************************************/ -static void EPD_2IN15B_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend) -{ - EPD_2IN15B_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION - EPD_2IN15B_SendData((Xstart>>3) & 0x1F); - EPD_2IN15B_SendData((Xend>>3) & 0x1F); - - EPD_2IN15B_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION - EPD_2IN15B_SendData(Ystart & 0xFF); - EPD_2IN15B_SendData((Ystart >> 8) & 0x01); - EPD_2IN15B_SendData(Yend & 0xFF); - EPD_2IN15B_SendData((Yend >> 8) & 0x01); -} - -/****************************************************************************** -function : Set Cursor -parameter: -******************************************************************************/ -static void EPD_2IN15B_SetCursor(UWORD Xstart, UWORD Ystart) -{ - EPD_2IN15B_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER - EPD_2IN15B_SendData(Xstart & 0x1F); - - EPD_2IN15B_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER - EPD_2IN15B_SendData(Ystart & 0xFF); - EPD_2IN15B_SendData((Ystart >> 8) & 0x01); -} - -/****************************************************************************** -function : Initialize the e-Paper register -parameter: -******************************************************************************/ -void EPD_2IN15B_Init(void) -{ - EPD_2IN15B_Reset(); - EPD_2IN15B_ReadBusy(); - EPD_2IN15B_SendCommand(0x12);//soft reset - EPD_2IN15B_ReadBusy(); - - EPD_2IN15B_SendCommand(0x11); //data entry mode - EPD_2IN15B_SendData(0x03); - - EPD_2IN15B_SetWindows(0, 0, EPD_2IN15B_WIDTH-1, EPD_2IN15B_HEIGHT-1); - - EPD_2IN15B_SendCommand(0x3C); // Display update control - EPD_2IN15B_SendData(0x05); - - EPD_2IN15B_SetCursor(0, 0); - EPD_2IN15B_ReadBusy(); -} - -/****************************************************************************** -function : Sends the image buffer in RAM to e-Paper and displays -parameter: -******************************************************************************/ -void EPD_2IN15B_Display(UBYTE *ImageBlack, UBYTE*ImageRed) -{ - UWORD Width, Height; - Width = (EPD_2IN15B_WIDTH % 8 == 0)? (EPD_2IN15B_WIDTH / 8 ): (EPD_2IN15B_WIDTH / 8 + 1); - Height = EPD_2IN15B_HEIGHT; - - EPD_2IN15B_SendCommand(0x24); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_2IN15B_SendData(ImageBlack[i + j * Width]); - } - } - - EPD_2IN15B_SendCommand(0x26); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_2IN15B_SendData(~ImageRed[i + j * Width]); - } - } - - EPD_2IN15B_TurnOnDisplay(); -} - -/****************************************************************************** -function : Clear screen -parameter: -******************************************************************************/ -void EPD_2IN15B_Clear(void) -{ - UWORD Width, Height; - Width = (EPD_2IN15B_WIDTH % 8 == 0)? (EPD_2IN15B_WIDTH / 8 ): (EPD_2IN15B_WIDTH / 8 + 1); - Height = EPD_2IN15B_HEIGHT; - - EPD_2IN15B_SendCommand(0x24); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_2IN15B_SendData(0xff); - } - } - EPD_2IN15B_SendCommand(0x26); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_2IN15B_SendData(0x00); - } - } - EPD_2IN15B_TurnOnDisplay(); -} - -void EPD_2IN15B_Clear_Black(void) -{ - UWORD Width, Height; - Width = (EPD_2IN15B_WIDTH % 8 == 0)? (EPD_2IN15B_WIDTH / 8 ): (EPD_2IN15B_WIDTH / 8 + 1); - Height = EPD_2IN15B_HEIGHT; - - EPD_2IN15B_SendCommand(0x24); - - for (UWORD j = 0; j < Height-50; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_2IN15B_SendData(0xff); - } - } - for (UWORD j = 0; j < 50; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_2IN15B_SendData(0x00); - } - } - EPD_2IN15B_SendCommand(0x26); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_2IN15B_SendData(0x00); - } - } - EPD_2IN15B_TurnOnDisplay(); -} - -void EPD_2IN15B_Clear_Red(void) -{ - UWORD Width, Height; - Width = (EPD_2IN15B_WIDTH % 8 == 0)? (EPD_2IN15B_WIDTH / 8 ): (EPD_2IN15B_WIDTH / 8 + 1); - Height = EPD_2IN15B_HEIGHT; - - EPD_2IN15B_SendCommand(0x24); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_2IN15B_SendData(0xff); - } - } - EPD_2IN15B_SendCommand(0x26); - for (UWORD j = 0; j < Height; j++) { - for (UWORD i = 0; i < Width; i++) { - EPD_2IN15B_SendData(0xff); - } - } - EPD_2IN15B_TurnOnDisplay(); -} - -/****************************************************************************** -function : Enter sleep mode -parameter: -******************************************************************************/ -void EPD_2IN15B_Sleep(void) -{ - EPD_2IN15B_SendCommand(0x10); - EPD_2IN15B_SendData(0x01); -} diff --git a/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.h b/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.h deleted file mode 100755 index 73112ed7..00000000 --- a/display_app/2in15_e-Paper_B/lib/e-Paper/EPD_2in15b.h +++ /dev/null @@ -1,45 +0,0 @@ -/***************************************************************************** -* | File : EPD_2in15b.h -* | Author : Waveshare team -* | Function : 2.15inch e-paper b -* | Info : -*---------------- -* | This version: V1.0 -* | Date : 2024-08-07 -* | Info : -* ----------------------------------------------------------------------------- -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# z**/ -#ifndef __EPD_2IN15B_H_ -#define __EPD_2IN15B_H_ - -#include "DEV_Config.h" - -// Display resolution -#define EPD_2IN15B_WIDTH 160 -#define EPD_2IN15B_HEIGHT 296 - - -void EPD_2IN15B_Init(void); -void EPD_2IN15B_Display(UBYTE *ImageBlack, UBYTE*ImageRed); -void EPD_2IN15B_Clear(void); -void EPD_2IN15B_Clear_Black(void); -void EPD_2IN15B_Clear_Red(void); -void EPD_2IN15B_Sleep(void); -#endif diff --git a/display_app/2in15_e-Paper_B/pic/2.15__b.bmp b/display_app/2in15_e-Paper_B/pic/2.15__b.bmp deleted file mode 100755 index 3a10cf1e75ff2f8dfbf0de3ded6516e8870bb8a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5982 zcmd6qy^a+(6vt;l3JqdQlp-2R%9JTkW=RpzGlzlH^~(n1q!6R zKqTf$NVI1~<0#&7&WG>FfBUcuK}h)O&d1NkKF9Vs$DZ$gczn0h@-1KQ^Zz%wA9URT z|MumNJ6$LL8w}*nC4HI_oNhh#Pb(K4o7S?rw?hHvNQKQeTNV$H_52#q=GkF!Y~-jD z9dW~#rDO&=jG-;YmS*pHh)#X%`i3H#w~asw+d&}ARoM27D*KLv;at%(9WTt)?!sfz zJcUu}!%z(UUGLpQL{{BJ24yOCex(~>3Ci0fwcXtT?lwo&!sTm`kS z8i!*uJ!r=^%`Mxdb?nlSqtwIj@uJ7e@Wx9I%jxV2|iyW|>vIPCP?5tg*>5E?b`)jX&?{sKP zH0=xZzw=}4N*0HG?V3CKpM`UkPfY~Ik%FdSWTZiZIh&r0Y{gr!WD0}W+?Q}CR(q@z z;%AjhGf-pXu+x^sTP34TmMo4AgGDj91ba_rsMk6|y~VjL+%9VX|o+ymTPpM-q+?*3w#$8)c4&i(~d z>P!66VPCZjiKUmC^$7UQ+vDAHle1qYXCE|nRq2s6zrs9}dS>w$1m{86Hzmt?1Liri zpB=fgmSKEYy~oOye8Q=$mD;HG;n^pg^il(7A39dH;fkfuiTZt506$DRf4E=T83fNw znZX`m=b$Sjgu(^j&TB|9sbcGJ@~={@0h&q|f=hfn3L1ucgj2 z?w9ZMQ|vCKUI6TQ$<`d^D%%44jCUTohB^6a{;{@({i+&=NHlD$+fjF?Z`tjYtZiHO z_2KU{mThL8&DX$UCuf?!frajv8J=Ir7@Q+0JP^54{x4;U!qD$`#>Pd6A2JiCS&A_{ zM@(@uumI}a=n)q5(${)M0v`%07so{bKg5l=PXxWQNk~OqrW)`&o?lGhyp^kRgq`6k ze^#4A+17F_<|dEvSI#J-DckZi2?HHAb!dxZz_#pKq{JI8#)2)5$FNIS#9WozqM+$r z6N65>7MTwC_G5>VX@YORM4E>2%s@fD7clP<>AJzUA5G$?@lmOrwow?Y2mK@r*Mn{e zL%*U!WiVyb2a!AF|59j}Ms5mzPoww&4T}&zkcQ9}*rk5*{0VKX%`4E6`vF@r^PD4B zeGWIwe`e9^v9%2IUt512LBBW2)y&zCF!pnQkRvjyVqYlwn#rNB8C!eBn6XwEGnwI8 zMIpvamV=nd3}PlTh#6yR$5EewrFDEVSSQ6b-s_7udz^2!ES>$@$fY;y*lIs;a$T$R GqsV{uiF~jC diff --git a/display_app/2in15_e-Paper_B/pic/2.15__r.bmp b/display_app/2in15_e-Paper_B/pic/2.15__r.bmp deleted file mode 100755 index 9d59db77d5fe9e5583388f1e38a0183f90360988..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5982 zcmeI0J#N)N5XWb6ggY!MsMwa014P+~o-1&MP$D7LH{b~2D3(B?%oQ9_&^i^4V!Zrk z{ordla9CUHEXE_EOXTvtgp0gs5P6sW^>RiZuGgy4Osfu7&W)z zjgc_Qxt1?uqy4jD>z&qF`D2w_HzVPT#Zo?;N}s`6X)mQygIPL0>`Hsqx|^Bjf(Uzo z3nEzL2He0VKE#A>Jko4<_E*@}bL}oV1g2xV&#dlsy!o&z`=Cw<%~mp>5}K`KAt%3N z5ib|1vsmgYoU-LyOpJm#bhGbDoyp)_BXxIS*19-4gII%7=X4y%frtb5ht5kd^5;{+ z(q&$(dO*=h9p%HgoQr~E+>SW}Eax_eOft`|h&4j$6^qZ)#$pCxyenH zWTTsmKA2?P+(=VYbLkS16uE-#N;61E=qASxtYR+BmEJRG10<%@fpwBaUP9;sw}xQe z$Z5mogwCoZL`wIISq`)-efeXoE!XAHg2AH96?7I;^@UFDRoF6Eg`=pfIXiP}cFey{ z3VZpXSTZ-%ozzuh(@R!Q{J1FRR&!7~m!h(_JeJG3%VSxv{8$#uIhvfO`dodF1z2K6m$bO=kIwnCT!tBX_zTYbfmJ?pWx&WK|lL zMQ+%ut|oYoG4rKW^{DS$cX+j|%=5i9HwBCA+e{U9)T+xln8^=&1}j;I)?9U1t>w9) z8dtXDbf&|4SeYL&3%aMFUs*uqm{IIj7IP1=FYU^f9%5hCb$=w{zQVeDUr-Ir#vMc0 z*Y>cBmUZiS&-(n1fG;-~Od~eLe1o<89Ut6jt3CX=msxwmmux7rcGck#@s4#}m{x{j voG|N~bqy}~F|z^T?bcw1;m}-1ip}&;F*u}IZ?L=oe!$^ni2ae_Z(=_IWCdBQ diff --git a/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.c b/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.c deleted file mode 100755 index ae508ac5..00000000 --- a/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.c +++ /dev/null @@ -1,93 +0,0 @@ -#include "EPD_2in15b_Manager.h" -#include "EPD_2in15b.h" -#include - -int EPD_2in15b_Manager(const char *file_r, const char *file_b) -{ - - if(DEV_Module_Init()!=0){ - return -1; - } - - Debug("e-Paper Init and Clear...\r\n"); - EPD_2IN15B_Init(); - //EPD_2IN15B_Clear(); - //DEV_Delay_ms(500); - - //Create a new image cache - UBYTE *BlackImage, *RedImage; - /* you have to edit the startup_stm32fxxx.s file and set a big enough heap size */ - UWORD Imagesize = ((EPD_2IN15B_WIDTH % 8 == 0)? (EPD_2IN15B_WIDTH / 8 ): (EPD_2IN15B_WIDTH / 8 + 1)) * EPD_2IN15B_HEIGHT; - if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) { - Debug("Failed to apply for black memory...\r\n"); - return -1; - } - if((RedImage = (UBYTE *)malloc(Imagesize)) == NULL) { - Debug("Failed to apply for red memory...\r\n"); - return -1; - } - - Debug("show bmp------------------------\r\n"); - Paint_NewImage(BlackImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 0, WHITE); - Paint_SelectImage(BlackImage); - GUI_ReadBmp(file_b, 0, 0); - Paint_NewImage(RedImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 0, WHITE); - Paint_SelectImage(RedImage); - GUI_ReadBmp(file_r, 0, 0); - EPD_2IN15B_Display(BlackImage, RedImage); - DEV_Delay_ms(100); - -#if 0 // show image for array - Debug("show image for array\r\n"); - EPD_2IN15B_Display(gImage_2in15b_B, gImage_2in15b_R); - DEV_Delay_ms(2000); -#endif - -#if 0 // Drawing on the image - Debug("Drawing\r\n"); - - //1.Draw black image - Paint_NewImage(BlackImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 270, WHITE); - Paint_SelectImage(BlackImage); - Paint_Clear(WHITE); - Paint_DrawPoint(10, 80, BLACK, DOT_PIXEL_1X1, DOT_STYLE_DFT); - Paint_DrawPoint(10, 90, BLACK, DOT_PIXEL_2X2, DOT_STYLE_DFT); - Paint_DrawPoint(10, 100, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT); - Paint_DrawPoint(10, 110, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT); - Paint_DrawLine(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID); - Paint_DrawLine(70, 70, 20, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID); - Paint_DrawRectangle(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY); - Paint_DrawRectangle(80, 70, 130, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL); - Paint_DrawString_EN(10, 0, "waveshare", &Font16, BLACK, WHITE); - Paint_DrawString_CN(130, 20, "΢ѩ����", &Font24CN, WHITE, BLACK); - Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK); - - //2.Draw red image - Paint_NewImage(RedImage, EPD_2IN15B_WIDTH, EPD_2IN15B_HEIGHT, 270, WHITE); - Paint_SelectImage(RedImage); - Paint_Clear(WHITE); - Paint_DrawCircle(160, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY); - Paint_DrawCircle(210, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL); - Paint_DrawLine(85, 95, 125, 95, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED); - Paint_DrawLine(105, 75, 105, 115, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED); - Paint_DrawString_CN(130, 0,"���abc", &Font12CN, BLACK, WHITE); - Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK); - Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE); - - EPD_2IN15B_Display(BlackImage, RedImage); - DEV_Delay_ms(2000); - -#endif - - Debug("Goto Sleep...\r\n"); - EPD_2IN15B_Sleep(); - free(BlackImage); - BlackImage = NULL; - DEV_Delay_ms(2000);//important, at least 2s - // close 5V - Debug("Disable VDD, Module enters 0 power consumption ...\r\n"); - DEV_Module_Exit(); - - return 0; -} - diff --git a/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h b/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h deleted file mode 100755 index a39e0acf..00000000 --- a/display_app/2in15_e-Paper_B/src/EPD_2in15b_Manager.h +++ /dev/null @@ -1,13 +0,0 @@ - -#ifndef _EPD_TEST_H_ -#define _EPD_TEST_H_ - -#include "DEV_Config.h" -#include "GUI_Paint.h" -#include "GUI_BMPfile.h" -#include "ImageData.h" -#include "Debug.h" -#include // malloc() free() - -int EPD_2in15b_Manager(const char *file_r, const char *file_b); -#endif diff --git a/display_app/2in15_e-Paper_B/src/ImageData.c b/display_app/2in15_e-Paper_B/src/ImageData.c deleted file mode 100755 index ef361b90..00000000 --- a/display_app/2in15_e-Paper_B/src/ImageData.c +++ /dev/null @@ -1,781 +0,0 @@ -/***************************************************************************** -* | File : ImageData.c -* | Author : Waveshare team -* | Function : -*---------------- -* | This version: V1.1 -* | Date : 2019-06-12 -* | Info : -* -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - -******************************************************************************/ - -#include "ImageData.h" - -const unsigned char gImage_2in15b_R[5920] = { /* 0X81,0X01,0X28,0X01,0XA0,0X00, */ -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X07,0X80,0X38,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X07,0X80,0X3C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X3C,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X3C,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X7F,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X7F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X7F,0XFF,0XE0,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X07,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X07,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0X0F,0X80,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X00,0X00,0X00,0X00,0X00,0X00, -0X0F,0XDF,0XC0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0X1F,0XD8,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X70,0X60,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X01,0XFF,0XF8,0X07,0X00,0X00,0X00,0X00,0X18,0X70,0X60,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XF8,0X0F,0X1E,0X00,0X00,0X00, -0X18,0X70,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XF8,0X0F, -0X1E,0X00,0X00,0X00,0X18,0X70,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X07,0XC0,0X00,0X0F,0X1E,0X00,0X00,0X00,0X1C,0XF0,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X07,0X80,0X00,0X0F,0X9E,0X00,0X00,0X00,0X0F,0XDF,0XE0,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X00, -0X07,0X8F,0XC0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X00,0X00,0X07, -0XFF,0XFF,0XE0,0X00,0X00,0X07,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X03,0X80,0X00,0X01,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X03,0X80,0X00,0X00,0X1E,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0XE0,0X00,0X00,0X1E,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0XFF,0XF8,0X07, -0X1E,0X00,0X00,0X00,0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X07,0XFF,0XF8,0X0F,0X1E,0X00,0X00,0X00,0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X07,0XFF,0XF8,0X0F,0X1E,0X00,0X00,0X00,0X1F,0XFF,0XE0,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X0F,0X1E,0X00,0X00,0X00, -0X0C,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X0F, -0X9E,0X00,0X00,0X00,0X0E,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X06,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0XFF,0XF8,0X01,0XFF,0XFF,0XE0,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0XFF,0XF8,0X00, -0X1E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X07,0XFF,0XF8,0X00,0X1E,0X00,0X00,0X00,0X00,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0XE0,0X00,0X1E,0X00,0X00,0X00,0X00,0X00,0XE0,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X30,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X38,0X00, -0X00,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X00,0X38,0X00,0X03,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0X3C,0X00,0X07,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X3C,0X00,0X0F,0XFF,0XE0,0X00, -0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0XF8,0X00, -0X0F,0X01,0XE0,0X00,0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X07,0XFF,0XF8,0X00,0X1E,0X00,0XE0,0X00,0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X07,0XFF,0XF0,0X00,0X1E,0X00,0XF0,0X00,0X0C,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0XFF,0XE0,0X00,0X1C,0X00,0XF0,0X00, -0X0E,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, -0X1E,0X00,0XF0,0X00,0X06,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X00,0X00,0X00,0X1E,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X0F,0X01,0XE0,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X3F,0X80,0X00,0X0F,0XFF,0XE0,0X00, -0X03,0XFF,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0XFF,0XE0,0X00, -0X07,0XFF,0XC0,0X00,0X0F,0XFF,0XC0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X01,0XFF,0XF0,0X00,0X03,0XFF,0X80,0X00,0X1E,0X01,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X03,0XFF,0XF8,0X00,0X00,0XFC,0X00,0X00,0X18,0X00,0XE0,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XC0,0X78,0X00,0X00,0X00,0X00,0X00, -0X18,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X38,0X00, -0X00,0X00,0X00,0X00,0X18,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X07,0X80,0X3C,0X00,0X03,0XC0,0X00,0X00,0X18,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X07,0X00,0X3C,0X00,0X03,0XC0,0X00,0X00,0X1C,0X00,0XE0,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X3C,0X00,0X03,0XC0,0X00,0X00, -0X0F,0XFF,0XC0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X38,0X00, -0X03,0XC0,0X00,0X00,0X07,0XFF,0X80,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X03,0XC0,0X78,0X00,0X03,0XC0,0X00,0X00,0X00,0XFC,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X03,0XFF,0XF8,0X00,0X03,0XC0,0X00,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X01,0XFF,0XF0,0X00,0X03,0XC0,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0XFF,0XE0,0X00, -0X03,0XC0,0X00,0X00,0X00,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X3F,0X00,0X00,0X03,0XC0,0X00,0X00,0X00,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XE0,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X80,0X60,0X00, -0X1E,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X01,0XC0,0X70,0X00,0X1E,0X00,0XF0,0X00,0X00,0X07,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X03,0XC0,0XF8,0X00,0X1E,0X00,0XF0,0X00,0X00,0X07,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X03,0XE0,0X78,0X00,0X1E,0X00,0XF0,0X00, -0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X38,0X01, -0XFF,0XFF,0XF0,0X00,0X1F,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X07,0X80,0X3C,0X01,0XFF,0XFF,0XE0,0X00,0X1C,0X07,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X07,0X00,0X3C,0X01,0XFF,0XFF,0XE0,0X00,0X1F,0X07,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X3C,0X01,0XFF,0XFF,0X80,0X00, -0X07,0XC7,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X80,0X38,0X00, -0X1E,0X00,0X00,0X00,0X01,0XE7,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X03,0XC0,0XF8,0X00,0X1E,0X00,0X00,0X00,0X00,0X7F,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X03,0XFF,0XF0,0X00,0X1E,0X00,0X00,0X00,0X00,0X1F,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X01,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00, -0X00,0X0F,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0XFF,0XC0,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X3F,0X00,0X00,0X1F,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XE0,0X00,0X07,0X80,0X60,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X80,0XC0,0X00,0X1F,0XFF,0XE0,0X00, -0X0F,0XE0,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X01,0X83,0XF0,0X00, -0X00,0X03,0X80,0X00,0X1F,0XF0,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X03,0XC7,0XF8,0X00,0X00,0X00,0XC0,0X00,0X18,0X38,0X60,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X03,0XC7,0XF8,0X00,0X00,0X00,0XE0,0X00,0X18,0X1E,0X60,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X8F,0X38,0X00,0X00,0X00,0XE0,0X00, -0X18,0X0F,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X0E,0X1C,0X00, -0X00,0X00,0XF0,0X00,0X18,0X07,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X07,0X0E,0X1C,0X00,0X00,0X00,0XF0,0X00,0X1C,0X03,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X07,0X1E,0X1C,0X00,0X00,0X03,0XE0,0X00,0X0E,0X00,0XE0,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0X9C,0X38,0X00,0X1F,0XFF,0XE0,0X00, -0X06,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X07,0XFC,0X78,0X00, -0X1F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X03,0XFC,0XF8,0X00,0X1F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X01,0XF8,0X70,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0XF0,0X60,0X00,0X00,0X00,0X00,0X00, -0X0F,0XFF,0XC0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0X1E,0X01,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X00,0X00,0X00,0X02,0X01,0X80,0X00,0X18,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X07,0X01,0XC0,0X00,0X18,0X00,0X60,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XC7,0XFF,0XF8,0X00,0X0F,0X03,0XE0,0X00, -0X18,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X03,0XE7,0XFF,0XF8,0X00, -0X0F,0X81,0XE0,0X00,0X18,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X03, -0XE7,0XFF,0XF8,0X00,0X1E,0X00,0XE0,0X00,0X1C,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X01,0XC7,0XFF,0XF8,0X00,0X1E,0X00,0XF0,0X00,0X0F,0XFF,0XC0,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0XF0,0X00, -0X07,0XFF,0X80,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, -0X1E,0X00,0XF0,0X00,0X00,0XFC,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X00,0X00,0X00,0X1E,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X03,0XFE,0X00,0X00,0X0F,0X03,0XE0,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X0F,0XFF,0X80,0X00,0X0F,0XFF,0XC0,0X00, -0X07,0X80,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X3F,0XFF,0XC0,0X00, -0X07,0XFF,0XC0,0X00,0X0F,0XE0,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X7F,0XFF,0XE0,0X00,0X03,0XFF,0X00,0X00,0X1F,0XF0,0X60,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X7C,0X01,0XF0,0X00,0X00,0XFC,0X00,0X00,0X18,0X38,0X60,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0XF8,0X00,0XF0,0X00,0X00,0X00,0X00,0X00, -0X18,0X1E,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0XF0,0X00,0X78,0X00, -0X00,0X00,0X00,0X00,0X18,0X0F,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0XE0,0X00,0X78,0X00,0X00,0X00,0X00,0X00,0X18,0X07,0XE0,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X01,0XE0,0X00,0X78,0X00,0X00,0X00,0X00,0X00,0X1C,0X03,0XE0,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XE0,0X00,0X38,0X00,0X00,0X00,0X00,0X00, -0X0E,0X00,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XE0,0X00,0X38,0X00, -0X00,0X00,0X00,0X00,0X06,0X00,0X60,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01, -0XE0,0X00,0X38,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X01,0XE0,0X00,0X38,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XE0,0X00,0X38,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XFF,0XFF,0XF8,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01, -0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X01,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFC,0X0F,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XE0, -0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X01,0XFF,0X80,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFF,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFE,0X00,0X00,0X1F,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFC,0X00, -0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X01,0XFC,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X00,0X00,0X03,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X03, -0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X03,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F, -0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X01,0XF8,0X0F,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X0C,0X07, -0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X00,0X00,0X03,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XE0,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XE0,0X07,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01, -0XE0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X00,0X00,0X01,0XF0,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03,0XF0,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03,0XF0,0X3F,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFE,0X00,0X03, -0XF8,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFB,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFC, -0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFF,0X80,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFF,0X00,0X00,0X1F,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFE,0X00, -0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X01,0XFC,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFC,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X00,0X00,0X07,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X00, -0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X01,0XF8,0X03,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F, -0XFE,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X01,0XF8,0X0F,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X03,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07, -0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X00,0X0C,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XE0,0X03,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01, -0XE0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X00,0X00,0X01,0XE0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XF0,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03,0XF0,0X1F,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03, -0XF0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFE,0X00,0X03,0XF8,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFB,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFC,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFF,0X80,0X00,0X7F,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFF,0X00, -0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X01,0XFE,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFC,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XFC,0X00,0X00,0X07,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X00, -0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X01,0XF8,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X03,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X07, -0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X01,0XF8,0X0F,0XFE,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F,0XFE,0X01,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X01,0XF8,0X0F, -0XFE,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X01,0XF8,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X0C,0X07,0XFC,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03,0XF8,0X03,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01, -0XE0,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X00,0X00,0X01,0XE0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XE0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X01,0XF0,0X0F,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X00,0X00,0X03, -0XF0,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X00,0X00,0X03,0XF0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFE,0X00,0X03,0XF8,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFB,0XF8,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XE7,0XFF,0XCF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XC7,0XFF,0XC7, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0X83,0XFF,0X83,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0X00,0X7F,0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0X02,0X1F,0X81,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X06,0X19,0XC0, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFE,0X0E,0X18,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFE,0X0E,0X18,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X0E,0X18,0XE0,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFE,0X06,0X18,0XC0, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0X02,0X18,0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0X80,0X00,0X03,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XC0,0X00,0X07, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XE0,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XF8,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFE,0X00,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFE,0X18,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XDF,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -}; -const unsigned char gImage_2in15b_B[5920] = { /* 0X81,0X01,0X28,0X01,0XA0,0X00, */ -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC1,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XC3,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XE1,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XC1,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XF8,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X01, -0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFC,0X01,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X01,0XC3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X01,0X83,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X01, -0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE0,0XE1,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XF0,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1, -0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE1,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XE1, -0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XF0,0X21,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00, -0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0X01,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X01,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X01,0XC3,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X01, -0X83,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE0,0X01,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XE1,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE0,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1, -0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XF0,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1, -0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE0,0XE1,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X21,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X03,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00, -0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFC,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,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,0X3F,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00, -0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X0C,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X7F, -0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE0,0XFF,0XC0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XE0,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF, -0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE1,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XC3,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X3F, -0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,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,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XF0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X7F,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFC,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE0,0X61,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE1,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1, -0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XF0,0XF0,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XF0, -0X60,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XF0,0X70,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XF8,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XF8,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XFE, -0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC1,0XE0,0X00,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC1,0XE0,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XC1,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XC1,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X03,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00, -0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFC,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE0,0X61,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XE1,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1, -0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XE1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XF0,0XF0,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0XF0, -0X60,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XF0,0X70,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XF8,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XF8,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XFE, -0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X1F,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X7F,0XFF,0XFF,0XFF,0XE0,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X0F,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFC,0X71,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XF8,0XE7,0XFF,0XFF,0XFF,0XE1,0XFF, -0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XFC,0XE7,0XFF, -0XFF,0XFF,0XE1,0XFF,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XF1,0XFC,0XE7,0XFF,0XFF,0XFF,0XE1,0XFF,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XF0,0XF8,0XC7,0XFF,0XFF,0XFF,0XE1,0XFF,0XE0,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X87,0XFF,0XFF,0XFF,0XE1,0XFF, -0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X01,0XCF,0XFF, -0XFF,0XFF,0XE1,0XFF,0XC0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFE,0X03,0XDF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XFE,0XFF,0XFF,0XFF,0XF8,0X00,0X00, -0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,0XFC,0XFF,0XFF, -0XFF,0XF8,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XF9,0XF8,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XF8,0XF0,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X41,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X03,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFE,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0X0F,0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XBF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFC,0XFC, -0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0XFF,0XFF, -0XFF,0XFF,0XF8,0XF8,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XF0,0X78,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X70,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC7,0XFF,0XFF,0XFF,0XFF,0XE0,0XF0, -0X61,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0X01,0XFF,0XFF, -0XFF,0XFF,0XE1,0XF0,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X1E,0X00,0XFF,0XFF,0XFF,0XFF,0XE1,0XE0,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X1C,0X30,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1,0XF0,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1C,0X78,0XFF,0XFF,0XFF,0XFF,0XE3,0XE1, -0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1C,0X7C,0X7F,0XFF, -0XFF,0XFF,0XE1,0XC1,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X1C,0X7C,0X7F,0XFF,0XFF,0XFF,0XE0,0X83,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X06,0X78,0XFF,0XFF,0XFF,0XFF,0XE0,0X03,0XC1,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X30,0XFF,0XFF,0XFF,0XFF,0XF0,0X03, -0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X31,0XFF,0XFF, -0XFF,0XFF,0XF0,0X07,0XC3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XF8,0X3B,0XFF,0XFF,0XFF,0XFF,0XF8,0X0F,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XE3,0X81,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X81,0X00,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0C,0X38,0XFF,0XFF, -0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X1C,0X7C,0X7F,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X1E,0X7C,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1C,0X7C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X38,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X80,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XC1,0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XC1,0XF8,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X78,0XFF,0XFF,0XFF,0XFF,0XE0,0X00, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X38,0XFF,0XFF, -0XFF,0XFF,0XE0,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X0E,0X18,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X1F,0X08,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X1F,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0X80,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0XC0,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X87,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X87,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCF,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0X80, -0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF, -0XFF,0XFF,0XFC,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XF8,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XE0,0X00,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XE0,0X07,0XFF,0XFF,0XFF,0XE0,0X07,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XFF,0XE0,0X3F,0XE0,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0XFF,0XFF,0XFF,0XE0,0X1F,0XE0, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0F,0XF8,0XFF,0XFF, -0XFF,0XE0,0X03,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X1F,0XFC,0XFF,0XFF,0XFF,0XF0,0X00,0X60,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0X1F,0XFC,0X7F,0XFF,0XFF,0XFC,0X00,0X00,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0XF8,0XFF,0XFF,0XFF,0XFF,0X80,0X00, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X87,0XF0,0XFF,0XFF, -0XFF,0XFF,0XF0,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0X80,0X00,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XC0,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X01,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0, -0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, -}; - - - - diff --git a/display_app/2in15_e-Paper_B/src/ImageData.h b/display_app/2in15_e-Paper_B/src/ImageData.h deleted file mode 100755 index 84d72628..00000000 --- a/display_app/2in15_e-Paper_B/src/ImageData.h +++ /dev/null @@ -1,43 +0,0 @@ -/***************************************************************************** -* | File : ImageData.h -* | Author : Waveshare team -* | Function : -*---------------- -* | This version: V1.0 -* | Date : 2018-10-23 -* | Info : -* -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - -******************************************************************************/ - -#ifndef _IMAGEDATA_H_ -#define _IMAGEDATA_H_ - -/* ------------------------------------------------ */ -// Imagedata -extern const unsigned char gImage_2in15b_R[]; -extern const unsigned char gImage_2in15b_B[]; - -#endif -/* FILE END */ - - diff --git a/display_app/2in15_e-Paper_B/src/main.c b/display_app/2in15_e-Paper_B/src/main.c deleted file mode 100755 index c7f99729..00000000 --- a/display_app/2in15_e-Paper_B/src/main.c +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include -#include -#include -#include "EPD_2in15b_Manager.h" -#include "duos_pinmux.h" - -void Handler(int signo) -{ - //System Exit - printf("\r\nHandler:exit\r\n"); - DEV_Module_Exit(); - - exit(0); -} - -static int validate_file(const char *path) -{ - struct stat sb; - - if (path == NULL || path[0] == '\0') { - Debug("Error: empty filename\n"); - return 0; - } - if (stat(path, &sb) != 0) { - perror(path); - return 0; - } - if (!S_ISREG(sb.st_mode)) { - Debug("Error: %s is not a regular file\n", path); - return 0; - } - return 1; -} - -int main(int argc, char *argv[]) -{ - const char *file1; - const char *file2; - - /* 1) Check that exactly two arguments were provided */ - if (argc != 3) { - Debug("Usage: %s \n", argv[0]); - return EXIT_FAILURE; - } - file1 = argv[1]; - file2 = argv[2]; - - /* 2) Validate each file */ - if (!validate_file(file1) || !validate_file(file2)) { - return EXIT_FAILURE; - } - - /* 3) Setup Ctrl+C handler */ - signal(SIGINT, Handler); - - /* 4) Configure pinmux */ - duos_pinmux("B13", "SPI3_SDO"); - duos_pinmux("B14", "B14"); - duos_pinmux("B15", "SPI3_SCK"); - duos_pinmux("B16", "B16"); - duos_pinmux("B22", "B22"); - duos_pinmux("B20", "B20"); - duos_pinmux("B18", "B18"); - - if (EPD_2in15b_Manager(file1, file2) != 0) { - Debug("EPD_2in15b_Manager failed for %s and %s\n", file1, file2); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} diff --git a/display_app/duos/devmem.c b/display_app/duos/devmem.c deleted file mode 100755 index 56009979..00000000 --- a/display_app/duos/devmem.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - ** read/write phy addr in userspace - ** open /dev/mem - ** taiqiang.cao@bitmain.com - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devmem.h" -#include "Debug.h" - -static int devmem_fd; - -void *devm_map(unsigned long addr, int len) -{ - off_t offset; - void *map_base; - - devmem_fd = open("/dev/mem", O_RDWR | O_SYNC); - if (devmem_fd == -1) { - Debug("cannot open '/dev/mem'\n"); - goto open_err; - } - // DEBUG("/dev/mem opened.\n"); - - offset = addr & ~(sysconf(_SC_PAGE_SIZE) - 1); - - map_base = mmap(NULL, len + addr - offset, PROT_READ | PROT_WRITE, MAP_SHARED, devmem_fd, offset); - if (map_base == MAP_FAILED) { - Debug("mmap failed\n"); - goto mmap_err; - } - - // DEBUG("Memory mapped at address %p.\n", map_base + addr - offset); - - return map_base + addr - offset; - -mmap_err: - close(devmem_fd); - -open_err: - return NULL; -} - -void devm_unmap(void *virt_addr, int len) -{ - unsigned long addr; - - if (devmem_fd == -1) { - Debug("'/dev/mem' is closed\n"); - return; - } - - /* page align */ - addr = (((unsigned long)virt_addr) & ~(sysconf(_SC_PAGE_SIZE) - 1)); - munmap((void *)addr, len + (unsigned long)virt_addr - addr); - close(devmem_fd); -} - -/* read/write 32bit data*/ -uint32_t devmem_readl(unsigned long addr) -{ - uint32_t val; - void *virt_addr; - - virt_addr = devm_map(addr, 4); - if (virt_addr == NULL) { - Debug("readl addr map failed\n"); - return 0; - } - - val = *(uint32_t *)virt_addr; - - devm_unmap(virt_addr, 4); - - return val; -} - -void devmem_writel(unsigned long addr, uint32_t val) -{ - void *virt_addr; - - virt_addr = devm_map(addr, 4); - if (virt_addr == NULL) { - Debug("writel addr map failed\n"); - return; - } - - *(uint32_t *)virt_addr = val; - - devm_unmap(virt_addr, 4); -} diff --git a/display_app/duos/devmem.h b/display_app/duos/devmem.h deleted file mode 100755 index 360df8f5..00000000 --- a/display_app/duos/devmem.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _DEVMEM_H_ -#define _DEVMEM_H_ - -#include - -void *devm_map(unsigned long addr, int len); -void devm_unmap(void *virt_addr, int len); - -uint32_t devmem_readl(unsigned long addr); -void devmem_writel(unsigned long addr, uint32_t val); - -#endif diff --git a/display_app/duos/duos_pinmux.c b/display_app/duos/duos_pinmux.c deleted file mode 100755 index 655f0af1..00000000 --- a/display_app/duos/duos_pinmux.c +++ /dev/null @@ -1,109 +0,0 @@ -#include "devmem.h" -#include "func.h" -#include -#include -#include -#include -#include -#include "Debug.h" - -#define NELEMS(x) (sizeof(x) / sizeof((x)[0])) -#define PINMUX_BASE 0x03001000 -#define INVALID_PIN 9999 - -struct pinlist { - char name[32]; - uint32_t offset; -} pinlist_st; - -struct pinlist cv181x_pin[] = { - { "A16", 0x40 }, // UART0_TX - { "A17", 0x44 }, // UART0_RX - { "A19", 0x64 }, // JTAG_CPU_TMS - { "A18", 0x68 }, // JTAG_CPU_TCK - { "A20", 0x6c }, // JTAG_CPU_TRST - { "A28", 0x70 }, // IIC0_SCL - { "A29", 0x74 }, // IIC0_SDA - { "E0", 0xa4 }, // PWR_GPIO0 - { "E1", 0xa8 }, // PWR_GPIO1 - { "E2", 0xac }, // PWR_GPIO2 - { "B1", 0xf0 }, // ADC3 - { "B2", 0xf4 }, // ADC2 - { "B3", 0xf8 }, // ADC1 - { "B11", 0x134 }, // VIVO_D10 - { "B12", 0x138 }, // VIVO_D9 - { "B13", 0x13c }, // VIVO_D8 - { "B14", 0x140 }, // VIVO_D7 - { "B15", 0x144 }, // VIVO_D6 - { "B16", 0x148 }, // VIVO_D5 - { "B17", 0x14c }, // VIVO_D4 - { "B18", 0x150 }, // VIVO_D3 - { "B19", 0x154 }, // VIVO_D2 - { "B20", 0x158 }, // VIVO_D1 - { "B21", 0x15c }, // VIVO_D0 - { "B22", 0x160 }, // VIVO_CLK - { "C18", 0x194 }, // PAD_MIPI_TXM4 - { "C19", 0x198 }, // PAD_MIPI_TXP4 - { "C20", 0x19c }, // PAD_MIPI_TXM3 - { "C21", 0x1a0 }, // PAD_MIPI_TXP3 - { "C16", 0x1a4 }, // PAD_MIPI_TXM2 - { "C17", 0x1a8 }, // PAD_MIPI_TXP2 - { "C14", 0x1ac }, // PAD_MIPI_TXM1 - { "C15", 0x1b0 }, // PAD_MIPI_TXP1 - { "C12", 0x1b4 }, // PAD_MIPI_TXM0 - { "C13", 0x1b8 }, // PAD_MIPI_TXP0 -}; - -uint32_t convert_func_to_value(char *pin, char *func) -{ - uint32_t i = 0; - uint32_t max_fun_num = NELEMS(cv181x_pin_func); - char v; - - for (i = 0; i < max_fun_num; i++) { - if (strcmp(cv181x_pin_func[i].func, func) == 0) { - if (strncmp(cv181x_pin_func[i].name, pin, strlen(pin)) == 0) { - v = cv181x_pin_func[i].name[strlen(cv181x_pin_func[i].name) - 1]; - break; - } - } - } - - if (i == max_fun_num) { - Debug("ERROR: invalid pin or func\n"); - return INVALID_PIN; - } - - return (v - 0x30); -} - -int duos_pinmux(char *pin, char *func) -{ - int opt = 0; - uint32_t i = 0; - uint32_t value; - uint32_t f_val; - - Debug("pin %s\n", pin); - Debug("func %s\n", func); - - for (i = 0; i < NELEMS(cv181x_pin); i++) { - if (strcmp(pin, cv181x_pin[i].name) == 0) - break; - } - - if (i != NELEMS(cv181x_pin)) { - f_val = convert_func_to_value(pin, func); - if (f_val == INVALID_PIN) - return 1; - devmem_writel(PINMUX_BASE + cv181x_pin[i].offset, f_val); - - Debug("register: %x\n", PINMUX_BASE + cv181x_pin[i].offset); - Debug("value: %d\n", f_val); - - } else { - Debug("\nInvalid option: %s\n", optarg); - } - - return 0; -} diff --git a/display_app/duos/duos_pinmux.h b/display_app/duos/duos_pinmux.h deleted file mode 100755 index 527665b8..00000000 --- a/display_app/duos/duos_pinmux.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _DUOS_PINMUX_H_ -#define _DUOS_PINMUX_H_ - -int duos_pinmux(char *pin, char *func); - -#endif diff --git a/display_app/duos/func.h b/display_app/duos/func.h deleted file mode 100755 index bc608071..00000000 --- a/display_app/duos/func.h +++ /dev/null @@ -1,329 +0,0 @@ -struct funlist { - char name[32]; - char func[32]; -} funlist_st; - -struct funlist cv181x_pin_func[] = { - // A16 - UART0_TX - { "A160", "UART0_TX"}, - { "A161", "CAM_MCLK1"}, - { "A162", "PWM_4"}, - { "A163", "A16"}, - { "A164", "UART1_TX"}, - { "A165", "AUX1"}, - { "A167", "DBG_6"}, - - // A17 - UART0_RX - { "A170", "UART0_RX"}, - { "A171", "CAM_MCLK0"}, - { "A172", "PWM_5"}, - { "A173", "A17"}, - { "A174", "UART1_RX"}, - { "A175", "AUX0"}, - { "A177", "DBG_7"}, - - // A19 - JTAG_CPU_TMS - { "A190", "CV_2WTMS_CR_4WTMS"}, - { "A191", "CAM_MCLK0"}, - { "A192", "PWM_7"}, - { "A193", "A19"}, - { "A194", "UART1_RTS"}, - { "A195", "AUX0"}, - { "A196", "UART1_TX"}, - { "A197", "VO_D_28"}, - - // A18 - JTAG_CPU_TCK - { "A180", "CV_2WTCK_CR_4WTCK"}, - { "A181", "CAM_MCLK1"}, - { "A182", "PWM_6"}, - { "A183", "A18"}, - { "A184", "UART1_CTS"}, - { "A185", "AUX1"}, - { "A186", "UART1_RX"}, - { "A187", "VO_D_29"}, - - // A20 - JTAG_CPU_TRST - { "A200", "JTAG_CPU_TRST"}, - { "A203", "A20"}, - { "A206", "VO_D_30"}, - - // A28 - IIC0_SCL - { "A280", "CV_SCL0"}, - { "A281", "UART1_TX"}, - { "A282", "UART2_TX"}, - { "A283", "A28"}, - { "A285", "WG0_D0"}, - { "A287", "DBG_10"}, - - // A29 - IIC0_SDA - { "A290", "CV_SDA0"}, - { "A291", "UART1_RX"}, - { "A292", "UART2_RX"}, - { "A293", "A29"}, - { "A295", "WG0_D1"}, - { "A296", "WG1_D0"}, - { "A297", "DBG_11"}, - - // E0 - PWR_GPIO0 - { "E00", "E0"}, - { "E01", "UART2_TX"}, - { "E02", "PWR_UART0_RX"}, - { "E04", "PWM_8"}, - - // E1 - PWR_GPIO1 - { "E10", "E1"}, - { "E11", "UART2_RX"}, - { "E13", "EPHY_LNK_LED"}, - { "E14", "PWM_9"}, - { "E15", "PWR_IIC_SCL"}, - { "E16", "IIC2_SCL"}, - { "E17", "CV_4WTMS_CR_SDA0"}, - - // E2 - PWR_GPIO2 - { "E20", "E2"}, - { "E22", "PWR_SECTICK"}, - { "E23", "EPHY_SPD_LED"}, - { "E24", "PWM_10"}, - { "E25", "PWR_IIC_SDA"}, - { "E26", "IIC2_SDA"}, - { "E27", "CV_4WTCK_CR_2WTCK"}, - - // B1 - ADC3 - { "B11", "CAM_MCLK0"}, - { "B12", "IIC4_SCL"}, - { "B13", "B1"}, - { "B14", "PWM_12"}, - { "B15", "EPHY_LNK_LED"}, - { "B16", "WG2_D0"}, - { "B17", "UART3_TX"}, - - // B2 - ADC2 - { "B21", "CAM_MCLK1"}, - { "B22", "IIC4_SDA"}, - { "B23", "B2"}, - { "B24", "PWM_13"}, - { "B25", "EPHY_SPD_LED"}, - { "B26", "WG2_D1"}, - { "B27", "UART3_RX"}, - - // B3 - ADC1 - { "B33", "B3"}, - { "B34", "KEY_COL2"}, - - // B11 - VIVO_D10 - { "B110", "PWM_1"}, - { "B111", "VI1_D_10"}, - { "B112", "VO_D_23"}, - { "B113", "B11"}, - { "B114", "RMII0_IRQ"}, - { "B115", "CAM_MCLK0"}, - { "B116", "IIC1_SDA"}, - { "B117", "UART2_TX"}, - - // B12 - VIVO_D9 - { "B120", "PWM_2"}, - { "B121", "VI1_D_9"}, - { "B122", "VO_D_22"}, - { "B123", "B12"}, - { "B125", "CAM_MCLK1"}, - { "B126", "IIC1_SCL"}, - { "B127", "UART2_RX"}, - - // B13 - VIVO_D8 - { "B130", "PWM_3"}, - { "B131", "VI1_D_8"}, - { "B132", "VO_D_21"}, - { "B133", "B13"}, - { "B134", "RMII0_MDIO"}, - { "B135", "SPI3_SDO"}, - { "B136", "IIC2_SCL"}, - { "B137", "CAM_VS0"}, - - // B14 - VIVO_D7 - { "B140", "VI2_D_7"}, - { "B141", "VI1_D_7"}, - { "B142", "VO_D_20"}, - { "B143", "B14"}, - { "B144", "RMII0_RXD1"}, - { "B145", "SPI3_SDI"}, - { "B146", "IIC2_SDA"}, - { "B147", "CAM_HS0"}, - - // B15 - VIVO_D6 - { "B150", "VI2_D_6"}, - { "B151", "VI1_D_6"}, - { "B152", "VO_D_19"}, - { "B153", "B15"}, - { "B154", "RMII0_REFCLKI"}, - { "B155", "SPI3_SCK"}, - { "B156", "UART2_TX"}, - { "B157", "CAM_VS0"}, - - // B16 - VIVO_D5 - { "B160", "VI2_D_5"}, - { "B161", "VI1_D_5"}, - { "B162", "VO_D_18"}, - { "B163", "B16"}, - { "B164", "RMII0_RXD0"}, - { "B165", "SPI3_CS_X"}, - { "B166", "UART2_RX"}, - { "B167", "CAM_HS0"}, - - // B17 - VIVO_D4 - { "B170", "VI2_D_4"}, - { "B171", "VI1_D_4"}, - { "B172", "VO_D_17"}, - { "B173", "B17"}, - { "B174", "RMII0_MDC"}, - { "B175", "IIC1_SDA"}, - { "B176", "UART2_CTS"}, - { "B177", "CAM_VS0"}, - - // B18 - VIVO_D3 - { "B180", "VI2_D_3"}, - { "B181", "VI1_D_3"}, - { "B182", "VO_D_16"}, - { "B183", "B18"}, - { "B184", "RMII0_TXD0"}, - { "B185", "IIC1_SCL"}, - { "B186", "UART2_RTS"}, - { "B187", "CAM_HS0"}, - - // B19 - VIVO_D2 - { "B190", "VI2_D_2"}, - { "B191", "VI1_D_2"}, - { "B192", "VO_D_15"}, - { "B193", "B19"}, - { "B194", "RMII0_TXD1"}, - { "B195", "CAM_MCLK1"}, - { "B196", "PWM_2"}, - { "B197", "UART2_TX"}, - - // B20 - VIVO_D1 - { "B200", "VI2_D_1"}, - { "B201", "VI1_D_1"}, - { "B202", "VO_D_14"}, - { "B203", "B20"}, - { "B204", "RMII0_RXDV"}, - { "B205", "IIC3_SDA"}, - { "B206", "PWM_3"}, - { "B207", "IIC4_SCL"}, - - // B21 - VIVO_D0 - { "B210", "VI2_D_0"}, - { "B211", "VI1_D_0"}, - { "B212", "VO_D_13"}, - { "B213", "B21"}, - { "B214", "RMII0_TXCLK"}, - { "B215", "IIC3_SCL"}, - { "B216", "WG1_D0"}, - { "B217", "IIC4_SDA"}, - - // B22 - VIVO_CLK - { "B220", "VI2_CLK"}, - { "B221", "VI1_CLK"}, - { "B222", "VO_CLK1"}, - { "B223", "B22"}, - { "B224", "RMII0_TXEN"}, - { "B225", "CAM_MCLK0"}, - { "B226", "WG1_D1"}, - { "B227", "UART2_RX"}, - - // C18 - PAD_MIPI_TXM4 - { "C180", "VI0_D_15"}, - { "C181", "SD1_CLK"}, - { "C182", "VO_D_24"}, - { "C183", "C18"}, - { "C184", "CAM_MCLK1"}, - { "C185", "PWM_12"}, - { "C186", "IIC1_SDA"}, - { "C187", "DBG_18"}, - - // C19 - PAD_MIPI_TXP4 - { "C190", "VI0_D_16"}, - { "C191", "SD1_CMD"}, - { "C192", "VO_D_25"}, - { "C193", "C19"}, - { "C194", "CAM_MCLK0"}, - { "C195", "PWM_13"}, - { "C196", "IIC1_SCL"}, - { "C197", "DBG_19"}, - - // C20 - PAD_MIPI_TXM3 - { "C200", "VI0_D_17"}, - { "C201", "SD1_D0"}, - { "C202", "VO_D_26"}, - { "C203", "C20"}, - { "C204", "IIC2_SDA"}, - { "C205", "PWM_14"}, - { "C206", "IIC1_SDA"}, - { "C207", "CAM_VS0"}, - - // C21 - PAD_MIPI_TXP3 - { "C210", "VI0_D_18"}, - { "C211", "SD1_D1"}, - { "C212", "VO_D_27"}, - { "C213", "C21"}, - { "C214", "IIC2_SCL"}, - { "C215", "PWM_15"}, - { "C216", "IIC1_SCL"}, - { "C217", "CAM_HS0"}, - - // C16 - PAD_MIPI_TXM2 - { "C160", "CV_4WTMS_CR_SDA0"}, - { "C161", "VI0_D_13"}, - { "C162", "VO_D_0"}, - { "C163", "C16"}, - { "C164", "IIC1_SDA"}, - { "C165", "PWM_8"}, - { "C166", "SPI0_SCK"}, - { "C167", "SD1_D2"}, - - // C17 - PAD_MIPI_TXP2 - { "C170", "CV_4WTDI_CR_SCL0"}, - { "C171", "VI0_D_14"}, - { "C172", "VO_CLK0"}, - { "C173", "C17"}, - { "C174", "IIC1_SCL"}, - { "C175", "PWM_9"}, - { "C176", "SPI0_CS_X"}, - { "C177", "SD1_D3"}, - - // C14 - PAD_MIPI_TXM1 - { "C140", "CV_4WTDO_CR_2WTMS"}, - { "C141", "VI0_D_11"}, - { "C142", "VO_D_2"}, - { "C143", "C14"}, - { "C144", "IIC2_SDA"}, - { "C145", "PWM_10"}, - { "C146", "SPI0_SDO"}, - { "C147", "DBG_14"}, - - // C15 - PAD_MIPI_TXP1 - { "C150", "CV_4WTCK_CR_2WTCK"}, - { "C151", "VI0_D_12"}, - { "C152", "VO_D_1"}, - { "C153", "C15"}, - { "C154", "IIC2_SCL"}, - { "C155", "PWM_11"}, - { "C156", "SPI0_SDI"}, - { "C157", "DBG_15"}, - - // C12 - PAD_MIPI_TXM0 - { "C121", "VI0_D_9"}, - { "C122", "VO_D_4"}, - { "C123", "C12"}, - { "C124", "CAM_MCLK1"}, - { "C125", "PWM_14"}, - { "C126", "CAM_VS0"}, - { "C127", "DBG_12"}, - - // C13 - PAD_MIPI_TXP0 - { "C131", "VI0_D_10"}, - { "C132", "VO_D_3"}, - { "C133", "C13"}, - { "C134", "CAM_MCLK0"}, - { "C135", "PWM_15"}, - { "C136", "CAM_HS0"}, - { "C137", "DBG_13"}, -}; diff --git a/display_app/include/system/wiringx.h b/display_app/include/system/wiringx.h deleted file mode 100755 index 649bc60a..00000000 --- a/display_app/include/system/wiringx.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - Copyright (c) 2016 CurlyMo - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. -*/ - -#ifndef _WIRING_X_H_ -#define _WIRING_X_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -#define wiringXLog(a, b, ...) _wiringXLog(a, __FILE__, __LINE__, b, ##__VA_ARGS__) - -extern void (*_wiringXLog)(int, char *, int, const char *, ...); - -#define EXPORT __attribute__((visibility("default"))) - -#if !defined(PATH_MAX) - #if defined(_POSIX_PATH_MAX) - #define PATH_MAX _POSIX_PATH_MAX - #else - #define PATH_MAX 1024 - #endif -#endif - -enum function_t { - FUNCTION_UNKNOWN = 0, - FUNCTION_DIGITAL = 2, - FUNCTION_ANALOG = 4, - FUNCTION_I2C = 16, - FUNCTION_INTERRUPT = 32 -}; - -enum pinmode_t { - PINMODE_NOT_SET = 0, - PINMODE_INPUT = 2, - PINMODE_OUTPUT = 4, - PINMODE_INTERRUPT = 8 -}; - -enum isr_mode_t { - ISR_MODE_UNKNOWN = 0, - ISR_MODE_RISING = 2, - ISR_MODE_FALLING = 4, - ISR_MODE_BOTH = 8, - ISR_MODE_NONE = 16 -}; - -enum digital_value_t { - LOW, - HIGH -}; - -typedef struct wiringXSerial_t { - unsigned int baud; - unsigned int databits; - unsigned int parity; - unsigned int stopbits; - unsigned int flowcontrol; -} wiringXSerial_t; - -void delayMicroseconds(unsigned int); -int pinMode(int, enum pinmode_t); -int wiringXSetup(char *name, void (*func)(int, char *, int, const char *, ...)); -int wiringXGC(void); - -// int analogRead(int channel); -int digitalWrite(int, enum digital_value_t); -int digitalRead(int); -int waitForInterrupt(int, int); -int wiringXISR(int, enum isr_mode_t); - -int wiringXI2CRead(int); -int wiringXI2CReadReg8(int, int); -int wiringXI2CReadReg16(int, int); -int wiringXI2CWrite(int, int); -int wiringXI2CWriteReg8(int, int, int); -int wiringXI2CWriteReg16(int, int, int); -int wiringXI2CSetup(const char *, int); - -int wiringXSPIGetFd(int channel); -int wiringXSPIDataRW(int channel, unsigned char *data, int len); -int wiringXSPISetup(int channel, int speed); - -int wiringXSerialOpen(const char *, struct wiringXSerial_t); -void wiringXSerialFlush(int); -void wiringXSerialClose(int); -void wiringXSerialPutChar(int, unsigned char); -void wiringXSerialPuts(int, const char *); -void wiringXSerialPrintf(int, const char *, ...); -int wiringXSerialDataAvail(int); -int wiringXSerialGetChar(int); - -int wiringXPWMSetPeriod(int, long); -int wiringXPWMSetDuty(int, long); -int wiringXPWMSetPolarity(int, int); -int wiringXPWMEnable(int, int); - -char *wiringXPlatform(void); -int wiringXValidGPIO(int); -int wiringXSelectableFd(int); -int wiringXSupportedPlatforms(char ***); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/display_app/libs/system/musl_riscv64/libwiringx.so b/display_app/libs/system/musl_riscv64/libwiringx.so deleted file mode 100755 index 230a6831d6d3dc446a24caac8c56eedeeec5c229..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373104 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

(}mo+Q}2<2lx85^WF0u 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 diff --git a/duo-pinmux/duos/Makefile b/duo-pinmux/duos/Makefile deleted file mode 100644 index 8a4d64c0..00000000 --- a/duo-pinmux/duos/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -CC = riscv64-unknown-linux-musl-gcc - -source = duo_pinmux.c devmem.c -object = $(source:%.cc=%.o) - -CFLAGS += -mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d -static - -all: $(object) - $(CC) $(CFLAGS) $(object) -o duo-pinmux - -%.o: %.c - $(CC) $(CFLAGS) -c $< - -clean: - $(RM) *.o duo-pinmux diff --git a/duo-pinmux/duos/devmem.c b/duo-pinmux/duos/devmem.c deleted file mode 100644 index 2e37710c..00000000 --- a/duo-pinmux/duos/devmem.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - ** read/write phy addr in userspace - ** open /dev/mem - ** taiqiang.cao@bitmain.com - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devmem.h" - -// DEBUG_SET_LEVEL(DEBUG_LEVEL_ERR); -#define ERR printf -#define DEBUG printf - -static int devmem_fd; - -void *devm_map(unsigned long addr, int len) -{ - off_t offset; - void *map_base; - - devmem_fd = open("/dev/mem", O_RDWR | O_SYNC); - if (devmem_fd == -1) { - ERR("cannot open '/dev/mem'\n"); - goto open_err; - } - // DEBUG("/dev/mem opened.\n"); - - offset = addr & ~(sysconf(_SC_PAGE_SIZE) - 1); - - map_base = mmap(NULL, len + addr - offset, PROT_READ | PROT_WRITE, MAP_SHARED, devmem_fd, offset); - if (map_base == MAP_FAILED) { - ERR("mmap failed\n"); - goto mmap_err; - } - - // DEBUG("Memory mapped at address %p.\n", map_base + addr - offset); - - return map_base + addr - offset; - -mmap_err: - close(devmem_fd); - -open_err: - return NULL; -} - -void devm_unmap(void *virt_addr, int len) -{ - unsigned long addr; - - if (devmem_fd == -1) { - ERR("'/dev/mem' is closed\n"); - return; - } - - /* page align */ - addr = (((unsigned long)virt_addr) & ~(sysconf(_SC_PAGE_SIZE) - 1)); - munmap((void *)addr, len + (unsigned long)virt_addr - addr); - close(devmem_fd); -} - -/* read/write 32bit data*/ -uint32_t devmem_readl(unsigned long addr) -{ - uint32_t val; - void *virt_addr; - - virt_addr = devm_map(addr, 4); - if (virt_addr == NULL) { - ERR("readl addr map failed\n"); - return 0; - } - - val = *(uint32_t *)virt_addr; - - devm_unmap(virt_addr, 4); - - return val; -} - -void devmem_writel(unsigned long addr, uint32_t val) -{ - void *virt_addr; - - virt_addr = devm_map(addr, 4); - if (virt_addr == NULL) { - ERR("writel addr map failed\n"); - return; - } - - *(uint32_t *)virt_addr = val; - - devm_unmap(virt_addr, 4); -} diff --git a/duo-pinmux/duos/devmem.h b/duo-pinmux/duos/devmem.h deleted file mode 100644 index 79fd8f9f..00000000 --- a/duo-pinmux/duos/devmem.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _DEVMEM_H_ -#define _DEVMEM_H_ - -#include - -void *devm_map(unsigned long addr, int len); -void devm_unmap(void *virt_addr, int len); - -uint32_t devmem_readl(unsigned long addr); -void devmem_writel(unsigned long addr, uint32_t val); - -#endif diff --git a/duo-pinmux/duos/duo-pinmux b/duo-pinmux/duos/duo-pinmux deleted file mode 100755 index d1a6f1fdc1016bb47a48ae05bc7e9f06e077b5b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31432 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 diff --git a/duo-pinmux/duos/duo_pinmux.c b/duo-pinmux/duos/duo_pinmux.c deleted file mode 100644 index 54d9dded..00000000 --- a/duo-pinmux/duos/duo_pinmux.c +++ /dev/null @@ -1,201 +0,0 @@ -#include "devmem.h" -#include "func.h" -#include -#include -#include -#include -#include - -#define NELEMS(x) (sizeof(x) / sizeof((x)[0])) -#define PINMUX_BASE 0x03001000 -#define INVALID_PIN 9999 - -struct pinlist { - char name[32]; - uint32_t offset; -} pinlist_st; - -struct pinlist cv181x_pin[] = { - { "A16", 0x40 }, // UART0_TX - { "A17", 0x44 }, // UART0_RX - { "A19", 0x64 }, // JTAG_CPU_TMS - { "A18", 0x68 }, // JTAG_CPU_TCK - { "A20", 0x6c }, // JTAG_CPU_TRST - { "A28", 0x70 }, // IIC0_SCL - { "A29", 0x74 }, // IIC0_SDA - { "E0", 0xa4 }, // PWR_GPIO0 - { "E1", 0xa8 }, // PWR_GPIO1 - { "E2", 0xac }, // PWR_GPIO2 - { "B1", 0xf0 }, // ADC3 - { "B2", 0xf4 }, // ADC2 - { "B3", 0xf8 }, // ADC1 - { "B11", 0x134 }, // VIVO_D10 - { "B12", 0x138 }, // VIVO_D9 - { "B13", 0x13c }, // VIVO_D8 - { "B14", 0x140 }, // VIVO_D7 - { "B15", 0x144 }, // VIVO_D6 - { "B16", 0x148 }, // VIVO_D5 - { "B17", 0x14c }, // VIVO_D4 - { "B18", 0x150 }, // VIVO_D3 - { "B19", 0x154 }, // VIVO_D2 - { "B20", 0x158 }, // VIVO_D1 - { "B21", 0x15c }, // VIVO_D0 - { "B22", 0x160 }, // VIVO_CLK - { "C18", 0x194 }, // PAD_MIPI_TXM4 - { "C19", 0x198 }, // PAD_MIPI_TXP4 - { "C20", 0x19c }, // PAD_MIPI_TXM3 - { "C21", 0x1a0 }, // PAD_MIPI_TXP3 - { "C16", 0x1a4 }, // PAD_MIPI_TXM2 - { "C17", 0x1a8 }, // PAD_MIPI_TXP2 - { "C14", 0x1ac }, // PAD_MIPI_TXM1 - { "C15", 0x1b0 }, // PAD_MIPI_TXP1 - { "C12", 0x1b4 }, // PAD_MIPI_TXM0 - { "C13", 0x1b8 }, // PAD_MIPI_TXP0 -}; - -uint32_t convert_func_to_value(char *pin, char *func) -{ - uint32_t i = 0; - uint32_t max_fun_num = NELEMS(cv181x_pin_func); - char v; - - for (i = 0; i < max_fun_num; i++) { - if (strcmp(cv181x_pin_func[i].func, func) == 0) { - if (strncmp(cv181x_pin_func[i].name, pin, strlen(pin)) == 0) { - v = cv181x_pin_func[i].name[strlen(cv181x_pin_func[i].name) - 1]; - break; - } - } - } - - if (i == max_fun_num) { - printf("ERROR: invalid pin or func\n"); - return INVALID_PIN; - } - - return (v - 0x30); -} - -void print_fun(char *name, uint32_t value) -{ - uint32_t i = 0; - uint32_t max_fun_num = NELEMS(cv181x_pin_func); - char pinname[128]; - - sprintf(pinname, "%s%d", name, value); - - printf("%s function:\n", name); - for (i = 0; i < max_fun_num; i++) { - if (strlen(cv181x_pin_func[i].name) != (strlen(name) + 1)) { - continue; - } - if (strncmp(pinname, cv181x_pin_func[i].name, strlen(name)) == 0) { - if (strcmp(pinname, cv181x_pin_func[i].name) == 0) - printf("[v] %s\n", cv181x_pin_func[i].func); - else - printf("[ ] %s\n", cv181x_pin_func[i].func); - // break; - } - } - printf("\n"); -} - -void print_usage(const char *prog) -{ - printf("pinmux for duos\n"); - printf("%s -p <== List all pins\n", prog); - printf("%s -l <== List all pins and its func\n", prog); - printf("%s -r pin <== Get func from pin\n", prog); - printf("%s -w pin/func <== Set func to pin\n", prog); -} - -int main(int argc, char *argv[]) -{ - int opt = 0; - uint32_t i = 0; - uint32_t value; - char pin[32]; - char func[32]; - uint32_t f_val; - - if (argc == 1) { - print_usage(argv[0]); - return 1; - } - - while ((opt = getopt(argc, argv, "hplr:w:")) != -1) { - switch (opt) { - case 'r': - for (i = 0; i < NELEMS(cv181x_pin); i++) { - if (strcmp(optarg, cv181x_pin[i].name) == 0) - break; - } - if (i != NELEMS(cv181x_pin)) { - value = devmem_readl(PINMUX_BASE + cv181x_pin[i].offset); - // printf("value %d\n", value); - print_fun(optarg, value); - - printf("register: 0x%x\n", PINMUX_BASE + cv181x_pin[i].offset); - printf("value: %d\n", value); - } else { - printf("\nInvalid option: %s", optarg); - } - break; - - case 'w': - // printf("optarg %s\n", optarg); - if (sscanf(optarg, "%[^/]/%s", pin, func) != 2) - print_usage(argv[0]); - - printf("pin %s\n", pin); - printf("func %s\n", func); - - for (i = 0; i < NELEMS(cv181x_pin); i++) { - if (strcmp(pin, cv181x_pin[i].name) == 0) - break; - } - - if (i != NELEMS(cv181x_pin)) { - f_val = convert_func_to_value(pin, func); - if (f_val == INVALID_PIN) - return 1; - devmem_writel(PINMUX_BASE + cv181x_pin[i].offset, f_val); - - printf("register: %x\n", PINMUX_BASE + cv181x_pin[i].offset); - printf("value: %d\n", f_val); - // printf("value %d\n", value); - } else { - printf("\nInvalid option: %s\n", optarg); - } - break; - - case 'p': - printf("Pinlist:\n"); - for (i = 0; i < NELEMS(cv181x_pin); i++) - printf("%s\n", cv181x_pin[i].name); - break; - - case 'l': - for (i = 0; i < NELEMS(cv181x_pin); i++) { - value = devmem_readl(PINMUX_BASE + cv181x_pin[i].offset); - // printf("value %d\n", value); - print_fun(cv181x_pin[i].name, value); - } - break; - - case 'h': - print_usage(argv[0]); - break; - - case '?': - print_usage(argv[0]); - break; - - default: - print_usage(argv[0]); - break; - } - } - - return 0; -} diff --git a/duo-pinmux/duos/func.h b/duo-pinmux/duos/func.h deleted file mode 100644 index 333c6808..00000000 --- a/duo-pinmux/duos/func.h +++ /dev/null @@ -1,329 +0,0 @@ -struct funlist { - char name[32]; - char func[32]; -} funlist_st; - -struct funlist cv181x_pin_func[] = { - // A16 - UART0_TX - { "A160", "UART0_TX"}, - { "A161", "CAM_MCLK1"}, - { "A162", "PWM_4"}, - { "A163", "A16"}, - { "A164", "UART1_TX"}, - { "A165", "AUX1"}, - { "A167", "DBG_6"}, - - // A17 - UART0_RX - { "A170", "UART0_RX"}, - { "A171", "CAM_MCLK0"}, - { "A172", "PWM_5"}, - { "A173", "A17"}, - { "A174", "UART1_RX"}, - { "A175", "AUX0"}, - { "A177", "DBG_7"}, - - // A19 - JTAG_CPU_TMS - { "A190", "CV_2WTMS_CR_4WTMS"}, - { "A191", "CAM_MCLK0"}, - { "A192", "PWM_7"}, - { "A193", "A19"}, - { "A194", "UART1_RTS"}, - { "A195", "AUX0"}, - { "A196", "UART1_TX"}, - { "A197", "VO_D_28"}, - - // A18 - JTAG_CPU_TCK - { "A180", "CV_2WTCK_CR_4WTCK"}, - { "A181", "CAM_MCLK1"}, - { "A182", "PWM_6"}, - { "A183", "A18"}, - { "A184", "UART1_CTS"}, - { "A185", "AUX1"}, - { "A186", "UART1_RX"}, - { "A187", "VO_D_29"}, - - // A20 - JTAG_CPU_TRST - { "A200", "JTAG_CPU_TRST"}, - { "A203", "A20"}, - { "A206", "VO_D_30"}, - - // A28 - IIC0_SCL - { "A280", "CV_SCL0"}, - { "A281", "UART1_TX"}, - { "A282", "UART2_TX"}, - { "A283", "A28"}, - { "A285", "WG0_D0"}, - { "A287", "DBG_10"}, - - // A29 - IIC0_SDA - { "A290", "CV_SDA0"}, - { "A291", "UART1_RX"}, - { "A292", "UART2_RX"}, - { "A293", "A29"}, - { "A295", "WG0_D1"}, - { "A296", "WG1_D0"}, - { "A297", "DBG_11"}, - - // E0 - PWR_GPIO0 - { "E00", "E0"}, - { "E01", "UART2_TX"}, - { "E02", "PWR_UART0_RX"}, - { "E04", "PWM_8"}, - - // E1 - PWR_GPIO1 - { "E10", "E1"}, - { "E11", "UART2_RX"}, - { "E13", "EPHY_LNK_LED"}, - { "E14", "PWM_9"}, - { "E15", "PWR_IIC_SCL"}, - { "E16", "IIC2_SCL"}, - { "E17", "CV_4WTMS_CR_SDA0"}, - - // E2 - PWR_GPIO2 - { "E20", "E2"}, - { "E22", "PWR_SECTICK"}, - { "E23", "EPHY_SPD_LED"}, - { "E24", "PWM_10"}, - { "E25", "PWR_IIC_SDA"}, - { "E26", "IIC2_SDA"}, - { "E27", "CV_4WTCK_CR_2WTCK"}, - - // B1 - ADC3 - { "B11", "CAM_MCLK0"}, - { "B12", "IIC4_SCL"}, - { "B13", "B1"}, - { "B14", "PWM_12"}, - { "B15", "EPHY_LNK_LED"}, - { "B16", "WG2_D0"}, - { "B17", "UART3_TX"}, - - // B2 - ADC2 - { "B21", "CAM_MCLK1"}, - { "B22", "IIC4_SDA"}, - { "B23", "B2"}, - { "B24", "PWM_13"}, - { "B25", "EPHY_SPD_LED"}, - { "B26", "WG2_D1"}, - { "B27", "UART3_RX"}, - - // B3 - ADC1 - { "B33", "B3"}, - { "B34", "KEY_COL2"}, - - // B11 - VIVO_D10 - { "B110", "PWM_1"}, - { "B111", "VI1_D_10"}, - { "B112", "VO_D_23"}, - { "B113", "B11"}, - { "B114", "RMII0_IRQ"}, - { "B115", "CAM_MCLK0"}, - { "B116", "IIC1_SDA"}, - { "B117", "UART2_TX"}, - - // B12 - VIVO_D9 - { "B120", "PWM_2"}, - { "B121", "VI1_D_9"}, - { "B122", "VO_D_22"}, - { "B123", "B12"}, - { "B125", "CAM_MCLK1"}, - { "B126", "IIC1_SCL"}, - { "B127", "UART2_RX"}, - - // B13 - VIVO_D8 - { "B130", "PWM_3"}, - { "B131", "VI1_D_8"}, - { "B132", "VO_D_21"}, - { "B133", "B13"}, - { "B134", "RMII0_MDIO"}, - { "B135", "SPI3_SDO"}, - { "B136", "IIC2_SCL"}, - { "B137", "CAM_VS0"}, - - // B14 - VIVO_D7 - { "B140", "VI2_D_7"}, - { "B141", "VI1_D_7"}, - { "B142", "VO_D_20"}, - { "B143", "B14"}, - { "B144", "RMII0_RXD1"}, - { "B145", "SPI3_SDI"}, - { "B146", "IIC2_SDA"}, - { "B147", "CAM_HS0"}, - - // B15 - VIVO_D6 - { "B150", "VI2_D_6"}, - { "B151", "VI1_D_6"}, - { "B152", "VO_D_19"}, - { "B153", "B15"}, - { "B154", "RMII0_REFCLKI"}, - { "B155", "SPI3_SCK"}, - { "B156", "UART2_TX"}, - { "B157", "CAM_VS0"}, - - // B16 - VIVO_D5 - { "B160", "VI2_D_5"}, - { "B161", "VI1_D_5"}, - { "B162", "VO_D_18"}, - { "B163", "B16"}, - { "B164", "RMII0_RXD0"}, - { "B165", "SPI3_CS_X"}, - { "B166", "UART2_RX"}, - { "B167", "CAM_HS0"}, - - // B17 - VIVO_D4 - { "B170", "VI2_D_4"}, - { "B171", "VI1_D_4"}, - { "B172", "VO_D_17"}, - { "B173", "B17"}, - { "B174", "RMII0_MDC"}, - { "B175", "IIC1_SDA"}, - { "B176", "UART2_CTS"}, - { "B177", "CAM_VS0"}, - - // B18 - VIVO_D3 - { "B180", "VI2_D_3"}, - { "B181", "VI1_D_3"}, - { "B182", "VO_D_16"}, - { "B183", "B18"}, - { "B184", "RMII0_TXD0"}, - { "B185", "IIC1_SCL"}, - { "B186", "UART2_RTS"}, - { "B187", "CAM_HS0"}, - - // B19 - VIVO_D2 - { "B190", "VI2_D_2"}, - { "B191", "VI1_D_2"}, - { "B192", "VO_D_15"}, - { "B193", "B19"}, - { "B194", "RMII0_TXD1"}, - { "B195", "CAM_MCLK1"}, - { "B196", "PWM_2"}, - { "B197", "UART2_TX"}, - - // B20 - VIVO_D1 - { "B200", "VI2_D_1"}, - { "B201", "VI1_D_1"}, - { "B202", "VO_D_14"}, - { "B203", "B20"}, - { "B204", "RMII0_RXDV"}, - { "B205", "IIC3_SDA"}, - { "B206", "PWM_3"}, - { "B207", "IIC4_SCL"}, - - // B21 - VIVO_D0 - { "B210", "VI2_D_0"}, - { "B211", "VI1_D_0"}, - { "B212", "VO_D_13"}, - { "B213", "B21"}, - { "B214", "RMII0_TXCLK"}, - { "B215", "IIC3_SCL"}, - { "B216", "WG1_D0"}, - { "B217", "IIC4_SDA"}, - - // B22 - VIVO_CLK - { "B220", "VI2_CLK"}, - { "B221", "VI1_CLK"}, - { "B222", "VO_CLK1"}, - { "B223", "B22"}, - { "B224", "RMII0_TXEN"}, - { "B225", "CAM_MCLK0"}, - { "B226", "WG1_D1"}, - { "B227", "UART2_RX"}, - - // C18 - PAD_MIPI_TXM4 - { "C180", "VI0_D_15"}, - { "C181", "SD1_CLK"}, - { "C182", "VO_D_24"}, - { "C183", "C18"}, - { "C184", "CAM_MCLK1"}, - { "C185", "PWM_12"}, - { "C186", "IIC1_SDA"}, - { "C187", "DBG_18"}, - - // C19 - PAD_MIPI_TXP4 - { "C190", "VI0_D_16"}, - { "C191", "SD1_CMD"}, - { "C192", "VO_D_25"}, - { "C193", "C19"}, - { "C194", "CAM_MCLK0"}, - { "C195", "PWM_13"}, - { "C196", "IIC1_SCL"}, - { "C197", "DBG_19"}, - - // C20 - PAD_MIPI_TXM3 - { "C200", "VI0_D_17"}, - { "C201", "SD1_D0"}, - { "C202", "VO_D_26"}, - { "C203", "C20"}, - { "C204", "IIC2_SDA"}, - { "C205", "PWM_14"}, - { "C206", "IIC1_SDA"}, - { "C207", "CAM_VS0"}, - - // C21 - PAD_MIPI_TXP3 - { "C210", "VI0_D_18"}, - { "C211", "SD1_D1"}, - { "C212", "VO_D_27"}, - { "C213", "C21"}, - { "C214", "IIC2_SCL"}, - { "C215", "PWM_15"}, - { "C216", "IIC1_SCL"}, - { "C217", "CAM_HS0"}, - - // C16 - PAD_MIPI_TXM2 - { "C160", "CV_4WTMS_CR_SDA0"}, - { "C161", "VI0_D_13"}, - { "C162", "VO_D_0"}, - { "C163", "C16"}, - { "C164", "IIC1_SDA"}, - { "C165", "PWM_8"}, - { "C166", "SPI0_SCK"}, - { "C167", "SD1_D2"}, - - // C17 - PAD_MIPI_TXP2 - { "C170", "CV_4WTDI_CR_SCL0"}, - { "C171", "VI0_D_14"}, - { "C172", "VO_CLK0"}, - { "C173", "C17"}, - { "C174", "IIC1_SCL"}, - { "C175", "PWM_9"}, - { "C176", "SPI0_CS_X"}, - { "C177", "SD1_D3"}, - - // C14 - PAD_MIPI_TXM1 - { "C140", "CV_4WTDO_CR_2WTMS"}, - { "C141", "VI0_D_11"}, - { "C142", "VO_D_2"}, - { "C143", "C14"}, - { "C144", "IIC2_SDA"}, - { "C145", "PWM_10"}, - { "C146", "SPI0_SDO"}, - { "C147", "DBG_14"}, - - // C15 - PAD_MIPI_TXP1 - { "C150", "CV_4WTCK_CR_2WTCK"}, - { "C151", "VI0_D_12"}, - { "C152", "VO_D_1"}, - { "C153", "C15"}, - { "C154", "IIC2_SCL"}, - { "C155", "PWM_11"}, - { "C156", "SPI0_SDI"}, - { "C157", "DBG_15"}, - - // C12 - PAD_MIPI_TXM0 - { "C121", "VI0_D_9"}, - { "C122", "VO_D_4"}, - { "C123", "C12"}, - { "C124", "CAM_MCLK1"}, - { "C125", "PWM_14"}, - { "C126", "CAM_VS0"}, - { "C127", "DBG_12"}, - - // C13 - PAD_MIPI_TXP0 - { "C131", "VI0_D_10"}, - { "C132", "VO_D_3"}, - { "C133", "C13"}, - { "C134", "CAM_MCLK0"}, - { "C135", "PWM_15"}, - { "C136", "CAM_HS0"}, - { "C137", "DBG_13"}, -}; diff --git a/web_app/requirements_build.txt b/web_app/requirements_build.txt deleted file mode 100755 index 5dde2a9f..00000000 --- a/web_app/requirements_build.txt +++ /dev/null @@ -1,6 +0,0 @@ -cryptography==42.0.7 -cffi==1.16.0 -gevent==24.2.1 #compilato con pip download -lxml==4.9.3 #ancora no -pystemd==0.13.2 #ancora no -pyOpenSSL==24.1.0 \ No newline at end of file From 8bf31e7c8375d39fc1f92bef7155e93f76baddd8 Mon Sep 17 00:00:00 2001 From: topolonelli Date: Wed, 14 May 2025 13:24:33 +0200 Subject: [PATCH 21/23] code cleanup --- tools/install.sh | 70 ++++++++-------------------------- web_app/requirements_riscv.txt | 63 ------------------------------ 2 files changed, 15 insertions(+), 118 deletions(-) delete mode 100644 web_app/requirements_riscv.txt diff --git a/tools/install.sh b/tools/install.sh index 8b08b616..0fad28ae 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -116,7 +116,7 @@ install_dependencies() { echo '################################' apt-get "${APT_TIMEOUT}" update -y || exit 1 apt-get "${APT_TIMEOUT}" upgrade -y - apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables wget curl lrzsz musl-tools || exit 1 + apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables wget curl lrzsz || exit 1 apt-get "${APT_TIMEOUT}" install -y libxml2-dev libxslt-dev libc6 || exit 1 # needed for lxml (for pystemd) apt-get "${APT_TIMEOUT}" install -y wireless-tools wpasupplicant || exit 1 apt-get "${APT_TIMEOUT}" clean -y @@ -124,19 +124,6 @@ install_dependencies() { apt-get "${APT_TIMEOUT}" autoremove -y python3 --version - #enable Debian terminal via ttyS0 - echo '################################' - echo 'CONFIGURING TERMINAL VIA ttyS0' - echo '################################' - systemctl enable serial-getty@ttyS0.service - systemctl start serial-getty@ttyS0.service - - # Run swap.sh - echo '################################' - echo 'CONFIGURING SWAP' - echo '################################' - "${rtkbase_path}"/tools/swap.sh - } install_gpsd_chrony() { @@ -349,11 +336,14 @@ rtkbase_requirements(){ echo 'Platform:' echo $platform echo '################################' + if [[$platform =~ 'riscv64' ]] + then # install system python pre-built packages apt-get "${APT_TIMEOUT}" install -y python3.13-venv apt-get "${APT_TIMEOUT}" install -y python3-lxml python3-pystemd python3-cryptography python3-cffi python3-gevent || exit 1 # create virtual environnement for rtkbase sudo -u "${RTKBASE_USER}" python3 -m venv --system-site-packages "${rtkbase_path}"/venv + fi python_venv="${rtkbase_path}"/venv/bin/python if [[ $platform =~ 'aarch64' || $platform =~ 'x86_64' || $platform =~ 'riscv64' ]] then @@ -373,21 +363,17 @@ rtkbase_requirements(){ cp "${rtkbase_path}/settings.conf.default" "${rtkbase_path}/settings.conf" fi #Then launch check cpu temp script for OPI zero LTS - echo '################################ 2' source "${rtkbase_path}/tools/opizero_temp_offset.sh" - #venv module installation - echo '################################ 3' - sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install --upgrade pip setuptools wheel --extra-index-url https://www.piwheels.org/simple - - echo '################################ 4' - sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install -r "${rtkbase_path}"/web_app/requirements.txt --extra-index-url https://www.piwheels.org/simple + if [[$platform =~ 'riscv64' ]] + then + #venv module installation + sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install --upgrade pip setuptools wheel --extra-index-url https://www.piwheels.org/simple + sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install -r "${rtkbase_path}"/web_app/requirements.txt --extra-index-url https://www.piwheels.org/simple - #Installing requirements for Cellular modem. Installing them during the Armbian firstrun doesn't work because the network isn't fully up. - echo '################################ 5' - sudo -u "${RTKBASE_USER}" "${rtkbase_path}/venv/bin/python" -m pip install nmcli --extra-index-url https://www.piwheels.org/simple - echo '################################ 6' - sudo -u "${RTKBASE_USER}" "${rtkbase_path}/venv/bin/python" -m pip install git+https://github.com/Stefal/sim-modem.git - + #Installing requirements for Cellular modem. Installing them during the Armbian firstrun doesn't work because the network isn't fully up. + sudo -u "${RTKBASE_USER}" "${rtkbase_path}/venv/bin/python" -m pip install nmcli --extra-index-url https://www.piwheels.org/simple + sudo -u "${RTKBASE_USER}" "${rtkbase_path}/venv/bin/python" -m pip install git+https://github.com/Stefal/sim-modem.git + if } install_unit_files() { @@ -408,28 +394,6 @@ install_unit_files() { fi } -MilkV_DuoS_Pin_Mux() { - - platform=$(uname -m) - # Only execute the function if $platform contains 'riscv64'. - if [[ "$platform" =~ riscv64 ]]; then - - # Check if rtkbase_path variable is set. - if [ -z "$rtkbase_path" ]; then - echo "Error: rtkbase_path is not set. Please set rtkbase_path to the base directory." - return 1 - fi - - # Execute the duo-pinmux commands using the rtkbase_path. - #sudo "${rtkbase_path}/duo-pinmux/duos/duo-pinmux" -r B11 - #sudo "${rtkbase_path}/duo-pinmux/duos/duo-pinmux" -r B12 - sudo "${rtkbase_path}/duo-pinmux/duos/duo-pinmux" -w B11/UART2_TX - sudo "${rtkbase_path}/duo-pinmux/duos/duo-pinmux" -w B12/UART2_RX - - fi - -} - detect_gnss() { python_venv="${rtkbase_path}"/venv/bin/python echo '################################' @@ -474,10 +438,8 @@ detect_gnss() { echo 'UART GNSS RECEIVER DETECTION' echo '################################' systemctl is-active --quiet str2str_tcp.service && sudo systemctl stop str2str_tcp.service && echo 'Stopping str2str_tcp service' - # Set correct PIN Multiplexer - MilkV_DuoS_Pin_Mux # TODO remove port if not available in /dev/ - for port in ttyS2 ttyUSB0 ttyUSB1 ttyUSB2 serial0 ttyS1 ttyS0 ttyS3 ttyS4 ttyS5; do + for port in ttyUSB0 ttyUSB1 ttyUSB2 serial0 ttyS0 ttyS1 ttyS2 ttyS3 ttyS4 ttyS5; do for port_speed in 115200 57600 38400 19200 9600; do echo 'DETECTION ON ' $port ' at ' $port_speed if [[ $(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/ubxtool -f /dev/$port -s $port_speed -p MON-VER -w 5 2>/dev/null) =~ 'ZED-F9P' ]]; then @@ -791,7 +753,7 @@ main() { ARG_PIN_MUX=0 ARG_ALL=0 - PARSED_ARGUMENTS=$(getopt --name install --options hu:drbi:jf:qtgencmsza: --longoptions help,user:,dependencies,rtklib,rtkbase-release,rtkbase-repo:,rtkbase-bundled,rtkbase-custom:,rtkbase-requirements,unit-files,gpsd-chrony,detect-gnss,no-write-port,configure-gnss,detect-modem,start-services,zeroconf,pin-mux,all: -- "$@") + PARSED_ARGUMENTS=$(getopt --name install --options hu:drbi:jf:qtgencmsza: --longoptions help,user:,dependencies,rtklib,rtkbase-release,rtkbase-repo:,rtkbase-bundled,rtkbase-custom:,rtkbase-requirements,unit-files,gpsd-chrony,detect-gnss,no-write-port,configure-gnss,detect-modem,start-services,zeroconf,all: -- "$@") VALID_ARGUMENTS=$? if [ "$VALID_ARGUMENTS" != "0" ]; then #man_help @@ -821,7 +783,6 @@ main() { -m | --detect-modem) ARG_DETECT_MODEM=1 ; shift ;; -s | --start-services) ARG_START_SERVICES=1 ; shift ;; -z | --zeroconf) ARG_ZEROCONF=1 ; shift ;; - -p | --pin-mux) ARG_PIN_MUX=1 ; shift ;; -a | --all) ARG_ALL="${2}" ; shift 2 ;; # -- means the end of the arguments; drop this, and break out of the while loop --) shift; break ;; @@ -885,7 +846,6 @@ main() { [ $ARG_DETECT_MODEM -eq 1 ] && { detect_usb_modem && _add_modem_port && _configure_modem ; ((cumulative_exit+=$?)) ;} [ $ARG_ZEROCONF -eq 1 ] && { install_zeroconf_service; ((cumulative_exit+=$?)) ;} [ $ARG_START_SERVICES -eq 1 ] && { start_services ; ((cumulative_exit+=$?)) ;} - [ $ARG_PIN_MUX -eq 1 ] && { MilkV_DuoS_Pin_Mux ; ((cumulative_exit+=$?)) ;} } main "$@" diff --git a/web_app/requirements_riscv.txt b/web_app/requirements_riscv.txt deleted file mode 100644 index 6a1b935e..00000000 --- a/web_app/requirements_riscv.txt +++ /dev/null @@ -1,63 +0,0 @@ -autocommand==2.2.2 -bcrypt==4.2.0 -beautifulsoup4==4.13.3 -bidict==0.22.1 -blinker==1.6.3 -Bootstrap-Flask==2.4.0 -certifi==2024.2.2 -cffi==1.17.1 -chardet==5.2.0 -charset-normalizer==3.3.2 -click==8.1.7 -cryptography==43.0.0 -cssselect==1.2.0 -distro==1.8.0 -dnspython==2.6.1 -Flask==3.0.3 -Flask-Login==0.6.3 -Flask-SocketIO==5.3.6 -Flask-WTF==1.2.1 -gevent==24.11.1 -geventmp==0.0.9 -greenlet==3.1.1 -gunicorn==22.0.0 -h11==0.14.0 -html5lib-modern==1.2 -idna==3.7 -inflect==7.3.1 -itsdangerous==2.1.2 -jaraco.context==6.0.0 -jaraco.functools==4.1.0 -jaraco.text==4.0.0 -Jinja2==3.1.4 -lxml==5.3.1 -MarkupSafe==2.1.3 -more-itertools==10.6.0 -nmcli==1.3.0 -packaging==24.2 -pexpect==4.8.0 -ply==3.11 -psutil==5.9.6 -ptyprocess==0.7.0 -pycparser==2.21 -pyserial==3.5 -pystemd==0.13.2 -python-engineio==4.8.0 -python-socketio==5.10.0 -requests==2.32.3 -setuptools==75.8.2 -sim-modem @ git+https://github.com/Stefal/sim-modem.git@bd2416794f446d1be92ec425d18a87622a04a2b6 -simple-websocket==1.0.0 -six==1.16.0 -soupsieve==2.6 -typeguard==4.4.2 -typing_extensions==4.12.2 -urllib3==2.0.7 -webencodings==0.5.1 -Werkzeug==3.0.3 -wheel==0.45.1 -wsproto==1.2.0 -WTForms==3.1.0 -zipp==3.21.0 -zope.event==5.0 -zope.interface==7.2 From 5c2e75701884b1ec7e297f2b55b05e78b4bbc924 Mon Sep 17 00:00:00 2001 From: tommasopolonelli Date: Wed, 14 May 2025 13:25:34 +0200 Subject: [PATCH 22/23] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06cf74bf..440ad029 100644 --- a/README.md +++ b/README.md @@ -337,7 +337,7 @@ A gnss receiver with a timepulse output is a very accurate [stratum 0](https://e ``` ## Requirements: Debian base distro >= 11 (Bullseye) -Python >= 3.8 <=3.12 + 3.8 >= Python <= 3.13 ## History: See the [changelog](./CHANGELOG.md) From cb49eb8ad33654d333ffa4ad12fef0a6474535e9 Mon Sep 17 00:00:00 2001 From: topolonelli Date: Wed, 14 May 2025 13:33:50 +0200 Subject: [PATCH 23/23] Back to default config --- settings.conf.default | 2 +- tools/install.sh | 6 +++--- tools/swap.sh | 42 ------------------------------------------ 3 files changed, 4 insertions(+), 46 deletions(-) delete mode 100755 tools/swap.sh diff --git a/settings.conf.default b/settings.conf.default index 2ca26881..1a70e6ca 100644 --- a/settings.conf.default +++ b/settings.conf.default @@ -31,7 +31,7 @@ cpu_temp_offset=0 #base coordinates: lat long height position='47.1983869 -1.1655108 36.40' #gnss receiver com port -com_port='ttyS1' +com_port='' #gnss receiver com port settings com_port_settings='38400:8:n:1' #receiver model diff --git a/tools/install.sh b/tools/install.sh index 0fad28ae..892712ed 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -218,9 +218,9 @@ _compil_rtklib() { _rtkbase_repo(){ #Get rtkbase repository if [[ -n "${1}" ]]; then - sudo -u "${RTKBASE_USER}" git clone --branch "${1}" --single-branch https://github.com/tommasopolonelli/rtkbase_riscv.git + sudo -u "${RTKBASE_USER}" git clone --branch "${1}" --single-branch https://github.com/stefal/rtkbase.git else - sudo -u "${RTKBASE_USER}" git clone https://github.com/tommasopolonelli/rtkbase_riscv.git + sudo -u "${RTKBASE_USER}" git clone https://github.com/stefal/rtkbase.git fi _add_rtkbase_path_to_environment @@ -719,7 +719,7 @@ main() { then source /etc/environment else - export rtkbase_path='rtkbase_riscv' + export rtkbase_path='rtkbase' fi fi diff --git a/tools/swap.sh b/tools/swap.sh deleted file mode 100755 index 54613818..00000000 --- a/tools/swap.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -# Ensure script is run as root -if [[ $EUID -ne 0 ]]; then - echo "Please run this script as root or with sudo." - exit 1 -fi - -# Check if swap is already enabled -if swapon --show | grep -q 'partition\|file'; then - echo "Swap is already enabled. Exiting script." - exit 0 -fi - -# Define swap file size and location -SWAPFILE=/swapfile -SWAPSIZE=256M - -# Check if the swap file already exists -if [[ -f "$SWAPFILE" ]]; then - echo "$SWAPFILE already exists. Exiting script." - exit 0 -fi - -# Create the swap file with the specified size -fallocate -l $SWAPSIZE $SWAPFILE - -# Set the correct permissions -chmod 600 $SWAPFILE - -# Set up the swap area -mkswap $SWAPFILE - -# Enable the swap file -swapon $SWAPFILE - -# Check if the fstab entry already exists before appending -if ! grep -q "^$SWAPFILE" /etc/fstab; then - echo "$SWAPFILE none swap sw 0 0" >> /etc/fstab -fi - -echo "Swap file of size $SWAPSIZE created and enabled successfully."