/* plugins.h - An embedded CNC Controller with rs274/ngc (g-code) support Some data structures and function declarations for plugins that require driver code These are NOT referenced in the core grblHAL code Part of grblHAL Copyright (c) 2020-2026 Terje Io grblHAL is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. grblHAL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with grblHAL. If not, see . */ #ifndef _PLUGINS_H_ #define _PLUGINS_H_ #include #include #include "nvs.h" // Jogging typedef struct { float fast_speed; float slow_speed; float step_speed; float fast_distance; float slow_distance; float step_distance; } jog_settings_t; // Networking typedef enum { IpMode_Static = 0, IpMode_DHCP, IpMode_AutoIP } ip_mode_t; typedef union { uint8_t mask; struct { uint8_t telnet :1, websocket :1, http :1, ftp :1, dns :1, mdns :1, ssdp :1, webdav :1; }; } network_services_t; typedef char ssid_t[65]; typedef uint8_t bssid_t[6]; typedef char username_t[33]; typedef char password_t[33]; typedef char hostname_t[33]; typedef char uri_t[65]; typedef struct { char ip[16]; uint16_t port; username_t user; password_t password; } mqtt_settings_t; typedef struct { char ip[16]; char gateway[16]; char mask[16]; hostname_t hostname; uint16_t telnet_port; uint16_t websocket_port; uint16_t http_port; uint16_t ftp_port; ip_mode_t ip_mode; network_services_t services; #if MQTT_ENABLE mqtt_settings_t mqtt; #endif #if defined(_WIZCHIP_) || defined(HAS_MAC_SETTING) uint8_t mac[6]; #endif } network_settings_t; typedef enum { WiFiMode_NULL = 0, WiFiMode_STA, WiFiMode_AP, WiFiMode_APSTA } grbl_wifi_mode_t; #ifdef WIN32 #undef interface #endif typedef struct { const char *interface; bool is_ethernet; bool link_up; bool dhcp; // TODO: move to network_services_t in next settings revision. uint16_t mbps; char mac[18]; char mqtt_client_id[18]; grbl_wifi_mode_t wifi_mode; network_settings_t status; } network_info_t; typedef struct { ssid_t ssid; bssid_t bssid; password_t password; char country[4]; uint8_t channel; network_settings_t network; } wifi_ap_settings_t; typedef struct { ssid_t ssid; password_t password; network_settings_t network; } wifi_sta_settings_t; typedef struct { char device_name[33]; char service_name[33]; } bluetooth_settings_t; #define MODBUS_TCP_SETTINGS_INCREMENT 5 typedef enum { Setting_ModbusIpAddress = 0, Setting_ModbusPort = 1, Setting_ModbusId = 2 } modbus_tcp_setting_id_t; typedef struct { char ip[16]; uint16_t port; uint8_t id; } modbus_tcp_settings_t; // Encoder settings offsets typedef enum { Setting_EncoderMode = 0, Setting_EncoderCPR = 1, //!< Count Per Revolution. Setting_EncoderCPD = 2, //!< Count Per Detent. Setting_EncoderDblClickWindow = 3 // ms } encoder_setting_id_t; // DISPLAYS: // Interfaces #define DISPLAY_I2C (1<<0) //!< 1 #define DISPLAY_SPI (1<<1) //!< 2 #define DISPLAY_UART (1<<2) //!< 4 // Plugins #define DISPLAY_I2C_INTERFACE ((1<<3)|DISPLAY_I2C) //!< 9 - @grblhal #define DISPLAY_I2C_LEDS ((1<<4)|DISPLAY_I2C) //!< 17 - @grblhal #define DISPLAY_I2C_OLED_1 ((1<<5)|DISPLAY_I2C) //!< 33 - @luc-github // Driver chips #define DISPLAY_DRIVER_SH1106 1 #define DISPLAY_DRIVER_SSD1306 2 #define DISPLAY_DRIVER_SSD1331 3 #define DISPLAY_DRIVER_ILI9340 4 #define DISPLAY_DRIVER_ILI9341 5 #define DISPLAY_DRIVER_ILI9486 6 // I2C interface: typedef void (*keycode_callback_ptr)(const char c); typedef uint_fast16_t i2c_address_t; typedef struct { i2c_address_t address; union { struct { uint8_t cmd_bytes; uint16_t cmd; }; struct { uint8_t word_addr_bytes; uint16_t word_addr; }; }; uint_fast16_t count; bool no_block; uint8_t *data; } i2c_transfer_t; typedef union { uint8_t ok; struct { uint8_t started :1, tx_non_blocking :1, tx_dma :1, unassigned :5; }; } i2c_cap_t; extern i2c_cap_t i2c_start (void); extern bool i2c_probe (i2c_address_t i2c_address); extern bool i2c_send (i2c_address_t i2c_address, uint8_t *data, size_t size, bool block); extern bool i2c_receive (i2c_address_t i2cAddr, uint8_t *buf, size_t size, bool block); extern bool i2c_get_keycode (i2c_address_t i2c_address, keycode_callback_ptr callback); extern bool i2c_transfer (i2c_transfer_t *i2c, bool read); // SPI interface: typedef struct { uint8_t cs_pin; void *cs_port; uint32_t f_clock; void *handle; } spi_slave_t; typedef union { uint8_t ok; struct { uint8_t started :1, tx_non_blocking :1, tx_dma :1, unassigned :5; }; } spi_cap_t; extern spi_cap_t spi_start (spi_slave_t *slave); extern bool spi_select (spi_slave_t *slave); extern bool spi_deselect (spi_slave_t *slave); extern uint8_t spi_get_byte (void); extern uint8_t spi_put_byte (uint8_t byte); extern bool spi_read (uint8_t *data, uint16_t size); extern bool spi_write (uint8_t *data, uint16_t size); // EEPROM/FRAM: typedef i2c_transfer_t nvs_transfer_t; #define i2c_nvs_transfer(i2c, rd) i2c_transfer(i2c, rd) typedef bool nvs_transfer_result_t; #define NVS_TransferResult_OK true #endif