/>
<meta
property="og:image"
- content="https://athene.gay/img/projects/pipboy2.jpg"
+ content="https://athene.gay/img/projects/pipboy/pipboy2.jpg"
/>
<meta
name="twitter:image"
- content="https://athene.gay/img/projects/pipboy2.jpg"
+ content="https://athene.gay/img/projects/pipboy/pipboy2.jpg"
/>
<link rel="stylesheet" href="../main.css" />
</head>
worst thing sensory-wise for me in cosplay.
</p>
<p>And, I made a Pip-Boy! Look at it here, it's pretty great!</p>
- <a href="../img/projects/pipboy-homemade.jpg">
+ <a href="../img/projects/pipboy/pipboy-homemade.jpg">
<img
class="blog-img-lrg"
- src="../img/projects/pipboy-homemade.jpg"
+ src="../img/projects/pipboy/pipboy-homemade.jpg"
alt="A photo of the home-made pip-boy in question. It looks pretty accurate but it is very very large."
/>
</a>
from the terminal and seeing it display the results in real
time.
</p>
- <a href="../img/projects/pipboy2.jpg">
+ <a href="../img/projects/pipboy/pipboy2.jpg">
<img
class="blog-img-lrg"
- src="../img/projects/pipboy2.jpg"
+ src="../img/projects/pipboy/pipboy2.jpg"
alt="A photo of the prop pip-boy displaying the word 'TEST' on its screen."
/>
</a>
the terminal and, instead of being binary and unreadable, it's
in regular-ass javascript. Holy shit!
</p>
- <a href="../img/projects/pipboyfirmwarescreenshot.png">
+ <a href="../img/projects/pipboy/pipboyfirmwarescreenshot.png">
<img
class="blog-img"
- src="../img/projects/pipboyfirmwarescreenshot.png"
+ src="../img/projects/pipboy/pipboyfirmwarescreenshot.png"
alt="A screenshot of some of the pip-boy firmware's built in function names."
/>
</a>
Anyway, I think that's where I'm leaving it for tonight. It's
11pm, after all. More tomorrow.
</p>
+ <div class="title-block">
+ <h3 class="blog-title">Let's get some images displayed</h3>
+ <h3 class="datestamp">20/03/2025</h3>
+ </div>
+ <p>
+ OK, it's 6pm, there's 3 hours until the Apprentice is on, let's
+ get hacking. The first thing I need to do is, uh... take the
+ thing apart.
+ </p>
+ <a href="../img/projects/pipboy/pipboyopen.jpg">
+ <img
+ class="blog-img-lrg"
+ src="../img/projects/pipboy/pipboyopen.jpg"
+ alt="A photo of the pipboy's arse with a ribbon cable hanging out of it."
+ />
+ </a>
+ <p>
+ That's an micro-sd extender cable stringing out of it, there.
+ Nearly everything that makes up the pip-boy is stored on an sd
+ card which is, conveniently, not bolted into the board.
+ </p>
+ <p>
+ You can open up the thing and take it out, you can copy all of
+ its files over to a folder and, most usefully for us, you can
+ copy those same files over to another, bigger sd card (the one
+ installed is only 250MB) and it works, as long as the card is
+ fat32 formatted.
+ </p>
+ <p>
+ I've put a 32GB one in there, which is overkill, but I had it
+ lying around. It also means I can put the entirety of the
+ FO3/4/NV soundtracks on there, if I want. Which, maybe, I do in
+ future! Who knows.
+ </p>
+ <p>
+ More importantly, however, that SD card has a USER/ folder where
+ we can drop our own custom javascript files and it'll display
+ them in a nice 'APPS' menu in the INV menu.
+ </p>
+ <p>
+ We're gonna start with the the helloWorld and graphicsTest files
+ that are currently in the repo. Some file wiggling and inserting
+ and removal of SD cards and bang, there they are!
+ </p>
+ <a href="../img/projects/pipboy/pipboyapps.jpg">
+ <img
+ class="blog-img-lrg"
+ src="../img/projects/pipboy/pipboyapps.jpg"
+ alt="A photo of the pipboy's arse with a ribbon cable hanging out of it."
+ />
+ </a>
+ <p>
+ So we want tio draw something to screen that isn't just text,
+ next. So I need to dive into some docs. More updates in a bit...
+ </p>
+ <b>Code Updated. Check the github link to keep up.</b>
+ <p>
+ OK, first thing I want to do is draw a square. Which means we
+ need to understand how the graphics buffer is working. See,
+ right here, in the dump of the buffer of the main portion of the
+ screen, is some interesting evidence.
+ </p>
+ <a href="../img/projects/pipboy/firmwarebCbuffer.png">
+ <img
+ class="blog-img"
+ src="../img/projects/pipboy/firmwarebCbuffer.png"
+ alt="A screenshot of an the graphics context in the pip boy firmware."
+ />
+ </a>
+ <p>
+ The interesting thing here is 'UInt8.' This is an array of 8bit
+ integers. This could mean the pixels are rendered as 3-byte RGB
+ values, with the r and b just ignored, or it could mean each bit
+ in the byte is a pixel, and the different tones is achieved
+ using dithering. Right now, I'm not sure!
+ </p>
+ <p>So, to find out, we're gonna draw three squares.</p>
+ <a href="../img/projects/pipboy/squares.jpg">
+ <img
+ class="blog-img-lrg"
+ src="../img/projects/pipboy/squares.jpg"
+ alt="A photo of the pipboy screen showing 3 16x16 squares. One is slightly dimmer than the other two."
+ />
+ </a>
+ <p>
+ And there we have it! Three squares. Now if we look at the code
+ I've written, and note that the middle square is the dimmest of
+ the three, we can deduce...
+ </p>
+ <a href="../img/projects/pipboy/squarecode.png">
+ <img
+ class="blog-img"
+ src="../img/projects/pipboy/squarecode.png"
+ alt="A screenshot of the code to make the three squares. The three are commented 'full byte pp', 'dithered square', and 'fullbright square'"
+ />
+ </a>
+ <p>
+ That I was completely wrong and the screen is compeltely
+ monochrome, and any dimming is done by dithering. I'm so glad
+ I'm liveblogging this so everyone can see how stupid I am.
+ </p>
+ <p>
+ That's ok though! We're here to learn, and this actually makes
+ things relatively nice and easy. I'm sure there are monochrome
+ image -> uint arrays somewhere out there one the web already,
+ thisn is a very common format on embedded platforms, so I just
+ need to find one and run the icons for various perks etc through
+ them, and we can get one displaying.
+ </p>
+ <p>In fact, maybe that's what we do next. BRB...</p>
+ <b>Code Updated. Check the github link to keep up.</b>
+ <p>
+ Excellent, here's one, first hit on google.
+ <a href="https://javl.github.io/image2cpp/">image2cpp</a>
+ Let's run the Cherchez La Femme image through it and upload it
+ to the machine aaaand...
+ </p>
+ <a href="../img/projects/pipboy/errorlowmem.png">
+ <img
+ class="blog-img"
+ src="../img/projects/pipboy/errorlowmem.png"
+ alt="A screenshot of the espruino terminal reading 'New interpreter error: LOW_MEMORY,MEMORY'"
+ />
+ </a>
+ <p>
+ So, that's not good. In fairness, I am loading a 167x167 bitmap
+ into memory here, I suppose it makes sense that that wouldn't
+ exactly work. But it is going to make this more difficult.
+ </p>
+ <p>
+ Next question then. What is a reasonable maximum array size we
+ can use here? Time to experiment. We'll start with half the
+ resolution, 83x83.
+ </p>
+ <a href="../img/projects/pipboy/chercheztake1.jpg">
+ <img
+ class="blog-img-lrg"
+ src="../img/projects/pipboy/chercheztake1.jpg"
+ alt="A photo of the pipboy screen showing garbage in a square."
+ />
+ </a>
+ <p>
+ OK, it's displaying, but that's clearly not right. Here's what
+ it's supposed to look like:
+ </p>
+ <a href="../img/projects/pipboy/CherchezLaFemme.png">
+ <img
+ class="blog-img"
+ src="../img/projects/pipboy/CherchezLaFemme.png"
+ alt="The Cherchez La Femme perk icon from New Vegas"
+ />
+ </a>
+ <p>
+ That's ok though, there's options on the converter for just this
+ predicament. This was the default (Horizontal - 1bpp), and
+ Vertical - 1bpp landed similar results, so let's move on from
+ that converter and use the one hosted on
+ <a href="https://www.espruino.com/Image+Converter"
+ >Espruino's website</a
+ >
+ instead. Man I'm really proving myself soooo smart today.
+ </p>
+ <p>
+ Using the right tool for the job gives us this! And it's even
+ full resolution! Huzzah!
+ </p>
+ <a href="../img/projects/pipboy/cherchezsuccess.jpg">
+ <img
+ class="blog-img-lrg"
+ src="../img/projects/pipboy/cherchezsuccess.jpg"
+ alt="A photo of the pipboy screen showing the Cherchez La Femme icon."
+ />
+ </a>
+ <p>
+ OK, that's real, genuine progress. We can encode images and
+ display them, which we need for the perks screen. They are
+ pretty big though, so I think next order of business is going to
+ be keeping those strings in text files and loading them in when
+ we need to. Back to the docs... Although I might leave it there
+ tonight, my back hurts. No wonder Zuck had to be 19 to do this
+ live.
+ </p>
</div>
</div>
</div>