function node = getBusNode(rootBus, pathStr)
%GETBUSNODE Naviga dentro un bus gerarchico usando un path tipo:
%   'pl_1.plotveicolo.values.x'

    parts = split(string(pathStr), ".");
    node = rootBus;

    for k = 1:numel(parts)
        fieldName = char(parts(k));

        % Se è un Signal, entra nei Values
        if isa(node, 'Simulink.SimulationData.Signal')
            node = node.Values;
        end

        % Caso struct normale
        if isstruct(node)
            if isfield(node, fieldName)
                node = node.(fieldName);
            else
                error('getBusNode:missingField', ...
                    'Campo "%s" non trovato nel path "%s".', ...
                    fieldName, pathStr);
            end

        % Caso Dataset/Bus salvato in Dataset format
        elseif isa(node, 'Simulink.SimulationData.Dataset')
            try
                sig = node.get(fieldName);
                node = sig.Values;
            catch
                error('getBusNode:missingDatasetElement', ...
                    'Elemento "%s" non trovato nel Dataset per path "%s".', ...
                    fieldName, pathStr);
            end

        % Caso Bus object Simulink.SimulationData.Bus
        elseif isa(node, 'Simulink.SimulationData.Bus')
            % Tentativo 1: accesso tipo campo
            try
                node = node.(fieldName);
            catch
                % Tentativo 2: se il bus ha Values come Dataset/struct
                try
                    node = getBusNode(node.Values, fieldName);
                catch
                    error('getBusNode:missingBusElement', ...
                        'Elemento "%s" non trovato nel Bus per path "%s".', ...
                        fieldName, pathStr);
                end
            end

        else
            error('getBusNode:unsupportedNode', ...
                'Nodo non navigabile al campo "%s" nel path "%s". Tipo: %s', ...
                fieldName, pathStr, class(node));
        end
    end
end