 Hello everyone, we're gonna get going in just a second. Let the internet tubes warm up. At the end of the stream last time we played with the settings a little bit. Hello Jeff, hello unexpected maker. Light rain weekend. Ooh, I have window cam. Oh, that's not window cam. Is it bench cam? Overhead cam? OBS has mixed up everything. That's okay. It's a rainy day here in Seattle. I'll tell you that right now. It's been rainy and windy the last couple of days, which has been great because they're redoing a roof. They didn't quite appreciate how rainy and stuff it is. Okay, let me just double check that everything looks good here. Change titles and YouTube is up and running, great. Okay, so hello everyone. This is Deep Dive with Scott, I'm Scott. Tahoe's getting slammed just now and that's good. Hi Beata, same weather wise where they are. So my name is Scott. I work for Adafruit on Sarkapython. Adafruit is an open source hardware and software company based out in New York City. I work for them remotely here in Seattle, which is rainy as they say it is right now. I do deep dives usually every week and depending on the wellness of my family and my small child, he's two this month, which is exciting. And yeah, they're usually two hours, so I usually cover what I'm doing in Sarkapython land. So Sarkapython is a version of Python designed for little tiny inexpensive computers called microcontrollers. They're usually used to just control stuff. And so that is, that's what we're working on. I usually do C programming. So Python is a higher level friendlier in language, but there's a C layer of code that happens between the Python side and the hardware itself. And that's usually where I'm living. So that's why we call it deep dives is that we're doing kind of more technical work. I love answering questions during the stream. I love going on tangents and trying to answer the questions that people have. So feel free to ask questions. Just say hello to Osmos and ADCC and DCD. And Jeff says that there's no phrasing on the stream at the moment. That's great. Good. OBS is reporting no dropped frames as well. I do have the bit rate set front, it was being set at 4,000, now I haven't set at 3,000. So the quality may not be quite as good, but we should be getting all the bits out in a timely fashion, which will be good. I did actually notice there is a setting on OBS that it can try to dynamically change the bit rate, but I don't know, I'd rather have it be consistent. And it warns that dynamically changing the bit rate could cause you to be further behind in the stream, like the viewers further behind in the streams. Like it's already pretty delayed because we have normal settings on YouTube that cause the auto captions. But yeah, quality looks good here. Thanks ADCC. And thank you all for, thanks for all of your debugging ADCC. They've been doing lots of work on USB and macOS, and they're also working on BLE support for PQW, which is not a small task as they've found out. Got myself actually an herbal tea to drink. Usually I'll just talk about kind of where I've been at, what I've been doing this week, and this week has been a huge, a wash. I have a son, he's almost two, and he has been home sick all but yesterday, and he came home sick from daycare yesterday. So he's got a stomach bug. So I was out with him Tuesday and Wednesday, some of Monday, some today. So I didn't get the schedule, the stream scheduled until just like an hour ago because I was out taking him to the doc and watching him while my partner went to the doc too. So it's been a family week, and luckily Adafruit is really, really helpful and really understanding. They have a little one as well, but they're really understanding when it's just like, I got a sick kid, like I can't do so much. So Jeff has a great question. Jeff asks, what are the different types of memory on common microcontrollers? I hear RAM, which I know, flash, SP RAM, static, PSR, not sure the acronyms or just point me to page maybe for another time. No, this is a perfect question for deep dive. This is a perfect question for deep drive, and I bet there's people in the chat that know even more than I do. So, and I just answered a question on the forums, so Adafruit had support forums and I checked those every, there's a circuit Python support forum on the Adafruit forums that I check every day during the week. Hi, Abadis, welcome as well. Oh, I should say, if you're in the YouTube chat but want to be on the Discord chat, you can go to the URL, adafruit.com is where you can buy stuff to support me and Adafruit, which is really helpful. And there's also circuitpython.org for the project. So, there's two classes of memory in microcontroller land. There's volatile and non-volatile. So basically, does it store the data without power, right? No, I'm happy to talk about it. So, volatile and non-volatile. Volatile memory is what you change a lot when you're running code, so that's your RAM. So, RAM is short for random access memory and it's usually implemented as SRAM, which I think is static RAM and I'm sure the Wakey PD articles are great for this too. But SRAM is usually the type, I think, of RAM that is on the chip itself and by on the chip itself, I mean like the microcontroller's actual die. So, like chips are actually cut out of, like they're created on silicon and then they're sliced up out of a wafer and then they get packaged into this plastic package and there's little bond wires that run to the pads and stuff to connect it to the outside world. So, I think SRAM is the type of RAM that happens inside the chip and then the expressive chips, the ESP chips, they have internal RAM, but they also usually have PSRAM, which the P is, I think, for pseudo. So, it's pseudo-static RAM. So, that is a separate chip of RAM that I think is actually probably like DRAM which is like, it has to be dynamically refreshed but I think the pseudo bit is that there's like a controller in that chip that does the refreshing for you. So, like from the outside world, it just looks like, from the outside world, it just looks like static RAM. So PSRAM is what you usually commonly see with the expressive chips. The nice thing about having a separate chip is that it can be really big, relatively big. So, megabytes of RAM instead of usually kilobytes or up to a megabyte that's on board. The downside of that is that it's slower to access because you don't have as many wires essentially going to it and it may be clocked at lower speeds as well. So, it's big memory, but it's also potentially slower to access. And so, that's kind of your non-volatile memory. So that's, in circuit Python, if you get a memory error as your code is running, that's a lack of RAM, because that's where all your variables and your data that you're working on is stored. The other big bucket is non-volatile memory which we actually have an acronym for NVM, like we have an NVM module, so that's how you can save bits to non-volatile memory. Usually, some microcontrollers will have flash, on board and on the die itself, like SAMD 51, 21, NRM 52, they all have flash inside the chip itself where you can read, you can modify that code or that storage for where, and that's where circuit Python code itself is stored along and maybe the circuit drive will happen in that flash on board as well. There are also spy flash chips that will live outside of the microcontroller and if the microcontroller itself has internal flash, we'll store circuit Python there and then we'll store the circuit drive on the external flash. But then there's this other case where there's no internal flash, there's only usually an internal ROM. So ROM is short for read-only memory and it's literally like data encoded on the chip itself. So unlike flash where you can actually erase it and then rewrite it, ROM is kind of like very, very fixed and that's usually for like your bootloader. So like the bootloader of the RP2040 for example is in ROM, means you can't erase it, which is great. It makes it really hard to overwrite it. So like the bootloader, the bootloader on the Sandy chips is actually in flash and so there's a separate controller that tries to prevent you from erasing it. There is a way to load it back, but that's what SWD is. But like the RP2040 has UF2 in ROM. There's also ROM, an early ROM bootloader on the ESP chips and the IMX as well. So those three families, IMX RT, ESP30, the expressive chips and the RP2040, they all store user code on an external flash chip. And I think this is the trend of where things are going. Tyeth says, I like the worm acronym best, write once, read many for ROM. So external flash chips have a similar advantage to external RAM chips in that they can be separate, like literally separate silicon dyes. And so they can be optimized for that task of storing data either in RAM or flash. But the challenge is that it's slow. So it has the same challenge as RAM and usually what these three families and the other families that do this will do is they'll call it execute in place, which is usually annotated as XIP. And that will map the data storage on the external flash into the memory space of the chip. So when you access a particular address space, it will ask the flash for that specific address and read it back. And then it will also cache. So the next time you get it, it won't go, it won't take as long the next time. So you mitigate the fact that external flash and RAM is slow by putting a cache in front of it. And that is, yeah, there's interesting impacts of like if you are traversing too much code or something, you may end up actually reading that flash a lot. I think, oh, and then the other reason that the external flash thing is really tricky is especially in that case for circuit Python, not only do we store like the circuit Python core code that we usually talk about here, but we also store the circuit drive. So the user data and you can't read from, you can't read from flash or RAM when you are erasing or writing to the flash. So there's a like really tricky case where you have to be very careful at managing like, oh, I wanna run this interrupt. So like I wanna do USB even when I'm doing flash stuff. Like you have to manage that like all the code that you need to do that lives in internal RAM. So what will happen is you'll copy functions and data out of flash where it's essentially like read only because writing is slow. It's essentially read only. So you copy into RAM so that if you have to disable temporarily flash and RAM, you can still do that. McQuinman, I did see your question. I just, I didn't wanna get too off topic quite yet. So I'll get to you in just a second. Let me just like make sure I hit all of the things. Oh, the only other thing is there's also M-RAM and let me go to my screen, which I have not really used, but I think Adafree does talk about it. So M-RAM, I thought we had, oh, F-RAM. I was thinking it was M-RAM. So F-RAM is ferroelectric RAM. So this is, it's as fast as RAM, but it's not volatile as well, which is pretty cool. And so you can use, I thought it was M-RAM, but maybe it's F-RAM. There might be M-RAM as well. You can, yeah, survive space. So we, you can treat it like an external spy flash chip and it can be more resilient for space. So we actually had people that run CircuitPython on like educational satellite and they added M-RAM support because they wanted to be more resilient to the radiation of space, which is pretty neat. So yeah, I, Jeff, if you have any other questions about that, I'm happy to follow up, but that's my brain dump on different types of memory. Oh, you know what, there's another type of memory. The IMX RT, because it's clocked at five or 600 megahertz, also has what they call core, it's either called tightly coupled memory or core-coupled memory. And this is a RAM that can run at the same speed as the processor. When the processor, when the CPU is going that fast, you may actually have onboard RAM that can't go that fast. So in the example of the IMX RT, you can have tightly coupled memory that runs at the processor speed. And then you can also have OC RAM, I forget what the OC stands for, that is clocked at basically a quarter of that speed, but then can be used by DMA and things like that. Yeah, memory hierarchies, fun. Okay, yeah, Wikipedia is I'm sure a good resource for all the different types of RAM and stuff, but that's my brain dump about it. Okay, so McWinman had a separate question, say, hey, did you get USB host to work for the Adafruit RB2040 Feather with USB host? I'd like to be able to send and read USB serial from my 3D printer any cubic cover go. Yes, you should be able, yeah, it should be working. The bugs that I was dealing with last week, there was two of them, one was the, I think they were both specific to the keyboard. So one was being able to, if you power up what the keyboard plugged in, it doesn't enumerate, but you can just unplug it and re-plug it. And then second, if you tried to use the keyboard directly, it wasn't handing off correctly that way. So, oh yeah, and ADCC, I see your question, I'll get to that next. Yeah, so it should work, it should work. It was just those specific keyboard things and TAC who does tiny USB is working on changing the tiny USB core so that both of those things work better. So it's kind of like off my plate in the tax on tax plate right now for that. And ADCC points out that the RB2040 runs internal RAM at the core clock speed. Yeah, so I think for the lower speed things, generally internal RAM will run at the same speed as the core. One thing that's interesting about Flash is that you'll see mention of weight states. So when did the Flash may not actually be able to read at core speed as well. Oh, MC Quinman 16. Okay, MC Quinman 16. I totally, I'm like that, I'm that way too. As my username is tan newt, I was thinking I should start capitalizing it again, TAN, capital N-E-W-T. It would read right with screen readers I think. Next up, ADCC says, when you get to code, could you give a quick rundown of your tools and workflow? If you have specific things, ask them, otherwise I'll just give you an idea. I mean, my workflow is very much on display during this stream. And in fact, you know what, I can use this as a segue too because I've got some review feedback to do. So the text editor that I use is Sublime Text. And I do actually, I was wanting to try the Zed editor, but they haven't quite gotten it compiling in Arch Linux yet. I've tried VS Code, I know it's super popular, but it just bothers me. A lot of pop-ups and things don't come pre-installed Sublime, I generally, like my kind of methodology I think of as like very not IDE heavy, it's a, I have a text editor, I have a serial connection, I do a lot of debug printing. I'll break the debugger out when I really need to, but generally I fall back, especially on Expressif, I do debug, like printf debugging. And I'm really, I'm a huge fan of printf debugging honestly, because it's something you can do in almost every case in every language, only doing a method of have I run up against the bounds of that, where I actually have to do like blinking, which I might actually get to today if we pick up this matrix portal bug. So that's a super quick overview. ADCC, if you have more specific questions, feel free to ask me, but yeah, generally I will open a new git branch, I'll build it, I'll load it, I'll do a debug build. I've been doing a lot of Expressif debugging, so it's, I do a debug build, I get a separate serial connection with all the printf stuff, and then I go from there. If there's other tools you'd like to know, let me know, but generally like people want to know what editor I use, and that's the sublime text. I'm happy with how snappy it is, and I would like to, I would, one thing that makes me want to look at the Zed editor is I would like to experiment with more like AI integration, or like chat GBT sort of, sort of integrations. MCquinman says, so I would have to disconnect my printer's USB port before turning on my feather with USB host. No, you would want to turn your feather on first and then plug in your printer, but we should be able to get that working too. But you're going to have to do like, I don't think we have a, we don't currently have like a Python library for the CDC connection, which is what would be used for serial. We don't have a Python library for that yet. It shouldn't be too difficult, but it's not simple either. We should write a library for it. It's just not, not there yet. Essentially what you'll do is you'll fetch the descriptor, parse the descriptor to find the endpoint numbers, and then you read and write endpoints to send and receive data. There's a great book. If you're doing USB, if you're getting into USB land, I don't know if we carry it still, but does this book, it's called USB complete. Turn on discontinued. Yeah, it's a discontinued product at Adafruit, but if you just go to Amazon, I think it does. Like the book still exists. It's just, we don't carry it anymore. Yeah, it's called USB complete. It's discontinued at Adafruit, but if you want to know, have a good reference for how USB works, this is the book. Well, this is a book I got that's been really, really helpful for understanding that. Okay, so yeah, ADCC, if you have more tool chain questions, ask me. Browser wise, I use Firefox, and I love this tree style tab extension, which you probably see me use as well. Okay, let's look at pull requests. So I have this pull request that Dan did a review on. Like I said, I haven't gotten a lot done this week, so it would be nice for me to get back to Dan on this as well. There's some naming stuff that we're gonna have to do. I called this thing lock, but it's not really lock. So I can rename this. And ADCC says USB in a nutshell is a great reference. Yeah, I always end up there when I Google it or not Google it. So I don't do Google anymore. I use Kagi, which is a search engine you pay for. Shocking, it's like 10 bucks a month. And I haven't had it, I don't think I've had to switch back to another search engine forever, so it's sufficient enough for everything I've been doing. I try to de-Google myself to some extent. Okay, so I think maybe I just need to reply to Dan on this. I'll rename it. I do like that name instead. So let's go here, and I have way too many things open. It's been a minute since I trimmed everything. And I'll go over what this PR is to actually Xtmod VFS FAP. I'm not super happy with how I navigate code. I was saying, I think last week on here, I was like, I want a back button. Like I just want to be able to click a button and go back to where I was, especially as I started to like use this contextual to like jump more. I like feel like I need a back button to go with that. Like I'm hyperlinking more and now I need, I need something, some way to get me back without. Hotkeys are only so good, especially because I don't have any labels on my keys. It does make it a little more challenging to. So I'm just gonna, I'm in, file system lock, raise, I'll just rename all those. Cause I think that makes sense. So this is good because it makes it clearer that file system lock, raise and file system unlock kind of go hand in hand. But we can mark that as result. And because there's confusion here, oh, he's marking it as a stub, but this is actually the same behavior of the other version. Let's just make sure that we've got a good description of what it is. Okay, so the, let me give context on this. So this is a fixing a bug that was filed saying VP tech ops filed an issue four days ago that says, web workflow on CircuitPython 9 file browser is always read only. So it says like, it doesn't matter what code to pie it is. If you just go here after you plugged it in, it's read only like USB is using it. And by the way, the device is not connected USB. So we're like preventing interfacing with the file system, even though you're not on USB, which is annoying. And not what we used to do. So I think, yeah, so I went in and changed some of this already for the SD card stuff, but I didn't kind of finish it. So we used to have this, let me just see if we can show. So we used to have this check that said file system is writable by Python, but this had no bearing or didn't take into account whether USB was connected or not. And so that was kind of what our problem was. Now, I introduced this notion of file system lock and unlock, which needs a better name. Maybe it's, yeah, I don't know. I don't know what a good name is. Naming is so hard. But yeah, so let me describe it. And then maybe that will lead us to a better name. So it's something I've actually, I added with the SD card stuff, but I hadn't switched kind of everything over to it. So when USB, I guess it's already in here. Supervisor shared USB, USB mass storage flash. So I had already added the fact that one of the early things that when you plug your circuit Python device into your host computer, it gets some information about whether it's writable, like the mass storage is writable. So what I had added previously is that there's this check that says like, oh, if there's like two layers, there's the file system and then the block device. So file systems manage the blocks and the mass storage driver of USB is actually at the block level, not at the file system level. This is why we have so many corruption issues and stuff is that it lets the host computer manage the file system. It's also why we're using FAT32 or FATFS because that's a well-supported file system for host computers. It's also why we can't have circuit Python writing the same time as the host computer because they are doing two separate sets of manipulations to the blocks that underlie their version of file systems. So what I had already done is it says if we're not already locked, we grab the block device lock. So the block device locks it prevents circuit Python code and any of the other workflows from writing to the block device because after this point, mass storage is gonna be able to do it until there's like an eject call that can undo it. So this was meant to be like a agnostic, like however you're accessing the file system is what matters not like us. We had some specific USB testing before but the point of this is like when you plug in the USB device, it should grab the block device lock the moment that we say we can write to it and then only when it's ejected can you give that back and let other things write to it. And then all of the other workflows, so the BLE workflow and the web workflow, they operate at the file system level and actually access from circuit Python. They all operate on the like file like transaction level. So they take that block device lock for a shorter period of time. Which may mean that like you write a file but then USB enumerates and you can't access it or things like that might be a little tricky. But so the bug is caused by the fact that we were just saying like if USB comes along and grabs it, then we won't mark it as writable. So instead now we kind of like grab that file system lock as we need it. Which is not the right term for it because it's not like an exclusive lock. What it's actually doing is it's a shared lock on the block device. So, and this is not new and Dan must have just like glossed over it last time. Which is totally fine, that's how I work too. So file system is writable by USB now, like I explicitly say it controls whether USB tries to grab the underlying block device lock or not. And I deleted the implementation of is writable by Python because that's not how it should be done from Python anymore. And then in web workflow, we don't use it. We actually just try to grab the lock briefly to see if it looks like we can't. And then I had to copy it here for the Unix port. And now Dan's saying like this doesn't make sense. Is the fifth edition the latest edition? That's the one I have. It looks like that's the case. Yeah, this is the author's page. Taya says, can I use USB host with ESP32, S2 and S3 currently in CircuitPython? You cannot. No. A common type of support is called OTG. It's short for on the go. And this is a name for a USB peripheral, like a chunk of a chip that can either be device or host, but we generally just use it in device mode. We don't have a way currently to switch between device and host mode. So the S2 and the S3 have native OTG ports, but we always use them for device. The soonest will get host support probably with the ESP chips and everything else is that there is a host feather wing that has a separate chip that does USB host from it. But we don't currently have support for that in CircuitPython. It's something we wanna do and probably soon after nine, but something that's on our radar to do because we have a host feather wing that's really our answer to whatever feather you want to have USB host will be able to have USB host, assuming that it has enough flash and ran to store the code. So yeah, meant with the feather wing. No, not yet. It's something I meant to do honestly and then my mom got sick, but that's kind of like the period that we were talking about doing it and then I just didn't have the cycles. So it's on our radar and we'll add it, like tiny USB already supports it. So yeah, it shouldn't be too hard to add. It's just not been a priority. We're trying to get 9.0 out the door. And then once, and people are still finding bugs in the 9.0 stuff, which is kind of, it's kind of demoralizing a little bit, but it's also good to just get them out of the way. Like that's the purpose of it. So yeah, MC Quinman says, is your mom okay now? Unfortunately not. She passed away before Christmas. Yeah, she had stage four pancreatic cancer, so she wasn't really about to get, there was no hope of her getting better. But we had, we spent a lot of time together when we had it, so yeah, it's tough. I was hoping we'd stop finding bugs in 9.0, but we're not, we'll get to that point. It's weird when we do, you know, our work on 9.0 will basically stop when we have a release candidate and we'll be able to do some other stuff. So our work will basically stop a little bit before it as actually released as stable because we like to kind of leave it out there to see if there's anything critical that comes up. And another tangent is, I just wanted to mention to folks there's two conferences in Seattle here that I plan on attending if anybody's close and is interested. They're both in April. At the start of April is PyCascades and it's over at the University of Washington and I don't think they've announced the schedule yet, but I'm giving a talk. On CircuitPython there, it's just, it's at the University of Washington so it's quite close. So, do they have schedule? Hey, they do, neat. Yeah, so I think I'm on Sunday. Yeah, cutting the USB cord wirelessly programming CircuitPython. So that's at the start of April and then there's also a Zephyr conference, no. 2024 that I'm gonna be going as well. Sorry for your loss, hope you get better. Thank you. I had a grandpa die in December. I'm sorry, that's awful too. It's sad. I hope you got to spend time with them. So yeah, two things in Seattle and April that of course, if anybody's in Seattle just email me or ping me on Discord. I'm happy to meet up with folks too. Okay, let's get back to this. I mean, I'm happy to do tangents, but. Abadda says you're inviting us to the conference. Does that mean I can crash on your sofa? No, sorry. My house does not have the room right now. Not only was I home most of the week with a sick kid, but we are in the middle of having our roof replaced slash fixed. So it's been lots of noise, like construction noise during the day, home with him and rain and wind and tarps and all that stuff. Timon says I'll be going to Teardown in Portland this year, not quite Seattle, but close. If you're in Seattle, let me know. I thought about going to Teardown, but I have something that weekend, I think. I don't know. I'm trying to figure out if I'm gonna be able, what else I'm gonna do this year. I might try to get to a Supercon. Well, no, Supercon's in November. I don't think that's gonna work. I don't know, we'll see. It's a ways away. The nice thing about these two conferences is that they're really close. I don't really have to travel. I can come home at night. And Mark says, wait, ask if people provide free babysitting first, maybe worth it. It's true, babysitting is really nice. Daycare is really nice. That's the other thing about the Zephyr Summit is that it's during the week. Cause it's a bunch of industry folks. Pie Cascades is over the weekend, but the Zephyr stuff is right in the middle of the week. So I had to get the okay from ate a fruit. And they're paying for me to go too. So I'm excited to like, like I was on the Zephyr technical steering committee for like a year, like ate a fruit. You pay to get on it basically. And ate a fruit and paid to be a member. So I was, I was going to those meetings for about a year. And then I had a kid and stopped going. Okay, so let's document. Actually, you know what? I think it's documented here, file system. Here we go. I did, I did explain it. File system calls grab a shared block to block to allow circuit pythons FATFS code to edit the blocks. Block to have class grabs a lock to mutate blocks directly excluding any file system locks. So let's just say shared, not shared supervisor file system. It's covered in the, sorry, I can't talk in type. Well, I can't talk or do English there. I said, this is copied from the shared implementation. The file system locking is for a shared block that lock. I'm happy to rename it if you can think of something better. And then I agreed with the other ones. So let's just do a quick compile. That's my circuit by that eight one. Not to get this going again. I just did a restart. Get fetch ate a fruit. We'd love to go to the Zephyr phone, but not enough to fly to a different continent. Yeah, I wouldn't leave the city. I'm only doing it because it's literally like 20 minute drive from my house during the week. But yeah, I'm excited to meet some of those folks. I feel like had meetings with them. They're very industry. What's that shell you're using? Good question. I use fish, fish shell. And I have the oh my fish or Bob the fish theme. The fish, oh my fish, Bob the fish, power line. It's pretty much this stock. Yeah, happy with that. I do, I do get that set up. And a lot of like the rust folks that like are replacing all these like really low level Unix tools. Like they do an awesome job. I tend to inherit a lot of the new rust tooling. Even though I don't always use it. Okay, so I did rename it. So I'll get fetch Aida fruit. I'll make a new, actually no, I don't want to rename it. Oh, I'm in the right branch. I did all this work and I'm in the right branch. Good. Phoenix, fixed unit build. Simone says, but sounds like Zephyr is also not much on your mind these days. My opinion of Zephyr really hasn't changed. My big criticism has been that it's a giant project that is very, it's designed for embedded Linux developers, right? Like a lot of the cake and fag and device tree and CMake and like all the stuff that's inherited from embedded Linux. And it's just like not a world I've gone into and it feels very complex to me. The thing I wish is that if the Bluetooth stack was more separate because that's the thing that I'm interested in, I'm not particularly interested in all of the board support stuff. And I tend to not like the monolithic approach. Like I really like the approach that tiny USB has taken. Obviously I've had influence over that as well, but like it's kind of like separate, it's own separate thing. It's the right like unit to me. So I'm always taking a look at Zephyr just as like seeing what they're doing and what boards there are. And often on like MicroPython's put effort into having a MicroPython Zephyr report. So it's interesting to talk with them about how that's been going and then what they think of it and the ideal would be that you could just get Zephyr, you know, get all of the boards supported by Zephyr, like you could support those through MicroPython and CircuitPython, but yeah, I just, the main hang up for me is just the complexity of all the tooling. So yeah, I'd prefer if it wasn't a giant monolithic project but that's kind of like their goal. Their goal is to be Linux-like without being Linux. Like they want to support everything in one thing and it's just complicated. It's really complicated. They make a lot of sense for more complex firmware. Yeah, maybe. I mean, I should be fair and say that like CircuitPython is not simple either. And part of the hang up is integrating two not simple things. You get multiplicative complexity. Like you go to a Zephyr example and they're like, here's how to blink in LED. And you're like, well, I've got this like giant code base already and how do I transition to it and how do I update it and what are the benefits? And I don't want to learn K-Kid thing. I don't want to learn Wests and like, yeah. A lot of their focus has been like people that are starting from nothing. When it's like I have lots of stuff that I'm already starting with. And I've never, a lot of vendor SDKs I think Zephyr for a while applied to this as well is like, they make a lot of decisions about, they make a lot of decisions at compile time that we don't necessarily make. Like we run into vendor SDK issues all the time where it's like, oh, you never assumed that we would like de-init this object because we no longer want it or like, like we have a bug because like moving to IDF-5 broke the ULP processor because the ULP can be in two modes and they made it a K-config object or a K-config option. So it's compile time decision between whether using the old FSM or risk five. And it's just like, no, that's a runtime decision for us. So we're always finding this battle that we're very dynamic, a lot more dynamic than what they're designed for usually. It's just never, yeah, just never been appealing enough. So okay, so we're gonna stage this. This is debugging stuff that I was putting in for this other bug. Let's stage this. Did it used to be called? Verify FSRetafold. Okay, so it gave me, so this is pre-commit that runs. And I needed to source it. This error here is due to like a failure of checking the translations, which just meant that my virtual environment for Python didn't, well, my environment for Python didn't have the library I needed. What in reality, like I just needed to activate it. So I'll push that. Okay, Tyus says, how does that play out? Did that get traction in the IDF? Not sure exactly what you mean. Being more dynamic. They're doing a better job of it on the whole, but in this ULP case, they went backwards. Like IDF five introduced like the IDF tracking which resources were in use and tracking claiming and stuff, which is something that we were having to do ourselves. So they've done a much better job with that, but they don't. Yeah, with the ULP stuff, they didn't. It's, the ULP is so, such a corner of it, we're not gonna block nine, but no, I'm getting that out of back. Tyus says, I think you practically don't need to know much at all about cake and fig in West, but it can feel, definitely feel intimidating. The microbiome part is definitely very interesting to me. I've been meaning to dive deeper into that. It's really relevant to some things I work on. So the, I cake and fig blew Dan's mind and like generally everybody here, like this last week or last, or last week, they were looking at SDK and figs and they like, I hadn't like consciously realized it, but when you disable an option in SDK and config, it does pound sign such and such is not defined and it blew Dan's mind that that actually was like red. It wasn't just a comment. It actually meant that like that was the like unset state. It wasn't, you know, config blah, blah, blah equals N. It was like pounds. This is not defined in SDK and figs, just blew minds. So yeah, I have, I guess I did enough cake and fig recently that I don't think it's as bad as I did before, but I also found some more warts that I really don't like. Like I redid how we manage our cake and fig in circuit Python for 5.1. Cause cake and fig is also used by this press of IDF along with Zephyr. And I was doing some analysis about dependencies and it didn't, the cake and fig live wasn't taking into account if another cake and fig forces a value forces a value of another setting. It's just like, uh, like peripheral manager got everyone a good idea, but break and change. Yeah, for they're doing a world in circuit Python we were doing it ourselves. So it wasn't an issue so far. But yeah, I'm interested, I'm interested more to be part of this effort community cause it's a lot of industry folks. Like it's, it's a bit of job security for me. And also like getting to know some of the, the microcontroller vendors and those folks. It's more networking than actually like moving circuit Python to Zephyr. Now I do think, I do think there is, there's always kind of been in our back of our minds that we'll switch to a real time operating system under the hood. And we're kind of taking steps there. So like with 9.0, we now have a dynamic heat that lives the lifetime of like since the devices started up. So we're like getting there. And it would be really nice to, especially like the RP2040 has two cores, like being able to use a RTOS to manage like what is running on each core would be really nice. But like, we don't need all of the device driver stuff. Like we're doing that all ourselves and we're doing it better than the SDKs usually do. I mean, my criticism, I like the Zephyr community too. My criticism is that it's a bunch of industry folks. And there's like, especially on the TSC, like people will join the TSC all the time just because they paid money. Like it's a bit of, it's quite a bit of pay to play sort of environment. And I briefly tried to push to like, they had some rule where you could add one community member to the TSC every quarter. And like two people applied for it and they like had huge debates about who should get it. And it's like, yeah, but you added like 10 industry folks in that quarter because they paid for it. But then they're like worried that they could dilute the value of paying for TSC access because if you add too many community folks, it's just like it's pay to play in terms of TSC stuff. At least when I was there. Anyway, that's hot takes Zephyr hot takes. Okay, so I think I've got back to Dan on this. I did that change she suggested. I replied to his concern. He probably won't get back to me until next week. And that's just fine. It is three o'clock, so we've got about an hour. Do other, any topics folks want me to go towards? Looks like we dropped a few frames, but not nearly as many as we were last week. Otherwise what we could do is, well, I'm a little scared to work on the thing that I was working on yesterday. Ooh, we could do, we could try to do this. No problem, derailing is fine. A lot of stuff gets also done and get have issues. Yeah, it's a huge project. Okay, so where are we at in terms of issues in the milestone? We have 11 open. I started to look at this timeout error one, but Jeff was just in that code, and I think he caused it. So I was just gonna let him do it. He was like low activity this week, but next week he should be back. This is the bug that Dan was looking at this today, and I looked yesterday, and that's the one I was thinking about trying to fix on stream, work on what I did yesterday. The web workflow on CPD file browser is always rude only is what I already fixed. So this icon here shows that there's already a pull request that fixes it. Can't access SD card over web workflow in beta two is a question I had for Melissa. I don't think she got back to me. Hopefully next week she will. So I'm kind of like waiting for her on that. Same with this hard crash when writing to Flash with low memory. This person gave a really good reproducing script, but I ran it on a, I didn't have the same exact board they did because it was a seed shall. So I ran it with the same chip on Feather nrf52840 express and it worked just fine. So I asked them about that. Hopefully just closing that up. Hi, Hams Labs. Welcome, welcome. This memory error when sending get request after using HTTP server is just like quite the corner case that I really wanna get into at least not right now. These two unplug, replug USB host keyboard and the basic test not working. These two are ones that I'm kind of waiting on tack. So they're assigned to me and tack. Hardfault on serial disconnect from Macro Pad RP2040 is what ADCC and someone else were looking at. I don't know what the state of that is. Hardfault memory access or instruction error found intermittently on RP2040 can Feather bus is tricky. And anytime I see intermittently I'm just like, oh, I don't wanna debug it. Like I wanna give you, ideally it would be a script. Good question. A script. Ideally it would be a script that reliably reproduced it. And then WebWorkflow deletes chunks of code to pie and save is kind of like on hold because Liz was testing and found this other watchdog timer error. So we kind of wanna fix that and then see if she can reproduce this. MC equipment says, can you make that USB host CDC library on screen? I could, I'm not sure I have a, I guess I could just use a circuit Python device, but that's a little far from my priorities right now. Maybe some other folks in the chat are interested in helping you on that. But right now it's, yeah, it's a little far from my priorities. It's not really a USB or it's not a 9.0 bug. The only other thing we'd love you for that, for the CDC host library, that's what you're asking for, Ty, the other thing that is also not a priority, but something that I really kind of wanna do is, I've done it before, you can see this is a branch called Clang 16. So we currently use ARM GCC to compile, except on the USB, but generally we use ARM GCC. And I'd really like to switch us to Clang. So Clang is part of the LLVM project. It's more liberally licensed. It's a more modern code base, and it has better tooling or tools built around it. So I'd like to switch at least some of our ports over to using Clang. And I think this is a high fed A2. I think this is a, I gotta fix all the 9.0 bugs before I get to this. But I've been poking around in the Clang source, or the LLVM source so that I could add a way to have the compiler mark all of the code and memory needed for code so that it could run when external flash is unavailable. So I was talking about execute in place and how we have to disable that when we write flash. Well, managing what code you expect to run when that flash is disabled is really tricky and might actually be the cause of this bug, although it shouldn't be. So yeah, I wanna start moving some of our ports to Clang so that I can also play around with modifying the compiler to do, but to help me out to manage stuff better. That A2 says I'm compiling GCC for a mirror risk five port and it has way too many old codes. I do like Clang more in general. ADCC says I'm all for Clang. I can make some sense of the source while GCC is very tough to follow. So I actually haven't looked at the GCC source, GCC source, but I've heard from people that it's tough to follow. I've had to find my way through the LLVM source because it's pretty big, but I'm getting there. I'm working on it. And yeah, the tooling's quite good and yeah. Okay, why don't I, let's do this, let's see if I can't get a little more information about this bug. How soon can you add slash make that library? I'll tell you when people ask me any timing or like how soon I can do something it makes me wanna do it less. Let me be blunt with you. I get a lot of people asking when something is gonna be done and that makes me wanna do it less. And I'll tell you right now I'm not planning on doing it anytime soon. Sorry. I would encourage you to just use a Raspberry Pi and use Pi Serial. And in fact, maybe when I was thinking about this that's what I was doing. Like that's the API you should make. Like there's a Python library called Pi Serial. So it won't work in CircuitPython but yeah, you can just use that. And once we add CDC, if we ever add CDC support that's what we should do is we should just make a, CircuitPython version of Pi Serial. But yeah, no, not a good way to get me to do something. Maybe it's a good exercise to show how to do USB host but I wanna do some more fun things and that doesn't sound very fun to me. Like they build Clang stuff sounds more fun to me than that. But I like, I'm trying to push through all this 9.0 stuff so we can get that stable first. Okay, so what extensions do I have? Let's see, I've got, let's see this is my account, rescue time. So rescue time is like a time tracking site so I can like see how, see what pages I'm on and see what pages I'm on and just see how much I worked a week as a self check. Ublock origin turned off, clear URLs. This like strips tracking stuff, tree style tabs, privacy badger, HTTPS everywhere that's disabled. I should just make that turn off. Vimium is very cool but I only use it on the forum but it's really helpful on the forum. So Vimium, you can hit F and then it highlights, it annotates all of the links with a particular code. Oh, shift H to go back. So I can hit D for down. So this is what I do when I'm checking the forums. Like I mentioned, I check it every day. So I'll do F and then I can hit AI and then it basically clicks it. So I don't have to use my mouse. Trying to ship a product based on CircuitPython and 9.0 isn't going to be ready in my time frame. Yeah, this is very in line with the like time frame stuff. MCquinman, you'll have a better chance of getting somebody else to do it. I'm not the only person that can do it, which is the other part that bothers me. And people think I'm the only person that can do something or answer their question. This is a time for people to ask me questions. I can't, sorry, I got in the mode RS for refresh. But yeah, Vimium's cool. This is just the plug and stuff at block plus, which I think I could remove. It just bothers me more. And then graze is a mastodon extension so that if I go to a mastodon server that is not my own, it kind of makes it work seamlessly anyway. So I bet you can't do it reverse psychology doesn't work on you either. Not if I know I can do it. Like I know I could write a USB host CDC driver, I just don't feel like it. Sometimes, if you're Lady Aida and you ask me that, then she's also paying the bills so she gets to decide. Fettie too says, I got on live shows the response from Lady Aida, well, you should do it. And I thought it was a joke. They learned stories from some of the folks who work in Aida for it and learned that how they started is because they took it as a challenge and did it. Oh yeah, that's definitely a little more. She's taught herself a lot and she can do a lot of stuff. Yep, and people are more than willing to help you get started on it. Yeah, yeah, Mark makes a good point. Like the Discord server is a great way for, like instead of asking for someone to do something for you, it's better to ask like, how can I get started? And that's a boundary that I've tried to draw myself of like, I don't really, I don't think I'm very receptive to doing stuff that people ask me to do, but I'm more than willing to help them do it themselves. I've always tried to say like, even if we don't prioritize something you want in Circuit Python, we'll always make sure that if you make a pull request, we'll get back to you on it. Or if you say like, I want to make sure I'm going the right direction, like that's the stuff I prioritize, like, hey, can you do this for me? All right, so this internal watchdog timer expired one. We have 45 minutes. Let's just take a peek. FedEy2 says, I have a code idea, but I'm not sure it will break something like storage. I'm using from Supervisor the reload on error true, but it still fails when Wi-Fi goes down on the ESP32 boards. Is it a bad idea to create a restart on error true that does microcontroller.reset? It's not necessarily a bad idea. I was like, actually this example code for this bug, you can see like Liz is basically doing it herself. There's like this big try accept and then there's actually like a reset in the exception case. So you can kind of do it yourself already. The restart on error thing would just be a convenient weighted not have to catch and restart yourself. I wouldn't worry about storage because I know that this like microcontroller.reset will flush the storage first. Like it'll make sure that all the writes are complete. No, I don't think it's like a terrible idea. I don't think it's a terrible idea. I don't necessarily like not necessarily like think that that function at the right way to go about it, but Tyus says I wouldn't risk garbage collection before reset. Why wouldn't, you probably, well, probably doesn't matter because the microcontroller.reset should reset the whole chip, but yeah, reset. But garbage collection is really nice because it will de-init all the stuff when you do it. Okay, I kind of want to just like, not necessarily fix this bug because I know Dan was looking at it as well, but I just want to poke it a little bit more to see. I had a couple ideas. I had a couple ideas when I was thinking about it last night. So I do a lot of like passive thinking about things. So like me spending a little bit of time right now means I can just like kind of like think about it in the background some more throughout the weekend, which maybe I shouldn't. So let's initialize the IDF environment and make board matrix portal. And then so this is the usually the setup I have is on the right is the serial link. Do you have plugged in still? And then I unplugged the matrix portal and you can't see my override yet. So I've got some debug prints out here already. I got the steam out of the, whoa. Yeah, in the weeds, yep. So we have a circuit python kind of community meeting on Mondays usually where we have, we discuss topics like this. What Raspberry Pi board should I use to make my Pi serial the 3D printer code working? Any of the Raspberry Pi single board computers should work. So not the Pico. But yeah, that's probably what I would do. Any of them that you'd be able to plug in and do. Yeah, Pi serial. Pi serial can do what you want. Okay, so I'm letting this run and I'm hoping for it to crash. Although I think the crash might be related to you. Yeah, Fed AT says, or a Milk 5 Duo or a Mango Pi, both risk five, 64 and dirty cheap. Yeah, any single board computer should work. But one thing that Raspberry Pi has been really good about is that they actually support the software side. I think any other single board computers you risk, like support, support may not be as good. The software support may not be as good. So I'm kind of surprised it hasn't crashed yet. Like it should go into safe mode. This disconnect is okay because it's doing that micro controller reset I was pointing to. But I think yesterday I was getting it going into safe mode. Maybe my timing is right. There we go. So this is like cheap but effective. I mean, it depends on where your bar for cheap is, but any of the Raspberry Pi's is what I would suggest. I don't know which ones are available. I don't think the RAM, the amount of RAM won't matter. And then you could just run like Octopi on it. Like Octopi is really nice. If you wanna manage a 3D printer remotely, that's what it's called, or OctoPrint. Okay, so what I'm doing is I'm scrolling back to figure out, so I had a theory that I don't think is right, but the prints are based on this theory that we were getting ourselves in a situation where we were, we were getting ourselves in a situation where we're trying to write so much out of USB that, but then we weren't allowing, so on the expressive, the tiny USB task is a separate free RTOS task. And I thought maybe we were filling up the buffer and not giving it time to actually time to like run the tiny USB stuff to send things out. So that's what the prints are for. Now, I don't think that's what the issue was. The reset happened right here. So this ESP ROM, so we're talking about different types of memory. So this is the boot stuff that is happening right at the start, and it's ROM code. And then it gets into the second stage boot loader. So these messages are coming from ROM, and then second stage boot loader is coming from the external spy flash chip. And you can see that they like tweak the settings, the settings that it runs at and stuff. And then it sets up the external PS RAM here too. But the interesting bit here is, or the question is, okay, so we're doing stuff here. I was thinking that write to and then write done. I thought we'd see a write to, but not a write done. And that we would be hanging where I thought we were, but we're not. So the question is like, the reset is happening. It's TG, so timer group one, watchdog timer. So this is what the ESP IDF is set up to check that interrupts are enabled. And if interrupts are disabled for too long, then this will happen. So something is getting hung up. And in fact, I looked up this address and it was like part of a crash or something, unfortunately. So the question is, I also, it's an RGB matrix, so it's running protomatter. So the question is, is where in the protomatter code is it getting stuck or crashing? And how can we stop it from doing that? And I think if we added prints to the protomatter stuff, we'd end up being too aggressive with it. But one thing I wanted to check was that it was happening on the core that I expected. So I'm gonna delete these serial write downs, which I think I already did. So supervisor shared serial, oh yeah, a common amount. So a common amount. So basically what I'm gonna try to do is I'm gonna try to add a log statement so that I see the start statement, but not the end statement to give me an idea of where the bug is happening. And if I can't do it with logging, it actually crossed my mind that I would do it with like setting a pin high with a logic analyzer, which is why I was not sure I wanted to do it on stream because I'm a little scared of doing it, trying to do CLA logic analyzer stuff while trying to have like all these video sources coming in. But let's see how far we can get with just printing and then maybe we'll, we have at least one LED I think that we can flash. Maybe not. We have a Neopixel, which we could do, but that's a little heavy weight. Sometimes what I'll do is I'll literally just set an LED on and off. Again, to just figure out like where in the code that the crash is happening. Like I could try to get JTAG going, but the matrix is on some of the JTAG pins, which is annoying. But I wanted to do an assert. I wanted to make sure that it was happening on the core that it, oh, I also wanted to know. I was wondering if the RGB matrix was trying to update itself too early before it was all set up correctly. That was the other thing I was thinking about. So let's add a collect pointers. So that was another thing is that I thought maybe we're not, maybe some of the memory is getting kind of like repurposed out from under. I'm curious. I also wondered if it was on the right. Have any of you peeps worked with diet pie? Defined but not used. Oh my goodness. Yeah, let me close the tabs. There we go. Let's start from scratch in terms of what? The rain went away and the sun's out. Which is good because I'm a lot calmer, not too long. I don't think I have my running stuff. That's okay. I'm just waiting for the compiler. I was amazed. I've been doing so much, I've been doing so much ESP stuff that like I was testing a couple other builds like NRF and stuff and I was like, wow, the compilation is so much faster on those. For some reason the ESP builds are quite slow. Oh well. So it's loading. Any other questions? Yeah, I think I would like to say a lot of people prioritize cost over support. We get this all the time. We get people coming to the Adafruit support forums with other people's hardware and then they want us to help them use it and it's like, no, no, that's not the way this works. Like you gotta, part of the reason to buy Adafruit stuff even if it's a little more expensive is the support. So I would make the same argument about Raspberry Pis versus not Raspberry Pis. It's like, you're gonna get better support from Raspberry Pi in my experience. But if you're willing to do it all yourself, that's a matter. I went from long running ESP S3 projects to now NR53 and the compile time difference between IDF and Zephyrus absolutely massive. Yeah, I believe it. Interesting, it looked like we got another internal watchdog like much quicker that time too. Let's see, EP serial, can't find bitmap. Okay, so we did construct the RGB matrix. So that had happened. Yeah, and Pi prices are still bottom of the variable. Okay, so it's not like we're like, it's happening right away. Is it possible it's in DNit? Are we DNitting it? I don't think so. Let's just add that. Uh, this could be. So reconstruct is happening. So it's gonna be exiting, but it's not done exiting yet. Sorry, I'm trying to just get my bearings on where we are in terms of what's happening with Protomatter. So I did comment out like the, I commented out the interrupt handler. So the way that the Protomatter works is that you set a timer, it interrupts you every so often and you basically update the display pretty quickly when you do that. Oh yeah, that A2 says I'm currently testing some boards called Daisy from ElectroSmith. They're M7, so they should port to circuit by them. And if what I'm doing works, I'll try to revert using Adafruit hardware. Yeah, the Daisy looks cool. I'd love to integrate their code too, but since I always gotten a lot of love and it's pretty neat. But yeah, the Daisy should be doable, I think. For Raspberry Pi, do we get support from the profit company, the foundation or the fact that there's a big community? All of the above? The profit company does a lot of software work, like they have their own Linux kernel and stuff, that they actually maintain. The foundation has a lot of tutorials and there's a huge, a lot of tutorials from the community and help our folks. Why is it called Protomatter? Look at the repo. It's a Star Trek reference, I think. I did not create the repo, but I think he'll be named it after a Star Trek reference. Okay, so we added more prints to figure out what we're doing with the RGB matrix. And let's just run it again. I'm just doing like the boot and the reset. Oh, and I did it while it was interrupted flashing. Uh-oh. Timon says, yeah, they employ a ton of people to work on software and a load of contractors on top of that. Raspberry Pi Foundation documentation is top notch too. Yep, I agree. So I would agree to not cheap out. Because you'll be up a creek when you have to ask somebody a question. They do have scale on their side too. Like they're very aggressive in pricing. Like the Raspberry Pi people are very aggressive for pricing. There was a refresh call. There's a second refresh call. Third refresh call. So this is before the normal restart that it's doing. Guitar ML. Something that uses AI to generate some models to emulate amplifiers and pedals. Like to use port the guitar ML to work on circuit Python. Ah, if you want to add pedals, you need to recompile one and you don't want it to work like that. Nice. That'd be neat. Okay, so here's the crash. See if there's any suspicious prints before it. Ah, so here it is right after the construct is done. My theory was that it was like the timer. We're setting up the timer before all of our data is ready. So what was happening is that we're getting the Protomatter update code running before like the buffers and the pointers and stuff are all correct. But the other ones I haven't seen like that. So I just want to run it again. I kind of actually thought that the other stuff wouldn't be done. But let's just see what, while we wait for that. Where'd you make major constructs? Allocate, buffer, frame buffer, Protomatter, init, timer, enable. But this timer enabled doesn't do anything. It says Protomatter does this. Allocate, new timer, PM begin. Yeah, see this seems a little fishy to me. Oh, my kitty just crashed. My QT crashes and my whole kitty goes away and my editor goes away. But it looks like the stream is okay, which is good. So I wonder, I wonder like it's suspect to me that this convert five, six, five and swap buffer maybe is happening after begin, right? Like it seems to me like it's not actually ready to go. I would expect to do these two things first and then start it, even though that's how this code is written and I don't think I changed it. But like if there's a delay between like this and that, maybe it's invalid, double buffer. It allocates a buffer internally, I think, buffer maybe. Or maybe the memory's being allocated in a little place. Yeah, I don't feel like I have a lot of steam for this, but we don't have that much time. MPSP. There's like dual implementations of this, which I'm not a huge fan of. This timer callback is the thing that's called. I might put the blink in here, but I'm not about to put. This is what I want, timer start, which I think is actually called from timer start, timer stop, enable timer. I'm curious when this first timer start happens. Let's see if that works. It may not work. There could be like crashes and stuff that you get. General rank, thanks ADCC, have a good one. Hams Labs, we had some PyPico questions that after we knew the answer, we could ask the correct question. For example, how to pull an RQ status bit from PIO and the C application? Hard to find the answer right away. Yeah, the PyPico docs have been great. I actually had access to it, you know, a little early before the RP2040 was announced and they were still quite good. Like, I was like, we should do this because, oh, and I see that Beata's been saying a bunch of stuff that I've been missing. Like, the PyPico docs before they were released were better than like the ESP docs at the time. So, I think many of the people who use Cake and Fig also do not want to learn Cake and Fig. Yeah. Stereo, audio, codec, feather wing, thinking about an XLR option. Talk to Todd Butt, he may have done it already. Oh, and I didn't put it in boot mode. Do, do, do, do, do, do, do, do, do, do. This is a tough one. This is like, yeah. I mean, Dan may even figure it out before me. We shall see. I also want to, like, I think one of the next steps is like doing a logic analyzer. Like, what's probably happening is that there's some piece of memory or some pointer that's not up to date yet, but it's still trying to use it. And so it's like trying to re or access incorrect memory. So if you can like do a check or an assert earlier, you can crash better than like, it's really like crashing poorly right now. Yeah. See, I think this is called interesting construct one. It's already called timer start. Let's just look at those batteries. The other thing that crossed my mind is maybe the stack is getting too deep. So this is a tool for ESP that just decodes these factories. How many issues left before 9.0? There's 11, I think, right now. But I went earlier in the stream, and hi, David, earlier in the stream, I went through them and a lot of them are kind of waiting, waiting on somebody else. Yeah, so this is what happens when you put a log statement in a thing. I really just want the first one. It's probably in begin. This is a lot of Phil B's code. Keep the matrix buffers. Tried to figure out all the data that was using buffer. Resume, here we go. But like what state is not right? It's like, uh, not easy to figure out. You know, I might, since that is a header file this might just build. I suspect that it's kind of defined into there. David says, sorry I'm late. Tonight I had to watch Dune 1 again to be ready for Dune 2. Oh, nice. Pedal is open hardware. Didn't realize it was out today. I might need to change the weekend plans since Keith we're up to date. Now, what state is not up to date yet? I don't know. But what I could do is like, I'm not going to do it today. But if I get a logic analyzer on it, the back trace was still unhappy, even though I shouldn't be in the... Oh, you know, I didn't remove it, did I? Share to interrupt ISR. Oh, I didn't save it. I removed it, but I didn't save it. That's awesome. Have you seen Axloti or Axo? They look cool, but neither are our shipping products. I'm close to porting this software to an SD Discovery board. Discovery boards are great. They're well within my impulse buy range. If you check Digikey, you're making me want to check Digikey to see if there's any cool new dev kits once in a while when I feel like buying stuff. Ooh, I love the sites that have the disable all button. Dev kit. MCU. I'm not actually looking for the term dev kit. I'm looking for in-stock new products that are not on the marketplace. I want to sort by price. Sam E54 MC Dim. MCX A5513. Hey, they have a thousand micro bits. Are these? Okay, do. That doesn't sound like an actual micro bit. And it doesn't seem like it's V2 either. PSock, AVR, PIC. These are this STM32U5s, which I've already seen. Microchip Sam C21. What is a C21? RA2A2 Renaissance. Coral Dev Boards. I have one of these. Oh, it is from OKDew as well. I have one of these. It uses a different type of flash. We didn't talk about different types of flash. This is all NOR flash. Well, this one has NAND flash, which we don't know how to support yet. And then it gets really expensive. Quadcore Vision AI MPU for $1,100. No, thanks. That's above my impulse buy range. I haven't looked at the FPGA landscape. It usually hits empty. One. There's one new FPGA board. It is a Rene Sauce Green Pack for $32. It's not too bad. Or the other one is to check is the RF. These is usually like all your expressive boards. Maybe I should include ones that are not in stock. DSP, ESP, NRF 52840, 5340. No 54s yet. Only the Sam C21. Looks like they have no photo or anything. Does Mauser have a photo? No. Microchip Direct. It's at pick 32. Oh, it's not even the right part number. Oh, they have a picture too. Contact us if you want to know what it is. What is a Sam C21? We have a Sam D21, but what is a Sam C21? Oh, it's the same? Oh, it's 5 volt with KN? 64 megahertz. When was this released? M0, 32K SRAM. That's the data sheet. It's probably not that new. 2023. Dropping compatible with the Sam D20 and the 21. See the note because it's probably not always true. It's the same amount of RAM, so it's not that interesting. Don't talk impulse buys, especially the key. Functional safety stuff. I don't get into those details. The other thing we can look at for timing is the revisions. Oh, 2015, wow. This chip's been around a while. Okay, not interesting. Okay, we downloaded. Let's do one more. Yeah, that's my guess. That'd be one of the early times that it does. Okay, so I just saw it flash. 5 volt could be interesting, especially if we're not just tolerant. That's true. Okay, so it crashed again. It's nice when it crashes fast. In fact, it's crashing faster that we removed some of those serial prints. Both CPUs got reset by the watchdog. Timer start. Because it did flicker. It did flicker. I wonder if it's... Hmm. I wonder if it's the second time. Kind of like it starts a timer, it spits some stuff out, and then it tries to update the buffer, but it's like the swap buffer hasn't happened yet. What does swap buffer do? I feel like I'm going to pull this thread and then I'm going to call it. Swap buffers equals zero. Previous plane, plane, frame count. Previous frame count, and data. Screen data. What does swap buffers do? Isn't that what it was called? We begin, we convert, and then swap buffer. Swap buffer, maybe. Okay, so this just sets a flag. If it's double buffering, convert 565. We're just calling the regular one. Let's see, this is getting a buffer and a width. And that buffer, that's the first time that we pass it to them. So, source, width. Bites per element. Bite word long. So this source, am I missing? So destination is screen data. Double buffer. Long output is untested and row tiling may essentially especially present issues. Okay, let's not look at that. I don't know. We could figure out which one we're being called. Word output is untested. Okay, let's look at this byte one. That must be the one that we're actually using. So, save internal canvas representation. Source. Okay, so source. Initial bit shift. Auto tile at the top because data is issued in that order. I don't know why it's not highlighting it. Source tile, UL. Upper source, lower source. Pixel and upper half and tile. So it looks like it updates. What does refresh do? So I think my theory is wrong. Refresh is doing a convert again and then swap, maybe. So the output's only done when this convert is done. I'm surprised, I'm still surprised that convert is being called before. Is there any other state that is being set by this convert? Bit mass clock that number of planes. It looks like it's just setting all the source stuff. I don't see anything suspicious there. My theory is that there's something invalid when it's first running or the second time it's running. Alright, I don't know. I don't know what swap buffers be. Probably not. I feel like there's something that's just, sometimes it's uninitialized. I wonder if in here when we allocate the timer, no. So when we allocate the timer for Proto Buffer, we're allowing it to be shared. I wonder if it works if it's not shared. Interrupt shared false. Let's just see if that fixes it. Because maybe if it's shared it runs on the other core or something like that. Or the stack depth is just a little bit more or... Okay, last thing and then we'll call it a day. Thank you all for hanging out with me for these two hours. Glad I was able to make it even though we've been doing all sorts of stuff. Sick kid and roofing stuff. This has been a deep dive with Scott. I'm Scott. I go by Tandu online. I'm the lead for Circuit Python. If you want to join the Discord, you can go to avafru.it.discord. We'd love to have you there. If you want to support me in Adafruit, please feel free to purchase stuff from Adafruit.com. I'm going to let this run and see if it crashes for me. Maybe that's what it is. It could be a concurrency issue between the two, I don't know. I was thinking about which core it's on. If you find more bugs than nine, let me know. We're happy to fix them. Otherwise, we will get it out soon. Hopefully, I'll have all week next week to really hammer on them. So far, it looks like it's working a little better. That one's the old one. We've done two successfully so far. I'll let it run a little while longer too. Adafruit, awesome. Have a great weekend, everybody. Hopefully, I'll be here next week. I think the plan is to be around. That didn't print as much. You think it's going to fail? Yeah, it did. That didn't solve our problem. Quick peek. Of course, we're dropping frames a little bit. Refresh, refresh, certified on serial. We'll have to come up with a new way of figuring out where we are when we get hung up. I think usually what's happening is something crashes so it stalls out and then the watchdog comes along to say, hey, something bad happened and it's so bad that it didn't crash into the panic cam. This is about as hard as it gets in terms of ESPD bugging. All right. Thanks, everybody. Have a great weekend. I'll see you next week on Discord and in the community meeting and all that. So have a good one. I'll do I think the weather is. My weather came. It's nice and blue sky now compared to what it was when I first turned it on. So I'll go get a walk in on the way home. Thanks, everybody. Have a great weekend.