From b6739e131c09ac22608fdd2d028c2d251e9ad033 Mon Sep 17 00:00:00 2001 From: Larry Bank Date: Sun, 3 Nov 2024 13:49:31 +0000 Subject: [PATCH] Added partial update clock example --- rpi/examples/partial_update_clock/Makefile | 16 ++++ .../partial_update_clock/Roboto_Black_78.bbf | Bin 0 -> 1262 bytes .../partial_update_clock/Roboto_Black_78.h | 90 ++++++++++++++++++ rpi/examples/partial_update_clock/main.cpp | 78 +++++++++++++++ 4 files changed, 184 insertions(+) create mode 100644 rpi/examples/partial_update_clock/Makefile create mode 100644 rpi/examples/partial_update_clock/Roboto_Black_78.bbf create mode 100644 rpi/examples/partial_update_clock/Roboto_Black_78.h create mode 100644 rpi/examples/partial_update_clock/main.cpp diff --git a/rpi/examples/partial_update_clock/Makefile b/rpi/examples/partial_update_clock/Makefile new file mode 100644 index 0000000..1aba543 --- /dev/null +++ b/rpi/examples/partial_update_clock/Makefile @@ -0,0 +1,16 @@ +CFLAGS=-D_LINUX_ -Wall -O2 -I../../ +LIBS=-lgpiod + +all: pu_clock + +pu_clock: main.o bb_epaper.o + $(CXX) main.o bb_epaper.o $(LIBS) -o pu_clock + +main.o: main.cpp + $(CXX) $(CFLAGS) -c main.cpp + +bb_epaper.o: ../../../src/bb_epaper.cpp ../../../src/bb_epaper.h + $(CXX) $(CFLAGS) -c ../../../src/bb_epaper.cpp + +clean: + rm -rf *.o pu_clock diff --git a/rpi/examples/partial_update_clock/Roboto_Black_78.bbf b/rpi/examples/partial_update_clock/Roboto_Black_78.bbf new file mode 100644 index 0000000000000000000000000000000000000000..f5e4423bdaad96608fbb9e274917e99a5f0bf094 GIT binary patch literal 1262 zcmeyr+knA}VKV~+ct;j6uro~lpT%GlnajY#Fy;Sp2EWKW23Cg2|AiR+BMTT<7$*Op z%IF`N%fQMo<^M}YpU8X$HijwxW0^p*Yz&kCKV$NX%w=FKMOzS3mb(m5b)pM|I5$5e@(m}nqS)A_g`A~|E2x?|6h;& z{f`E|Dww|i|9|b)|JU<&$A7!@u=Pfwp6&WuxBjjLgEa=*HXJ(Gbg=1MO^L>S)~16A z8#YAfh;eg6n1TO4>pa*HdB%*Jb*er$n$gHy1`UV87wKl{AZK#eD17I6;`^VZ} zer}_@pt;s=@|VAMQ-A*#{cHdK|0#)If9u!Qd&gh8zE-zn*L832SY2Jct(Q>1b#L#r zy1Ke0TfiXGYb(S;1`WF+j&zf3mJ&6E=0of)a>5rX{6S!E$?xlXWf}Te_?O&w{PnAD z_W$_%^8f#Tef{-ytZvB$Z_A~3ORvZ1?T9Ts{P4r?hu`nlJ`byB`*81f_4|AO|KHzl zIeFK=*U?`mi0xf^ICjGx3Du2X_eV#^=5N@x;o3EcXl~wwgNaS&GOiUrQP2o0R@VOY z`q#f*|91V`zi$7!{p(+Y;IG$b0=|CPx3_L@t^WFW@BiMfuV4Cq>FcjA`@ih1+p8bH zK7PIT^+zdfi~pbC|NrOJ8HkU-}fQrNOQ!rQ9phMqXVK$K;m6+U z_xs=Pe`k5I;~?8Z_GK?${+s>x|M&kt8Snr9AOHW~|Lp(2m)?K9J$Bu#Z_{qX@u+V6 zx^+Lu8EKF>mcIV{-uAjukBy@D}L#J z5b^8l`uL^4zOIk@AN6&8)W7L3>p?`_^w$v8d$a#$U)!KzSNLMNNxEf zRUlBmeEF~XGu2-N@|VB-GW+HK|I0z4^#A|c^7X%CUvItby%m%vVA)~YhUP>3{{EaV zzb{|DSnj<;bUC(2lec>!?M!aH3nc0akFt- zeiG1dDC|@>i)N7%uu=E`b_l<}f2^&o{pHKgY(AL3tff8X@W^`PAQ|Kt7ZzyH_& z`~Uj{|G(?su4ivO%$?YJygvK;{qOf{*Ur>@TakU3Q^#PB!JcQWKbHQAUpM___R`i% zha&Vi(@kbuirxoBT8!SVhXuPH?1<4T>iRq(eoknbWGd00MKaMWdHyG literal 0 HcmV?d00001 diff --git a/rpi/examples/partial_update_clock/Roboto_Black_78.h b/rpi/examples/partial_update_clock/Roboto_Black_78.h new file mode 100644 index 0000000..ef24b85 --- /dev/null +++ b/rpi/examples/partial_update_clock/Roboto_Black_78.h @@ -0,0 +1,90 @@ +// Created with image_to_c +// https://github.com/bitbank2/image_to_c +// +// Roboto_Black_78 +// Data size = 1262 bytes +// +// for non-Arduino builds... +#ifndef PROGMEM +#define PROGMEM +#endif +const uint8_t Roboto_Black_78[] PROGMEM = { + 0xff,0xbb,0x30,0x00,0x3a,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x59, + 0x70,0x00,0x07,0x00,0x93,0xff,0x6a,0x00,0x32,0x59,0x6d,0x00,0x0c,0x00,0x94,0xff, + 0xa7,0x00,0x4e,0x59,0x6e,0x00,0x05,0x00,0x93,0xff,0x12,0x01,0x4f,0x59,0x70,0x00, + 0x04,0x00,0x93,0xff,0x95,0x01,0x4f,0x59,0x6d,0x00,0x05,0x00,0x94,0xff,0xe9,0x01, + 0x4c,0x59,0x6f,0x00,0x06,0x00,0x94,0xff,0x5d,0x02,0x4f,0x59,0x70,0x00,0x06,0x00, + 0x93,0xff,0xe6,0x02,0x4e,0x59,0x6d,0x00,0x04,0x00,0x94,0xff,0x2c,0x03,0x4c,0x59, + 0x70,0x00,0x06,0x00,0x93,0xff,0xb7,0x03,0x4c,0x59,0x70,0x00,0x06,0x00,0x93,0xff, + 0x3b,0x04,0x1c,0x2e,0x55,0x00,0x09,0x00,0xad,0xff,0x28,0x3c,0x71,0xc9,0x27,0x34, + 0x5f,0x04,0x0f,0x04,0x0f,0x09,0xe8,0x3c,0x20,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, + 0xff,0x4f,0x4f,0xf4,0xf9,0x8e,0xfe,0x82,0x0d,0xf0,0x83,0xe9,0x3f,0xdf,0x4f,0xa5, + 0x7e,0xff,0xe9,0x3f,0xdf,0xff,0xf5,0xc6,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x20,0x35,0xef,0xff,0xff,0xad, + 0xb5,0xff,0xd7,0x6e,0xbb,0x5f,0xf6,0xd2,0xe1,0x85,0xd8,0x61,0x2e,0x3d,0xaf,0xda, + 0xda,0xfd,0xad,0xad,0xad,0xad,0xad,0xad,0xac,0x30,0xb6,0xb0,0xc2,0xc1,0x82,0xc1, + 0x82,0xce,0x7c,0x74,0x28,0xbf,0x05,0x82,0xc1,0x60,0xb0,0xb0,0x58,0x2c,0x16,0x0b, + 0x0b,0x05,0x82,0xc1,0x60,0xb0,0xb0,0x51,0xff,0xf3,0x2c,0xe0,0xb0,0x59,0xcc,0x36, + 0x0b,0x05,0x95,0x2f,0x0b,0xff,0xff,0xff,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,0x28,0x40,0x71,0xe8,0x67,0x36,0x67,0x04,0x0f,0x04,0x0f,0x08,0x3c,0x20,0xf4, + 0xf0,0x83,0xd3,0xd3,0xd3,0xd3,0xd3,0xd7,0x4f,0x5d,0x3f,0xd3,0xe7,0x3c,0x23,0xa0, + 0x83,0x7d,0x3e,0x93,0xf4,0xfd,0x3e,0x95,0xfb,0xff,0x15,0xfd,0x3f,0xff,0xff,0xca, + 0x18,0xfa,0xfd,0x7f,0xad,0x7f,0x4b,0x5f,0xd2,0xd7,0xad,0x2d,0x74,0xba,0xd7,0x4b, + 0x4b,0x5d,0x2d,0x2d,0x2e,0xb5,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2, + 0xd2,0xd2,0xd2,0xd2,0xd7,0x4b,0x4b,0xad,0x2d,0x2d,0x2d,0x74,0xb4,0xb4,0xb4,0xb4, + 0xb4,0xb4,0x69,0x4a,0xb5,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x28,0x3e,0x72,0x08, + 0x67,0x34,0x6b,0x04,0x74,0x26,0x20,0x83,0xc2,0x07,0x84,0x1e,0x13,0xd0,0x78,0x4f, + 0x4f,0x4f,0x4f,0x4f,0xbd,0x74,0xfb,0xd7,0xbd,0x1d,0x00,0x8f,0x04,0x0f,0xa4,0xdf, + 0x41,0xfa,0xfa,0x7e,0x9b,0xff,0x5f,0xdf,0x1f,0xff,0xff,0xf5,0xeb,0xf5,0xeb,0x5d, + 0x2d,0x74,0xb0,0x4b,0x39,0xa5,0xdd,0x75,0xd7,0x5c,0x2e,0xb8,0x5d,0x75,0xc3,0xe1, + 0xf0,0xfb,0xe1,0xf7,0xdf,0x7d,0xe7,0x56,0x7f,0x06,0xf0,0xde,0xfb,0x7b,0xef,0xde, + 0xff,0xff,0xdf,0xbf,0x39,0x93,0xba,0xfe,0xeb,0x5b,0xf5,0x90,0x16,0xbd,0xa5,0xc3, + 0x5d,0xb0,0xbc,0x18,0x25,0xb1,0xf5,0xbf,0x5b,0x5b,0x5d,0x6f,0xb0,0xb6,0xb0,0xd6, + 0xd6,0x18,0x5b,0x0b,0x0d,0x60,0xc1,0x61,0x82,0xce,0x68,0xd6,0x73,0xe4,0x20,0x28, + 0x56,0x73,0x23,0x2b,0xfa,0xeb,0xfa,0xfe,0xba,0xfe,0xba,0xfe,0xbf,0xae,0xbf,0xae, + 0xbf,0xaf,0xeb,0xaf,0xeb,0xaf,0xeb,0xfa,0xeb,0xcc,0x50,0xf5,0xf4,0xbe,0xbd,0x7e, + 0xbd,0x7d,0x2f,0xaf,0x5f,0x4b,0xff,0x4b,0xeb,0xd7,0xd2,0xff,0xd2,0xf5,0xfa,0xf4, + 0xbf,0xf4,0xbd,0x7e,0xbd,0x2f,0x5f,0xaf,0x5f,0xaf,0x4b,0xd7,0xe2,0x64,0x86,0xa3, + 0xff,0xc8,0x0f,0xff,0xfc,0xea,0xcc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xfc,0x28,0x12,0x08,0x7f,0xfe,0xbf,0xff,0xff,0xff,0xaf,0xff,0xff,0xff, + 0x39,0x66,0x7f,0x5f,0xff,0xff,0xfe,0xb5,0xff,0xff,0xff,0xfd,0x23,0x8a,0x1b,0xe5, + 0xc5,0x7c,0x10,0x3f,0x08,0x3e,0x21,0xf0,0xfb,0xef,0xbd,0x3e,0xfb,0xef,0xfb,0xef, + 0xf4,0x73,0xa2,0x5e,0xc1,0x03,0xe7,0x10,0x48,0x3e,0x71,0x83,0x5b,0xce,0x40,0x43, + 0xe6,0x28,0xdf,0x16,0xff,0xf7,0xfe,0xef,0xff,0xff,0xff,0xff,0x39,0xa3,0x3a,0xff, + 0xa9,0x01,0xfd,0xaf,0xfd,0xa5,0xb7,0xf6,0xbd,0xa5,0xb6,0x17,0x83,0x09,0x6c,0x7d, + 0x6f,0xb5,0xfb,0x5b,0x5b,0x5b,0x5b,0x5b,0x58,0x6b,0x6b,0x0c,0x2c,0x30,0xb0,0xc2, + 0xc1,0x85,0x83,0x05,0x9c,0xf8,0xf8,0x28,0x64,0x71,0x84,0xa7,0x58,0x4b,0x3a,0x82, + 0xd8,0x2e,0x17,0x05,0xc2,0xe1,0x75,0xc2,0xeb,0x85,0xd7,0x5d,0x75,0xd7,0x5d,0x74, + 0x74,0xe6,0xe8,0xe9,0x0f,0xd0,0x2d,0x02,0xe1,0x68,0x2d,0x2e,0xb4,0xb8,0x5a,0xf5, + 0xa5,0xd6,0x97,0xe9,0x7f,0x47,0x1c,0x33,0x53,0x8a,0x29,0xe0,0x83,0xe8,0x20,0xfc, + 0x20,0xf5,0x4f,0xc2,0x7d,0x20,0xf8,0xbd,0x7b,0xef,0xbf,0xef,0xbf,0xee,0x39,0xd1, + 0x88,0xc1,0x06,0xe1,0x07,0xa6,0xe9,0xe9,0xfe,0x9b,0xfd,0xff,0xf7,0xff,0xf9,0x01, + 0xdf,0xff,0xff,0x5f,0xff,0xfe,0xff,0x6b,0xff,0xfb,0xa5,0xdf,0xeb,0xb7,0x5d,0xae, + 0xda,0xf6,0x96,0xd8,0x5e,0x0c,0x25,0xb1,0xf5,0xb5,0xbf,0x5b,0x5b,0x5b,0x5b,0xed, + 0x6c,0x2d,0xac,0x35,0xb0,0xb0,0xc2,0xc3,0x0b,0x06,0x16,0x0c,0x16,0x74,0x23,0xa0, + 0xff,0xfe,0xba,0xe5,0x0c,0xfd,0x7e,0x97,0xe9,0x7e,0xbd,0x6b,0xd7,0xe9,0x7e,0xbd, + 0x6b,0xd6,0xbf,0xa5,0xfd,0x6b,0xd6,0xbf,0xa5,0xfa,0x5f,0xa5,0xff,0xa5,0xfa,0x5f, + 0xa5,0xfa,0xf5,0xaf,0x5f,0xa5,0xfa,0xf5,0xaf,0x5a,0xff,0x5a,0xf5,0xaf,0x5a,0xfe, + 0x97,0xe9,0x7f,0x5a,0xfe,0x97,0xe9,0x7e,0x97,0xeb,0xd7,0xe9,0x7e,0xbd,0x6b,0xd6, + 0xbd,0x6b,0xfd,0x6b,0xd6,0xb0,0x28,0x3e,0x71,0xe8,0xa7,0x34,0x67,0x39,0x64,0x38, + 0x41,0xe1,0x07,0x84,0x1e,0x9e,0x10,0x7a,0x7a,0x7a,0x7a,0x7a,0x7f,0xa7,0xa7,0xfa, + 0x7f,0xcc,0x7b,0xf4,0x10,0x6f,0xa7,0xe9,0xf4,0x9b,0xe9,0xff,0xff,0xa7,0xff,0xff, + 0xff,0xff,0xff,0xff,0xed,0x77,0xaf,0xfb,0x5d,0xeb,0xb5,0xdb,0x4b,0xb5,0xd8,0x61, + 0x2e,0x3d,0xad,0xad,0xad,0xad,0xad,0xac,0x30,0xb6,0xb6,0xb0,0x83,0xc2,0x0f,0x4f, + 0x4f,0x09,0xe9,0xf7,0xa7,0xa7,0xa3,0x1e,0xef,0x40,0x81,0xfa,0x6f,0x49,0xfa,0x6f, + 0x49,0xfa,0xbf,0x7d,0x7e,0x9b,0xff,0xff,0xf1,0xff,0xf2,0x03,0xff,0xb5,0xfe,0xd7, + 0xfb,0x4b,0x6d,0x7b,0x5e,0xd7,0x60,0xc1,0x2e,0x3e,0xb7,0xda,0xfd,0xad,0xad,0xad, + 0xad,0xad,0xad,0xad,0xac,0x30,0xb0,0xc2,0xc3,0x0b,0x06,0x0b,0x06,0x0b,0x39,0xf2, + 0x10,0x28,0x40,0x71,0x89,0x27,0x36,0x5b,0x04,0x1e,0x10,0x3c,0x20,0xf0,0x9e,0x10, + 0x7a,0x7a,0x7a,0x0f,0x4f,0x4f,0x5d,0x3d,0x3d,0x3f,0xd3,0xd3,0xe6,0x3d,0xba,0x08, + 0x37,0xc2,0x0f,0xa4,0xdf,0xbe,0x97,0xd3,0x7f,0xe9,0x3f,0xdf,0x4f,0xff,0xf1,0xdf, + 0xd7,0xfb,0xff,0x7f,0xfe,0xff,0xfb,0xc8,0x0f,0xfe,0xd7,0xf6,0xd7,0x6b,0xb5,0xc3, + 0x0b,0x61,0x85,0xc7,0x7f,0x6b,0xf7,0xdf,0xf7,0xdf,0x7d,0xad,0x99,0x29,0xed,0x78, + 0x6b,0xc3,0x09,0x2c,0x30,0xbc,0x30,0xbc,0xe6,0x85,0xf8,0xa5,0xfa,0x5f,0xae,0x97, + 0xe9,0x6b,0xa5,0x85,0xd2,0xc2,0x58,0x2e,0x09,0x67,0x34,0x9b,0x39,0x15,0xdf,0xd7, + 0x5d,0x75,0xd7,0x5c,0x2e,0xba,0xe1,0x70,0xba,0xe0,0xb8,0x5c,0x2e,0x72,0x8a,0xf3, + 0x90,0x5f,0x9c,0x53,0x50,0x28,0x49,0xd2,0xe8,0x40,0xf0,0x9e,0x83,0xd3,0xd7,0x4f, + 0xb8,0xff,0xb5,0xfc,0x80,0xfa,0xda,0xdf,0x6b,0x61,0x61,0xac,0x30,0x58,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x74,0xa7,0x08,0x1e,0x13,0xd0,0x7a,0x7a,0xe9, + 0xf7,0x1f,0xf6,0xbf,0x90,0x1f,0x5b,0x5b,0xed,0x6c,0x2c,0x35,0x86,0x0a}; diff --git a/rpi/examples/partial_update_clock/main.cpp b/rpi/examples/partial_update_clock/main.cpp new file mode 100644 index 0000000..9a8befd --- /dev/null +++ b/rpi/examples/partial_update_clock/main.cpp @@ -0,0 +1,78 @@ +// +// C++ example for bb_epaper library +// written by Larry Bank (bitbank@pobox.com) +// This example shows how to do partial updates for any type of +// black and white epaper display even if the original pixels are +// lost (e.g. deep deep sleep or power failure) +// The target display is a 400x300 4.2" B/W UC8151 +// You can easily select a different display by adjusting the +// coordinates and using a different font size +// +// Project started 9/23/2024 +// Copyright (c) 2024 BitBank Software, Inc. +// +#include "../../../src/bb_epaper.h" +#include "Roboto_Black_78.h" +#include +BBEPAPER bbep(EPD42_400x300); // 4.2" UC81xx controller +// BCM GPIO numbers used by Pimoroni e-paper "HATs" +#define PIN_DC 22 +#define PIN_RST 27 +#define PIN_BUSY 17 +#define PIN_CS 8 +#define SPI_BUS 0 +struct tm myTime; +time_t t; +int iFrame = 0; + +void UpdateDisplay(int iFrame) +{ +char szTemp[16]; + bbep.fillScreen(BBEP_WHITE); + bbep.setFont(Roboto_Black_78); + bbep.setTextColor(BBEP_BLACK); + if (iFrame & 0xf) { // partial updates for 15 out of 16 frames + // write the old pixels (old time) into the old 1-bit plane + bbep.setPlane(PLANE_1); + sprintf(szTemp, "%02d:%02d", myTime.tm_hour, myTime.tm_min); + bbep.drawString(szTemp, 0, 200); + bbep.writePlane(PLANE_1); + bbep.setPlane(PLANE_0); + bbep.fillScreen(BBEP_WHITE); + t = time(NULL); + myTime = *localtime(&t); + sprintf(szTemp, "%02d:%02d", myTime.tm_hour, myTime.tm_min); + bbep.drawString(szTemp, 0, 200); + bbep.writePlane(PLANE_0); // write the new pixels + bbep.refresh(REFRESH_PARTIAL); + } else { // full update, just display the current time + t = time(NULL); + myTime = *localtime(&t); + sprintf(szTemp, "%02d:%02d", myTime.tm_hour, myTime.tm_min); + bbep.drawString(szTemp, 0, 200); + bbep.writePlane(); + bbep.refresh(REFRESH_FULL); + } + bbep.sleep(DEEP_SLEEP); // extends the life of the display +} /* UpdateDisplay() */ + +int main(int argc, const char * argv[]) { + + bbep.initIO(PIN_DC, PIN_RST, PIN_BUSY, PIN_CS, SPI_BUS, 8000000); + bbep.allocBuffer(); // Use RAM since we have plenty + while (1) { // loop forever + time_t tt; + struct tm testTime; + + UpdateDisplay(iFrame++); // show the latest time + testTime.tm_min = myTime.tm_min; + // On a system with power saving features, you would sleep here + while (testTime.tm_min == myTime.tm_min) { // wait for minute to change + tt = time(NULL); + testTime = *localtime(&tt); + } + } + return 0; // it never gets here +} /* main() */ + +