Jump to content

super_teabag

Member
  • Posts

    186
  • Joined

  • Last visited

Awards

This user doesn't have any awards

3 Followers

Profile Information

  • Member title
    Junior Member

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

super_teabag's Achievements

  1. Hey, so I've been searching for the best work / play monitor that's either Ultra Wide or 4k+ for programming, blender, UE5 and gaming. These are the main things I do for work and I need something that will not burn in. I've noticed a trend on the higher end of monitors. Everything is going OLED and I'm really not a fan cuz I use my monitor for a lot of static content everyday. My price range is below 1500 USD and so far my top pick is the slightly older but comprable `PG32UQXR` from Asus. So, if there's something out there that's slightly newer and comparable in features to this monitor let me know. Or just share your opinion lol
  2. Is there any software for setting up a server watch windows using a raspberry PI 4? Not too familiar with the space and curious if anyone has done anything like this. If you're curious what my site is built with here's a link. https://github.com/BensonBen/solid-octo-couscous
  3. Just signed an offer letter for a senior software engineer position with Herman Miller :D. Wanted to say thanks to the LTT community and Linus cuz I've been a subscriber of the channel since... the times he reviewed random toys at NCIX. Just wanted to make this post to show that you guys make a difference .
  4. Hey all! This isn't a "hey please help I've fallen and can't get up" kind of post, but rather one that's imho dense with computer science topics. My hope is that it will genuinely peek someone's interest in computer science, programming, reverse engineering and genuinely inspire people. Any who, recently got this exercise bike with Bluetooth functionality, right. now I didn't want to pay oodles of money a month for some fitness app. So, I was like "I can write my own and it'll work on all my devices"... at least that's the goal. Starting out I had to connect to the bike's Bluetooth with the caveat being I wanted to do this using a web browser then leverage PWAs (progressive web apps) to install on any of my devices with this very basic exercise app. Learned there's an experimental standard for Bluetooth available on navigator.bluetooth Connecting to the bike was relatively easy. I used a Bluetooth discovery app on my phone to figure out what "services" were available on the bike's Bluetooth server. It got a little tricky as the data I would get back from the Bluetooth device was 88 bits, or 11 bytes. With no indication of endianess, and no headers were on the data to see where things may be in this arbitrary bundle of bites. I thereby devised a plan to log the data and see where it changed and using the Bluetooth and with the assistance of Bluetooth discovery apps I learned roughly what the shape of the data would be In the highlighted area, I knew that wheel rev, last crank even time, last wheel event time, and crank revolutions would be 16 bit unsigned numbers. Why? Because as I pedaled the bike what my app would read was "rolling over" a concept that instead of continuing to count past 16 bits of information. The bike instead resets to 0 Now, where in that 88 bit payload were these 16 bit unsigned numbers? Well, I did some logging of the information which you can see from the included text file of my log. Using that I deduced where about 4 of these numbers were in the payload as they also lined up with my Bluetooth sniffing application told me. The following is what gives me the correct data readout from my bike on the web! Now, I have to do some math to calculate RPM and KPH or MPH. private readonly parseCadenceWheelSpeedWheelTime = (event: { target: { value: DataView } }) => { const { value: dataView } = event?.target; const littleEndian = true; // wheel revolutions in unsigned 16 bit numbers. this.wheelRevolutions$.next(dataView.getUint32(1, littleEndian)); // last wheel event time in unsigned 16 bit numbers. this.lastWheelEventTime$.next(dataView.getUint16(5, littleEndian)); // amount of times the wheel went around in unsigned 16 bit numbers. this.crankRevolutions$.next(dataView.getUint16(7, littleEndian)); // last crank event time in unsigned 16 bit numbers. this.lastCrankEventTime$.next(dataView.getUint16(9, littleEndian)); }; bluetooth-logging.txt
  5. @AnotherMax It's cool duder. yeah, so... that's my last straw that I'm gonna try. There's a few portions of the data MSB (most significant bit) that keeps changing when changing what device it's paired too. Otherwise, I'm 90% certain that bytes 0-2 and 2-4 are for timing cuz they're unsigned 16 bit integers and they line up. If I don't have to brute force it and can ask. That's what I'm doing rn cuz work smarter not harder
  6. @AnotherMaxthese are a good starting point, but I found some more resources that were more useful that are super buried on the Bluetooth documentation's website. I'll post here just in case you're curious. Bluetooth Web Tutorial from the horses mouth (it's still dated) Second, the "characteristics" in Bluetooth terminology are properties in a grouping. that grouping is called a "service" (this isn't me trying to be an asshole about terms). So, the "value" is typed as DataView since the standard has been updated and bugs have been fixed in Chrome / Edge. Again, making the "value" property as a DataView. You'll have to checkout mozilla's documentation on that if you'd like. Effectively I think I'm SOL cuz it's up to the manufacturer of the device to adhere to the standard for say "heart rate" services. then provide a way to parse the data. I've shot nautilus (parent company) a message about what I'm dealing with. Hopefully, they'll give me a data sheet with some more information. I can parse some of the values from the HEX information provided, but that's just it. I don't know if that's 100% where the data is.
  7. Hello! This may be a bit long winded, but bare with me. TLDR: Looking for ways of parsing binary response from a Bluetooth device. So, I've got a crazy idea (maybe) in that I've been trying to develop a data logging application and fitness tracker for my new IC4 bike. The difference between this app and others available on the market is that it works via the experimental Bluetooth browser standard. Described in more detail here. Web Bluetooth API - Web APIs | MDN (mozilla.org). Getting to the point. I've paired to my Bluetooth connection (server). Parsed through the services available and exposed by using a Bluetooth discovery application on my phone. Again, pairing to the bike. I'm able to see what I can retrieve, notify, read, write etc. But I don't know how to translate that on a web browser? Why might that be? Well, since the standard is relatively new. When I subscribe to notifications from the bike via Bluetooth. On the characteristic CSC Measurement I get a little endian binary 88 bit response that I can't seem to figure out where the data indicated above lies. It's not auto-magical like the above screenshot on my phone would indicate. For example it will look something like this when subscribing to notifications on the WEB for CSC Measurement. hex: 0x593400e04890 binary: 11001011011010000000000111000000100000011100000 What I do know so far is that the times in milliseconds reported are unsigned 16 bit integers. That lets me guess and check where in the sequence those measurements may be in the response. However rather than guessing and checking I figured I'd just ask if there's an easier way to translate the data received. So, I can use it in my web application. Figured it my android device can parse the Bluetooth notifications then so can I. Also, I've already emailed the manufacturer if there's a data sheet describing the notifications. import { Injectable } from '@angular/core'; import { SchwinIc4BluetoothCharacteristics, SchwinIc4BluetoothServices } from '@solid-octo-couscous/model'; import { BaseBluetoothConnectionService } from './base-bluetooth-connection.service'; declare const navigator: Navigator; @Injectable() export class SchwinIc4BluetoothConnectionService extends BaseBluetoothConnectionService { constructor() { super( [{ name: 'IC Bike' }], [ SchwinIc4BluetoothServices.cyclingSpeedAndCadence, SchwinIc4BluetoothServices.deviceInformation, SchwinIc4BluetoothServices.fitnessMachine, SchwinIc4BluetoothServices.genericAccess, SchwinIc4BluetoothServices.heartRate, ] ); } public async connectToCyclingSpeedAndCadenceService(): Promise<void> { const primaryBluetoothServices = await this.connectToSchwinBike(); const cyclingSpeedCadenceService = primaryBluetoothServices?.find( service => service.uuid === SchwinIc4BluetoothServices.cyclingSpeedAndCadenceUUID ); const cscMeasurementChararacteristic: | BluetoothRemoteGATTCharacteristic | undefined = await cyclingSpeedCadenceService?.getCharacteristic( // CSC Measurement feature. csc = cycling speed cadence. SchwinIc4BluetoothCharacteristics.cscMeasurement ); const result: | BluetoothRemoteGATTCharacteristic | undefined = await cscMeasurementChararacteristic?.startNotifications(); result?.addEventListener('characteristicvaluechanged', this.parseCadenceWheelSpeedWheelTime); } private readonly connectToSchwinBike = async (): Promise<BluetoothRemoteGATTService[]> => { // TODO: add a check in here to notify the user if they're using a non-supported browser. const userSelectedSchwinIc4Bike: BluetoothDevice = await navigator.bluetooth.requestDevice( this.bluetoothDeviceSearchOptions ); this.bluetoothDevice$.next(userSelectedSchwinIc4Bike); const serverConnection: | BluetoothRemoteGATTServer | undefined = await userSelectedSchwinIc4Bike?.gatt?.connect(); this.bluetoothServer$.next(serverConnection); return (await serverConnection?.getPrimaryServices()) ?? []; }; /** * !!!! this portion is where I'm having trouble after i'm connected and receiving responses. !!!!! **/ private readonly parseCadenceWheelSpeedWheelTime = event => { // here is where the value of the notification would be something like // 0x593400e04890 // this buffer is embedded in a DataView object. const { value } = event?.target; const dataView = value as DataView; console.log(`some real data: ${dataView.getUint16(0, true)}`); console.log(`some other real data: ${dataView.getUint16(2, true)}`); }; }
  8. From the reviews I've read if you find a dead pixel they definitely replace the panel / swap it out for a not broken unit.
  9. Hey all, so it's time for me to part ways with my budget corsair case I've had since 2013. I simply want something professional looking, perhaps a side panel, noise dampening (I wear noise cancelling headphones so this isn't to high on my list). So far I've liked the Corsair 678C link Trying to also go for a white, blue aesthetic as I have an Alienware AW3420DW Ultrawide monitor. My system isn't too crazy and I don't have a ton of hard drives, or water cooling. Any budget
  10. It means that your motherboard vendor didn't test that memory kit to have no issues with your processor. Don't worry though, just because it's not on that qualified vendor list doesn't mean that your memory, motherboard, and cpu won't ever play nicely together. It simply means that you yourself may need to get stable memory. This isn't to say that this is the solution, but in my light research on the the Kernel 41 error you're experiencing yielded that this is most likely a hardware issue. Also, Kernel generally referencing your operating systems underlying low level code. Low level you say "super teabag", well simply put this is the code, bytecode, and instructions that interact with your hardware directly. TLDR: I suggest you develop a plan to make sure your memory is stable. I'll outline some steps that should aid you. 1) Create a bootable media (USB, CD) whatever you would like of Memtest86+ availible here: Memtest86+ and do your own research on how to run this. I'd run the test when you boot into Memtest86+. If you fail during this test, or you start to get errors which it will indicate to you. Then you've probably found your problem and you can go about a solution Solution A. Get a compable memory kit off of the QVL your motherboard supports. Solution B. Lookup, how to use a program called "DRAM calculator" on youtube. And use the "calculate safe" option when using that program. This will require you to manually set your memory timings and requires some research, but it should give you stable memory. If you choose this option. I'd be happy to outline more steps for you to take as this can get pretty involved and I feel qualified to help you. My reasoning for this is that typically that CPU you have is notorious for having memory support issues and lines up with the Windows logs of it being a hardware issue.
  11. Honestly, I'd not go out to eat and just get the Alienware AW2521HF. If IPS, FPS, and G-Sync are your main criteria. Alienware (dell) seem to have very good quality assurance people working for them. Generally their Panels (sourced from LG) don't have as bad of backlight bleed or issues in general. In my opinion, getting one good thing that suits all your needs and that you keep is better than flip flopping monitors all the time. Because you end buying / selling this at a net loss if you switch monitors all the time. Bonus: this particular panel has a 240hz refresh rate. The bad: it's slightly outside of your budget at $385 (USD); however, I'm sure you could be a shrewd negotiator and get them (dell.com) to price match another website. That way you get good shipping. Happy Hunting! Edit: whoops i'm stupid and didn't notice that LG monitor is a 1440p panel. another edit: LG some killer products that don't like god awful. Going with anything LG would disappoint you IMHO
  12. perhaps checking if the memory is on the QVL?
  13. Not sure, the github page doesn't immediately make a mention of it. Stating "Inspired by the Windows 95 era PowerToys project, this reboot provides power users with ways to squeeze more efficiency out of the Windows 10 shell and customize it for individual workflows."
×