diff --git a/README.md b/README.md
index 1c8f5e7..bb39ae7 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
## grblHAL ##
-Latest build date is 20250228, see the [changelog](changelog.md) for details.
+Latest build date is 20250305, see the [changelog](changelog.md) for details.
> [!NOTE]
> A settings reset will be performed on an update of builds prior to 20241208. Backup and restore of settings is recommended.
@@ -89,4 +89,4 @@ G/M-codes not supported by [legacy Grbl](https://github.com/gnea/grbl/wiki) are
Some [plugins](https://github.com/grblHAL/plugins) implements additional M-codes.
---
-20250228
+20250305
diff --git a/changelog.md b/changelog.md
index b790abc..381ce92 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,6 +1,28 @@
## grblHAL changelog
-20250229
+20250305
+
+Core:
+
+* Fixed ioports enumeration issue affecting remapped ports used by the ESP-AT plugin and stream passthru mode.
+
+* Changed stream passtrhu mode to not enter coprocessor MCU bootloader mode when turned on.
+
+Drivers:
+
+* Networking capable: updated for networking library changes. Some updated for incorrect sequencing of network events causing static IP mode to fail.
+
+Plugins:
+
+* Networking: next step in making library capable of supporting multiple interfaces.
+
+* WebUI: updated for networking library changes.
+
+* Misc, ESP-AT: updated to allow it to be used with controllers with ethernet enabled.
+
+---
+
+20250301
Drivers:
diff --git a/grbl.h b/grbl.h
index 1794ebd..19041e2 100644
--- a/grbl.h
+++ b/grbl.h
@@ -42,7 +42,7 @@
#else
#define GRBL_VERSION "1.1f"
#endif
-#define GRBL_BUILD 20250228
+#define GRBL_BUILD 20250305
#define GRBL_URL "https://github.com/grblHAL"
diff --git a/ioports.c b/ioports.c
index cf64fce..56b1215 100644
--- a/ioports.c
+++ b/ioports.c
@@ -38,6 +38,8 @@ typedef struct {
io_ports_detail_t *ports;
char port_names[8 * 6 + (MAX_PORTS - 8) * 7];
ioport_bus_t enabled;
+ pin_function_t min_fn;
+ pin_function_t max_fn;
} io_ports_private_t;
typedef struct {
@@ -49,9 +51,27 @@ typedef struct {
static driver_settings_load_ptr on_settings_loaded = NULL;
static setting_changed_ptr on_setting_changed = NULL;
-static io_ports_cfg_t analog, digital;
+static io_ports_cfg_t digital = {
+ .in.min_fn = Input_Aux0, .in.max_fn = Input_AuxMax,
+ .out.min_fn = Output_Aux0, .out.max_fn = Output_AuxMax
+ },
+ analog = {
+ .in.min_fn = Input_Analog_Aux0, .in.max_fn = Input_Analog_AuxMax,
+ .out.min_fn = Output_Analog_Aux0, .out.max_fn = Output_Analog_AuxMax
+ };
static int16_t digital_in = -1, digital_out = -1, analog_in = -1, analog_out = -1;
+static inline io_ports_private_t *get_port_data (io_port_type_t type, io_port_direction_t dir)
+{
+ return type == Port_Digital ? (dir == Port_Input ? &digital.in : &digital.out) : (dir == Port_Input ? &analog.in : &analog.out);
+}
+
+// TODO: change to always use ioports_map_reverse()? add range check?
+static inline uint8_t resolve_portnum (io_ports_private_t *p_data, xbar_t *port)
+{
+ return port->function >= p_data->min_fn && port->function <= p_data->max_fn ? (port->function - p_data->min_fn) : ioports_map_reverse(p_data->ports, port->id);
+}
+
static uint8_t ioports_count (io_port_type_t type, io_port_direction_t dir)
{
xbar_t *port;
@@ -161,13 +181,11 @@ xbar_t *ioport_get_info (io_port_type_t type, io_port_direction_t dir, uint8_t p
{
bool ok = false;
uint8_t n_ports = ioports_available(type, dir);
- uint8_t base = type == Port_Digital
- ? (dir == Port_Input ? Input_Aux0 : Output_Aux0)
- : (dir == Port_Input ? Input_Analog_Aux0 : Output_Analog_Aux0);
+ io_ports_private_t *p_data = get_port_data(type, dir);
xbar_t *portinfo = NULL;
if(hal.port.get_pin_info && n_ports) do {
- ok = (portinfo = hal.port.get_pin_info(type, dir, --n_ports)) && (portinfo->function - base) == port;
+ ok = (portinfo = hal.port.get_pin_info(type, dir, --n_ports)) && resolve_portnum(p_data, portinfo) == port;
} while(n_ports && !ok);
return ok ? portinfo : NULL;
@@ -259,16 +277,17 @@ bool ioport_can_claim_explicit (void)
bool ioports_enumerate (io_port_type_t type, io_port_direction_t dir, pin_cap_t filter, ioports_enumerate_callback_ptr callback, void *data)
{
bool ok = false;
- uint8_t n_ports = ioports_available(type, dir),
- base = type == Port_Digital
- ? (dir == Port_Input ? Input_Aux0 : Output_Aux0)
- : (dir == Port_Input ? Input_Analog_Aux0 : Output_Analog_Aux0);
- xbar_t *portinfo;
+ uint_fast16_t n_ports = ioports_available(type, dir);
+ io_ports_private_t *p_data = get_port_data(type, dir);
if(n_ports && ioport_can_claim_explicit()) do {
- portinfo = hal.port.get_pin_info(type, dir, --n_ports);
- if((portinfo->cap.mask & filter.mask) == filter.mask && (ok = callback(portinfo, portinfo->function - base, data)))
- break;
+
+ xbar_t *portinfo;
+
+ if((portinfo = hal.port.get_pin_info(type, dir, --n_ports)) && (portinfo->cap.mask & filter.mask) == filter.mask) {
+ if((ok = callback(portinfo, resolve_portnum(p_data, portinfo), data)))
+ break;
+ }
} while(n_ports);
return ok;
diff --git a/stream_passthru.c b/stream_passthru.c
index 780c75c..78effe7 100644
--- a/stream_passthru.c
+++ b/stream_passthru.c
@@ -23,12 +23,10 @@
#include "task.h"
#include "protocol.h"
-//static xbar_t *dtr, *rts;
static uint8_t boot0_port = 0xFF, reset_port = 0xFF;
static io_stream_t dest;
static bool conn_ok = false;
static on_linestate_changed_ptr on_linestate_changed;
-//static on_execute_realtime_ptr on_execute_realtime = NULL;
// Weak implementation of low level function to be provided by the driver
@@ -39,25 +37,6 @@ __attribute__((weak)) void stream_passthru_enter (void)
// ****
-
-/*
-static void onExecuteRealtime (uint_fast16_t state)
-{
- static bool lock = false;
-
- int16_t c;
-
- if(!lock) {
- lock = true;
- if((c = hal.stream.read()) != SERIAL_NO_DATA)
- dest.write_char(c);
- lock = false;
- }
-
- on_execute_realtime(state);
-}
-*/
-
ISR_CODE static bool ISR_FUNC(forward_usb_rx)(char c)
{
dest.write_char(c);
@@ -123,16 +102,13 @@ static void passthru_start2 (void *data)
task_add_delayed(forward_uart_rx, NULL, 8);
-// on_execute_realtime = grbl.on_execute_realtime;
-// grbl.on_execute_realtime = onExecuteRealtime;
-
dest.set_enqueue_rt_handler(stream_buffer_all);
dest.cancel_read_buffer();
}
static void passthru_start1 (void *data)
{
- hal.port.digital_out(boot0_port, 0);
+ hal.port.digital_out(boot0_port, 1);
hal.port.digital_out(reset_port, 0);
on_linestate_changed = hal.stream.on_linestate_changed;