 All right, hello everyone and happy Friday Real quick before even the intro I just wanted to note the the stream will Look a bit different this evening Unfortunately, I can't really pull up the chats right now ordinarily. I have the chats on the screen down here below me But unfortunately, we can't do that today. I do have the windows open The YouTube chat and the in the discord chat here Which I will try to keep an eye on so that is still the place to go if you want to ask questions or Have comments or want to interact or anything like that I just can't put them on the screen for this particular stream It turns out the version of OBS that I have it crashes whenever you add more than one source so I can have More than one source of like screen Window or whatever so I can show you my screen which is what's you know The main thing showing right now you could see that we're in the browser and I can bounce back and forth between IDE and all that stuff I can show you this but I cannot have this and the chats right now The good news is the beauty of open-source software This is an issue and it is closed and there is supposedly a fix in for it So fingers crossed hopefully I just need to get a newer version of OBS Which I think I can get from the release page of OBS studio here on on Get up anyway. All of that is beside the point the main Thing to keep in mind for today is that we can't show the chats on the screen. Unfortunately. I've got them on my other screen over here I will try to keep an eye on them How's it going to see Grover by the way? Welcome to the the discord chat over there. Good evening and Good day to you So I will try installing the new OBS Sometime hopefully after this stream tonight and before my stream tomorrow. We'll see if that ends up Working out or not But I did not really notice this until I was getting ready to set up for this stream And I decided it probably was not the best idea to just go and install a new OBS right before I was gonna get ready to hop on this stream just in case anything goes wrong so today We're gonna roll with no chats Hopefully that's all right Yeah, that's how we'll do it today. How's it going be autograph? PWM debugging is making my head hurt, but at least I have one LED pulsing now. Nice one is better than zero Definitely definitely how it goes sometimes for sure Let's see here, so I'm gonna just shuffle around a few more windows and then we will be ready to Actually get started. So yeah, there we go. I think so Okay, it's like that's weird. All right, so with the the chat note out of the way and I'll Re-mention that again later on if anybody pops in who's asking about it But yeah with that out of the way Onto the normal intro so to anybody that might be new hello to you hello to all of the folks returning to watch the stream My name is Tim. I go by foam a guy on github and discord This is the circuit Python deep dive program on this program weekly live stream program We are working on all things related to circuit Python. Sometimes We are down inside the circuit Python core, which is how this live stream started if you caught it before I was ever doing it. This was started by Scott the lead developer circuit Python So he was typically working inside the core on this stream I have continued it on in his absence for now He's still you know, not not really ready to be back to live streaming on a weekly basis So I am still here streaming on Fridays. Sometimes we do get into the course Sometimes we work on circuit Python libraries sometimes work on infrastructure sometimes work on projects Just depends from week to week what is going on in the world of circuit Python and what has my attention for that week This week what has my attention is? Multiple displays, which I don't actually have this pulled up anymore. I should have done that I think I got a bunch of this stuff ready and then I Ended up rebooting You know what there's actually an easier way to find this I noticed was here This is the one I'm trying to pull up so we're gonna be taking a look at some to display stuff today Before I do jump straight into that though Let me do finish out the intro so for folks that might be new if you haven't watched this stream before if you Don't really know what I'm talking about You can learn more a few different places one of them is the main website here So Python org the other one is in the discord the discord is shown down below me on the screen down That way over there You can join us there throughout the week and in particular during the live streams There is a live broadcast chat channel Which would be the channel that would be on the screen, you know somewhere down here if my OBS was allowing it But right now it's not But we are still live there, so you can still come there ask questions You know leave comments that sort of thing while the live streams going on There's also circuit Python dev channel where all of these sort of coordination Kind of circuit Python project occurs as well as help with circuit Python channel if you are trying to either You know work on a project of your own or Contribute to a library or documentation or anything like that you're running into trouble you can get help on the discord there I should say to you if you are brand new and you don't really know what circuit Python is This is basically a version of Python that runs on these tiny computers called microcontrollers There's a bunch of pictures of them over here on the downloads page Basically circuit Python is an implementation of Python that runs on the tiny chips the the tiny computers that are inside the chips on these Devices and it allows you to connect that device to your computer typically with a USB cable See it as a thumb drive and then edit a code file on there with some Python code inside of it You just save that code file and whenever you do the system will kind of reboot itself and start running the newest version of your code So it's a really quick way to iterate through Testing out Python code that interacts with hardware peripherals electronic peripherals typically There's lots of different Shapes and sizes for these microcontroller boards Some of them are big some of them are small some of them have built-in hardware like keys and screens and knobs You know, there's different ones that are you know better suited for different projects In particular today the one that I am interested in is kind of this monster mask device here Which is the only device that I know of that has Two built-in displays in its hardware. So we're looking at multi-screen this stuff today And this will be the the device that we're looking at it on So, yeah, that's what we're interested in here if you want to learn more like I said circuitpython.org and Then the the last thing I'll mention there is circuit Python is an open-source project Anybody's allowed to use it on your own devices. Anybody is allowed to add support to new devices for it So if you are a third-party manufacturer, you've made your own devices You can add circuit Python support to those devices if you'd like And there's no cost to do that All of this stuff is supported financially by Adafruit. This is their website Adafruit.com They are hardware and software company based out of New York. They design and manufacture electronic devices They also employ developers who work on the software for this stuff in particular. They are Employing the developers who work on circuit Python. There's a team of folks that work on the project full-time There's other folks like me who work on the project part-time Adafruit pays us to do so So thank you to them and of course thank you to anybody who wants to purchase hardware from them by going to Adafruit.com and buying yourself some goodies You are helping support circuit Python and the rest of the open-source Software and hardware that Adafruit is producing How's it going C Grover thanks for introducing bitmap tools during a Previous stream made a big difference with the dial animation on the VCO nice Let me pull this I will pull this over and we'll watch the video here real quick How's it going Gordy G? Good afternoon. Oh, that's neat animation some rotate action going on there So is that a like a roto zoom then for the initial like zoom in and then I Guess also the roto zoom but with different arguments for the rotation here. It's looking good We're zoom for both nice. Yeah, roto zoom is such a Such a handy utility it can really get a lot of stuff done as far as like manipulating bitmaps Scale and rotation in there John Richardson over on YouTube. How's it going my friend? I'm developing a consumer project trying to decide between Arduino C and circuit Python Worried about lack of libraries and lack of hardware support Yeah, I mean I cannot I obviously Am going to be biased on that but I certainly Think having support for circuit Python is a huge benefit Because we do have loads and loads of libraries That are already written for lots of common hardware that you can kind of take advantage of if you add circuit Python to sport for your device If it's like one of the main chips that we already support then adding support for your device is not that hard You kind of just define which pins are which and what flash storage you have and stuff like that You know if it's a brand new main chip if it's not something that has You know if it's a main family or whatever that does not have support yet That's like a much bigger task, but in terms of just adding a new board You know that is an existing family You know ESP 32 or ESP 32 s2 or at male, you know, same d51 or something like that Typically it's not too hard to add circuit Python support and you get the benefit of Hundreds of libraries inside of the different bundles that will then work on your device That's pretty cool. We're worried about circuit pythons. Not sure enough, but Arduino is old news. Yeah, I mean I will say circuit Python, you know Full disclosure, it's not it's intended as a an educational platform more so than a finalized You know package up your final product and ship it in a in a sort of business environment, so You know it can be used for that But it it's not the primary focus of Adafruit or the team that work on it to support those types of use cases So I will say if it is like if you are trying to create, you know, a fully finished product or something like that You you will have probably some work on your hands in order to undo some of the ease of operation with circuit Python because You know, it's made to be incredibly simple to plug in and then just change the code on Obviously, that's not necessarily desired desirable in some use cases where if it's like a finalized product You may not want your end users or your you know your end customers users or whatever to To be mucking about with it changing the files on there and stuff So you may have some work to do to lock it down a bit further certainly But yeah, like I said before I definitely I definitely am a biased source I will say though like anecdotally if you are interested in a One person's experience While I do work on circuit Python now as part of the team before I did ever actually join the team and start working on Circuit Python or before I ever was paid by Adafruit to work on it or anything like that I did actually use circuit Python and some Adafruit hardware devices in a project for work not necessarily at a massive scale the the scales that were involved were about 100 to 200 for one project. We had 100 to 200 trinket M zero devices Which we're running circuit Python and running a custom script that we created to interact with some other hardware Those got deployed, you know all over the US and Like I think it went great. I was very happy with the the circuit Python hardware and the abilities that we had to be able to iterate on our design and Make changes to it over time and then another project that we did was an even smaller scale more so on the scale of dozens It was itsy bitsy's I want to say it's a bitsy in four devices and then This one had another custom PCB that they plugged into which had a lot of PWM Sort of plugs with some custom connectors to drive LEDs made them up and down From that perspective like both of those projects, I had nothing nothing but good things to say about About circuit Python throughout that process of working on both of those projects Do I do consulting? Not exactly. I mean I Will say like if you're interested maybe reach out and I will consider it It's not a thing that I necessarily typically do but it's not a thing. I'm like We'll sail against either so it probably kind of just depends on the project and depends on how Much time and effort you're interested from a from a consultant essentially like what you're interested in having them do Can circuit Python firmware be encrypted? I'm not entirely sure. I don't think so not not in Not in a typical way. I don't think But I also will say like I definitely am not any kind of go-to Resource or authority on security as it relates to circuit Python or anything else, frankly Yeah, I don't think so though. I don't think it I don't think it can be encrypted I think if the person like like for instance if a person has a Physical copy of your device with your, you know, custom circuit Python on it or your code.py or whatever I believe that person can have a way to see the code that resides in inside there Especially the Python layer code, you know code.py C code that is inside the circuit Python core if you were to build a custom circuit Python core I don't think it's encrypted, but it is compiled. So it's like a little bit probably more work to be able to see that Yeah, the truth is I don't know for certain I Mean I'm trying to decide what to code an ESP 32 based consumer project I got you trying to decide what to code I see Okay, so like I said, we're looking at dual screen display stuff So let me show you what we're working on what we're looking into right now. So I ever I didn't mean to do that. Oh well try to try to run it with Chrome only today for now and see if it If that helps the computer live a little bit better, what are we on here 226 It Chrome faster. This is obviously not a monster mask This is a monster mask USB cable somehow I have managed to Remove the USB cable from here. So let me grab a cable real fast Okay, like I said, this is the only as far as I'm aware the only circuit Python device with two displays built in So it's in kind of a unique sort of category on its own two displays is Technically supported on this device. It can work, but it's not super-duper fast As you can see here, we've got animations running on both and they're you know, they're kind of hitchy They're kind of got tears going on in them Part of what we're seeing is also the recording on this camera that we're looking at this through is not the best It can't keep up all the way So it does look a little bit better to the naked eye than it does coming through here, but it does not look perfect And it is not going to look perfect on the two displays there Like especially if you have motion on both they slow down, you know, they're not super-duper fast But the the thing that we're looking into is not that that is fine that is kind of an expected thing What we are looking into is the fact that we're getting these hard faults So I'm assuming we're already into the hard fault here. Yeah Right now it says running in safe mode. We're in safe mode because circuit path on core crashed hard. Whoops If we did it again with the that's gonna be hard If I if I reset here You said it's under this on this one set here. This will come back up and it will start playing this time We have TO connected so we can actually see And basically what happens is whenever it When it boots up and it starts everything is fine. It will keep going Essentially, I think it will keep going forever. It did mess up last time I think the reason why it messed up just a second ago is probably the IDE made some right to the file system Which caused it to reset The other thing that will make it mess up is a five cause it to reset You know reset by doing a control C which is gonna break out of circuit Python and go into the REPL That causes a reset which then also ends up leading in this case to the hard fault. So if I I'm just gonna press control C in here and Actually have a version of circuit Python right now with a bunch of other print statements Inside of it. So we do actually see a bunch of other print statements an Interestingly actually it did not crash yet, which actually that might be a hint, right? That tell us the fact that it has not crashed Yet, I think tells us something it is a Little bit interesting that our terminal is on the right display now when the left display is the main one Bit odd, but I don't think it's like necessarily bad or good So I'm just gonna press control C again, which would get us to the REPL prompt ordinarily But as soon as it got there it disconnected and then now it has reconnected and It did not print into the TO's Console, but the stuff on the display here. This is the The hard crash. Yeah. Yeah, I crashed hard. Whoops. This is the same message. We saw before so as soon as we Soon as we control C and get into the REPL We crash what code runs In order to actually support the REPL I Don't know for certain so Every time I saw every time I save to my circuit Pi drive it restarts right away and then again 20 10 to 20 seconds later I've noticed the double resets sometimes as well. I've always suspected My IDE or something else on my computer is doing that extra right and then causing the other reset I've never actually tracked it all the way down though so I Don't know. Let's see search for how to obfuscate Python code effectively Yeah, as far as like trying to keep your stuff a little bit more secure in there so What we're gonna try first is actually we're gonna try to see if I can get this to fail on a different port This device is based on an atmel samd 51 Actually, let's go look at the pinouts page real fast. Let's see if there's anything like see if we can The thing is I don't know if we can debug on this device like I want to try to get a debug build The on an atmel samd. Does the debug build output anything more? through the standard serial port then Then if it's not a debug build, is there any reason to think we might get extra information there? It's basically we need to try to we need to try to hopefully get a stack trace from the hard crash So that we can then go fix it inside the core there's nothing about debug here What's the name of the What's the name of the plug on like a metro Where you plug in the j tag thing? This plug Think it's that plug or is it the six pack thing? I'm second-guessing. Well the six pack. That's like spy. I think right It's actually say I'm pretty sure that's this but I don't think any of that stuff is broken out So like I don't know if or how we can Get more full stack traces. I guess let's try a debug build first SWD, thank you Okay, let's just try a debug build and see if we do get anything more interesting out of This will be for main as well, which means it won't have my additional prints But so it'd be nice if there's a way to obfuscate my secrets by file But I don't think cps designed with that kind of insecurity Yeah, I mean we we switched over recently to toml settings toml But the the core the root of that problem does still exist, which is that it's an unencrypted text file essentially It would be nice it would be kind of cool if there was a way to have it more more secure I would agree to that. I will say it's a double-edged sword because If it were to force encryption It makes it harder to set up And since it's targeted at really really basic educational users and use cases Every kind of barrier that we can take out of the way is is helpful It would be interesting though if there was maybe like a build flag or some like very advanced Sort of way of setting it up to where you could specify it to be encrypted and maybe I don't know you'd have to maybe build a custom build and like put your key inside of it or something That would be kind of cool I Know there have been folks Throughout the years who have worked on More locked-down versions of circuit Python. I don't know the the current state of them I Know it's been something that has caught a Couple of people's interest before oh, we probably ran out of room didn't we? Yeah, I'm pretty sure I guess we need to probably turn off something Let's turn off micro lab, but we did on the other build. I don't remember the right file to put this in There we go and P config MK. Oh nice. That one's in the She keep it counter somebody. I don't want to know the number Oh Was this But maybe I should have done a clean Yeah, let's try clean. They like they broken out to pads or anything even But I can't search this image like open CV It's SWD This means just basically not connected basically right like SW DIO is just floating and then SW clock is tied To I guess three and a half volts tied to the to the voltage line with a 2.2 K resistor But not necessarily say that reading circuit diagrams is something I Trust myself to do correctly. Oh My impression of that could be wrong but are JST ports Interesting if there was like a stemma Debug thing or something that'd be kind of cool if we could debug through stemma ports or something. You say Tamil I May have Tamil is what a to ML E is no no E to ML is what I meant to say Actually sure how I pronounced that it could have could have had a bit more twang to it and came out more like Tamil Oh, there's some SWD's and the light sensor Inconglusive but not necessarily looking so good as far as like are those broken out somewhere if anything I assume it's gonna be like One of these like a tap or maybe this is that it doesn't say. Oh, that's weird. Mine's different. Is it? Oh, no, it's just okay. I see. Oh No, yeah, no mine's definitely different It's definitely different. There's no writing right here. I don't mind it does I Wonder if those three pins are part of the debug. Oh, you know what these ones over here say SW DIO SW DC Okay, okay, those are probably the two we would need actually I don't really know how I would go about connecting to them. I'd have to just bodge Kind of like Bodge wire hang off of them honestly Maybe if it comes down to it, maybe we'll do that. We'll see I'm gonna try without that And I even like ultimately I'm gonna try on the expressive port a bit It comes down to it though. If that's the the best way to do this. Maybe I'll Just kind of stick a bodge wire on there temporarily and then see what we can do with that We need to get to bootloader. I actually have I see Tom. Well, that's how you pronounce it. Okay Let's go. I think I have this import. I've been using this reboot bootloader Instead of trying to play the double-click game I made this script with just the commands in it actually reboot there Pretty convenient, especially if you are developing and find yourself doing a lot of these You know make a build and then cp the file over The thing is I don't think that this actually Princeton the additional data out the USB port I'm not sure Wonder if we should have changed codepie Control C once We got code done running press any key We'll see you one more time Didn't crash and it's actually updating here. Huh. We made it way farther Well, I mean We made it two steps farther. It does have the hard crash message on there though. That's interesting Wonder why we made it farther Anyway, though, it did not print anything out as far as like more useful. Honestly, basically it's same message What we're gonna do is we're gonna try to see if we can find the same hard crash on ESP port because the feather Gently bring this one back over the feather ESP 32 s2 As a debug pin which will out print output some more Detailed trace back information for us if it's in debug mode So I have to look around for that flea cat does not find it. There is a Tamil I mean the coolest and simplest markup language If we can get the same thing to fail on this device We can read it through the debug pin, which is like the top right pin up here I have it connected up with these wires There's not much to see but they're connected with this thing which is an FTDI cable we can Basically see more information and in particular it spits out a hex Representation of a stack trace that you can then turn into an actual stack trace Using some helper script that's inside the core repo So if we can get the same crash on this device, we should be able to get the stack trace for it now The tricky bit is gonna be can we actually get the same stack trace? All right, the same crash I should say on this device And I not necessarily for sure We're gonna be able to I think I did try a bit and did not actually run into the same issues So we'll see Unfortunately, I don't have that reboot bootloader, but I am actually just gonna copy that because I've got a copy of it here now Put that there See and the thing is this just reset and ran fine, right like Theoretically on the monster mask that would have heart crashed. So already we kind of are not quite as Having the same kind of trouble. So it's like Be port specific We are just on main so we can't actually just build directly main and have this work because This device only has one display by default Of course want to use to I'm gonna bring in the you lab thing because We're gonna want to make a debug build Turning off you lab is helpful for that but then we also want Multiple displays I probably could have used that compare. Oh, hey, there we go MP config board H go to displays No, you lab It'll be all we need. Okay Express it build. So we got to do the IDF thing. I'm gonna do a clean Hopefully we can get the same kind of crashes coming out of this one Because if it truly is only on the monster mask Entirely sure what we do next One thing I should probably do is Use another spy display right now we have One I to see this one over here is on I to see and then this one over here is on spy We have one of each whereas the monster mask is actually to Both displays on spy Think even both is it both displays on the same bus or are there two different buses? Or I don't remember Closing some of these. It's two buses. It's separate buses. Okay Hmm. How could we try that? We got a good build bootloader mode. I guess one thing we could do on the monster mask In the lieu of having a stack traces we could do a bisect to try to find the Mid where it breaks and then we can see the code in that commit and we at least have like something to look at for where It might be coming from CLN use yeah, yeah, yeah, yeah, yeah Disable the Something we need to disable something else That's weird just this j tag that MPH A tag it tries to use the I2C pins We don't want to do that because we're trying to use the I2C pins Connected to split with so we could go to like a pico On a pico we could have two spy buses one for each display That's more like how the Monster mask is although the monster mask also has got a lot more in the mix because it has a seesaw as well, which is Pooked up to like the reset pins and the backlight pins and some things on the displays Whereas in our case here, we don't there's no seesaw in the mix Everything else is all direct. I think that would be the cause of our issues, but I also don't necessarily Know how we could rule it out All right, you got both backup and running we'll see once and This is something I noticed we start getting duplicates here, which is not necessarily correct But it's also not a hard crash Troll C again, and it actually duplicates again to where we now have like a six-pack going on. We've got like Three rows of duplication and then now like it's been duplicated again into columns as well Only one of them gets filled in with this stuff That's very weird. I don't know what's up with that Maybe it's trying to use this display size or something But the thing is like it doesn't crash Right back to there. We get our print out from that. No problem So at this point like we're not Re-initializing this other display, but it's also just staying on whatever the last thing it drew was Yeah, I don't know so something it something's messed up there where we're getting the duplication going on I don't know what's the cause of that, but you know, I guess that could be tied to our Hardfault maybe the the expressive port for whatever reason handles this problem a little bit more gracefully and just duplicates the certain sections of the screen whereas Whoever the actual root problem is causes the monster masked a hard crash interesting theory Which version was the display IO API change? I want to try to narrow it down To that or not That's with 80. Oh Okay, so we'll go I guess back to seven and see if we have the same thing seven three three And just before it didn't crash as soon as we went to repel but it did as soon as we ran a print Or two sets of SWD pins on the monster mask a set for the seesaw chip and a set for the same d51 That makes sense. I guess the probably the set of three is probably the seesaw because it's over on the side Where the silkscreen does say seesaw right by there. Yeah Nice So then yeah, the same d1 would be the one we'd be interested in here Theoretically we could attach some wires to there I don't really know what the next step after that would be trying to use the J tag, I guess I've busted out a few times but Not necessarily I would not call myself an experienced user necessarily. I don't Really know the exact process for using it. It's not have root group makes sense You know, I guess we should try I mean surely it's the second display, right? I guess we should try like at various parts It doesn't actually complete Does it still mess up? Or is it only after we get the second display? That's when it starts to be a hard fault after I bet that that's the case, but I don't know We will have to change this I guess for Gold version I can add some wires or make a pogo pin. Yeah Hellbid. Oh codepie We should okay. Yeah. Yeah, we should be able to just change it in codepie by 16. Oh No, okay. That is inside Constructor line 111 ST 7 7 8 9 has no root group. Oh, I did monster mask not okay This was like a bodge fix anyway for the old Should I forgot we had that in here? Wonder if that Or if that had any effect on her test But it could that's back to running press once It's actually the the right display that stays on in this case as well. Yeah, so good so far Yeah, let's just verify then the first one like 8001 whatever let's just do like I don't know was that an alpha says Oh, that's a major release though. Could we find Let's release candidate two eight of six There we go changes since 800 beta four So 800 beta four should not have that in 800 beta five should 804 No problem there. Oh 805 Just keep changing Oh That actually that crashes before Everyone crashes before it gets to anywhere Which is what we just fixed. I did just fix that the other day It has to still be related Let's look back over this code and see if we can spot anything in lieu of not being able to get the actual stack trace. I guess one thing we could do is like Add a Rud load of prints just add prints everywhere and then we'll see the last one that prints before it dies ePaper display But I don't know we might need some fixes in there as well. Truthfully the python terminal Python splash this is inside of what? The findings display open it So if root group is null then we are setting root group to splash So maybe here Maybe we need to be checking if splash is Not in a group already Um that that happens inside here. Let's read on a bit Get root group if it's null return none Set root group This is calling into core display display core Which is not this this is common how But this one also calls into core and so This is actually one of the places where It's doing something which like on this one is causing the hard crash in this case we are It is actually putting the splash on Another display when it's already in use reset display Maybe we shouldn't be calling start terminal Also, we should probably print the height and width right here And that might shed some light on our Uplication thing potentially back into ePaper This display core we have Play core set root group Used to say start terminal here But this would be one spot where it checks if it's in a group if root group was Circuit python splash this will notice if it's in a group and this will return false Which will go back to an if statement like this Like this okay would be true or false in that case it'd be false Which would then cause this to get raised Which is basically what is Causing our hard crash although. I don't know why it's a hard crash and not just raising the exception This is basically one of the things I just fixed here was Checking if circuit python splash is in use. Where's this at? This is in display Shared module display 440 Not probably not exact on the numbers So now we do I do have this check here now I wonder if this should be inside This code is weird. It's code. We removed I don't know that it's worth dwelling too much on it, but it seems awkward right this was saying splash in group equals false But then going on to set root group equal to splash Which is then gonna set current group to root group This would make this true by executing all this stuff, but I don't know why it would be I don't know why it would be setting it to false. That seems odd So maybe this would set it back We probably should be checking here if splash is in a group or not But I don't think that is the cause of our monster mask one because this is not using frame buffer display on that device Circuit python 8 support multiple displays without a recompile can they be different displays like e-paper tft? Sorry if this already been covered earlier. Yeah, no problem. First of all, even if it was covered earlier No, no need to apologize If you weren't here, you weren't here, right? If you're interested. I'm happy to share what I know um That being said circuit python 8 There is Precisely one device where it does not require The recompile and it is this monster mask right here However, I will say like what I'm debugging is a hard crash that basically comes from this device whenever it Resets, uh, which makes it pretty difficult to use for the time being you can run your code once but you can't like iterate It hard crashes. Um, this is the only device where it does not require a recompile though every other single device Would require a recompile Um At a bare minimum you would need to change this you would need to add circuit python display limit to inside of your mp config board h In order to be able to use two displays. This is set to one by default for every other device that i'm aware of um To your other question, can they be different kinds of displays like e-paper and tft? I think they can I think they can On this device back here that I was messing with a bit ago. This is one Display and one i2c display and i2c display is a different Object in the api right? It's a it's a different module Is it well? I mean it's the same module. It's it's still inside Display io, but it's a different kind of display like Uh i2c display here is its own class um, so I have one i2c display and one Regular display and that is working for me I believe one e-paper display and one regular display would also work But I don't know I have not tried it. We're gonna put a print here and a print here See if we get lucky and like only see one of these and then we'll know that It crashed in between I don't necessarily think we'll be that lucky, but let's also do a quick look on What is this? This was what we this is what I just added the other day, which is what makes it so that We don't hard fault as soon as it executes the first time It's in the constructor So that's if you call show and then pass in none, I believe I'm not actually sure Not positive. We might be wanting we maybe should be doing a check here as well. I'm not certain I don't it won't matter too much because not very much actually uses show anymore. I don't think I mean you can still call show I guess, but This would only be if you called it I don't even know if this is counting none actually. I don't know and none are technically different, but In this case, I don't know if it's like maybe someplace. It's returning or it's changing from one to the other This is just here and we do have the check there. Okay There's only things doing anything with splash I gotta think it's related to the splash somehow which circuit python splash. That's the terminal. That's the the shell output That you can see ordinarily on the screen, you know black screen white text It's kind of stuff here basically Let's try this one See if we see where we get on these prints here We don't really need You don't really need um the debug build that didn't actually do anything for us Should I do another clean? Let's try without clean. Thanks. I have hallowing m0 Express one display and have done a rp20 40 with eink and a sp32 s3 with tft And the og sp32 also want to get into lore next nice I will say fair warning on those devices you listed the the hallowing the m0 express that one The m0s are Very very very tight on space I would be very Not surprised at all if it weren't if it were just not possible at all to do multiple displays on that one I know it's got the one built in which you can definitely do some stuff with but Yeah, just a heads up on that one any of the any of the m0s are are quite tight Our space and stuff goes. Yeah, I think I think maybe we probably should have done a clean looks like The rest of those that I would think you're probably all right on rp20 40 ESP 32 s2. I know is good s3. I haven't done as much with but I would assume it's probably okay Although it is also like way more new than s2 and I do think there's more of the core modules that don't work yet so Maybe there could be some issues there, but I'm not certain The clean and then we'll let that re go and then um sp32 the og one I've not done too much with that. I should I got a uh feather All that feather huzzah v2 or something. I picked up one of those You try circuit python on it, but I have not actually loaded it yet Um, yeah, I don't other than this I don't really know for sure where we'd be looking beyond this like Only other thing I know how how to do is just start really sprinkling in lots of prints like in the Display constructor and things like that to try and figure out Where we actually make it to Okay, so in this case we got before start terminal after start terminal Before start terminal after start terminal. So we got it twice Makes sense because it'd be one for each display And this is inside reset display. I'm not sure who like what oh it reset already Press ctrl c again. I'm not sure who or what within the system is responsible for calling reset display When ctrl c happens But it's calling reset display on both displays, which does make sense Like we already crashed here, right? Interestingly, we do actually get this even though we are in hard fault mode Get one Go faster this time. I guess not wait for something to write randomly. It's different than the last build Well, the very last thing we did was 805, which is definitely different, but it's different I thought then the last build we got because Now we're crashing before I print Not actually getting a chance to print before we crash Certainly tricky SP32 was with Arduino Like diabetic monitoring project data from web made it work on a different board. Nice tiny one One inch Display that shows the data in an unattrusive way without opening a phone app. Nice It's pretty cool I love the idea of like taking really really important information and putting it into a more convenient way to look it up rather than like Like a phone amp sounds convenient You're not actually using it, but yeah, if it's something you want to look at real quick or whatever um In its own little screen that's kind of like just for that is Pretty nice if we get Thing useful printed with those It is so weird that it's now one It's like quicker now. Why would it be quicker? So we were like explicitly being able to control c Even multiple times get multiple repel prompts And then only after I did a print h that is when it actually hard faulted, but now Press control c and like we get a prompt. It starts like it's gonna work, but then uh Hard crashes right away We're construct after construct Setting that to root group after setting end of construct before then on the next display before construct after construct End of construct no setting splash because it was already in group We'll see once It has not crashed yet It says before supervisor start terminal after supervisor start terminal before After now it has crashed Hmm How's it going dj debon? Uh, no, unfortunately not. I'm on the backup still So I have the wrong date in it Thank you for the heads up To be fixed now or not if you have to refresh or what sure how that works when you rename it while it's live But I just renamed it. Nice. Thank you Yeah, unfortunately, uh No go on the computer yet Trying a bunch of stuff Fingers crossed. I'm hoping that I will have gotten one more response on my ticket Uh with the hardware manufacturer Tonight that I don't know how realistic of a hope that is Um I got some instructions from him earlier today And I tried him out and I tried to get back to him real fast to see if hopefully I could get one more response in before Close the business and then uh weekend. I am kind of assuming I'm not gonna get any Action on the weekend from them. So it's Fingers crossed hoping for one more chance of stuff that they sent me but Let's see Um, yeah, I don't know, you know, one thing I do really really wish is that the uh That the NVMe drives were Not so hard to get to That computer is like I'm gonna have to figure out so many things in order to actually get to the NVMe drives I was like one idea I had was maybe I just get a new drive and put that in and then Set up the new os on that new drive and just use that for the time being and like whenever I'm ready I can swap back to the old one and try to repair it again But it's like It's like probably a 30 minute process if not longer to get it open and get enough Stuff out of it to be able to reach the NVMe drives. So like It's not really a thing that I'm gonna swap honestly in any sense of the word so I don't know what I'm gonna do I may end up just electing to reinstall and go with a new os again on that drive and I lose all my old stuff Or I may not I don't know Computer builders are good at building PCs not supporting them. Yeah Unless it's the os developer In this case it is the os developer who made the pc although I will say the it's not the os I was using I guess They make pop os which was not what I had on it, but They sold it with ubuntu on it as well. So I do kind of expect some level of support And I to be clear also I have gotten a lot of really good support. I would not even be Knowing as much about what's wrong or even have gotten as close as I have with attempts to repair it without their help So I don't want to make it out to seem like I'm not getting help from them. I absolutely am Um, and I'm fingers crossed. I'm hoping that Eventually we'll get through enough of the troubleshooting and try this that eventually we may get it resolved But I am not sure I'm inching ever ever closer as each As each day rolls on I'm inching closer to uh falling on the side of the fence where I'm ready to just Give up and start over um If the drives were easier to get to I might pop that drive out just so it's Just waiting there for us to go back to whenever we want, but It's not really that easy to swap. I don't know Not thinking that's super realistic. All right. Sorry. I'm rambling at this point. Let's try a control C here Crash yet. Yeah, same thing here. It's like Press it again We don't get anything like we don't get any of the setup or show Constructor we don't get any of those prints here None on the screen either camera just died on us That's the list of stuff that has died on us, but okay. Am I Misremembering or did we not totally have a build from main? Where I got one step further Didn't I make a build off of main and we were able to break to repel multiple times and then we only hard crashed when I did print My misremembering did not didn't we do that off of main? So I'm gonna go new branch I'm gonna push what I have Which is Maybe we should undo that. I don't remember Which I don't remember if we had that or not. I guess that could make a difference. So let's actually let's try one more thing Let's undo that Undo that Let's try one more build with that without that in it. I don't really think that makes a difference With regards to where it hard faults We'll see though. Maybe I'm wrong Good to hear Builder has good support even for a super user like yourself Any chance you're using samsung 980 pro NVMe? They are known to have a corruption issue Maybe I did not know about that I am definitely it is definitely a Samsung NVMe drive. I don't recall the model number or anything else about it But I think there was a nine in it So maybe They're known to have construct corruption issues. So I will say Like Current problem aside current problem is that I that I can't boot into the os um That whole problem aside if we pretend like that's not the case And we think back to the prior problem, which was segmentation faults During builds of circuit python I don't have definitive proof or evidence just yet I mean, I may never have definitive proof or evidence, I suppose Uh, but I do think right now my leading theory is that those segmentation faults Are a result of storage malfunction or corruption That is my current belief And I believe that because I Installed a new os on a new hard drive Which is how we got the current problem of not being able to boot again that all aside Before that came up. I had installed a new os on a new hard drive And I was making circuit python builds from that new hard drive I only did a handful, but I did not have any of the segmentation faults issue problems. So Yeah, gotta do more testing, but I do think That's kind of my leading theory right now is that the drive corruption or malfunction was The root cause of the segmentation faults You have got to be kidding me it truly Truly actually is the case that Removing or not removing micro lab Changes the behavior with regards to when we hard fault here. Maybe not Well, I mean it's it did take way longer though, right? It took way longer Maybe I had myself. I don't know for certain if it felt like it was Feel like it's different on the first try. Let's try again That is so weird that that would make any difference though, right? Definitely get here. I can definitely do multiple That's a new wrinkle I'm surprised we don't see Show or set group here and we Make a dual party pair As I said that we hard crushed I think it's still a splash in use problem because Right now This is the display we're on The left display The left display is the built-in one So it gets initialized by the system and then code pie runs And in this case code pie Has got this line of code right here and this line of code right here goes inside of here Goes inside of here And has this display or release displays at that point the original Instance of the display object that was instantiated inside the core gets released next This code here initializes both displays again even though the left one was already initialized before we released it there So it's no longer We reset everything up. There's our left display setup Here's our right display setup In our case code pie is then drawing party pairs on both and changing the tile grids Just reset itself This time it actually hard I'm assuming it hard crashed it actually hard crashed before I ever did anything You just let it run So here's though what I think is going on though. Maybe we're switching screens somewhere. Aren't we because We run party parrot We set up both of our displays manually. We run our party parrot when I go like this Control C once The left screen is off. It's gone now. The right screen is still on And this is where my repel is Wish you could get go working on these devices I don't know too much about go honestly It's both 980 and 990 which are extremely popular drives 740 Video 980 and 990 Is there a newer one than those or are those like the current model of samsung one? And if so has like samsung said anything about that Damage has already been done. There's no repair except the wipe well if the if the If the drive has a hardware problem I don't want to wipe it and reuse it. I want to change it I want to get it out of my system because I want my system to be Ideally rock solid as reliable as I can make it so If I know the drive if I if I come to a conclusion that definitely the drive got corrupted Most likely I'm taking the drive out and just not using it anymore Um It'll suck because like I mentioned earlier It's probably like 30 or 45 minutes to get the rest of the crap out of the way to be able to actually get to the drive Um That is good to know. Yeah, thank you for sharing this that this might be this might be my issue Like I said, I don't remember the model number for sure Um You know, it's kind of sucks though is I just like literally just a samsung Sorry, we're going on a brief detour here. I apologize This is a 970 Okay So this drive that is in this backup computer I just bought the other day And I will say I totally I had not ever heard of any of this issue with samsung drives and that samsung was Probably not anymore, but was my go-to for storage for sure. So I will watch The firmware update for those ssds is there. Yeah, I mean I could I that's cool. I would maybe try it on a machine I don't care about as much for like Like if I already yeah, I don't know for my daily driver for my regular daily driver computer I want zero questions Like I don't want to update the firmware of the drive and then hope That it's okay after that I'll just get a new drive for sure If there's any chance that that one is bad I have a 970 evo plus Is a good drive with the 980 and the 990 are faster. I was gonna upgrade them right when this became public Yeah, I don't know. I don't like it Hopefully that's not what's in use honestly Thank you for bringing this up though. Yeah, I did I had not ever seen or heard of this and this very well Might actually be my problem. I know for a fact they are samsung Um in vme drives in there, but I don't I don't know the model or anything about it So back to this though. We are on the other screen. We swapped somehow, right? This was the one that was initialized by board When it first booted up We then released it and then manually initialized both and then press control c which caused Reset display to get called on both, which is where we added that Print out Thanks for showing this stuff reminds me on you to go support ate a fruit and buy some things. Nice. Yeah, that's great to hear I appreciate that. Yeah, like we say I said at the top of the show Uh purchasing hardware from them is is helping support circuit python and all the open source projects that they Hey developers to work on so yeah huge. Thanks for that um m9a1 980 pro nod I've it meant for a high band bulk storage vms and stuff. It's important for an important pc It's not something you'd want to risk. I understand that 970 evo plus is a great drive Personally use it have no issues Yeah, that is interesting. That is good to know. That is actually really good to know I don't really want to go through the exercise of removing everything to get to the storage But I will if I know The storage that's in it is known to have trouble So that's something in here So my theory goes the rest of the way Once we get to repel repel is appearing on the right display As soon as we reset The next thing we do like control D If control d happens it's gonna Initialize this display And it's gonna do it without calling release displays question mark. I don't actually know if that's true or not, but maybe Maybe when this one gets attempted to be initialized Circuit python splash is still on this one It's definitely not the solution But one thing we could maybe do to test this is inside of construct We could maybe Not do this just comment this code out I think would make it so that we would never see the terminal on the display But would also tell us if that is Getting to the crash So another theory is like maybe this crashes it maybe this is still an object in the old vm or in the repel or whatever Somewhere else. I don't really know where it would be, but maybe it's like not available anymore Maybe we're calling in group and that's like it's gone and that's when it crashes. No total guess, but Let me make another build actually before I copy this Are we already in bootloader? I think ideally we would not swap right? I feel like it would be ideal if At this point when we got to here by pressing control c once I wouldn't it'd be ideal if the splash was over here. I think Because that's the built-in display like realistically The left is the the excuse me the right display The right display should only ever be used From user code on this device It should be only if the user code initializes it and only whatever they draw on it I feel like the splash should always be on this display because that's the the The built-in one that's the one that's defined inside the board definition But I guess it goes so it goes to this one because it Is it because it calls start terminal My assumption is that the this gets called on both displays And my assumption would be it gets called in the order they're defined Which is left display as first and then right display since right display Come second Maybe that's why the display ends up there, but this doesn't really specify a display, right? How does This this actually do Supervisor shared display That's just in the root also supervisor in the base Start terminal This does not do a whole lot at all does it? Oh, well, I guess the meat of it's in here though Set scale to two sets The scale of circuit python splash the two If circuit python terminal io The scroll area Scroll area text grid. I have no idea what that is Use the previous allocation reset tiles terminal construct I don't really get how it ends up on the wrong screen though I mean wrong screen. I don't how I don't understand how it ends up on the other screen I should say I don't know if it's really right or wrong, but Okay, we did make a build right. I think we made a build Um Had some extra prints in it. We are currently in boot litter. Just waiting to copy Let's do that I'm gonna do control d and it's gonna hard crash So it did call reset on both displays again and This time This was never not in a group Makes sense. It was in the group on this display. It does make sense And then this side it I could see a little bit farther back It actually starts with the very first lines. I can see are before and after These two lines here basically And there is no There is none of this in it Which means it still thought that circuit python splash was in A group Just tom's hardware that covers the issue and the fixed method it was featured in gamers next video. Nice. Thank you Take a look at that I'm kind of surprised we don't see like any of the prints from the setup the next time around Is like the board would initialize again Would have thought when the board initialized again that we'd see these things happen again Like before the heart crash Maybe that's a hint Okay, let's try one thing So I know like we are kind of pretty much at time I'll say like I don't necessarily have an exact set time But I usually go about two hours and we have been going for about two hours I'm probably gonna wrap it up fairly soon um We did not exactly necessarily make it very far obviously we still have mysterious hard fault Or hard crash I should say I'm gonna try this I'm gonna try not calling Start terminal unless we are actually gonna call set root group also Because before we were calling start terminal and then sometimes not calling set root group based on whether or not This evaluated the true or false I it feels like we shouldn't call this unless we're gonna do this so I'm gonna try it in here. We'll see what happens um I don't necessarily have Really any idea of what to try next so Probably no matter what we get from this. I'll wrap it up for tonight and Do some more pondering and see if I can come up with what would be a next good troubleshooting step um It might be worth trying to get back We see after though. So we we know we're not crashing inside of here somewhere Hey Come on, I feel like the error has got to be somewhere in here though because it seems to coincide with The display or api change Pretty directly like we saw for uh beta 4 Was fine, which was before the change beta 5 It was the first one after the change Uh, it was actually worse than current. It was a hard crash right out of the gate The more current versions of main it's not a hard crash out of the gate, but it is still a hard crash after the reset Yeah, so The difference now is we only got one of these We are still on the other display I do still think is weird like if we have control over it. I feel like we probably want to land on this one But we are live and we're current and we're good on the right display. Everything is actually working I'm gonna try reset Hard crash This time I actually see different stuff over here Yeah, unfortunately, it looks like it's scrolled by Too fast. I like it would be up here further. We can't actually see it, but it's I can see the end of root group and I can see end of construct It must be these two. I see the end of this And I see this But is that Is that from before safe mode or is that Already like once we're in Are these prints already from the safe mode instance So adding the if statement or or moving the start terminal into the if statement did not seem to make any difference I mean it printed obviously one less I don't give those things, but Let's try this. I'm curious if we have the sleepier. Will it still Hard crash like Instantly when you control d or will it wait five seconds and therefore it's waiting until we start doing other stuff We think this actually saved Probably right So we should have basically like five second delay here before anything happens Should maybe print one more. I'm curious if any of these come from the original instance In the board definition or not, but I don't know okay, so I'm going to press control d If it hard crashes pretty much instantly then we know That it's not waiting until it actually tries to initialize the displays again It's actually crashing sometime before that It does wait for the five seconds though Then we know that it's actually when it tries to initialize the display the second time Pretty much instant Pretty much instant too much instance Does it call release displays in the core? When it first sets up the display Is there any reason to think we might want to call release displays here? Because like my theory kind of is that the splash is on the right screen Which is not the screen that the system knows anything about the system doesn't even really know about this display Only user code does I mean it has pins and stuff. I shouldn't say it doesn't know anything about it, but It doesn't it's not using it I wonder if by the time we get to here, which is like instantaneous because this is as soon as circuit python is booting up basically By the time we get to here Maybe our splash is still on this And I'm not exactly sure why Our if statements are not like handling it and causing us to just Not try to re-add it, but my theory is maybe it is trying to re-add it And our if statements are not handling it and if we could do Display our release displays here Buddy Hi with the grabbing of this If we could do it here. Is there any reason to think that it would Give up like release the display on the right display Doesn't feel like the right place for it. Even if this does work though It feels like that should be happening. Maybe Like system shut down rather than system boot up. Let's try putting this here Yeah, honestly, I guess adding some prints into here probably would be smart anyway Because in here, I guess might be when it's crashing All right, we're gonna try this one and then I think I'm uh gonna wrap it up after that for the night Okay, so worth noting All the displays are up and running which is a good sign. That means we didn't just break displays altogether See our prints at all though, which implies that board and knit never ran which Doesn't make a whole lot of sense. Does it be in the right board here monster mask board We need to do a clean Didn't we have seen these things. I don't know if I trusted it just reset itself Probably hard crashed after that. I'm guessing let's try it clean And then yeah, either either way this one goes I think I'll wrap it up after that Sure Like we should see these print First time basically Before all of this stuff basically I think should be probably the first thing we see I would have thought maybe it happens too fast. Maybe it happened. Uh, yeah, maybe it already happened That's actually probably the case. Oh, but that's gonna make it like how do we troubleshoot it? If we can't see the output from it, right? That's tricky. It's probably happening before we get connected Means we can't really see any of the prints ever So we could somehow add more sleep into there I don't even know if that works inside the core You don't see any of it. I think it probably it must happen before it's connected Let's press control d and as soon as we press control d We get disconnected and we go back I can see here at the very top of this I can see end of constructor Which we don't see anywhere in here So that is one of the things that we missed by not being connected yet We did make it to the end of the constructor Is it printed but We are just in the whole the hard fault Um, yeah, I know I said I was gonna go after that I am actually I'm trying Literally one more thing If we catch the control c and release the displays Does it's still hard fault Hard hard crash. Is there a difference between a hard crash and a hard fault? I don't really know I'm using them interchangeably. Sorry if that's improper I don't know why I just went to the boot litter and we don't need to do that because we're not a new one So, uh, but we're not going to see the ripple On the displays That makes sense because we released them Do we still crash on control d? No, oh not hard crash We don't hard crash anymore Now we crash on this Okay I feel like that Helps Shed light a little tiny bit. I don't know exactly what that tells us But I feel like that does actually get us a bit farther I think that does tell us that basically Something is still in use and that is why we are hard faulting I feel like Because when we explicitly release And then come back around again. We don't hard fault interestingly we do Crash with an exception which I do find strange 102 let's look at this line of code initializing spy And this would have just called release displays here Interesting. Okay. Yeah Like I said, I don't know the full like what is What does it actually mean? Where does it get us to? I'm not sure but That I think fills in a bit of it for us. So I have to ponder on that a bit and see See what we can come up with next for some good steps to try That's that's weird. Yeah, I don't know why it would be in in use because it definitely releases it right here Uh, and I also I doubly don't know why It would be in use Why we would now suddenly be be seeing this exception of it in use When we weren't before and the change we made was to actually release it again like This should be releasing it so that it's not in use. I think it's my understanding of it And then technically this would be also should be redundant at that point But then by the time we do actually get down to here Some reason that thinks it's back in use Okay Okay, we got a bit further I think uh, I think we're on to the next link in the chain here So, um, I'm gonna wrap it up for now. Thank you for hanging out folks. Thanks for watching. Thank you to all the folks in the chat Uh, we had a couple of good questions over on youtube and Discord and all that stuff today. So thanks for those folks Um, thank you dj devon, uh for the note about the hard drive. I'm gonna check in to see if that is my hardware model or not Um May have uh, you may have solved my mystery there. So fingers crossed on that. We'll see where we end up Uh, thank you to everybody else for watching. I hope everyone has a good night Uh, I will be back uh tomorrow morning at 10 a.m. Central time if you're interested in this sort of content I'll be back with another stream tomorrow morning 10 a.m. Central time It will be over on my own, um Twitch and youtube so you can follow me foamy guy underscore twitch if you want notifications for that Uh, otherwise you can check out the live broadcast chat uh room on the discord in the morning And I'll drop links in there when I get started Um And then hopefully by tomorrow I will try to get the new Uh obs so that I can have the chats back on the stream like we normally do So we'll see try the try to get the new obs tonight and then hopefully we can get that hooked up for tomorrow I think Yeah, I'm thinking we'll probably continue on with this in the morning. I don't know for a hundred percent sure Um, so, you know, yeah, I reserve the right to change my mind. I guess basically but for right now at least I do think this is what I'll probably end up working on in the morning as well Continuing on here to see if we can't shed any more light on this. So, uh, thanks again everybody Have a good night to all of you and I will see you all next time. Thanks