 All right, good afternoon. Happy Friday to everyone. Looks like I've got sound to OBS. Be good on that front. Did I? Click the start button on YouTube. Let's check on that. Looks like we did. Yeah, I think we're all set on YouTube. Okay. How's it going? Devo Dessa and Beata. Good afternoon to both of you. I'll need that. Oh, one second. Let's close this also. Let's do something like this. Okay. All right. All right, I think we're good to go. Let me grab a drink real quick. Some coffee. I'll get the show on the road. So hello to everybody. My name is Tim. I go by FOMIGuy on GitHub and Discord. This is the deep dive program, which is a weekly live stream program where we are working on something down typically into the nitty gritty weeds, so to speak, of Circuit Python. Sometimes we're working in the Circuit Python core. Sometimes it's infrastructure around the project like docs or automated testing or different things related to that. Sometimes it's libraries. Sometimes it's projects. It just kind of depends week to week what is going on. This week, we are going to be looking at some PRs. We're going to be doing some testing and some reviewing of some PRs. Couple of them are in libraries. Couple of them are in the core, but that's what we'll take a look at today. I should take a quick step back though, just for folks that might be new. If you've never caught this stream before, if you don't have any idea what the stuff I'm talking about is, you can learn more here at circuitpython.org. This is the main website for the Circuit Python project. Circuit Python basically is an implementation of Python that runs on tiny computers called microcontrollers. There's a bunch of pictures of those microcontroller devices over here on the downloads page. The basic idea of these devices is there is a tiny computer kind of inside the main chip on these devices. When you have these devices run Circuit Python and you plug it into your computer, it will show up like a thumb drive. There will be a Python code file on that thumb drive, which is basically just a text file, right? You can modify that text file with whatever text editor you want and then save it, and the microcontroller will notice that it was saved, it will reset itself, and it will run the latest version of the code. That sort of central loop is kind of the core concept behind Circuit Python, using Python code to interact with these tiny computers so that they can interface with all of their IO pins or with any built-in hardware peripherals that they may have, like keyboard keys or screens or knobs or LED matrix plugs or alligator clips, neopixels, sensors, you know, like temperature sensors and things like that. Really any kind of little electronic doodad you can attach to these things. Lots of them have several of them built in as well, like this device has got several sensors and a speaker and buttons and all kinds of stuff built into it. The common thread amongst all of these, while they do come in all different shapes and sizes, these little microcontrollers, the common thread for all the ones, of course, on this page is that they all support Circuit Python, so you can download Circuit Python and put it on all of these different devices. So that is the high-level look at what we're doing. If you want to get involved or learn more, a couple of places to head are circuitpython.org, the main website, also the Discord, if you join us over there on the Discord. Am I in the... Oh, no, okay, I had this one on the wrong. I see. There we are. Let me put that one up just so I don't get distracted by it again. Circuitpython.org, this is a good place to go. Discord is another good place to go. If you want to get involved or learn more, ADAFRU.IT slash Discord, that will get you to the Adafruit Discord server. On that server, there are channels for Circuit Python development as well as help with Circuit Python, as well as many other interests that are outside, you know, beyond the scope of Circuit Python. But those are the ones specific to this, so head over there. And then last thing I'll say is Circuit Python, it's an open source project. Anybody is allowed to add Circuit Python support to a new device, like their own device. It could be a device manufacturer. It could just be a member of the community. It could be a user. It doesn't really matter. Anybody is allowed to add support to a device for Circuit Python. It's free of charge. You don't have to pay to do it. Your users don't have to pay to download it and actually run Circuit Python on the devices. All of that kind of stuff is all free. It's an open source project. There are, you know, licenses on GitHub that explain the details of the license. But the gist of it is that you don't have to pay to use it, which is really awesome. There is, however, a team of folks that gets paid to develop Circuit Python. There are some members of the team that are paid full-time to work on Circuit Python. There are other members of the team, like myself, who are paid part-time to work on Circuit Python. Adafruit, this is their website, Adafruit.com. They're the company that is paying us to work on Circuit Python. So a huge thank you to them for, you know, paying engineers and developers and community moderators and members and community leaders and all of these people who come together to make Circuit Python what it is. Huge thank you, of course, to Adafruit for paying the folks who work on that. And a huge thank you to anybody who purchases hardware from Adafruit because by purchasing hardware from them, you are obviously helping keep the lights on, helping keep the Adafruit factory running, which is, of course, allowing them to keep paying people to work on the projects. How's it going, Spavlot? Good afternoon, my friend. Happy Friday. Made it through another week. Let me shuffle a few more of these around, and then we'll get the show on the road for real. First thing I'm going to look at is the Ethernet PR for folks that have watched my stream before, especially within the last maybe month or so. You probably have seen me work on this. PR, it's been updated again, so we're going to give another test today. We're looking to get some output from the logs and share them back to this person who has been doing all this great work on it, Biffo Bear. So they've got a new commit in that I have not tested yet. So we will be doing that. We will let it get its logs. We'll save those off, and I'll post them back here for this person to take a look at so that they can see what is going on with this version. In order to do that, we are going to open up Wisnet Library. Let's go new window. How do I have this changed? Oh, right, I added a print statement into here. Do I want to keep that? Yes and no. I kind of do, but I think we should pull from... I think we should pull... we should pull first. So here's what I'm going to do, is I'm actually... I'm going to take this code. I'm just going to throw it in like a scratch file, just to keep for a second. I need any of that. I'm just going to throw this here, and we'll come back, and we can copy it out of there later. And now I'll just revert this to go back to... so this line is what I added. Basically, we just want to get rid of that for now, and then we'll pull, get the latest version of code from the PR. Except this might... is this on a pullable branch? It is, okay. Sometimes it's not actually a pullable branch. Sometimes it needs like me to add a remote or something, or usually what I do in that case actually is just use ghpr checkout again, even though I already ran checkout once. Since it can't pull, you can just run it again to get the latest one. Do many CircuitPython libraries have automated testing in the pipeline? I know it uses GitHub Actions. Good question. And the answer today would be no. Not very many libraries do have automated tests. We do use actions for lots of stuff, including like pylint and black code formatting. So, you know, those test the code in some ways. They test it for formatting, and they test it for, you know, best practices in the case of pylint. Maybe test is maybe not the right word, but they analyze the code maybe is a better word. But not all of the libraries have automated tests. In fact, I think only a small number of them. This one happens to be one that does. Coincidentally enough, this one does actually have a couple of tests. I think Biffle Bear actually added these tests as they've been working on this library. They've added a lot of improvements to this library over the last like several months or so. They have been working on this and they've done lots of different PRs. This is just the current one. So, they added a couple of tests here. I want to say there are like a small smattering, like maybe probably a dozen or less is going to be my guess. Libraries that do have automated tests. The vast majority do not. That's like a dozen or less out of, you know, 300 or something like that. Like actually say the number does not actually say the number on here. But I want to say the Eight of Fruit Bundle is a couple hundred at least. Like, well, this doesn't get you to there. Anyway, it doesn't matter the exact count, but it is hundreds at this point. I want to say two or three hundred, truthfully. It would be all the things listed on this page, which is a big long page. And then it would be all the things listed on this page as well. I think it's an even longer, big long list. Unfortunately, there's no tabulation or anything. So, we'd have to like copy paste it out or whatever. But there's lots of libraries. Not very many of them do have automated tests. So, I'll stop rambling for now and get back to it. A good question, though. Thank you. Yeah, for folks also, you know, for anybody who doesn't know, like I'm totally happy to answer questions in the chat. You can drop those in the Discord or the YouTube. If you have questions about what I'm working on or CircuitPython generally or just anything you wonder about, I feel free to drop those into the chat anytime. So, we did pull the latest version. We're going to get this onto our device, which I need to plug in. Let's do that. Turned on the camera. I don't think I ever pulled it up here. Let's do that. I think it's got 226. Yeah. Screen that will fail. Reopen it here. Refresh this. We can refresh this. And then we will fix the focus. It's pretty good for now. How's it going, DigiDevon? Good afternoon. Yeah, pro tip. Actually, you do need to plug in the USB cable on both ends. Got to keep that one in mind. Let me, do I want this wrapped around here? This is like a long cable. I suppose it doesn't matter. Okay, both ends this time. Both ends. Now we're good. It's a little bit glaring, isn't it? Coffee cheers. Iced coffee in my case. It's actually rather warm today. It's like 70 degrees outside here today, which is a bit unseasonably warm, but I will say we have strange seasons, truthfully. It's always usually warm for a week or two, even in the dead of winter around here. The only thing consistent about our weather is the inconsistency, truthfully. Let's swing it back and forth. How's it going, Paul Cutler? Good afternoon. If your USB cable has three ends, it's probably not the cable you want. That is the truth. That is the truth. Yeah, we're doing some WisNet. We're doing a couple of different PRs. I think yours is in the queue as well, the requests one. I'm going to take a look at again today as well, because I don't think this will take the whole time. I just got to get the logs from it relatively. I think it should be relatively quick. I've been wrong before. Sometimes we get into it and more issues pop up than I'm expecting, but I don't think we're going to have too much in this one. I think we just copy our library and grab our logs and be pretty good after that. Where is it? Oh, there it is. Okay. WisNet. I could probably get rid of this edited MyNetwork one. I suppose I don't need that anymore. Is that an Ethernet feather wing? Yes, it is. This one is a feather. The microcontroller is a feather ESP32S2 TFT. The thing that it's plugged into there is a Ethernet feather wing. Those are both connected just through a feather doubler, which are super convenient, by the way. The feather doublers and triplers I think are probably my favorite way to wire up circuits just because you don't really have to do any wiring at all. Once you just solder those headers, then it's just stamp that right on top and press it in. Super duper convenient. Do we need this? This is... Yeah, I think we'll keep this because we are actually going to... One second. I'll be right back. Sorry. Crashing sound a little bit. I want to make sure we're all good there. Let's keep this one, though, because Bitmap Circle Draw is another one I have in mind to look at today. We're going to keep this Bitmap Tools Circle. Save that one there. How's it going, Paul SK? Happy Friday. Yep, thank you for the link that is indeed... That is indeed the same device we got. How's it going, C Grover? Good afternoon and happy Friday. We'll save that off and then we can just take the simple test of Wisnet, drop that into CodePy. I already pasted the library. Oh, we will need to change this. We also want debug true and we also do want to connect TO so that we can actually see the output. Otherwise, don't get to see the code, which just kind of defeats the purpose in this case. We're trying to get the output there, so make sure we're set up there before we ever run anything. I think that should be all we need. If not, it'll fail and we can figure it out afterwards, so we'll save that. I am in REPL, so it's not going to run. I'm just going to go Ctrl-D. You make it run. I deleted the old one, but did not paste back the new one, actually. I thought I did, but nope. Okay, so let's go back here. We're going to copy the library. Drop that into the lib folder on the device there. Planted seeds yesterday for starter pots, not outside, thankfully. This weekend we get a weather alert. Yeah, that's always my luck too if we get anything planted. It's always like plant after the last frost or whatever, and it's been weeks since the last time it was got, but then you drop those bulbs in the ground and it's like a trigger in the universe to just pull the winter right back. You like two days later and it's now frozen again all of a sudden. That would be four as well. Okay, let's get this one. We'll be printing out some stuff. You think the ethernet cable is connected? Check. I'm pretty sure the ethernet is connected. I will check on it here in a minute. Ethernet logs or something? I don't know where I was saving these things. Oh, I'm in. Okay, I mean there are no lights, I guess, so maybe it's unplugged. How would I have unplugged it? I'm pretty sure I just used it like... Oh, I think I switched it back so that I could do something for work actually. Speaking of which, we don't need this or this actually. That one actually would have been even worse. Luckily that's actually not a real activation link that I should be showing it on the screen either way, but it is actually a fake activation link. I think that's all of the unrelated stuff that I have on the screens. We could close that too, I guess, actually. And while I'm obviously this, we don't need it as well. Alright, PRB, I'm going to check on the other end of the ethernet here. I'll put this one up so we could actually see if the lights turn on when we're done. Those lights underneath there are not on. I need this thing. Those theoretically should blink if it was actually connected, so it's not actually. Okay, indeed, it was not plugged in. But now we have a light under there. We don't have it, oh, and we have blinking under there, so like it's actually sending and receiving information now. Let's try that again. We probably don't need to keep the log for that one. That one actually, everything went fine. Everything behaved as it was supposed to. It's just that I didn't plug it in. So what it was supposed to do is nothing. In the old version, it did loop this a lot and it looked like it was going to go like super long. I actually ended up bailing early a lot of the times, but this time it's actually like retrying a little bit quicker. So I think I'm going to let it go and I'm pretty sure it has a maximum number of retries of like four or five or something. So it should, after another one or two or three of these, it should, I think, just count it as failed. And then that's the log we can capture. We need to, maybe we can cut out some of these. This one's, okay, yeah, I was about to say, although this one doesn't seem like it's going, but it actually just got to start, just got to start talking about it. I got the Alexa in there or something, I guess, knows when you're talking about it. These are interesting. I feel like that's different than what I saw last time I tested this, but actually 100% certain. What does this test do? So if the test succeeds, well, one second here, actually. Okay, it depends a little bit on how you mean. If you mean like, what does the code do when it succeeds? The answer to that is it's super basic. It will just like print the IP address it gets. It will look up the host name for Adafruit.com, which is like just a test URL, essentially. It will print out the IP address that it got from doing that DNS lookup. It will text, it will fetch rather some text from this remote URL right here, which just happens to have some text on it. And then it will fetch some JSON from this remote URL right here, which happens to be a Bitcoin price API that has JSON data in it. It will print all of that stuff out and then it will say it's done. However, I don't necessarily care so much about the specific things that this is doing. Mostly what I am running this for is to determine if the current version of the library is working in my network environment or not. And so we care way more about like, did it succeed or did it fail than we do about the specific actual things that it's fetching and doing in this case. Yeah, the change in the PR is basically a refactoring of the state machine that handles the logic for DHCP, like when it gets its IP address the first time, when it does the renewals, just like all the code that handles that portion of the networking inside of here has been refactored with this PR. There are more details. It's kind of a long one, so I don't blame you if you don't necessarily want to read the entire thing, but there are some more details here about like the specific changes, which things changed, and stuff like that. And the idea is that it's a refactoring to just make the code easier to understand and maintain and potentially easier to test. On the topic of the automated testing, this refactoring could split out the components potentially to be easier to add those automated tests. I remember you talking about a project that, oh, let me catch up here, I missed this one. Today I got running a script on the Feather ESP32S2TFT displaying some virtual flight data nice. Got the heading and the altitude, which are broadcast by Flight Simulator X Plane 12 using UDP data grams. Nice. I had a similar script running on other devices quite some time ago on X, Plane 10, and 11, so a lot of alterations were needed. Yeah, that's really cool. Yeah, those flight simulators, I never have played too much with them, but I'm always fascinated by them, and I really love the folks who have like the setup that kind of makes it feel more like a cockpit, which it sounds like you're kind of adding screen outputs and stuff like that to kind of give it like the dashboard cockpit feel. So that's really cool. In your DVI Feathers and HDMI, oh, yeah, that's true. You could have like an in-dash cockpit screen or something. You spend some time today with analog circuits, particularly refreshing knowledge about different amplifiers with split gain and bias circuitry. Oh, wow. I don't even know anything about that stuff. Let's see, this used to be stuff I could do in my sleep once upon a time. Yeah, it's crazy like that. I got stuff like that, not those specific skills or knowledge or anything, but I definitely have stuff like that where it's like, I learned it and at one point it was just like automatic, I could do it, but I didn't practice and falls away. Larger screens for waypoints, maybe the altimeter. Yeah, that'd be cool. Um, which one is the tilty one that shows the angle? That might be a cool one as well. Could show the horizon line like at the certain angle or whatever. I feel like we could probably cut some of the in-betweens out. Let's look at what it actually did here. So it, so I do think maybe beginning, that's interesting, beginning to receive, but then it just goes to socket available and then it says receive zero bytes. It's like it's failing to receive the response for some reason. Okay. One thing I do recall from doing these tests before is that I think my device, sometimes it just needs to be unplugged, replugged, particularly when you've edited code pie, I feel like is the case. So we're gonna do that as well and get another log from a fresh boot. But actually real quick, I'm gonna go just timed out sleep like three at the very beginning. That way, when we reboot the device, it will wait three seconds before it actually does anything with the ethernet, which will give TO the serial terminal program here a time to reconnect so that we can actually make sure we see all the output. Okay, so I'm gonna unplug, replug. We'll take it a second, but then I should notice it reconnect and then we should start seeing the program run like this. Yeah, there we go. Okay, we'll just let this go, see if it gets anything different or if it does the same thing this time. Oh, I think it succeeded because some of that stuff was data, got actual responses this time. It did have to do a few retries, but then as part of them, it got actually some more data than it did last time. I wish we could convert this to not hex. How do we get this to be an IP address? Is that just like, well, but how would it know where the dots are at? Is that 174.61.51.152? We got IPv6. Is it possible to do v4 specifically or does this not say the IP? Doesn't it usually say the IP in here somewhere? I guess I could switch back to the currently released one and then I could run the code and we could see if we got the same value. Let me catch up also on the chat here. Let's see. Let me see. Altitude indicator. Barrow horizontal sounds like a cool project. Fumiguy, how do you know if it is a code issue since networks are often flaky? Very good question. I don't know for certain that it is, yeah, I don't know for certain that it is definitely a code issue. All I know is that the currently released library works more successfully on my network than the new one in the PR. It could very well be that my network is flaky and frankly it is very well the case that my network is a little bit flaky and just weird, honestly I think. It could be the case that the code should not necessarily handle it, but it is the case that the currently released one does. I will be totally upfront too. I don't really know that much about the particulars of DHCP or really any of that type of the nitty-gritty details of it. I definitely cannot say for certain one way or another that it is or isn't a code issue or anything else just weird with my network. I would say basically the highest level answer is just I'm not necessarily trying to be 100% sure if I know it's an issue with the code. Right now I'm just trying to collect the data, collect information, the logs in particular, and give them back to the person who's working on it because that person actually knows way way way more about it than I do. So I think they are in a much better position to be able to determine what the logs actually mean than I am. About DHCP from my project in the Xplain 11, I had to switch off DHCP in order to give that feather a static IP negative result is that King and Google results in error minus 2. Oh, that's interesting. It's an int. Okay. I think you meant the IP. Maybe, maybe not actually. Static is always better for stuff. I imagine the rig isn't portable so it doesn't need DHCP. Yeah, static is nice also if you want like other stuff to hit a server on that device or whatever because then you can just hard code the IP that you gave it. Sometimes that might be counterintuitive. That's definitely true to try developer nuts trying to do the network. Double shooting. Yeah, then had to change the IP that it broadcasts to. Yeah, static is really good for that. That way it will always stay on the same IP that you can hard code. Yeah, I've come a long way, certainly. I still definitely defer to the expertise of Biffle Bear and other folks for sure. So I really thought this told you the IP address. Does that not? How can I find the IP address of a site like I've been to here before, but I do not recall this at all. Big server name type. And those look like IP addresses. That's definitely different. That a decimal is just a convenient way to display a 32 bit int. How do you know what the IP is though? Like from this, is this saying essentially, is this saying this would be the IP? Do I still need to be doing some kind of conversion on that in order to get from the full plain number to the dotted one? Let's see if we get the same thing to redo it. Save that. Let's see here. You can use NS lookup or dig. Yeah, thank you. Dig I did end up with. I'll have to learn NS lookup, but I'm not familiar with that one. That sounds helpful as well. XIPV4, each two nibbles is one. Okay, so yeah, yeah, we need to convert those differently than I actually did. Shame that one place where it printed it didn't print converted one. Honestly, though, it would have been super handy. Is there a I mean, is there a tool online? That'd be nice not to do it by hand. Gotta love random JavaScript pages that just do conversions for you when you're feeling lazy. That is the same, I think, right? Okay. Yeah, there's two. I don't know why there's a, I guess, I don't know what that's about. There's two, but this is one of them. So enough for me. So it did succeed to get the DNS lookup. I think it did then go on to fail doing the actual requests. Because it never did print like the text that's on that HTML page that it loads or I think it has HTML in the file, but it's actually just plain text. And it never printed the Bitcoin thing either. It did get the DNS lookup, which is farther than the one before it got. And then the new one, I think, failed the same way as the first one, which is that it did not get, it did not succeed the DNS lookup. If it retried, how many times it retries, and then it just failed. Or then it, you know, just accepted that it failed, I should say it failed every time it retried and then gave up. So that's basically the same as this. So I don't think we need to copy that in again. I'm curious, I'm going to do one more. Whoa, what I did. I don't know where those equal signs came from. Paste mode. Is it control E? I think I've learned about that before. I don't know what it does. I should say I think I have learned of its existence before. I don't think I ever learned what it does. Thank you, by the way, and data, or help on the IPs. You can split the split into four pairs of hex and then convert those one by one. Yep. In Google.com should work too. I did do a ping, but it showed me IPv6 instead of v4. I don't know if there's like, does ping, is there a command you can like an argument that you can use to force it to do IPv4 maybe? I think about CDNs as they can change. Yeah. No, I don't necessarily need to know the IP like for any length of time. I mostly just wanted to see was the number that the feather got the same as the number that my PC got right now. It could change tomorrow. It could change an hour from now. It could change anytime, but it just right now I was interested that it get the same answer and it did. It seems like it was hex. Didn't quite convert it yet, but it did have the same answer. So now we did fail to the same thing. So I'm going to try an unplug replug again. My hypothesis is I'm thinking we probably come back up and we probably get the same partial success. That's kind of what I think will happen because that's what happened last time I did an unplug replug. So let's give it a try. Maybe it'll get farther. That'd be cool. Maybe not. Maybe we'll do the same. If it does do the same, then I think we are ready. I will basically just take the two logs that ended up being relevant. The unplugged log was on me. I just had it unplugged. So that one doesn't matter. But I'll take the two other logs, the one sort of partial success and the one failed after three retries and we'll upload those in the PR for Biffle Bear to look at. Yeah. This time we got the same thing. We made it to the exact same spot it looks like. We did get our own IP successfully. We did technically we did successfully complete the DNS lookup although we didn't convert it yet. That's fine. Then on the next line of code or whatever, wherever this is at, that's where we failed and that's the same error that we got last time. So it seems like right now the state that we're in with my device and my network with this version of the library is on a fresh boot up. We can get to this where it has a partial success. But then if we reset after that, we get to try, I think it's three times and then failed and we can keep resetting and we would keep staying on tried three times and refailed. But we can unplug, re-plug in order to get back to the partial success. I did do one more reset here just to try to validate that a bit further. As somebody mentioned earlier, networks are flaky. It's kind of, it's hard to trust that what you're seeing is actually consistent. I think we've seen it maybe three or four times at this point. So we're on the track to consistency, but networks have a funny way of making you think stuff is consistent and then showing you later that it's not. Control E pacemode. Pacemode is multi-aligned for indents, so they won't mess up a control C to get back out. That must be what I did. I think I was, I think I pressed control D, but I fat fingered the E. You know what else is interesting in the partial successes? I feel like it's doing the retries. Maybe it's not though. Maybe I just interpreted what it said. Yeah, no, here's one where it did a retry. But I feel like the retries, they either fail or succeed so much faster, right? Like this one we failed after three retries, and these strings of these long things are much longer than the strings that we got on the partial success. Like this one was our fail and then retry. Whereas in these we are getting like hundreds of lines. Feels like, oh maybe not hundreds, I don't know. Just tell me how many lines. Not really. Copy it. It doesn't really matter the exact number though. It feels like more. I think it is more. Okay, I will say also not only hug report to anecdote for, I think David also maybe said too about converting those text things, but also I should say hug report to rouserling.com who has a script converter for us to use so we don't have to do it manually, which is super nice. Some of that might have to do with DHCP reservation. The router will actually reserve it NIP for a certain amount of time. That is true, but I think it's not, I mean, I think the reservation should be staying the same in between my two different trials here. If I was testing like over a day or two or something, definitely I think it could be changing. Like maybe it would get a different IP or maybe it would have to like explicitly renew or something rather than just still having it. In my case though, I'm pretty sure that it's like always ending up on the same one and I don't necessarily think there is anything on that side that would account for the difference in how long it takes to fail because it's like it's always getting these zero bytes. We'll just see if zero bytes there. It could be though, like I said earlier too, like I do not know, I do not know all of the specifics of the DHCP process and all this stuff. It's all like basically a black box to me pretty much honestly. Can I spudge the MAC address? Oh, that's a good point too. Yeah, I could change, yeah, that's true. I could change the MAC address and then it would get a different IP. Then we could force it to basically be treated as a new one. That is a good point, yeah. Correction, pings not working. Nice. It's always happy. You find something you think was not working and then give it a try a little later. Is it Half-Life? You'll Half-Life, source mod. I have an Ethernet feathering at home because of you. Since it's a few weeks, I soldered it and it's next to a feather doubler but I have not powered it on yet nor connected the cable. Nice. Ethernet's pretty handy honestly. I do work with Android devices and I'm always trying to lobby for people to use Ethernet instead of Wi-Fi. Devices we use support Wi-Fi but I'm always telling people that Ethernet is a lot more reliable because you can see like our system allows me to see when the devices are online and offline and you can just see like looking at that history chart. You can just see the Wi-Fi ones spend a lot more time offline than the Ethernet ones. Ethernet ones are like solid green all day every day. They're offline for like 30 seconds while it reboots whereas Wi-Fi ones are just like every few minutes or every few hours they pop off and then back on. My network does that on some of these devices as well which is where I was saying earlier my network is definitely a bit on the flaky side I think. That makes it good for testing actually though because it's like whatever weirdness is going on is super weird and if we make our code handle it then surely we'll be good for less weird stuff too. Okay, I think we're good on that. We're going to circle back to Steam API hug reports to DJ Devin on this one. This is a new example in the request library which prints out the number of time I think is it hours or minutes? I don't recall the units but it prints out the number of time that you oh both actually looks like well no hours days and then monotonic I guess would be seconds maybe or I'm not sure what the monotonic. Well maybe that's probably just current time actually time dot monotonic that's probably just current time but it prints out the amount of time that you have been playing games that are inside Steam so fair warning before I run this my number is kind of large so just be aware don't be shocked make sure you're seated and ready for whatever number comes out of this also in defense of myself at least one of the games that I have played through Steam I have left running idle like let it run while I was not actively sitting at the computer or many hours sometimes days on end which also artificially increased the number of hours that I've played so just keep in mind whatever number we see going to be kind of large that doesn't mean I literally spend my entire life playing video games but I do like video games and video games do make me happy I will say video games I would say are definitely my like my unwinding activity like get my get my mind off of work or just chill out for a little bit to relax like video games are definitely that for me lots of different ones I think if we I don't know if I have the remote on this one I love the back pedaling yeah I saw this topic was testing related how to show up how's going as Patrick nice to see you my friend we need TLS HTTPS on the ethernet I would agree that'd be super cool it'd be super cool oh nice there's your the heading from the flight simulator that's awesome I love using the feather I love using these tft feathers as like little quick dirty kind of HUD output for other stuff I was using it for that on the the sequencer as well that DJ Devon made I just tacked on one of those feather tfts to be kind of like a external ish display for that system like it was external in that it was a its own microcontroller but I just set it right alongside it was hardwired and everything so I don't know if this is gonna update though yeah it's not gonna update I so this is what I was talking about before when we don't have a remote or whatever uh in in the get repo like technically the branch we're on I guess doesn't have a remote which is weird because it knows DJ Devon 3 so like it like it kind of knows the remote but not enough to actually pull so we're gonna go ghpr list we're gonna go ghpr checkout 129 if I recall correctly I did test this out before I think all we're looking for on this one was some see the documents like the comments to update if I recall right I think that's all I said before right code and functionality look good be nice to have yeah comment about the steam api key the user account so we'll check on those and then we'll rerun it kind of to have our socks blown off by the number in grls yeah that's true it's fine sometimes though where you go to the page and it's changes over time pilot black I think you got it figured out eventually though yeah the dollar amount would also be scary for sure okay so this ghpr checkout that will update it right it doesn't matter that it doesn't have a remote or whatever this is still able to update it it's cool yeah this tells us where to get these things now um release comes from all right steam id steam api key okay cool use your number look on the profile will be in the browser url oh I accidentally left the scrolled one second having other projects take priority has some other soldering to do I guess because who first or days yes monotonic is the board time okay I'll protest too much maybe a little so that the callbacks so the callbacks I know are on different times oh I see yeah that's a good point yeah have it print the current time so you know it actually did something this time what I like about the tft feathers has enough memory space that's true yeah it does that thing does have a a huge memory footprint compared to some of the others that's true I was pleasantly surprised by that when we were doing some of the some of the flip clock stuff I was able to do some like really large sprite sheets check and hang around a bit longer but I have to go now thanks to him good night all yep take it easy Dave Odessa we'll see you next time hope you have a nice night and a nice weekend and all that I copied this but never actually put it in the browser here and then you like I'd have to log in which I'm okay I'm actually logged in and leave that paused my music at the exact same time it's really weird because it was unrelated but there we are and then the number is up here so yeah hopefully nobody is gonna do anything to nefarious with my steam number API key we don't want to show on the stream though so I won't show that one I will open this URL check that's the page where it's at but I'm gonna do that over here in case it does show which it does so I'm glad I did that perfect my user number is not that did you click um maybe it's to do with profile private would be my only guess try okay yeah yeah try that go so go to just the base one steam community com without the slash anything so just the base one by itself and then click on the drop down here so you have to be you do have to be logged in for that mine I think was already logged in even though it didn't show it at first but it auto did it without me actually putting it in afterwards then click view profile here that is when mine redirects to slash profile slash and then that id there is the number this is interesting though yours is steam community so it's like slash it's basically the string one instead of the id one it's kind of interesting I assume you could do that with all of them right oh no not me for some reason weird insults oh there's a thing where it can be named instead of a number that's it in the URL ah I did not know then how to do it that way I've never done that you could try just putting the name instead of the number there I don't know for sure if that will work though that depends on the IP I gotcha if you happen to find it uh would you drop a comment in like an issue on this because it'd be great to put a different like wherever it can show up I don't know what other what other places it could be oh that's weird okay fine currently we were logged in currently we've been logged in long enough I don't know which we back out for some reason if you happen to find it though if you leave a comment we can add it as a we can add it as another comment here for now though I think I mean this is I think fine to keep in and leave as what we have for now because if you have not done that conversion to make it a string instead of a number then this will be at least how you find it which is better than nothing did this page let me look at this page does this page have a number that would be kind of convenient if it did but I don't I don't actually think it did just the API key I don't know why they make the API need the number I mean maybe it works with the name too though that's the other thing I did not try with foamy guy or with anything other than the number I only went and found the number and tried that okay yeah I think those are both good one thing I do need to do though is I need to check my settings file which I need to do over here I don't have a settings file it's weird I guess yeah I guess previously I was just been testing out a different device unfortunately that means I need to create it and unfortunately I can't show it so you'll have to look at my other screen for a minute here show you this pirate settings toml I think is that right but yeah we can't really show you anything else really sit in here somewhere here a guide that shows like these are just key value just looking for slightly different things here pop out to its own window sure we're actually showing what I think we're shown which means I do actually need to get these again oh I just have quotes on the strings in this thing since I suppose I don't remember if I did this one as a string I guess probably right oh okay whoo just about loaded in the wrong browser okay save that close this this back into it back in here only 5300 hours it's not that many I don't know what you're talking about make a jump on the chat now because I had the uh settings toml on top of this different methods the api url would be different I gotcha seems like if you're advanced enough to personalize url you could probably find the id yeah I would hope so I'll say the steam is like some of the steam pages get pretty gnarly sometimes kind of an external page that got it nice so there must be like an api that's a lookup uh that will take the username as input and then give you back the number and that that extra page must be using it I'm guessing the thing in the steam interface steamfinder.com nice this was the username is unique it can oh okay the you the usernames aren't unique I did not know that I guess that makes sense though I don't know if it's anywhere in the normal UI maybe in the pref tab okay yeah that seems good to me and we can always update it later on if we find a like another place to find it or if there is in like extra credit super awesome would be update it to where it can do either but it would have to know the other api and it would have to you know parse the response differently or whatever it needs to do so it's like that's definitely definitely not required that'd be pretty sweet but I think what we got now is definitely better than what we got before and that is what we're after yeah no I wouldn't it's definitely not secret not definitely not like the api key I mean it is literally I think just an id to the database honestly um just the number that represents your account got the hiccups whoa I don't know where the d went for some reason it stuck with the j and dj Devin and then moved it to j edgars on it like jp I'm pretty sure I did dj so I don't know where oh I threw away the d the d there uh let's see I think that is gonna be a minor one right because this does not change functionality at all it's no new features it's just a new example so the the library code itself did not change at all only the examples so we're gonna go 113.1 which will be a minor release number above the last one steam api example 113.0 113.1 originally had both uh but also means adding both the username and user number in settings toml I mean it could be technically either one it could check for them or something it does get more complex at that point though for sure I don't know I think as long as it's out there somewhere as long as there's like like maybe we could I don't I don't know I do I do hesitate a little bit to point to that third party that steam finder or whatever you might definder I hesitate a little bit to point to that but I mean maybe we could I like that might be nice I don't know though to the truth be told though I like even if these instructions do not work for 100 of everybody like I said before I think having something that works for some people is better than nothing that works for no one so I think we're at a good state now and we can always improve into the future if we want to so this one I'm just gonna test again the uh functionality and then I'm pretty sure everything else is all set if I recall right and approved I think let's just double check changes I'm pretty sure though like changing x zero yeah so those are x y there and they're x y there yeah that was the main thing I might have been the only thing actually I asked for in my review at least yeah I was talking about this that turned out not to be related oh oh yeah that's the same thing though and then I just commented on this one is this one does not belong to a branch oh I do think actually we can there's one more change maybe we should make I think there's a I think there might be a better way to do these checks here um MP arg validate MP arg validate something we used it on the on the args display args validation PR that I was just getting into like a couple weeks back and I was like it the functionality is the same the functionality does not change here the thing that makes these ones better is that they have their own built-in error messages and the reason why that's advantageous is because so like this right here there's two different strings here right like this is a string technically this is the the same string I don't know how that works if they're duplications um so we'll call this two different strings I know there's actually three here I'm not sure if the third one counts or not since it's actually the same as this but even with the two different strings what this means is that this string has to exist and get translated inside circuit python so then ideally we have the english one here we would also have all the other languages by the time it gets translated and then we have to have the same thing for this string also but if you use this um if you use this other thing where's the one yeah you use this other thing it has its own kind of built-in error message to where we don't have to spend any extra space um inside the core we don't have to spend any extra space to store those additional strings which does actually like on a few of the smaller builds that does actually make a difference because there's a couple that are I think pretty close to the line I suspect most people don't have custom I don't even know if it's a feature that's offered still that's a good question I don't know I had never seen it uh never seen it do that before it's interesting that they would have offered that too though because it's like it always had a username right like my I've always had you know username foamy guy just also has the idea associated with it it's interesting they allowed you to like kind of use either or if you did that like someone knows they need to find their number they can find it yeah uh okay so basically this the the other thing that's nice about it which it doesn't really matter that much but it is nice because what you can do is you can take this entire if statement which is three lines of code you can actually get it down to only a single line of code I know lines of code is not the end all be all or whatever right um but in this case it does actually collapse which also ends up saving a bit of space I think in the core and so this one is saying is it between zero and the destination width this one is saying is it uh is it between zero and destination height and this one is saying is the radius greater than zero why do I keep losing the tab I was just looking at so there's validate range and there's also validate int min which you can do to do like minimum zero or minimum one or whatever we will to I'll test this out again still though just the url it's like saying I own the username not steel trademark trademark to my steam name let's see oh circle bitmap 7782 I think we might as well just build for the same device we have uh hopefully we don't run into any issues all right dot space enough okay ready um okay uh brb unfortunately I'm not gonna make it for another 30 to 40 minutes I gotta run to the restroom and then I'll be right back and we'll do this build so brb okay we are back and I will say fair warning before we start doing builds of circ python and stuff I have been fighting against some computer trouble and unfortunately the kind of computer trouble that it is sometimes leads to my computer freezing which if it freezes during a live stream that means that the live stream will also cut out and become frozen or broken in some way uh so we are gonna try to make some builds I'm gonna hope that we either just don't run into the problem or if we do run into the problem it's not bad enough to actually freeze the whole computer hopefully it will just maybe print out an error message or something and in that case we can just try again so fingers crossed uh do whatever you like to do for good luck uh wish me some luck and we're gonna try to make some builds and as long as my computer wants to cooperate then the stream will keep going and we'll all be good but if I do disappear just know that's probably what happened especially if I like start making a build and then it's working for a few seconds and then like suddenly everything cuts out probably what happened is my computer froze and uh in that case I'll try to get it rebooted and get everything back up and running and try to come back uh for the rest of the stream but it might take me a few minutes obviously to get back up and running so again fingers crossed hopefully that's not gonna be a problem we're gonna run into but just in case we do I want to mention it so that you guys know if I do cut out that's probably why I should I should well no we're probably not allowed to use that music are we I say that'd be pretty funny to put that as the stream music but should we do clean I don't know if the last build I would made would have been for this or not I don't know if it matters that much either truthfully wait wait wait wait wait wait this didn't check out did not check out did this not check out filter and get x to status one does that mean rejected I'm just gonna delete this I guess okay fair enough did not like for whatever reason it didn't want to go back to that branch that existed we had to delete it and then we could get to there so is that it's gonna have the newest stuff though took for one of the latest things so the one thing that's in the latest one is x y as the argument names instead of x1 y1 but that's gonna be shared bindings that map tools circle yep yep yep x y x y x y no zeros they used to be x zero y zero okay so we're definitely on the latest version okay definitely got our update I copy paste something else probably right fingers crossed I'm like legitimately keeping my fingers crossed the entire time this build runs I feel like it used to output more stuff I wonder what's because another thing is honestly like it usually revs the system enough that I can also hear the fans it's going just oh you know I have the actual fan in the room on which is adding like white noise that's why I didn't hear the fans rev up actually a little bit louder than normal well really normal just than it is without the other fan on and today is the only day that's been warm enough to turn on the room fan in like several months anyway we got a successful build it didn't crash it didn't freeze we didn't get any segmentation faults it worked fingers crossed thank you to everybody who did their own little good luck charm because we made it through and I am convinced it's because of all of you we want to go to the bootloader mode we want to copy this firmware which we just created cp build whoa whoa whoa whoa whoa let's see other boots okay I think I yeah I kind of do like it in the in the settings toml as well personally I'd probably leave it there since you have to get the api token as well and the api token definitely should be in the settings toml and then if you're going to get two things I think it makes the most sense to put those two things in the same place the string like it wouldn't be worse really but I think the consistency is nice you know we'll just copy paste them both into that same spot okay uh this ran this printed which means we're back up and running we will close out of this we will take this let's just go for now print this let's just do something like that should just print yeah very good map circle so then what do we have in here so far this is uh drawing a circle in particular right now it's halfway off the edge one edge I don't know the left edge maybe is that covering the code kind of how should I go the other I should probably go the other way right is this better yeah not really I guess if we do that I gotta remember the right edge I have to remember to pull stuff further to the left it's better like that though I will say okay says use build verbose to output everything yeah I did v1 um instead of v2 which is less than v2 I think I just feel like it I print as much so it's used to it also it seemed to wait for a while before it started to but I don't know takes it a takes it a minute I've gotten a little a little spoiled by how fast this computer does do things sometimes oh out of range of target out of range of target that's from the new check though yeah because it's less than zero now doesn't mean you can't draw them on the edge you did used to be able to I think I could be misremembering I'm pretty sure we did have this one drawing on the edge though get it back to the center radius I don't want that big just do 30 there we go oh I was like why is that not in the middle why right there though okay you know what's interesting though in the picture how does I post a picture with oh I don't know why though it's because you can you can still draw it okay you can still draw it halfway off what you can't do that you used to be able to is you can't draw it uh you can't draw it like either less than yeah less than I think you can't draw it less than half off you used to be able to scoot it further out so that it would be like less than half of the circle showing so this is showing like a little bit more than half and you could basically get it to the exact zero but what you can't do is go negative anymore which would have allowed you to push it even further outside the bounds which would have had the effect of basically taking that circle and pushing it further off of the screen so you say you could go like one here and then this would scoot it one more pixel down in this orientation but it's obviously left in the orientation that it's actually working in okay that's how those ones got to the edge fair enough I would have been fine with allowing them to draw outside um but I'm also fine with not allowing them to draw outside I don't I don't feel super strongly either way keep it as this thank you just my settings are starting to get larger with every api yeah that's true I use them all in one project it's a weird page it doesn't have conversation let's draw a few more oh I don't did I did we ever do a fill near the edge I don't recall if I did or not so I'm just gonna go like two four three if that works it's gonna draw two which is green as the outline and then it's gonna fill it with three which is nice it does work even though it's on the edge okay I wasn't sure if the fill would uh be happy with the edge there looks like it is so let's do a couple more circles I don't this one might need to be minus one I'm not sure out of range yeah I think tiled well I think he just had a for loop that drew it a bunch of times didn't actually look at the code super close yeah yeah it just has a for loop that's kind of looping over the pixels in the screen okay so we do have two greens a blue and a yellow right now which makes sense because we have two of them on two which was green four must be yellow indeed okay yeah it's looking pretty good to me oh my gosh so many browser windows oh camera just died hop down camera hasn't been able to draw things off the screen useful am I misunderstanding I mean you can still draw it part way off the screen and I would say like yes I think it can be useful um yeah you and you can still go halfway you just used to be able to draw it a little bit further off the screen than you can now and I like I said before I don't necessarily have a super strong preference with regards to that it is an open pr though if anybody who's watching does have a super strong preference you could leave some comments in the pr um focus where is the camera I want to word this are you kidding me right now seriously it played a commercial and then immediately after the commercial that's when it chose to say like are you still watching I'm gonna do that before the commercial be serious is this gonna show all three lines I don't know you should probably just do the top one maybe the middle one I guess instead also replaces this line actually this one's slightly different instead of validate range it's validate minimum or something I catch up when I add some inline comments to color values so you don't have to guess or they could be variable names um yeah if it were anything more than a super duper basic example I would probably do something like make variables like like this and then these basically represent the indexes here and then you would be able to use it like like this and then you would get the right color out of it um it would make the code more clear but it's only 30 lines of super duper basic sample code honestly we don't even need all the colors I could have gotten by with only one or two colors I just made extras for some reason I don't even really know why we're handy when using scale for moving objects slowly past the screen edge yeah it's definitely really good for like um that sort of like sliding animation if you want to make it like fly on the screen or something uh just popping them if they're gonna be off screen preferable well so with bitmap tools with the thing that we're doing here it's important to understand these circles they there's not an object that represents this circle the the bitmap that this is inside of is this bitmap and it is the entire size of the display um so the bitmap is this entire whole rectangle here and these circles that are drawn within it just represent pixels inside that bitmap right inside that two-dimensional array of indexes we have filled in the indexes to make these circles is this live it's not it died again uh we have filled in the indexes to make these circles but it's important to understand too we don't have objects so after we call draw circle like this we cannot do anything like circle dot x you know equals circle dot x plus 10 or whatever right like we don't have it this object doesn't exist for us to manipulate after the fact if we did for instance want to try to move this circle we would need to draw over it wherever it's at back to the background color and then we would need to draw a new one at a different location and then like visually to the user that would appear as though the circle moved but technically what happened is the old circle got covered with the background color and the new circle got drawn in the new location but yeah that's that's one of the things that's like fundamentally different about this bitmap tools here is that we're simply the way I think of it is like we're simply stamping a you know stamping a stamp inside the bitmap like we stamp it there and then like once it's in there there's no object that represents just that part we stamped we have only the full bitmap and it now has different pixels in it but there's not an object that represents just that thing we stamped after you call this it is in there and you don't really have a way of like referencing it anymore as its own circle yeah vector IO would make it an object also the these shapes library would make it an object as well and it's just different use cases I think I think all all of the different possible use cases have upsides and downsides and there's situations where I would grab different uh different solutions in order to fit with the scenario that it's in creating a bitmap yeah we're creating yep just the full screen bitmap and then we're like what I like I think of it as we're stamping these circles inside of it almost like the turtle library in a way yep yeah a little bit different than that one okay did I oh my god the browser one does again full screen bitmap is a neat idea yeah it it can be so some some divide like you know the pipe world titano or some of these devices with the huge screens it's not always as good to have that full screen bitmap and memory sometimes it will eat up all your available ram that's the other nice thing though about these tfts is they have a crapload of ram they also have a relatively small screen um this one's got a cat hair on it they have a relatively small screen though so that especially I thought I died again I was like are you serious especially in relation to the amount of ram they have they can hold honestly I think they could hold a couple of times over bitmaps of the entire screen have a lot of ram actually kind of crazy honestly those are the ones that I had in mind I don't actually have any others we made it through all the ones that I had in mind ethernet steam api draw circle we do only have a few minutes left I was interested by this one I don't really know what it does though why did line go away that seems weird I don't really know how ducky works I've never played with ducky ah sadness no cipher okay seems like a good thing to trademark to me but in my business bash bunny oh yeah I was hoping for like a bit of a higher level like what is this thing I know generally speaking it's like a keyboard spoofing thing but that is about the extent of what I know about it 80 dollars I definitely see why people want to use micro controllers for that okay so the hardware is it's a physical device they released a physical device but that device has software on it that allows it to consume these basic like almost bash or batch file type things basically so I assume it it can do things like I assume check for buttons like in this case it could know when these buttons are pressed and it could send whatever other keyboard commands when that happens definitely second this do anything illegal okay so then this pr now is you write the loop to be non-blocking curious about line though should line have disappeared oop line getting line in here now the examples look like you already I well I guess probably yes right it's called loop surely it's already calling that inside the loop yeah okay fair enough I was gonna say like that's kind of an extreme change to the api if you didn't used to have to call this but you do it is actually still calling it there so loop actually it doesn't really change the api at all my gosh seriously here I've been here the whole time I feel like I get like a song and a half before it's like are you still there it's crazy would this matter that this used to be our strip and it now is not our strip and also could it matter that this used to not have a space but now it does don't know we'll have to try this out let me catch up over here use this I'm moving pretty far behind here actually since keys let me yeah sorry yeah thank you it looks like folks were actually answering my questions as well uh I never thought I'd ever need to use a csv library and that available made my life so much easier better to have more tools than that enough for sure but that will definitely agree to that with a great tool and circuit python arsenal since keys according to the ducky stripped started out using 3.5 feather wing for the nrf oh yeah yeah you would have been pretty you would have been really tight on ram i assume then yeah get their own format ducky script a lot of renewed interest in ducky again probably because the chips become available that could be a case of big influx of people asking about it 1.5 years ago when a youtuber made a video about pico ducky people asking for non-us keyboards that's why i got involved near doc near doc is the king of uh non-us keyboard layouts pointed countless people towards that repo i don't even know how many people have pointed there if you already it's one of the more common questions i would say especially during that period when the ducky did get popular when the pico came out or that video around it i do recall that picking up quite a bit around then as far as like that was like i almost once a day or something we were helping point somebody there at that time okay yep yeah because by default it does us layout only but near doc has expanded all right i think we're gonna call it there i will test this out later on um i might try this tomorrow morning or i might get into some other stuff i got some other stuff in mind that i kind of want to tinker with as well so maybe we'll do that but it'll kind of depend on how i feel in the morning truthfully so if you are interested in more content like this you can find some more tomorrow morning at 10 a.m central time i'll be back i'll be on my own channel instead of the ate a fruit channel but other than that it's pretty much the same it'll be me here working on circuit python stuff pretty similar to how i was doing today so that'll be tomorrow morning at 10 a.m central time if you want to watch that you can either follow me on twitch uh foamy guy underscore twitch or you can uh follow me on youtube as well if you want i think it's just youtube foamy guy honestly i'm not 100% sure on the youtube one though um either way i'll say i drop links in the live broadcast chat so if you don't want to follow me that's totally cool as well but you do want to watch along just head back to the live broadcast chat on the discord in the morning around 10 a.m central time i'll drop the links right in there uh and you can follow them and watch along also pico ducky uh added the web ui oh that's pretty sweet able to modify your uh script through the web interface i assume um so yep i'll be back in the morning uh we'll be working on some more fun stuff i hope everybody has a good night tonight and a good rest of your weekend thanks again to uh anecdote and your doc everybody who helped me out um earlier with the hex and i'm sure i'm forgetting some other stuff as well got help from a couple of folks during the stream so definitely appreciate all of you appreciate everyone that's watching