mergeconflict233 James: [00:00:00] This week's episode is brought to you by sync fusion. Listen, are you building an app? You probably are because you're listening to merge conflict. Well, listen, you need to sync fusion in your life. Sync fusion gives you hundreds of controls. Ready for your application. No matter what platform you're targeting. List views, scroll views, radio buttons, check boxes, optimize tree views, calendar views, charts, graphs, you name it, sync fusion. Has it. Better yet. They support every platform that you could possibly imagine. Whether you're building iOS, Android, Xamarin, ASP, net core blazer, desktop applications, you name it. They have you covered not building an app that needs controls. Well, don't worry. They have amazing libraries for dashboards, PDF, parsing, word documents, Excel files, you name it. They support all these amazing file formats and have all sorts of amazing controls. You need to check them out, go to sync, fusion.com. Slash merge conflict that is sync, fusion.com/merge conflict. You can find that link in the show. Now it's 11. All right, Frank, I'm all in on Bluetooth. I don't know if you've heard of this, a magic revolutionary technology, blue tooth teeth that are blue. Have you heard Frank: [00:01:12] of this? Uh, yeah, from my past, I remember when I was, uh, graduating from college, I had to do a senior project or something like that. And we decided to do Bluetooth. And just at the time we had decided to do Bluetooth. There was an I triple E spectrum article saying Bluetooth is dead. And that was a 2004. So I guess it's been dead for awhile. Uh, why, why are we talking about it? James: [00:01:37] Well, we're talking about it, Frank, because I'm back on the cadence sensor fitness thing, but instead of talking about fitness, let me set the scene here and why we're talking about Bluetooth. Okay. So. There's many things going on here first and foremost, um, I have put out my official review of Apple fitness. Plus you can look at that in the show notes below and an article of my spin bike. So let me remind everybody. I built a little at-home spin bike. Um, it's, you know, off the shelf bike, but I added, you know, a tablet holder, a squishy seat, and a Bluetooth cadence sensor, which tells me how fast I am pedaling. Okay. Questions there. That's the, where we're at right now. I Frank: [00:02:16] I'm so excited. We're doing an IOT episode, whatever. I don't care. I'm in, I'm in, this is going to be fun. Um, yeah. So last rapport I knew was you had that sensor because I was very excited about it before. It's very clever. It just rotates and tells you how much it's rotating. It's I love that like single purposeness of it, that like, there is so much power there that computers. You know, it could send a rocket to the moon, but now we're just going to measure how many times use you've pedaled your bike either way. Sounds like we're digging into the details now, so please continue. James: [00:02:47] Yes. Um, so that is correct. That's all it does. It has one purpose in life and that is all it does, which is fantastic. So Frank: [00:02:55] butter the toast. So the James: [00:02:58] cool part here is that when you do spinning often or even any cycling endure, it's. It or outdoor too. It's important to know how fast you're going and you know how fast you're rotating these things. So if you use Peloton, which is a, an application and a bike, they make a bike, which has all the sensors and stuff built in, but you can use the Peloton app separate. And when you do a spin class, the instructor is telling you how fast you're supposed to be going. Like what the resistance should be. And the cool part here is that the Peloton app. For iOS and Android, you can just say, go find my sensors. It finds the sensors and it puts that, um, different number on the screen, which is super helpful. Right. So, boom, that is good, Frank: [00:03:41] right? Yeah. Okay. So this is in an app already that exists. Is this in a lot of apps? Is it going through, um, I'm trying to remember. It's not, healthcare are exercises through healthcare. What goes through is their action kit. Exercise James: [00:03:56] kit. There's a gym kit. That's a new thing. Uh, I believe, Frank: [00:04:02] I believe trying to make a joke, James. James: [00:04:05] Well, finally, Apple thought about that, your joke, and then they implemented a kit for it. So there is, there is thing called a gym kit, which is more around. Integrating fitness equipment. Like, uh, if you went to the gym with health kit in general, but Peloton can do that. So what Peloton can do is you can give it access to your health application. You can, you know, have a heart rate monitor. You can have a cadence sensor it'll then put your workouts instead of your Apple watch. For example, it can do that. And that's really cool. And. I was pretty happy. I've been happy. I've been spending a lot for two weeks straight non-stop and then Apple, like we said, last week, put out Apple fitness plus, and I can now report back that it's pretty. Okay. It's a, Frank: [00:04:50] the glowing review over here. James: [00:04:52] They, they put out a baby and there, it gave us one month free. So you can't complain about Frank: [00:04:58] what, what activity have you done on it? James: [00:05:00] So I've done yoga core and spinning so far. What is Frank: [00:05:04] core James: [00:05:05] core is just different holds and stretches. And, um, it's working on your core stomach, your stomach muscles, you know, or your arm muscles. Frank: [00:05:16] It's more for yoga. James: [00:05:18] Yeah. It's, it's, it's kind of yoga, but with. Like flex a lot of flexing. Frank: [00:05:23] Right? Ladies? Is it like a non trademark Pilates, I guess? Cause that's like a, that's a machine stuff. I don't know anything about fitness. James: [00:05:31] I know nothing about core except for I did a class and it was pretty good, so. Okay. So. It's really neat because Apple has done something really neat in this regard. So this is all one big run-up into where we're getting into Bluetooth, but here's where things get pretty neat. Okay. Because the Apple watch is required for Apple fitness plus. And in my video review, I show you how it works. One, the iPhone and iPad work exactly the same, which is you need to be signed in your, you know, your watch needs to be paired. And when you go and you select a. Let's say just, let's just say a spin class. We'll just keep it at there. Keep it simple. Or a yoga class. It will say, do you want to start this exercise? And on your watch, you say start and what's cool. Here is it then makes a pairing with, with Bluetooth, but sort of reading the data in real time. And it puts up all of your statistics on the screen, including your rings, your, if you're going to close the rings, your calorie burn your heart rate, and then a timer too, and it matches your watch. So it's really, really neat. And you're like, wow, this is amazing. But Frank, hold on. Cause it gets better because Apple. Did something else really, really cool, which is on Apple TV, they introduced multi user accounts, Frank. Frank: [00:06:46] Uh, that wasn't on Apple TV before, I guess it was in every app. They would just ask you who are you kind of thing? So it was a, a system wide features what you're saying? James: [00:06:56] No, it is inside the fitness app, Frank: [00:07:00] but it will never happen. Multi-user accounts. I think, I think that OSTP actually supports multi-user accounts, but only in like the students in the academic scenario, like I think they unlock a feature or something. About it, but I actually, can I interrupt your story real quick? Cause I think you had a tweet or something that I found helpful. You were saying that you actually couldn't get the fitness app until you were what, like on your phone with the Apple watch paired to it. So they like, if you can't find the app, make sure you're doing that one specific setup, I guess. James: [00:07:29] Yeah, so it's really crazy. So when you upgrade to iOS 14 dot three and T V U S 14,003, and on the TV, the app just shows up just like, you know how it's there for our iPhone. It's just, it's on there, but on iPad, you are not allowed to pair a Apple watch with an iPad. It's not allowed because the watch app is not available on iPad only on Frank: [00:07:50] iOS. Today I learned. Okay. That's interesting. Okay. James: [00:07:56] They did is they put the fitness app onto the app store, but I ran into this weird issue, which is the iPad is only a screen that's on the bike. We don't use the iPad at all. So I had logged in, on a different user account, just like a shared family account and sure. When I went to the app store, it said, Oh, this happens compatible, but you don't have a device that is required to make this app work. And I'm like, well, what are you talking about? Right. Um, and what I found out is that some how in their system, it says only allow people that have an Apple watch paired to their Apple app store account to download this app. Crazy. Frank: [00:08:36] It's crazy making because I would totally, I always buy apps in the wrong place, like on my Mac or somewhere like that. I I'm always seem to be in the wrong store, but okay, good pro tip. I just wanted to make sure everyone was aware so they could follow along at home and so that I can follow along. James: [00:08:51] Yeah. And on top of that, on the iPad, by the way, I couldn't get it connect to connect to my watch until I logged out of my. Not only the app store, but the iPad itself, I had to log in to my personal account on the iPad. It was crazy. Frank: [00:09:08] Yeah. Okay. James: [00:09:09] I'll just say that'd be TV application fixes all of it because in the top left, it has an area where you can change profiles. And it's really clever. What it does is it will seek out all Apple watches in the vicinity and show them and say, which Apple watch do you want to log in as. Frank: [00:09:28] Okay. We're back to Bluetooth finally, back to Bluetooth. Cause I'm like, wow, that's cool. Yeah. That'd be able to afraid because I live in an apartment complex. There's probably other people with Apple watches, but hopefully that distance would be okay. James: [00:09:41] Yeah. Hopefully they're doing some like Frank: [00:09:44] account check. I don't know what they do because like Bluetooth devices change their ID constantly. So there's not a great security model behind . James: [00:09:53] If you're very curious, you can install an application on your phone. Or on your Mac called light blue. Okay. Um, this is a brilliant application and all it does is sit there and it seeks out Bluetooth devices that are nearby. Yeah. Yeah. Um, Frank: [00:10:11] sorry, I'll just interrupt because I was going to say you need a Bluetooth Explorer. That's usually what these kind of apps are called, uh, on the Mac. You can go to Apple developer downloads and they have a Bluetooth explore there, but I think there's also Bluetooth explorers on the app store on windows. There's a million of them also. That's kind of clever though, that there is a phone one, just from my own past experience, though, I've noticed that the Bluetooth stack offered on the phone, they tend to hide a little bit of information. I'm speaking just about iOS. Uh, the iOS Bluetooth stack, it'll hide some information specifically about Apple devices. So if you have like an Android device scanning and an iOS device scanning, they're actually getting slightly different information, uh, just because of the software stack, not because of Bluetooth or anything. James: [00:11:01] I didn't notice that by the way I definitely did because I installed light blue on both of them and we'll get to why I installed it, but it's very fascinating. Um, so this had me thinking, right? I was like, wow, this is really cool. Because it's exactly how I want a fitness application to work. Say who's working out right now, but so clever to be like, well, it requires the watch. So let's do this. All right. Frank, 10 minutes in, we have the scene set because after I did the core class and the yoga class on the TV, I went outside, figured out how to get the iPad application installed. Like we talked about, and it was ready for my first spin class on Apple fitness plus. And I was so excited about it. And then. I ran into one big issue, Frank, which is that Apple fitness plus doesn't have integration with any other external sensors. Frank: [00:11:51] Apple, you break my heart every time. It's always so close. Right. Uh, okay. And by, and this is an issue because I think we talked about on the last episode, I'm not sure if the Bluetooth designers included rotating devices, like there's probably not upgrade standard actually. Did you do any research on this? Is there a standard for this rotating device? James: [00:12:14] I am so glad that you asked Frank. Oh, this is exciting. So I got really, I got really excited about, um, Well, what if I was to develop an app that would read the sensor data and maybe I could just, you know, I would put it and I could have do side-by-side iPad, which in my video, by the way, you see me attempting to do side-by-side iPad. And I have the most difficult time. It's so complicated to do pop over and all this stuff. It's, it's the worst system in the entire world. Frank, you really need to sit down with me and show me how to use it, but I digress because there is an app on the app store. That can like read the cadence, but it's actually a really bad experience because you know, it kind of pops over on top of it. So I thought, well, I'm going to develop my own app because this person is trying to charge $10. I'm going to do a free version with a nine one 99 upgrade. And, um, what I'm going to do is I'm going to build an app, but it also had me, um, after I randomly got featured on hacker news, someone posted a, um, A really cool project for an SB 32 little Arduino board, which can also speak to Bluetooth and read these sensors. And I was like, how's it reading these sensors? And Frank, I have found, and in front of me, I have the official Bluetooth cycling speed and cadence specification from 2011. Frank: [00:13:35] 2011, hot off the press, merely a decade old. Okay. I was way wrong, but in my defense it didn't exist when I was told Bluetooth was dead. So it's fine. I, I love that someone, uh, someone thought about it was there a sponsoring company sometimes you'll see that in these specs, like people who push the initiative. James: [00:13:56] Um, no Frank: [00:13:57] silly question. Sorry. There was also a really smooth, humble break in there. Well, you know, I got onto hacker news, you know, just a little just w w which one got onto hacker news, your video or your article, James: [00:14:10] and my art. I wrote an article about the bike that I built and someone apparently submitted it to hacker news. And I tried it in the top 10 for like a day, which is. Really cool job. Frank: [00:14:20] That's always fun. I never seek it out. Like, uh, when I first started blogging, I would post my own articles or news and they would never get up voted. So I just stopped doing that. So it's always really fun when you have an article, make it. Uh, bound to that front page. James: [00:14:36] So, yeah. Frank: [00:14:36] Good job. Um, all right, so, so, so, so you have options. If you want to read a Bluetooth device, you could write an app, as you were saying. Um, both iPhones and Androids have the Bluetooth, so you can totally go that route, but you're saying somehow for some reason, your interest got peaked on creating an IOT device, your own custom electronics to accomplish this task. Tell me more. James: [00:15:04] Yes. I want to do two things. Frank, the first thing is I want to explore the world of Bluetooth via the phone, like you just said, and then I want to create a dedicated device because here's the thing in my review, I kind of talked about this. I just gave you links to the PDF and to the Excel spreadsheet. I'll put those into the show notes, a pretty cool, um, just cause we'll go through this, cause this is my first real experience with Bluetooth. So, okay. Let's talk about the phone application first. I still want to develop a phone app because I think it would be just a fun project to learn Bluetooth. Cause I get so many questions around it and this is really where I started. And. The cool part about the phone app is let's say you were using the Apple TV. You could then put your phone on your bike and then, you know, you would have the cadence there, like a really simple app where obviously I don't want to attach two devices, two phones hunted by, onto my bike. Cause that would be kind of silly. So that had me thinking. Well, what if I could make this tiny little device like this person on, on hacker news, um, pointed to, and he opened sources project. So the, the code is waiting for me. Frank is just sitting there. I think I have to modify it because he made it for a specific bike, but, um, it, the code is Bluetooth, so it can't be that difficult to modify, but I was like, Frank: [00:16:17] okay, sorry, sorry, sorry, just a small heart attack there, but please continue. Yeah, James: [00:16:22] I guess maybe the. He has some hard coded strings in there. Let's just say that. I think I just have to swap it. U U I D here and there that maybe, maybe it won't work maybe, but, um, you know, I think in general, like I can, I can, I can write some C plus plus or C code is that it's not that complicated, Frank. Um, but so those are the two things that I want to do. And I say we first start with the phone because I think that's something that we can grasp a beat first, because that's a natural thing before we go onto the. Other thing, but I think we should even start before that, which is understanding how Bluetooth works, because Frank, it is so complicated, but also so magical at the same time I sent you a screenshot of my app actually working, which only took me two hours to go. I haven't not parsing the data correctly yet, but the one thing that someone told me today is, um, Bluetooth. Uh, Oh, um, Joseph told me I was talking to Joseph today. Uh, humble brag, little Samaran. Co-founder my old boss, Joseph Hill. He was telling me that, um, you know, Bluetooth is very binary. You know, it's like ones and zeros, you know, type of thing or, Oh, no, it wasn't Joseph. Oh, sorry, Joseph. Frank: [00:17:31] It was niche me. James: [00:17:33] No, it was niche. It was different niche. Uh, Neil, who is on my team. Out of India initially was telling me I was explaining this project. He goes, you know, um, Bluetooth is very much like circuitry, right? It's kind of IO almost based in a way where it's like binary in a way. And I was like, Oh, that's why Frank. Is probably an expert in Bluetooth because he deals with circuit and IO all day. Is that an accurate representation, Frank Bluetooth? Frank: [00:18:00] Uh, yeah. It's, it's, it's a funny way. I've never heard it described that way, but sure. Yeah. I mean, any programmer has to deal with protocols at some point in their career and my career. Because of the electrical engineering, it's all. Yeah. Reading binary, data streams, making sense of them, extracting data from them and coding them. We all do it. Um, you know, even file formats are exactly the same. It's a binary and coding of some data. So anyway, the, the, they, we should start at the very top though. Um, There are different Bluetooths out there and I'm not just talking Bluetooth one, two, three, four, five. The big difference is Bluetooth L E versus real Bluetooth classic Bluetooth. Yeah, we're going to ignore a classic Bluetooth because honestly it probably did die in 2004 and it's just kind of hanging on, um, we all do Bluetooth Ellie these days, primarily because it's just compatible it's. Um, you might have noticed it doesn't require such a strict pairing sequence for most things. It's mostly an unpaired protocol where, uh, servers. Offer information like the little spinny rotating device, anyone can connect to it. It doesn't really have a security model around it, maybe a passcode or something, but if it has security, that means the person who wrote the Bluetooth added their own security on top of it, usually. Uh, so every Bluetooth device advertises a bunch of services, which doesn't really mean anything. Just more of like a directory structure. And under each service are characteristics. And characteristics can have attributes and that's where you're finally sending data. So you'll see a list of services. You can subscribe to those and get a list of data points that you can extract data from. Okay. James: [00:19:48] Perfect. Everything is really confusing. All of a sudden, because this was me at 1:00 AM. What is this descriptor characteristics. Service. Okay. So, okay. So every. Let's break this down here. So I'm looking at the Bluetooth spec and the Bluetooth spec says that this has a U U ID of one eight one six. That's like it's unique identifier. Okay. Frank: [00:20:11] Yeah. And, and unique should be in scare quotes here because it's really just something like a binary stream. Some people do full like fluids that you're used to 128 bit goods, but that also wastes bandwidth. So you'll also see these much smaller ones also. So you might see big ones, you might see small ones ignore that. Sometimes they're big, sometimes they're small. James: [00:20:33] Okay. Gotcha. So the service. Is what is being broadcast, right? So you have a device and the base is a service that, is that correct? Frank: [00:20:41] Yeah, it'll have multiple services. Usually we can start at the very beginning though. Um, BLE devices are constantly broadcasting and they're mostly just broadcasting. Hello, I'm here. This is my address. And sometimes they broadcast the list of services, not always optional. And they're also allowed something like 11 bytes of data to just continuously broadcast. And the neat thing there is, um, Uh, when we get into it, the servers require connecting to the device. Yeah. But what's neat is in this broadcast mode, your device can actually just say, Hey, my current rotational velocity is 20 RPM. You know, it could just be broadcasting that. So there are these two options for how to broadcast data, either you do it constantly where you've created. A passive device, basically, no one has to connect to it. The data is just out there, or it offers this list of server surfaces that you have to connect to. And that's an important distinction because when you connect to one of these devices, no one else can connect to it. So you can't have your phone app reading from the same device as your little IOT thing. Unfortunately you can, if it's broadcasting, but you can't, if it's services. James: [00:21:59] Oh, fascinating. Maybe that was one of the issues I was running into, which is some of the other apps wouldn't show it or connect to it. So you're saying that yeah, if this is here, only one person can stream the updates to it. Frank: [00:22:13] Yeah. It's super frustrating because I run into this with my one wheel all the time. If I use the one wheel app, it connects to the board and no one else can connect to it during that time. Now it's still broadcasting. So again, whatever is in the broadcast data, some 11 bytes, um, that's out there, but, um, one time only, and a lot of apps, honestly, aren't good about disconnecting. They might have a background mode and they might just stay connected and you might have to force, quit the app to get it to actually disconnect from the Bluetooth annoying things like that. James: [00:22:48] Gotcha. That makes sense. Yeah. I was, I was looking at there's a library I'm using, which is the BLE plugin for Xamarin. Because I could just use core Bluetooth, I guess I probably should just do that, but I'm like, I'm going to use this, you know, I'm going to do my own thing and use the cross-platform thing. So I'm only making this app only for iOS, by the way. So only iOS and that's all I'm going to deal with. Keep it simple. Um, and, uh, and I just figured why not? Cause that's my current setup and I've never done that before and I'm going to do it now. So yeah, I was looking through the code and it's actually quite nice. So they have the concept of. Um, and adapter and an adapter is what enables you to scan for devices, discover devices, connect to devices. And yeah, it starts at that w which is start scanning for devices and you can check the state and make sure that Bluetooth is on, which is really cool, but it'll just give you an event to say, here's a bunch of devices and it just searches for 60 seconds, or however long you give it. And it goes, and these devices have some of that information. So it has. And that's, what's fascinating, right. Is while I'm looking at the service here, you, the service is part of the device. So the device, like you said, is maybe broadcasting a one or multiple services. So really you have to connect to the device and then investigate the service to see what's available. Is that correct? Frank: [00:24:12] Yeah, absolutely. Uh, sometimes they broadcast their services, like I was saying, but, um, Uh, they, they lie and devices lie constantly. What you're going to find when you're running Bluetooth code is you really have to handle your error paths because these things break constantly. You could get a device list, say connect and the connect could fail, call connect again. And all of a sudden it worked. It's a low power device. You know, you really have to handle your errors and think through your error paths, which is complicated because doing most things and it is a multi-step process. First, you got to discover, and then you got to connect to it. Then you got to get a list of services. Then you got to, uh, get a list of characteristics from that service. And then you've got to read the characteristic, which is just your data. Any one of those five steps can fail and then you have to decide how far back in that stack. You need to go to reset it and then be prepared that that might fail. And so then you got to, you know, pop all the way back up to the stack. So my suggestion for all of this is, um, use exceptions. Make sure you have good try catch handlers. Um, fail fast. Basically, if anything fails, fall back to a big exception handler that disconnects the device and just tries to reconnect it. If your connection fails, don't try to recover it. These things are so flaky. Just abort, abort, try again from scratch. Yeah. Basically James: [00:25:42] I've noticed that. Yeah. And it's, it's pretty. Tricky because you're right. It is a very multi-step process. So the first thing that I had going the other day was let me just find all of my devices. And by the way, when you do that, there's a surprising amount of things that are broadcasting in your house, right? Frank: [00:26:00] Oh yeah. I love, I love interrogating that because a part of w while you have like that, uh, IBeacons and AirPods. I know you're familiar with iBeacons that's in that broadcast part. They're always like dumping out that data, but even your phone is constantly saying this is the current time. This is, um, my current battery level on different bits of information like that. Even your AirPods are broadcasting on Bluetooth to L E a funny thing is in fact, when I was building your anniversary clock thingy, I was gonna at first, just. Look for any Bluetooth devices around and steal the time off of them. But. It's actually a little unreliable. Exactly. Uh, if anyone's going to report the time, you can't guarantee that a phone's going to do it because privacy and blah, blah, blah, blah. James: [00:26:52] Yeah, my, um, my, I just connected to my watch via Bluetooth Ali, or at least I'm interrogating the device and it says that it's an Apple, um, Apple Inc. Watch three dot three is the model number. So it broadcasted those in the, in the device information, right. Is like here's the thing has no services available. So there's Frank: [00:27:12] that. Uh, but it's lying because all Apple devices, uh, cycle through a bunch of information in their broadcast and fo it's not a public spec, but it's a well known spec. People have reverse engineered it so you can look up the broadcast information. The problem is, and this is what going back to the beginning, Apple hides that information from you. That's why you're saying no services, they're just hiding it. James: [00:27:37] I just tapped on my iPad outside, which is very impressive because it's M a Y a ways away and it says battery service, 84% current time service. You're right. Here's read, notify, and then there's a device information. So it's, it's crazy. Like. All this data is all around us. Frank, the D it's around Frank: [00:27:56] us. In fact, I'm afraid for years, I've been talking about building this. I keep calling it a clock. It's not a clock, but it would be something you put on your wall that just shows you every device it knows about. And it's battery level. I just wanted a thing that said, here are all your devices in their current battery status. And one of these years I'm going to build it and it's going to be gorgeous and you should do it. I know, w will you, uh, go fund me? James: [00:28:20] I'm in, I'm in, I think that'd be really fun. I could see a board doing that and just scroll through it like an LCD display. I think it would be really, Frank: [00:28:26] Oh no. I was going to make it more beautiful. Cause I'm not going to put an LCD on my wall. That's so gauche. Uh, I'm totally going to do an easy paper, you know, nice diffuse surface on the wall so you can make it look good. Yeah. Yeah. James: [00:28:37] I like that. I like that. I mean, um, okay. So as Frank sets up as Indiegogo, um, we will continue on here, so, okay. So here's what I found out is. I was able to do what you just said. So I found all my Bluetooth devices and the first thing, here's the problem with the cadence sensor, by the way, Frank is that inside of it, when you are not pedaling, it is not powered. So. Yeah. Frank: [00:29:03] Okay. No, I guess that makes sense. Cause they're trying to save battery and all that stuff, but it just didn't occur to me. I just assumed there was an on, off switch, but okay. Fine. James: [00:29:11] Nope. So, so that is a problem. Number one for me, because Frank: [00:29:14] get pedal that's. Wow. That means during development, you have to keep pedaling where they go. How long does it take the time James: [00:29:20] out? Um, It turns off pretty quick, by the way. So it turns off and on very quick, because it's looking for something. So, however it's, it's in the, the board, the little board that's in there. It's it's whenever it detects motion, it, uh, turns on. And when it stops, it turns off, I think maybe it gives you a few seconds, but, um, yeah, that's not a lot of time. Frank: [00:29:41] This episode's already gone long, but I have to interject here too, because these boards are kind of awesome too. There. When you're programming. Um, these IOT devices usually have two modes of operation, low energy mode and big energy mode. And everyone does big energy mode. I was just looking at the source code for things you do, but, uh, or for the project that you were talking about earlier, There is a way to program this low energy version where it's just, it stays quiet all the time, but what it can do is scan the accelerometer from time to time. If it sees something, then it can power up the device and bring up the Bluetooth stack completely. So if you're ever building an IOT device, it's actually really worth looking into this stuff, sorry, side tangent, but I just couldn't help myself cause it's really cool tech. James: [00:30:28] No, you're good. I'm literally browsing the 32 page document on the specification here. So, um, it's very fascinating. And, and this is where the corporate sponsors and all this stuff come in, by the way on, this is a great doc. It's hard to find, but the XML file is even better because it tells you what it's going to do. Um, so once it's going, so it has three characteristics of this service, which is the cadence service. Okay. And. Uh, so these Frank: [00:30:53] are just data points, just so everyone's clear, they're they're silly names. I don't know where they got this name, characteristic. It's just a data point that you can subscribe to. And sometimes right too, it can be read or write or both James: [00:31:04] or notify. Yeah. It's really confusing because, and I'm really happy this XML file exists because you would have no idea without putting a bunch of booleans of what you're looking for. So. That's what I didn't understand, because I understand a service like, Hey, this is a broadcast service. Right. Okay. I get that. I'm connecting to it. It's going to broadcast off. But then I got really confused because you're right. I didn't know what a characteristic or a descriptor was. I'm like, what are you talking about? What, where's the data, right. I'm like, okay, I can look at the characteristics, but where is the data and how is this data stored? So when I was going through this specific service has four. Potential characteristics. They don't all have to be there by the way. Um, because some of them are mandatory and some of them are not mandatory. Um, and this one, I think they're not all mandatory. There's some of them are optional, like sensor location, like that doesn't matter left or right. But the one that I'm saying Frank: [00:32:00] one more time, when doing Bluetooth coding, you can't assume anything. Even if the spec says it's mandatory. Good luck. Yeah. You just got to handle the case where it's not. So James: [00:32:09] the one that I was looking for is this. Um, CSC, which is cycling speed, cadence measurement, and, and this one, the read is excluded. The right is excluded, but the thing that you need is notified. Frank: [00:32:23] Oh, interesting. So that means it's always streaming. You can't actually say, give me the value. What happens is that broadcast the message saying here's a new value deal with it. That's neat. That's neat. James: [00:32:38] And I was like, well, how am I going to test this? Well, this is a light blue application. It's called light blue. L I G H T blue. It's really cool. Um, you can create a virtual device. And they have, when you create one, a bunch of these known ones, which they have alert, blood pressure, cycling power, find me glucose, heart rate, running speed, and cadence. So these are all known specs. Frank: [00:33:02] Yeah. Wait, wait, wait, re rewind. W what's the name of this app and how did you find it and how much money do I have to give to whom? Because I've always wanted to create one of these virtual things. I didn't know if someone else had already done it. James: [00:33:13] It took me, uh, 30 minutes of Googling. Cause I was like, is it an emulator assembly? What is it? But it's called light blue, one word light. L I G H T blue app free for Macko S and free for Android and iPhone. Completely free. Frank: [00:33:32] Fantastic. Yeah. And it sounds like what they're doing is just going around and gathering up all the Bluetooth spec and letting you create your own virtual devices. And so can you just, um, like you choose what. CFC. I can't remember the word CSC RPM. Can you just say what RPM you want to broadcast, like in the app with your virtual device? I'm so excited for this. James: [00:33:55] So this good question. And that's where we're at right now. I just put a it's through this company called punch through technology. I don't know. They do a bunch of stuff. I Frank: [00:34:04] think you have one wheel in it. Can I like the one wheel? Um, James: [00:34:08] well it depends on what the one wheel is. Broadcasting. You can have blanks so you can do whatever you want. Okay. Frank: [00:34:13] So just for context, um, the one wheel is a proprietary set. So all of these services and characteristics, these are just documented ideas, but in the world, they're just byte streams. It's a set of bites and you're associating them with something. So when you're lucky you have a. Actual spec to work off of when you're unlucky in the case of one wheel, the manufacturer has no interest in publishing their data formats. So they hide all that and you have to reverse engineer. James: [00:34:40] Yeah. So that luckily enough for us in this case, we have all that data and it's really cool. So. It's really nice. Cause you basically create a device with a set of services and it knows based on the, I'm assuming what they do is they take these spec sheets and they know how to parse them and create things properly. That's my assumption. But yeah, Frank: [00:35:02] it's actually really easy because if you've built one of these Explorer apps, you're. Pretty much doing the exact same thing, just the mirror side of it. And I think if you've looked through your Arduino code, you'll see, it's actually pretty easy to make your own Bluetooth devices. So I hope people will think about not just the writing, the clients for these things, but making their own devices too. James: [00:35:24] Yeah. Yeah, I've been well that's the funny part is like I went through last night and the very first thing I did is I started to create a client. I was like, well, how do I generate? Maybe I'll fake one and I'll do a thing, but I was like getting too excited. So this light blue, you can do it on your phone or on your iPad. Um, or, I mean, sorry on your phone or on your desktop machine. So I have it here and what's really nice is that it gives you all the information. You can modify what it broadcasts. So, um, What you can do is you can set what the value will be, um, that is given off in the notify, but it's a hex value. So I don't really know exactly how that works. Like, um, what I can do is what I did to test it. And by the way, as I. I on my iPhone, I installed the light blue app. I created a sensor and then on my Mac, I said, connect to my phone and show me and, and, and register for notifications. Um, and I also built this into the app too, and it streams the data in real time, but it just gives me byte array data. And I don't know what that is because funnily enough, that data is not in the specifications. Frank: [00:36:31] Right. So it is actually kind of there. You just got to know how to read spec talk. Uh, so let's go back to, I think services are pretty easy to understand. They're just kind of directories lists of things that are there. Characteristics. I think the best way to understand them is they're just. A set of bytes, a fixed sized actually numbers set up bites. So it could be two bites. It could be 16. There there's an upper limit, 12 bites, 16 bites, something like that, but really just think about it as an array of bites. That's all a characteristic is then earlier you brought up. The additional term descriptor. Yeah. Yeah. Right. So a characteristic is broken up into multiple descriptors and the descriptors are what, tell you how to decode those bytes. You can. Yeah. So you can, Oh, sorry. Welcome to Bluetooth. These, um, you can almost think of the descriptor as a struct in C-sharp. It's your, here are the different fields that are going to be in this byte stream. Now, a lot of times it's very simple. One characteristic has one descriptor, meaning that characteristic is only producing one value, but you could have other ones where one characteristic could have 12 descriptors and it's, you know, one bite for everything. So you really have to pay attention to that. The tricky part again, is that. This is not a self-documenting protocol. This is not rest. So you have to have a spec or you have to reverse engineer those descriptor definitions. They should be in the spec. Uh, this is definitely one of the harder parts to figure out and the spec, and I'm actually a little bit surprised that this light blue app was forcing you to do the byte version, not the interpreted version, but it could simply be. They're implemented. I mean, part of me wonders if you click the wrong, James: [00:38:27] you can change it. So you can say, um, change it from hex to, um, octal binary or UTF eight string. Frank: [00:38:38] Nah. See, that's still kind of a raw thing. So what, uh, I'll give the one wheel, as an example here, it produces RPM. It tells you how many, how fast that wheel is spinning. And it does that with two bites being an unsigned. Integer 16 bit integer because the one wheel is never going to have an RPM above 65,000. You would die bad things would happen. So, so within the, the, the, the characteristic is two bytes, the way they have it set up, it has one descriptor that says the first two bites are used for an unsigned, big Indian little Indian. I forget, uh, probably big Indian in this case. Uh, 16 bit integer. It's that really detailed? How do I interpret these bites that you have to know in order to deal with these things? Uh, I, I, uh, the, um, I keep looking at the spec because I'm having the worst time. No, I don't see it. I think you're right. The specs. Not saying the exact encoding of that data. How annoying? James: [00:39:46] Yeah. Welcome to Frank: [00:39:47] my world. Probably it's probably an integer. It could be signed or unsigned. Try both. It could be big Indian. It could be little Indian. Try both and see which ones produce the right numbers. James: [00:39:58] Well, so this thing gives you, when you read data, like you were saying off of the Bluetooth and I get the characteristic, I get back a byte array, right. So I can say. So here's the fun part too, by the way, is as how I'm figuring this out. As I say, I say, Hey, go find all the devices in, find the device that is broadcasting a service that matches the service that's here. And like you said, that also could be error prone. Because it could lie. Um, but I'm going to, I'm going to assume that everybody is a good citizen here and that all of these really cheap devices from China are going to work. Great. Um, Frank: [00:40:37] that'd be fine. James: [00:40:38] So, so once I have the service, I connect to the service and I say, Um, Hey, I would like to get all of your characteristics. I go through all the characteristics and I say, Hey, find the characteristic that is notify because I want to subscribe to that one. And then I subscribe for updates there and every time it, so now it's actually what, so how does that even work? Right. So I'm connected to the device I'm connected to the service and then I'm. Am I asking the Bluetooth device, or I'm asking my phone at this point to like, figure out how to notify, get my asking core Bluetooth at this point. Or is there, is there a two-way communication here, Frank? That's what I think is I'm calm. I'm a little confused about, Frank: [00:41:21] it's definitely a two way communication and the thing that's happening is that notify that's the magic trick happening here. And that's just preventing you from having to write a loop that would say, you know, every. One second asked the device for its current value. Instead, it's going to force that value onto you. So there is a read-write connection happening between these two devices. Now in your, when you're looking for the characteristic, I, I. You don't want to look for just notify once you want to find the characteristic by its ID, by it's funny, you, you ID things. So you always want to use those, those identifiers for finding your characteristics, because there could be multiple characteristics with notify on them and they can add characteristics just because it's not listed here in the spec. Doesn't mean it can't be there. So. You gotta be pretty careful when you're subscribing to things that you actually look up their ID and yeah, this is what I was saying about, it's a multi-part thing. You have to connect to the device, subscribed to the service, subscribed to the characteristic. And then in the case of notify. Subscribe to the notifications, any one of those can fail at any time. And so you got to handle all those error paths. In theory, it's all very simple connect, connect, connect, connect, subscribe in practice. You're going to see a lot of crashes. James: [00:42:45] This. Yeah, it makes sense to me. That makes sense. Okay. So, Frank: [00:42:48] so the biggest trick then is once you've subscribed to that notification, you get your byte array. Now you have to make sense of that bite or re and C-sharp what you would do is create, um, a binary reader or there's a bit converter class, or there's the span class. You can use the span class for just reading our arbitrary data. So you have a lot of options for ways to decode that there's the marshaling. Classes that can convert between binary data and structures, lots of options. Um, they're all pretty equivalent. It doesn't really matter which technique you use. Okay. James: [00:43:23] Okay. All right. I'm seeing bike converter too. I'm looking in the spec and I, and I, and the P big PDF. And in one place, it says you int 32. Beautiful. Frank: [00:43:34] There it is. So you would create now, do they say big Indian or little Indian? It's probably big Indian. James: [00:43:42] It's all cap you into 32. Frank: [00:43:45] It's somewhere in that million page spec. There's they're going to tell you, uh, you're you're just going to have to try both. It's probably going to be big Indian. Um, because Bluetooth, this is an, an old networking thing, all network data's transmitted big Indian. And so whenever you're doing low-level networking stuff, you have to use this, um, these standard routines it's called network to host, host to network to make sure that you're always converting between the right Indian-ness and your app. I believe that the. Binary reader. You can tell it what Indianness to use, otherwise breakout your breakout, any old book, and it'll show you the bit twiddling to do to switch them James: [00:44:27] around. Yeah, I, um, I'm not positive. It says writing. It says you can write to it. So th I think one spec is for if you're a device creator and the other XML spec is if you're a device client. So I think that's why it's confusing. So I'm assuming here where it says, Hey, if you're the device creator, you need to write X zero zero zero zero zero zero zero zero. That's what it says Frank: [00:44:49] at all times. I hope not all the time. James: [00:44:52] Campbell writing a parameter of X, zero X with eight zeros will set the wheel rotations value to zero within the sensor. Frank: [00:45:00] What a beautiful example. They said that zero equals zero. Like they couldn't, if they'd given you the number 42, any, any other number, literally any other number, the number one, it would have told you if it's big Indian or little Indian, but with the value zero, that tells you absolutely nothing. Thank you, spec. James: [00:45:16] Yeah. So, so, okay. So let me, let me tell you about this because what's fun about all of this cause. Yeah, as we talk through this, you can, you can tell that that Bluetooth is like this beautiful disaster. It's kind of like Andrew, it's beautiful. Beautiful. Um, but here's what I did, Frank is like last night. I started coding around 1130 at night. Frank: [00:45:38] Excellent time to start a project for you. I couldn't, James: [00:45:42] I was sucked until two in the morning because I would get the devices and then I would like, see the thing. And then I found this light blue app, and then I saw this other thing and every single one was like this magical Oh my gosh moment. Right. And yeah, it was, it was crazy. And then. This morning, so well, here's what, here's what actually really happened. Funnily enough, as I was testing my application on my old iPhone six. Okay. Old, old, old iPhone six. And Frank: [00:46:10] I had Bluetooth for though, because what you got to make sure if you go too far back, they didn't have Bluetooth for basically James: [00:46:16] Ellie. Well, so here's the thing is last night. At two in the morning I get on my shoes and what do I do, Frank? I get onto my bike and I'm just peddling, peddling, peddling, and nothing shows up, Frank: [00:46:31] but I'm pumped. So were you trying on the virtual device first or did you go straight to it? Okay, so you had it working with the virtual device? James: [00:46:41] Yes. And the virtual devices, like this is an old Mac book pro and it's using the, the main Bluetooth. So I'm assuming. These devices are from the same era. And technically this cadence can work on normal, Bluetooth and Ellie. So I'm not sure what Bluetooth is in the iPhone six, but today. At lunch. I was like, I'm going to put it on my brand new iPhone se right. And guess what shows up Frank? Immediately the sensor. Frank: [00:47:11] Oh, okay. Okay. I love it. I am a little bit disturbed, honestly, that it, uh, because like the standard hasn't changed in a very long time. It's an old standard. So old text should work just fine. I'm curious if you are running into the connection issue. Is something else connected to it, a little race condition there, but that's great news. Okay. So with the newest, the most expensive phone, you can connect to your little device. Uh, and, and that's what I got the screenshot from that you sent me then. James: [00:47:40] Yes, sir. Yeah. You got a little screenshot and he was out putting a bunch of random data and boom. It was good to go and because I hadn't converted it yet. I was converting into a string, which obviously is not correct in any form. Frank: [00:47:53] No. Yeah. Binary data. So binary reader, bit converter Marshall. One of those will work for you. Span, span. It's the cool way to do these memory manipulations these days? Uh, that's exciting. I mean, like you said, there is a dopamine hit along the path because. It is such a multi-vendor path. You have to do so many things to get there. That didn't, that must've felt good, but I'd tell you what it's going to feel so much better when you put a little gauge in this app and you're actually see some numbers coming up, because that is very, very satisfying. James: [00:48:27] I am. And I'm also going to try the iPhone. You know, like use that Bluetooth Ali was introduced in four dot. Oh, so, and that was in the iPhone four ass. So it should definitely be there. You know, the iPhone second generation has five dot O so obviously it's newer, but yeah, I'm, I'm fascinated. I guess here's a good question for you. Is, let's say that my device has Bluetooth four dot two. Does the version of Bluetooth of the little cadence sensor matter? Like what if that's broadcasting for that too? Can afford that out of, I Frank: [00:49:01] see it, uh, I'll be honest. I don't know the particulars of, especially the dot versions, but I will say that they designed this protocol to be backwards compatible. So I doubt it. If it didn't, I would assume it's actually more of a bug on the device or something like that. They it's an old spec, you know, that they understand that changing things. Isn't that smart. So, um, yeah, all like, uh, five, four, not two, four. They should all talk to each other. Just fine. Should, should scare quotes. James: [00:49:34] So. Um, I'm pretty set. I'm very happy Frank: [00:49:38] new app. No, when's it out? James: [00:49:40] Well, so my cadence, which would be the name of the application, because you can put mine for you. Frank: [00:49:45] My stream, Tyler, you know, whenever I have to bring up my stream timer, I use spotlight. I put the letter, I type my, and I just wait one beat for it to come up. James: [00:49:55] It's the VB of Frank: [00:49:56] apps. It is. I do like it for that. My project one, you should just call it my project too. James: [00:50:04] Uh, well, I'm going to definitely try to get it out by, you know, the end of the year. I need to obviously test it a little bit more and I'm going to be very fascinated to see if I can go and take my iPhone six and maybe it'll work now. Or if it is really just something with the device, which totally could be possible, I'll be fascinated. But you know, it had me thinking differently, which was. I don't want this device. And I would really like to IOT this poppy because really what's my eyes like really I'm using this app to just use the tiniest bit of Bluetooth to parse a number. And Frank, there are $15 devices instead of 400 or $500 devices that can do this and have an LCD screen that can output numbers. And what are those Frank SB? Frank: [00:50:47] 30 twos. James: [00:50:49] Your favorite SB 32 that literally emailed you and said, SB 32 projects. And I figured with a click bait title like that, you would read it immediately. And you did not, by the way, I'm very excited that you did not. Um, does it surprise you today? Frank: [00:51:05] It's true. It's true. I was excited. I cued it up. I, you know, not many interesting things happen these days, so I got, gotta pay some out, you know, it's better that way. Well, I'm going to correct you. Of course. This is my way of getting off that subject. Um, It's an old led screen. Very nice. I love them. I know. I think this is the fallout of old mobile phones used to have or led screens. And now they don't. So there was just a lot of OLED screens. And so now everyone puts them on their projects, but yeah, for a, just a couple of bucks, you can get one of these things. There's actually a lot of them. For form factors to choose from. And we were doing that earlier. Like what features do you want on these boards? All without spending too much money kind of thing. Uh, so you opted for one that has a battery connector. So I assume you're going to try to make a mobile device. So IOT devices, you have to decide it's going to be plugged into the wall or not. And you decided battery. James: [00:52:01] Yeah. So here's my thought on this is. Since the Apple fitness plus doesn't show you the cadence or anything in the app. It would be very nice to have this tiny little itty-bitty device that I can just slap on there. Right. Just like slap it on the bike. It's really small compared to like, I got to buy an attachment for the phone, put the phone on there, connect the thing. Like it would be really cool if I just hit a button turn on that start peddling and it shows up like, that's really what I want it to do. So. I wanted to go with this. And the reason I pick this board is because on that hacker news article, this gentlemen, Zach snow's Zack on, on GitHub posted this project and I was intrigued by it. I was like, this is so cool. And he linked specifically to this SB 32 frog maker focus. That's why I didn't, I didn't do any Frank: [00:52:47] research. Well, th yeah, that can be smart because if you don't want to change the code, you don't have to. So that's nice. Uh, there shouldn't be too many differences. So these boards have pretty well standardized these days. Usually it runs into which pins you're using for what purpose, but in your case, you're doing a, mostly a wireless setup. So I don't even think you would run into those problems too much, but yeah, when in doubt, get the one referenced in the blotter. Blog article. That's fine. I don't think you can really go wrong with any of these, you know, it's just occurring to me that this whole project is exactly what I built for the one wheel. I built a speedometer that's snapped onto the one wheel that talked over Bluetooth and had its own internal battery and an all that screen go figure. Um, I had a cool feature though, because that was in the before times when I had friends and we did things together, it would actually show my friends one wheel to Oh, Because Bluetooth could be promiscuous. So what didn't just show me, my data would show me their data too. And so I always kind of loved it for that too. So if you ever get a second bike, think about, uh, over-engineering this thing to just show to two gauges instead of just James: [00:53:55] one, that'd be kinda cool. Um, in fact, you could do like a HUD that goes up and. Yeah. Like if you had multiple people spinning at the same time, you could do like a competition. Right. Cool. Frank: [00:54:05] Ah, all right. Now we're getting somewhere in the after times if we're allowed group activities ever again. James: [00:54:11] Yeah, yeah. If we're allowed. Yeah. So this is going to be my, I have multiple holiday hack projects going on, and that's what I'm saying, because we are truly going into holiday hack mode maybe next week. We'll talk about your holiday hacks, but this entire thing. Had me just on this Bluetooth craze. And I swear we did an episode a long time ago when you were all into the Bluetooth. Um, and I think I now understand Bluetooth a little bit, and again, it gave me that giddy feeling and it's, it is crazy that any of it works, I'm amazed. Frank: [00:54:39] Yeah. Uh, I just love wireless and it's one of the easiest ways for a device that I love the iPhone to talk to devices that I love robots and IOT things. So it's just, you know, I, I have to use it in some ways. There's not other great ways to transmit data with an iPhone or then wifi and things like that. But at the same time, And it's so error prone. I'm just, just wait until you try to make this thing rock solid. Anyway, it's so satisfying when it does work and all that jazz and it I'm excited that you're excited about an IOT project. James: [00:55:16] Yeah. This one really has me jazz because while I'm excited to, you know, build the application, what's cool about this is I just ordered it for $12 free shipping on make or focus. And that's crazy to me. And I could see. If we have this rock solid, like you could sell these things, you can make a case, 3d print a case, and you could sell these puppies, you know, and it would be really cool. I just, I just think it would be really cool. I think it's amazing. And because I've seen other cadence readers out there and they're usually made for bikes and they have GPS and all this stuff, and they're like $200. Like, I don't want that. I just want this little tiny little thing that goes on there. So. Um, Frank: [00:55:57] now GPS sensors, those are still expensive. Those are still somehow like 40, 50 bucks. You know, usually in the DIY market, you can get things for super cheap, like those the, Oh, that screen on the device that you bought, that's a one-hour screen. Yeah, it's ridiculous how commoditization has worked. But for some reason that GPS is so expensive. I don't know. I guess it's doing a lot or something like that, but yeah, I, I, I I'm, you know, I'm going to do my own Indiegogo, but feel free to start your own. Also we can have competing James: [00:56:29] products, Bluetooth just non-stop, uh, Frank: [00:56:33] I mean, truthfully, I wish I had a career in hardware, gadgets like that. It's just, hardware is a tough business to be in, you know, software. I write an app and then I get to sell it for multiple years. All I have to do is maintain it and make sure it doesn't crash hardware. That's like actual physical labor and stuff. I just haven't gotten there. James: [00:56:54] Yeah. Yeah. Yeah. Hardware is a, is a hard game. I will say that. And that's why I'm going to start with the phone at first. And I hope that by the time my SB 32 comes, I'll finish the app and what a great holiday season that will be. So Frank: [00:57:09] the watch app version too, right? We need to watch a Wes version. James: [00:57:13] I thought that would be actually kind of cool too, is that if you already have all the data on your phone, you can just put it on your watch and even better. You could probably make a custom. What are those things complication and then, but yeah, that'd be crazy, Frank: [00:57:26] right? Cause the, the old problem was the Washington always have Bluetooth in the past. So you would have to transmit data from the phone to the watch and it was all kind of janky and rarely ever worked. But with a modern watches, you can actually connect directly with the Bluetooth. That's totally an option. James: [00:57:42] Yeah. I mean, that's it. There we go. Our final quest. Now the one thing that one hour of Frank: [00:57:48] Bluetooth. James: [00:57:49] Oh yeah. The one thing I really wish that Apple did for iPad iOS, at least even iOS is I wish that they allowed you to do a. Like small pop over picture and picture bubble, like on Android, you could hack it. So you could have a little bubble view that pops up because it would be cool is like someone starts the application that my, my application turns into a bubble overlay, but that's not possible. Frank: [00:58:13] No, we have widgets and, uh, okay. Getting, getting nerdy for a second, the way the. Pop out window thing works. Um, picture and picture thing works. You have to provide, uh, a video stream, but that video stream can come from anywhere. So technically you could render your UI into a video stream to put it into that thing. Just putting it out there, James, it's not impossible. I'm guessing a hundred lines of code. You can put a number in a little picture in picture window. It's totally doable. James: [00:58:40] I may just do that. We will see, we Frank: [00:58:44] will see five episodes. Me trying to explain, get through that idea. James: [00:58:49] Yeah. Oh my goodness. Uh, Frank: [00:58:52] Oh, that was fun. I'm so excited. I liked that. It's a holiday hack. Uh, I forgot it's holidays. Yeah, it's it came up James: [00:59:00] on us. It's the perfect time. Really? To be honest with you to be holiday hacking and learning about Bluetooth. So while one, we did spend one hour on Bluetooth. Um, Oh my goodness. Frank, thank you for entertaining me on this. This is crazy. Frank: [00:59:14] Yeah, and I can't wait to see screenshot too. I have high expectations. I want to see some gauges. James: [00:59:19] Um, yeah, that's very true. A histogram. That's what I want to do next actually is just anyways. All right. Well, that's going to do for this week's merge conflict, our Bluetooth adventure. So until next time, I'm James Montana Magno. Frank: [00:59:31] And I'm Frank Krueger. Thanks for James: [00:59:33] listening.