Math1VarExt_F32

You are here:
Estimated reading time: 1 min
Go back to the VM operations list

Prototype

Math1VarExt_F32 (r1, rIn, funcId)

Description

Math on a float variables.

r = operation(rIn);

Return
Nothing

Code Example

The following code example uses the Math1VarExt_F32 function.

The SMK900.evi file used for this example can be downloaded at the bottom of this page.
/* Example Code
* Math1VarExt_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        |rIn      |funcId|buffer
*		0xfb 0x0e 0x00 0x0c 0x00 0x0e [0x?? 0x?? 0x?? = macAdress] 0x00 0x00 0x04 0x00 0x04 0x00 0x00 0x00 0x00 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,rIn,funcId,val0,val1;
	local i;
	local result;

	rxLen=GetAirBuf(0, 0, 20);
	
	if(rxLen>=14){ // 1 byte for paketID + 13 bytes of payload (5 bytes for params and 8 bytes for buffer)
		useParams=true;
		r=GetBuffer_16(1);
		rIn=GetBuffer_16(3);
		funcId=GetBuffer_U8(5);
		for(i=6;i<rxLen;i++){
			SetBuffer(i-6,GetBuffer_S8(i),1);
		}
	}else{
		useParams=false;
		r=0;
		rIn=4;
		funcId=0; 		// inv
		val0=0x0000; 	// 0.5
		val1=0x3f00;
		//SetBuffer_16(0,valTest&0xFFFF);
		//SetBuffer_16(2,(valTest>>16)&0xFFFF);
		SetBuffer_16(4,val0);
		SetBuffer_16(6,val1);
	}
	
	Math1VarExt_F32(r,rIn,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(4,val0);
			SetBuffer_16(6,val1);
			funcId=1;
			Math1VarExt_F32(0,4,funcId); 	// sqrt
			if(GetBuffer_16(2)==0x3F35&&GetBuffer_16(0)==0x04F3){ //sqrt(0.5)
				SetBuffer_16(4,val0);
				SetBuffer_16(6,val1);
				funcId=2;
				Math1VarExt_F32(0,4,funcId); 	// sqrtrount
				if(GetBuffer_16(2)==0x3F35&&GetBuffer_16(0)==0x04F3){ //sqrtrount(0.5)
					SetBuffer_16(4,val0);
					SetBuffer_16(6,val1);
					funcId=3;
					Math1VarExt_F32(0,4,funcId); 	// ln
					if(GetBuffer_16(2)==0xBF31&&GetBuffer_16(0)==0x7218){ //ln(0.5)
						SetBuffer_16(4,val0);
						SetBuffer_16(6,val1);
						funcId=4;
						Math1VarExt_F32(0,4,funcId); 	// log2
						if(GetBuffer_16(2)==0xBF80&&GetBuffer_16(0)==0x0000){ //log2(0.5)
							SetBuffer_16(4,val0);
							SetBuffer_16(6,val1);
							funcId=5;
							Math1VarExt_F32(0,4,funcId); 	// log10
							if(GetBuffer_16(2)==0xBE9A&&GetBuffer_16(0)==0x209B){ //log10(0.5)
								SetBuffer_16(4,val0);
								SetBuffer_16(6,val1);
								funcId=6;
								Math1VarExt_F32(0,4,funcId); 	// exp
								if(GetBuffer_16(2)==0x3FD3&&GetBuffer_16(0)==0x094C){ //exp(0.5)
									SetBuffer_16(4,val0);
									SetBuffer_16(6,val1);
									funcId=7;
									Math1VarExt_F32(0,4,funcId); 	// exp2
									if(GetBuffer_16(2)==0x3FB5&&GetBuffer_16(0)==0x04F3){ //exp2(0.5)
										SetBuffer_16(4,val0);
										SetBuffer_16(6,val1);
										funcId=8;
										Math1VarExt_F32(0,4,funcId); 	// exp10
										if(GetBuffer_16(2)==0x404A&&GetBuffer_16(0)==0x62C2){ //exp10(0.5)
											SetBuffer_16(4,val0);
											SetBuffer_16(6,val1);
											funcId=9;
											Math1VarExt_F32(0,4,funcId); 	// sin
											if(GetBuffer_16(2)==0x3EF5&&GetBuffer_16(0)==0x7745){ //sin(0.5)
												SetBuffer_16(4,val0);
												SetBuffer_16(6,val1);
												funcId=10;
												Math1VarExt_F32(0,4,funcId); 	// cos
												if(GetBuffer_16(2)==0x3F60&&GetBuffer_16(0)==0xA941){ //cos(0.5)
													SetBuffer_16(4,val0);
													SetBuffer_16(6,val1);
													funcId=11;
													Math1VarExt_F32(0,4,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();
	}
}

Go back to the VM operations list

Attachments

Was this article helpful?
Dislike 0
Views: 57
Go to Top