 Hello, hello. Looks like we're going. All right, since we're going here, if you're watching this after the fact, make sure and check the comments for time codes. I wanted to get going early, based on last week. Wanted to make sure that it would go OK. So starting early, the stream tends to be pretty long as well, so like two hours. So if you want to skip around, check the time codes in the description below. Well, you're on YouTube, so you'll be able to see that the red bar that goes along the bottom has got all the different sections as well. Otherwise, we'll just hang out here and let people join up, and we'll get started in four or five minutes, because it seems to be working, which is great. Last week, it didn't work. Last week, it took like 20 minutes to get going, so we're I wanted to give myself a little head start on the stream today. So we get going usually at 2 p.m. Pacific, so we're a little before that. So we'll sit tight and we can chat in the chat, and I'm pausing my video streams. I just paused it where it looked very dorky. DCD's in Discord. So hi, David. David's in YouTube too. We had Joel and Dyshipu chatting earlier in the YouTube. David asks, DeepDive doesn't show up in the twitch.tv schedule. I'm not sure how that's set up, so I don't know. SoundOrphan says, hey, Scott, would you be interested in coming on the real Python podcast to discuss CircuitPy then? Of course. I'm always down to do some podcasts. You can email me, Scott, at Adafruit.com to arrange that. I think SoundOrphan. Hi, Beata. Hello, doctor. This is going to be a very chill stream. Last week, we got down in the depths. So it's going to be a little less deep this week. Going to be doing some blinky stuff, hopefully. And I just figured out how to test the thing that I was trying to do before lunch that was giving me a lot of trouble. So I might actually do that, too. Overhead should be going. Hey, Bruce. Hi, Christian. Hey, thanks to Christian, everybody, for doing the Lucian just finished it, but didn't have to do too much. Being able to read the error string, the traceback string from the previous run, just got merged in. And Christian did that. So that's really neat. So thanks to Christian for that. Hey, Gary. Hey, Dishippu. Hey, M4TK and Swaraj. Is that right? Hey, King of North. Yeah, we're getting people as two o'clock rolls around. Hey, Steve. Good morning, unexpected maker. I was just using your board. I was having a heck of a time. And then I realized my mistake. So that's good. I was trying to load all this new stuff over cereal. And I had TO open in another window. And it was clobbering. TO was aggressively clobbering the ESP tool cereal connection, which was bad. Yeah, it was my mistake. So I just got it loaded. Christian says, glad I made it into 7 even after I let it language. Yeah, we took a really good look at all the 7.0 stuff. And it was really awesome. We got down to three open poll requests, which is kind of amazing. Hi, Minnesota Mentat. Am I clipping at all? It looks like I might be clipping a little bit. I'm actually going to turn the fan on too. It is a little breezy. And if I know anything, it just gets warmer. Oh, what made it into 7 is the change that Christian made to. Now you can set what the next file to run is it. So if you don't like code.py, you can actually set some state that says run something else.py instead. And when you do that, you can say, hey, on air, run this other file. And that file can then read the string trace back. In case you want to show it on the display, imagine you're doing a game menu and you kick to another game and then the game crashes. And your menu wants to handle showing that in a nice way. Hey, love the factory. Hi, David Smith. And hello, Paul. Good audio here. Awesome. Larger than life's got, it's true. I will be larger than I actually am in person. Yeah, we didn't start yet. I was kind of worried that I was going to have a repeat of last week. So what I did, yeah, I updated all my stuff yesterday, which I like to do as you all probably know. But then what I did is I rebuilt OBS. Could somebody say hi on Twitch just to make sure that that's set up as well? And this ship says, now I have to include it in the Pupu menus. Yeah, it was done for Pupu, I think, by Christian. Thank you, foamy guy. Hello, on Twitch. OK, let's do housekeeping. And then if you have questions, which I'll say, it's going to be super chill stream. So yeah, that's good. Going on housekeeping. Wait, before I start housekeeping, let me check my calendar, because I think next week is fine. Next week is the 30th? Yeah, I should be able to do that. So Minutes to the Mentat says, much love to whomever is doing the time-stamping. That's DCD. David has been doing that really, really helpful. So thank you a lot, David, and hugs to David for. And thanks to David for doing that. Asden had trouble with OBS when he started streaming on Tuesday too. Hi, Andrew Reed. OK, I said I would do housekeeping, but I haven't done it yet. All right, ooh, big screen. Hello, everyone. My name is Scott, and I work on Circuit Python for Adafruit. This is a deep dive that I do every week. Adafruit is an open source hardware and software company based out in New York City, but I live in Seattle here. So I'm streaming from my home office, and we're going to just hang out and chat about all sorts of electronics-y things. I've got a number of projects I'm working on, or things I have to do, so we'll talk about those. Circuit Python is a version of Python designed for really inexpensive computers called microcontrollers. This device here, the black chip there, is a microcontroller. And they make it really easy and really cost effective to get into programming. So that's what we work on more broadly. If you want to chat with me and a whole bunch of others, even when we're not streaming, we do have an Adafruit Discord server, which you can go to the URL, the middle box here is the Discord server. You can join by going to the URL, A-D-A-F-R-U-D-I-T slash Discord. You can do that even if you're not watching the stream live as well. We have lots of channels, lots of help, and it's a moderated space as well. So we make sure that everyone's pleasant and friendly, and it's the community that we all want to be a part of. So this is a deep dive. It happens every week at 2 PM Pacific. I'm in Seattle, so I think in Pacific time. It is occasionally shifted to Thursdays if I'm going to take Friday off. Next week, that is not the case. Next week, we'll do Friday as well. Typically, we go for two hours or more, depending on if we're working on something. Questions are always welcome. We've been known for the tangents and learning different sorts of stuff. So that is all par for the course. So if you have questions, I see Paul just asked what. We'll get to that in just a second. Yeah, it's great. And we've gotten lots of great topics just out of questions. So that's good. I've got a lot of small stuff I want to do. So we should be here for the next two hours or so. Last up, the kitty in here, he's kind of in the sun. He's a white cat. That spook, he's sleeping like a baby in the sun. He is epileptic, which means he does have seizures from time to time. He's been doing really, really well, so I don't expect it to happen at all. But if I am on stream but not paying attention and looking away, that's just me making sure that he's all right. But he's been on New Med since last fall and he's been doing much better. So that's been awesome. And he spends every day in here with me. So I wouldn't want to have to kick him out. All right, so that's housekeeping. Next week is on Friday. So we have, let's see if there's any questions in the Discord I missed. So Paul on YouTube says, question. I had two Arduino nano-RP2040 connects, BLE device to device. As soon as the BLE object on the central is active, it appears the RGB LED cannot be controlled. Are you using Circuit Python? I don't know a whole lot about the RP2040 connects. So I can't really help you. Honestly, if you're doing BLE, I really don't recommend the RP2040. I've seen a lot of people want to use the RP2040 wirelessly, either Wi-Fi or Bluetooth. And I really, I don't recommend it. There's not a whole lot of reason. Like there's only one unique thing to the RP2040, which is the PIOs and the dual core. But the PIOs, generally, I think are the thing that make the RP2040 really cool. And if you need Wi-Fi or Bluetooth, the chances are that you need PIO as well as, I think, pretty slim. So if you're doing Bluetooth, I recommend NRF52840s. If you're doing Wi-Fi, I recommend the ESP32S2. Having two processors coordinating is just like, like two chips coordinating is just a lot more. It's a lot trickier to get right. Paul says, no, this is not Circuit Python. The BLE is working, but the RGB LED is controlled from within the Wi-Fi BLE unit. Ah, I didn't know that. I haven't looked too closely at the Arduino Nano. Sorry, I don't know. That sounds like a NENA bug, if it's the NENA that's controlling the RGB LED. Fumi guy says, I don't have experience with it specifically, but my guess is that the Bluetooth libraries may be using the RGB LED as a status output. Yeah, potentially as well. I've seen that. I do want to do some RGB LED stuff. Bruce S says, I may have ordered another keyboard. I have an addiction, stop me. Which keyboard is it? We'll only stop you if it's not a cool keyboard, which it probably is. Yeah, sorry, I have only done a little bit of Arduino in my life, and it's not spectacular. Oh, Bruce S says the keyboardio, the Model 100. Naradoc says, he said stop, not enable me. Yeah, well, I'm not gonna, I know the Model 100 folks, I know the keyboardio folks. So I am happy that people are supporting them, and it is the newer version of the keyboard that I have, and I do like it a lot. In fact, I have been pushing, so, oh, Bruce S says, I know Jesse Vincent from Pearl Bays. Yeah, so Jesse Vincent is one of the folks at keyboardio. He goes by Obra online, and I've actually privately been, I've been promoting using Circuit Python on that keyboard. So in the Kickstarter, it says like, not exactly what microcontroller it is, and it says like this microcontroller or better. So there's a chance that you would be able to run Circuit Python on the Model 100. Now I wanna see the build video. They have a really good Kickstarter video, or, yeah, I think they did actually do a Kickstarter instead of CrowdSupply. All right, I don't see any other questions. This is my knee. If you see it, I have a habit of not, I have a bad habit of sitting on my feet and stuff. Bruce S says, no, I can't write a single line of parole. Yeah, Jesse's taken a long time to come around on Python because he is a parole person. Huh, Paul says, I received two days ago and ordered Raspberry Pi 400. Today I sent it back to the seller because various keys were not working. Interesting. I'm not sure how the keyboard works in the Pi 400, but I'm glad they let you send it back. I do wanna do, I still like in the back of my brain wanting to do native Circuit Python on the Raspberry Pi. So it'll happen at some point. It's just a question of when. Well, I think it's a question of when. We'll see. Sitting on my feet, so long as you're not walking on your bum, you're okay. It's true, I'm not walking on my bum. DCB says I do write command line or long parole lines. All right. So let me just talk about what I've been working on. So I mentioned it a little bit earlier, desktop. But 7.0 is, Minnesota's menta says, just remember to stand every so often, very true. I think I'm pretty good about that. Like after I'm done streaming here, I usually get up and like go for a walk and stuff. So, and I just sat down like a half an hour before the stream. Hey, Dave, cause I had lunch, so. Okay, so if you can see here, we have four pull requests open, which is awesome. And in fact, look at this, we can get it back down to three. Let's just do this quick review here. So this is just a small cleanup from Christian. He says, just had these comments. No, it's good. Yeah, so last week, Dan and Jeff and Katnain, I got together and we went through all of the open issues for 7.0 and also all of the open pull requests. Thanks Christian again for that. So now we're down to three, which is awesome. Interesting, this number is four still. It's like didn't reload everything. Yeah, so we've only got these three left and I was like, oh, I'll do more. And then for issues-wise, so the way that we tend to do stable releases is that we have a milestone. And for a given milestone, what we do is we just have all these issues that we wanna fix before we actually start doing release candidates. So I think I've heard this called as like a bug bounce. And maybe I've talked about this on the screen before, but the idea is that you have a big long list of stuff that you wanna get done before the stable release. You get that list down to zero and that is when you do a release candidate saying, if we don't find any bugs on this in the next week or so, then we'll call that the stable release and then we're off to the races. If you do find some issues, then what you do is you add them to this list and you fix them and then do another release candidate. So what we did is we went through these, we had like, I don't know, like 70 issues under the 7.0. We kind of moved them around, closed the ones that we didn't think, that sort of thing. And now we've only got 28 open and a lot of these are assigned. It looks like Dan has a lot assigned to himself still. Dan's got 11. I had 12 to start with, but I've been, so what I've been working on is fixing the bugs assigned to me, I've got five. And we thought Jeff was gonna take some vacation and have a visitor, but it turned out that's not the case. So Jeff's gonna help us get these down as well. Yeah, if only you guys says I'm working on some of the blocking changes in the libraries for 49, 40 is waiting on. Thank you, then we get down to two. Yeah, so I thought I'll answer a question that Dr. has and then we could go in a little bit more detail about the stuff that I've already fixed. And then I think this blink 10-minute Neopixel on the playgrounds for status is gonna be pretty simple. And I thought that would be really helpful, especially with the new Bluetooth stuff. So I thought we could do that on the stream today. It should be pretty straightforward. Dr. says if native circuit Python on the Pi was a thing, would we get real multi-core support and would that gain multi-core support on the Pico? No, even though we would get criticized just like we do for the Pico. So there's nothing saying that we have to use more than one core on the Pi natively. And in fact, it's still gonna feel super fast. It's still gonna be a ton of RAM. And you will still be able to do all of the graphic stuff, but it's the HDMI output that really excites me about the Pi. And so really the reasons that I wanna do the Raspberry Pi don't require multi-core. It would be another reason to do multi-core, but it's not a precondition for it. So I would say those are two separate things, multi-core and native Pi support. Concurrency's hard. I've gotta reiterate it. Concurrency's really hard to get right. And yeah, it's hard. It's hard to get right on our side and it's hard to get right on the, I'd imagine the regular Pi's single CPU cores are way faster than even the two Pi CPU cores. Yeah, like the Raspberry Pi 4, I think default clock speed is like 700 megahertz. And that, like it has separate GPU circuitry that just, it's actually the GPU that boots the regular cores. So it's pretty interesting and weird. David says, did anyone check the blink 4 LEDs on the MagTag? It may only blink one or four, depending on what code blinks it. Yeah, and that's one thing that I, yeah, that's one thing I was just gonna look at is whether we do more than one or not. Deshiva points out that the Pi also has L1 and L2 caches and such. Yeah, but the, it also has giant slow memory, giant slow RAM. And MinnesotaMentat points out that the multiple cores are unnecessary for most use cases. Yeah, yeah, I mean, like part of it, part of my hope is that I can get us to the point where we can, where somebody else can come along and do that for advanced stuff. Hey, ask Patrick. Oh, spammers. Deshiva says, you can always put more microcontrollers in your project, 100%. Bruce says, okay, trying to do a poll from main, get the issue with the port's Raspberry Pi SDK, live tiny USB has moved to some new point in time. What's the best way to get it all straight? What I recommend is go into the port's Raspberry Pi SDK folder and then do a get sub module update. Do not do recursive because tiny USB has sub modules of its own for all the different vendor house, which we should get rid of. But if you do recursive, you're gonna slip down a lot of stuff you don't actually need. Does this still not work? The other thing to try is get sub modules sync. I can also be easier or get sub modules sync will change if the repository that the sub modules pointed to is different, and then you wanna sync before you update. And get status, remember, I should make a t-shirt, like get status, like it's always get status. We'll tell you when you've gotten it right. All right, let's see if we can find my other pull request before we get into actually making the blinks work. Let's just see a little bit of what I did. So we were talking, Paul was talking about the, talking about the Arduino RP2040 connect previously. And one thing I did in the last week was I fixed the RP2040 flash size detection. So what that involved is this code here. So when you do flash initialization, we figure out the flash size and we try to do it by reading the R did register, some ID register. But what happens is that there's wind bond and giga device. Their third data byte that you get back is a power of two indication of how big the flash is. So you can actually read from the flash how big it is. But a desktop tech, which is the flash that is used on the Arduino, it's either that or my cronix. They don't do that for that third byte. And so what you would do is 21 is the default which is two megabytes. And two megabytes, half is used for a circuit Python and half is used for the file system. So that's what this 21 is here. And then what I did is I plugged in this default power of two which is computed by this gen stage two.py file. So it looks over all the configured flash devices. It gets the capacity which is our copy of what that third byte is. If it's not in the range that we know is like we consider valid, then we use the total size which is also the size of the flash, figure out it's power of two and then we save that. So we have like for any of the flashes that are not not within that range, don't tell it properly then we also pass it in as that. And then it gets put into this .h file and this is the build stuff for that. So Bruce says, I get lots of these inside get directory. I mean you could try just doing recursive but I haven't had that problem which is weird. Yeah, sub modules are not a great tool. They can be tricky to get right. Yeah, I'm not sure, sorry. What is the syntax in the default power of two template? So that is a ginger. So this right here is it's the header file.ginger. So what GenStage2 does is it takes in a file and then applies these values. So this flash settings is a dictionary that gets put into the ginger template and then it writes out the file. Yeah, J-I-N-J-A-2, ginger two. So yeah, so that's one of the fixes. Another fix, oh, don't blink, oh, I did a lot. So scan entry matches has a keyword arg that is all and all is a reserved name in Python so we switched it to match all but I made it so that you can still actually provide all and it will just use the, if either of them was false, then it'll be false. So I did that and this MicroPyPort macro. So if you ever looked at boards in Sandy Land, they have these MicroPyPort bitmaps which are like, they were used before never reset was a standard sort of thing internally and so it was used primarily here to not reset Q-Spy pins, not reset, these are random pins, not reset NeoPixel. So you had to maintain these weird bit masks and so I got rid of all that because it was causing an issue with all of the RGB status LED changes I made. The RGB status LED changes I made initialize all the status LED stuff just to blank and then they turned it off and what was happening is because we have had some of those pins in these older like pre-never reset bit masks, the pins would not get reset which meant they would not end up on, they would not be usable the second time around. So I changed it to just LUs never reset for all this stuff, which is a big cleanup, it's like 115 files, really happy with that. Don't blink blue on non-Bele workflow boards, this is like the macro pad was blinking yellow and then blinking blue, but I added this thing of if the Bele file service or the serial Bele's not there then just return in the initialization and I also tried to make it so that if it's gonna boot and discovery mode by default then it will be blue as well, which there's some more Bele problems still that I have yet to deal with. Fixed crash when UART constructs fails. So this was an interesting thing. There was also a bug that says like we should be better about raising error on SanDs if the UART buffer you give it is not a power of two. So I added this error here and turns out this is a way to check to see if it's a power of two. You end the value with the value below it because if you have a value that's a power of two it's a one, zero zero zero zero zero zero zero zero and if you subtract one, what you do is that one turns to a zero and then you get ones all of the lower bit positions. And so this is a way to check for that which is really clever and I stole it from ASF. But there was also some really nasty crashes that were happening if you, if in your UART construction you raise an exception and the reason that was is because we have the UART automatically de-init itself if the object gets deleted, it's called the finalizer and what was happening is that we were creating this object partially instantiating it, raising an exception which caused that object to be de-initted, but when we de-init it we're passing memory that's not necessarily set yet. So what I had to do here is I had to set the states for each object to make sure that they're actually like the de-init check actually says it's de-initted before it actually gets initialized. So that was another fix and that was a crash fix so that was a good one. I fixed the tooling thing which I didn't check but MicroDev did check which only, so when you get an absolute latest build there was a risk you would actually get different branch builds but now we'll only push those builds from main to S3. Flash size fix I talked about and then the last thing that I did that got merged in is this, we had four spots where we were returning OS error zero which actually doesn't make any sense. So I went in and I removed or changed the error number value of those things but then I realized that all this old WizNet network socket stuff was in here and we're not using it anymore it's turned off so I actually deleted it as well. This is mostly just deletes cleaning that up. So that's kind of been my week, little more than a week just cruising through this stuff. It's been really nice. It's me making a lot of progress rather than hitting my head against the BLE issues but if we go back this is my list here. So I thought we'd do these Blink 10 NeoPixels on the playgrounds for status today. This NRF 52840 Clue debug one build not booting is an issue I just haven't been able to figure out that I've looked at some already that I need to take a look at again. Somebody's working on this print exception thing so I'm gonna take a look at that before I do it. Refactor pulls out to not take PWM as a parameter is actually what I'm working on as well and maybe we should start with that actually because I was testing in all the different builds and I'm actually made some progress. And then this last one I have to do is this control C is not interrupting any deep sleep alarms and simulated deep sleep. So that should be a relatively straightforward thing too. And actually that's a, that's an ESP thing. So maybe, oh it's even in a draft PR. Wow, that's an old issue from January. So if I weren't in on the ESP I might actually just do this. MPHAL is interrupted, cannot detect control C outside Python execution. May do that too. What do folks think? What is, what are folks interested in watching me do? But for boot error only in the Raymos links should I open an issue? Well David I think the difference might be boot error versus circuit by bond. Let's just do the blinking one first. That's gonna be really easy. Hopefully, hopefully it will be. Start with the easiest one first. Well I'm in the middle of one of them. Let's do that. So I was working on the pulse out stuff. How are you feeling about these low hanging fruit or harder items? They're generally much smaller things which has been, it's a really nice change of pace for all of the BLE work I've been doing. I'm gonna get back to the BLE work soon. I've got some iron to the fire for host side stuff, but yeah. I've been doing a lot of hard stuff so knocking out the easy stuff is fun. All right, let me show this. So here's how I start a new branch to work on. Which I've been doing a lot because I'm, usually you introduce bugs now you're fixing them. I'm fixing the bugs, but I don't necessarily not introduce more bugs while I'm at it. Bang it out and enjoy. Yeah, that sounds good. Okay, so here's how I, here's what I do when I'm starting a new thing. So I'm in this pulse out switch branch and I just fetched at Adafruit. So I got like the updated versions of where main is. So I'm gonna do get check out Adafruit main. And if I do get status, we'll see that micro lab got updated. So I'm gonna do a get sub module update, and knit and I'm in the ESP directory. So now it's green, but I'm still in this detached state. That's why you get the commit hash in that green section there. That's where the branch name would usually show up. So I'll do a get switch and I'll call it playground status. Cause I think it's just the circuit playgrounds that need it. And then I will, so now I'm ready for my changes. Let's just, I mean, this issue is really not interesting cause I filed it. I just said like, blink the 10 new pixels on the playgrounds for status and we can do that now cause we're not gonna spend a bunch of power. That's gonna be really easy, famous last words. Yeah, true, true David. Okay. So we're gonna do that. Hopefully gonna be easy. I'm gonna start with the blue fruit. And actually one thing that can make it more difficult is that it's crashing some. But let's pull up our source and make it bigger. So ideally what we have is, hey, wagon loads, no worries being late. That's why it's a long stream. So first what I'm gonna see is, well, one, I should just close all the files I have cause I have a bunch of PWA related files open. Let's do, so we're gonna go into ports, NRF boards. And then ideally what we have is we have we're gonna be doing the circuit playground blue fruit. Let's just look at how the clue works. Or you know, what was it? Pie gamer. Pie gamer has five. So if we look at pie gamer, I think it's pie gamer. And we look at how we're defining it. So there's a hardware LED status. Oh, look it, this doesn't actually have neopixel either. Maybe we're not doing status LEDs on it. Whereas if we look at the clue here, there's this hardware neopixel define. So that's what we're gonna wanna use. And let's just grab for, so there are no, maybe the better thing is to look at how it's implemented. So in supervisor at the top level, we have shared and then we have status LEDs. And what it's gonna say is like, oh, if you have a micro pie hardware neopixel and then it has a fixed length here, status neopixel color. So if we're gonna wanna be able to do more than just a single one, we're actually gonna wanna make this dynamic. You can see, no. Dot stars is the same as well. So we're gonna have to do a little more work than I was hoping. If neopixel, but we can do that. Reset new color, let's see, four. So I'm thinking ahead to when we have to worry about how many there are. So I'm gonna do count and then I plus plus. This won't work for RGB LED colors either. Three times I plus that. It's probably bad to have all these threes hard-coded. Micro pie neopixel count. So that's the right and then here, let's apply that by the count too. So now we should be able to say, micro pie hardware neopixel and then define hardware neopixel count. And it's generally good policy to put 10 or parentheses around 10. Bruce says, I really did enjoy listening to Jim Elassi. Thanks again for that. Yeah, thanks to Jim for joining. This code here is not using JSON, wagon loads. Skur asks, in terms of microcontroller support, do you think we're coming to the point where the SAMD21 is just too small to be productive for future circuit Python releases? I would say, no. But you really have to, like the SAMD21 is limited, but that doesn't make it not useful. It just makes it useful for small things. Like we're not making circuit Python inherently bigger. Like the things that you were able to run on SAMD21s before, you should still be able to do. There are like corner cases where that's not the case, but generally it should stay true. What you'll find is just like, we're not really adding new stuff. NeuroDoc says, I have had issues where the code would do a memory error on SAMD21, but not in six. Yeah, that can happen if something's really close between the two. I would like to see some practical metrics on RAM usage in six versus seven. That's true that in-memory forms may have changed a little bit. Jim is great. I'm still shocked you got him up so early. He emailed me. He was like, I know you offered and I just was working on this bug. I thought it would be fun to talk over in your deep dive and I was like, I'm not gonna say no. You're always welcome. And Damien is too. I need to email everybody. We're gonna meet up again. Okay, so we have MicroPy hardware NeoPixel count and we have NeoPixel. I am wondering, does the Circle Playground Bluefruit have a power switch for the NeoPixels? I think it might. Actually, let's go from the shop. My fingers wanna take Type Circuit Python. Ooh, it's in stock. That's good. Updated the design to turn off the NeoPixels. Oh, what version I have. So if you wanna find schematics, I go to the product page, hit primary guide and then hit downloads. And then in downloads, usually you can get the schematic. And if we look here, light sensor, I'll do the bigger one. So here the accelerometer is on 3.3 volts but sound sensors on V plus, light sensors on V plus. NeoPixels aren't on this page. So if we go back here, power supply NeoPixels. So all the NeoPixels are on V plus as well. And NeoSense switch is what turn, which connects 3.3 volts to V plus. And it's pulled down. So I'm not sure which way we have to set it. But we have to be aware of that. Bye, doctor. Okay, so D8 NeoPixel. Since we're here, let's just take a look at which pin we're using. NeoSense switch is 007. Let's put that in, V07. And then NeoPixel is on too many windows. It's called D8 NeoPixel. D8 NeoPixel is 13, zero 13. So we're gonna save that. And then we're going to make, oh, that's not what I want. So we've got water, ground, blue, third clean source. I'm in that different virtual environment because of the IDF stuff. Yeah, David says, nice thing about working in an open hardware company is that you don't need to go to internal documentation. Everything is out there. It's true. I do occasionally need to because we only publish the schematics when the product is out. But I do actually have, we have one giant repo internally that has all the files as well. So I can, I can't pull all those down if I want to. If I need to for unreleased stuff. So if you ever find that a product is released and the schematics are not out yet and you have a question, I'm more than happy to answer questions about it if the product's released. Okay, so let me switch away from my camera. I am perusing my desk for a cable to plug into. USB cable. I'm also charging my headphones. There's this one. I guess my headphones are probably charged. I'm gonna go rock climbing after this. Okay, so hopefully the overhead's working. Hey, you can see my clock. I have it sitting there. It is 84 Fahrenheit in here. Okay, so I've got this blue fruit and I'm gonna actually let me focus. So I'm gonna put it in. So see the bootloader actually does use all of the NeoPixels for status. So if I double tap reset to get in the bootloader and I was just about to clean this LED stuff off my desk, but I guess it's good that I haven't. We can see that it's green. So that's climbing indoors. It's gonna climb at the climbing gym. Okay, so let me switch to desktop overhead. So I'm gonna pull up the build with ports. I've actually got a lot of circuit-by-thon devices plugged in right now. Maybe I should remove that so this one can go. And I was gonna set up my MacroPad. I realized it would be really nice to just have my MacroPad doing pause and play on my Spotify because I get up and go around. Okay, so I have the circuit playground blue fruit bootloader going and I'm gonna copy. Copy. Oh, and it's interesting it's red now. But it's nice that it uses it. Oh, look, it worked. Ha ha ha ha. Love it. All right, well it turns out the power is on by default. I wonder if we should change that. I might have an older revision of the board. So let's see if we can't figure out what revision this is. So usually revisions on eight of root boards are in a circle. So this is revision G. And I just realized that it's upside down. So I'm gonna flip it and I will change the scene as well. So if you're looking for a revision of a circuit or of an eight of root board, it's usually in a circle. So in here it's this circle thing here, it's G. I think it confuses some people when it is C because it looks like a copyright. Bootloader of mag tag links for orange LEDs when you upload firmware, but bootloader of circuit playground does not do that. Where is the difference? So the problem is that we used to have different UF2 bootloaders for everything. So Sandy UF2 and RFUF2 were done separately. And then the mag tag is an ESP32S2, which has a tiny UF2 on it. So with the ESP32S2 we tried to migrate to like one code base for the UF2 bootloader. So it's just, it's not gonna be the same unless you have the exact same code running it. It's just pet peeve of mine. But yeah, if we check that out again, like I guess it's kind of hard to see now, but it works, that makes me happy. And in fact, you know what, since we're here, so if I hit reset, that was not reset. I hit reset again. Safe mode and then B lead link is what you're seeing. But because it's working, it makes me think that we're not actually shutting down power. I think I've asked this before, but I can't remember the answer. How do you deal with changes on boards like in circuit by them like this where a new hardware feature is added like this power switch I know? I think we will do different board definitions if there's change pins that have changed. But I think in this case, the board revision only added a single, this is, the board revision only added a new pin's use. So I don't think the pin is connected in the first versions. So I can just treat it like it's the second one and it will still work. Like it just won't, like it's by default powering everything. And so really what I want is like, I wanna add code right now. I'm gonna just do it right now where it's actually turning it off because I think that would be great. So there is inboard.c. Oh, here you go. Look at that. Turn off board power switch on each software load. Oh, so you know what it's not doing. What it's not doing here is it's not, it's not blinking the status of the code. Oh yeah, you don't see my code. Okay, yeah, sorry. I should set up a thing where you all can vote to see something else. Okay, so where we are is we're in nrfboards, circuit playground, bluefruit, board.c. And there is this reset board call and what it's doing is it's turning off the power switch pin which power switch pin comes from here. I'm expecting me to say, so as an example I've not added VBAT divider on my FS2 because I can't find a way for a user to know if they can read it or not because if I can't tell what the board revision is. I mean, what would that, oh, I mean, if the pin was not doing anything else previously, I would just add it, I think it's AMD 21s anyway. Deshupy says they could check if the pin is present in the board module. The problem is the board module is statically defined for the board build. So Todd bot's asking, is there a description of the different board revisions? I have a red D but I'm not seeing anything like that. D is not working it seems. Oh, are you trying this board? Yeah, so not all of the revisions are released. So one thing that's interesting here is there's red D1 but I wonder if we looked at the power, no the power one's marked as D1 as well. So what I would do is if we go back to the product page or usually revisions don't change anything you've noticed. Gary says you need a second simultaneous stream that shows the code window in full screen. Yeah, do they have dual screen streaming yet? I only have one screen but let's see if it says all pads, each pin, internally used spins, speakers shut down, set to output and high to turn off power, accelerometer's not turned off. I think it was done quite early on so I don't think there's a lot that don't have it. So it says as of November 22nd, 2019, that's when the design was updated. So if you look at your order, this doesn't say when it actually happened or what the revision mark was. Yeah, we do, like you will if you notice there will be revisions but largely they don't change anything. Largely they're just for manufacturability that they get tweaked. Okay, so I think that there is now board and knit and board de-init, I think I introduced. Yeah, so there's a weak version of it. So I think what we could do, do I keep one unit from each revision? No, no way. Most of them don't ever get made, I think. But no, I don't. I usually have any proto, any prototypes that I got I'll have and then like usually one of the early copies. I don't often, I did get, for this blue fruit, I did get a newer revision I guess because I was doing power work. So I think what we wanna do is we wanna say, how do we, do we require management of power switch? So one thing that's really important is you can get the Adafruit Learning System Guides repo and then search it, power switch. The other trick is the bundle. Is there another name for it? D35, if high, so it sets it. What? I don't know where this code came from because that doesn't seem right to me. This makes sense. Okay, David and NeroDoc have D revisions. There's multi-twitch. Pin seven I think might be the NeoPixel pin where D6 is this power switch pin. So it's only the power stuff, power stuff that the older one may not have. But yeah. I could actually check. Yeah, let's just, I get blame on here, but let's just take a look. It's weird to me that there's any sort of code in there, boards, because it's got a pull down and it's setting the value to that pull down. So it should just get reset like normal. I would think, ooh, not that, no. NRF, boards, circuit playground, board, lane. Code formatting, you can click this thing so just go back in time, add power switch. Dan added it. Oh yeah, Alvaro says I'm working as a contractor for a field kit, that's awesome. Heat a fruit for the outside. Yeah, turn off power switch on each software load to prevent confusion. I don't know why, I don't know why that's happening. It might have been if I turns them off, set pin to output low on each reload, this disables power saving until it's re-enabled at the cost of a brief power glitch on reload, but it's pulled down, right? Like we looked at the, nice to see the good blame gooey on GitHub, thanks for the demo. Yeah, I don't know how to do it otherwise. I've just always done it on GitHub. Yeah, it prevents confusion, but it pulls down, right? Like I'm not wrong, I think that, see, this is how I'm getting to the schematic again. Like if we look here, it's power off when it's high and it's pulled down. So really what we just needed to do is reset the pin and it should be fine. But I actually do, I think what I want is, I want board and net explicitly turn it on, which is false. And then when we go into board D and net, which we can look at when it happens, we want it true. We should probably check if there's like any sort of alarms, but I'm gonna cheat it. If we look at main and unexpected maker, you may wanna look, I don't think your board should do this either. But if we look at board D and net, it's called right before we go into deep sleep, regardless of whether we're faking it or not. So board D and net is there, that's the only place. So that's a way to shut your board down before you deep sleep. And then when we wake up, we turn it back on with board and net. So we don't need to manage it with the blinking because we're going to, we don't blink when we're in deep sleep. So it should still be fine, but this will turn it off to prevent confusion. Turn on power, get it though. Don't need to turn it on. I guess if we did this board D and net, but I'm not even sure that works because sometimes the values aren't held. We'll just leave it to sensors and new pixel. And the pin shouldn't be never reset. To provide confusion. All right, let's do one more test and then we'll call this one good. And I also do have the older circuit playground express and we'll do the same for it. And it should just work. So let's just make it one more time and I will double tap into the boot litter and it's green. Sorry, I've got too much stuff on my desk. I think so, yes, it's a high side switch. Low for on, high for off. So you need to explicitly set it high. So I set it high here and I set it high and board D and net. And then in board and net I turn it low so that power is going. All right, it's built. We're in the right board folder. It's red one is copying over apparently. And then we should get the three, we should get the Saepo Blinks and then the Blue Fruit Blinks. Perfect, that's what I want. Okay, let's check the other one. So let's do that mouse and D and let's just steal this. Oh, did I say, is that where I said seven? Yeah, must have read it off the schematic wrong or it's wrong here. Let's double check. Neo sense switch, Neo sense switch. Looks like, wow, that's really confusing. It must be six. I don't know how, I don't know how this label is anchored to this green line. It must be, I assume Dan tested it. Must be six, let's double check. We can check the Blue Fruit Pins file as well. Six here too. Yeah, I must have had it wrong. All right, let's do the at mail side. So this is gonna take a little more RAM on the Circuit Playground Express but I think it should be fine. Oh, and there's three variants of it. So let's do it for all three variants as well. But we'll test on the regular one first. And let's do the same thing here to figure out. Actually, you know, we don't need to figure. There's a quicker way. If we just look in the pin out here and look for Neopixel, we can see it's on 23. We make and let's put this in. Oh, it looks like the boot loader here uses the first pixel. What is that? That must be a bug. The bright green. DCD says, could you look at the schematic in Eagle? I've opened the Eagle Schematics using KeyCad but I have not, I don't have Eagle installed. Yeah, I could, yeah, I could best with it if I needed to. I trust that it's right. And either way it's working. Like the thing that's not gonna work is it's not gonna get into a lower power state but we haven't done a whole lot to optimize that anyway. So it's not the end of the world. Okay, we have boot here but now we need to go to the other directory. Circuit Playground Express from where you have to. I'm so spoiled by UF2, let me tell you. All right, so we got the Safe Mode Blinks. We should get the, we're getting Safe Mode Blinks but we're not getting the like single green blink that you, that it worked, which is weird. Oh, there it is, I think I was wrong. I don't know if I'm connected to the lower, I think. Here's a cool thing that I've been trying to use. You can do Serial By ID and then Adafruit and then Circuit Playground. Not, so now we're in the REPL, REPL worked. It should be like every five seconds. Oh, there's a code.py running, which I have no idea what it is. What does code.py? Oh, it sleeps and counts. That's not useful. Okay, so it is working. All right, ToddBot confirms it is six. Awesome. You can stream on 360 and have all the codes green on one of the sides. This makes it way more usable, right? Like having it blink as the status. Everyone in agreement on that. That is a better thing to do. So I think all I have to do here is do it for the other two as well. And I could test it, I'm not gonna. These are different Circuit Playground Express builds that have different frozen stuff in them, which I am very not happy about, but they work for their purpose. So now we do get status, which you see me. Diff. So now we support, hi pits, pitsy. Greetings from Germany. Any other boards? I guess people can add other boards later. I'm not gonna worry about it. Okay, all right, so we're good. Support multiple status, neopixels, 10. And we say it fixes, I don't want that space. 5039. I got this idea when I was chatting with Trevor because he was trying to get the Bluetooth stuff working on it and I was like, I should make it more obvious. Like we were using just the red LED, but it's much more obvious this way. We've got them, we might as well use it. Oh, all right, so I push that. Yeah, it shows it up here and I can compare and pull across. Do, do, I won't set, I'll set a milestone. Labels, enhancement, Sandy, NRF. Be blue for Bluetooth. Yeah, so when it starts up, it blinks slowly, slowly for safe mode and then faster for Bluetooth. And if you hit reset and either of those periods, what you'll do is if you hit it in the safe mode one, you'll, it'll reset and then stay in safe mode. If it's blue for Bluetooth, it will reset and then it will be blue for the solid second and then it will go into like, it erases all of your bonding information and like advertises publicly, pull requests. All right, so that has that done. And now I think, does my history have, yeah, my issues. So one thing I noticed here is that there's this neat little icon here for the number of pull requests that refer to something. This one's a red herring, this pull request that's linked doesn't actually fix it. But that's the other thing to work on. Or I'm gonna have to have a second one here, but it's nice when I had a list of 10, I could keep track of like, which ones were in progress that way, which was nice. So I wanna go to do this pulse out stuff that I was trying to finish for the week, right? Like this is like the last work I'm doing of the week. So I wanna, let's just look, I pushed a new version that should have built. So I just wanna check on the CI. This is another thing I just found. This branches thing is super useful, especially for me, cause I have lots of branches. It's been great because it shows you the latest branches that you pushed to. So in these cases where I'm doing a lot of small branches for a lot of different fixes, it's been really helpful to keep track of like, which ones are active, right? So I did the main S3 thing that's done, and I could delete these, which I probably should. I wish there was a setting, like people have been confused. They go here and they're like, you still have a master branch and it's like way behind, like why do you have that? Like I wish I could set my default branch here to just the latest that I pushed to. I think that would be really nice. Anyway, you can go to the branch thing here and then see the current one. I'm gonna wanna switch to the pulse out switch cause I'm gonna work on that now. This is gonna be maybe one of my more productive streams. Let's check the build here. It's still yellow. There's four successful, 10 in progress, and 86 cued, which is great. Nothing's failed yet. So we'll keep an eye on that. I'm just doing some manual testing here, which I think I've lost my test program. So I'll snag it off one of these other ones that I have on. But what I was working on is this PWM switch. So this refactor pulls out to not take a PWM out. So, here effects Lucian filed this if we look at the docs. We just look at the six, three docs and we look at pulse out, pulse out. Pulse out takes a carrier, which is a PWM out. And this was a shortcut I kind of took when I created the pulse out API because there's a lot of settings on PWM out, that we also wanted for pulse out. Now, this caused some weirdness because PWM out should start doing PWM immediately, whereas if you're gonna use it on a pulse out, you don't necessarily want that. And then what came up is that the ESP32S2 has this RMT peripheral that doesn't use the PWM stuff, but it can do PWM carriers. So, what Lucian did in this linked PR was that they made it so that if we look at EN latest, and this is actually still not updated. This is one of the things I'm doing in the PR. If we look at the whole request in shared bindings, pulse out, we'll see that there's actually like two modes that pulse out constructors are in now. And this is in 6.3, I think. And the reason is that the ESP doesn't use PWM outs for PWM out the carrier wave. And so what Lucian added was this, like two different ways to do construction. So here it's like, construct with the PWM out. This is the old way. And then here's a new way where you can give the pin, the carrier frequency and the carrier duty cycle, although this is actually a bug I found. There's two hard frequencies here. So duty cycle wouldn't actually work in this case. Usually it doesn't matter, although that could provide invalid values. Anyway, that's a bug. But we wanted to move to this model of like pulse out is separate from PWM out. And because we're in the 7.0 mode, now's a great time to do it. So in 7, we'll support both ways, but we'll document the new way and internally we'll use the new way. So that's what I've been working on. If we look at my branch, so we're on my branch here, we can hit contribute. This is gonna be my, that I can't change this for some reason. So it's gonna be really confused. Say, oh, you can't merge straight to MicroPython, but then I set it to AidaFruitCircuitPython and it's like, there's no master branch. I changed that and now I get a good diff. So there's some messages disappearing. The constructor is simplified. So it's just the constructor will always take pin frequency and duty cycle. So all of them will now work the new way of like managing the PWM out itself. That's what a lot of this is, is like the pulse out now has a PWM out internally, which makes a lot of sense in terms of like lifetime management. I had to add this get pin. So what happens is that if in the constructor for pulse out, if you give it a PWM out in once this is checked in, what it does is it basically reads all the settings from the PWM out and then de-initializes it and then reconstructs it later. There's some like stub code and IMX stuff that didn't need to be there. So I deleted that. Yeah, so changing some of the pin stuff. Are we two shared bindings yet? So I had to change it in all the ports, but here you can see the docs are changed now. So it's no longer, oh, let me make it. So these are the doc changes. So the docs that we were just looking at come from these section, these are the C files and shared bindings. They have this slash slash bar prefix. These get slurped out and treated as Python stubs. So the syntax of things here is like a Python stuff file, which is actually really handy for editors as well. But you can see here, we're switching it from taking a PWM out carrier to the three pin frequency and duty cycle settings. And then I note that you can also pass in a PWM out, but I'm like trying to demote the old way. So it'll be compatible. You won't have to update it, but it will be documented the other way. And then the way that it works is that we have different argument parsing. And then we, this is the stuff that's deleted. So we take pin frequency and duty cycle straight out of the arguments, but then if the first thing is the PWM out, PWM out type, we kind of like snag the duty cycle frequency and pin from it and then we de-initialize it, which is actually not quite backwards compatible. So if you actually had like a PWM out that you used like twice in a row, like if you do PWM out, pulse out, de-init, pulse out, new pulse out, de-init, pulse out, you would actually get an error because now that pulse out constructor will de-init the original PWM out, but I don't care about compatibility that much. Hopefully that won't rear its ugly head and I'll have to like refer it by words, but yeah, yeah. So that's all in shared bindings. And then in terms of common how it just has the standard, the new standard API for it. So what I've been doing is I had to factor out these error messages for PWM out, which is not that big of a deal, and then said, hey, like, don't use this, we're gonna delete that later. So all I'm doing is now like, because I had to change a bunch of ports, I've got to just test a bunch of ports. So let me show how I was testing it and I'll snag the test code while I'm at it. So going back to the overhead, did someone just create a meme of that? A meme of what? A meme of me? Please tell me someone captured that for later. Oh, me saying I'd probably eat my words. Well, it'll be there, it'll be there. Okay, so what I've got here is you can see just the corner of this ALI-A and let's unplug this, because we're done with that. And I've got Feather NRF 52, hey, 40 Express, and I'm just gonna plug that in and what you'll see is this D3, if it's connected, right, it might blink. Not sure. But basically I have the ALI-A plugged into it and if I go to the desktop and do, oh yeah, backwards compatibility. I said I don't care that much about compatibility, not quite backwards compatible. Yeah, you all got me. So what we can do is we can start this up and then when I plug it in, it does this pulse-out train. And now it's in circuit 5.8, now actually JavaScript. No, definitely not. Although that was funny that I confused people with the one deep dive I was working on JavaScript. Okay, so here's the sample code and the reason I plugged this in is because I wanna snag the sample code for other stuff. So I've renamed this drive here and I'll just double click. So here's what the sample's doing. So here is the old way where you construct a pulse, a PWM out, pass it into pulse-out and then do some stuff. Then I de-init them both and now I do the pulse-out the new way by giving it the pin and the frequency and the duty cycle directly. And I've switched up the frequency so I can check that it's different. And then this is almost the same pulse train. It's slightly different. So if we look here, the overlay says, which is probably pretty small for you, but it says 38.005 kilohertz frequency. This is 70 kilohertz frequency. So that's correct. And then this gap here should be the 2000, but it's 2000 microseconds. So this is 2.016358 milliseconds. So that is close enough as well. So it's working here. And now I wanted to snag that code.py so I could test it on the unexpected maker, the other way. So you can see that. So now I'm gonna move this D13 to the D17, I guess. It's labeled 17, I might have to rename it. And this is why I've pushed so hard to have the numbering the same, but we'll get there. And I'm gonna unplug this and steal. This is USB-C, so I think it's a USB cable. So let's see where this is at. I don't think, does that have circuit pipe on all that? Make sure my switch is switched. So I think I have tiny UF2 on it. So if I hit doot, doot, now I'm in tiny UF2. And we can see that the boot loader is there. I'm just waiting for all the codes to break and the user to roval and the memes start rolling out. Pulse IO is not gonna be the reason people are up in arms, there are other stuff in seven that we're trying to break now rather than when we're stable, but inevitably it will come up. That's what major versions are all about, that's what motivates major versions is us changing stuff. And I know it's painful, but I like to do it because the longer you wait between major versions, the more comfortable people get with the idea that they don't have to know how to update stuff. So it's a good forcing function for people to like keep those skills sharp. Would magnetic data cables work on these boards? I don't see why not. I'm not exactly sure what you mean. That poor CI needs some Ccache. I would love it if people wanted to help make the CI faster. I'm not entirely sure how Ccache works. Okay, so I mounted it and now what I'm gonna do is I'm gonna go back to here and I'm gonna hit save as. And before I do that, I'm gonna do the salier. Oh, and I didn't change the, do I have my TO window open? No, I do not. I'm liking this by ID thing, what it says. So it looks like it's running. My Neopixel is blinking weirdly on it. Yeah, I didn't change the pin, yeah, yeah, yeah. That's why it didn't work. So let's go back here and say, actually, this is exactly when I like to use the Rappall board. I owe 17, right? That's simple enough. I think that's the prefix we have for the numbers on the board. And let's check, there we go. And we get 38, 38, 70, 70, 70. So this is still working. And this gap here is two. Wow, that's like more accurate. It's 2.000924. So it's like much, it's like, it is more accurate than the other one. The NRF was. Cool, okay, so ESP works. I've got two more boards that I should test. I have a, I'm not sure this one will work. I was gonna use the, I couldn't find my other RP2040 feather. So let me start with STM. Good night, Dischipoo, thanks for hanging out. Okay, we're gonna safely remove and unplug. I'm glad I figured out that Tio thing. I was getting so frustrated. Okay, so here we're gonna do grounded here, D13. And then we're gonna plug it in. But you know, I could never remember what the state of my, I don't have a bootloader on here, I think. We have bootloaders for this, right? I don't even know. So this is the STM32F4 feather, which I don't do a whole lot with. So I'm gonna have to learn. So we're gonna move to STM. We're gonna go make feather STM32F405 express. Clean it for good measure and build it. And then I'm not sure exactly how I wanna load it. Oh, look at that. Oh, you know what? I'm also in the wrong. Well, that PR I just sent out has a bug in it. That's what this is. Let's fix that before we, oh, you know what? And that means that I didn't, well, no, I didn't rebuild the, I didn't rebuild the feather S2 build. So it should be okay. I built it earlier from the pulse thing, but I'm on the wrong branch. But I just found a bug in that I don't have a default value for that. So in status LEDs here, I think I'll do it here. I'll do if and def micro pi, hardware near pixel count. So if it's not defined, we define it to be one. Todd says I was going to ask you about that. The CI would catch this too. And in fact, I'm gonna go make sure that that's not, now that I know what it happens, I'm just gonna stop it. So if we go all requests, yeah, we can see here that there's still a lot going. So what I'm gonna do is I'm gonna click into the details and I'm gonna say this says cancel workflow. So I'm gonna click that because I've already failed. I don't need to know exactly which ones to do because I know that there's this bug. Like if we look at this, like, oh, the itsy bitsy rp2040 failed and it failed exactly for the same reason. So like all the things that have a status in the opixel are gonna fail. But not now, because I'm gonna build it. And so now that I made the PR, when I don't make PRs, when I'm still working on it, I tend to amend that commit. But now that I've already made a PR, I'm gonna push a new commit. So I'm gonna say get status, get diff, fix single new pixels to ask for it. All right, so that works. Now I'm going to switch to the actual branch. I'm going back in time because of micro lab. But maybe what I should do instead is I'm gonna, I'll get it up to date so it's green, but now let me, I'll rebase, because why not? It should be easy. So I just do rebase, I, Adafruit main. And it says, which commits do I wanna rebase on top of? I've only got this one commit. So I just do that one. And now I get status. And now because I went forward in time and micro lab was changed, now I do it again and I'm back to where I was, except I'm based on the newer version of Adafruit main. Okay, so now, since I moved around, I'm gonna do this clean again and actually test STM. Well, now I gotta figure out how to load it, but once I can figure out how to load it, then. Okay, so there is a UF2, let me pull up. So this is the other reason learning guides exist, right? Like other STM, what does it say here? Do we have UF2? Enabling bootloader mode. Ah, so I don't know if you can see it, but there's this white wire. That's my enable bootloader mode wire. So let me look it in, hit the button on the plug. STM is a pain to update. Well, it's well-documented, DFU. And look, I've even got it in my history. I love fish. No DFU-capable device. I think there's a way to list. I think there is also a, anybody who tells me that DFU is a good way to update things, I'm just like, you haven't tried UF2, have you? We got it, that should be enough. But I think tiny UF2 does have support. If we go to tiny UF2, I think I might just be up behind the times. Like I was just here earlier for the, I don't know, maybe it's a separate. Oh no, there's ST Disco Black Pill. No, these are just update ones. Ben's supply needs an update. STM parts of DFU it is. Yeah, yeah, I feel ya. Okay, so now we're on checking or unplugging and then hitting reset. Now we're in safe mode, apparently. Do TO again, but let's do the awesome by IDTO, A to Fruit, S, Tab, Hard Fault Handler. That's no fun. I'm gonna unplug and plug it back in. It's still in safe mode. Well, that's not good. I don't know why it's doing that. So my next step to debug this would be to solder the box header on here and be able to do JLink. That's a problem and that's something that we should fix before seven, but I don't feel like doing it now. And let's see, we're in safe mode. So let's just take a look at what's on the drive. Deep sleep, actually, that's what we can do. Let's assume for a second that the deep sleep is the thing that's crashing. So let's say deep sleep crash and then instead, oh, where did it go? My code.py disappeared, my test code.py. I should have backed that up. You know what? I have a second USB cable. This is the problem with having the source code on the device. I just leave it there. Feather, code.py, okay, so let's save this as, save. And then we'll eject to make sure that the system's written everything. Sinkly-renew, and then we'll hit restart. All right, so now it just gave me one red blink. Ah, so it's an invalid pin, which I guess is okay. I don't know what pins I'm able to do, pulse out on the, I guess we just try until one works. Let's mount it, open it. There we go, D10 works. Hey, Johnny. Oh, there's a different bug. All timers for this pin are in use. Dnit is not dnitting. Okay, well, let's see, let me move the thing here. Let's just see if the first set of stuff is working. I'm sure again, D, all right, so we got the first set here and it looks pretty good. 38, there's this gap. This gap should be one. I think it's a little low, or no, that's about right. 1.0168, the carrier frequency is right. The problem is that the dnits didn't work. So this is probably not related to my change, it could be. Question about dev serial by AD, what if there are two identical boards from Adafruit Connect? How can you tell which one is which? Good question, not sure. I assume there's some number in the end that would unify it. Disco tool there, by the way. Neridoc, you've done so much awesome tooling and I don't use it. I'm like back in the Stone Age in terms of certified done tooling. All right, let's figure this out. We got eight minutes until we're at our four o'clock mark. Disco tool is the bomb. Okay, how do I use disco tool? Do I just pip install it? Disco tool for microcontrollers. Okay, and then I run it and it does no pyudev. I assume that's either pyudev, okay. You've got a dependency problem, but that's okay. Oh, look at that, neat. Thanks, Patrick. Here's in my cut buffer already. See, I accept PRs for the Linux and Windows version. All right, so it's printing out, oh neat and it's telling me repel versus not. So, oh, here's a perfect example. I have two different NRF 52-840 express this plugin because one is this sensor for the, I like the particle sensors or something. It doesn't seem to be working very well anyway. Yeah, that's neat. It tells you what ACM it's on. So that would give you more information. So kudos to Neridoc for that. Okay, so let's see if in the next six minutes we can't figure out why this is not working. So let's take an STM common how and it's line 21, all timers for this pin are in use but I suspect that error is coming from PWM. PWM construct, no match found. So it must be this PWM out all timers on pin in use response, which would make sense. So that is if the channel is taken or the taken internally. So taken happens if reserved timer. So this is doing a pin mask over the timer index or STM profiles timer is reserved. So I could put prints here. Oh, disco tool has commands to connect to a serial by board name, drive name, serial number. Although you need to add an environment variable to use to you instead of screen. So what I really want to know is what is it doing in DNit? DNit says self timer equals null. DNit says if I'm already DNit and then I'm done if I reserve timer, timer, timer index minus one equals zero if it's variable frequency, right? So that's all to itself. Otherwise we bit mask it with the channel index and stop it. That seems right. And then if there are no active channels. So this time index minus one seems a little weird, but this looks correct. Let's take a look at pulse out. Disco tool, disco tool circuit. Ah, so here pulse out construct. STM peripherals find timer. Timer reserve, DNit ref count is here. So this all looks correct to me. So either I have to reason through this or I can just say I'll do this later. I'll pick this up on Monday. My brain is not in the state to look at this. Plus the window is kind of small. Any final questions that folks have? Circuit and disco tool are definitely things people should look into. DCD says what notes would you write to yourself to remember this on Monday? So the question is how would I remember that I'm gonna do this? I think I probably wouldn't. I think I'm not a great, well, I'm not like deep in the weeds of anything. One thing I should do is I should save this code.py since I've had to pull it off a couple of times now. So I'm just gonna save as, and then I have this random backups folder that I use. So I'm just gonna do, let me tell you one, 0713 pulse out test. And then I'm just gonna save it there. I'm trying to get better at doing reminders and stuff. But really the reality is that I'm not gonna get to this until Tuesday. Mondays are usually just catch up. I might be able to get to this on Monday since I'm not running Monday's meeting. But yeah, what I would probably end up doing is just being like, all right, what do I have to finish? Like I do think about that for the meeting when we give status updates. So that kind of like gets my brain going. And then it's not like I'm like deep into context, really. Like I haven't gotten there yet with this. I'm like about to embark on it when I'm figuring out like why it's saying why it's busy, but yeah, generally I'm like kind of bad about that. That's a cheer. Yeah, so I'm not great about remembering stuff, but I know that I've got that list of issues that I'm working on through. And I know that the pulse out thing is the thing that I need to, that's the thing that I'm gonna pick up. And then I'll probably quickly remember that. I was like, oh, you know what I have as well and maybe I closed it, oh boy, I didn't close it. I do use tabs for state, which I think, oh no. So I have, this must have reloaded, unfortunately. I had a list of like all the things that I tested on. I was gonna say like tested this on these things. I lost it. Must have like restarted my browser and had like some form field. But you know, it's not the end of the world. I can, anything I've written once I can write again, I know it'll probably be faster to write the second time. I had, it was interesting. You've probably seen me like wanna complete things before the weekend, but I had a coworker that I would always, when I, at Google who was, he said, I always leave in the middle of something. He always left in the middle of something so that one he would, like his brain would be active about it, but then like he'd get in on Monday and he'd wanna complete it. So like that's one trick he did so that he would always get to like, he would always kind of like pick up on Monday pretty quickly. But my Mondays tend to be two hours of meetings. So we have an internal meeting and then the circuit Python weekly. And then if I'm doing that meeting, there's like post meeting stuff, like setting up the newsletter and getting the video online and stuff. And then I get through all my email and stuff. And usually by then I'm like, I've only got an hour to kind of left. So Tuesdays are really my like, starting to really code day of the week. But it varies. I had more meetings this week. I'm gonna have some more meetings next week. I have been doing some broadband stuff that's like totally not work related, but I have a broadband meeting during the day. So Patrick, I've got broadband ideas since you live in the same city as me. I've got broadband ideas that maybe I could run by you, but yeah. Anyway, we made some progress on the Neopixels status stuff, which is good. We covered the other 706s that I had done previously. And we still have these last few to do, which is fine. We'll get there. My goal was to have it, I think I did say ended this week, but it's not gonna happen. This control seat, not interrupting any deep sleep alarms is something as well. So yeah. Bruce says, I may be in Seattle to visit once the border opens both ways. Let me know. I'd be happy to meet up. And that goes for anybody. If you're in Seattle and wanna meet at a public place and have a drink of some sort, I'm happy to meet up with folks. Preferably outside given that COVID is still a thing, but I am vaccinated. So it's not too bad. I'm just avoiding a lot of indoors with a lot of people still. Maybe going skiing near you next winter. I don't think you're skiing as good as me as us in Whistler. All right. Now I'm just rambling. I could ramble about broadband, but I'm not gonna do that. So thank you again. This has been another deep dive with Scott. They are on Fridays at 2 p.m. Pacific here on the Adafruit Streams. Please support me indirectly by going to adafruit.com, purchasing some hardware there. The Circuit Playground Bluefruits are in stock, it looks like. So if you don't have an NRF 52A40 board, I'd say pick one of those up. That would be cool. CircuitPython is beginner-friendly Python for stuff. So hopefully you saw a bit of that with what we were doing. Next week should be on Friday at 2 p.m. as well. If you wanna get notified, sometimes I do change my mind on that. We do have a deep divers role on Discord that just ping me and I'll add you. And if I do switch it ever after I've said something else, I'll ping that group and let you know that my plans have changed. But otherwise, should be normal next week. Good morning, Gary, I'm just wrapping up. Thank you for hopping in. And the cat is kind of out of view of the camera, so I think we'll just call it. And oh yeah, and Patrick points out that people should star the Discord tool. So let me just do that as a wrap up here. So we'll switch to the, I think, and I'll paste it in the YouTube chat as well. So that's a cool tool from Neridoc. Thank you, Neridoc, and we'll get that start up. And with that, we'll call it. Thank you all and have a great weekend and week and we'll see you on the Discord, which I forgot to say you can join by going to the URL adafru.it slash Discord. Have a great one, everyone.