 Everyone, we're gonna get going here in just a few minutes. Well, everything gets started. How's everybody doing? Drop us a hello in the chats. I'll say hi. Sorry for the sirens, they're on my end. Sirens going by outside. Windows open, cause it is kinda warm in here. All right, do we have folks? Are we working? Oh yes, YouTube says nine. Johnny's typing. The delay might be a little bad. Hi, Johnny. I do, I should have auto captions on, which definitely requires you to be on the slowest kind of setting for streaming. But I do like having it. Hi, Sam. Thanks for joining. Thank you, Phil. Was last week your first deep dive? We are live, says Johnny in YouTube. Let me put lotion on while I wait. Oh, thanks Johnny, I appreciate it. I'll tell ya, I am ready for the weekend. Hi, Viada. Thanks for stopping by. Yeah, last week, awesome. We'll wait one more minute and then we'll get going. How's everybody's weekends shaping up to be? Think I tend to be the last person to hit weekend. Here in the Pacific time zone. Got these European folks. Hi, DCD. All right, let's get this show on the road so I can get on the weekend afterwards. I like streaming, but yeah, we'll talk about what I'm working on. But first, hello everyone. My name is Scott. I work on Circuit Python for Adafruit. Circuit Python is a version of, it's a version of Python, which is a good beginner programming language that's designed for microcontrollers. So what I have here is, this is called a clue. It's in the shape of a microbit. But on here, underneath this little canister here is a little tiny computer called a microcontroller that runs a version of Python designed to run on these inexpensive computers. So if I just take this battery and plug it in, we'll see that on the screen, Circuit Python is showing its output. So Circuit Python is what's known as a firmware that goes on these little tiny computers and allows you to program them to do all sorts of small tasks. Adafruit makes development boards generally and breakout boards. So this is an Adafruit board. So the microcontroller itself is not made by Adafruit, but assembling all these components on the board, designing and assembling boards like this is what Adafruit does. So they pay me to work on the software side, the Circuit Python software side, which is, even though it implements Python above, it's mostly C code below. So we do a lot of technical deep dives into things like USB and C and all sorts of stuff. So that's what these streams are. They're usually Fridays at 2 p.m. Pacific. I can't remember, did I? I guess I streamed last week too, but the week before that I took off. Foamy Guy also will do deep dives and he generally does more like Python level stuff, which is also interesting. So if you wanna support me doing these streams, I'm paid by Adafruit to do all this work. So you can go to adafruit.com and purchase a board like the Clue, although I don't know if it's in stock. Hopefully it is. And that supports the whole company, of which I'm part of. Beata said, looking forward to USB going main. Do you mean USB host? And if you wanna join the Discord, so there's two chats on this side. The middle one is Discord server. This is a chat that doesn't disappear at the end of the live stream. There's lots of folks there that are super helpful. So if you wanna join that, you can go to the URL adafru.it slash discord and that will get you into our Discord server where I hang out during the work week along with the other folks that work on Circuit Python but also a larger community of folks that are super helpful and doing cool stuff as well. So that's the intro. So I put on the title here that I'm working on PyCascades. PyCascades is a regional Python conference. It switches between three cities, Vancouver, Canada, Seattle, Washington, which is where I live. And I work remotely for Adafruit. And then also Portland, Oregon, which is south of here, about three hours drive. So this is a year where PyCascades is in Seattle, which I really have no excuse not to participate in. I do have a two year old, he turned two. So it is hard to get to other cities right now, but PyCascades is in Seattle. It's where my alma mater. So I went to the University of Washington and that's where the conference is this year. So I applied to give a talk and they accepted it. So I'll be giving a talk on Sunday the 7th. And I've been meaning to put my slides together. And I got an email from the PyCascades folks that included the reminder that they want to, they want to look at slides ahead of time to make sure there's no copyright issues because they're gonna post all of the videos to YouTube afterwards. Which means I thought my deadline was the 7th when I'm giving the talk, but it turns out it's actually a week earlier this Sunday. So I realized that like Wednesday night, so I spent all yesterday and then this morning working on a slide deck for this talk that I'm gonna give on Sunday. So spoiler alerts, if you do wanna come see the talk on Sunday at PyCascades or watch it later, I plan on just talking about it today and working on it today. I am like running out of steam. I will tell you, I'm running out of steam to work on this. But I need to get it close enough that I can send it to them and be close enough. I understand there's copyright stuff. So yeah, that's what I've been working on. I'm excited to do it. So the talk that I pitched is called cutting the USB cord, programming circuit Python wirelessly or wirelessly programming circuit Python. And the reason that I applied to do that is because in the last few versions of circuit Python, we've removed the restriction we had originally where we only did native USB boards and we created both what I call a BLE workflow and a Wi-Fi workflow or a web workflow that allow us to program circuit Python wirelessly. And those things, web workflow is getting more pickup than the Bluetooth side, but they each have their advantages. And so I wanted to take this PyCascades opportunity to really show people how to use them because we don't have a lot of people using them. And when you don't have a lot of people using something, it's easy for the code to stop working, which to be honest, I've been running into, which is part of the reason I'm kind of like a little burned out on it, is that things that used to work don't work anymore. Some of that's my fault and some of it's just that. Who knows what. Which is kind of what the conclusion of my talk is turning out to be is like, we have this chicken and the egg problem with these workflows where if nobody uses them, they can break and we won't realize it. And the longer it takes for you to realize that something's broken, the harder it is to fix because you don't have the context of what's changed recently. So you want more people to use it so that you can find issues when they happen, but also people aren't gonna use it if there's too many issues. So there's this chicken and the egg problem with bootstrapping stuff. I think the web workflow kind of has gotten over that hump. I think enough people find it really convenient that they're using it. And I'm, so I'm hoping that actually like the web workflow will actually bring more people into the BLE and the mobile landscape, as we'll see. One thing I didn't say yet, but I love to answer questions. And I'm kind of burnouted working on this presentation. So if folks have other questions about circuit Python or electronics or software, feel free to ask them and it'll give me a nice break. So I'm just gonna try to see how we're doing here. All right. So yeah, I have a lot of more work to do on slides. It's a 25 minute presentation. David says, any plan for Mickey Mouse, the very old image of them in the presentation because it's out of copyright? And the answer is no, I don't. I don't wanna go there. I don't need to, I don't need to push that limit. So I can just show you what I've been doing. How many Firefox windows do I have open? Not enough. I thought I had one here. Sorry, I'm gonna, I wanna show you the presentation where I'm at so far. If nobody has questions. DCD says the memento supports web workflow also, right? Correct, it does. And one of the reasons I wanna do BLE on ESP is also to support the BLE workflow through the ESP32S3 as well. So let me show you what I have so far to give you an idea of where I'm going with it. So technology-wise the, oh, I should also plug, hold on, let me find a, oh, I know how to find it. Trying to find this video. So yes, I'd love to be distracted by that. Oh, I should say, I have my PyCascades 2020, PyCascades 2020 shirt on. So that's the last one I've gone to and the last one I spoke at was PyCascades 2020. It was in Portland and it was February of 2020. So it was like right before the US really got hit by COVID. I think there's like kind of like a collective innesia about what happened there. And I just wanted to plug, I think I've plugged this on this before, but I actually split it out. So this is the talk I gave at PyCascades 2020. It's like super broad, big vision, but I'm really proud of it. And now I've actually split it out so that you can watch the talk. It was the last talk of the day, which was interesting and it feeds into, it's the reason that all this mobile stuff matters to me so much. Basically the thesis is that like people's first computers are no longer laptops or desktops, they're mobile phones. And so us having a story for how do you do circuit Python with a mobile device is like super important to me because that's how we get people from being consumers of code and software on their phones to actually creating software, which is like a tricky space. So yeah, it needs a lot of work. Okay, before I get started, Sam asked about, could you talk a little bit about what you're imagining building with Clang might look like other than just a stringer place of GCC with Clang? So yeah, so this comes back to the hot just up a little bit, which I'm happy to venture over to a little bit. So this is my working branch. And I've had, yeah, we talked about build systems a couple of weeks back as well, but my background is that I used to work for Google I left in 2015. So it's been, I guess almost a decade, which is insane. But one of the things that they did when I was there was I was working in C++ and they switched us over to LLVM and the LLVM world in Clang. And the tooling, the error messages got a lot better. The tooling around it got a lot better. And so I've always had this button back in my mind that I'd like to switch us to Clang in CircuitPython. The other reason, a newer reason is that I really wanna have a compiler and linker that I can modify and make work better for embedded and CircuitPython in general. So those are kind of like two of my motivations. And then another thing that I've been thinking about is how to switch, how to have a better build system for CircuitPython where we can structure it in a way that we share a lot more things. There's like right now the build system is all make files and the kind of like top level make file is at the port level, which is like the chip family level. And then there's a bunch of settings that can be set at the port level and the board level and then at a global level too. But I'd really like to move us to a world where one, we use Clang to do all of our builds. So we have one compiler that works for all of the boards. One neat thing about Clang is that the Clang binary itself is built in a way where it can do like both arm and RISC-5 at the same time. You don't need different binaries of Clang. So yeah, the tooling around Clang is really good. In fact, I talked last week about how I went down the rabbit hole of like thinking about a new editor. And newer editors have things called language servers. And language servers are the thing that drives like completion and warnings and stuff. And the one that is installed by default for C is actually Clang D, which is like a daemon version of the Clang C compiler. So I think there's a lot of reasons to do Clang, being able to modify it and make it work better, being like having our warnings aligned with the warnings that we would get from a language server. The formatter could be the same. There's also Clang Tidy, which is doing more structural analysis of the code. So yeah, so there's that. And then on the builds, I know in brainstorming, we're brain dumping, but, and then on the build side, there's also that when we build, we build each board in kind of a silo. So we'd like make a build dashboard name, and then we build all of the files under that directory. There's no sharing between boards, sharing of work. And so for the build system, I'd really like us to move to a world where we stopped doing that. So we can actually, well, at least, maybe initially we do, but as we, over time, ideally we'd be able to factor like computation out so it can be shared across boards. For example, like we've talked about queue strings, Andrew says, was a great talk. Oh, thank you. Yeah, I'm really proud of it. I like, some people say they can't watch themselves again, but I actually, I've gotten over that. And I'm really proud of that talk. So yeah, I have this kind of intermingled goal of having a build system, a new build system, and switching us to Clang. I could theoretically just do this Clang to switch, but then Clang switch, and I've tried that. But there's a lot of, it adds another layer of mechanics to the make files that are not easy to understand already. And then the other wrinkle that, so Sam was thinking about this too, is that with risk five, there's a lot of little like subsets of instructions that like certain CPUs will implement or not implement. They criticized ARM for this, and then they made it worse in my opinion. Like they said, yeah, I'm not sure that they, they're just doing it a different way. They still have the same problem. The same problem of being that like different risk five CPUs can have different sets of instructions. David says, you say Clang can be modified that your current compiler cannot be modified. I think the general wisdom in compiler circles is that GCC is less well organized than Clang is. So there's reason to learn Clang over GCC. In addition to that, when I come, my philosophy when it comes to licenses is that you're actually gonna have more collaboration for folks for liberally licensed things than viral, virally licensed like GPL. But it's because a lot of people that are paid by companies, companies are really wary of doing GPL stuff unless it's really, really valuable, like the Linux kernel. So yeah, that's kind of where I like, I've always wanted to switch to Clang because I have this like positive experience with it. Then on top of that, like being able to modify is nice and having good documentation about it. Honestly, I've never looked at modifying GCC, but yeah. I looked at modifying Clang and I figured out how to do it. So the other wrinkle in this, and I ran into this, I've tried to switch circuit by then to Clang a number of times. That's why I like, this is a Clang 18 branch, so 18's the latest version. I also have a Clang 16, I have a regular Clang branch, so I've been trying to do it for a number of years. And I've always run into the issue that not only do I have to install Clang, but I actually still have to, I still have to install ARM GCC none, which is really unfortunate. And the reason is that even though you're not using the compiler, you still need like all of the libc and the compiler runtime libraries. And in a world, especially with risk five, where like your CPUs can have any mix of things, finding somebody who's like built all different combinations of those libraries is like not trivial. So another reason that I've gone into the rabbit hole of like I'd rather have a new build system is that I think what will do, what in my mind will do is, we'll just use Clang as a compiler and we'll build literally everything else that we need. So we can get source code for everything else, both the like libc, either new lib nano or pico libc or the LLVM project is working on like libc that's all. Some of those libc implementations include assembly code, which makes it really hard to be portable, right? So you need assembly for every different instruction set. But if you write it all in C, if you write libc and all in C, then you can just use the compiler to go from one CPU to another. So I think what I would like to do is like in the long run, a board says what microcontroller it is, the microcontroller knows what instruction set architecture it is, including if it's like a risk five, it knows exactly which risk five extensions it's included. And then it just builds everything. So it builds libc, it builds the compiler. So in GCC land, there's libgcc, which is like the library that GCC assumes that it's linking against. And then in Clang land, it's called compiler runtime. So it's like, they have this notion of like, we're gonna have some set of functions that we'll link against. So like memcopy, memset, like it assumes that there's already implementations of those things and those implementations. I guess those are libc, I think. But yeah, anyway, usually when you get a compiler tool chain, part of the tool chain is actually some library code that's already been pre-compiled. And I think for a circuit Python, I'd rather standardize as to Clang and then build all of those libraries ourselves because we can get the source. It's just not typically how it's done. But the advantage is that like we've run into the, we had this issue for a while where circuit Python, when I built it on my computer, would have more free space than in the CI. And we, what we figured out is that the libc implementation that comes pre-compiled with my version is compiled with dash OS, which is optimized for size. And then the version that shipped with like Ubuntu, the Ubuntu packages for arm none GCC was compiled with dash O2. So which is like for speed, but not size. So, and then you also had this like, is it floating point, is it not floating point? You have this question of like, are you doing LTO, link time optimization or not? So in my mind, you get a lot of benefits from being able to just like say, I'm gonna just compile all the source code and I'll apply these like optimization settings based on what I want for a particular board. And like it's not all that much source code. It's, I don't know exactly why they get shipped with the compiler. I think the reason might be that you need to make sure that you're matching, that your versions are matching. So like Clang 18 needs version 18 of all the compiler runtime or something, right? I think that might be why it's shipped. Same with GCC, sorry. I don't know if you can hear the fire extinguisher thing going off. Let me go to window cam, can we see it on window cam? Just barely, see that steam in the bottom, right? So that's what the noise is. So that store out in my window is a, is a fire extinguisher sort of store. And I think what they do sometimes is they have to like discharge them and so they have these pipes that go out to the ceiling. Anyway, what a tangent. Anyway, that was a brain dump about build systems and compilers. Does that make any sense? Any questions about that before I get off that topic? I mean to get back to it, but I really got like, oh no, I really have to work on my slides. Which I do, I really do. Because I don't have that much time this weekend. I gotta send them something on Sunday. I've got like 50 slides done. It's gonna be a quick slide talk. Yeah, that's great, thanks. Awesome, Sam. I think it's really exciting. I think it's really potentially cool, especially because we were talking about circuit Python on FPGAs with soft cores. It's like we could, if we had that ability to basically compile all our libraries for a particular CPU, we could do a lot of experimentation in the FPGA landscape of like, oh well if we add this RISC-5 extension, suddenly like it gets this much faster or not. Maybe, maybe not. Build the builder, that's a lot of work. So I'm not saying that we're gonna compile the compiler. We're not gonna do that. That's not what I'm proposing. I'm proposing we compile the libraries that the compiler uses, which they're not too big. Like I got PicoLibC building, which is like the libc stuff, and it was like 170 targets, 170 C files that it's compiling. It's really not that much. So I think that like, yeah, I think it's the right way to go. Not building the compiler, but I'm building the compiler's libraries that it usually ships with. They're not that big. Okay, let's talk slides. I got work to do. Ha ha. Ha ha. I worked all day yesterday on it. So, the way that I'm going about this is, so my goal is, what about the SDK from Expressive? Does that come pre-compiled and just linked? Parts of it are pre-compiled. There are binary blobs in the Expressive SDK, but we do compile a lot of it too. And interfacing with like their CMake build system is kind of interesting to think about as well. But yeah, we wouldn't necessarily be able to do absolutely everything. Like we can't recompile those pre-compiled stuff. Okay, let's go back to the beginning of this presentation. So I'm using a thing called Marp. My previous talk that I linked to, I did using DeXset, which is like a paid program that goes from markdown to slides. On Mac. And I don't run Mac every day anymore. And so I wanted to find something else. DCD says, you mentioned bare metal Raspberry Pi. If there were a bare metal Beagle 5 fire, one could get an FPGA included. Yeah, I think I know what you're talking about because there's a hard risk five CPU with an FPGA next to it, right? I've also looked at the zinc chips from Xilink because they have hard Cortex A's next to FPGA fabric. The one that I've been targeting is the, or in my mind is the one that we would do is the ECP-5, which is on the Orange Crab. The Orange Crab is in a feather form factor. So it like fits neatly into the Adafruit ecosystem. Okay, so let's maybe go through this talk a little bit. I think maybe part of the reason I'm not wanting to work is that it's 78 degrees in here. Maybe let me turn the, let me get the fan going, maybe that'll help. I could too AC, but the AC's pretty loud. I'll be right back to the mic. Hopefully that'll help. Hi, Gary. Not trying to distract you. Oh, come on. You know I want to be distracted. Okay, so it's cutting the USB cord where I was programming with Circuit Python. What dark magic is this? It's called Bluetooth and Wi-Fi. So let's, yeah, let's just go through what I have so far and we'll figure out what I need to add. Hello, I'm Scott. I work for Adafruit. I go by Tanute Online. Let's get started. So this is a clue. It's a, it's an Adafruit board. It's shaped in the kind of micro bit educational space. It's got a screen on the front and some buttons. On the back, it's got a USB plug. It's got a micro controller, which is what's under this lid here. It's a little tiny computer. It's 48 megahertz, 256K RAM. So micro controllers tend to be like in the tens to hundreds of megahertz. We're very much in the like Gordon, not the Gordon word, the Moore's Law sweet spot still for getting more, more faster chips for cheaper. Then the last thing I want to point out on here is that there's an antenna up here. So this board also has Bluetooth capabilities. So I want to get circuit Python on this board. Hi, Hamz Labs. Just got here, no problem. All good. So I want to get circuit Python on this clue. So we're going to go to circuitpython.org. Once you go to circuitpython.org, you click downloads in the top left. You, we have 490 boards supported. You can see these Dexter never got a clue. It's not too late. You can still get a clue. You can see here that we have 490 boards. So it's easiest to find a board you want by typing into the search box. The top 50 I think are sorted by popularity. So these are our most popular boards by download count. Then everything else I think is alphabetical. So you can type in here, you can say, oh, I want a clue. And then you can click on that page. Once you're there, you can hit download UF2 now. This is a kind of USB friendly format for the circuit Python code or circuit Python binary. Now that you have that, let's plug in our USB and we'll plug into the clue itself. And once we have the clue plugged in, we're going to want to double tap the reset button in the top right there. And once you have the boot loader going and on USB, you'll get a nice green light here. Once you get a green light, you can go in your file browser and you drag your UF2 onto the clue boot. Generally in the USB boot loader land, you'll have some name that ends in boot where you drag it to. After you drag it there, it gets copied over and the microcontroller will restart. And now what you'll do is you'll get a circuit pi drive and on that circuit pi drive, you'll have a code.pi. This is your circuit Python code. Once you have your circuit Python code, you can double click that to open it in your editor. By default, you'll have Hello World there, print Hello World. You see it looks like Python because it is Python. But it's the device that is actually storing the human readable version of the Python code, parsing it and executing it all on the device. So all I need is a text editor and saving to the USB drive. One thing I do need is I don't see any output. So how do I get the output? Well, one way is to open your console. I like TO as a terminal connection. You could also use screen. And I also wanna highlight that on Linux at least, you can do this dev serial by ID, USB dash, and then it'll be the name of the device, which is really helpful. So once you're connected to the serial link through TO, it will reconnect. Does DigiKey have it in stock? It's out of stock at Adafruit. The nice thing about TO here is you can see that it reconnected for me. I connected once. Got disconnected actually because I zapped. Like I zapped for the board and it reset. My office here is like super like bad for static electricity, which I need to come up with a plan for because I'm gonna kill some of these electronics at some point. But yeah, that's why it restarted. But also if it says it's connected, but nothing showed up, you may actually have to control C, the existing code, because it may not be outputting anything. So if you control C, you can type a character, you'll get to the REPL. Lots of love for TO. Yeah, TO is great. I agree. Time stamping with TO is really handy. You can do control TT to toggle how it timestamped stuff. So if you actually wanna time the duration between prints, it's actually really helpful, which is cool. So if you're in the REPL, you can type whatever you want, but you can also do control D. And once you hit control D, you'll get your serial output. So you can see here, code.py output is hello world. So now if we go back to our editor and we change that to hello py cascades, and you can see it's unsaved, we'll hit save. And once we hit save, the text or the serial console will show hello py cascades as well. So what did we just do? I introduced you to CircuitPython in the way that CircuitPython typically works. This is what I consider to be one of CircuitPython's workflows. And that happened to be the USB workflow, which is one that we kind of like focused on for the first six major versions of CircuitPython because it was so easy to convey how it went. But I wanna talk about some other workflows going forwards. And like I said in the talk, wireless workflows. But first I wanna talk about what makes a workflow. So first it's installing CircuitPython. So how do you get CircuitPython installed? Which we did by dragging the UF2 file onto the boot drive. And then it's about two things, file system access. So how do you see what files there are and editing the code.py, but also transferring files such as libraries, which I didn't show, but you could drag and drop it just like a USB drive. And then the other component of what I consider a workflow is once you have it, have it installed is print debugging, figuring out how to get this serial output and being able to see it, see your exception messages and things like that. Beata says USB UART dongles and cables often don't have a serial number programmed in. Thankfully USB micro and controllers do have a serial number. Fun fact, the RB2040 does not. All of the RB2040s are like literally the same. It reads a serial, a unique number from the flash that it's paired with, which is interesting. And I think RB2040 is the only one that's like that, but yeah, interesting little tidbit that they don't have unique IDs for RB2040s. Last I looked, could be different now. Okay, so that's what makes a workflow. Now what considerations do you have for a workflow? Well, you have to figure out what to what. So this USB workflow is great, but it's only great if you're connecting a desktop and laptop to a device that has USB on it. David says, pause the presentation to answer question. David says, I'm interested in built-in keyboard workflow. Many existing have a keyboard and a screen. See the issue about press enter to enter the REPL. Yeah, I thought I was gonna touch on this, but I don't think I have the time. And I saw the issue for the press enter to enter REPL and I think there's a mismatch between what constitutes a built-in keyboard. In my mind, it's USB host with a keyboard and like in that case, press enter to enter the REPL will work because the supervisor like circumvival codes running the USB stuff, not user code. But if you're doing an on-screen keyboard or you're doing like an I squared C keyboard, right now those don't work because it's user code that's running those. Okay, so the thing to think about is what to what, where are you starting on and what are you, or how are you connecting the two things? Phones and tablets are really interesting to me. I did this talk four years ago at PyCast Cades about how folks start in key. Computing with mobile devices now and we really should think about that in terms of programming and coding. And the USB functionality of CircuitPython, you're still tethered, you'd still be tethered between a phone and a clue, for example. It does kind of work on Android now, but iOS doesn't really work, I don't think. It's hit or miss, your mileage may vary. So there's other connectivity that I wanna take into consideration and I've added some notes here about CircuitPython versions and what chips support what connectivity. I don't wanna hash that out, but we covered USB and then the two additional things that we added to CircuitPython, we used to be very strictly native USB because people ask and they still do. Whereas my CircuitPyDrive, which is awesome that that has become the way to do it. But there are really good reasons that you don't wanna just do USB. BLE is great because iOS and Android have really good support. Also means that you're using a phone or a tablet, you don't actually have to have a wire, which is great. It's also great because it doesn't require any third party or like a third set of hardware. It doesn't require a router like Wi-Fi does, you can just do it from one device to another. So it's great for on the go. And then Wi-Fi kind of like came after our Bluetooth stuff. Wi-Fi has some challenges about like, how do you do that initial setup, which we'll cover. But it's really good, especially kind of if you're at home generally, where you have a lot of devices that you're managing and they're all on Wi-Fi, it can make it really easy to do that. So let's do a tour, we'll start with Wi-Fi. But I also wanna kind of keep track of the status of the things that you can do between giving a particular set of connectivity and the devices that you're connecting. Beata says, I will be doing and not having a wire project soon. Yeah, and there's definitely reasons to do that. Like, LaMora was doing the kids toy I have behind me here. I actually soldered it up. But where you have an enclosure where you don't have USB access, you might be able to do it once, but you can't do it after that. So which is why actually I split out upgrade from install. So like, you might have to install once, but maybe we can come up with a way that you can upgrade CircuitPython without having like USB access. That's why I split out install and upgrade here. So we have install upgrade, we need a file system, we need to edit code and we need print out. But so I've kind of got this matrix here and I'm now kind of like after CircuitPython seven, we're adding Wi-Fi and BLE to this matrix. So let's do what we did for the USB workflow, but now for BLE and Wi-Fi. Now the fundamental challenge here is that, I don't know what my next, oh, I have two. So let's talk installing CircuitPython for these. So USB is easy. I showed that with UF2, you drag to the boot drive, it works really well. There are a few boards that have Wi-Fi or BLE, but don't have access to USB serial, which I think I covered in the last slide, but didn't talk about, where we have a CircuitPython.org installer for supportive boards and then BLE, there's like no real way, there's no real way to do, or the way that you can install over BLE is kind of custom to the board and what bootloader has. A bootloader is a term for like a piece of software that runs when there's no other software or you get it in a certain mode so that you can load another piece of software. I didn't know Wi-Fi was on the table too. For CircuitPython? Oh boy. I think Wi-Fi is more popular than BLE for sure, for sure, for sure. More people are using the Wi-Fi stuff. This is something I have to work on during the stream is the Wi-Fi side. So I want to do CircuitPython.org installing without boot. I have screenshots for all this. I have not put them in the presentation. Blah, blah, blah, blah, we did these things. And you end up with a settings.toml that includes your Wi-Fi SSID password and an API password so that you can edit code. And then here's how you edit code, which I think I also took screenshots for but I don't have in here. So that's like our story for Wi-Fi and on how you interact with it at desktop. Programming over Wi-Fi to be clear. Yeah, we'll do that in this. We'll get to those pictures. I went through it and it took a bunch of screen grabs for it. I just haven't put them in the presentation yet. So now that we've covered kind of the Wi-Fi story and desktop, let's move on to mobile. This is where it gets really tricky because you need native apps generally. So I don't have slide numbers. I could turn them on. This is slide 37 of 58 right now, but it's going to be more like probably more like 100. It's a 25-minute talk, but I feel like when I'm doing sequences, it's going to go pretty quick. Okay, so let's talk mobile. So we use a number of mobile apps to give you all these components of different workflows. The first app that we have here is called FileGlider, and this is the BLE Feather Sense LED Glasses Controller. When do we get LTE workflow? After you add it? No, I don't know. Cell could be cool. I mean, that's kind of getting more where the startups are going. 30 seconds per slide feels good. No, I mean, when I'm flipping through how things work, it's going to be a lot faster than that. I've been doing using kind of Clue as a reference platform. There's the Clue. Okay, so FileGlider is one app that we have available both on iOS and Android, and its goal is to give you access to the file system and the files on it, a basic editor, kind of like we have for a web workflow that's not actually in the presentation yet, and then also hook the file system of your Secret Python device into the OS. So iOS and Android have ways of apps providing file systems, and so FileGlider does kind of those two things. So let me show you, and I have to add slides for the latter part. So how does FileGlider work? I need to add a slide here on how to connect up, but you can get a list of devices, and then when you find a new device, you got to get it real close. So you hit the reset button when it's blue, which I have a picture for. I have not made a slide yet. So the 70BA up here is the new one, so we'll click that, we'll pair to it, and then once we're paired, we can click the Explorer, and now we can see a list of our file system. If we click code.py, we'll pull up there, and this is actually some test code that I haven't had on the device that I was testing this with. But you can actually edit it, and you can hit the save button, and it will save and reload just like the USB workflow does. So that's FileGlider. There's a little more I have to add to there about how does the file provider stuff, there's actually a bug, so it doesn't work right now, unfortunately. And this is a theme that you'll see at least in our app story. Second we have, okay, how do we get the print output? So we have a separate app that kind of existed that predates this that we kind of added the functionality to. It's called Bluefruit Connect. It's also available on Android and iOS. Once you're here, you can get a list of devices and the CircaPy 70BA is there again. So if you hit connect with that, you can see the device and you can see the CircaPython. You can tap CircaPython and then you get your REPL. Just like in the TO case, it might not show anything, but if you hit the text enter box, you'll get a button for control C as well. So you can do your control C, control D dance a little bit to get it to send you stuff if you need to. So that's how you get your output from BLE or over BLE. I just wanted to quickly talk about PyLeap. This is kind of a third complimentary app that's meant to get you going really quickly. It gives you a list of projects that you can install on the device. Unfortunately, I don't have a picture here because it didn't work for me. So we're working on it. But the idea is that you don't have to do like, generally people don't start with a blank page when they comes to programming at least when they're early on in their kind of programming experience, you start with a project and you modify it from there. So PyLeap's goal is to get you kind of jumped into a project and then you can use something like File Glider or a third party text editor through the files API to do the modifications that you want. PyLeap is also on Android and iOS. So that was a whirlwind. I skipped all the web workflow stuff because I haven't added it to here yet, but this is kind of where we stand in terms of what we support over what connectivity and from what host device. And I see some question marks there that it didn't, I think I meant to move that. Yeah, so I have to move these slides. So we'll do that in just a second. So this is all built on like kind of workflow APIs that CircuitPython has and I also have to add to the slides. But if you want to know more about those, we have a publicly documented Bluetooth services API and we have a publicly documented HTTP API. And I think this is really cool for this PyCascades audience because you can build more apps, more tooling on top of these APIs to further enhance like wirelessly programming CircuitPython. So here's where we are at the end of the day. Most things kind of are implemented and work, but the reality is that a lot of the wireless stuff still has lots of bugs, which is kind of why I'm coming to you all. We have this problem that it's a lot more effort to wirelessly program because there's no standard protocols between things. There's no kind of standard apps that work on those protocols. Like USB, we kind of like got a ton for free, which I didn't fully appreciate until we went into Wi-Fi and BLE land. So we have a lot more that we have to do to get these workflows going. And then on top of that, because there's our new workflows that people don't really expect to use, we don't have a lot of users. And so we have this chicken in the egg problem where we implement something but not a lot of people use it. I come along to do a presentation and it turns out it doesn't work or somebody else tries it, it doesn't work. We actually have to, like we don't have that feedback cycle of like, oops, we broke it, oops, we broke it, and it's getting better and better because we don't have the people using it. So what I'd ask is for folks to try it, to use it, and when you find issues, help us fix them, file issues, and write new tools on top of it. It'd be really great. So yeah, wirelessly programming CircuitPython. It's possible, but it's buggy currently. We need more people doing it. We need more people helping. I do wanna thank the folks that have done the work so far. It's been a huge amount of work. Antonia and Trevor worked on the mobile apps and Melissa's done all of the code.circuitpand.org stuff. So help those folks, help me, and let's make CircuitPython accessible over the air wirelessly. Here's some links, link to the presentation, and that's it. How long was I? Did anybody time me? Don't tell me it was over 25 minutes because I'm planning on adding all of the Wi-Fi web workflow stuff. So you go on a slide where that hello podcast gauge, so it looks like the continuation of earlier slides. Do anybody have feedback so far? I don't think, I think that was more like 10 or 15 minutes, which is about right. Ooh, the temperature is going down a little bit in here, which is good. Nice thing is that I can practice this more next week. I really just have to get my slides close. I'm gonna like not hold myself to not changing my slides at all. Oh, for Bailey workflow capture. Yeah, doing the hello podcast gauge thing again. I thought about that. That's a pretty good idea. I don't know if I wanna capture all those screenshots again. Hard to say how long it was because of the pauses, yeah. I'll be able to tune it. I'll be able to tune it next week. Like I've got all next week to work on this too. I just need to get them slides by Sunday. I think we should, I should work on this. I got more work to do to get the slides done. I think it felt pretty good to me though. It felt, yeah, I felt like I had a structure. It felt like I had a message. I felt like even like with Timon here, it's like, oh, I didn't know I could do that. Like that's also what I wanna bring to this of just like I wanna bring awareness. And that's why I'm trying to be really thorough about like here's all the steps you take to get to these things. Fire extinguishers at 2635 in the last status table was at 53, that's a lot. The other day, LadyAdea commented on trying to move to one USB stack and perhaps there are some test cases for USB. How are the various stacks tested for regression purposes? Using a thing called Marp is 26 minutes. Oh, don't tell me, I might have to think about this, how I'm gonna shorten it. That's kind of why I was like, okay, it's okay for me to just comment on PyLeap. Yeah, it might be too long. There are not good tests. That's the gist of it is that like a lot of our testing is done through folks using the stuff, which is not all bad because if things break that no one uses, it doesn't matter. It only matters if you hope they will use it like this case, in this case. But yeah, the USB stack thing was like something we did early on because like we had done the SAMD 21 with ASF 3 and then they announced ASF 4 and we had to move to that for the SAMD 51. And then we were using there the vendor's USB stacks and I like found like a couple of bugs in the ASF 4 USB stack. And the vendor stuff tends to have licenses that say that it can only be used on the vendor's microcontroller. And I was realizing that like all of the like USB class level stuff was shared. So that's why we did the work to move to tiny USB. It happened to be that like TAC had done this project that wasn't very popular and he didn't spare time. But I was like, no, we'll use that. And then it's gotten more and more popular and busier and stuff. So there's definitely a case for BLE doing the same thing. It's on my radar of like, there's a lot of BLE code that should be shared between different vendors. So one says ASF 4 was also insanely buggy as a whole. Yeah, we still use it. We use ASF 4 still. We have our own forked version that has some fixes, but yeah. And then after ASF 4, like Atmel got bought by microchip and yeah, David says, is it really broken if no one saw it? Not everybody reports bugs. So I'm just try something and do not return to circuit Python or that particular workflow. True, yeah. I mean, I think that was partly why I've been disarting is like, I was trying to get pictures of like PyLeap. I was just trying to get pictures of PyLeap and I was trying to get pictures of, I was trying to get pictures of the like file integration, which I do want to put in there. I think I want to own it. Like it just gave me a loading screen and never loaded. Timon, we do, all the code I wrote, I generally just use the struct headers for the registers, but there are other, there is other code there that uses actual ASF 4 stuff. DCD says, I think about how Pearl Python and some libraries are tested, but if there's a way to partition this stack versus Python testing. Yeah, it's really hard. The crust of ice testing is really hard. ADC, how it's completely broken still, you can only read channel one on any chip because the ADC MUX function is just not implemented. Yeah, I don't know how we do that. I mean, we have the ADC MUX working, but I don't know how it's implemented. I think like I was looking at like UART was using ASF 4 and it's probably not even the latest version of ASF 4, whatever, whatever the last one they did is, not worth updating, but that's like after that, after getting burned by ASF, I kind of like biased towards not doing that, although that's not fair because like with the ESP IDF, we use all of their HAL stuff, which has really benefited us. Like it takes some effort to get from version to version, but it's pretty easy to support new chips then. So vendor support matters. Okay, I've got more work to do. No, there's definitely cases where we actually use ASF 4. I just don't know what they are. Yeah, don't get me started on better SDKs. 20 onion layers deep, yep. I mean, even like, yeah, there's usually a few layers. I think there were other distractions during the slides, you can make it work. Thanks for the vote of confidence. I think I can make it work too. So this is what the presentation file looks like. And if you go to that link I showed at the end, you can actually follow along as I edit it. It's in my, I have a github.com slash tan new slash presentations and that's where all the source files go. And I usually dump like, usually dump like a PDF version of the presentation there too. Okay, these two I wanted to move. So I think what I wanna do is I wanna, I wanna leave the Bluetooth stuff to the last because I want it to be kind of transitioning into like, yeah, there's bugs and we need help. I know it's just a very hard problem. Yeah, 25 minutes. I had 25 minutes for my last slot and it was also 20, I was 21 minutes. I don't know how many slides that presentation was, but it's definitely a very different structure and format than this one. This one is very much like I wanna, I'm hoping to get you through every single step and sometimes there's a lot of steps. Unfortunately, unfortunately. So like installing without boot, I captured already. So if we go here, oh, so I want this one and I want these as well, these three. It's kind of my MO to like show stuff that doesn't work. Hopefully people take pity on us, maybe. The one thing annoying, so these are just pictures taken with my phone, one annoying thing is that I gotta convert them, not be in the world, but I like that I got a picture of it rotated, but I need to rotate it some more. You show editing tools, see? And I wanna put that in the slide that is before, I have five minutes to do it. One thing that's cool, so I have Mark running, I don't even know what thing it's running in, but it will auto reload here if you do it right. So that's not right. Oh, I got my exclamation point in the wrong place. And usually when I'm like on a smaller screen, I can after, it's annoying, like all of that text on the right hand side I'm duplicating. Just probably gonna come back to bite me, but so open your file glider app, you won't see anything listed, but then you tap when it's blue, blinking blue, it'll also be a rapid blink if you don't have color. For some reason it'll just be, there's two blink periods at the start and the faster one is when it's for Bluetooth. And then it'll discover and you compare, blah, blah, blah, blah, blah, blah. Let's actually, while we're here, let's do the other ones too, because I brought those over with me. Call this files zero, I need descriptive names. So at the end of the file glider section, I'm gonna do some more. Ah, it was the control C that messed up my cursor. There's a glider five, so this is gonna be files zero, this one is picky about spacing. Okay, the other thing file glider can do is I'll add an arrow to this image, you can click files, and then in files you have a glider location, so this interfaces to your file systems. You can see all of the different devices that file glider is connected to, and unfortunately, that is a bug. So let's add a bug files three, bug. Let's get her a little. My wife was saying how we got this new finance app and it's all about using emoji categories, and I'm like, oh yeah, that's definitely my style, it's like black and white text with emojis, and just it shifts it, but that's okay. Okay, so let's edit those images while we're at it, and the thing that I'm been liking to use is called spectacle zero, there'll be this window. Ah, you can't see. So the only way to open an existing file in spectacle is to use it from the command line, which is kind of silly, but the annotation's really nice. Okay, so we added an arrow there, and it pops up in the middle there every time, and I'm not sure why. So if I forget, sorry, glider. David says, shouldn't you downgrade to show glider when it's working and just saying there's a bug in 9.0? I tried the pie leap thing in 8.2.10, and it also didn't work. I'm not sure what, I'm not sure why it doesn't work. I realized that file glider wasn't updated for the JSON change in 9.0, I don't think. So one thing I might try to do next week, it shouldn't be too bad of a change, but I'm also, I just need to engage with and traverse more. Traverse should be able to fix it. Okay, there's one, let's just do our device. So let's take a look again. It only auto-reloads if you change the thing itself, so. Okay, the other thing you can do with file glider is if you open the files app or any other app that uses the files API, you can now have a location for glider, it lists your devices, and then you can list the files through there and use it in some other app. Unfortunately, there's a bug, and it doesn't work right now, but hopefully it'll get a fix soon. So that's the file side, blah, blah, blah, blah, blah. Okay, the other thing I wanted to show was, I did the HelloPieCascades thing on the web workflow. So let's find those pictures and we'll do the same thing. Those are gonna be in the screenshots. So here you can see, here's the web workflow stuff. This, some of these I already annotated, that's, these ones are the dash ones and up before. Yeah, see I took all these pictures, all these screenshots already. I don't know if I need all of them. They're kind of hard to see. There's a lot of steps to the install stuff, but I think I'm seeing the end of the light of the tunnel. This is a lot more stuff to add, but I think I've seen the end of the tunnel in terms of like what I wanna add, which is good. I don't wanna add absolutely everything and I feel like I'm like running out of time. Like I don't, I'm gonna fill it up. As you know, watching my two hour long streams, I have more trouble being concise than I do being long. And as always, if folks have questions, you don't have to ask them. Okay, web install zero. It's annoying that it jumps it down. It crossed my mind to actually make a ginger. Two? Do you think, do people like the format or am I going in the wrong direction? I think it's probably too late to, don't tell me. Maybe too late, but 11? 17, 17 steps to the web install, but it gets you completely on wifi, which is cool. Okay, and then I'm gonna do, I'm just gonna do this as WW zero, WW for web workflow. Perhaps cover one workflow in more depth with the least bugs and just let the listeners imagine the other workflows. That may be what you're doing already. The problem is the one that works the best is USB and that's not really what I'm trying to highlight. In my proposal, I gave 10 minutes for two minutes for a circuit Python introduction and eight minutes for going over what a workflow is. I have an Atari 800. I think you have web problems. I want to use web workflow for my Atari 800. I went a little crazy getting things that had cartridges on it, because I wanted to make, like I had the Game Boy cartridge, I wanted to make more than just Game Boy cartridge. It's free. I mean, I can always make the presentation too long. I can put all the slides in and say, here's most all the slides I'll do, and then if I run it and I'm out of time, then I can figure out how to trim it. Sounds like you don't think I can talk fast enough, which is probably not the right way to go about it, but still. Oh, you know what? I don't have a picture of the serial. I don't think I have a picture of the serial. Darn it. Let's all add this and then we'll see. I could just, I can reference it too. I already have some code. I'm gonna just keep renaming this because that's the groom up. Good grove in. Code CP zero. Code CP one. Include links to learn guides for the workflow. That's a good idea. The other thing link-wise I'm thinking of including is like links to all of the source repos. If you remember right, this is kind of like the talk version of my circuit by the 23 post, like blog.atorfree.com. If that's how long we've been at this, texts are just very slow. But if you look at my circuit by the 2023, like maybe this is what I should include actually. I should steal this GIF actually because it shows it working. I don't know why it doesn't work. I'm gonna do that. I don't know why they moved the buttons to the top. Oh, and yeah, see? See, this is the file glider working. Yeah, but if you've seen it before, here we go. Okay. So instead of doing an added, like a lot of these slides are just not animated GIFs, right? There are sequences of screenshots so that I can kind of like control and talk over how it goes. I see people using GIFs and then like they don't pace well. So that's kind of why I'm like, I'm okay with it being like a bunch of stuff. Let's just add that pilot one in there while we're at it. But yeah, that was part of my working theory on how I structured it is that a GIF would not pace with me. Like having a bunch of slides. Okay. All right. So we're up here. We're in circuitbython.org and we did, we wanna do the install series. And my cursor's still broken. Am I, do I sound like I'm ready for the weekend? Like I feel. I call it web install, right? Congratulations, you suggested the same thing. 64 pages. Okay, yep, that's the first slide. So you go to circuitbython.org, don't forget to scroll down, blah, blah, blah, blah. I need 17 of those, I think. I'm probably off by one. And of course it doesn't like it when it's, my cursor's broken. Oh, you know what? I was gonna check it with a neighbor. I don't like that my cursor's broken. But they just told me it worked in Nome and that was fine. Or I can count to 10. But sometimes he skips three. He's still learning. He'll say one, two, four. Like no, no, you need three in there. All right, let's see how that looks. Ah, Minnesota Ventat. Sorry I missed, I'm a little late. I had a window over the YouTube chat. Asked, I'm curious if you're sleeping well enough with the baby. So the baby is two. He turned two, which is super exciting. He actually did not sleep very well last night, which is probably another part of my problem. I went to bed later than I should have. At like 1130 and while I was brushing my teeth, he started crying. So I was up till 1230. And then he slept till 530 and then started crying again. He's like, we think it's an ear infection, but it could be teeth as well. So generally he sleeps quite well, but and generally the problem is is me getting to sleep in a timely fashion. Two, that doesn't seem possible. I know it's wild. It is wild. He's potty trained pretty much. I mean, he has accidents still, but he's out of diapers too. So yeah, that is the link I splashed earlier. Thank you. I will commit and publish to that when I'm done. When I'm done here. Okay, let's check the slides. Okay, so there are some cases where we wanna use a wireless workflow, but we don't have full USB support, so we can't do the boot drive. So I just wanted to run through. We have a cool installer that I don't think a lot of people know about that I just wanna run through real quick. So if you're running a regular ESP32, you're running an ESPC something where you don't have full native USB, this is how you can install CircuitPython and also Wi-Fi has this additional challenge of getting your credentials set up. So getting your settings or yeah, getting your Wi-Fi SSID in password is something that we assume that you do when you're connected, when you're wired connected, when you're getting CircuitPython installed. So here we're back at CircuitPython.org. This time we're doing an S2 feather. We gotta scroll down to see this nice open installer link. Once we click that, oh, we'll realize we're in Firefox and it uses web serial, which the Chrome-based browsers use instead. So we'll switch from Firefox to Chrome and now we have an option to do a full CircuitPython 9.0 install. So we'll do that. Note, you can also just install or use this to update your Wi-Fi credentials. You don't have to do the full install. There's all sorts of different things you can do from here. Warning, it's experimental. Let us know how it goes, but generally it works pretty well. Next, you have to get your serial connection going so you hit the connect button. It'll prompt you. Make sure that you don't have TO or something running in it already. And this slide is blank, 44. How do I know which slide is 44? Wasn't too far. We'll have to install. One, two, three, four, five, six, seven. Did I typo any of them? Oh, there's no eight. Note to self. Nice take. Okay, so make sure you're not connected, and then this will overwrite everything on your feather. And there's also this cool little icon here that shows us using web serial. Be honest, this switch from web serial is something that runs on more than one browser. For this install process, you can't really because the board itself is only serial over USB. I don't know what that might be. I'm still using Wget and Curl. For the install process, I don't think that there's a lot of options, but there's definitely like upgrade stuff that we can explore. So it gives you a warning, and once you click that, it erases the flash. It loads the new firmware. This board here actually does do native USB too, so it has you select the boot drive, then you can edit the boot drive. So it's cool, the browser can actually edit folders too. And then actually this installer is using QF2, which is kind of silly. Once it pops up, you'll then give it access to CircuitPie, and now is when you enter your Wi-Fi SSID in credentials, and then it's finished. What that's done is, although this is actually using kind of like the native USB workflow into the hood, it ends up giving you the settings.toml file, which you could add yourself, but it has these keys that tell CircuitPie on how to get on the Wi-Fi, and what password to use when you're modifying files. It's just not super secure, don't use a super secure password, but it's meant to kind of like put one small barrier, if you have like classroom full of kids, one small barrier to kind of prevent easy harassment across devices. So this doesn't go yet. The bit with selecting the UF2 drive name never works for me, always says wrong drive name. Selecting UF2. So I need to add more slides here. This is where I'm gonna add even more. I think that went pretty quick. Settings.toml, that's what we end up with, and now we're gonna put more slides. And these are the WWW slides. Maybe I should have used something that didn't have native USB. How many WWW slides do we have? This is kind of why I had this naming convention, up to six. Okay, zero, one, two, five, six. Presentation, you know what, I want a slide between that CircuitPiethon.local, and let's do HTTP, no HTTPS. Okay, so now we're transitioning from the install process to the, Tya says selecting the UF2 drive and boot drive should have fixed very recently merged. So try again, maybe only one is fixed. Windows didn't return drive name for me. Ah, and it's already fixed, great. Hopefully, I believe that's what you're saying. Okay, so once you have that installed, you boot it back up. If you have a screen, it should show you that you're on the wifi. If you have a serial terminal, it'll show you in the terminal title bar that it's on the wifi with the IP addresses. But if you have NDNS working, which is also used to discover printers and Apple TVs and stuff, uses a thing called multicast DNS. What you can try is you can try CircuitPiethon.local in your browser. Make sure you're using HTTP, not HTTPS. And what that'll do is it'll take you to one of the devices you have on your network. All of them respond to CircuitPiethon.local and then immediately redirect you to their specific local domain. So in this case, you can see I have CPie37, which is like the MAC address, dot local. So this is kind of the landing page. This is an HTTP server that's running on the device, on the CircuitPiethon device, run by CircuitPiethon, not by user code. Gives you some information about the device. And you'll see here that it also discovered all of the other devices on the network for you. So you can click the other devices to get to that. Like you have no guarantee which device you get to via CircuitPiethon.local. So that landing page will give you links directly to all of the other devices that it can find via NDNS. It's also helpful if you don't have NDNS on your computer, you can type in one of the IP addresses and then that CircuitPiethon device can do NDNS to the others. Anyway, so now we're at a different CircuitPiethon.local. We can click the file browser and once we do that we actually get prompted for that password we set in our settings.toml. You leave the username blank but fill in the password and once you do that you'll get a listing of the files. This is all hosted from the device itself. There is a CSS file that loads from the internet just to make it a little prettier but it's functional without it. You can see code.pie.he is here. And what you can do is if you inject the CircuitPieDrive it detects it's ejected and it will, if you refresh the page it'll allow you to edit the file. So you can rename, delete, you can upload files all through this interface. You can see how much disk you're using and once you hit edit you get to the super basic but offline capable editor here. We can see we just have the print hello world and you could hit save. But we have something better. We have code.CircuitPiethon.org and it seems to bind to a device that isn't currently running. Tomon says really need to check that out. That's very cool. Okay, so let's go even further. Now if we're doing code.CircuitPiethon.org you can go here. That is the NDNS that I'm referring to, multicast DNS. That is the right Wikipedia article for it. So if you go to code.CircuitPiethon.org and you'll probably wanna do this in Chrome for the same reason with the loading but you can have wifi, Bluetooth and USB connectivity from the web editor here. And I have to put those slides in. The way that you do it with wifi is a little tricky because the domain is not CircuitPiethon.org. So let's grab, what did I call those? Those are code CP, code CP zero through four. I do feel like I missed the web serial thing which is kind of unfortunate. Like these slides are going pretty quick though, right? The workflow works for me in Firefox on Windows by the way. The wifi stuff will work. It's the web serial and the web Bluetooth that won't. Oh, it won't work in Firefox. I'm a daily driver of Firefox but I always have an install of Chromium. And in fact, there's like somebody who does a version of Chromium that's just with all of the Google calls removed. It's called un-Googled Chromium and you can get it through the ArchPack package manager. To me, it feels like it starts up faster but that can just be my bias showing through. And I think we wanted six. No, four, okay, great. So we're gonna save that, we'll go back to the presentation. Okay, so this you can use for wifi Bluetooth and USB. I'll show you the way that you do it on wifi. So because we have domain restrictions, trust me, we tried to have it crosstalk and browsers don't let websites talk to .locals. So what you can do is you can take your CircuitPython device, whatever CPy.local and add slash code slash and what this does is it assumes you're online and it downloads the same JavaScript that runs codes.circuitpython.org and kind of like fills it all out for you so that you can work from a browser on wifi. So you do that, it will also do the more network devices for you and then you can, let's see, close and then if you hit open, you can see a list of the files, you can select the code.py. Here's code.py, you click save and run. Opens the serial side of that connection that serial print output workflow thing. And now you can see that it has Hello World on the right. I switched it to PyCascades 2024 and now after hitting save, we can see that the output is there as well. Whew, I think that's it. I'm missing the offline web serial thing, but I think I can skip it because I just showed it through the code. Circuitpython.org version, so this is all the wifi stuff. I added this, like click when it's blue, pairing thing. I think maybe I should replace this like David was suggesting, I think that's, oh, you know what, I need two screenshots for this behind the scenes, behind the scenes. You know what, I might not do this. I said it would be five minutes, I'm not gonna do that though. I think maybe I'll just talk about it. I think I'll just have two slides for it. I don't think I'll do screenshots. Let's work on this. I'm almost done. I'm almost done and I'm almost out of time. If folks have questions about anything, it doesn't have to be presentations and slides. Now's the time to ask them because I will get out of here right at four. But I think I'll just flush out this slide. So Bluetooth services, that's the documentation link. What tool did you use to convert the NB file to the browser? That is Marp for this one. The old one is Dexat. The previous one is Dexat and then Marp is heavily inspired by it. Marp.app, what I'm using. Dexat's what I used to use. Marp is heavily inspired by Dexat but is open source. It uses NVM, so I want this link. My cursor's busted again. Ah, should I add this stream to my bug open with the sublime text people? Come on, help me out. Serial Nordic UART service, but with different UUIDs. Custom file transfer service, access, and a socket. And let me use my little Coder emoji iOS Android. And the last one was piling. All right, let's find those links and then we'll call it for the day. And I think that, was there any other major thing that I wanted to add? I don't think so. I might shuffle them around. They'll get the idea of what I'm doing. There shouldn't be any copyright issues with screen grabs that I'm taking. Just, where's this? I think I have all these links in here as well. Yeah, learn guides, pilates, source, iOS. I don't think I have a file glider iOS. I'm not sure I have the blue fruit connect stuff here, which is part of the reason I wanted to include it. Glider, and now we go in a fruit. Sorry, it's easier for me to look over here. Here's the iOS app. I think these are right. Good, good, good. So now we look at our presentation. So, oh, I love, my millennial brain is tickled by my Coder emoji. Behind the scenes, we have workflow documentation. Let me call that workflow documentation. Documentation is a little vague. Workflow documentation. We have, for the BLE workflow, we have serial over a, what's essentially Nordic UI service, which is really common, but we change the different to different UU IDs. That allows the user to create a Nordic UI service. We have a custom file transfer service protocol that is documented on GitHub. Hit the workflow documentation and that links out to the file transfer service stuff. I see a typo, workflow, not work, work, vlog. I didn't put that, oh, I did put the GIF in. We'll look at how that looks too. Web workflow, we have an HTTP API for file access and just like that landing page, MDNS for discovery. And then we have WebSocket for the print output serial stuff. Let's find the DNS for discovery, okay? I didn't even talk about the terminal stuff, but I got enough, I got enough, I got enough. So that should get people started and then we'll do app source links here for the FileGlider, Blueford, Connect, and PyLeap if you happen to be mobile development inclined. You can check those out there. So we'll just slow. So here's kind of what we overviewed, the statuses. We can do wifi from laptops, we have an API for it and we can do it from phones. We can do BLE, I don't know if I told this group, but all of the FileGlider, PyLeap, FileGlider, PyLeap and well, not Blueford Connect, but FileGlider and PyLeap should work with wifi as well, which I guess is this wifi print output one is a lie. It works, so code.cp.org will work, I think in wifi print output on phones is a caution. I think I'll just say it, it's not there. Blueford Connect, I don't think works with wifi. Last minute questions if you fancy. One, is Android supported for BLE stuff? Yes, I think we should have feature parity for FileGlider and PyLeap between Android and iOS, but like I said, they're bugs, so beware of bugs, but in theory, yes. And in fact, Chrome on Android does support like the web Bluetooth stuff, so I think code.cp.org should work with Bluetooth on Android devices. That's not true for iOS, but it is true for Android, I think. And then totally unrelated, if one does try using OTAs their way to switch apps, also is there some mechanism for rollback at the new OTA app that's bad? Or does only have the ability to go forward, download a new bin and flash, hope you got it correct. So this is why I have marked partial on here, is that CircuitPackdown does have what somebody, the person who added it, added called dual bank. So there's a dual bank module on ESPs generally that allows you to flash to the other bank and then switch to it. I have not tried it myself and we don't kind of have it documented, so I don't consider it to be well supported. Like we haven't taught people how to upgrade over wifi, but that's why there's a little partial marker there. So yeah, it's kind of like you have to DIY it right now. But it should allow rollbacks, except there, whenever we run out of space on ESP, people come to want to remove that second OTA partition. But I keep fighting because I think at some point, especially as web workflow gets more popular, we're gonna want it. But yeah, I think that's it. I didn't look at the animation like I said it was. So status, I think I'm gonna remove that copy of the status. I think I'm gonna go straight from Pilate to Pilate scenes. So it is running, but I feel like I need to put the bug warning there too. Trevor is looking at it, I already asked him to. Okay. All right, let's wrap up. My brain's gone. My brain's gone, you know what, before I wrap up, let's commit it and push it. And yeah, I think I just want all this stuff and .ish draft to get this out of there. It's asking me for my GPG key. I have a secret browser window under there. I don't think you could actually see anything, hopefully not. Okay, so I created it. I actually, I wanna do a PDF as well. How do I do a mark, mark, CLIPD, look at that, dash, dash PDF. And I think the mark is actually running. I have this other weird terminal that I was using for screenshots and that's where it's, that's where it's running. Let's just close that. Oh, I gotta do the, I tried to install it via the AUR, which is like the user repository for ARCH and it doesn't work then. I just want a PDF and it's going. It's gonna be a giant PDF. I don't think I have my, I don't think I have it set up to, I assume it's going. Yeah, it's like grabbing all of the 203 megabytes. Ooh, am I over my, how did I get it, how did I fit it last time? I'm over, I might be over the, I remember, I think it's 50 megs that is the limit for GitHub. Too many pictures. I don't think that's gonna work. Do animated gifs show up in PDF, I have no idea. Can I do ocular and then presentation.pdf? Just one frame, which is fine. It works. Get commit, get push. What? Didn't I push it already? Don't reject me, don't reject me, don't reject me. Maybe I had set up LFS already. This is like get LFS thing for large files. I bet that's what it is. I might have set it up already. Cross fingers, cross fingers. I gotta get out of here. Gotta go home. We're headed to my dad's for the weekend or for the night. Ah, it rejected me. It's 100 megabytes. I think I need to shrink all my, if I shrink all of my screen, well, most of the screenshots are not that big. Like all these PNGs are pretty small. It's the JPEGs that are quite large. The gliders are pretty big. I could probably get the PDF size down by resizing these big PNGs. Like they have a lot more resolution than I need. I'm not sure that's enough to get me down all the way to under 100. I doubt, well, let's see. PDF output options. This I can figure out later. As long as I have all the resources, which I do, I can do it for my laptop this weekend. I thought there was an option to compress images in PDFs to the target resolution like for printing. I don't know how they're generating the PDF. And maybe they're doing that. I don't know. It uses a browser to do it all. Oh, the JavaScript world. Okay, I gotta go. But everything's pushed, I think, enough that I can get something to send them this weekend. In fact, I'll be in town tomorrow night. Okay, camera. Thank you all for hanging out with me as I work on my slides. I feel good about this presentation. I've got practice to do next week, but I think pretty much all the images are there. Doing the web, or the Beely workflow with just printing hello pie cascades is probably a good idea. Maybe I'll do that next week. But not now. Usually I'm doing C code for CircuitPython, not today. The other part of this is being the lead, or at least getting the word out, is during presentations. So I am excited to see folks pie cascades next weekend, not this weekend, but next weekend. I won't be there the whole time, so if you are there, please coordinate with me if you wanna meet up, because I won't be there the whole time. If you wanna support me, you can go to Adafrit.com and purchase hardware there, like the clue I showed earlier. Adafrit pays me to do all this, which is awesome. They're a huge support for me, so I really appreciate it. If you want to join the Discord, if you're in the YouTube chat only, join the Discord, because it doesn't go away when I click and stream. You can do that by going to the URL, a-d-a-f-r-u dot i-t slash discord. I think I'm around next week. In fact, it's the day before pie cascades, so I will be here. I should be able to stream, assuming everybody in my family is healthy, and thanks preemptively to DCD for taking notes, usually does, and thanks to everybody who hung out. I have a great weekend. I'll do a little bit of camera, and then I gotta run. Thank you all. Have a good weekend. See my reflection somewhere, somehow. Somehow it's reflected. But yeah, thanks all. Have a great weekend.