 All right. Hello, everyone. Happy Friday. Let's get a few things set here I did click the YouTube go live thing this time, so we will not have that problem this week Let me Ruffle around the chats here probably Don't need this preview How's it going Beata? Happy Friday and Dave Odessa. I forget about the YouTube. Yes. Thank you I believe I got the YouTube set. We are live. Thank you. How's it going to Shippu? I hope everyone's Friday is going well. Yep Doing pretty well for for my Friday and definitely echoing what Keith says. Hoping everybody's having a good day All right, I think we are ready. Let's get going Let me actually put this one just in the back, but stop the That's not what we want Stop the preview Okay, and we got the screen upright. Yeah, okay So let's see. I don't actually have browser open already These was a browser is that? There it is All right. So hello everyone My name is Tim and I go by a foamy guy on github and discord This is the deep dive program in this program. We are looking at Circuit Python specifically we're looking at kind of the nitty-gritty Down inside a circuit Python either in the core or working with projects or libraries or infrastructure stuff all that kind of stuff if You are new to this though, and you don't know what circuit Python is you learn more at circuitpython.org This is the website for it right here It is basically an implementation of Python that runs on tiny computers called microcontrollers There's a bunch of pictures of those over here on the downloads page at circuitpython.org So like this main little black chip here, this is the microcontroller This is sort of a tiny computer that runs on this little Computer board and it's got all these different pins broken out And we are writing Python code that runs on this little computer and interacts with these pins You know generally connected to some sort of hardware Although what you'll see on this page is that there are many different shapes and sizes of these little microcontroller tiny computers, so some of them have stuff built in like keys and screens and knobs Screens, you know touch screens and things like that alligator clips RGB LEDs speakers Different ones have different stuff built in but the common thread amongst them is that all 349 devices on this page can run circuitpython And so we can write that Python code save it onto there Just like a thumb drive and it will execute the code for us So that's a high level look at what we're doing Circuitpython is an open source project So you can get involved if you're interested I would encourage you to join us on the discord As well as github all of the development takes place out in the open on github And we coordinate through the discord. There's weekly meetings and other Discussions that take place on discord all about the circuitpython Ecosystem so get involved there if you're interested It's an open source project, but it is primarily funded by this company Adafruit. This is their website adafruit.com So they are paying the folks who work on circuitpython The core team that works on the project full-time as well as some folks like me who work on the project part-time So thank you to them and thank you to anybody who wants to purchase hardware from them Because doing so you know helps pay the bills helps support circuitpython development They sell the microcontrollers themselves as well as all kinds of things that you can hook up to the microcontrollers Um to interact with so a couple of the things that I've got my eye on That are the the new releases are displays. I'm always a sucker for displays So there's a nice little square display here that has the new Ribbon cable connector on it to make it easy to build into a project and not need a bunch of extra Wires, so that's something that I have got my eye on But they've got all kinds of different stuff that you can hook up and do with your microcontroller As well as many of the different microcontrollers themselves that you can purchase from their website there Jumping into today's stuff what I want to look at is a core display ios stuff Um last week we worked on vector io and That pr is merged now. So the stuff that we worked on last week is now inside Circuitpython main. Um, I don't think there has been a release yet. Um, So it's not like in the one that you will download So you'd have to build from main if you want to get it But that stuff is now in and the next thing that i'm working on inside the core is Uh is actually an idea. I think to shippu raised this idea during the meeting was about changing the Display.show API to instead be a property where you would set The group that you want to display on it. So let me pull up the issue for that and then we can see What we are talking about or I actually have made the draft pr at this point. So I'll go there Um, and then this it should link to this issue which really explains the core idea here Which is that we used to well currently we do we have this function called display.show You pass it a group and it will put that group onto the display for you The idea is to change that up potentially to instead have a property Called like root group. So you know display root group and then you're setting a group On to that property, you know, you're setting a value into that property rather than Calling a function and passing a group to it Um So that's kind of like the the You know the core idea the change the idea is this is supposed to help make it more clear what's going on Sometimes we see people reporting issues with their code and they have called show a bunch of times In the main loop or something like that expecting that that's like going to refresh the screen or something Um typically you only need to call show once unless you're like trying to show a different group You could you know, you could structure your program where you create multiple groups and then You know show one and then change to show another one and then change to show another one That would be perfectly legit. You could do that You could also just show one group and hide and show, you know hide and Reveal things within that group that that would be another way you could do it without having to call show again Anyway, though the point is like we try to tend towards properties when We have this idea of kind of like setting a thing into something so making this a property We think maybe will help make it more clear that you're not necessarily intended to just have to keep recalling it Inside the main loop or something like that So that is the change i'm working on and specifically I actually have a good chunk of it done. Let me get my device powered on and going here We can actually get the camera set up as well um Because i've got the most basic part of this functional. Uh, what is left to do is a little bit of cleanup and Some testing to make sure that We didn't break anything and also to make sure that the that the broken cases the cases that shouldn't work um Still don't work or you know, don't do anything weird So let's see. Hmm. No display show. How would that change display? I go for blinka. And what about the java script port? uh, I Do not know anything about a java script port So I can't necessarily answer that one um Unless if you mean the walk the walk we thing I think is maybe got java script inside of it I'm not Not super familiar with the walk we thing, but I know it exists and it runs on a web page So it probably has some java script in it um What would it mean for blinka blinka what it would mean? I don't think it's been discussed, but my understanding is basically that would just mean We would make the same change in blinka display. Oh, so Inside blinka display. Oh today, we have uh, the same thing which we have in the core which would be display dot show Uh, we would change it Well, well and and so the way this is being discussed is Uh, in addition for circuit python 8 so the ability to set it as a property starting with circuit python 8 Uh, and then removing the show function as of like circuit python 9 so it won't be gone for a while Um, but it will eventually be a breaking change when that next major release comes out afterwards Um, and I would assume that that it basically means the same thing in blinka display. I oh We would basically add a property called root group that you're allowed to set um Instead of calling show We would migrate all the example code that exists to use that property instead of the show function And then come, you know down to line circuit python 9 or 10 or whatever when it actually gets removed Then it would also get removed in blinka display. Oh Um functionality wise it is basically the same you just would need to change your code Once it actually gets removed you would need to change your code from display dot show to You know display dot root group equals um Until it gets removed you could keep the display show But it's just kind of like deprecated will be removed eventually is the idea Uh, but that is actually a good question because yeah, we do need to consider blinka display I oh and we probably we would want to probably make that change at the same time like we would want It to become available as a property on both at the same time. I think Uh, which is a good point and we definitely want to remember to do that So thank you for asking actually because I had not I had not thought of blinka display. Oh yet. Um, so let's get the device. Do we have it here? I think is this running it's probably gonna crash when we load it maybe Yeah, for sure Uh question for your example of having multiple root groups that switch between scenes one and two etc We can just change the property. Yeah, that's that's correct Yep, you could just set the property to a new group. Um, and that would let you switch between different ones So if that's how you want to structure your, you know, your your program or your application where you have like, you know Let's say four different groups. I'm just making up a number. Um, you know, you have x different groups, you know Let's say four, uh, you can just set one of them onto the property and then change it out with another one Whenever you're ready. So, you know user goes through a menu or clicks a button or whatever and then you can just swap it to a different Um different group Let's see here We need to call a method to inform the code that there was a change. Nope, you just set the property and the code will Uh, it will know that it changed and it will update for you Yeah, good question. I can show you how that will work as well. In fact Uh, well right now it's a bit blurry. Maybe we can sharpen it up and then I can show you how that would work Where'd the camera go? Click the video mode Isn't it a new one? Isn't it a new one I see okay Oh boy, that's a lot of things There we go uh, so I have Funhouse Let's See what code's on here. If you have an example, that'd be amazing. Yeah for sure. So this code Uh, let's take this part out Let's take this part out E this part doesn't matter so much. We could keep it in. Um, we'll run this So let's go back to the camera Too many browser windows open today Um, so this code Let's see. I don't have one of the little wiper cloths here. Oh, well I tried to clean off my screen before especially with this example because this example draws like a little pixel somewhere It's kind of hard to see but it's right up in there Um, but this is you'll recognize this example if you have done the display.io Learn guide. This is basically just a basic display example. Well, I'll change it up here in a minute as well We'll make something slightly more functional but the code that's in here right now is Look up the display we're using a fun house So we're just using the built-in display on the board create a bitmap This bitmap is going to be the same height and width as the display itself And it's going to have room for two colors inside this bitmap We're going to then create a palette this palette is also going to have room for two colors We're going to set the first color to black. We're going to set the Second color, you know index is zero to black index one to white We're going to make a tile grid that has our bitmap which we created back here and our palette which we created right after it Now we have our tile grid We're going to create a main group which we will then you know show onto this display here in a little bit In fact, that's the next line of code right here So this is where in the current api for circuit python You would call display dot show in this future version that we're working on right here You would say display dot root group equals main group In this case, we then go append the tile grid to the root group So we created this tile grid here. We created this main group here. We want to get the tile grid onto the main group We have now set the main group as display dot root group So we can also access it from display root group, right? So we can access it here call append on it pass the tile grid So that we're going to add that tile grid into our main group Which is now visible on the display This one is painting that one single pixel that I told you about It's it is kind of hard to see but right up in there somewhere North of that smudge, there's a single pixel on This is that pixel And then there is the white rectangle right here And that white rectangle is made with these two four loops right here It's just looping through ranges of pixels and setting them to index one In this case, it just prints a thing and then that's all it does And it has a while true. So it will continue to show this forever and ever and ever So we see our little white rectangle. We see our very very faint single pixel there All that is good. Let's make a second group though and Switch to it so I can show you how we would do that. So let's say We were going to have secondary group is display Group so this is now another new group. It has nothing inside of it yet For what should we put inside of it? Maybe let's make a label Let's so we want to label we're going to have to go from Eight of fruit display text dot Bitmap label import label Uh, I think that's right. We'll see maybe I got it wrong. We'll see. Let's create a Secondary group label. I don't know. That's kind of wordy, isn't it? But that's all right label Label I think this is what font so terminal i o dot font Text equals Hello secondary New line group Let's go scale equals two Um, do we need anything else? Let's do a color. Uh, let's go color equals Oh, maybe green Yeah, let's start with that. We're gonna have to import terminal i o. So let's do that import terminal i o Now we're gonna go to our secondary group and we're gonna put the label onto it We're also gonna change the position of the label. So I'm gonna go secondary Group label dots. I'm gonna set it with the anchor point and anchored position Anchor point equals we're gonna do 0.5 0.5 we're gonna place it by its midpoint and then we're gonna go Anchored position equals Display width over two Display height over two Okay, so now we should have a label with some text in it Inside of our secondary group So now let's uh turn this back on maybe make it like five though instead And then let's go display Dot root group equals secondary group So now when this runs it will show the current thing the white box and the white pixel it will show that for five seconds And then this will happen and it should change to our secondary group if we've done everything correctly then we should see our label, um I don't know if we have done everything correctly Hopefully we have I'll I'll open to here. So if we haven't and it prints an error message We'll at least be able to see that And then we will try it out. So let's go. Oh, right. It's only one of these keys now. We've got to get used to that still Uh, so I'll this is the wrong thing though. This is yeah, there we go Save that That's running showing the white box in the pixel should be five seconds roughly and then it will hopefully change There we go a little secondary group Um And then now it's just going to loop forever. So it would just keep showing this one forever Um, we you could also go back and forth. So inside of here you could kind of do another thing like sleep another three seconds And then You know change it back, right or do whatever you want change it to a third one Change it back to the terminal. That's another thing that you're allowed to do So you could go main group and then you could go time dot sleep another three Secondary so you could swap back and forth like this You can really set it you you can set it as many times as you need and you can do the same thing with the show function today It's just that you don't have to and sometimes we see people doing it without meaning to really or or doing it without um Without the need group already used. Okay, so this is good. I think we Group already used line 59 Ah, you know, I think that's probably a bug. We need to when it gets set to something else. We probably need to um Group already used we probably need to somehow indicate that it's no longer used I'm I'm actually surprised we were allowed I'm surprised we were allowed to go back to main group Why is main group different? Because we were able to so we set it to main group the first time We were then able to change it to the secondary group and then we were Able to change it back to the main group, right? We got back to this We have five seconds of this Three seconds of this Three seconds of this so we're back to main group and then it crashes on this The second time it tries to use second secondary group Oh label label shoot Label yes, we want to set it to the group not the label of course now it should go back and forth Okay, three seconds on this one Back to this one Back to okay, and then it this should be able to just keep going back and forth forever Okay, yeah, gotta make sure to use the group not the label that one's on me How's it going evildave of canada? Hello over there in the youtube chat. Happy friday my friend Another thing that you can do is set it back to the terminal. So the default display in circuit python If you don't Show any other groups Will be what is called the circuit python terminal Which is where you can see stuff get printed like all that stuff that was printed on the screen there We only saw it for a second in that situation there, but that is the circuit python terminal In this case, we'll see it again after we loop through all the three of these and then it'll come up once each time in the cycle So this is the circuit python terminal here And you can also switch back to that as well. So you can go back and forth between um Your own stuff your own groups your own display IO objects and then that default terminal That just shows you the printouts when you're retired every day is friday nice. That sounds That does sound pretty nice. I do have that to look forward to Okay So all of that is actually working and to be honest with you. I am glad that we did try to put the label here because that Actually is good that actually tells us One of the things I wanted to test which was it should properly Raise an exception if you try to set it to a group that is already in a group And indeed that did happen because label Bitmap label in this case actually does extend group as well. I believe Does it maybe a dense tile grid and I think it's I believe it's group I think it's group okay So that is actually good and that was one of the things I wanted to test because one of the last things I did on this was based on feedback in the draft pr This is the issue let's go to the pr Is it maybe it's not or this is the No, this is the pr. Yeah move this to the internally Update the internal api to match the new way. So this is one of the last things I was working on on this effort And this is inside shared bindings display c and I To be honest, I don't actually remember exactly where I left it. Okay. That's actually right where we were here So and this is one thing that is different now is this used to get the boolean here and then raise the exception In fact, that's the exception we just saw but now that occurs Actually inside of this Which comes from Yes It does leave open the question though would we want to also change this to set root group? Because basically what we've done so far is just add the property of set root group But internally it still calls A method called show and this is essentially just moving it one layer deeper. It used to call show here I have now changed it based on the feedback to call set root group here, but set root group Inside of here ultimately does just call display core show So would we want to update this one too and where this one would be in Display core, which is its own weird thing Doesn't exist in shared bindings This is the show method in here I mean, there are setter methods in here. We could just We could just make this be set root group dash in That seems unlikely That looks a little better So this is used in a few places. It's used in Well, it's yeah, I know it's called here, which is shared module display see This is probably in the show method display dot show method, which still exists at this point Yeah If we changed the display core method, we would need to update it here 402 in the same file. That's our set root group. That's probably right where we just were Yeah Actually, this one is still calling show or oh, or this one is This one is the one that is calling show. Okay. This is like the internal one. So we would need to change it here as well ePaper display we would need to change it inside of there ePaper display. I had not actually looked at ePaper display at all I have any I don't know that I have an ePaper display No six I can't be right This bindings it's basically the same thing though. So I mean we could change We would change it there as well And then in display core, this is where it's defined. So this would be where we change it To necessitate needing to change it everywhere else And then one more in 64 on the h file It's just the declaration No Yes Not the wrong one though And then frame buffer display Here's that Oh frame buffer i o it's not in uh Not in display i o which means we can't actually see it. We probably get shared bindings also I don't know why it takes me off of that after I edit it 105 Like core show root group So it's not too many places. I do think I mean it probably makes sense to go ahead and rename all of the internal ones To set root group rather than like half which is kind of essentially what I have now like Right now everything up to the display core method Is set root group but then the core method is show But I think it makes sense to change the core method to set root group and then Everything all the way through will be set root group even If you looked at the code underneath display.show which will leave it intact for now That code will now say set root group inside of it internally here Yeah, okay, so let's try that uh display display core. So it's not going to be show anymore. It's going to be Set root group Basically going to need to change it in all of these places that we just went through Uh, unfortunately though, we just got to go back through them Be nice if I could click sometimes these are clickable right now is not one of those times though We could just we could copy the whole function though. We could do this. This would be quicker, I guess That's 402 actually. So we're going to go up to 144 in this file Here we're calling set root group and so this is display.show. So this will stay existing for now But eventually get removed That's those two e-paper display But actually I don't think I have any I have a raspberry pi e-paper display I think I have any others though. We have the raspberry pi one Yeah, I can use that that would be calling set root group 165 we did that one. I think or no, I did the h only I guess There it's set root group At that we got the h frame buffer display is the last one 105 I guess we probably would want to offer frame buffer display Having a set root group though And maybe e-paper display too, I guess, right? I have a gizmo, but it's not the one with E-ink These ones Do have refresh Just does it matter that may not matter though, right? I don't think anything else changes Yeah, we probably would want to change this too. I had not thought about e-paper or frame buffer displays But I assume we would want to change their api to match Quote-unquote what I'll call standard displays Um the ones like the built-in ones on the iPortal and fun house Oh, you know what I have with an e-paper display? I guess would be a mag tag Can I use? I could like release the display and then re-initialize it right to test if my new version works I think so, right? Uh, okay, so we should So I'll worry about adding a set root group to e-paper and frame by buffer io Later, but let's see we should why do we Why do we not did I did I save into this so I need to do this one? Yeah, okay So we should have no hits now. Yeah, we have no more of this. This is gone It's all set root group now. So let's try to make a build and see if it works. Um Actually do that over here make a build Not what do we Oh, oh, oh, oh, oh, we got to do a dot dot esp idf export Shall now we can make a build now we can cop. Oh, we need to go to bootloader remote on the device copy The thing we built to the device that nice smudge read at the perfect angle for seeing with this camera Okay, so it looks like it's working. I think if we had messed it up it would have failed already on this first one here So this is a good sign. Let's make sure it cycles through all of them correctly You can actually see the little pixel better. There's our terminal Oh Oh, it crashed When did it crash on? 59 Oh, I did it back to this. Uh, yeah, let's put it back to the code that doesn't crash Are there automated tests as part of the build process? Uh, there are not automated tests in the Sense that nothing is like Emulating a microcontroller and executing code on that microcontroller or or or just being a microcontroller, right? We don't have actual physical ones either Um, so nothing is like running code automatically on the microcontroller as part of the Uh, ci or anything like that There are automated tests that build circuit python, so Uh, if we were to go and actually push A commit so like here. I've got some changes I'm doing my changes whenever I'm done with them. I'm gonna commit them I'm gonna make a new commit and I'm gonna push it because The branch that I'm gonna push it to Is in a pr Already for the circuit python project as soon as I push it's gonna kick off the github actions to run Uh, and there are tests that will build circuit python for every single device we support Uh, so all 350 or whatever it was of those devices on the downloads page The actions will build A firmware for each one of them Um, it won't do anything with that firmware. I mean it will upload it Will provide it put it in a spot where you can go and download it later But like it won't install it to a device and do anything with it But it will at least make the build for each of them. So, um, kind of yes. Kind of no not automated testing in the traditional sense, but Not nothing either. Um, there is still a lot going on As part of our integration So this is this is happily cycling away. So I think we did not break anything. Which is good um I think we're almost ready. I guess One thing we should do is there's a comment somewhere. We should just delete I think Or who's that that would be around the 400 one down here. I think uh group no Oh, okay. Here it is. Um That root group just calls I'm in house that root group. So yeah, we don't need this. This is old now It does still raise the exception though, which is good We still want it to actually raise the the exception I'll make another build like obviously just removing a comment should not affect anything, but Never be too safe really I'll do one more and then I'll run pre-commit and then I will push And we'll also look into updating e-paper and frame buffer after that So this built Copy it to the device I know hardware emulation might be difficult in the near term But perhaps you could use something like a tricky Run additional automated tests on Yes, there have been um Yes, I will say it is the thing that is on the radar. It is the thing that has been thought about And it's a thing that would Definitely benefit us Running some kind of automated tests on hardware There have been a few attempts at solving that problem of kind of distributing the tests and getting them to run and collecting the results But there has not been anything that is like Able to support the kind of scale or that's really taken off usage basically So I will say like if you are interested in automated tests and if you are interested in helping us out on that front like Definitely, I think one of the things that that initiative Needs is Right now at least like a champion a person who wants to dive in and really try to Tinker away at it and make it a possibility um I would love to see it. I would love to see something where so like my my Vision for this idea, which I think I have written out Somewhere on an issue or maybe in the weeds of a of a meeting at one point or something I should go back and find where I Where I got this idea out of my head and down on on paper so to speak um My vision would be though is like members of the community so me and you and anybody who wants to can Keep a microcontroller plugged into their computer and can keep a Service running on their computer keep a script or whatever running on your computer The script will basically check in with a server that will Allow it to download code to run on your microcontroller and then get the results of that code run And send it back to the server so you could kind of set yourself up as a Uh a runner so to speak to run Stuff tests on microcontrollers. You'd keep your device plugged in you'd keep your computer on 24 7 Connected to the internet all that stuff Uh and then part of our actions it would Create this job for you and distribute it to the server and then have your computer out there in the world You know Download the code that it needs to run run it get the results that it's looking for Send those back to the server which can then send those results back to github Um, I would love to see a workflow like that. I think there are probably ways to make it happen but it's A lot of work for sure. It's gonna be a big thing and it's gonna take a lot of Work and a lot of tinkering to get it set up in such a way that it's feasible The other thing is I think it needs to be super easy for someone to Set up to run their stuff that way, right like We need it to be easy enough that I think average users are Having a chance to be able to get set up and run their own device as a testing device It's not to say that every average user will do so Um, but if only the people who are like in it at the development level like if only people Comfortable building circuit python and really getting down into the weeds of everything if those are the only people who can do it I don't know that we'll have enough people running it all the time to make it work But if we can make it super duper simple, you know Download this uf2 and then plug in your device and then run this script on your computer or whatever, right? If we can make it super duper simple Um for people to kind of donate their computing time and their device time To running those tests. I think You know, I think there's there's promise there I think that could be something that could really help us for sure But it's a tough nut to crack and it's definitely gonna be a lot of work To get to the point where we even have a feasible way to set up and do it I experimented a little bit down this road. I experimented with self-hosted runners on github where you could basically set up your own computer as a runner inside github actions Um, and then it could communicate to the microcontroller to like execute code on behalf of github actions Um, I did that kind of as proof of concept playing around with it one day And it did work out. All right. I did later find the whole self-hosted runner thing is not Not necessarily recommended all the way from what I was reading after the fact, but That's one avenue. I think there's probably other ways it could work technologically as well but Anyway, that's kind of my my thoughts and my ideas around the automated testing So if you are interested in getting involved in automated testing is your your forte or just something you're super interested in I mean, we're definitely Looking for somebody who is All about that Okay, so this is cycling away. We made a build. Did we actually installed it build? I don't remember where I was. I'm gonna I'm gonna copy it back just because I don't I don't know if I loaded this one or just the last one. I think I did load this one, but just to be safe we'll copy it in But yeah, if we could make that super easy then we could have kind of like an army of people with devices Just plugged in all the time Uh waiting to run tests and so you know to your point trinky or whatever device it is, right? Like we could have all kinds of different devices based on just whatever a person has and is willing to leave Uh plugged in so, you know, we can actually even maybe do some hardware testing and stuff as well like If certain, you know, if enough people will leave a fun house plugged in then we can like execute a test That's specific to the fun house hardware Now it can't do everything automated either right there's some stuff a person probably needs to be there for right like if it's you know playing sound out of The speaker or whatever right like it's not gonna know really if the sound came out a person has to tell it like yes actual audible sound did come out, but Um, you know, there is still a lot of stuff we could get done even without a person present Okay, so we are cycling through here. I think we're good to go. I did erase the comment. Let's run pre-commit Tell me what you have on discord sometime. I'd love to take a look. I will try To dig it up. I do not remember You don't remember where it was at so another initiative, I should say Uh credit where credit is due summer soft. Uh member of the community Um has not been around as much lately, but was active in the community in the past. Um summer soft did work on a project called Uh rosy pie And fiza ci this was a An attempt to solve this problem. This was like a raspberry pi image that was made To kind of be this like middle ground So you would plug your circuit python device into this raspberry pi Uh, the raspberry pi would connect to a central server Uh, and the central server would take jobs from github actions and then run them on You know get them onto the pi and then run them onto your board Um So that project is out there. I would say, you know, you can look into that rosy pi Um, I will try to find what I did probably the most consumable thing that I have would be Uh, a video if I was streaming when I was doing it and I would guess I was um, so I'll try to take a Poke back through my old videos and see if I can find The one where we played with uh self-hosted runners It was around the time that I started working on the size measurement stuff Um because I had in mind an idea of actually taking a ram Measurement on the device itself in addition to just the mpy file Uh, which is what we have started with so far That's as much for me as it is for you just remembering the timeline will help me go back and find it Um, but yeah, probably a video is the best thing I have I don't it wasn't like stuff I can share exactly because I don't remember how the It basically what I did is I set my own computer up as a self-hosted runner And then I was tinkering the actions inside of the repo to Call over to my runner and do stuff Okay, we did pass all that stuff so I will push I don't know why we got Changes in here. I did not I don't I don't believe that I intentionally did anything that led to this Actually even see a change down here for this one. There it is. Okay, pulse. Yeah, I haven't been touching anything in pulse. I o Haven't been touching any kind of pi obj No, did I accidentally paste? I mean, I was never even in this file really. I don't think Well, it's not one that gets edited by hand. You know, it is interesting. This is also a pi obj though I think we're just going to uncheck that because I'm not sure what it's from I don't think I made it if I did make it. I certainly didn't do it intentionally For human testing one way to help this Let's see one way to help distributed testing if you have code and expected results picture audio It's easy to upload that code. I like the project download and it's easy to ask others. That's a good point. Yeah, definitely um Being able to say like here's some code. Here's what I'm expecting You know, here's a picture, uh, or a or an audio recording of what I'm getting instead, right? Like, you know, if you're lighting up lights, then a video recording if you're trying to draw on the display Then maybe a photo or a video Um being able to say like here's what I ran Uh, here's what I wanted to happen and then here's what actually happened Um and ask about it is good. So Let's deal with this because youtube is cool Uh, did I miss something? No discord. Okay Terminal so we changed to that we had a different name for that Constant before the other thing is we did is change the internal api to use set root group also change internal api To use set root group Okay, we'll see if that passes and then I guess I'll try the e Paper one. I don't What what uses frame buffer io? I don't actually know Should have gone to that index. I don't have that bookmarked on this computer yet Like the led matrix displays use it. Oh, yeah, I think you're right um Who I have that's like that. I have the uh I have the eight by eight matrixes. I think of matrices register This one connects to i2c I think I recall seeing something like this though. Is it the 13 ones the uh Like seven by 13 or something? Sorry feather wing Is it like these charlie plex? is 31fl Matrix as display Does still go i2c Let's look inside of this Uh, that was this tablet project with an lcd display connected directly to the mcu Without a driver chip Let's see perhaps a better question Okay, perhaps a better question to ask is the 8020 rule Where are the majority of circuit python bugs the core language features or something specific to an attachment like display sound neopixels um The majority of bugs I don't know if I have a good Rasp on it. I would say I think So I would say that I think we find bugs in the core more than we find bugs in like the python layer the libraries But that being said, I don't know if that's true or if that's like biased because The bugs in the core tend to make things fail in a more spectacular fashion Right the bugs in the core tend to make things crash or hard fault Compared to the bugs in the python layer the libraries Are less likely to do that they might raise an exception or they might just Not behave as expected And therefore they are kind of like lesser In a way, so I don't know if we actually find more in the core Or if it just feels like it because they tend to be You know cause more problems cause bigger effects. Um It's a good question I don't know that I know that they know the answer off the top of my head Bugs in the core affect more people. That is definitely true. Yeah, that's that's a really good point Yeah, because a bug in the core Is likely to affect Uh, not necessarily everyone because it could be in a core module that a certain person is not using But it's certainly way more likely to affect a lot of people than a bug in any particular library That's a good point With an lcd. Uh, oh, yeah the one you ran the lottery for. Oh the hack tablet. Nice Was the frame buffer display. Okay, okay That's right That is right Maybe we can test with that. I have Not built it in a minute. It would be good at some point. We want to try I wonder did we ever get the newest esp idf One thing I was hopeful for was when we pull in newer esp idf I was hoping maybe that our hardfault issue might go away because I don't Kind of reached my Personal ceiling at least for now as far as being able to troubleshoot the hardfault So I kind of got to just pray that it goes away in the new version Don't know if that will actually work, but I have to try it out testing the core is easier because we can just run a bunch of python code and have it right To the file after check the test results file and see if everything worked I would say it's probably about the same testing the core versus testing a library I would guess works out pretty close to the same In terms of like how difficult it is I really want the circuit python driver for this I do think frame buffer. I do think there's something in one of these led things that does use frame buffer though I kind of Kind of remember this from playing with this thing one day I have like a vague memory of something that used Frame buffer IO. Maybe it's maybe it's like Maybe it didn't actually use it. Maybe it just imported it or something I was thinking there is there is one with a font. Is there one with a font example? Maybe it used frame buffer IO, but not as the display Oh frame buff This is probably what I'm remembering I think this is what I'm remembering And this is not frame buffer IO, but rather Adafruit frame buff, which would be python code not core code Okay We'll have to try to figure out how we can test the frame buffer one Does Adafruit sell an esp32 chip that you can use ethernet instead of wi-fi? Um, I do not know off the top of my head I do not personally I have not done much with esp32 uh esp32 only very very very recently has Started supporting circuit python and I spend the majority of my time and effort in microcontroller land on circuit python as opposed to Arduino or any other platform. So it's only been a few short Probably months. I want to say a couple maybe one two three months since We've been able to use circuit python on esp32 devices. I have not tried it out yet one thing That I would assume works Given the caveat that I just said I have not actually done anything with an esp32 So I don't know for a hundred percent sure that this would work You could try asking in the help with channel We have lots of folks who have lots of experience with wi-fi and with network stuff they may be able to Add more to this discussion than I could that being said one thing that I think could work Is they do have esp32 device. So this is a esp32 feather v2 device microcontroller And then they have a ethernet feather wing ethernet feather wing As far as I am aware you should be able to plug this ethernet feather wing in To an esp32 or pretty much any other feather And get your network this way get your network through the ethernet cable rather than through The wi-fi To the best of my knowledge that should work again. I have not tried it. I'm not a thousand percent sure But my guess is that would be fine. I don't know of a reason that it wouldn't So that might be something to look into that being said I don't know of a device itself Like a just a device that's built in by itself that has ethernet instead of wi-fi Got to hit the hay. Thanks to him and good night all yeah Thanks for hanging out for a bit Dave. Have a good night and a good weekend and all that stuff Matrix LED use frame buffer library not the frame buffer. I oh, okay It's the frame buffer from micro python made a few contributions to the isl was suggested to implement pixel buff But I did not know how to That was for a pimeroni multipixel line isl i'm not familiar with isl is the acronym there So I guess we'll try e-paper to start with And basically what we would need to do is make Kind of some of the changes that we made to display To this one Doesn't have show here Only reason I can think of is some other module also using the same pins that yeah, that's a good point It would be good definitely to double check on The the built-in hardware on each device and make sure that the pins that the ethernet thing is available on I guess probably spy. I would assume spy, but I'm not sure make sure the pins that it communicates with are valid You know same same pin same location on the uh sp32 feather They tend to be pin compatible the feather wings and the feathers But there are situations where the pins are different on different feathers And that can definitely cause differences. There may be jumpers or something like that That you would need to do Change or or set your chip select line So that's another thing to look out for just make sure that all the pins are matching up But I would I would assume that it is possible to connect those together so we pretty much want like We pretty much want Copy of this, but it's called set root group and I think we should probably just try to make it match the uh One from Here as best we can we put this one down under bus And to start with I'm actually just going to grab all of this even though like some of it's going to change And take all of this we're going to go over to e-paper Is there a bus in here? busy bus Or bus get bus is that rotation Get bus. I think that's pretty much where we had it before I'm going to put this stuff. So root group is a group root group on the e-paper display Hey par display um So this will be e-paper display Split this We can go also look at show Wait a minute. This is the wrong place It should be shared bindings I thought we were in but we aren't This one is shared bindings. I guess I should close some of these I don't know why the paste doesn't work right with the uh tensions There's bus. Okay. Yeah, this one is actually See when I pasted it's no longer indented Could run pre-commit which has the formatter. I guess I need to figure out how to get I don't know why it does that basically. I need to make it not do that You make it paste with the right Well, I mean at Worst I would like to make it paste with the same inventions that I copied it with like That'd be pretty good isl is the library. We were looking at Oh isl the uh, yeah. Yeah. Sorry the led library isl f 31 something something. I don't know the full name I'm with you now though. Yeah pixel buff I wouldn't even know how to begin trying to put pixel buff to it Like the learn guide of that ethernet feather to see See the use case in the language that are supported That's a good point too. Yeah, the learn guide for the feather wing should Give you information about which like if it's arduino only or circuit python and arduino or circuit python only um, it should I would assume it should tell you about any hardware Like specific compatibilities or incompatibilities that are known about as well So like a lot of this stuff will need to be now e-paper display Instead of display But I don't know if everything That looks so there's self too much everything native display So this is where to start with before I actually just was calling show in here Might be worth Doing that to start with so we can test less changes at once So I will say my my c and my core stuff. I'm not like fully confident in the changes I make in here just yet We did lose this e-paper You should have a set root group now. This is in so this is in bindings c I do think I was able to Do this from here. Let's see if it builds. I don't know. I might not actually build Sure, there's more that we're supposed to do if nothing else. We didn't put it in h yet. I think we would want to do that I suspect we should probably need some changes and shared module also Okay. Yeah, this thing doesn't exist or something Basically, this doesn't exist yet. So I think inside c we need to declare this. I mean inside of um Inside of Shared module c This basically can just do the same thing as this We need it in Shared module h no show This one does We'll event we'll want to make a get root group also, but but we're ready for it I don't know where the code for it came from actually Maybe this that's the locals dictionary table No Okay, here we had a get root group Okay, we actually do have this But this is gonna try to call this one Does this one exist already and actually have a get root group See if it builds No get root group Get root group Uh Eat paper so inside shared bindings c 357 Did this be e paper display? Paper display h Ah, yeah, this should probably be e paper Filled slightly differently Uh previous declaration was here Okay Error conflicting types Uh, so yeah, we got to go to um Shared module 46 self So you're right, right, right, right, right. This should be paper also paper Went longer than before Without crashing so far There we go. We got a build look at that. Okay, we Got a build for a device we can't test it on because I don't have an e ink screen that could plug into the funhouse So we are gonna get A mag tag build One thing I don't know is like if I make a mag tag build Am I already testing this like is is mag tag using this stuff internally on board or dot display? Uh, or do I need to make a mag tag build and then Release displays Manually re initialize the display Using the e paper display class and then I'd be testing my stuff. I don't actually know If anybody else who's watching does let me know I will try to find the device to make the Build with so let's go ls boards mag tag um I don't know if it's aida fruit mag tag Mag tag there it is It has a dot in it Perhaps the only one with a dot in the name. Look at that. Nice One looks like the only one with a hyphen It's using this internally. Okay, so if we get this on our mag tag and it actually still shows stuff then We're in a pretty good spot Uh, let's find our make mag tag While that's building. I'm gonna run and find the mag tag. So I'll be back in a second. Okay Mag tag acquired looks like we got a build as well Conveniently the plugin is in basically the same spot No idea what code would be on here. We should uh Take a look. It doesn't look like it's doing anything actually shows an empty group. I was refreshed. Okay go 730 beta beta one This Sign that I don't use my mag tag enough. How does the uh boot loader work on the mag tag? Is it double tap reset? Where's reset also? Ah, yeah, it should be because we got purple. Yeah, there we go. Okay boot loader mag tag boot cp build data fruit mag tag firmware media Mag tag got the blink ins Only to assign the root group in your code to test it though. Okay. Yeah, we can do that This one takes a little bit longer to copy Oh, do you think it is done finally though? Nice. Okay, so we are definitely updated now 80 beta 4 Plus the dirty build or whatever right because I just built this from Eventually starting from main a few days ago at this point. It's probably out of date by now, but Hello mag tag that printed out. So we will make our program actually try the new stuff So I'll just kind of do Similar thing like we had before I'll do just the label by itself for now though from display text bitmap label import label import board Anything else import terminal i o import display i o Let's start with that while true pass Main group equals new group Let's go Test label equals label terminal i o font text Hello mag tag dot set dot root Group setter probably want white because I think the default background is black Main group dot append Test label this needs to be Display oh Yeah, so now we would go board Let's make display. It doesn't really matter right? We could just use the shoddy one, but let's go non shoddy display equals board that Shoddy display And then go display this main group And then because it's a mag tag We also have to call refresh also because it's a mag tag. It has a refresh limit of like once every five seconds or something Uh what I like to do because I find it convenient is just put a time dot sleep at the beginning of the script that way It will never crash for trying to refresh too fast I'm just gonna go time dot sleep like three seconds right at the top. All right, so we get our three seconds of sleep ePaper has no root group. Okay Probably we forgot to put it we forgot to put it in the What is this called the dictionary of the local dictionary? Yes local dict table. We did not put it in here Uh, let's do that. I don't know if that's the right name We'll see um bootler. That's not very dark gray Uh, yeah, it looks like that worked one thing is my label is in a weird spot because by default labels are Halfway off the display. Uh, we didn't do our anchor point like we did on the last one this label anchor Point this time. I'm just gonna use zero zero Instead of centering it. We're just gonna go zero zero and then test label Anchored position Something like that refresh too soon Is it's not long enough? That's actually the exact thing. I put this sleep here to try to prevent But apparently we didn't sleep long enough. I guess There we go Oh, we got our label in there and then uh, just to make sure let's also go Make sure it goes back to the terminal correctly Do we print something too? I didn't call refresh We will let's print something also um Terminal Time Terminal time Terminal time So this one probably won't Oh, I guess it will refresh. Yeah fair enough But it didn't show anything else before it but it should go back to the terminal now and print Yeah terminal time we get to see it there as well Okay So we're good on eink functionality wise Probably didn't probably hasn't been long enough that this would have actually pastor failed yet Oh has not even run anything yet still queued With any luck It will cancel the prior actions and overtake them with the new one Not positive if that's how that works, but we're lucky that would be what it would do um Cream buffer IO Don't think I've cloned this yet See if we can find a project that uses frame buffer IO Oh the camera just died I know because it's light turned off It's because I changed the background Do a foe Why is that the thing that was open? Doesn't it seem weird that this is the thing that it opened automatically? Why did it do that? Did I open that? Because this was a brand new clone thing. So like it wouldn't have had any prior History or anything There's a billion different code pies in here all in their own folders And it's somehow settled on I must have clicked it right did I click it I must have clicked it Really it did not just open that by random. That'd be crazy Um, anyway though what we're actually looking for get grep frame buffer IO Also, let's do dash in because that makes it more useful. Ooh Maybe I spelled it wrong. Hopefully I spelled it wrong Uh, yep, fram buffer fram get old fram buffer RGB matrix. Okay matrix portal stuff maybe And sharp sharp display I do have a sharp display I do not have a sharp display that is like ready to just hook up and test this evening though I got one of These I think maybe Something it's very similar to this if not this exact one Uh, let's look at the code It's the code that makes it go Indeed Release the displays importing frame buffer IO Uh, it's creating a sharp memory frame buffer Which it imported from sharp display Oh, but then it's making a frame buffer display from The sharp memory frame buffer. Okay So frame buffer display would be The object we're changing we would be changing the show I mean we would be leaving it alone for now, but we'd be adding the set root group that Will ultimately replace show And we'd be adding that to frame buffer display Okay, I think this will probably be tomorrow's plan. So For folks that don't know uh, I stream on saturday mornings also typically Um, although I am thinking about maybe changing up the times on saturdays We'll see I've mentioned that a few times and I haven't actually done it yet So we'll see if I actually do definitely not for tomorrow though Tomorrow, I plan to stream at the normal time on saturday, which for me For right now is 10 a.m. Central time and I think what I'll work on tomorrow is I'll get the sharp display out and I'll work on making this change in frame buffer display Class tomorrow, but 10 a.m. Central time right back here in the live broadcast chat That's where you can get the links to join us. I will be under my own accounts instead of the ate a fruit account Like we are right now But I'll drop the youtube link and then you know, it's the same link on twitch every week But I'll put that as well in the uh discord when I get going and this will be what I work on Um, so that'll be good that we can actually test that and then it looked also like rgb matrix stuff Oh, and the glasses as well. I have the glasses. I think I Think I do have actually a set of the glasses. I have not done much with them yet I think I do have a set of those as well though. So maybe we can try that out also And maybe the matrix portal on the matrix portal What I don't know is if is it the same as the mag tag where I can just use board dot display I guess it probably is right rgb matrix Yeah, see these are linked I can just click this and it goes to there But like Sometimes they weren't like whatever we grepped earlier. It wasn't this makes a matrix. Oh, but then it makes a frame buffer display from Matrix, okay, so this probably behaves like a frame buffer Kind of like the same way the sharp one made a sharp display frame buffer and then passed it to frame buffer display Okay, cool. So yeah, we'll be able to test this one. We'll be able to make the changes Try it out on a few different platforms What I will do is I'll put a note here about some of the latest changes and the plans on Oh, awesome. Yeah Hold for review, but I Maybe I need to not Stream with this chat. Can I get maybe I can get a different chat window? Can I be logged into youtube as two different users? Could I have one chat window as my user? And one chat user as Adafruit user I probably need to figure that out if I could be my own because like if I was my own user then I would not have Moderator which means it probably wouldn't show me that message Whereas what we have here on the display is actually just the Adafruit user which is moderator and so it does see those I'll have to try that for Next week, maybe incognito is a good idea as well. Maybe we can do it without even logging in or something Yeah, I'll have to try that for next week. Maybe we can get it to where But I mean I would want the moderator chat as well I guess in case we do still need to delete something so I have to juggle another one and just keep it Keep only the Only the lesser of the two as the obs one basically Okay, let's fill in a comment here and then I think we'll call it a night for this evening. So uh, the latest commits Change the name of the constant constant to This and make it return the Terminal group That is already in memory Latest commits make a few changes including Changing the name of the constant to Maybe we could bullet point them to make it clear. So what else did we do in this? We Change the internal api change the internal api calls To use set root group instead of show All the way down into display core Made this internal change for three types of displays display io.display Display io.e paper display Frame buffer io.frame buffer display added the set root group property to paper display Tested successfully on mag tag open See one remaining remaining open item for sure is Adding the set root group property prop property to frame buffer display That is in place I think this is ready to move out of draft state I guess state. Oh, we did finally start getting passes Hopefully they're not from the first one Let's still say yellow though. So I don't know okay So that'll be the plan uh tomorrow i'll get the Find my sharp display get that set up on a I think it's a breadboard the one I have so I'll have to Get some wires jumpers ready to go to connect up to something Um We'll test that out. I'll get them. I'll get my matrix portal as well We'll try out the matrix portal Once we make those changes frame buffer Once we get that in I think this is pretty much ready to Go, I mean certainly ready for the next round of reviews. I would say I don't know of anything else beyond that that we would need Um to do inside of it before it's ready I believe everything will be functional at that point once we do the one in frame buffer display um Trying to think if there's I mean, let's go look at sharp display should we wouldn't we don't need to do anything inside sharp display I think because It seems like it uses frame buffer io Let's just make sure yeah, this just has a frame buffer. It doesn't actually have like A display object. Are there any other kinds of displays? So there's Parallel display Where is that one used? It doesn't seem to have all the same stuff either. This is just parallel bus what's got its own uh Developers so this I think parallel display was used On the uh the hack tablet it's available on quite a few Does the pi portal use parallel bus? Because I think it just still uses display though, right display.io dot display Little bus I have this open so massive bus I do have a breakout which has I think parallel pins Has like one option for parallel one option for spy I only used it for spy so far Could try that I'll have to try to look into this I don't know for sure if this this might be the deal where it's kind of like the sharp one where Technically it just uses one of the other ones So as long as we've already made the change in display.io dot display then it might cover The usage of parallel bus. I'm not sure I got to look into Parallel bus a bit and figure out If it actually has its own display class or if it's just using The one we already changed but We'll try to poke around a bit tomorrow into that as well That'll be the plan Alrighty I will start getting ready to pack it up here then for now. So thank you to everybody Who is watching thanks for everybody who hung out in the chat and You know ask questions We had a couple of good questions about display.io stuff this week always good to see that definitely everybody always feel free to ask any questions about What i'm working on or just circuit python generally or especially like display.io. I happen to have a lot of Just like experience with basically so i'm always happy to talk about and answer stuff as best I can in that realm Um Yeah, thank you. We have uh to ship it in the chat. Thank you to ship it again for the the idea in the weeds I think I mentioned before this is where this idea came from. I do think this is a good evolution for the display.io api so I'm excited to get it in and start getting some of the test code updated So that'll be kind of the next step once we have this actually in the core And the pr is you know out of draft and actually approved and merged then We'll have to go back and start updating test code and stuff. So that'll be a An effort, but we'll get all that in and then for the the next new release way down the line Then we'll eventually get rid of the show method um Yeah, thank you to shippu for bringing that idea up again. I do think this is a good step forwards Um, thanks for the stream really interesting addition. Yeah, thanks. Thanks for hanging out keith Um, thank you of course to everybody for watching. Thank you to eta fruit again If you want to help support the project one of the ways you could do that is by purchasing hardware from eta fruit Head to their website at eta fruit com to do that Um I will be back tomorrow morning at 10 a.m. For my stream So you can either follow me on discord from a guy underscore twitch Or you can just hang out in the live broadcast chat Around 10 a.m. Central time tomorrow morning. I'll drop the links in there And we will continue on with the frame buffer display Hope everybody has a good night, and I'll see you later. Thanks