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

grbl-interpreter

v1.0.6

Published

Utility to easily communicate with a device running GRBL firmware

Downloads

24

Readme

GRBL Interpreter

NPM badge

Inkscape-parser banner

GRBL is an open source firmware for CNC machines, designed around the Atmega328p (i.e. Arduino Uno and Nano, mainly).

grbl-interpreter is a Typescript-first library to send correctly formatted GRBL messages, and interpret GRBL responses. All responses and commands are fully typed! Benefits:

  • No more fumbling around with string formatting and parsing
  • Enjoy autocomplete when sending and receiving messages to/from GRBL

Check out these page for the official documentation on GRBL messages:

  • GRBL responses (what GRBL sends): https://github.com/gnea/grbl/wiki/Grbl-v1.1-Interface
  • GRBL commands (what GRBL receives): https://github.com/gnea/grbl/wiki/Grbl-v1.1-Commands

Why use this library?

grbl-interpreter makes life easy for you.

Normally, if you want to get the current position from GRBL, you have to deal with a message such as this:

<Idle|MPos:0.000,0.000,0.000|FS:0,0|WCO:0.000,0.000,0.000>

With this library, you can simple call parseResponse(grbl_message_string) to extract the appropriate data:

{
    type: "status",
    machine_state: "Idle",
    machine_position: { x: 0, y: 0, z: 0 },
    feed: 0,
    speed: 0,
    work_coordinate_offset: { x: 0, y: 0, z: 0 },
}

Sending messages is a similar story. Normally, if you want to tell GRBL to home, you have to send a specific string ($H). If you want to jog the machine, you have to piece together a jog message like $J=X10.0 Y-1.5 F100. You have to know the exact formatting that GRBL expects. As you can imagine, this is tiresome and error-prone.

Instead, you can call formatCommand("run_homing_cycle") and you will get "$H\n". As a bonus, you get full autocomplete while typing the command.

For commands that take some parameters (like jogging), you can instead pass an object like this:

const command = formatCommand({
    command: "jog",
    feedrate: 400,
    gcode: "G91",
    X: 10,
    Y: 10,
})

console.log(command)
// Prints: "$J=G91 X10 Y10 F400\n"

You don't have to guess which parameters to pass, because Typescript tells you once you have entered the command value (the way this works is with discriminated unions).

Additionally, some commands (realtime commands), do not require a line feed or carriage return after them. You don't have to worry about this because formatCommand() adds carriage returns automatically if applicable.

How to use

Parse a GRBL response message:

import { parseResponse } from "grbl-interpreter"

console.log(parseResponse("error:5"))
/* Prints:
{
    type: "error",
    code: 5,
    description: "Homing cycle is not enabled via settings."
}
*/

Format a command to send to GRBL:

import { formatCommand } from "grbl-interpreter"

console.log(formatCommand({
    command: "jog",
    feedrate: 400,
    gcode: "G91",
    X: 10,
    Y: 10,
}))
// Prints: "$J=G91 X10 Y10 F400\n"

FAQ

Is this library standalone? Can I just use it to communicate with a microcontroller?

No, this library does not actually send anything (you would want to pair it with a NodeJS serial library like serialport). It's just a string parser and formatter that handles the conversion from GRBL messages (raw strings) into data that's more useful. This library is meant for folks who are writing their own G-Code senders.

Is this like Universal Gcode Sender or CNCjs?

No, see the answer above.

Is this compatible with grblHAL/FluidNC/[insert your GRBL spinoff here]?

As of now, this library only implements the official GRBL specification. This means that any functionality added by these forks of GRBL is not supported. However, note that the forks tend to be backward-compatible with GRBL, so most of the support is there anyway.

Docs

formatCommand(string | object): string | number

formatCommand returns a string or a number. The numbers are used for GRBL's realtime commands: for example, to soft reset GRBL, you have to send 0x18 over serial (hexadecimal 18 = decimal 24).

These are the possible string values:

get_settings
get_gcode_parameters
get_gcode_parser_state
get_build_info
get_startup_blocks
check_gcode_mode
kill_alarm_lock
run_homing_cycle
restore_settings
erase_wco
clear_eeprom
sleep
status
cycle_start_resume
feed_hold
soft_reset
safety_door
jog_cancel
feed_override_100percent
feed_override_plus10percent
feed_override_minus10percent
feed_override_plus1percent
feed_override_minus1percent
rapid_override_100percent
rapid_override_50percent
rapid_override_25percent
toggle_spindle_stop
toggle_flood_coolant
toggle_mist_coolant

These are the possible object values:

{
    command: "gcode",
    value: string
}
{
    command: "jog",
    gcode?: "G20" | "G21" | "G90" | "G91" | "G53"
    feedrate: number
    X?: number // At least one of these must be defined
    Y?: number // At least one of these must be defined
    Z?: number // At least one of these must be defined
}
{
    command: "save_startup_block"
    value: string // Any g-code
}