bancada-motores/Control/VF Control/slprj/speedgoat/_sharedutils/look1_pbinlxpw.cpp
Pedro Jose Romero Gombau 447269b383 Si
2024-10-28 11:36:48 +01:00

82 lines
2.3 KiB
C++

/*
* look1_pbinlxpw.cpp
*
* Academic License - for use in teaching, academic research, and meeting
* course requirements at degree granting institutions only. Not for
* government, commercial, or other organizational use.
*
* Code generation for model "VFControl".
*
* Model version : 1.1
* Simulink Coder version : 24.1 (R2024a) 19-Nov-2023
* C++ source code generated on : Wed Oct 16 10:45:53 2024
* Created for block: VFControl
*/
#include "look1_pbinlxpw.h"
#include "rtwtypes.h"
real_T look1_pbinlxpw(real_T u0, const real_T bp0[], const real_T table[],
uint32_T prevIndex[], uint32_T maxIndex)
{
real_T frac;
real_T yL_0d0;
uint32_T bpIdx;
/* Column-major Lookup 1-D
Search method: 'binary'
Use previous index: 'on'
Interpolation method: 'Linear point-slope'
Extrapolation method: 'Linear'
Use last breakpoint for index at or above upper limit: 'off'
Remove protection against out-of-range input in generated code: 'off'
*/
/* Prelookup - Index and Fraction
Index Search method: 'binary'
Extrapolation method: 'Linear'
Use previous index: 'on'
Use last breakpoint for index at or above upper limit: 'off'
Remove protection against out-of-range input in generated code: 'off'
*/
if (u0 <= bp0[0U]) {
bpIdx = 0U;
frac = (u0 - bp0[0U]) / (bp0[1U] - bp0[0U]);
} else if (u0 < bp0[maxIndex]) {
uint32_T found;
uint32_T iLeft;
uint32_T iRght;
/* Binary Search using Previous Index */
bpIdx = prevIndex[0U];
iLeft = 0U;
iRght = maxIndex;
found = 0U;
while (found == 0U) {
if (u0 < bp0[bpIdx]) {
iRght = bpIdx - 1U;
bpIdx = ((bpIdx + iLeft) - 1U) >> 1U;
} else if (u0 < bp0[bpIdx + 1U]) {
found = 1U;
} else {
iLeft = bpIdx + 1U;
bpIdx = ((bpIdx + iRght) + 1U) >> 1U;
}
}
frac = (u0 - bp0[bpIdx]) / (bp0[bpIdx + 1U] - bp0[bpIdx]);
} else {
bpIdx = maxIndex - 1U;
frac = (u0 - bp0[maxIndex - 1U]) / (bp0[maxIndex] - bp0[maxIndex - 1U]);
}
prevIndex[0U] = bpIdx;
/* Column-major Interpolation 1-D
Interpolation method: 'Linear point-slope'
Use last breakpoint for index at or above upper limit: 'off'
Overflow mode: 'portable wrapping'
*/
yL_0d0 = table[bpIdx];
return (table[bpIdx + 1U] - yL_0d0) * frac + yL_0d0;
}