 Hello, hello We can get let everything get going here. Oh How is everyone doing? Probably don't actually have that many people yet Wang out. I'll save my hellos. Oh Hmm, let me tell you it feels like Friday Feels like Friday to me Like I this morning. I was like super alert or like, you know could focus and now I'm just like It's like Friday Good morning, unexpected maker. Hello, DCD. Oh I'm sleepy Hello, Louise Nice that okay Welcome to a deep dive We don't take it. Well, I don't take myself too seriously Mark says today has been a very Friday feeling Friday. Yeah, I Get that I was like I feel like Hi, Beata, I Feel like like up until Wednesday like Wednesday to Wednesday I was like super focused and then I got up super early Well, not super early bit like earlier than normal to do this Silabs presentation yesterday They'd be a part of that And I slept poorly because I sent my alarm from like 5 a.m. Or 5 30 a.m. And when it's that early my body you like I don't sleep as well because I'm worried about getting up So I like got up even earlier and That and then I was here and my partner texted me like hey the kiddos got pink eye So didn't work a whole lot yesterday and I was tired anyway, and then today I like I've gotten some stuff done and let's focus and now I'm just kind of like feeling the Friday afternoon DCD says thanks great introduction to circuit by phone yesterday. Good. I'm glad I'm glad it went okay Hey Timon school It would be a lot earlier if I didn't have a one-year-old like he usually gets up us up between 6 30 and 7 30 and he's 6 30 Yeah, 6 30 and 7 anyway, so it wasn't too bad It could have been worse when I used to sleep and delay, but yeah Johnny says I'm back putting again and see plus plus it was painful to switch from Python all those missing semicolons at compile time Right. Hello, David All right, I think I've said my hello's and my windows are approximately going to be off-screen The new stripe UI looks worse when I make it in a into a tiny box because we use not stripes slack The slack UI is worse smaller No, they usually have it open just in case I get pinged internally Okay, so let's do our intro. Hello everyone. Everyone. My name is Scott I work on circuit Python for Adafruit. You don't know what those things are a circuit Python is a version of Python designed for little tiny inexpensive computers called microcontrollers Underneath this metal spot here is a little chip and that runs circuit Python all on its own. It's got RAM and a CPU and all that so Circuit Python runs on those things And Adafruit is an open source hardware and software company based out in New York City I work remotely for them in Seattle. So that's That's the deal Yeah, Timon says I we actually might have very similar sleep cycles then ha ha I'm currently fairly close to Pacific Standard Time Yeah, see I I'm I'm pretty convinced that Lady Aida is also pretty much on Pacific Time. So it works out for me For sure. I'm gonna start using semicolons when I do Python going forwards. You can You can it just like it'll get stripped out by your By your linter or whatever Or your formatter Hello, Space Pope All right, so bear with me. I'm a little little out of it today What I thought I'd talk about is when we hit a really cool milestone this week in collaboration between largely between Dan and I We have a circuit Python 9 alpha 2 released. So this is actually the first alpha to be released Yeah, Timon says I'm on Pacific Time, but I live in but I'm in Germany Yeah, I mean the more is in New York City, and I'm pretty sure she's on a Pacific schedule too Works it works really well for me when people are like, oh you work for people and on the East Coast You must have to get up early and I'm like no, I don't The reason I have to get up early is because I have a one-year-old Yeah, so big turning point for circuit Python we hit the first alpha 9 That means that we've updated all of the To to the latest version released version of micro Python If you don't know micro Python is kind of what powers the Python Largely provides us the Python core And so by updating that we get some new features and I'm actually gonna look I'm gonna look at one of those features later today or later in this in this dream here Timon says I love working for the US for that that you get to sleep in and stay up late Yeah, so circuit Python 9 Alpha 2 is out. That's the first alpha it has micro Python 121 in it and We were waiting to do this alpha release until we had a version of We were on a version of micro Python That didn't have and we didn't plan to change the NPY version format at all so hopefully The NPY version is set for circuit Python 9. I just Made a PR and Dan released it To build bundles with 9.x. So keep an eye out for that We've had a number of folks saying like hey, I'm trying 9 but my NPY files don't work So we've been telling them use PI files, but you still can do But we'll have Sometime overnight. We'll have a 9 a 9x bundle Build and hopefully succeed Just notice no closed captions in live YouTube It is enabled I think It should be enabled. I think I have the same settings That's not what I want closed captions. Oh, yeah, it does it does say it's disabled and I'm not sure why and I can't change it Sorry, I Think I'd have to start the stream again to turn them on I should have checked that. I'm sorry. I I didn't but Hmm, this these are settings that you get shared with the other like a fruit folks. So Sorry I Could like end to this dream, but I can't Yeah, I don't want to end this dream Sorry, sorry folks Sorry that we don't have Sorry, we don't have closed captions today. I guess I should take that out I Don't know how they got turned off. They're usually just left on. Hey, see Grover Do folks have any questions for me that might be a way to get my brain back if I'm answering questions I Showed off on show and tell the warning stuff that I did so There is now a warnings module in circuit Python and it's used for the display IO stuff. So if I plug in This Feather s3 that I have the demo on And let's go to the desktop do to dev serial. So if I do import a Display IO and then display IO dot display It will give me a warning David asks How much interaction slash support that SyLabs need for their circuit Python port not a lot really? They did a really nice job They had had some some email contact with Lamar And the more they were trying to they want to do more with Adafruit and the more kind of reply I'm like, hey, like you want to make it more likely that we do stuff with you Well, it would be great if your chips supported circuit Python and they kind of went off for I guess a few months and then came back to the war and said hey, we've implemented circuit Python and they made a PR and and I reviewed it and merged it and And that was that they didn't take a lot of hand-holding through it anything or at all or Didn't yeah, not much at all And then they asked us to participate in this tech doc and I thought you know It's really cool that they added circuit circuit Python support for their for the chips Like I'd be happy to happy to do that. So I am for sure Unexpected maker says I went to update circuit by the repo before fixing that qio stuff for my boards and did a fetch all instead of fetch Now I'm getting everybody some module for every port for everything ever omg the The fetch all some modules should still not get you all to get history, but yeah, there's a lot of stuff To one says not a question, but a random thing that just came to mind There was a pretty bad bug for the s3 and earlier IDF 5 1 release I think the was paired with one of the latest MP y versions had the buggy sub release So maybe something to keep at keep an eye out if you're working in against the latest patch release. I think that um, I Got a word a I think Jim warned to me that there's like some Billy bug But we don't really support like we have like half-baked support for Billy on expressive So it's not something that I'm like too concerned about I'm certainly there's gonna be bugs and people are finding them and that's great Hopefully when I get my brain back next week. Hope I'll pick some of those up and start hammering them out, but Yeah, brain's out here today or at least not anymore So the thing that I was working on or trying to work on is well, I did the bundle release stuff So I was I was really excited this morning about the alpha going out that Dan did all the work for that And I like we've had these support issues around the bundle So I wanted to get that set up and so that was the main thing we got going this morning And then the other thing I've been working on was the next piece of work I wanted to do after 121 micro Python 121 was merged was The switching circuit Python to doing The automatic heap growth So in micro Python 121 for the Unix or not even the Unix, but just the expressive build they now have this They start with a smaller heap and then they go back to the IDF to get larger and larger chunks to expand the micro Python heap as they need it and They're only using it in that case because one it makes it run faster if you're not using all the memory But two it means that you can more dynamically share memory between micro Python and the underlying system in in the IDF case like if you you know, you're doing a bunch of soccer requests the networking stack under the hood may require like pretty large chunks of memory and if you are What the way that we do it in in circuit Python is like we basically take all of the external ramp for him for circuit Python and then we have the setting That I'm removing on how much you want to basically give back to the IDF so that IDF can use it So by doing this auto heap growth thing, it's it's more of a kind of a race to use it sort of model At which allows you to like better balance the memory use between the internal and external and the reason that I really wanted to do to do to switch over to this is because There are a few cases in circuit Python where we want to allocate memory but have it live longer than the micro Python VM and so that is By having an outer heap on everything and growing the micro Python heap as we need it We can allocate straight to the outer heap and then keep those things around. We just have to manually manage them The benefit of the micro Python heap is that it does all of this like garbage collection for you Whereas the outer heap is is not you just have to be really good with your Alex and Alex and freeze So I did originally done some work on this a few weeks ago, but I didn't have the heap growth stuff So I ripped out we had this mechanic in eight Where you could do an allocation and we called it like the super supervisor memory allocation stuff And if the VM was running it would allocate it in the VM and then there was a process where When you were tearing down the VM the VM's heap you basically copy Copy the memory that you wanted to live longer live past the VM to a new spot and update the pointer So there was like some interaction there But moving memory is really hard to do because like basically no code in No code in embedded worlds expects you to be a little like update pointers that they're using So like the RGB matrix was one case where it was just like leading to some issues where you're Here's the issue Yeah, so maybe maybe Timana's Giving me an issue where we should update the IDF again. I don't know exactly what version of IDF 5-1 we're on Do-do-do FPU registers are not properly switched IDF 5-1 RC This is found in June. We're using 5-1-1. I think Yeah, I think we've got this. Oh, yeah This fixes part of the 5-1-1 release So you can see the version that we're using by I go to Adafruit circuit Python Maybe ports Espressif ESP IDF and then this like we carry a few changes on top But you can see that like the latest commit we have on the IDF is like September So it's pretty up-to-date. I don't think I don't think we have that bug still Funky math bugs it not fixed. I Haven't seen it Okay, so I have this branch and one thing we can check to see is if the CI is run I Call it switch to split heap so this In the case of the ES in the case of the expressive port what we'll do is we'll use The IDF to do the allocations to know the hood for us and then by default for all of the other ports we use The thing that the IDF uses actually which is called TLSF There's a library that actually expressive has forked and maintains For using the IDF that I'm just using directly on the other ports and that does a basic heat management for us So I Switched everything over to that, you know, I didn't switch the Unix port and I wonder if I should the Unix port in as MicroPython uses it does use split heaps, but it uses a fixed number. I think And that's probably fine Yeah, so I'm kind of to this point where I think it's building or at least This red this red X says it's not building Pre-commit failed, but boards are going So some boards still failed so we could take a look at those I've been in this world with the like MicroPython updates where like Building once I get building fixed then I get tests running and then I didn't I I assume it works You can tell me where it doesn't work So I'm like a little I meant this like crossroads of like Generally it builds. So how do I? Generally it builds. So what do I need to do to actually test it to make sure that it still works like the the heap growing stuff works And I think I just want to smoke test it. There is going to be some weird cases They were just gonna have to deal with Syntax warning. Oh, this is a code size issue Overflowed by 440 bytes Hmm, great Those ones aren't fun to fix Like, okay, how do I magically find 440 bytes? Well, we'll let this run Raspberry Pi zero failed. Oh this The cast alignment thing So annoying So the TLSF library is what we're using to manage the the outer heap that lives for the lifetime Circuit Python not the VM, but like the actual run LED glasses, oh Yeah, I should fix that. I renamed renamed it Okay, so there's a few board fixes I need to do It's probably best for me to just wait and let this run and then I'll see what fails It doesn't make a lot of sense for me to Do it now. So let's just try it. So I have this board here. That's a feather s3 tft and I don't know what the code up high on here is But let's disconnect and we'll just build it with the split heap and see if it works still And in fact, you can see there that like the last build I did didn't work, but I thought I fixed it Had an RGB matrix issue So we'll try it. I have the RGB matrix Still sitting here on my desk. So that is one I want to try to Because the the fix that I put in that was released in 828 It's kind of like Not that great. So this change here switches This change here switches the RGB matrix to using that outer heap For the stuff that it needs to so I'm I'm curious Okay, but this we have this cast alignment issue that the TLSF stuff is introducing Which it shouldn't Need I guess we're compiling it regardless hmm We're not actually using the TLSF stuff. We're like we're gonna use the ESP IDFC version of it anyway So I wonder if I should change it so that you actually Switch It on Like this is where it's being pulled in Either that or I just exempt it from the check and call it good That's what I think I might do It just won't get oh, you know, I wonderful get a link error actually We might we might get a link error. Let's let's just try this and see Because this is like this TLSS TLSF code is literally what The code that is used by Is used by the IDF to manage its own memory And in fact, that's how I found is like they had I had talked to them and they were like we're switching to this and IDF 5 Because it's like designed It's it's a memory allocation system designed for Like embedded systems Like the main I think the main selling point is that it's a fixed amount of time to do an allocation Um, and then it's also a good fit algorithm. So it like does a better job at not fragmenting It's not immune to fragmentation, but It doesn't so in circuit Python like we'll just start from the beginning in the first place. Something fits. We'll put it But uh The TLSF stuff tried to like kind of like it won't necessarily start at the start to start. Um, it does a better job at finding like Holes in the heap that things keep fit in Or that are good fits for that I don't know how it does it. I just use the library Hmm PM allocate is redefined This looks like a protomatter problem We're gonna have to fix this for for testing the RGB matrix anyway Hmm three What did this work before? It's only on the s3 that they do that. P s ram for the frame buffer Hmm Let's see what we currently do in the circuit Python RGB matrix allocator P s ram. I thought you could I don't think that I feel like this would still conflict with this, but We'll see if we can't do something Similar That is the tricky part of Like I thought the s3 could dma from ps ram why it can't But maybe protomatter cares Of the full history of this I'm gonna make my compilation issue go away Chat is quiet I'm quiet too May not go the whole two hours. We'll see Maybe I'll take a nap Hey, all that that worked Not sure why but Let's try it. I have the uf2 bootloader on here. So I'm just Loading with that. Oh no Come back Like all my panels my kde panels disappeared when I did that They're back though Like my whole desktop went away Like the desktop background went away and stuff. You probably saw that they were copied And it doesn't boot it looks like it's very unhappy. Well Caffeine apps are great by the way You know, maybe I should have had more caffeine today. I did have some yesterday Okay, so I don't know if you can see this But it's like flashing on And restarting and flashing on and restarting So what I like to do when I'm in this situation Is on the spress if I I just do preneft debugging. So I've got this Well, this is a mini I've got these nice labels on my boards now Come on product showcase turn on I labeled it and this says n8, which means it doesn't have external RAM, which is what I'm actually interested in So I got unhooked and get another board. I don't think I have So I really like Espresso's new dev kits like this one, but this one doesn't have external ps ram, which I'd like to try with Um, but their their dev kits are great because the new ones have dual usb One is the native usb and one is the uart And so it's great because you put circuit python on one usb and you get the debug you are on the other And then you you can figure out what's going on. So I'm going to go grab one of those I got this label maker from goodwill and then promptly spent like This more money on different size tape for it It's fine. No, it's worked out um, okay, so This is two micro usb's which I think I have over here. Here's one here's two So now this is a 32 r8 So we're gonna make board equals espresso and kit 32 r8 debug flash And I'll I will boot it And I also like with this you can do kind of a dual to while you're Compiling thing Go split here and then split here Now here we'll do to dev serial Is that right? Yeah, my id usb Jtag unit, but we should see The uart too Not seeing the uart. Why is that? I hope I didn't crash like you dev Can I break it this might usb cable bad? I should be able to see like a psylabs I should be able to see like it Dma from psgm has only supported for some peripherals That would do it I'm not sure how protomatter works on this three. So I don't know what peripheral is waiting for I don't know why I don't see a psylabs thing Video problems see so like the cp2102. I bet you know I Wonder if I screwed up my Like there's a thing that creates those devices New device, but it doesn't tell me like the ttyacm sort of thing Okay, this is a stupid error because I Clean first Anything supported by the gdma controller So I'm not Well, I don't know I don't know why this silicon labs thing and usually I would restart my computer Which I can't do because I'm streaming from my computer I wonder if I have this other one here. I wonder if this other one will show up This is the one that's like separate. I bet it won't But we can give it a try I like hung you dev. That's what I gotta do is I gotta poke you dev The same one or different one. Oh poor Unplug this My hover cam is just like blinking on and off. That's just probably what all these messages are about I put usb through its paces. I'll tell you that Okay, so The kernel saw it, but again, we're not seeing it in dev serial ACM one and two, but that's probably the inky frame In the usb to serial jtech unit So you dev is not happy Do you think we can see by doing journal control Like that's probably the thing like I lost my whole panel I don't know add flash there Yeah, the api I have for for doing like I add this port malik port free It doesn't allow the like different heap capabilities that like the idf does Which is why it might be okay for For proto matter to go around it If it needs more capabilities Then the generic like micro python stuff But I think generally like when buffers are allocated through micro python. We assume that we can dma them Maybe not All right. Well that I'm kind of up a creek The way I was going to debug it is not working If I plug in that side, I just don't get my Like this dev serial by id is not updating for sci labs If I do it here We do get the usb jtech serial debug unit But it should have gone to circuit python I guess what we could do is we could let's um Imagine that this error might be Cross port error that I did So I've got an nrf Feather here and let's try with the nrf and see if the nrf works Can't really merge it in if it doesn't work So let's see if we can't get circuit python Split heap running on the nrf We're gonna have to figure out how to optimize the memory late next week. I'm gonna leave that to future self Future me I can weird worry about it That was nice and quick You know what? I think I might just jlink it. That's what I was doing with this board last time Reload debug So I've got gdb talking through a jlink to this feather And now I'm gonna I'll set a breakpoint and the reset into safe mode thing and then just run it and see what happens Uh, it's got usb connected. So if it does work it will come up on usb reset into Safe mode and continue Blue blink Okay, and then we got a heart fault. Oh good. This is code that I haven't tested yet This would do it sweet. So we're loading the neopixel library Let me let me highlight this. So we are doing We're doing an import We are doing a load we're parsing and now we tried to do a malloc of 21 bytes And we got to the point where we needed to add more heap And then we are in the add more heap code. We tried to get okay. What is the largest uh split that we could do Um, and we're in this thing that I implemented which is get the largest free size And then we crashed Basic eye working on the qualia nine alpha two Sweet looks good That's pretty cool I I yeah the our dock clock display stuff is pretty neat. Um, okay, so why why why Is this not working? So we're crashing in port 75 Let's pull it up. Oh and oh qt mr. Crash because Sublime text is gone Okay supervisor shared port And we're in get largest free And 75 so let's go up to frame six info locals max size is very large I'm not sure why it is So it should be max size is zero It a pointer to it gets passed into this function that then gets and then pool walker Max size walker walk pool Block is last It is weird This is weird. So this is right This is right So what about this am I doing wrong? There's I above me so I am at a loss Because we're not crashing in Max size walker. We're crashing outside of it in walk pool And I'm not sure why that would be But we can take a look we can say lime tlsf tlsf 764 like this is the code that um This is the code that idf is using Offset to block versus default walker Any asserts or validation of the heat debug sport in tlsf Um, I mean this says wild block and not block as last block So that are overhead. Oh, this is The pool here is I wonder if I'm initializing wrong or in It's taking a pool in But that is not the same as I'm passing in the wrong pointer Because tlsf create with pool and then I need to like get the first pool and then walk it So I'm doing this create with pool So this the pool location must be this mem Which is the tlsf plus the tlsf size And then maybe it's going backwards again into that And then it's getting invalidized Oh, here you go tlsf get pool Let's do that Fit size What does fit size take? This is what type checking is supposed to solve Okay, that looks right. That's my guess Why that's not working? But this totally well I was going to say this totally could be the problem on Espressive, but I don't think that's the case because On the expressive port we have A different implementation of this good get the largest size thing So they're weak in the outer level and then in here I am using the heat caps stuff See like I have this port Heat get what a just free size thing So I don't think this is the same issue that we're seeing on expressive So I'm just gonna have to do that after the stream or next week depending on How much hey we got a circuit pie drive Okay, so let's do a split here Dev serial by id usb Need a fruit Okay One plus one works. Let's try doing a pretty big Bite array of maybe like I don't know 20 times 1024 So 20 a bite array of 20k I'm like I I barely touched this heat growth stuff. So I'm kind of curious one gotcha is Gc.mem free gives different results now So this says 110 um, let's just um learn a little bit about this so import um Port Malik, let's just do a mp print off mp plat print new alec Of this size I'm curious Let's even do it like this Where we'll print it after the pointer equals I mean it'd be great if it just worked How nice would that be And then import free Haven't mounted the file system. So I shouldn't need to unmount that to be to be nice Yeah, type validation would be so nice there The fact that I could pass in the heat Ugh There are definitely some people talking about how gc.mem free changes with it It does a mix I think the way gc.mem free now works is that it all of the pools that MicroPython has gotten will have free space. So it calculates that and then adds the large the single largest chunk Uh, that's available outside of the MicroPython heap Because the way gc.mem free Works though Huh, of course stuff is so far over my head. It might as well be looking at someone's coding in greek I'm excited about memory stuff I'm hoping it'll make it simpler. This does not look like it's actually running. I think I actually rerun I think it's in pi runtime At least runtime that each will get it Dee dee dee dee dee dee Yeah Get my brain back a little bit, which is good The other thing is I was I've had this long running goal of redoing the build system for circuit python And I think I've gotten Closer than I have previously to knowing how I want to do that The main thing I want to do is like with with make currently All the boards are built independently of each other But I'd really like to Stop doing that. I'd like I'd like to be able to share compilation steps across boards To make it much faster to build all of them Um All right, it came back up Okay, let's oh, we got a port free call with null That seems bad So maybe we should fix that I don't actually know where these are all coming from So interesting There's another port free null Yeah, we should probably fix that that looks bad Like why are we freeing null But we are also successfully freeing Oh, so 1536 I think is the pi stack Is that right? We could we could print stuff out here too Or what we could do is we could disconnect usb I have it on one of those usb cables where I can just flip the switch and it goes away Um, we have a debugger turns out So we can break on port malloc You can reset and then continue And the first one The 1536 is the pi stack It is safe to free null on some systems, right? Um I think so Like yeah, generally it's a matter of like whether it Whether it checks for you or not um Okay, so pi stack The initial oh, yeah, I said the the initial heap is 12 k Um, or maybe it's 11 k Something like that And the size here Oh, yeah, so this is cool um When we do usb stuff now it uses this port malloc thing Um instead of the supervisor memory allocation So I like I literally deleted the like supervisor memory stuff and fixed everything else to use port malloc So that's what this is doing. So this is prepping to do enumeration Configuration descriptor Although if we look here, I guess we missed it. We missed it here So let's keep going So this is so this must be The pi stack. Yeah for boot.pi heap for boot.pi And now we're getting ready to run usb 528 is another usb thing Uh hidden stuff So this is cool because um We'll be more flexible and I was talking with tac about this a little bit too of like we could actually be um Um We can be a lot more flexible with tiny usb now So like these allocations we're seeing here won't happen if you like disabled hid or you disable cdc or whatever But there's actually like big static buffers that take a lot of ram kind of always even if usb is not active um, or you've turned off parts of usb so uh I think this world where we're doing more dynamic memory allocation is actually going to be Better for memory use especially on the samd 21 actually because samd has like 5k Statically allocated by like the build And the majority of that is all data structures for tiny usb What was the reason again that you need two independent stacks? um, the reason that I did that is because um If you don't use the pi stack The c stack is used for small python stack frames, but for large ones it goes to the the heap and um because they're like large frames at that point they're actually hard to Allocate on a tight heap So instead I I switched to doing the pi stack stuff. So it never To execute a function call. It'll never go to the the heap to do it Um, so that's why we switched. I think I was think there's also a stack less mode Which actually always allocates on the heap and that might be better I don't know. There's a lot of things to think about of like How allocations on how allocations on the micro python heap lead to fragmentation in things Um, so it'll be really interesting to just see you like with this heap heap growth stuff How well uh, how well it runs for folks um circuit python for a number of major versions has had this like long long lived thing And we ripped that out before we did the merge And I think we've decided that we're not going to do that. Um So long lived used to say like For everything that's referenced by this thing you just imported we're going to move it And again like moving causes bugs dan just closed some of those because we're not planning on doing that so There is a world where we could think like Memory stuff like that makes my head hurt. So I get it. Yeah, it's really hard to know how well you're doing For memory stuff because like so many people use uh things in different ways um So i'm really curious to see so alpha 2 Doesn't have this but probably alpha 3 will and it'll be interesting to see how many people go My project doesn't work anymore and we'll figure out why and figure out how to tune How to tune this stuff. So we're being more aggressive in adopting the auto heap growth than micro python is So I fully expect us to have to tune it on our on our side And kind of like let micro python know like hey, we did these things like one one thing I was thinking about is I was reading a let's pull it up Instead of me just trying to it to remember. Let's actually pull it up. So here's our source in pi gc Dot c And then if we just look for oh, maybe it's here Yeah, so here's micro pi gc split heap auto So 120 had split heaps 121 has auto growing split heaps um So This is the algorithm that it that it does to figure out like how much it's going to allocate um So at minimum aim to double the total heap size. So allocate when you need to grow you allocate you try to allocate um As much as you've allocated previously So you get if you have like two blocks you sum the size of them and then try to get a third block that size Um, but if it's too big Um The new heap is made exactly large enough for that allocation Um, if it won't fit in available free space at the largest new heap that will Uh, basically take the remainder of the heap up. And so I think it's yeah, it's going to be really interesting Like all of their testing on the esp side probably worked with what's what ps ram where you had a lot of room Um, but like we're going to put it like this is on the same d21 with 20k Uh memory and so it's going to be really interesting to see like How well it does At the the tail end of things one thing I was thinking is like, oh if if the last allocation if it can't fit Just basically takes the rest Um, we probably don't want that just in case we you do something that uh, we want to store Like keep it around with If defrag is a problem then when a defrag program like windows I have might eventually be a thing generally know Um, because it's really hard to move like it's basically impossible to move memory once you allocate it Like you can copy the data, but the hard part is updating all of the people that think something is there so you gotta you gotta When you do an allocation you return a pointer of memory and then you don't know where that pointer Which is basically a number gets copied around And so if you were going to move it you would have to go to all the places that that it's been copied and change it Um And basically you don't do that what That's not the expectation Defragment or like fragmentation is just generally a property of like the algorithm you use to pick to where things go Um So there's a lot of the tuning we'll have is like how do we exactly grow the micro python heap um as we need to um So yeah, we'll we'll see we like this is aiming to do doubling but doubling is probably Especially on the small rams not gonna really work like you're only gonna get one or two doubles Maybe before you hit the like the case where you don't have anything left Um So we'll see This is why it's alpha This is why it's alpha um Yeah, it'll be interesting and and we can we can tune it for sure Okay, so pie stack for code dot pie And now the heap And I should probably make this number. I think I I think I hard coded it Main 197 I just guessed I I came up with this number when I was just doing the testing brain So here's the here's the pie stack allocation size So it has a default value, but then it will check the settings dot toml To one asks did you read books on this topic or is something you learned during your degree? I I remember Seeing a little bit of Heap stuff in my degree, but it's basically not what I'm pulling on a lot of what I'm pulling on is The investigations I did years ago on On the micropython heap And then the tlsf stuff I really just copied to expressive Like I had a conversation with Ivan who works at expressive and he had mentioned to me that they were switching the to this tlsf thing For idea five and so when it was like I need some code that will give me a heap um I need some code that'll give me a heap. It's just like, oh, I'll just use what what they found and You know some some smart person came up with it Uh, I just adopted it Um, yeah sees so this is just my hard coded 12k But I have a feeling what we'll want and maybe what we'll what we'll do is similar to the py stack where we'll actually like Have a default that's configurable by build and then And then also allow you to override it in settings dot toml I'm liking settings dot toml a lot for stuff like that Like I could I could make a thing where you can like do a function called a supervisor that will change it a later date And then it's just like meh Let's not bother with that. So that's this is where the 12 is coming from. I think uh, we should probably just make it a A pound of fine which Might make it harder to Do later, but um, okay, so this port malak is starting to get interesting So we're now in this like We're trying to To make a string copy We're trying to allocate 21 bytes Um, and we've run on a memory. So the gc is trying to add 3 3105 Um, and maybe we just go up one info locals And it's all gone Come on The don't move things is just like I had this moment when I was fixing the rgp matrix problem where I was like, oh, I want to be able to move memory like like we want this and I was googling just like how do people on embedded do moving memory and It was crickets like you couldn't find so you couldn't find people that were doing that And it's like, okay. Well, that's that's probably the problem then is like I'm My desire to Move memory is the wrong desire. Like I got to figure something else out instead Um, and then this heap growth stuff. I kind of knew that was coming and I was like, oh, well, what if like We the requirement to be able to move memory was because we like would allocate into the micro python Um manage heap and then like And that in that heap would at the time or for a long time has had to be one continuous chunk of memory um But now that's not like the split heap stuff allows you to not do that anymore Um, and then this autogrow stuff is just a bonus where like you only grow as you need it I lost my train of thought. Okay, so we're just doubling again And we're basically done So the other thing I want to do while we're off usb Or I want to figure out what is freeing null Just because that's like a to me that's what I what I've heard the term like code smell Like something's wrong if you're freeing null So I'm just gonna say if pointer equals null We're the this is an nrf and it has um An assembly instruction for break point Which is really neat so you could just Reload debug We'll delete that other break point that we put now it's loading the code it pops up You can't see it but it pops up right in the middle of the screen Because you know, what's better than running a cli and having it pop up a window Um, we're gonna do info break points We're gonna delete the port malik. We don't want that any said but generally when I'm running a debugger On circuit python, I will always have this reset into safe mode break point Um, and this is this is what gets called if you ever see If you ever have circuit python restart and then tell you it's in safe mode This is how it does it is by calling this function So it allows you to Allows me to catch like the the trace that or the back trace that led to led to the safe mode happening Um, okay, so we deleted that break point now. We're gonna continue And here we are we got a port free And now we're in cleanup after vm 391. So let's take a look at that It's in main In 391 391 Ah, okay, so clean up after vm, but then I also added a interesting system flush reset reset reset Hmm So it's null because I did it here But I don't think that's what we want So this is like the process that Oh, okay So we do call stop mp here, but we're also freeing it Is this where we allocate it? What is the corresponding And then start start so clean up after I shouldn't do it. So this actually should probably go in stop Because start So start mp does the pi stack Allocate here Then it does the Heap So we'll do the inverse here. We'll do heap and then And we should be good about setting it to null Okay, so that should be correct So if we run it again, we won't hit this That break point that we added The break point instruction Any questions Quiet day. It's friday But yeah, I've been thinking a lot about I really want to redo the build system Which is not a simple thing But I really want to be able to like I said, I don't want board builds to be isolated. I want them to be shared The challenge of that is like whenever we turn modules on and off We we pass them as um seaflags and that makes our seaflags really different for every board Every fact of the boards build system Yeah, it's one of those tasks where it's like, oh, I'll just start it and it just like goes on and on and Like one of the challenges is that queue strings Are used in basically everywhere. So if you want to read If you want to share work, you've got to figure out how to make your You got to figure out how to make your queue strings kind of like the same in more places um Sharing binaries across builds are also like another level of instruction like virtual tables I found this pants build project and I think that's the direction I'd go But it's not What do you mean that boards are isolated? So the If you look in the build directory Like you'll see that um this firmware.elf was built in build-feather nrf 52 840 express and under this Under this directory, there's All of all of the source like all of the objects for all of the sources are under this directory So if I build another board it ends up in a completely different board build directory. So like Even if even if it had all the same settings, it would be in different directories and we do the work again um That's not true from um From like translation to translation but like There's so much duplicate work like every when you make every board you're compiling like pie slash compile dot c for all of them even if like None of the none of the like c flags change the behavior and like what what you get out of it is the same um That what you get out of it is the same as the tricky bit because queue strings change based on module settings But they don't really have to I think there's a way that we could change the way queue strings work so that we number them all globally um Yeah, every board basically builds circuit by thermos from scratch Um, which the more and more boards we have means the more and more waste we get Perhaps you'll have to invent a new build system to handle the shared code. I tried I've started that I have the domain bare metal ninja and bare metal dot ninja or something um The thing that I was looking at going on this tangent a little bit, which Is probably good. So there's a system called pants And I've been kind of like learning a lot about it. Um, they don't actually have c support yet um But they do have a plugin api and the plugins are written in Python, which is great um so There's a target api and a rules api um And I think the target api is like we would make a target for a circuit python board build um And they have this way of like doing defaults as well um Yeah, the other So queue strings make it hard And one way we could do that or what one way we could improve that is that um We basically factor out the queue string stuff and we try to do it for all things so Find all the queue strings and all the source files and then number them all And try to number them in a way that if you don't have some of them then you like lose a consecutive chunk Um, and so you're left with consecutive chunks of the queue string numbers um That's the thing that the queue string stuff is what changes it Uh, being able like ideally if you had a hermetic build and and they were actually the same you'd be able to say like I do two board builds. They're in two separate directories But um, I can say that like this dot o and this dot o are the same Anyway, because they came from the same source even if some of the like The pound defines that it had were different. They didn't actually matter um But because queue strings you like can see queue strings are Strings that are interned and they're given a number. So if if you have two boards, but there's like one There's one queue string that appears in one, but not the other It's going to change the numbering for everything after it, right? Like um, so it's hard like I've I've tried to do that analysis of like If I just build all the boards How many of this stuff is the same at the end of the day? Um, yeah, and that's the other thing. So dcd points out like how would you catch pound defines that affect the binaries? Yeah, so that's the second challenge is that we use um We use a lot of command line defines to set behavior And this is the thing that my brain is still kind of wrestling over But generally we know We know all of the pound defines that we're putting on the command line um, so either we require that we actually declare those up front or um We declare those up front so that we only add them to the command line for the files that need it Or um Yeah, ultimately, I think that's what you have to do You could probably be smart about it where you like Do a run where you provide them all And clang has this tool that can tell you all the preprocessor things that happen so you could like Automate the detection that something is used um, and then like Put it out So this is the this is the thing that I figured out though. I think I know how to I want to do boards um I I think what we would do is we would have a build file that had like a circuit python build Or some target and then I think we could actually do like Keyword args for like display i o And like you just say display i o equals true or display i o equals false and then Internally the rule would know like okay now I need to grab these sources to do that um So yeah, I'm like I'm thinking it over um Yeah, the build could be fast so there would be a way to catch the breaking conditions Yeah, I think basically you have to get away from this model of like the c flag defines applying to all the all of the things um Yeah, and there's some optimization that we could do as well of like For every translation on the samd we do an lto link and lto links are slow but maybe you could like Link everything but the translation strings And do that without lto and that would be faster um Future tags and board features perhaps. Yeah, that's kind of the idea That's kind of the idea. Yeah I really do want to do it The problem is is that like the c world and a lot of the stuff we depend on are going into cmake And everybody I talk to who uses cmake does not like cmake um And so i'm like uh and none of like even cmake doesn't really solve this problem like if you look at the way cmake is set up for um The way cmake is set up for like the idf you just Give it a top level Flag that says which board you're on and then you end up with like a cmake directory just for that board and like that's not Like that doesn't solve the problem i'm trying to solve um So yeah, i'm I'm still thinking about it. It's not high on my priority list I was joking with uh somebody in the pants community earlier that like The day that github Starts charging us for the the github actions time that we spend that that's the day it will be a priority to optimizer That's the day it'll be a priority like a like i'm going to be paid to work on this priority to get us our build faster um Every time I open cmake and I see their like own language. I'm just like oh, this is not what I want So that's one of the appealing things of pants Is that like even though the core is written in there's some core parts that are written in rust like all of the plugins are just python um And one python is one of their main build targets as well um Okay, so we fixed that free let's um Start it back up and we'll turn our us beyond and see where we're at The pitch of doing cmake is that when like the idf changes things then That's kind of like done automatically I don't really like the world where Like I grew up and in c++ grew up as a like developer at google like after university I went to google for like almost six years And uh, they have a mono repo and like they have this Thing where they you give the full path to like your header files. So you actually know where you are in the file system um Oh Run code.py 762. Do I not delete it? Hey, that could be what Espressive is it having as you would spin your own scripting language Yeah, the other problem is is that I don't think it needs a scripting language like I also have a background and Configuration languages that are not Turing complete and they are much nicer For certain things like defining build metadata. So that's one thing I like about the pant stuff as they say like In your build files like your goal is to just give Metadata like extra information about the things that you're building Which I think is nice So what I'm thinking is that you would do like From the top level of circuit by phone you'd say Pants build ports expressive boards Whatever board and then it would build it And it kind of be like a global in the same way that we factored out like main we would factor out completely this This build process and I think what we would factor out as well Is like we have like a lot of these mk files which are make files that we use for configuration And I think We were probably moved to using like Pants to do all of the configuration of like that on this board. We want display io. Oh the other cool thing that I like about pants That was like really made me interested in it is that it also has a notion of environments So Targets like this I think can have options that are like generically command line options. So there are things that like Kind of globally apply but they added the idea of environments And I forget where it is in here Oh, here it is environments. So It's new um But your targets can say what environment they want And then an environment can set kind of like globals so On expressive build you'd say I'm building in the expressive environment And it would define like what the compiler was and all of that Which would be neat, which would be very neat And they have this like defaults mechanic too, which is cool So you'd be able to say like like we have these dot we have mp config port mks So that would be replaced with build file where we say here's the defaults Here's the defaults for this particular port for example So yeah, I think I think this could be the way to go but there's like some stuff that we have to figure out How to make it more uniform across boards I don't know maybe I'll take a stab at it Maybe maybe maybe Let's see if we fix this book Let's not get too distracted Wouldn't be a deep dive if I didn't go off on the tangent. Hey, there we go So it looks like it's working. Okay Um, I think what we should do we have 30 minutes on the stream still Um, let me know if So this looks nice like everything is being freed Here Actually, I wonder if the expressive build works now So let's um I love to do debug prints In fact, I think I will leave those actually But what I was going to suggest is let's uh I was going to show how I like to delete them which is using um Sublime merge will show you all the changes you made and you just hit revert Which is really handy Where did my So now I'm going to try This feather again And we'll just see if it works Maybe we maybe we fixed the the next code configuration thing is what the expressive Build was hitting Don't know what a breakpoint is. Okay This is what I was talking about merge. So here we can see Changes that are pending So this is the the crash thing we fixed. This is a expressive build fix This is two And so you can do discard hunk here, but you could also Highlight particular lines and just say discard lines So I left the prints for now But we could discard those soon enough as well But yeah pants looks pretty neat. I I the other thing I'm thinking about is like how could I Like I don't have to do everything at once like could I do a switch to pants without changing everything? like maybe we still build every board or Like c flags still has all the c flags to start And that's probably the way to go like Get it all switch over to pants even if it's not optimal and then later you can figure out like, okay How do we manage that? That this thing that can be shared is actually shared So I guess the problem is is that like In order to know you can share something You have to know that the inputs are the same Whereas, you know, if you if you compile a file with two different Uh pound defines that are That don't matter the inputs are different and therefore it doesn't think you could share it So you actually need to figure out how to do that which you could auto detect And one of the pitches of pants is that it has automatic dependency inference So I'm trying to figure out how it does it But I'm wondering if it could have like automatic like Dependency on command mind arguments things Are the queue strings touching every part of the code base? Or is there stuff where you can be sure already that it would be same across builds? uh queue strings are A lot of places so that's probably something that you want to Do early It's all over like the py directory and stuff anything that's like a keyword anything that is like a A keyword or a reserved word and like python is going to be a queue string On the concept of inputs, that's one of the things that cmake is trying to do also maybe other tools do that too What do you mean about what cmake is trying to do? Maybe more specific But like right now when we add a new module you have to add all this boilerplate of like Adding circuit pi underscore the module name blah blah blah, but it would be cool if it was like auto detected by identical inputs for different builds uh Right, I think I think generally all build systems have this problem Of like they don't try to share work if the inputs are different Like so we we would have to figure out how we want to tell it that the inputs are the same Like if on the command line we say what the board name is the input's going to be different for every board Like you're saying environments Oh, yeah, the environments thing is really cool the thing like mason is another build system and it has integration with cmake It's also python like or it's implemented in python um It has environments, but the targets don't can't say what environment they want to be in Which I think is what I like about this is like In a particular Ports directory or in a boards directory. It can pick what environment it's operating in and then that applies globals to everything right, so this feather Espressives say is build me in the expressive environment and then that applies to all of the files up Elsewhere. I hope I don't have a working yet, but I wonder how I could I wonder how I could get this to Be a smaller thing Oh, and I'm looking at my esp that I loaded and it is still restarting So it is not fixed unfortunately um Yeah, I don't know I really kind of want to try this pants stuff, but there's no way I can make any progress in 20 minutes um Maybe let's just look at the Build And this is probably all code size So the problem is that we're bringing in some code with the tlsf stuff Oh, the broadcom port has a thing Oh This is the this is the alignment thing that we were fixing In expressive But it still doesn't run Oh this one we could fix that's an easy fix we could do Simul is probably code size No, it's not Dangling pointer What? Okay, that's weird. All right. Well, this one's working Well enough I'm gonna I'll do the expressive later or Later Yeah, I do I kind of want to try the pants stuff, but I just know what's going to be a sink Like Yeah, it would take me a few weeks probably to do that It is not a small It is not a small thing changing the whole build system And like that includes like redoing how queue strings are done like Like queue strings translation compression would all be great to do separate of boards Um That would be nice Yeah, it's just Something they continue to think about Let's do two easy things. Let's make um The one what is it the glasses? expressively fixed Adafruit LED glasses by 52 40 but yeah, like I Pants is the closest thing to what I've found of like Being able to do what I want Share between build targets. Yeah, and like that's what see CMake hasn't shown me that that can be the case and the reason is is because there's so much if this then that stuff in CMake I was like, I really don't want as much of that Okay, so this is an easy fix because I I changed the capitalization of it Um And apparently I didn't change the capitalization everywhere. Oh, see this is something maybe we should we could do in this time So the other thing that I want was hoping once we have more dynamic memory. I'd like to remove the restriction on How many displays you can have Now this is I wanted to pick my audience's brain on this so If we don't limit you to one display Do you expect all of the displays say you have three? to stay active Why after your code is done? We're only going to put the serial output on one of the three So does it make sense for us to maintain the other two? Like we have released displays and it's plural, but maybe it should be singular Um I don't want to copy what zephyr does. I find what they're doing very complicated Sorry Like zephyr zephyr is coming from a bunch of people that know linux. And so it's kconfig kconfig confer configuration It's CMake for building underneath their own tool called west which is written in python And then they also have device tree for uh configuration Um Yeah, I mean active means In my book it means active means that the that like the The display Objects are active still now We don't have a way to get them back We don't have a way to get them back Yeah, maybe it is that like We can have more than one display Outside of the heat, but that's only for like the The boards that have multiple like we only have one board the the monster mask has two displays right one two and It would be cool if we could just have Display left display right or something in board and they just both work. I think that would be neat. Um Um But if you instantiate three displays in user code, maybe only the first one Stays on as the console um So this impacts how we where we um If it saved me from maybe having to re-initialize three displays when I drop to the rebel if I'm testing there But that's not really like right now. We don't expose those displays Like you there's no way you can get them back Like the real reason we keep it around is just so that we can use it to show Like the reason there's release displays. I was thinking about this like why don't we just Disable the display when the code starts, but The reason we have release displays is we're trying to keep it around as long as possible to find any other errors So maybe there's an error in your code up high before you call release displays and then you can see on the display still um But yeah, I think I think really what is we just need one display Like the first display that you allocate in user code is the one that will keep around the other ones will live on the heap and just work Um, and then go away when the when the VM is done But this is this is a unique case. So for this board We'll do two Like we could just do two static allocations Uh Yeah You have two static allocations and then But if you call release displays you lose those and they never get them back Um, this is the thing that I want to get rid of this thing that I have pulled up here So the way that we currently do is that we have this circuit by display limit and then we have these Union structs that basically say like any one of these things can fit in this spot Right. Yeah. Timon is getting at the fact that like there's no There's no user benefit to having more than one display active Because we're if we assuming that we're only going to show the REPL on one of them Now the other thing I thought about was what if you Like in this case, what if you could actually put the REPL across the two? Then you have twice as much space to see the serial output That would be cool, but that's a much bigger change to display IO right now Um, because right now like we assume a group is only in one display Maybe in case say if I have a tft display in an is 31 display or an led matrix display The other thing I was thinking about is like whether Whether deanitting a display prevents it from showing like the last thing And this is a like the e-inks kind of have this problem too I think what I am getting at is like it's probably better to just do the first one But then you also and it's not even the first display. It's the first display It's the first display or first display bus panel lines displays I think in practice, that's probably a limited use to have REPL go over silver displays Yeah, and it's a huge change is a change to display IO Yeah Yeah, the other challenge is like The first display wants to keep around the other stuff So if we're not moving everything We have to say The first display bus and the first The user can define where the REPL pops up so they can actually with root group So maybe that's We could allocate all displays and all display buses off the micropython heap But deanit all of them except the one if it has Well, if one of the displays that's initialized has the terminal on it Keep that one If none of them have the terminal on it put it on the first one That is not deanit and See you see me Like I don't want to have to move anything anymore, although that's not going to be true Because four wire uses a spy object. So the spy object still has to be moved And iSquared C display uses an iSquared C object that also should be moved Um, this is why I haven't done this part of the code yet. It's because I'm not sure how I want to do it But the goal is to remove The the goal of changing this would be to remove this display limit Yeah, there's e-paper as well Or e-ink Um, how does it work for say that monster mask where the board startup initializes both displays? Is there any way to get that back without rewriting all that code in python? Display equals board.display so you can have multiple things. Let's say do we initialize both of them? I'm not even sure we do But that's not too bad of a problem because you know Kind of a build time that you're going to do that and the board knows it It's more the like how do we If you come along and make a four wire bus Do we allocate it to the outer heap or the micro python heap? um To start and I think the answer is we have to allocate anything That might live longer to the vm to the outer heap and then we clean up everything that we're not going to keep around Um I think that's the right call Like right now it tries to fit in these slots Well, that's the other problem is that If if you're allocating a bunch of stuff that lives outside the heap How do you manage the that memory? All right, like how do you make sure you free it if you actually want to free it? Let's see what the monster mask does monster mask board so four wire And it does this allocate display bus call And it does an allocate display Yeah, see it only starts up the left one Like that's what the sport is right in the monster mask. Yeah So it doesn't even create both Which I think it should Like if we look in pins.c Like it has left and right tfts. Oh and it does have Oh, it has Display and right display right, but it doesn't have a left display Um Which it should in my opinion And it should be kept around like if you redo the vm Yeah, I'm gonna keep chewing on this idea Um, any final questions? I know it's been kind of a My brain is a little bit better than it was at the start, which is good Keep one for the rep. Well, as long as it when I restart my program my hands at all nicely Yeah, I know like everything uses release displays, which is like I wouldn't mind getting rid of release displays, but I also I also want The air like the display to live all the way through that It's tough displays are weird. Oh, I missed one. I can go back to doing the simple thing This is a pretty good example both in the build the build stuff and this display stuff where it's just like Maybe I should just play like an hour video games and my brain will figure it out like If I stop thinking about it, I'll probably make a decision Probably figure out what I want to do The pants stuff is tempting simply because I know where I want it to be like I want I know what I want Like I was talking with Liz about writing circuit by thumb drivers And the first thing I I like to do is The first thing I like to do is um I like to Write the example code before it actually works. Like I feel like I've decided what that is for the build system All right, like I want In every board's directory to have a build file that is where we configure what Modules are active And then that will Determine what it links to and all of this stuff It is definitely something that I could be like, I just got to get like the build stuff once I've made a decision It's like, I just got to get this out of my brain And just see and just start you can follow like my github repository. You can find all sorts of like um pending branches and stuff that I that I haven't finished And like I literally have a domain name for like I'm gonna make my own build system for like bare metal ninja And it just got really complicated Um, yeah, things get complicated Yeah, example code is a little crimes then Which is very similar to how zephyr deals with modules Uh, how is it similar to zephyr dealing with modules? I don't know a lot about how zephyr does stuff. I just know that it's like giant and monolithic and Makes me unhappy anytime I see python over cmake and like Like the idf does this too is like Why are you just using python? You have a comp file for every board overlay in a project Does it build the separate for if you build two boards? Do do they share a build directory or not? You can build pull in the things only you need Okay, I mean we kind of do that with the make file already, but It'd be nice if it it would be nice if if it was like better structured Like we do this configuration step we do which figures out all the source files we need and then Right now we pass all of that down into the compilation stage using defines But that can get you into a lot of trouble In terms of like I passed all these defines into this file and most of them are ignored But the build system doesn't know that they were ignored So like one thing I was thinking about is like maybe Maybe we require Like Instead of doing Defines on the command line we generate header files that have the value And then those header files get imported so that like But then again like Every board would have a different header file anyway So I think I I think at some point you have to like be like I actually have to have some metadata about what this needs The project build directory has to be torn down if you switch boards Okay, so there's like Two separate build directories Yeah I know kconfig better than I did when I looked at zephyr last time because of the idf But I found some warts of kconfig in the idf that really make me not want to use it Um, it's too complicated. You don't need that. Yeah, it's it's it's too complicated And there's some you can shoot yourself in the foot for that Every project will hook into kernel stuff with the device tree header changing every time So they need to do something there. Oh, so it changes the header that impacts a bunch of stuff Botzerker asks if lady is lady it is here. Nope. I work for Adafruit. I'm scott. I'm not lady ita But I work with lady ita and we're just about done I'm just talking and thinking And I've got to fix I want to fix this build Simple thing I just renamed this I don't usually camel case the C types And I ran across it and I say that and then rgb matrix is capitalized here Ah It's not me at first, but it gets really nice after a while the weirdest bit is how device trees implemented other than that It's mostly scum less complicated than linux does to not seem like a very Or low bar or whatever it is linux is very complicated I like I want simple until I don't I want as simple as I possibly can Extractions for drivers. Yes, that's great. Except we already have that in circuit pipeline Like that's the we don't need that part of it collect pointers 354 That's when I saw this like default thing for pants. I'm like, oh, I wonder if I could get away with doing that Like I recognize that using pound defines is like really complicated And like there's this mpconfig.h file that gets like It gets included into everything so if you change something there then you're just getting it, but But that's okay. I'm like not trying to save you from changing mpconfig.h I'm trying to save you from like switching boards I don't know it will have to take a hard look at that stuff Okay, undefined references. I had this because I didn't do a clean build in virtual environment Because I'm building in my thing kconfig bits are quite minimal. It's like a bunch of this plug and equals y for your project. That's it Yeah The warts I found with kconfigures like I was trying to do dependency analysis Um for the espidf stuff and then I found the fact that setting some value can force a value somewhere else and it's not considered a dependency And that kind of just made me go like Like there are a few cases where we need to say like You really shouldn't have like frame buffer display enabled if you don't have display io enabled We do have a little bit of that but There's simpler ways of dealing with that dangling planter That's a new one. My that is I think it might be because circuit pied usb is disabled Anyway, we're after four o'clock I think I will wrap up even though my brain is a little bit more here than it was at the start um Thank you all for like letting me like bounce these ideas off you and if you have Ideas about all this stuff and even better if you want to try implementing it. Let me know You can find me and all these other cool people on our discord server adafru.it slash discord is the the link that will get you there um I'm there during the week usually unless the kid has pink eye And then I'm off and on Which is what happened yesterday. That's why I say that If you want to support me you can do so by supporting ater fruit They're an open source hardware and software company based out in New York City I am based in Seattle You can support them by going to adafruit.com purchasing stuff there If you have unique shipping Constraints digikey.com can be a better place to buy from for that and also They might have things in stock that adafruit.com does not as well So feel free to support adafruit indirectly through our resellers as well Give circuit python 9.0 alpha 2 a try And alpha 3 will hopefully have all this heat memory stuff in it. So give that a shot and and let me know Where it falls down Botzarker has got a last minute question Lady ada is working on the eyes code for the new Two inch and four inch round screens. Do you know if the software has been made public? I do not I know the eyes code is Done in arduino Which is a little bit further outside of my Knowledge area. Maybe somebody on the stream knows I would ask on the discord server Once it's done, I'm sure it'll be open source, but I don't know the state of it. I actually Haven't had a lot of time to watch all of the other adafruit streams I think that's it. Thank you in advance to dcd for taking notes and uh I'm excited that 9.0 is turned this corner and thanks to dan for that as well Um Yeah, I'll talk to y'all next week. I think I think I can stream again next week I'll double check if you want to be notified. We do have a deep divers role On discord that um, I I will I don't ping very often But like if I inadvertently like think i'm gonna do it and don't do it or stuff like that I can ping that role to let people know so Ask me on um Ask me on discord and I'll add you to that role if you like Anyway, um It's weekend. Yes, uh, have a great weekend everybody and I'll see you on the discord next week and probably streaming next week as well See you later