public override bool Recv(byte[] buf) {
//int oldSt=_st;
if(buf[0]==ADDR) {
if(buf[1]==0x10) {
if(_st==-3 && buf.Length==30) {
_dig_T1=(ushort)(buf[4] | (buf[5]<<8));
_dig_T2=(short)(buf[6] | (buf[7]<<8));
_dig_T3=(short)(buf[8] | (buf[9]<<8));
_dig_P1=(ushort)(buf[10] | (buf[11]<<8));
_dig_P2=(short)(buf[12] | (buf[13]<<8));
_dig_P3=(short)(buf[14] | (buf[15]<<8));
_dig_P4=(short)(buf[16] | (buf[17]<<8));
_dig_P5=(short)(buf[18] | (buf[19]<<8));
_dig_P6=(short)(buf[20] | (buf[21]<<8));
_dig_P7=(short)(buf[22] | (buf[23]<<8));
_dig_P8=(short)(buf[24] | (buf[25]<<8));
_dig_P9=(short)(buf[26] | (buf[27]<<8));
_dig_H1=buf[29];
_pt=DateTime.Now;
_st=-2;
} else if(_st==-1 && buf.Length==11) {
_dig_H2=(short)(buf[4] | (buf[5]<<8));
_dig_H3=buf[6];
_dig_H4=(short)((buf[7] << 4) | (buf[8] & 0x0F));
_dig_H5=(short)((buf[8] >> 4) | (buf[9]<<4));
_dig_H6=(sbyte)buf[10];
_pt=DateTime.Now;
_st=0;
} else if(_st==3 && buf.Length==12) {
uint adc_H = (uint)(buf[11] | (buf[10] << 8));
uint adc_T = (uint)((buf[9]>>4) | (buf[8]<<4) | (buf[7]<<12));
uint adc_P=(uint)((buf[6]>>4) | (buf[5]<<4) | (buf[4]<<12));
double var1, var2, t_fine;
var1=(adc_T/16384.0 - _dig_T1/1024.0) * _dig_T2;
var2=((adc_T/131072.0 - _dig_T1/8192.0) * (adc_T/131072.0 - _dig_T1/8192.0)) * _dig_T3;
t_fine = (int)(var1 + var2);
_T.value=Math.Round((var1 + var2) / 5120.0, 2);
var1 = t_fine/2.0 - 64000.0;
var2 = var1 * var1 * _dig_P6 / 32768.0;
var2 = var2 + var1 * _dig_P5 * 2.0;
var2 = var2/4.0+_dig_P4 * 65536.0;
var1 = (_dig_P3 * var1 * var1 / 524288.0 + _dig_P2 * var1) / 524288.0;
var1 = (1.0 + var1 / 32768.0)*_dig_P1;
if(var1 != 0.0) {
double p = 1048576.0 - (double)adc_P;
p = (p - (var2 / 4096.0)) * 6250.0 / var1;
var1 = _dig_P9 * p * p / 2147483648.0;
var2 = p * _dig_P8 / 32768.0;
p = p + (var1 + var2 + _dig_P7) / 16.0;
_P.value=(long)p;
}
var1 = t_fine - 76800.0;
var1 = (adc_H - (_dig_H4 * 64.0 + _dig_H5 / 16384.0 * var1)) * (_dig_H2 / 65536.0 * (1.0 + _dig_H6 / 67108864.0 * var1 * (1.0 + _dig_H3 / 67108864.0 * var1)));
var1 = var1 * (1.0 - _dig_H1 * var1 / 524288.0);
if(var1 > 100.0)
var1 = 100.0;
else if(var1 < 0.0)
var1 = 0.0;
_H.value=Math.Round(var1, 1);
//Log.Debug("{0} T={1}, H={2}, P={3}", _T.parent.path, _T.value, _H.value, _P.value);
_present.value=true;
_pt=DateTime.Now.AddSeconds(_rand.Next(45, 75));
_st=1;
} else {
_present.value=false;
Reset();
}
//if(oldSt!=_st) {
// Log.Debug("{0} st={1}", _T.parent.path, _st);
//}
} else {
_present.value=false;
if(TWIDriver._verbose) {
Log.Error("{0}.recv - {1}", _T.path, (AckFlags)buf[1]);
}
_pt=DateTime.Now.AddSeconds(_rand.Next(135, 165));
_st=-4;
}
return true;
}
return false;
}
public override bool Poll(out byte[] buf) {