 Go in here and just a bit. I really want to use hardware encoding, but it just never cooperates with me. Luckily, I remembered to start a little early. Start a little early, make sure it's going. Hello, Fede2, hello, DCD. Hopefully, I don't get too hot here. How's everyone doing? Good afternoon. It's been, what, two weeks? Last week, I took off. Foamy guy filled in for me. Hi, Beata. Get my chapstick out. There's supposed to be video here, but it doesn't like me. Hi, Timon. Cold spell is approaching. I'm OK with that. It's hot in here. Hi, Eric. I had the window open all day, even with the door cracked most of the day. It didn't cool down as much as I would have liked. So I ran the AC for like 20 minutes, so we'll see. We'll see how long I stay cool. Now the lights are on. I got two lights now. Yeah. Jeff is here. Welcome, Jeff. In LA, I'm in Seattle. Does your computer heat up the room? I think so. If I get wet socks on the way here, I put them on my computer above the fan. And it dries with my socks and my shoes out. All right, like right away. There's also Vodge, Joe. I don't know how to say it. Sorry. WJODF in not discord in YouTube. Welcome as well. It's been hotter here than LA. You can send the cold weather back if you're ready for it. All right, we're past time, so let's do the thing. Hi, JL. And David's also in Southern California. All right. Hello, everyone. A couple new folks, so that's awesome. If you don't know, my name is Scott. I go by TANNute Online, and I work for Adafruit on Circuit Python. If you don't know, Adafruit is an open source hardware and software company based out in New York City. I work remotely for them and have since I started working with them based in Seattle here. And then my specialty is doing the software side of things. So I work on Circuit Python, which is an easy to use version of Python designed for tiny computers called microcontrollers. Just looking to see on my desk what I've got here. But here is a feather that is boarded by Adafruit. Let me switch to product showcase mode. So this is the back of an Adafruit feather. This has got a screen on the front, and it's an expressive microcontroller. So this is a self-contained computer with a CPU and RAM and storage and all of that. All in this little device, tens of dollars to get started programming. So Circuit Python is designed to make it easy and quick to get programming computers of all, lots of small computers. I was going to say all shapes and sizes, but that's not strictly true. Software guys, since 1985, CC++, JVM, and now some MicroPython. Awesome. Welcome to Python on microcontroller land. What I cover here in deep dives, kind of the deal, is I work on the C core of Circuit Python. And we've been doing a lot of tangential MicroPython work because we've been merging newer versions of MicroPython into Circuit Python. So this deep dive tends to be just a venue where I kind of talk about what I've been working on. And then I love to answer questions and go on tangents and stuff like that. So if folks have questions, please let me know. And I'm happy to try and answer them. I make no promises about my ability to answer them. Christopher says, my Halloween feathers came in today. Just in time for Halloween. Spooky eyes. Awesome. I'm glad they're back in stock. Well, Jeff and David are in LA, or around LA. OK, so I guess we'll start where I was working on earlier. So let's switch to the desktop before I forget. So I'm currently waiting for this build to finish. It looks like it's going well, which is good. The docks build was failing. So I take a couple steps back. I was looking at issues for Circuit Python 9.0, which is our next major release. And we're about to do our first alpha release because we've merged in MicroPython 1.20. The reason we were waiting for that was because the MPY files that we ship and share around, the version format of those changed between Circuit Python 8.0 and what will be Circuit Python 9.0. But we needed to do originally two updates, but now three updates of MicroPython 1.19, 1.20, and 1.21. And the MicroPython version underneath at all changed between 1.19 and 1.20. So we couldn't do any alpha releases calling 9.0 until we got 1.20 merged in. But now that we've got it merged in, we can start doing some alpha releases because even, well, 1.21 I think is not too far off. We'll see. Dan's been working on the 1.21 merge, but we could do releases before 1.21 is merged in because the MPY format didn't change with MicroPython 1.21. We'll see if we end up doing that. I don't know. We'll see how the tests go here in a bit. But Dan's mainly been working on that. But what I was doing is also going back through all of the 9.0 issues and trying to spot the ones that I wanted to do really early. So all of the API breaking sorts of changes I wanted to do pretty early so that from the very get go with alpha releases, people would be able to fix, find issues, and fix them. So I snagged a couple. This one is a work in progress. Revamped Supervisor Allocation API. Oh, you know what? We need to do an 8.2 merge as well. We can do that on the stream. So Dan released 8.2.7, which is a bug fix release. And it has bug fixes that aren't in main, which is where 9.0 is. So one thing we can do is we could actually do that merge from 8.2.7 back in the main as well. I was just thinking about, I think I have a third issue here assigned to myself. Yeah, this matrix portal S3 hard fault, which I fixed in 8.2, but I did not fix in main. And so even though it's flagged as 8.2.x, it's still open because issues get automatically closed only once you merge into the main. David asks, David Buchanan asks, is there an advantage to changing the MPY files? I don't actually know why the format's changed. I know one thing that the MicroPython folks were trying to evolve towards, and I don't think they've finished, is the ability of being able to run MPY code without copying it into RAM. So running it from Flash, but it had to be in Flash linearly, so they were talking about having a storage system to be able to store linear MPY files in Flash. I don't know the state of that work, but I think some of the MPY changes were done for that. The advantage for us to change the format is just that we stay with the format of MicroPython. Even though they're not cross-compatible, like we actually do change, like the first character, the file is an M or something, and we change it to a C, just so that our MPY files don't inadvertently get used with their stuff, there's not a lot of differences. We haven't gone out of our way to actually change the MPY format at all. So I don't know of any advantages. I don't know what the differences are. All I know is that in the process of adopting upstream MicroPython changes, we're going to evolve. And one thing I've set out for us is that we will only do those MPY version changes on major version boundaries. And we teach people to get the major version bundle of MPYs, even if the version doesn't change. So 6 to 7 or 7 to 8 at least, the MPY version didn't actually change. But we wanted to just teach everybody the process of matching major version for the times that it does, like with CircuitPython9. Yeah, so the only advantage is keeping up with them. Oh, nice. So Jeff posted their first board. He designed it. I can't read it in my small. It's got terminal headers for every pin. It's pretty neat. OK, so we're going to soon get into the world where we're releasing alphas. And I want to do all the breaking changes as early as I can, so we have as much time. Hi, Paul. I think you're the reporter of this bug that I picked out that I might take a look at when we get there after a recap. So yeah, so this one's fixed. We could do the A2 merge. The revamped supervisor allocation API is going to come after 121. And then I'm revamping it by removing it, mostly. But this split display IO is a thing that had come up. And it allows you the idea being that if you have a board design that has a display, but doesn't really have connectivity for any other displays, you should be able to pare down what code you're using so that you only have the support for the thing that you actually need. And I saw this, and I thought about it, and I thought, you know, this is going to become more true as we do more fancier displays, like dot clocks. So we should just go a little bit further and split some more stuff out. So that's what this branch is doing. I have split display IO. And let's look at the commit history. It's a little bit circuitous, I guess. It's got more than just the split in it. So the first the split is just, so here's what we're renaming. Display becomes bus display, bus display dot bus display. Four wire is four wire dot four wire. E-paper display becomes e-paper display dot e-paper display. And I squared C display becomes I squared C display bus and I squared C display bus. And then for a little bit more clarity, parallel display is now parallel display bus. And all of these are still available under their old name. So we kind of like point the old names to the new version of the object so that code should be compatible for 9.0. So the old versions of display IO dot display, that'll go away in 10. But the new version bus display dot bus display is available in 9. So that's what this is trying to do is lay that foundation. We tend to try to have one overlap major release. So for example, another major change in 9 is that we're deleting display dot show. We're removing it in favor of dot root group. And we've had some issues with that. But yeah, so this is that earlier step of making sure we have a major version where two things are available. So it's a lot of just moving stuff around and renaming. Timon asks, how do you deal with deprecation like that? Does it log a warning if the old name is used? We don't. Oh, it's an Adafruit breakout board. We don't log it. And generally what happens is we don't go back and fix things until we're in the next major version. So right now we have a lot of work to do to change all of our example code from show to root group. But we know that when we do that, all of the existing 8.0 stuff will still work. So it's not that we're going to warn you about it. It's that you're like, everybody should be using the version that supports the new way of doing it. And the folks on the leading edge using the 9.0 alphas are the ones that are finding the places that it just doesn't work anymore. So yeah, it's kind of like this new stuff is going to be there in 9.0 so that new code can use it if they know better. And the documentation is up to date, but the old way will still work. And then when we do 10, then we'll remove it and we'll find all the places that we haven't updated yet. Thanks for purchasing from Adafruit, Jeff. I appreciate getting paid by Adafruit. They're great. I love this gig. So thank you for supporting Adafruit at Adafruit.com, if you don't know. If you're on the YouTube and you're not on the Discord, you can go to adafru.it-discord to get in there. See, I didn't even know that we had that terminal breakout block. That's Adafruit 5096 and 6. Huh, I did not know that. Oh, it's from CZHLabs.com. OK, so it's purchased from Adafruit. It's not designed by Adafruit. I hadn't seen that. Neat. OK, so I was doing this display.io split. And I was doing some testing. I actually did like some smoke testing. Makes sense. So more convenience for core users and less for staying compatible with wild old code. Yeah, all the old code will be fine. It's more for the folks that want to update. We tend to support major versions of CircuitPython at any one time, right? And then we do that as we transition from one version to another. So we usually have the stable release, which is 827 now. And then we'll have CircuitPython 9 alphas. And then we'll have this process that we just went through with 7 and 8, where at some point we'll decide the 8 has been out long enough and we've found the bugs and it's stable enough that we can stop supporting the previous version. So 7, before we started changing libraries in example code for 9, we stopped building the bundle for 7. So there's a page, I forget where it is, where you can download a bundle that's like the last bundle that is theoretically valid for a particular major version. So like where is it? I think it's in CircuitPython Essentials. Welcome to CircuitPython Guide as a FAQ, I think, is where it is. Yeah, so I have to continue using CircuitPython 7x or earlier, where can I find compatible libraries? So we have links to these old zips that are like the last kind of version. Jeff asks, so Python does not have deprecated annotations like JVN languages? I think Python itself does, but I don't run across it where I'm using it. And I haven't, as somebody who works on an alternative version of Python, nobody's come to me and said, I need to be able to mark things deprecated. It would be good to be able to note it in the docs, and maybe that's something that we should look at too. But I'm kind of in the camp of like, for 9.0, if you look at the docs, you'll only learn the new way. Like, I'm kind of OK as I'm OK not documenting the old way. Like, you can always look at old versions of the docs themselves. So yeah, in the docs, I kind of just want to leave it the new way. OK, so that's one thing. But when I was testing it, I found that root group didn't work. So it was a little worried. So we're trying to do this transition from calling a function called show where you give it the group of the stuff that you want to show on the screen to having an attribute that is root group or it's a property under the hood. Yeah, I don't know if CircuitPython has a way to do mornings. I don't think so. It hasn't come up. But yeah, so we're doing this transition from a show function to a root group property. And it has a couple nice benefits of doing root group. One, you can read back what's showing so you can see what something is actually showing. And two, and this is different behavior between show. If you set it to none, if you set root group equals none, nothing shows on the screen. Whereas with show, if you passed a none, it would show the terminal. So now with root group, you actually have the ability of turning off the screen. And if you want to show the terminal, we now also make the terminal available to you so that you could assign it back as the root group if you wanted to. So yeah, root group's the future. But it does this thing that has a property in a native class. And it turned out that when I was testing it, I found that that no longer worked. And this is a deviation we have from MicroPython. And so what happened is that during the merge of the newer versions of MicroPython, we omitted the code that made this sort of thing work. So the next thing I did in this branch is I fixed it. And the way that I fixed it, it requires you to add this flag. But the main interesting bit is that I added a test now where there's a Unix port, so a version of MicroPython that you can run on Linux or Mac. And so I added this native base class to it. And so now we can see that it's also testing the ability to pass keyword args in. So it prints out what .test is, it sets it directly, prints it out again. Now it subclasses that native base class, sets it through the keyword args again, prints it out, sets it through the property, prints it out. And the misfunction with the way that it works currently in main is that when you do this set, this a.test, it will create a new attribute on a. It won't actually tell the native class that it was set. So it doesn't actually affect it. So what I was seeing is that it was assigning this new group to the root group, but it was still showing the terminal. It's the consequence of it. And then here's a second variant of that where it overrides in it just to make sure that that stuff works. And then there's this exp that prints out what the test should actually produce. So yeah, that's one test that was missing. So when we do a merge, we want everything to build. We want everything to kind of work to run. And then we also want all of the Unix tests to pass. We want all of the builds to run. And we want all of the builds to build. And we test kind of at least one board of every port to make sure that all the ports work OK. I'm going to turn on the AC. I know it's a little loud, but it's 81.1 in here. And just getting hotter. It was like 80. It's gone up a degree. I know it's going to be a little loud, but it'll increase my streaming stamina. I have a cooler in here. So this was a case where I changed the behavior in the py file. So I added a note in obj property. And then this is in the class lookup. It says, oh, if it's a property, then we just return the property itself. And then also, as you subclass, you inherit this special access or a flag from your base types. And then I also added a check. So this is new. So the problem with native types is that there's no automated setting of that flag. You have to manually set it. So how do you know if you set it correctly? Well, I added this thing that says, if properties are enabled, this is a particular accessor method. And it says, oh, if you got a property, just check to see if the type has that flag. And if it doesn't, it sets the result back to null, basically saying, I didn't find it. I didn't find it. So now with native classes that don't have the flag set, the properties won't work. You'll have to set the flag otherwise it won't. Jeff asks another question. And totally beginner questions are totally fine. I'm not always the best person to answer them, but folks in the chat can be helpful as well. I know this is deep dive. Can I use the Python plugin in IntelliJ with CircuitPython or VS Code? Again, I know this is a deep dive but not beginner. So personally, I don't use an IDE, so to speak. I know there's a VS Code CircuitPython plugin, but I don't know how well it works. I know one thing that happens is that you need the stubs. So we publish a CircuitPython-stubs that will stub out all of the native stuff, all of the native classes. And that tends to make fancier IDEs happier. But yeah, I don't have a lot of experience with it, so sorry. I think there is a learn guide about PyCharm, which is by the IntelliJ folks. Creating and editing code. I mean, Mu is what we recommend. But the reason we recommend Mu is largely just to get people doing the, I use sublime text, and then I have a separate terminal that connects to the serial output is usually how I do it. But then again, I'm mostly doing C. I don't do a ton of Python actually. Oh, there's a recommended editors page. Oh, it's under advanced. Yeah, so there's a little more information there. Recommended editors. Oh, and Timon from PyCharm and CircuitPython, which is probably under advanced tier two. Yeah. But yeah, so my workflow is that I use sublime text to edit the files. And then I have a terminal window with TIO, TO open. TO is great because it auto reconnects, which is awesome. Yeah, that's usually my setup for how I do it. Of course, I've never really worked in a world where I had a really strong ID. I still do a lot of printf debugging as well. OK, so the last thing that I ran across in this, so I found that root group didn't work, so I fixed that. And then you'll notice that this build is broken. And the reason it's broken is the docs build failed. See this docs build? And if we go there, yeah, I like sublime text a lot. I use sublime merge as well. So the PDF build, with this splitting display I owe, the PDF build started failing. And there was a couple reasons for it. It doesn't look like, oh, it did load. It loads this giant thing. It spews a lot of warnings. So the raw file works better. There's all these hyper reference warnings that it spews. If we go to the bottom, there's also this badness thing. Blah, blah, blah. But the actual failure here is that it ran on a main memory size. So I think we were on the cusp of being too large, basically. And I looked for an easy way to increase it, and it's surprisingly difficult. So the thing that I ended up doing instead, and I was doing this most of today, is that I'm splitting. So not only do we build HTML docs, but we actually do build PDFs as well. So here is the new version of the PDF. And maybe I should open the old version as well. So if you're on docs.circuitpython.org, you can click in here and then hit PDF. So these are the 826 docs. Sublime Text was my editor for a really long time but made the switch to VS Code last year because the remote development tools they added were a huge time saver for Raspberry Pi work. So this is what the PDF currently looks like. It's got kind of one top level thing and then stuff nested under it. And it looks a lot like the readme. And the thing that, well, core modules and then the module support matrix. So it's this that really takes a lot of pages. Like if we click between here or on page 8 here and then if we click to support it like the next section where page 314. So the support matrix, if you don't know, is really cool. But it's not really designed for. So the equivalent here is this module support matrix. And this is really cool. So this is a list of all the boards and all of the modules available on a board. And if you want to say, OK, what has Pico DVI, you can type it in here and it filters it down to all of the boards that support Pico DVI, which is really handy. But it also generates like 300 pages of PDF, which is wild. Ooh, I want to see that. I'm going to copy this link too. I'm so used to never leaving the IDE. Yeah, see, I've never really worked in a space where I could actually do that. Yeah, so going back to the docs for a second. So it's kind of deeply nested, not well organized. So in my switch here, I actually added this docs PDF to RST, which is like the top level file for doing the includes. So I could just restructure everything. So let's look at the new version. I don't know. Let's show the sidebar. I wanted to always show the sidebar. This is a different viewer, so it's a little bit different. Now we have CircuitPython, we have the libraries, library bundle, building, blah, blah, blah. So a lot of top level stuff. And then we have the API reference. And this is where all of the individual things are documented. And then what I did is if we look in, this is in CircuitPython build law text. So if you build it from the root, there's now a second PDF that you can open. It's just that table matrix. Now it doesn't link back, which is kind of annoying. And it's a little weird in that it's like portrait. But I figured out at least how to make it. It's a weird landscape. I thought it would switch everything, but it only, yeah. Anyway, it's landscape. And so that's here instead. So this is a, I want to be able to look up for a given board, but what can I do? So it'll be in a separate PDF, which means it will be under that memory limit again. Yeah, it's LaTeX. And it's generate. So Sphinx builds all of our, we have marked down an RST. And then that gets, the RST gets run through GINJA. And then that GINJA produces more RST that gets converted into HTML and LaTeX. So yeah, so that's the other change that I made to fix this build. So I was working on that. I was thinking a little bit about what order would I want these things to occur in. That's a whole chapter. It's not perfect. I'd love for folks to tweak this some more, but I can't spend too much time. But I was thinking about I have this vision of circuit piping kind of filling that 80s 8-bit computer gap. And one thing that those always came with is reference manuals. So getting this at least a little better is like, OK, it's 366 pages. Maybe I could start to think about printing it out. So yeah, thinking about this is like the reference manual you'd print out and flip through. If you were in some world where you couldn't just look it up online. So that was fun. And that's what I spent most of today doing is just getting the Dreat Atari. Dreat Atari? OK, let's take a look at this PicoVision. I was waiting for it to come out. I'm curious. So it's a Pico on one side, and then a board with another RP2040, RAM A and RAM B, GPU debug, CPU debug. So I guess they're calling this the GPU, yeah. Interesting. So it's RP2040 plus PicoW, line audio DAC, HDMI port. It's interesting they're calling it HDMI because I wonder whether their board design is so good. Sort of bank switching slash frame buffering. The hardware Atari 800 manual. Have I seen the flower badge we made for a CC Camp 23? I think I did. I think Carl, who's in my hardware hat PR, brought one. Saw that it was like an ESP running MicroPython, I think. So I wonder how they say you can use it. What resolution does it support? So it says C++ or MicroPython. If you're a beginner, we recommend MicroPython. Higher resolution modes use significant GPU overclocking. C++ MicroPython libraries add a USB keyboard. How it works, here we go. Uses two RP2040s swapping the contents of two physical PS RAM frame buffers back and forth between them. The two PS RAMs act as a front and back buffer. The CPU writes to one while the GPU reads from the other. Applies some hardware effects and generates the DV signals. Yeah, so here, here, here. This is not stock MicroPython. It is PicoVisionPython, MicroPython. Pimeroni has their own fork of MicroPython, and people need to understand that. I wonder what all the modes are. So we have Pico DVI support, which allows you to output DVI signals from a single RP2040. I think I did get it to 800. Maybe it's doubled 800 by 600. Good docks. OK, so here's the wide screen build. Yeah, so there was rumor about this that they would be able to do 1080p. And this is not doing 1080p, and that's fine. But it is higher res than what we can do, I think. Most of what we can do is pixel doubled. And we don't have this double buffer sort of thing either. And they do allow sprites. 80 sprites is a lot. I mean, this is still really neat. We'll see what people think, see how well it does. I think it probably has too much. Yeah, I don't know how they're talking about it. There's GPU firmware. Differences from Pico graphics, not display IO. A whole RP2040 dedicated to display tasks only, yeah. So Jeff says, let's see. Flower shaped touch synth with a round display. But a lot of stuff running behind the scenes on IDF. Yeah, get that stuff checked in. Although synth IO has been really quite cool. I don't know of a circuit by thumb version for this Pico vision to be clear. I haven't seen anything come in. And I don't think I'm going to do it either. Jeff says, so circuit by thumb does not have hardware interrupts, but you can drive a display. A lot to learn. So we don't expose hardware interrupts to Python land. But we do use hardware interrupts under the hood. So if you need hardware interrupts, you can do it. You just have to write C code, not Python code. Maybe you have a plan to do I spy to DVI. What would be the resolution? So I spy, is that the new, I forget what, is that, yeah. I spy breakout connector. This is for the spy displays, right? Lots of spy pins. Yeah, so there is like an Arduino example already that implements, pretends to be like a spy display and then outputs to DVI. I think there's an Arduino example that already does that. But I don't think we have a board for it yet. So our stuff is based on Pico DVI. And we get to see what the resolutions for that are here. And I'm sure this is what they're building on as well. Don't just tell you the resolutions, huh? There's a software, read me. But they explain how they do all the encoding and stuff. Software, read me. Don't get the bad apple thing. Yeah, there's like different modes. I forget. Do we have it in our docs? Oh, you know what? I don't know what Pico DVI is in here. I think it was a, oh, no, there it is. Pico DVI, two output resolutions are currently supported, 640 by 480 and 800 by 480. If it's monochrome, either two color or four color, it'll be full resolution. Otherwise, it'll be half resolution for more colors. Thanks, Jeff. Have a good one. MPEG video playback, too, which is a fun feature. Got to upstream that stuff. I'll have to take a look. Python payload. Ooh, did you do MP3 decoding on ESP? Yeah, we'll have to take a look at this. LWIP. Why do you include LWIP when you're doing fetch data, maybe? MP3 draw. We don't have MP3 decoding on ESP yet. I don't think that would be cool. All right, I'd stash that in my other browser for later. OK, I feel like, so there's a couple of things we could do. There's one bug that is Paul's bug that he filed. It's one we could work on, but I also bugged Dan and he pushed the 121 merge. In fact, what I want to do is I want to make a pull request since this display.io stuff looks good. Waited too long. If I push it immediately, I can. So my guess is that this is going to work. Now, this is annoying. I forked my version of Circuit Python based on MicroPython, so it always defaults to the wrong thing. If I ate it through main, now I get the right thing. I want to crib this broken by a preview. You'd have doc build that now fails to the size of the support matrix. It is split out into its own main PDF. Now, it has a dedicated. All right, so I'm going to create this pull request. Jeff's on vacation, so I'll request Dan to do it. And we might want to wait till 121's merging because I touched a lot of files. And then you know the other thing I want to do is I want to do the 8.2x. So let's go to here. Let's git fetch 8.0. OK, so now I want to git switch merge in 8.27. So I should be on, oh, I'm on split. Git reset, hard, different main. OK, so I'm on main. I'm on a branch called merge in 8.27. Before I do anything else, I'm going to git status. And it doesn't look too bad. So I'm going to do git merge 8.2.7. And we're going to have to fix some stuff. But I want to get that, in particular, that matrix portal fix I want to get in here. So I do that. Please manually handle a merge of each conflicting submodule. Go to the submodule and either merge the commit or update to an existing commit, which has merged those changes. So I don't want to change any submodules. So I'm going to go make fetch all submodules to try to get back to the main state, I think. I should have titled this, Scott Does Git. It has dropped down a little bit in temperature, so it's nicer in here. OK, so it updated the ESP IDF. We should just double check that. Yeah, we don't do GPL. CTX dependency. Hi, Gary. Thanks for dropping by. OK, before we get going, I just want to see what port's expressive ESP IDF is on. It's on 5.1, so that's what we want. Git add port's expressive ESP IDF. Getting her done. Yes. And an unexpected maker who hasn't shown up yet, sometimes shows up, didn't want me to update his boards, but I think I'm going to have to. So we still have some merge conflicts, so I'm going to pull up my trusty sublime merge as my first place I can go here. So no I2S on CNG51, but turning off Flop.io and GIF.io is probably what we want as well. So let's just use. I have a really hard time knowing what the left-hand side and the right-hand side are, so I tend to just pull up the files on GitHub as well. It's CM4, and I can already see that. Yeah, so Flop.io, GIF.io, and then if we switched A2X, we'll see that the I2S thing went away, but I think that, yeah, it's turned up by default now, so it's going to be removed from a bunch of boards. So I think what the right thing is to take here, but then you can also delete stuff. I think this is what we want. We want the two things that were added from the left-hand side, but not the thing that was removed. And then here, it looks like a spacing change. So we're going to take the left-hand side and the right-hand side, but what we're really going to do is, did somebody ping you? I'm doing the A2X merge, so I think I'm going to have to update the board desks you added to A2. So I think that's right. The next stage. So this is the same thing where something's being turned off to save space, so we'll do the left-hand side, but then delete the audio bus bit, because that's now going to be shared. And this is why I wanted to watch it again. I didn't mean to shame you. PR, two new boards to A2X. You just missed A27 with that, but we can always do an A2A for you as well. OK, so it looks like this. So the left-hand side is main, and the right-hand side, so this is 42 and 21. Oh, you know what? This is a change I did. So we sold a few of the Metro S3s, and then pretty quickly realized we had a problem. So if you were one of the people that bought a Metro S3, the Rev1, I thought I was shaming you by saying that you hadn't popped in the stream yet. I'm happy you're here. So if you got a RevA of the Metro S3, we'll send you a RevB when we have them, because we had to change the pinout in order for something to work. I'm going to assume the left-hand side is correct. Deonit Singleton. Ooh, this was stuff that I fixed. Oh, yeah, there's this new MDS server. I don't want that one after all. Oh, Deon's watching. Deon, I'm sorry. I haven't done your. I got distracted doing the A2 merge. I was going to try to run the tests and see, but I haven't gotten that far yet. OK, so I merged everything in, I think. And I don't know what the new, oh, here's the new boards. These are the things that I've got to update. So there's the Magic Click S3 and the Unexpected Maker Blizzard. So let's get over to, and we'll build those two, this Magic Click. So I'm going to have to update these for the new style, I think. This is needed too. I know, but I bugged you about it. But yeah, I want to get the fixes from 8.27 in the main. Was that the Reve pictured here? Yes. Really send down STK config, so I can imagine that's the major change. Yeah, and in fact, I can show updating the board config. That's what I can do. I'm assuming it's not going to build. Let's take a look at what we're dealing with. Add a few files open. Fonts, ports. I was working. Oh, that's what I should do. So I'm helping SyLabs with a tech talk. Next Thursday morning, if you want to attend, it's really early West Coast time. It's 7 AM West Coast time. But I have in my email a sign up link if you're interested. I'm sharing. I'm just doing part of the presentation, and then the other folks are doing, like somebody from SyLabs who did the implementation is going to do it as well. Copy the tech talk details there. I'm going to be talking about circuit by bunch generically, and then they'll talk about the implementation on the SyLabs chips. They do not have native USB. They have BLE instead. And they don't actually have the BLE workflow on, so they're just us suggesting Thawney. OK, where did my? I think it's, I assume the tech talk is free. I just, my main concern is I'm going to get up really early. Like, I'm going to do it from here at 7. And I have to be there earlier to check my mic and my video. Yeah, it's going to be kind of early. That's OK. It would be way worse if I didn't have a one-year-old who got me up early anyway. OK, we're looking in boards. Boards, boards, boards. And then we're going to do the magic click. Let's look at the SDK config. Yeah, so this has a bunch of SPI RAM stuff. And the thing that I was looking at is it's in quad mode. And it's 2 megahit, 2 megabytes. Yeah, I think it's bytes. So we'll do circuit pi. And then we now have, instead of flash, we have PS RAM. PS RAM and PS RAM. So I just inherit the settings here. So quad 2 megabyte. So we do QIO 2 meg. And the speed is 80, so that's right. So I'm going to add that. Is there not a registration link? I don't have to register, but let's see what. That's the link. I pulled it from an email. Yeah, so here's a register pane. I'm in Firefox. So I assume that's what you do. So yeah, check that out if they're interested. It's very, very cool because SILabs is like, you know, somebody at SILabs actually, like, has made all the changes and stuff to CircuitPython to get it working. And in their docs they say, like, this is the official. They say, here's official CircuitPython. They linked to circuitpython.org slash downloads. So that's really cool. I did actually, I was testing it with the latest 120 merge and I found some bugs and I had to fix it. Turns out we had broken it in nine, but it should be fixed. Fixed in nine and I also, there's a PR for this that got merged in already. They hadn't set the pins for status LED. So I added status LED pins to the three boards that they support, which I have all three here. So I did test them all. And I added a note and made it easier to flash and stuff too. And this is the, there was a watchdog timer problem. Okay, pop the stack, undefined reference. So this is probably the build there because I didn't set those things. So let's, what I want to do is I want to do, I'm going to do a clean. Now that I set those things, and now I'm going to do menu config, which might work. I thought that should work. I'm going to rebuild it and then I'll do menu config. Yeah, it's cool. It's cool to see vendors supporting it. To their credit, Sony is the first vendor that did it. Like this presence, the Sony's presence, that's also done by somebody at Sony, which is cool. So we're happy to have that stuff there. We do occasionally just like smoke test those things, but they're not kind of our bread and butter, Adafruit supported stuff. We're happy to have them in the repo and to do the reviews and merges and releases and stuff that they need. Okay, so I'm going to rebuild it and then I'm going to run menu config. In the menu config, what it should do is it should update the SDK config and really reduce it down. Like all of these settings, all these Byram settings should go away. The only thing left should be this local hostname bit. I think we can do that by running the menu config commands. Cause it will, the menu config, actually there's all, I added a second command. What is the second command? I also added make file update SDK, board SDK config. So once it's done, I can do that. Do, do, do, do, do, do. Then we'll want to do this for unexpected makers board as well. Oh, it didn't fit. It's an S3 with a little flash. So for those I've been disabling BLEIO because BLEIO is really not that interesting slash useful. But let's do update, board SDK config. So this is debug output and it's telling you for things that are not default values, they're going. Except it's not telling you where they're going. I must have removed that. So let's go back and SDK config. So now all it's got is these two things. And I just don't want those. So I'm gonna feed them. It's trying to preserve them clean again. And while we're at it, while we're waiting for this one, let's do the unexpected maker one as well. The Blizzard. So it's eight, eight megs quad PSRAM. I tend to like to put the size first. Unexpected maker, this flash mode can be switched in main so that you probably want it quad. When it's actually flashing it via the command line, it'll automatically take quad and do dual because they're like boot ROM doesn't do quad. Oh, flashes eight, okay. Perfect, spy RAM. This says spy RAM size eight, 880. Is this wrong? You might want to fix it in eight too then. But yeah, that's kind of why I did this change is like makes it a lot simpler. Okay, so now we're gonna do unexpected maker. Sorry, I just moved the window so I could see it. Board hardware changed two days ago. Okay, so it's just not been updated. All right, I'll make it two, two in this one. So I'm gonna build it. It's gonna preserve some settings. This I don't need to change at all. Wait, is this your FPGA board? Ice 40 spy bridge. Ooh, microcontroller plus an FPGA. I gotta find some time to work on that. The Pico Ice looks interesting too. I really like, I'd love to define my own sock. I did, so the Silabs chip is a Cortex M33 and I did notice that it hard faulted when I was, the watchdog problem was that I think that was the watchdog wasn't clocked, like the clock hadn't been enabled to it. And when I tried to, and Circleby then tried to access it, it was hard faulting, which is better than stalling. So I'm hopeful that like the N30, like the new generation of ARM cores are actually like better to program on. So I think it's only these two. If we go back to the other tab, like there's another Art Raspberry Pie board, but those don't, I don't think they need to be updated. I don't think it needs to be updated. These ones automatically merged. I think it's only like the RG main matrix fix we do want and it merged just fine. It's only the expressive boards. We got a switch for 5.0. Hi, ask Patrick W. Is there a, is there a mastodon link? Really trying not to go to Twitter anymore. My opinion, everybody should be off Twitter. I don't want to open, I don't want to open a Twitter link. Twitter has been removed from my phone. The day it became an X, I was like, I can't do this. Mastodon's quite nice. I'm on mastodon. Okay, let's go back to the other tab. It built okay, but we want to update board SDK config just to delete. So with the main, the update to IDF 5, I made the R SDK configs not include non-default values, whereas some of the, that's almost entirely true. Yeah, so this is just the, it's trying to preserve these incorrect settings. Ah, and the light turned off. This room has a motion sensor overhead light. I know there's some people on Twitter still, but I just, I can't do it. I just don't. I don't, don't like Elon Musk. I do agree that. Oh, you know what? I think I might have seen this anyway. Or maybe it was in the newsletter. I know I still do have my account, but mastodon is where, where I'm at. Of course, I don't post a lot either. I think I did, I think this was in the, okay. I can't hear the video. I think I can make it so the stream can hear the video too. Turn on desktop audio. Hey, one, because I've got nothing better to do with my time. Here's my Blizzard S3. Okay. Here's the DVR PMOD. Ooh. Rotating cubes. Just added some basic 3D functionality to the graphics library, as well as Ngon, so N number polygons. What was that? Okay. So you're using that Ice 40 to output DVI. What resolution are you getting out of that? That looks neat. Hopefully folks can hear. Sion's explanation. Yeah. I totally agree that I'd like a bit of an algorithm for mastodon, especially, especially because I see some people that retreat a lot, but I like the actual posts more, even though I don't post myself that much. Okay. So I deleted that stuff. Now I'm gonna clean and I'm gonna do it again, just to make sure. Yep. So reformatted. Now we only have the LWAP post name. I was wondering if audio could be heard. Great. Thanks, Patrick. Okay. So this is up to date and it's so up to date it's even got the right RAM for the other thing. I just, yeah. I'm in mastodon camp. I love that it's a nonprofit and you can support them on Patreon and they publish everything. So that's 320 by 240 at 256 colors using internal S-RAM, but now I have PS-RAM for the frame buffer. So you can do 640 by 416 bit and maybe 720 with 256 colors. All graphics code and certified on. Is it, do you have the ability to just like hook into display IO and just have it work? I have the display IO bias. I know other people don't like it as much. One thing though that is neat is that I think by this, doing this split that I kind of showed before, I'm actually segmenting out like the hardware side of, I'm segmenting out the hardware side of the display is a bit more from the like the display IO tile grid group thing. So I think there is a world where we actually like have some ability to do one but not the other and that sort of thing, which people would be happy about. Okay, this is done. This is done. I love deleting code. This is done and this is done as well. All right, so we're up to date. We're gonna finish the merge by doing get commit. There's a formatting problem. Some more places where we need a space. So we'll stage that. We looked at adding display IO, but it was a lot of work and stuff I didn't understand, but the plan was to add that at some stage or the community can add it. So I guess you are, you're storing a frame buffer on the Ice 40. So maybe you want, yeah, you could probably do an adapter. I don't know what the protocol is that you talk between the micro and the FPGA, but. You could make like a, it's very much like a bus display, where display I would tell you like, oh, write these new pixels here. But yeah, that's neat. I'd love to get more into FPGA stuff. Is it, it's an up 5K, I assume? Ice 40 UP5K writes the Ice 40 frame buffer, just via Spide. Does it do, is it like normal spy displays? Like, is it the same protocol? You could just tell it, it's a ST whatever. Have it, like just use four wire to the FPGA. Blue sky is public benefit. A B Corp, make it by its PS3. That's neat. All right, let's push it and we'll PR it. Yeah, I have a Macedon account on one of the servers that's run by the Macedon people. Yeah, I don't know public B Corp versus non-profit. I do like products that are from B Corps, like the cheese, like Tillamook Creamery is, makes cheese in their B Corp, I think too. I don't think it's a legal designation. Let's pick another PR. Let's overload Dan with his boots. This one should be easy though. He does all these, most of these merges in the, eight, two, seven. Oh, come on. I wonder if we'll have to make another tag. This might merge in the tag as well. Pushing pixel data via spy at the moment. Yeah, the bridge between AT and the activity plug down line. Ask Patrick Maker, ask unexpected maker, how do you decide to make a new board? Do you have specific use cases in mind or is it just about combining hardware and ways and seeing what people make with it? I know the eight of fruit answer. Eight of fruit answer is definitely specific use cases. Like what learn guides would you write for a given product? Although there is a class of eight of fruit products or like I wanna make a bigger board, like breakout boards are usually made if a component's gonna be used in some bigger board later. Okay, so that is out for review as well. So we've got half an hour. The other thing I was gonna do and I was bugging Dan about was to try and help fix some tests. So I'm gonna fetch D. Halbert. So this is a great example of getness because I have more than just like one remote. So now I'm getting the latest changes of Dan's copy of CircuitPython. So he has this V121 merge. So we're gonna do get switch V120 type, 21 merge. And now we're switched and we're set up to do Dan's track. Track Dan's branch. And I'm gonna do the make fetch also modules which I think is gonna fail, but we'll see. So when I was doing that root group fix for display IO I got more comfortable running the Unix tests and figuring them out. Unexpected makers answer is I try to make products that I find interesting. They usually solve something I either dislike in other options or that I can't find elsewhere. Just updating all of our sub modules. If you don't do this, you risk accidentally adding, risk accidentally adding like the wrong version back. Every angle is cool, thanks Scott. Of course, I don't actually design a lot of products. That's my observation with how the more works. Blizzard S3 was specifically to see if I can solve the FPGAs are intimidating to microcontroller users. Yeah. That is definitely a world I've thought about a lot. I have lots of ideas in the FPGA space that I wanna do. The two main ones are like, in the same way that I kind of like just started the ULP support where you can have a Python ULP library that automatically brings its binary with it. I'd love to be able to have FPGA like base libraries that bring the bit stream with it and load it automatically. So you just like import a Python library and it would load and do all the FPGA stuff under the hood. I think that'd be really cool. Then I have like other ideas about how to like define this stuff that actually goes on the FPGA as well. But it's a lot of work, a lot of understanding. There's people definitely moving the FPGA world and hardware world the way that I want it, but they're not to the point that I would like to be. Okay, so let's do portcunix and we'll do, Dan told me that he got the variant, the coverage variant going. And I'm just gonna clean to make sure that I've got everything. So let's run the tests and see where we're at. Dan's just done an initial merge and he just got the coverage variant building. So fully expect that there's gonna be some issues here. That's how it goes. Don't ask why. Custom TinyUF2 allows people to drag bit streams on the drive for the ISE 40 plus you can also just drag them under your circuit Python drive too and have it just work. Neat. I know that the Pico ISE folks have that custom TinyUF2 as well. The Pico ISE is a RP2040 plus an ISE 40 up 5K, which are becoming more available now. Okay, we've got work to do. So 21 tests failed. What I'm gonna do is I'm gonna do, there's this results directory, I'm gonna just remove that and run it again. Dinner bell, enjoy dinner, retired wizard, thanks for hanging out. I'll probably have a snack after my stream. Yeah, easy programming without tons of tool changes, definitely the hard part and the problem missing piece. Yeah, I really would like to get, like I always push to FPGA people to like distribute their stuff pre-built and they just like their eyes glaze over and they're like, why would you wanna do that? Don't you wanna customize it? Therefore, I'm just like, no, like, yeah. Amryth is the thing that gets closest. Oh, I see. So Pico ISE says you have to convert the bit stream to UF2 for it to work. We don't, just drag it on and it works. You drag a bin file onto your boot loader and it loads it or it makes sense to me on circuit pi because like you have more, like you're writing into a file system in the interim, but that's not true with things. Okay, so some of these look pretty familiar. Some of these look like things I've fixed in the past. The extra coverage one is usually pretty normal. So what I'm gonna do is I'm gonna go in the results here and I'm just gonna look at what, yeah. So we have this like leading zero X. How did I, we faked the fakeness of tiny UF2. We faked the fakeness. So you're actually writing the file to, so your boot loader is actually writing to a flash file system. Yeah, white quirk does a lot of good work, but they, I want, I still have an idea that I wanna push it one more notch into Python lands. Like I want, like I write a lot of Python drivers in circuit Python from the outside in and I want, I wanted to look the same from the outside. Like I wanted, I just wanted to be the driver. I sketched it out. I did this like, but it's not well documented like a lot of my stuff. Like I have this system on a chip project that I did three years ago. And I was like, what I found myself doing is I'm in the IRC channels. I tried to explain it, but just because I tried to explain it doesn't mean that I managed to. But a lot of what I was doing is like reversing the way things are connected. So like starting from the outside and passing things in. So like here you can see like random access memory is taking in like a range from a memory decoder. And then I'm like documenting it like a regular variable. And then timer takes like a bus object into it itself. Yeah, we probably talked about it. I haven't done anything since then. The only thing that is kind of in this vein that I started to work, that I did a little more work on was doing a, what I realized is that you could have a lot of the same functionality for cheaper if you just ignore the desire to be an FPGA. And this is the STM32G0 on a STEMA QT board thing that I was thinking about. Where you would have a circuit by the library, it's kind of like seesaw where you have a circuit by the library, you tell it here's like, here's my iSquared C device that you're gonna talk to it's this address. And then it loads code onto it and then you interface with that code. And it turns out it's a lot cheaper. It's a lot cheaper than an FPGA and the STM32G0 is neat because it has iSquared C bootloader. So imagine that you load code that does an iSquared C target and then it has a special or consistent register or number that if you do that, it puts it back in the bootloader mode. So it's kind of like the ULP stuff as well. But yeah, it just never got there. It's in contrast to seesaw where seesaw is one firmware that tries to do everything. The G0 stuff was designed of like, well, what if you just have like particular firmware blobs that it loads on for certain things? But yeah, this is the thread I would pull if I ever had time to work on FPGAs, which is a good way to put it. Okay, we're back to fixing tests. So, oh, this is what I did. So to see a diff, I can do copy test results unix coverage to the expected one. And now if I look at my diffs, we can see everything that's changed and we can say like, is that right? So in circuit Python, we have the 0x prefix, which I think is correct, more correct. And then this is just like a redoing of the listing. So that looks right. And if we rerun, now that we updated our expected output, we should get 20 failed tests instead of 21. So let's do the same thing for, well, let's look at the Unicode one, because we do have more advanced Unicode, last I looked, expected versus output. It's not at the top of the file. Oh, see, we have updated, yeah, let's just copy the Unicode one too. It's Unicode, so I think this is right. Unicode, Unicode out, copy to Unicode, Unicode, oh. So this is a case where, so if there's no .exp file, what it's doing is it's showing you what Cpython does. And that's what we would want to match as well. So this is a case where Unicode, what is this? The expected version has it commented out and the actual version doesn't. So we can do build coverage, micropython, tests, Unicode, Unicode.py will run it and we see that we're not commenting it out, even though Cpython will. So we want to fix that. Those are like on the boundary. We have Unicode has this complicated notion of what's principal and what's not and we approximate it in circuitpython. And we try to do a better job of approximating it than micropython does. Let's just take a look at, but we're not perfect. We're not perfect as the remainder of that thought. So let's see what the tests, Unicode, Unicode does. And you can see there's a fixed Unicode test thing here. Test invalid, print wrapper. So the other thing we can do is we can look at stands, tests. Hopefully you didn't fix this already, Dan, if you're still watching. Yeah, so here we have printing of Unicode characters using wrapper. Oh, that's with wrapper specifically. Okay, let's dig into this. We have some changes around here. And they were done so that we would print smiley faces. Look, I changed them so we'd print smiley faces. If we look here, we can see that there's a... Oh, look at that. In 2021, I fixed this test by changing what it prints. Is that what we want? So this is what I was thinking. And the change that I'm referring to, string Unicode, these settings approximate CPython's printability, CPython document here. If it's between this range and this range, then we escape it other ways that we print the full character out. So I think the thing here is just to reapply that commit. So I wonder if we could just fix Unicode tests. We just copy this commit and just reapply it. Cherry pick. Ugh, so much garbage whitespace. There we go. So it'll have a new commit. Yeah, see it was FA684. So it's basically redoing that same work. That's what cherry pick and rebase do. It's just kind of a convenient way that I've done it. What's that way already? Yeah, I don't know when FPGA land. Once in a while, a little more is like, maybe I should do FPGAs. I think it was partly like, oh, I could get chips. 19 tests. All right, I've fixed two tests. Ideally, we'd be able to fix more than one test at a time. We're almost out of time. Let's just take a gander. No module name skip if. Awaitable is not iterable. Awaitable object is not iterable. We added the Anext stuff. I wonder if that's a flag issue. Yeah, so a lot of these look like the skip if thing. Why don't we fix that? This comes up every time, I think. Yeah. I'm the one that added skip if, and I can't remember how it works. Here's a JSON thing, but I have a feeling that we fixed the skip if thing before. Tiny test cogen. Test for import skip if and inject it into the test as needed. Like, whoa, we have a rosy.yaml file still. I added that like my first year when I was trying to, yeah, 2017 and 2018. Like, this is when I was trying to do automated onboard testings. When the test results say crash, what actually happens? Good question. So let's try it. It's usually that the build actually like seg faults. Well, returns non-zero is probably correct. So here, but then there was, it can either be a seg fault or just an exception, I think. No module name skip if. Testlib. I don't remember this. Like if we just look in test basics two years ago, tests, history, fixed test that you skip if. Three weeks ago. So I want to bet that this is not in there. Test run test 715. It has E, but it looks like the end E was dropped, but expected. Let's try it again. So onboard testing rosy.yaml is not a success. Yeah, the rosy stuff was just not reliable. It got like the boards got into states where I would have to like manually reset them so that we could load new builds. And then the other problem was I was using a Raspberry Pi and the churn on the USB stack would actually expose bugs in the Linux use at USB stack, which is not great. So like the Raspberry Pi itself would have to be restarted. Huh, that didn't fix it. Yeah, I look forward to the day when reliable onboard embedded testing can be done. Beata, what do you think is cool? Annoying but cool? Okay, so let's see what results are now. No module name skip if. That's the change, right? E, Python path, path lang. Check output, ME, it's to check output. Oh, accidentally hammering something hard enough to expose bugs. Yeah, I hung Udev like this week. Like I could see the kernel was seeing USB devices but like dev serial blah, blah, blah wasn't being updated correctly anymore. Like I think if I had to do it again, what I would do is one, I'd use circuit Python as a host as the USB host. So pick a version of circuit Python that works, use it as USB host to isolate your USB stack and two, load over SWD. So just like make sure that you can always load. You can always get it in the state that you want. Don't rely on the Rosie stuff was using like a UF2 bootloader to do it. Don't do that. Like use SWD be able to control reset and power to the like target device. Like if I had to do it myself, that's what I would do. Okay, so NDE is being passed into there now. This is to run CPython to work out expected output but that doesn't mean that it's running micro Python with it either. Like this is the CPython three command. Am I looking at the wrong? This out file is what micro Python should be running. So how is micro Python, command line options needed instead of sub process, check output. Oh, this is for the REPL version. ARG test file 254. How do we do it? ARG test file sub process standard out. So we're not giving it the environment. What if I just run, where is it supposed to be? Unexpected maker says I'd love to find a few weeks I could just sit and focus and really start to learn FPGA stuff. Find is not something I can just learn in a bit of time especially when I'm constantly in empty land jumping between circuit by done and micro by done in C++. Yeah, me too. The problem is I have a lot of opinions how I'd like to do it because a lot of the release, there's a ton of smart people in the FPGA world but they're all at the like super low level. How do I do clock domain crossing and things like that whereas I wanna use Python to assemble a sock. I wanna take this CPU and put this RAM and this spy controller and all this high level stuff and I want good docs on all of those high level things and there's tools like fuse sock but it's not Python and it is a build system for all this stuff but like all of the docs get built when you do that cause I think I'd really like I'd love to just run circuit by done on a soft sock and the like the orange crab with the ECP five is like a great piece of hardware to do that on like it's a feather form factor, ECP five that could have a soft system on a chip. They've done a lot of work there. It's just like I really want prebuilt stuff to like give me an ECP five image that I can load and give me a PDF of the docs, right? Like I was even thinking it would be cool like what if you could construct a soft sock but had like stat like where you could plug in peripherals so like it's not doing full place and route but it's doing like in on circuit by fun maybe you could like patch it together would be really cool. The commercial tools offer that but then you pay 15 K to get the DSI feature. Yeah, I get it. Wait, what is this second test slide here? 1023, maybe that's what we're missing. Oh, here we go. Micro pi path. Let's check that. Hey, that's not what we want. Soft feather wings. No, a soft feather. Soft feather wings would be cool too, but different. The challenge with putting an FPGA on a feather wing is that like generally you want pins out of it whereas like all the pins that go out of a feather into feather wings. Circuit pie change. Test line for skip if. Cost and availability of IP blocks definitely another big thing missing from accessible FPGAs. Like there's a lot of those libraries but there's no consistent, like this is the what fuse sock is trying to fix. I think is like having a package manager for standard IP blocks, but like I want to see documentation for an IP block before I integrate it. I want the equivalent of like read the docs for a particular library before I get all the build system set up. And I also want to be able to like not have to build it myself. Okay, let's run the tests and we'll call it after this. Circuit pie would be a limited use but I had a right man GPIO peripheral to do anything. 100%. And then we like we actually have the Litex port, right? So it was designed to use like the peripherals from the Litex ecosystem. But like I said, like I, when I pitched this idea of like you need to have pre-built binary, like pre-built systems to load onto an FPGA so I don't have to involve it. I don't have to install the FPGA tool chains. They did that like FPGA people's mind explode. Like that's the whole point, right? Like the whole point is that you install the FPGA tool chain so you can change it. And like, oh, how do you load software on that? Well, you run the thing. Oh, I broke more tests. 40 tests failed. Looks like I broke async. I broke more async tests. Well, let's take a look. No module skip if still. Let's do the, let's just do it. I think sometimes the like you can have stale output here. It's still said no module, not iterable. Also no module named that. There must have been a change run tests. This is, Gordy says, sorry, I meant apps that you could plug into the FPGA feather instead of plugging a hard feather ring into the outside of the FPGA feather. Yeah, like apps that you can load into the feather itself. Yeah, that'd be cool. I think I get what you mean. It's kind of like the same idea with the like the STM32G0 Stemma. It's like you can just load whatever you want there. UnexpectedMaker says fixed compile gateway for one off functions is okay. Something I'll be doing for the Blizzard S3, like here's the DVI stuff. But how to do, I want DVI out, NeoPixel and Iceberg C and spy one. If you want them at the same time, then it's hard. But if you want to be able to switch to them, you should be able to just like ship different circuit pipeline libraries that bring the gateway with them. If you want the gateway to do something, then you need like a management thing. Like the fixed stuff I would always assume that I have I have like a CPU core and peripherals that I can turn on and off. Like I just want to treat it like an MCU, but one that ideally in the world where I could like make it work better for what I'm using it for would be really cool. Okay, so it is MicroPiPath still. And we're joining by the OSPath separator. There is no empty. What does this, how does this change, change it? Unix main. So it's like overriding it. That's, this is a weird change. It's explicitly adding frozen, but leaving empty. So I think this is an example of something they inherited from us, this dot frozen. This dot frozen thing. But I wonder, I wonder if we have these changes. We just want to fix it. Ports, Unix main, 500. Fixing a lot of this stuff is like, okay, what, like, basically what, what do we have? Path starts as, and that's what, items zero, where's the SysPath stuff at all? So at the base directory of the script as the first entry in SysPath. So this is just like different. Know what we can do here? We can print this stuff out. Actually, you know what? We can just run it. Let's get a copy of it to the environment. Let's do wrapper so we get quotes and then we'll just sys. I don't actually want to run the tests, okay? So this is what we've got. So now let's try to do, and, hey, look, it's in my history and the coverage, micropython, tests, basics, it digs. Okay, let me catch up on this FPGA description. Git blame doesn't have many clues. Yeah, the tool chains are quite unwieldy. Yeah, the open source tool chain folks are awesome. That's why ECP5 is the way to go. You gotta get a set up on Git of action so you can auto-build it. Format of environment changed. So I think what changed in 121 is that they added the dot frozen thing like we did. Expert in gateway design, but you have to kind of get the interesting peripherals. I was taking the approach of like taking existing amaranth peripherals and tweaking them so they're wrapping correctly. Like that was my problem is that amaranth doesn't use Python abstractions for to map to FPGA like peripheral abstractions. It's more from the like, amaranth is just the builder and definer, but it doesn't actually like abstract stuff away. And that's what I was trying to try to figure out. I'd love to work on this but it's just like, they're so expensive. Yeah, the existing, the interesting peripherals don't exist in open source. So well, yeah, the part of the problem is that all, like a lot of the high speed stuff is not actually done in fabric, right? Like it's proprietary, hard IP for a particular thing. But what does exist from my understanding is like at the end of the day, you're still generating Verilog and it's just like some Verilog instantiation that you're connecting to. Okay, so this doesn't work. Let's see import sys and print sys.path. Okay, you know what? We're not in Tesla or like, we're not in the place that Tesla lives. So let's do, let's be here. And now I've got to do ports unix. I thought that was right. Oh, I don't want to go back to, I want to go back one. Import sys, print sys.import skip. See, it worked there. So it works there. Can I also run basics, which was an array int big? It works that way. Let's, what we can do is we can modify the test. Sorry, I know I'm over time, but I'm in the middle of this. And it's cool enough in here. It's cool enough in here that I'm like, I'm okay going a little bit more. So what we can do here is we can modify the array in big tests to also do import sys, print sys.path. And now if we go back to ports unix, make it. Oh, and I modified it. So let's undo that. Am I editing off-screen? You know I do. Sorry. So I added import sys and sys.path. Ice storm or ice studio, 40 tests failed. Now we pull up the results. That one test should fail because we're outputting something different now. Home, tenu, repos, certified on test basics. Oh, are we in tests basics? Whereas test live is relative. So I wonder if we do run tests, base path. Let's try that. And maybe to be more like, I think it's okay if we do frozen first. Let's try this. Okay, so that one array one will fail still because we're, hang it. It still failed. Test basics and then test live. It doesn't have a slash. It doesn't need a slash. That is so weird. I thought that would have fixed it. Does your debug print trigger compare errors? Yes, it does. Oh, but the skip if works now. Okay, but we still fail most of those. And I only put it here. It has a C Python crash, which is not good. Python tests. Oh, so it's having the same problem. That was in that other location. Maybe it's moving directories now. What is this base path thing? Fail, fail. 26, and it's mostly async stuff, which is not surprising. Not surprising. There's like two different async isos. Like we have our copy and they have their copy. It's that, waitable is not iterable. Task queue object has no attribute, push head. That I know how to fix. This is something I fixed in the 120 merge. Or yeah, I think I did. Sorry, this is what I think of as test which is it's broken and I must fix it and I will keep on working and working and working until it does shared bindings. Where is event queue or task queue? Oh, that's in. It's an X mod. This is something they removed. We have to add back. Thought we marked it, but we didn't queue. Push pop remove. All right, let's fix this too. Last thing, last thing. We're not going to fix them all. Test driven OCD, yeah, for real. It's an X mod. It was marked and it still got banished away. Mod async IO. The file was nitrenames, push head. We need them because the old names, the old names are in circuit byte on eight and we need our library to work with eight and nine. Okay, let's see how many things we can fix with that. Last thing, last thing, then I'm done. Thank you all for hanging out with me. This has been a wonderful time diving deep. I'm Scott. I go by tan new on Discord and GitHub and lots of places. If you want to go join the Discord, you can go to adafru.it slash discord to check it out. If you want to support me, just support Adafruit. They pay me to do all this work. Streaming, hacking, all that stuff. Adafruit.com, buy some cool things there. Thanks to Unexpected Maker as well for being awesome open source. Hey, we're done to seven. Done to seven tests. Okay. Yeah, do that. If you want to do the PsyLabs thing, check the chat histories for links to the PsyLabs tech talk. It's Thursday morning next week. I'll be up bright and early. Hopefully I'll remember. I will remember. It's been great hanging out with you. I'm excited about the FPGA stuff, even though I could never find time to do it. Maybe I will at some point. And keep an eye out, keep testing CircuitPython 9 and we'll get there. It's gonna be exciting. It's exciting to be up to date with MicroPython or at least almost so. With that, have a great weekend everyone. I'll get these changes pushed and Dan can help fix these other ones as well. Thanks to Dan for doing a lot of them.