rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
dynoview.cpp
Go to the documentation of this file.
1/*
2 * @file dynoview.cpp
3 *
4 * @date Jan 05, 2025
5 * @author Alexey Ershov, (c) 2012-2025
6 */
7
8#include "pch.h"
9
10#if EFI_DYNO_VIEW
11#include "dynoview.h"
12#include "fuel_math.h"
13
15{
16 if (isInitialized) {
17 return;
18 }
19 isInitialized = true;
20
21 //config->dynoSaeBaro = Sensor::get(SensorType::BarometricPressure).value_or(config->dynoSaeBaro);
22
24
25 saeVaporPressure = 6.1078f * pow(10.0f, (7.5f * (float)config->dynoSaeTemperatureC) / (237.3f + (float)config->dynoSaeTemperatureC)) * .02953f * ((float)config->dynoSaeRelativeHumidity / 100.0f);
26 saeBaroMmhg = 29.23f * (config->dynoSaeBaro / 100.0f);
28 saeTempCorrectionFactor = pow((((float)config->dynoSaeTemperatureC + C_K_OFFSET) / 298.0f), 0.5f);
30
31 reset();
32}
33
35{
36 init();
37
39 rpm = efiRound(rpm, 1.0);
40 int intRpm = (int)rpm;
41
43
44 if(intRpm > 0) {
45 efitimeus_t timeStamp = getTimeNowUs();
46 float timeInSec = (float)(timeStamp) / US_PER_SECOND;
47
48 onRpm(intRpm, timeInSec, tps);
49 }
50}
51
53{
57 count = 0;
58 count_rpm = 0;
59 currentTorque = 0;
60 currentHP = 0;
61}
62
63bool DynoView::onRpm(int rpm, float time, float tps)
64{
65 if(tps < dyno_view_tps_min_for_run || dynoViewPointPrev.tps - tps > dyno_view_tps_diff_to_reset_run) {
66 reset();
67 return false;
68 }
69
71 {
72 if(abs(rpm - prev_rpm) < 1) {
73 return false;
74 }
75 prev_rpm = rpm;
76
77 // more smoothly
79 {
80 return false;
81 }
82
83 int rpmDiffSmooth = abs(rpm - dynoViewPointPrev.rpm);
84
85 if(rpmDiffSmooth < dyno_view_rpm_diff_smooth) {
86 return false;
87 }
88
90 tail_rpm[0] = rpm;
91
92 count_rpm++;
93 int accumulate_window_size = std::min(count_rpm, dyno_view_window_size_rpm);
94 dynoViewPoint.rpm = (int)accumulate_window(accumulate_window_size, tail_rpm);
95
97 {
98 reset();
99 return false;
100 }
101
102 int rpmDiffStep = abs(dynoViewPoint.rpm - dynoViewPointPrev.rpm);
103
104 if (rpmDiffStep < config->dynoRpmStep)
105 {
106 return false;
107 }
108
109 } else {
110 dynoViewPoint.rpm = rpm;
111 }
112
113 //dynoViewPoint.rpm = rpm;
114 dynoViewPoint.time = time;
115 dynoViewPoint.tps = tps;
116
120 dynoViewPoint.mph = dynoViewPoint.vMs * 2.2369363;
121
123 {
126 if(dynoViewPoint.aMs2 < 0) {
128 }
131
133
139
142
145
147 ++count;
148 }
149
150 int accumulate_window_size = std::min(count, dyno_view_window_size);
151
152 currentTorque = accumulate_window(accumulate_window_size, tail_torque);
153 currentHP = accumulate_window(accumulate_window_size, tail_hp);
154
156 return true;
157 }
158
160
161 return false;
162}
163
165 return (int)engine->dynoInstance.currentHP;
166}
167
169 return (int)engine->dynoInstance.currentTorque;
170}
171
172/**
173 * Periodic update function called from SlowCallback.
174 */
178
179#endif /* EFI_DYNO_VIEW */
float currentHP
Definition dynoview.h:42
int count_rpm
Definition dynoview.h:80
int count
Definition dynoview.h:79
float saeCorrectionFactor
Definition dynoview.h:74
DynoPoint dynoViewPointPrev
Definition dynoview.h:77
float tail_torque[dyno_view_window_size]
Definition dynoview.h:92
float saeBaroMmhg
Definition dynoview.h:71
static constexpr int dyno_view_window_size_rpm
Definition dynoview.h:84
static constexpr float dyno_view_log_time_smooth_sec
Definition dynoview.h:87
static constexpr int dyno_view_rpm_diff_smooth
Definition dynoview.h:86
uint16_t wheelOverallDiameterMm
Definition dynoview.h:67
float airDensityKgM3
Definition dynoview.h:66
float currentTorque
Definition dynoview.h:41
DynoPoint dynoViewPoint
Definition dynoview.h:76
void reset()
Definition dynoview.cpp:52
static void move(uint8_t size, float *data)
Definition dynoview.h:48
float saeTempCorrectionFactor
Definition dynoview.h:72
float tail_hp[dyno_view_window_size]
Definition dynoview.h:91
bool isInitialized
Definition dynoview.h:95
static constexpr int dyno_view_window_size
Definition dynoview.h:83
bool onRpm(int rpm, float time, float tps)
Definition dynoview.cpp:63
float saeBaroCorrectionFactor
Definition dynoview.h:70
void update()
Definition dynoview.cpp:34
static constexpr int dyno_view_tps_diff_to_reset_run
Definition dynoview.h:88
void init()
Definition dynoview.cpp:14
static constexpr int dyno_view_rpm_fall_to_reset_run
Definition dynoview.h:89
int prev_rpm
Definition dynoview.h:81
float saeVaporPressure
Definition dynoview.h:73
static float accumulate_window(uint8_t size, const float *data)
Definition dynoview.h:55
float tail_rpm[dyno_view_window_size_rpm]
Definition dynoview.h:93
DynoView dynoInstance
Definition engine.h:131
static float getOrZero(SensorType type)
Definition sensor.h:83
int getDynoviewHP()
Definition dynoview.cpp:164
void updateDynoView()
Definition dynoview.cpp:175
int getDynoviewTorque()
Definition dynoview.cpp:168
float efiRound(float value, float precision)
Definition efilib.cpp:34
efitimeus_t getTimeNowUs()
Definition efitime.cpp:26
static EngineAccessor engine
Definition engine.h:413
static constexpr persistent_config_s * config
float tps
Definition dynoview.h:17
float torqueWheelNm
Definition dynoview.h:28
float torqueNm
Definition dynoview.h:29
float engineRps
Definition dynoview.h:19
float forceDragN
Definition dynoview.h:26
float aMs2
Definition dynoview.h:24
int rpm
Definition dynoview.h:15
float distanceM
Definition dynoview.h:23
float vMs
Definition dynoview.h:21
float hp
Definition dynoview.h:31
float mph
Definition dynoview.h:22
float torqueLbFt
Definition dynoview.h:30
float forceTotalN
Definition dynoview.h:27
float time
Definition dynoview.h:16
float axleRps
Definition dynoview.h:20
float forceN
Definition dynoview.h:25