better skin
This commit is contained in:
Executable → Regular
+2
-9
@@ -10,9 +10,6 @@ const char *pokemon_names[151] = {"BULBIZARRE","HERBIZARRE","FLORIZARRE","SALAME
|
|||||||
const char *pokemon_names[151] = {"BULBASAUR","IVYSAUR","VENUSAUR","CHARMANDER","CHARMELEON","CHARIZARD","SQUIRTLE","WARTORTLE","BLASTOISE","CATERPIE","METAPOD","BUTTERFREE","WEEDLE","KAKUNA","BEEDRILL","PIDGEY","PIDGEOTTO","PIDGEOT","RATTATA","RATICATE","SPEAROW","FEAROW","EKANS","ARBOK","PIKACHU","RAICHU","SANDSHREW","SANDSLASH","NIDORAN","NIDORINA","NIDOQUEEN","NIDORAN","NIDORINO","NIDOKING","CLEFAIRY","CLEFABLE","VULPIX","NINETALES","JIGGLYPUFF","WIGGLYTUFF","ZUBAT","GOLBAT","ODDISH","GLOOM","VILEPLUME","PARAS","PARASECT","VENONAT","VENOMOTH","DIGLETT","DUGTRIO","MEOWTH","PERSIAN","PSYDUCK","GOLDUCK","MANKEY","PRIMEAPE","GROWLITHE","ARCANINE","POLIWAG","POLIWHIRL","POLIWRATH","ABRA","KADABRA","ALAKAZAM","MACHOP","MACHOKE","MACHAMP","BELLSPROUT","WEEPINBELL","VICTREEBEL","TENTACOOL","TENTACRUEL","GEODUDE","GRAVELER","GOLEM","PONYTA","RAPIDASH","SLOWPOKE","SLOWBRO","MAGNEMITE","MAGNETON","FARFETCH'D","DODUO","DODRIO","SEEL","DEWGONG","GRIMER","MUK","SHELLDER","CLOYSTER","GASTLY","HAUNTER","GENGAR","ONIX","DROWZEE","HYPNO","KRABBY","KINGLER","VOLTORB","ELECTRODE","EXEGGCUTE","EXEGGUTOR","CUBONE","MAROWAK","HITMONLEE","HITMONCHAN","LICKITUNG","KOFFING","WEEZING","RHYHORN","RHYDON","CHANSEY","TANGELA","KANGASKHAN","HORSEA","SEADRA","GOLDEEN","SEAKING","STARYU","STARMIE","MR. MIME","SCYTHER","JYNX","ELECTABUZZ","MAGMAR","PINSIR","TAUROS","MAGIKARP","GYARADOS","LAPRAS","DITTO","EEVEE","VAPOREON","JOLTEON","FLAREON","PORYGON","OMANYTE","OMASTAR","KABUTO","KABUTOPS","AERODACTYL","SNORLAX","ARTICUNO","ZAPDOS","MOLTRES","DRATINI","DRAGONAIR","DRAGONITE","MEWTWO","MEW"};
|
const char *pokemon_names[151] = {"BULBASAUR","IVYSAUR","VENUSAUR","CHARMANDER","CHARMELEON","CHARIZARD","SQUIRTLE","WARTORTLE","BLASTOISE","CATERPIE","METAPOD","BUTTERFREE","WEEDLE","KAKUNA","BEEDRILL","PIDGEY","PIDGEOTTO","PIDGEOT","RATTATA","RATICATE","SPEAROW","FEAROW","EKANS","ARBOK","PIKACHU","RAICHU","SANDSHREW","SANDSLASH","NIDORAN","NIDORINA","NIDOQUEEN","NIDORAN","NIDORINO","NIDOKING","CLEFAIRY","CLEFABLE","VULPIX","NINETALES","JIGGLYPUFF","WIGGLYTUFF","ZUBAT","GOLBAT","ODDISH","GLOOM","VILEPLUME","PARAS","PARASECT","VENONAT","VENOMOTH","DIGLETT","DUGTRIO","MEOWTH","PERSIAN","PSYDUCK","GOLDUCK","MANKEY","PRIMEAPE","GROWLITHE","ARCANINE","POLIWAG","POLIWHIRL","POLIWRATH","ABRA","KADABRA","ALAKAZAM","MACHOP","MACHOKE","MACHAMP","BELLSPROUT","WEEPINBELL","VICTREEBEL","TENTACOOL","TENTACRUEL","GEODUDE","GRAVELER","GOLEM","PONYTA","RAPIDASH","SLOWPOKE","SLOWBRO","MAGNEMITE","MAGNETON","FARFETCH'D","DODUO","DODRIO","SEEL","DEWGONG","GRIMER","MUK","SHELLDER","CLOYSTER","GASTLY","HAUNTER","GENGAR","ONIX","DROWZEE","HYPNO","KRABBY","KINGLER","VOLTORB","ELECTRODE","EXEGGCUTE","EXEGGUTOR","CUBONE","MAROWAK","HITMONLEE","HITMONCHAN","LICKITUNG","KOFFING","WEEZING","RHYHORN","RHYDON","CHANSEY","TANGELA","KANGASKHAN","HORSEA","SEADRA","GOLDEEN","SEAKING","STARYU","STARMIE","MR. MIME","SCYTHER","JYNX","ELECTABUZZ","MAGMAR","PINSIR","TAUROS","MAGIKARP","GYARADOS","LAPRAS","DITTO","EEVEE","VAPOREON","JOLTEON","FLAREON","PORYGON","OMANYTE","OMASTAR","KABUTO","KABUTOPS","AERODACTYL","SNORLAX","ARTICUNO","ZAPDOS","MOLTRES","DRATINI","DRAGONAIR","DRAGONITE","MEWTWO","MEW"};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const float MAX_VBAT = 4.20;
|
|
||||||
const float MIN_VBAT = 3.80;
|
|
||||||
|
|
||||||
void WatchyPokemon::drawWatchFace(){
|
void WatchyPokemon::drawWatchFace(){
|
||||||
|
|
||||||
readWorldTime();
|
readWorldTime();
|
||||||
@@ -26,11 +23,7 @@ void WatchyPokemon::drawWatchFace(){
|
|||||||
|
|
||||||
//Voltage
|
//Voltage
|
||||||
float VBAT = getBatteryVoltage();
|
float VBAT = getBatteryVoltage();
|
||||||
uint32_t percent = (int)(100.0 * ((VBAT - MIN_VBAT) / (MAX_VBAT - MIN_VBAT)));
|
uint32_t voltage = (int)(100.0 * VBAT);
|
||||||
if (percent < 0)
|
|
||||||
percent = 0;
|
|
||||||
if (percent > 100)
|
|
||||||
percent = 100;
|
|
||||||
|
|
||||||
//Save battery life
|
//Save battery life
|
||||||
WiFi.mode(WIFI_OFF);
|
WiFi.mode(WIFI_OFF);
|
||||||
@@ -58,7 +51,7 @@ void WatchyPokemon::drawWatchFace(){
|
|||||||
#else
|
#else
|
||||||
display.print(":L");
|
display.print(":L");
|
||||||
#endif
|
#endif
|
||||||
display.print(percent);
|
display.print(voltage);
|
||||||
|
|
||||||
for (int8_t i = 0; i < int(60 - (currentTime.Hour * 60 + currentTime.Minute) / 24); i++)
|
for (int8_t i = 0; i < int(60 - (currentTime.Hour * 60 + currentTime.Minute) / 24); i++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from PIL import Image
|
from PIL import Image
|
||||||
import os.path
|
import os.path
|
||||||
|
import math
|
||||||
|
|
||||||
ROOT_DIR = f"{os.path.dirname(__file__)}/pokemon-src/main-sprites/yellow"
|
ROOT_DIR = f"{os.path.dirname(__file__)}/pokemon-src/main-sprites/yellow"
|
||||||
FRONT_DIR = f"{ROOT_DIR}/gray"
|
FRONT_DIR = f"{ROOT_DIR}/gray"
|
||||||
@@ -9,27 +10,91 @@ COUNT = 151
|
|||||||
|
|
||||||
OUT_DIR = f"{os.path.dirname(__file__)}/pokemon-out"
|
OUT_DIR = f"{os.path.dirname(__file__)}/pokemon-out"
|
||||||
|
|
||||||
THRESHOLD = 127
|
D_DATA = [
|
||||||
|
[
|
||||||
|
[0]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[1, 0, 0, 0],
|
||||||
|
[0, 0, 0, 0],
|
||||||
|
[0, 0, 1, 0],
|
||||||
|
[0, 0, 0, 0]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[1, 0],
|
||||||
|
[0, 0]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[1, 0, 1, 0],
|
||||||
|
[0, 1, 0, 0],
|
||||||
|
[1, 0, 1, 0],
|
||||||
|
[0, 0, 0, 1]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[1, 0],
|
||||||
|
[0, 1]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
for i in range(1, COUNT + 1):
|
D_LEVELS = len(D_DATA) * 2 - 1
|
||||||
with Image.open(f"{FRONT_DIR}/{i}.png") as im_src:
|
|
||||||
|
def make_dithering(i: int) -> Image.Image:
|
||||||
|
im = Image.new("L", (68, 68), 'white')
|
||||||
|
if i < len(D_DATA):
|
||||||
|
d = D_DATA[i]
|
||||||
|
else:
|
||||||
|
d = D_DATA[D_LEVELS - i - 1]
|
||||||
|
w = len(d[0])
|
||||||
|
h = len(d)
|
||||||
|
for x in range(68):
|
||||||
|
for y in range(68):
|
||||||
|
v = d[y % h][x % w]
|
||||||
|
if i < len(D_DATA):
|
||||||
|
im.putpixel((x, y), 256 if v else 0)
|
||||||
|
else:
|
||||||
|
im.putpixel((x, y), 0 if v else 256)
|
||||||
|
return im
|
||||||
|
|
||||||
|
D_IM = [make_dithering(i) for i in range(D_LEVELS)]
|
||||||
|
|
||||||
|
def make_extent() -> Image.Image:
|
||||||
|
im = Image.new("L", (12, 68), color=0)
|
||||||
|
for x in range(12):
|
||||||
|
for y in range(68):
|
||||||
|
im.putpixel((x, y), 256)
|
||||||
|
return im
|
||||||
|
|
||||||
|
EXTENT = make_extent()
|
||||||
|
|
||||||
|
def make_mask(im: Image.Image, i: int) -> Image.Image:
|
||||||
|
return im.point(lambda p: 1 if p >= math.floor(i * 256 / D_LEVELS) and p < math.ceil((i + 1) * 256 / D_LEVELS) else 0, mode="1")
|
||||||
|
|
||||||
|
def convert(im: Image.Image) -> Image.Image:
|
||||||
|
im = im.resize((68, 68))
|
||||||
|
im0, im = im, Image.new(im.mode, (80, 68), color=1)
|
||||||
|
for i in range(D_LEVELS):
|
||||||
|
im.paste(D_IM[i], (0, 0), mask=make_mask(im0, i))
|
||||||
|
im.paste(EXTENT, (68, 0))
|
||||||
|
im = im.convert(mode="P")
|
||||||
|
return im
|
||||||
|
|
||||||
|
def convert_front(im: Image.Image) -> Image.Image:
|
||||||
w0, h0 = im_src.size
|
w0, h0 = im_src.size
|
||||||
im = Image.new(im_src.mode, (56, 56), 'white')
|
im = Image.new(im_src.mode, (56, 56), 'white')
|
||||||
im.paste(im_src, ((56 - w0) // 2, (56 - h0) // 2))
|
im.paste(im_src, ((56 - w0) // 2, (56 - h0) // 2))
|
||||||
im = im.resize((68, 68))
|
return convert(im)
|
||||||
im = im.point(lambda p: 1 if p > THRESHOLD else 0, mode="1")
|
|
||||||
im0, im = im, Image.new(im.mode, (80, 68), color=1)
|
|
||||||
im.paste(im0, (0, 0))
|
|
||||||
im = im.convert(mode="P")
|
|
||||||
im.save(f"{OUT_DIR}/front_{i}.bmp")
|
|
||||||
|
|
||||||
with Image.open(f"{BACK_DIR}/{i}.png") as im:
|
def convert_back(im_src: Image.Image) -> Image.Image:
|
||||||
w0, h0 = im.size
|
im = Image.new(im_src.mode, (28, 28), 'white')
|
||||||
im0, im = im, Image.new(im.mode, (28, 28), 'white')
|
im.paste(im_src, (0, 0))
|
||||||
im.paste(im0, (0, 0))
|
return convert(im)
|
||||||
im = im.resize((68, 68))
|
|
||||||
im = im.point(lambda p: 1 if p > THRESHOLD else 0, mode="1")
|
if __name__ == '__main__':
|
||||||
im0, im = im, Image.new(im.mode, (80, 68), color=1)
|
for i in range(1, COUNT + 1):
|
||||||
im.paste(im0, (0, 0))
|
with Image.open(f"{FRONT_DIR}/{i}.png") as im_src:
|
||||||
im = im.convert(mode="P")
|
im_out = convert_front(im_src)
|
||||||
im.save(f"{OUT_DIR}/back_{i}.bmp")
|
im_out.save(f"{OUT_DIR}/front_{i}.bmp")
|
||||||
|
|
||||||
|
with Image.open(f"{BACK_DIR}/{i}.png") as im_src:
|
||||||
|
im_out = convert_back(im_src)
|
||||||
|
im_out.save(f"{OUT_DIR}/back_{i}.bmp")
|
||||||
+10570
-10570
File diff suppressed because it is too large
Load Diff
+10570
-10570
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
Reference in New Issue
Block a user