Prototype
Math1Var_F32 (r, funcId)
Description
Math on a float variable.
r = operation(r);
Return
Nothing
Code Example
The following code example uses the Math1Var_F32 function.
The SMK900.evi file used for this example can be downloaded at the bottom of this page.
/* Example Code
* Math1Var_F32
*
* get buffer indexes r and funcId
* set buffer in memory
* operate
* if params used
* return result of funcId on 32 bits
* else
* return 0x00 (operation not ok) or 0x01 (operation ok) on 8 bits
*
* example VMExecuteCmd:
* cmd: |r |funcId|buffer
* 0xfb 0x0e 0x00 0x0c 0x00 0x0e [0x?? 0x?? 0x?? = macAdress] 0x00 0x00 0x04 0x00 0x00 0x00 0x3f
* rsp: 0xfb 0x08 0x00 0x2d 0x00 0xe1 0x1e 0x00 0x00 0x80 0xbf
*/
#include "SMK900.evi"
#define SENSORCODE 0x01
function exec_aircmd(){
local rxLen;
local useParams;
local r,funcId,val0,val1;
local i;
local result;
rxLen=GetAirBuf(0, 0, 20);
if(rxLen>=8){ // 1 byte for paketID + 7 bytes of payload (3 bytes for params and 4 bytes for buffer)
useParams=true;
r=GetBuffer_16(1);
funcId=GetBuffer_U8(3);
for(i=4;i<rxLen;i++){
SetBuffer(i-4,GetBuffer_S8(i),1);
}
}else{
useParams=false;
r=0;
funcId=0; // inv
val0=0x0000; // 0.5
val1=0x3f00;
//SetBuffer_16(0,valTest&0xFFFF);
//SetBuffer_16(2,(valTest>>16)&0xFFFF);
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
}
Math1Var_F32(r,funcId);
if(useParams){
SetBuffer_16(0,GetBuffer_16(r));
SetBuffer_16(2,GetBuffer_16(r+2));
Send(4);
}else{
result = 0;
if(GetBuffer_16(2)==0xbF00&&GetBuffer_16(0)==0x0000){ //inv(0.5)
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
funcId=1;
Math1Var_F32(r,funcId); // sqrt
if(GetBuffer_16(2)==0x3F35&&GetBuffer_16(0)==0x04F3){ //sqrt(0.5)
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
funcId=2;
Math1Var_F32(r,funcId); // sqrtrount
if(GetBuffer_16(2)==0x3F35&&GetBuffer_16(0)==0x04F3){ //sqrtrount(0.5)
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
funcId=3;
Math1Var_F32(r,funcId); // ln
if(GetBuffer_16(2)==0xBF31&&GetBuffer_16(0)==0x7218){ //ln(0.5)
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
funcId=4;
Math1Var_F32(r,funcId); // log2
if(GetBuffer_16(2)==0xBF80&&GetBuffer_16(0)==0x0000){ //log2(0.5)
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
funcId=5;
Math1Var_F32(r,funcId); // log10
if(GetBuffer_16(2)==0xBE9A&&GetBuffer_16(0)==0x209B){ //log10(0.5)
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
funcId=6;
Math1Var_F32(r,funcId); // exp
if(GetBuffer_16(2)==0x3FD3&&GetBuffer_16(0)==0x094C){ //exp(0.5)
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
funcId=7;
Math1Var_F32(r,funcId); // exp2
if(GetBuffer_16(2)==0x3FB5&&GetBuffer_16(0)==0x04F3){ //exp2(0.5)
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
funcId=8;
Math1Var_F32(r,funcId); // exp10
if(GetBuffer_16(2)==0x404A&&GetBuffer_16(0)==0x62C2){ //exp10(0.5)
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
funcId=9;
Math1Var_F32(r,funcId); // sin
if(GetBuffer_16(2)==0x3EF5&&GetBuffer_16(0)==0x7745){ //sin(0.5)
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
funcId=10;
Math1Var_F32(r,funcId); // cos
if(GetBuffer_16(2)==0x3F60&&GetBuffer_16(0)==0xA941){ //cos(0.5)
SetBuffer_16(0,val0);
SetBuffer_16(2,val1);
funcId=11;
Math1Var_F32(r,funcId); // tan
if(GetBuffer_16(2)==0x3F0B&&GetBuffer_16(0)==0xDA7B){ //tan(0.5)
result = 1;
SetBuffer(0,result,1);
Send(1);
}
}
}
}
}
}
}
}
}
}
}
}
if(result==0){
SetBuffer(0,result,1);
SetBuffer(1,funcId,1);
Send(2);
}
}
}
function main()
{
local execType;
execType = GetExecType();
if(execType==MESHEXECTYPE_AIRCMD_bm){
exec_aircmd();
}
}