diff --git a/main/driver.c b/main/driver.c
index feb7cd9..becbfc1 100644
--- a/main/driver.c
+++ b/main/driver.c
@@ -445,6 +445,7 @@ static ioexpand_t iopins = {0};
#ifdef NEOPIXELS_PIN
neopixel_cfg_t neopixel = { .intensity = 255 };
+void neopixels_write (void);
#endif
#if AUX_CONTROLS_ENABLED
@@ -2033,6 +2034,7 @@ static void settings_changed (settings_t *settings, settings_changed_flags_t cha
}
neopixel.num_leds = hal.rgb0.num_devices;
+ hal.rgb0.write = neopixel.num_leds > 1 ? neopixels_write : NULL;
}
#endif
@@ -2515,7 +2517,7 @@ static void IRAM_ATTR ws2812_rmt_adapter (const void *src, rmt_item32_t *dest, s
*item_num = num;
}
-void neopixels_write (void)
+void _neopixels_write (void)
{
uint8_t *buf = neopixel.leds;
size_t size = neopixel.num_bytes;
@@ -2535,6 +2537,11 @@ void neopixels_write (void)
#endif
}
+void neopixels_write (void)
+{
+ _neopixels_write();
+}
+
static void neopixel_out_masked (uint16_t device, rgb_color_t color, rgb_color_mask_t mask)
{
if(neopixel.num_leds && device < neopixel.num_leds) {
@@ -2542,7 +2549,7 @@ static void neopixel_out_masked (uint16_t device, rgb_color_t color, rgb_color_m
rgb_1bpp_assign(&neopixel.leds[device * 3], color, mask);
if(neopixel.num_leds == 1)
- neopixels_write();
+ _neopixels_write();
}
}
@@ -2558,7 +2565,7 @@ uint8_t neopixels_set_intensity (uint8_t value)
if(neopixel.intensity != value) {
neopixel.intensity = value;
-// neopixels_write();
+ _neopixels_write();
}
return prev;
@@ -2566,7 +2573,7 @@ uint8_t neopixels_set_intensity (uint8_t value)
#endif // NEOPIXELS_PIN
-// Initializes MCU peripherals for Grbl use
+// Initializes MCU peripherals for grblHAL use
static bool driver_setup (settings_t *settings)
{
@@ -2757,9 +2764,6 @@ static bool driver_setup (settings_t *settings)
enet_start();
#endif
-// if(hal.rgb0.out)
-// hal.rgb0.out(0, (rgb_color_t){ .R = 5, .G = 100, .B = 5 });
-
return IOInitDone;
}
@@ -2815,7 +2819,7 @@ bool driver_init (void)
#else
hal.info = "ESP32";
#endif
- hal.driver_version = "240817";
+ hal.driver_version = "240903";
hal.driver_url = GRBL_URL "/ESP32";
#ifdef BOARD_NAME
hal.board = BOARD_NAME;
@@ -3078,7 +3082,6 @@ bool driver_init (void)
hal.rgb0.out = neopixel_out;
hal.rgb0.out_masked = neopixel_out_masked;
- hal.rgb0.write = neopixels_write;
hal.rgb0.set_intensity = neopixels_set_intensity;
hal.rgb0.num_devices = NEOPIXELS_NUM;
hal.rgb0.cap = (rgb_color_t){ .R = 255, .G = 255, .B = 255 };
diff --git a/main/my_machine.h b/main/my_machine.h
index d875e56..595dbb8 100644
--- a/main/my_machine.h
+++ b/main/my_machine.h
@@ -58,6 +58,7 @@
//#define SPINDLE1_ENABLE SPINDLE_PWM0_NODIR
//#define SPINDLE2_ENABLE SPINDLE_NONE
//#define SPINDLE3_ENABLE SPINDLE_NONE
+//#define SPINDLE_OFFSET 1 // Uncomment to enable settings for laser spindle XY-offset.
// **********************
//#define MODBUS_ENABLE 1 // Set to 1 for auto direction, 2 for direction signal on auxillary output pin.
//#define WEBUI_ENABLE 3 // Enable ESP3D-WEBUI plugin along with networking and SD card plugins.
@@ -85,11 +86,15 @@
//#define EEPROM_IS_FRAM 1 // Uncomment when EEPROM is enabled and chip is FRAM, this to remove write delay.
#define ESTOP_ENABLE 0 // When enabled only real-time report requests will be executed when the reset pin is asserted.
// NOTE: if left commented out the default setting is determined from COMPATIBILITY_LEVEL.
-//#define PROBE_ENABLE 0 // Uncomment to disable probe input.
+//#define RGB_LED_ENABLE 2 // Set to 1 to enable strip length settings $536 and $537, set to 2 to also enable M150 LED strip control.
+//#define PWM_SERVO_ENABLE 1 // Enable PWM servo support, requires at least one PWM capable auxillary output.
+//#define BLTOUCH_ENABLE 1 // Enable BLTouch support. Requires and claims one PWM servo output.
+//#define EVENTOUT_ENABLE 1 // Enable binding events (triggers) to control auxillary outputs.
// Optional control signals:
// These will be assigned to aux input pins. Use the $pins command to check which pins are assigned.
// NOTE: If not enough pins are available assignment will silently fail.
+//#define PROBE_ENABLE 0 // Uncomment to disable probe input.
//#define SAFETY_DOOR_ENABLE 1
//#define MOTOR_FAULT_ENABLE 1
//#define MOTOR_WARNING_ENABLE 1
diff --git a/main/usb_serial.c b/main/usb_serial.c
index 674aa5a..bb69666 100644
--- a/main/usb_serial.c
+++ b/main/usb_serial.c
@@ -4,20 +4,20 @@
Part of grblHAL
- Some parts are copyright (c) 2021-2023 Terje Io
+ Some parts are copyright (c) 2023-2024 Terje Io
- Grbl is free software: you can redistribute it and/or modify
+ 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.
- Grbl is distributed in the hope that it will be useful,
+ 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
+ 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 Grbl. If not, see .
+ along with grblHAL. If not, see .
***
@@ -29,6 +29,8 @@
*/
+#if CONFIG_IDF_TARGET_ESP32S3
+
#include
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
@@ -79,17 +81,15 @@ static void usb_out_chars (const char *buf, int length)
}
}
-/*
static int32_t usb_in_chars (char *buf, uint32_t length)
{
uint32_t count = 0;
- if(usb_connected() && tud_cdc_available())
- count = tud_cdc_read(buf, length);
+ if (usb_connected() && tud_cdc_available())
+ count = tud_cdc_read(buf, length);
return count ? count : -1;
}
-*/
//
// Returns number of characters in USB input buffer
@@ -310,3 +310,48 @@ const io_stream_t *usb_serialInit (void)
return &stream;
}
+
+//
+// This function get called from the foreground process,
+// used here to get characters off the USB serial input stream and buffer
+// them for processing by grbl. Real time command characters are stripped out
+// and submitted for realtime processing.
+//
+static void execute_realtime (uint_fast16_t state)
+{
+ static volatile bool lock = false;
+ static char tmpbuf[BLOCK_RX_BUFFER_SIZE];
+
+ if(lock)
+ return;
+
+ char c, *dp;
+ int32_t avail, free;
+
+ lock = true;
+
+ if(usb_connected() && (avail = (int32_t)tud_cdc_available())) {
+
+ dp = tmpbuf;
+ free = (int32_t)usb_serialRxFree();
+ free = free > BLOCK_RX_BUFFER_SIZE ? BLOCK_RX_BUFFER_SIZE : free;
+ avail = usb_in_chars(tmpbuf, (uint32_t)(avail > free ? free : avail));
+
+ if(avail > 0) while(avail--) {
+ c = *dp++;
+ if(!enqueue_realtime_command(c)) {
+ uint_fast16_t next_head = BUFNEXT(rxbuf.head, rxbuf); // Get next head pointer
+ if(next_head == rxbuf.tail) // If buffer full
+ rxbuf.overflow = On; // flag overflow,
+ else {
+ rxbuf.data[rxbuf.head] = c; // else add character data to buffer
+ rxbuf.head = next_head; // and update pointer
+ }
+ }
+ }
+ }
+
+ lock = false;
+}
+
+#endif // GRBL_ESP32S3