#include "tmp_dcm.h" #include "windmisc.h" #include /* private functions: */ double raw_to_temperature(uchar c); double resistance_to_temperature(double r); /* returns thermister resistance given raw value */ double raw_to_resistance(uchar c) { return((double)c/255.*10.); } #define T0 79.7163 #define T1 -26.8341 #define T2 1.43978 #define T3 -.0445503 #define Rpar 10. /* returns temperature given thermister resistance */ double resistance_to_temperature(double r) { double x,t; r = 1./( 1./r - 1./Rpar); x = log(r); t = ( (T3 *x + T2) *x + T1) *x + T0; return(t); } #if 1 /* returns temperature (from logrithmic fit) given raw byte */ /* This is more accurate than the polynomial fit */ double raw_to_temperature(uchar c) { double r,t; if(c==0) return(100.); r = raw_to_resistance(c); t = resistance_to_temperature(r); return(t); } #else #define C0 153.7 #define C1 -3.9643 #define C2 .05863 #define C3 -.00045257 #define C4 .000001678 #define C5 -2.405e-9 /* returns temperature (from polynomial fit) given raw byte */ /* These should be the same coeffecients used by NASA */ double raw_to_temperature(uchar c) { double x,t; x = c; t = ((((C5*x+C4)*x+C3)*x+C2)*x+C1)*x+C0; return(t); } #endif /* The following are designed for batch mode... */ #if 1 #define TMP_ID KPD_ID #define OFFSET MAX_KPDBYTES #else #define TMP_ID HKP_ID #define OFFSET MAX_HKPBYTES #endif int decom_temperature(packet *pk,instrum_temperature *temp) { uchar *s; int offset; offset = OFFSET; s = pk->data + offset; temp->time = pk->time; /* the order of bytes may not be correct! */ temp->eesa_raw = s[0]; temp->pesa_raw = s[1]; temp->sst1_2_raw = s[2]; temp->sst3_raw = s[3]; temp->eesa = raw_to_temperature(s[0]); temp->pesa = raw_to_temperature(s[1]); temp->sst1_2 = raw_to_temperature(s[2]); temp->sst3 = raw_to_temperature(s[3]); return(1); }