16#include <rusefi/interpolation.h>
23#define CLT_CURVE_RANGE_FROM -40
27 virtual float getValue(
float xColumn,
float yRow)
const = 0;
42template<
int TColNum,
int TRowNum,
typename TValue,
typename TXColumn,
typename TRow>
48 template <
typename TValueInit,
typename TXColumnInit,
typename TRowInit>
49 void initTable(TValueInit (&table)[TRowNum][TColNum],
50 const TXColumnInit (&columnBins)[TColNum],
const TRowInit (&rowBins)[TRowNum]) {
59 float getValue(
float xColumn,
float yRow)
const final {
61 criticalError(
"Access to uninitialized table: %s",
m_name);
74 for (
size_t r = 0; r < TRowNum; r++) {
75 for (
size_t c = 0; c < TColNum; c++) {
82 template <
int TMult,
int TDiv>
83 void initValues(scaled_channel<TValue, TMult, TDiv> (&table)[TRowNum][TColNum]) {
84 m_values =
reinterpret_cast<TValue (*)[TRowNum][TColNum]
>(&table);
93 template <
int TRowMult,
int TRowDiv>
94 void initRows(
const scaled_channel<TRow, TRowMult, TRowDiv> (&rowBins)[TRowNum]) {
95 m_rowBins =
reinterpret_cast<const TRow (*)[TRowNum]
>(&rowBins);
99 void initRows(
const TRow (&rowBins)[TRowNum]) {
104 template <
int TColMult,
int TColDiv>
105 void initCols(
const scaled_channel<TXColumn, TColMult, TColDiv> (&columnBins)[TColNum]) {
106 m_columnBins =
reinterpret_cast<const TXColumn (*)[TColNum]
>(&columnBins);
110 void initCols(
const TXColumn (&columnBins)[TColNum]) {
119 return row * TColNum + column;
147template<
typename TValue,
int TSize>
148void setLinearCurve(TValue (&array)[TSize],
float from,
float to,
float precision = 0.01f) {
149 for (
int i = 0; i < TSize; i++) {
150 float value =
interpolateMsg(
"setLinearCurve", 0, from, TSize - 1, to, i);
155 array[i] =
efiRound(value, precision);
159template<
typename TValue,
int TSize>
161 for (
int i = 0; i < TSize; i++) {
166template <
typename TElement,
typename VElement,
size_t N,
size_t M>
167constexpr void setTable(TElement (&dest)[N][M],
const VElement value) {
168 for (
size_t n = 0; n < N; n++) {
169 for (
size_t m = 0; m < M; m++) {
175template <
typename TDest,
typename TSource,
size_t N,
size_t M>
176constexpr void copyTable(TDest (&dest)[N][M],
const TSource (&source)[N][M],
float multiply = 1.0f) {
177 for (
size_t n = 0; n < N; n++) {
178 for (
size_t m = 0; m < M; m++) {
179 dest[n][m] = source[n][m] * multiply;
184template <
typename TDest,
typename TSource,
size_t N,
size_t M>
187 const std::array<std::array<TSource, M>, N>& source,
188 float multiply = 1.0f
190 for (
size_t n = 0; n < N; n++) {
191 for (
size_t m = 0; m < M; m++) {
192 dest[n][m] = source[n][m] * multiply;
198template <
typename TDest,
size_t N,
size_t M>
199constexpr void copyTable(scaled_channel<TDest, 1, 1> (&dest)[N][M],
const TDest (&source)[N][M]) {
200 memcpy(dest, source, N * M *
sizeof(TDest));
203template <
typename TDest,
size_t N,
size_t M>
204constexpr void copyTable(TDest (&dest)[N][M],
const TDest (&source)[N][M]) {
205 memcpy(dest, source, N * M *
sizeof(TDest));
208template<
typename kType>
210 array[0] = idleRpm - 150;
211 int rpmStep = (int)(
efiRound((topRpm - idleRpm) / (
size - 2), 50) - 150);
212 for (
int i = 1; i <
size - 1;i++)
213 array[i] = idleRpm + rpmStep * (i - 1);
214 array[
size - 1] = topRpm;
220template<
typename TValue,
int TSize>
222 setRpmBin(array, TSize, 800, DEFAULT_RPM_AXIS_HIGH_VALUE);
static size_t getIndexForCoordinates(size_t row, size_t column)
void initCols(const scaled_channel< TXColumn, TColMult, TColDiv >(&columnBins)[TColNum])
void initValues(scaled_channel< TValue, TMult, TDiv >(&table)[TRowNum][TColNum])
float getValue(float xColumn, float yRow) const final
TValue getValueAtPosition(size_t row, size_t column) const
const TXColumn(* m_columnBins)[TColNum]
void initRows(const scaled_channel< TRow, TRowMult, TRowDiv >(&rowBins)[TRowNum])
void initValues(TValue(&table)[TRowNum][TColNum])
void initTable(TValueInit(&table)[TRowNum][TColNum], const TXColumnInit(&columnBins)[TColNum], const TRowInit(&rowBins)[TRowNum])
TValue(* m_values)[TRowNum][TColNum]
const TRow(* m_rowBins)[TRowNum]
void setAll(TValue value)
void initRows(const TRow(&rowBins)[TRowNum])
void initCols(const TXColumn(&columnBins)[TColNum])
virtual float getValue(float xColumn, float yRow) const =0
float interpolateMsg(const char *msg, float x1, float y1, float x2, float y2, float x)
Linear interpolation by two points.
float efiRound(float value, float precision)
static constexpr float asFloat()
constexpr void copyTable(TDest(&dest)[N][M], const TSource(&source)[N][M], float multiply=1.0f)
Map3D< PEDAL_TO_TPS_RPM_SIZE, PEDAL_TO_TPS_SIZE, uint8_t, uint8_t, uint8_t > pedal2tps_t
Map3D< MAP_EST_RPM_COUNT, MAP_EST_LOAD_COUNT, uint16_t, uint16_t, uint16_t > mapEstimate_Map3D_t
constexpr void setTable(TElement(&dest)[N][M], const VElement value)
void setRpmBin(kType array[], int size, float idleRpm, float topRpm)
void setRpmTableBin(TValue(&array)[TSize])
Map3D< VE_RPM_COUNT, VE_LOAD_COUNT, uint16_t, uint16_t, uint16_t > ve_Map3D_t
void setLinearCurve(TValue(&array)[TSize], float from, float to, float precision=0.01f)
void setArrayValues(TValue(&array)[TSize], float value)