Prototype
LinInterpol_F32 (rStart, rEnd, val)
Description
Linear interpolation. The array of points (8 bytes for each point, two floats, x and y) is determined by the positions rStart and rEnd (inclusive).
The x coords must be monotonically increasing and x1. . . xn must never be the same values.
r is the buffer position used for the interpolation location value and for the result.
Return
Nothing
Code Example
The following code example uses the LinInterpol_F32 function.
The SMK900.evi file used for this example can be downloaded at the bottom of this page.
/* Example Code
* LinInterpol_F32
*
* get buffer indexes r1, r2 and idx
* set buffer in memory
* interpol value at idx
* return 0x00 (lookup pas ok) or 0x01 (lookup ok)
*
* pas de mode avec commande parametrable car ça ne fit pas dans la limite des 20 bytes
*/
#include "SMK900.evi"
#define SENSORCODE 0x01
function exec_aircmd(){
local rxLen;
local useParams;
local r1,r2,idx;
local i;
local result;
rxLen=GetAirBuf(0, 0, 20);
/*if(rxLen>=20){ // 1 byte for paketID + 19 bytes of payload (3 bytes for indexes and minimum 16 bytes for buffer)
useParams=true;
r1=GetBuffer_S8(1);
r2=GetBuffer_S8(2);
idx=GetBuffer_S8(3);
for(i=4;i<rxLen;i++){
SetBuffer(i-4,GetBuffer_S8(i),1);
}
}else{*/
useParams=false;
r1=4;
r2=12;
idx=0;
SetBuffer_16(0,0x0000); // 2
SetBuffer_16(2,0x4000);
SetBuffer_16(4,0x0000); // 1
SetBuffer_16(6,0x3F80);
SetBuffer_16(8,0x0000); // -1
SetBuffer_16(10,0xBF80);
SetBuffer_16(12,0x0000); // 5
SetBuffer_16(14,0x40A0);
SetBuffer_16(16,0x0000); // -5
SetBuffer_16(18,0xC0A0);
/*}*/
LinInterpol_F32(idx,r1,r2);
/*if(useParams){
SetBuffer_16(0,GetBuffer_16(idx));
SetBuffer_16(2,GetBuffer_16(idx+2));
Send(4);
}else{*/
if(GetBuffer_16(2)==0xC000&&GetBuffer_16(0)==0x0000){
result = 1;
}else{
result = 0;
}
SetBuffer(0,result,1);
Send(1);
/*}*/
}
function main()
{
local execType;
execType = GetExecType();
if(execType==MESHEXECTYPE_AIRCMD_bm){
exec_aircmd();
}
}