olindgre 2ece01e1d7 Make powertrain-build not overlap with pybuild in site-packages
Change-Id: I7b59f3f04f0f787d35db0b9389f295bf1ad24f56
2024-09-17 10:25:04 +02:00

132 lines
4.7 KiB
Matlab

% Copyright 2024 Volvo Car Corporation
% Licensed under Apache 2.0.
function errorOccurred = updateModels(mode, rootFolder, modelList)
bdclose('all')
evalin('base', 'global Vc');
global Vc;
startdir = pwd;
% Load nvmram lists
nvmStructs = [rootFolder '/Projects/*/conf.local/nvm_structs.json'];
NVMData = struct();
for file=dir(nvmStructs)'
disp(['Loading NVM data from ' file.folder]);
tmp_nvm=loadjson(fullfile(file.folder, file.name));
for block=tmp_nvm
if ~isempty(block(1).signals)
for var=block(1).signals
NVMData.(var(1).name) = var(1);
end
end
end
end
tlmodels = false;
for i=1:length(modelList)
[modelFolder, modelName, ~] = fileparts(modelList{i});
% Check if model is configured to use TargetLink or not.
isTLModel = modelConfiguredForTL(rootFolder, modelFolder, modelName);
% Save if any of the models was a TargetLink model
tlmodels = tlmodels || isTLModel;
end
% Load par-files, add *Const manually if not already in the list
% This is required since they can contain constants used by other models
modelListPar = modelList;
if all(cellfun(@isempty, regexp(modelList,'Models/Common/\w*Const/\w*Const.mdl','match')))
commonConstModels = dir('Models/Common/*Const/*Const.mdl');
for i=1:length(commonConstModels)
modelName = [commonConstModels(i).folder '/' commonConstModels(i).name]
modelListPar = [{strrep(modelName, rootFolder, "")}, modelListPar];
end
end
for i=1:length(modelListPar)
[modelFolder, modelName, ~] = fileparts(modelListPar{i});
end
for i=1:length(modelListPar)
[modelFolder, modelName, ~] = fileparts(modelListPar{i});
modelFolder = strip(convertStringsToChars(modelFolder), '\');
par_f_path = strip(join([modelFolder '\' modelName '_par.m'],''), '\');
if ~isfile(par_f_path)
error('Invalid par file path: "%s"', par_f_path);
end
% Set all model sample times to 0.01
clear tmp; % tmp is used by many par_files, and not always cleaned up
run(par_f_path);
tok = regexp(modelName, '([A-Z]\w*?)([A-Z]\w*?)([A-Z]\w*?){0,1}(?:__.*?){0,1}$','tokens');
if ~isempty(tok{1}{3})
Vc.(tok{1}{2}).(tok{1}{3}).ts = 0.01;
else
Vc.(tok{1}{2}).ts = 0.01;
end
disp(['Loaded: ' par_f_path])
cd(startdir);
end
% Update the model and generate code
errorOccurred = false;
interfaceSignals = getInterfaceSignals(rootFolder);
for i=1:length(modelList)
cd(startdir);
if ~isfile(modelList{i})
error('Invalid model path: "%s"', modelList{i});
end
[modelFolder, modelName, ~] = fileparts(modelList{i});
cd([rootFolder '/' modelFolder]);
% Would like to avoid this duplication, but not sure how.
ssp = strsplit(modelList{i}, '/');
% SSP is desired in the path "Models/<SSP>/<MODEL>/<MDL.mdl>, hence end-2.
ssp = ssp(end-2);
ssp = ssp{1};
disp(ssp)
isTLModel = modelConfiguredForTL(rootFolder, modelFolder, modelName);
fprintf('\nStart generation of unitCfg for model %s\n', modelName);
try
fprintf('\nrootFolder: %s, modelName: %s, ssp: %s\n', rootFolder, modelName, ssp);
switch mode
case 'update'
disp(['Updating: ' modelName]);
updateModel(rootFolder, modelName, ssp, NVMData, interfaceSignals);
case 'codegen'
disp(['Generating: ' modelName]);
if isTLModel
if ~exist('dsdd_manage_project', 'file')
error('TargetLink not installed. Cannot generate code for models configured with TargetLink');
end
generateTLUnit(rootFolder, modelName, ssp);
else
generateECUnit(rootFolder, modelName, ssp)
end
otherwise
fprintf('\n Unsupported mode: %s\n', mode);
errorOccurred = true;
break;
end
catch err
fprintf('\nError: %s\n', err.getReport());
errorOccurred = true;
end
fprintf('\nFinished generation of unitCfg for model %s\n', modelName);
cd(startdir);
end
if tlmodels
% Throw away any local changes to DD0
dsdd('Close', 'save', 0);
end
% Add final success message if no errors occurred
if ~errorOccurred
fprintf('\n%s\n', 'Matlab task succeeded!');
end
end