npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

gan-web-bluetooth

v3.0.2

Published

Library for interaction with GAN Smart Timers and GAN Smart Cubes using Web Bluetooth API

Downloads

180

Readme

Use of GAN Smart Timers & Smart Cubes via Web Bluetooth API

This library is designed for easy interaction with GAN Smart Timers and Smart Cubes on the platforms that support Web Bluetooth API.

Nature of the GAN Smart Timer and Smart Cubes is event-driven, so this library is depends on RxJS, and library API provide Observable where you can subscribe for events.

Installation

Package gan-web-bluetooth is available in the npm registry:

npm version

$ npm install gan-web-bluetooth

GAN Smart Timers

Supported GAN timer devices:

  • GAN Smart Timer
  • GAN Halo Smart Timer

Sample application how to use this library with GAN Smart Timer can be found here:

Sample TypeScript code:

import { connectGanTimer, GanTimerState } from 'gan-web-bluetooth';

var conn = await connectGanTimer();

conn.events$.subscribe((timerEvent) => {
    switch (timerEvent.state) {
        case GanTimerState.RUNNING:
            console.log('Timer is started');
            break;
        case GanTimerState.STOPPED:
            console.log(`Timer is stopped, recorded time = ${timerEvent.recordedTime}`);
            break;
        default:
            console.log(`Timer changed state to ${GanTimerState[timerEvent.state]}`);
    }
});

You can read last times stored in the timer memory:

Please note that you should not use getRecordedTimes() in polling fashion to get currently displayed time. Timer and its bluetooth protocol does not designed for that.

var recTimes = await conn.getRecordedTimes();
console.log(`Time on display = ${recTimes.displayTime}`);
recTimes.previousTimes.forEach((pt, i) => console.log(`Previous time ${i} = ${pt}`));

Possible timer states and their description:

State | Description -|- IDLE | Timer is reset and idle HANDS_ON | Hands are placed on the timer HANDS_OFF | Hands removed from the timer before grace delay expired GET_SET | Grace delay is expired and timer is ready to start RUNNING | Timer is running STOPPED | Timer is stopped, this event includes recorded time FINISHED | Move to this state immediately after STOPPED DISCONNECT | Fired when timer is disconnected from bluetooth

Timer state diagram:

stateDiagram-v2
    direction LR
    IDLE --> HANDS_ON
    HANDS_ON --> HANDS_OFF
    HANDS_OFF --> HANDS_ON
    HANDS_ON --> GET_SET
    GET_SET --> RUNNING
    RUNNING --> STOPPED
    STOPPED --> FINISHED
    FINISHED --> IDLE

GAN Smart Cubes

Supported Smart Cube devices:

  • GAN Gen2 protocol smart cubes:
    • GAN Mini ui FreePlay
    • GAN12 ui FreePlay
    • GAN12 ui
    • GAN356 i Carry S
    • GAN356 i Carry
    • GAN356 i 3
    • Monster Go 3Ai
  • MoYu AI 2023 (this cube uses GAN Gen2 protocol)
  • GAN Gen3 protocol smart cubes:
    • GAN356 i Carry 2
  • GAN Gen4 protocol smart cubes:
    • GAN12 ui Maglev
    • GAN14 ui FreePlay

Sample application how to use this library with GAN Smart Cubes can be found here:

Sample TypeScript code:

import { connectGanCube } from 'gan-web-bluetooth';

var conn = await connectGanCube();

conn.events$.subscribe((event) => {
    if (event.type == "FACELETS") {
        console.log("Cube facelets state", event.facelets);
    } else if (event.type == "MOVE") {
        console.log("Cube move", event.move);
    }
});

await conn.sendCubeCommand({ type: "REQUEST_FACELETS" });

Since internal clock of the most GAN Smart Cubes is not ideally calibrated, they typically introduce noticeable time skew with host device clock. Best practice here is to record timestamps of move events during solve using both clocks - host device and cube. Then apply linear regression algorithm to fit cube timestamp values and get fairly measured elapsed time. This approach is invented and firstly implemented by Chen Shuang in the csTimer. This library also contains cubeTimestampLinearFit() function to accomplish such procedure. You can look into the mentioned sample application code for details, and this Jupyter notebook for visualisation of such approach.