From 4809ce59cf8d9e1de6b6eb76f473d7c96d226cf8 Mon Sep 17 00:00:00 2001 From: Amine Messak Date: Wed, 4 Nov 2026 18:25:28 +0000 Subject: [PATCH 1/3] feat: add MATLAB-based validation of cooling controller --- .gitignore | 3 + Makefile | 6 ++ README.md | 34 ++++++++-- docs/cooling_analysis.png | Bin 0 -> 94440 bytes matlab/analyze_cooling.m | 139 ++++++++++++++++++++++++++++++++++++++ src/main.c | 48 ++++++++++++- 6 files changed, 223 insertions(+), 7 deletions(-) create mode 100644 docs/cooling_analysis.png create mode 100644 matlab/analyze_cooling.m diff --git a/.gitignore b/.gitignore index 255c946..a2dc304 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ cooling_tests # Editor folders .vscode/ + +# MATLAB analysis outputs (regenerated locally) +results/ diff --git a/Makefile b/Makefile index 138c151..63ee538 100644 --- a/Makefile +++ b/Makefile @@ -29,3 +29,9 @@ test: $(TST_BIN) clean: > rm -f $(SIM_BIN) $(TST_BIN) *.exe *.o *.obj *.gcda *.gcno *.gcov + +# Export the deterministic C simulation as data for MATLAB. +.PHONY: trace +trace: $(SIM_BIN) +> mkdir -p results +> ./$(SIM_BIN) --csv results/cooling_trace.csv diff --git a/README.md b/README.md index ae92380..9cee018 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,36 @@ A new invalid reading during recovery restarts the counter. The HIGH fallback is The simulation prints the step, heating rate, measured temperature, sensor status, fan state, PWM command, and fault indicator. The thermal model is intentionally simple; it is not a physically calibrated engine model. +## MATLAB-based validation (R2024a) + +The C simulation can export a 20-step trace for independent checking and +visualization in MATLAB. The C controller is unchanged; MATLAB serves as an +offline reference model, not as an ECU runtime component. + +1. From **Git Bash** at the repository root, run `make trace`. This generates + `results/cooling_trace.csv` (ignored by Git). +2. In **MATLAB**, change to the repository folder and run: + + ```matlab + addpath('matlab') + analyze_cooling + ``` + +The MATLAB script reads the CSV, calculates a separate FSM/fault-recovery +reference, checks every recorded state and output, and saves a four-panel +figure to `results/cooling_analysis.png`. MATLAB R2024a is supported; no +Simulink or other add-on is required for this workflow. + +The reference model checks the supplied 20-step test scenario, not all +possible input sequences. This is **offline cross-checking**, not real-time +co-simulation, hardware-in-the-loop testing, or functional-safety evidence. + +### MATLAB validation results + +The following plots show temperature evolution, injected sensor faults, PWM commands, and fault recovery. + +![Engine Cooling Controller - MATLAB Validation](docs/cooling_analysis.png) + ## Project structure ```text @@ -165,7 +195,3 @@ This is a **PC-based educational simulation**, not a production-ready ECU implem - Calls to `cooling_update()` are simulated steps, not a real-time scheduler with timing guarantees. - No CAN communication, diagnostics protocol, or physical fan-failure monitoring is implemented. - The project does not implement or claim AUTOSAR or ISO 26262 compliance. - -## License - -MIT — see [LICENSE](LICENSE). diff --git a/docs/cooling_analysis.png b/docs/cooling_analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c0a79a47778fab858666a930ebcbfe28a9bebb GIT binary patch literal 94440 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�I#LZ4lQ-03jWAKeFpgCUz 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 literal 0 HcmV?d00001 diff --git a/matlab/analyze_cooling.m b/matlab/analyze_cooling.m new file mode 100644 index 0000000..8138d3b --- /dev/null +++ b/matlab/analyze_cooling.m @@ -0,0 +1,139 @@ +function analyze_cooling(csvPath) +%ANALYZE_COOLING Plot and independently check Engine Cooling Controller output. +% Compatible with MATLAB R2024a; no optional toolboxes required. +% Run from the repository root: +% addpath('matlab'); analyze_cooling + + root = fileparts(fileparts(mfilename('fullpath'))); + if nargin < 1 + csvPath = fullfile(root, 'results', 'cooling_trace.csv'); + end + assert(isfile(csvPath), ... + 'CSV not found. In Git Bash, run: make trace'); + data = readtable(csvPath); + + required = {'step','heat_rate_c_per_step','plant_temp_c', ... + 'measured_temp_c','signal_valid','fan_state', ... + 'pwm_pct','sensor_fault','fault_led','valid_streak'}; + assert(all(ismember(required, data.Properties.VariableNames)), ... + 'CSV is missing one or more expected columns.'); + assert(height(data) == 20 && isequal(data.step, (1:20)'), ... + 'Expected 20 consecutive simulation steps.'); + + % Build the expected result separately from the C implementation. + [refState, refFault, refStreak] = reference_controller( ... + data.measured_temp_c, data.signal_valid); + assert(isequal(data.fan_state, refState), ... + 'C state sequence differs from the MATLAB reference model.'); + assert(isequal(data.sensor_fault, refFault), ... + 'C sensor fault flags differ from the MATLAB reference model.'); + assert(isequal(data.valid_streak, refStreak), ... + 'C recovery counters differ from the MATLAB reference model.'); + assert(all(data.pwm_pct == 50 .* data.fan_state), ... + 'PWM does not match OFF/LOW/HIGH mapping.'); + assert(isequal(data.fault_led, data.sensor_fault), ... + 'Fault LED must match sensor_fault.'); + assert(any(data.signal_valid == 0) && ... + any(data.measured_temp_c < -40 | data.measured_temp_c > 150), ... + 'Both signal and range fault injections must be exercised.'); + assert(all(data.fan_state(data.sensor_fault == 1) == 2), ... + 'Sensor fault must command HIGH cooling.'); + + fprintf('[PASS] 20 C states match independent MATLAB FSM\n'); + fprintf('[PASS] Sensor fault flags and three-sample recovery match\n'); + fprintf('[PASS] PWM stages and fault LED agree with controller outputs\n'); + fprintf('[PASS] Both fault injection scenarios are present\n'); + + fig = figure('Name','Engine Cooling Controller Validation', ... + 'Color','w','Position',[100 80 1150 900]); + layout = tiledlayout(fig,4,1,'TileSpacing','compact','Padding','compact'); + title(layout,'Engine Cooling Controller | C trace validated by MATLAB'); + + nexttile; + plot(data.step,data.plant_temp_c,'-o','LineWidth',1.5,'MarkerSize',4); + hold on; + yline(95,':','LOW OFF 95 C'); + yline(100,'--','LOW ON 100 C'); + yline(105,':','HIGH OFF 105 C'); + yline(110,'--','HIGH ON 110 C'); + ylabel('Plant temp (C)'); grid on; + title('Actual simulated plant temperature (not the injected sensor reading)'); + + nexttile; + plot(data.step,data.measured_temp_c,'-o','LineWidth',1.4,'MarkerSize',4); + hold on; + bad = data.signal_valid == 0 | ... + data.measured_temp_c < -40 | data.measured_temp_c > 150; + scatter(data.step(bad),data.measured_temp_c(bad),70,'r','filled'); + ylabel('Sensor (C)'); grid on; + title('Measurement, including injected faults at steps 12 and 13'); + + nexttile; + stairs(data.step,data.pwm_pct,'LineWidth',2); + ylim([-10 110]); yticks([0 50 100]); + ylabel('PWM (%)'); grid on; + title('Simulated PWM command (0 / 50 / 100 percent)'); + + nexttile; + stairs(data.step,data.sensor_fault,'LineWidth',2); + ylim([-0.15 1.15]); yticks([0 1]); + ylabel('Fault'); xlabel('Simulation step'); grid on; + title('Sensor fault flag and recovery'); + + output = fullfile(root,'results','cooling_analysis.png'); + exportgraphics(layout, output, 'Resolution', 160); + fprintf('[PASS] Plot saved: %s\n', output); +end + +function [states, faults, streaks] = reference_controller(temps, signalValid) +% Independent reference behavior based on the documented requirements. + n = numel(temps); + states = zeros(n,1); faults = zeros(n,1); streaks = zeros(n,1); + current = 0; fault = false; streak = 0; + + for k = 1:n + temp = temps(k); + good = signalValid(k) ~= 0 && temp >= -40 && temp <= 150; + if ~good + current = 2; fault = true; streak = 0; + else + if fault + streak = streak + 1; + if streak < 3 + current = 2; + states(k) = current; + faults(k) = 1; + streaks(k) = streak; + continue; + end + fault = false; + streak = 0; + end + switch current + case 0 % OFF + if temp >= 110 + current = 2; + elseif temp >= 100 + current = 1; + end + case 1 % LOW + if temp >= 110 + current = 2; + elseif temp <= 95 + current = 0; + end + case 2 % HIGH + if temp <= 95 + current = 0; + elseif temp <= 105 + current = 1; + end + otherwise + error('Unexpected reference state'); + end + end + states(k) = current; + faults(k) = double(fault); + streaks(k) = streak; + end +end diff --git a/src/main.c b/src/main.c index 3ffca06..d05b21b 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,5 @@ #include +#include #include "cooling_controller.h" typedef struct { @@ -30,7 +31,22 @@ static const char *sensor_status_label(int16_t temp_c, bool sensor_ok) { return "OK"; } -int main(void) { +int main(int argc, char *argv[]) { + FILE *csv = NULL; + if (argc != 1) { + if (argc != 3 || strcmp(argv[1], "--csv") != 0) { + fprintf(stderr, "Usage: %s [--csv output_file.csv]\n", argv[0]); + return 1; + } + csv = fopen(argv[2], "w"); + if (csv == NULL) { + perror("Could not open CSV output file"); + return 1; + } + fprintf(csv, "step,heat_rate_c_per_step,plant_temp_c,measured_temp_c," + "signal_valid,fan_state,pwm_pct,sensor_fault,fault_led,valid_streak\n"); + } + CoolingConfig config = { .low_on_c = 100, .low_off_c = 95, @@ -48,9 +64,14 @@ int main(void) { CoolingController controller; if (cooling_init(&controller, &config) != COOLING_OK) { fprintf(stderr, "Failed to initialize controller\n"); + if (csv != NULL) { fclose(csv); } + return 1; + } + if (cooling_set_hal(&controller, &hal) != COOLING_OK) { + fprintf(stderr, "Failed to install HAL callbacks\n"); + if (csv != NULL) { fclose(csv); } return 1; } - cooling_set_hal(&controller, &hal); double plant_temp_c = 88.0; printf("Step | Load (C/s) | Temp (C) | Sensor | Fan State | PWM | Fault LED\n"); @@ -90,9 +111,30 @@ int main(void) { measured_temp, sensor_status_label(measured_temp, sensor_ok), cooling_state_name(state), - hw_state.pwm_duty_pct, + (unsigned int)hw_state.pwm_duty_pct, hw_state.fault_led_on ? "ON" : "OFF"); + + if (csv != NULL) { + if (fprintf(csv, "%d,%.2f,%.2f,%d,%d,%d,%u,%d,%d,%u\n", + step, heat_rate, plant_temp_c, (int)measured_temp, + sensor_ok ? 1 : 0, (int)state, + (unsigned int)hw_state.pwm_duty_pct, + controller.sensor_fault ? 1 : 0, + hw_state.fault_led_on ? 1 : 0, + (unsigned int)controller.valid_streak) < 0) { + perror("Could not write CSV trace"); + fclose(csv); + return 1; + } + } } + if (csv != NULL) { + if (fclose(csv) != 0) { + perror("Could not close CSV trace"); + return 1; + } + printf("CSV trace written to %s\n", argv[2]); + } return 0; } From 4ec8a96b9c3922470bcf609dc8157f51fac77814 Mon Sep 17 00:00:00 2001 From: Amine Messak Date: Wed, 4 Nov 2026 18:31:01 +0000 Subject: [PATCH 2/3] fix: address Cppcheck const parameter warning --- src/main.c | 119 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 84 insertions(+), 35 deletions(-) diff --git a/src/main.c b/src/main.c index d05b21b..fa940e4 100644 --- a/src/main.c +++ b/src/main.c @@ -2,47 +2,62 @@ #include #include "cooling_controller.h" -typedef struct { +typedef struct +{ uint8_t pwm_duty_pct; bool fault_led_on; } SimHardwareState; -static void sim_set_fan_pwm(uint8_t duty_pct, void *user_ctx) { +static void sim_set_fan_pwm(uint8_t duty_pct, void *user_ctx) +{ SimHardwareState *hw = (SimHardwareState *)user_ctx; - if (hw != NULL) { + if (hw != NULL) + { hw->pwm_duty_pct = duty_pct; } } -static void sim_set_fault_led(bool fault_active, void *user_ctx) { +static void sim_set_fault_led(bool fault_active, void *user_ctx) +{ SimHardwareState *hw = (SimHardwareState *)user_ctx; - if (hw != NULL) { + if (hw != NULL) + { hw->fault_led_on = fault_active; } } -static const char *sensor_status_label(int16_t temp_c, bool sensor_ok) { - if (!sensor_ok) { +static const char *sensor_status_label(int16_t temp_c, bool sensor_ok) +{ + if (!sensor_ok) + { return "SIG_ERR"; } - if (temp_c < COOLING_SENSOR_MIN_C || temp_c > COOLING_SENSOR_MAX_C) { + if (temp_c < COOLING_SENSOR_MIN_C || temp_c > COOLING_SENSOR_MAX_C) + { return "RNG_ERR"; } return "OK"; } -int main(int argc, char *argv[]) { +int main(int argc, char *const argv[]) +{ FILE *csv = NULL; - if (argc != 1) { - if (argc != 3 || strcmp(argv[1], "--csv") != 0) { + + if (argc != 1) + { + if (argc != 3 || strcmp(argv[1], "--csv") != 0) + { fprintf(stderr, "Usage: %s [--csv output_file.csv]\n", argv[0]); return 1; } + csv = fopen(argv[2], "w"); - if (csv == NULL) { + if (csv == NULL) + { perror("Could not open CSV output file"); return 1; } + fprintf(csv, "step,heat_rate_c_per_step,plant_temp_c,measured_temp_c," "signal_valid,fan_state,pwm_pct,sensor_fault,fault_led,valid_streak\n"); } @@ -51,55 +66,79 @@ int main(int argc, char *argv[]) { .low_on_c = 100, .low_off_c = 95, .high_on_c = 110, - .high_off_c = 105 - }; + .high_off_c = 105}; + + SimHardwareState hw_state = { + .pwm_duty_pct = 0U, + .fault_led_on = false}; - SimHardwareState hw_state = { .pwm_duty_pct = 0U, .fault_led_on = false }; CoolingHal hal = { .set_fan_pwm = sim_set_fan_pwm, .set_fault_led = sim_set_fault_led, - .user_ctx = &hw_state - }; + .user_ctx = &hw_state}; CoolingController controller; - if (cooling_init(&controller, &config) != COOLING_OK) { + + if (cooling_init(&controller, &config) != COOLING_OK) + { fprintf(stderr, "Failed to initialize controller\n"); - if (csv != NULL) { fclose(csv); } + if (csv != NULL) + { + fclose(csv); + } return 1; } - if (cooling_set_hal(&controller, &hal) != COOLING_OK) { + + if (cooling_set_hal(&controller, &hal) != COOLING_OK) + { fprintf(stderr, "Failed to install HAL callbacks\n"); - if (csv != NULL) { fclose(csv); } + if (csv != NULL) + { + fclose(csv); + } return 1; } double plant_temp_c = 88.0; + printf("Step | Load (C/s) | Temp (C) | Sensor | Fan State | PWM | Fault LED\n"); printf("-----+------------+----------+---------+-----------+------+----------\n"); - for (int step = 1; step <= 20; step++) { + for (int step = 1; step <= 20; step++) + { double heat_rate = 2.5; bool sensor_ok = true; - if (step >= 7 && step <= 11) { + if (step >= 7 && step <= 11) + { heat_rate = 4.0; - } else if (step >= 15) { + } + else if (step >= 15) + { heat_rate = 0.8; } double cooling_rate = 0.0; - if (cooling_get_state(&controller) == FAN_LOW) { + + if (cooling_get_state(&controller) == FAN_LOW) + { cooling_rate = 2.2; - } else if (cooling_get_state(&controller) == FAN_HIGH) { + } + else if (cooling_get_state(&controller) == FAN_HIGH) + { cooling_rate = 4.8; } plant_temp_c += (heat_rate - cooling_rate); + int16_t measured_temp = (int16_t)(plant_temp_c + 0.5); - if (step == 12) { + if (step == 12) + { sensor_ok = false; - } else if (step == 13) { + } + else if (step == 13) + { measured_temp = 185; } @@ -114,14 +153,20 @@ int main(int argc, char *argv[]) { (unsigned int)hw_state.pwm_duty_pct, hw_state.fault_led_on ? "ON" : "OFF"); - if (csv != NULL) { + if (csv != NULL) + { if (fprintf(csv, "%d,%.2f,%.2f,%d,%d,%d,%u,%d,%d,%u\n", - step, heat_rate, plant_temp_c, (int)measured_temp, - sensor_ok ? 1 : 0, (int)state, + step, + heat_rate, + plant_temp_c, + (int)measured_temp, + sensor_ok ? 1 : 0, + (int)state, (unsigned int)hw_state.pwm_duty_pct, controller.sensor_fault ? 1 : 0, hw_state.fault_led_on ? 1 : 0, - (unsigned int)controller.valid_streak) < 0) { + (unsigned int)controller.valid_streak) < 0) + { perror("Could not write CSV trace"); fclose(csv); return 1; @@ -129,12 +174,16 @@ int main(int argc, char *argv[]) { } } - if (csv != NULL) { - if (fclose(csv) != 0) { + if (csv != NULL) + { + if (fclose(csv) != 0) + { perror("Could not close CSV trace"); return 1; } + printf("CSV trace written to %s\n", argv[2]); } + return 0; -} +} \ No newline at end of file From f80928dea531d6278f14da6dcf88e1df91989616 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 4 Nov 2026 18:35:44 +0000 Subject: [PATCH 3/3] fix: satisfy cppcheck constParameter on main argv Co-authored-by: messak-amine <241373955+messak-amine@users.noreply.github.com> --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index fa940e4..4d2aea6 100644 --- a/src/main.c +++ b/src/main.c @@ -39,7 +39,7 @@ static const char *sensor_status_label(int16_t temp_c, bool sensor_ok) return "OK"; } -int main(int argc, char *const argv[]) +int main(int argc, const char *const argv[]) { FILE *csv = NULL;