kopia lustrzana https://github.com/rs1729/RS
Meisei: Verify parameter values
iMS-100 parameters must meet certain requirements for the temperature algorithm to work.pull/45/head
rodzic
4b4d8c0693
commit
ac134940b9
|
@ -250,6 +250,33 @@ static int get_w16(ui8_t *subframe_bits, int j) {
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
static int sanity_check_ims100_config_temperature(gpx_t *gpx) {
|
||||||
|
int result = 1;
|
||||||
|
float R_old = 0;
|
||||||
|
float T_old = INFINITY;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// All resistance values in the R-T interpolation table must be positive and monotonically increasing
|
||||||
|
for (i = 0; i < 12; i++) {
|
||||||
|
if (gpx->cfg[33+i] <= R_old) {
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
R_old = gpx->cfg[33+i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// All temperature values in the R-T interpolation table must be monotonically decreasing
|
||||||
|
for (i = 0; i < 12; i++) {
|
||||||
|
if (gpx->cfg[17+i] >= T_old) {
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
T_old = gpx->cfg[17+i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
|
@ -912,7 +939,8 @@ int main(int argc, char **argv) {
|
||||||
if (gpx.f_ref != 0) { // must know the reference frequency
|
if (gpx.f_ref != 0) { // must know the reference frequency
|
||||||
int T_cfg = ((gpx.cfg_valid & 0x01E01FFE1FFE0000LL) == 0x01E01FFE1FFE0000LL); // cfg[56:53,44:33,28:17]
|
int T_cfg = ((gpx.cfg_valid & 0x01E01FFE1FFE0000LL) == 0x01E01FFE1FFE0000LL); // cfg[56:53,44:33,28:17]
|
||||||
int U_cfg = ((gpx.cfg_valid & 0x001E000000000000LL) == 0x001E000000000000LL); // cfg[52:49]
|
int U_cfg = ((gpx.cfg_valid & 0x001E000000000000LL) == 0x001E000000000000LL); // cfg[52:49]
|
||||||
if (T_cfg) {
|
// Necessary parameters must exist and their values must ´meet the requirements
|
||||||
|
if (T_cfg && sanity_check_ims100_config_temperature(&gpx)) {
|
||||||
ui16_t t_raw = bits2val(subframe_bits+HEADLEN+2*46+17, 16);
|
ui16_t t_raw = bits2val(subframe_bits+HEADLEN+2*46+17, 16);
|
||||||
float f = ((float)t_raw / (float)gpx.f_ref) * 4.0f;
|
float f = ((float)t_raw / (float)gpx.f_ref) * 4.0f;
|
||||||
if (f > 1.0f) {
|
if (f > 1.0f) {
|
||||||
|
@ -929,11 +957,9 @@ int main(int argc, char **argv) {
|
||||||
} else {
|
} else {
|
||||||
// We now know that R is inside the interpolation range. Sampling points are
|
// We now know that R is inside the interpolation range. Sampling points are
|
||||||
// ordered by increasing resistance (decreasing temperature).
|
// ordered by increasing resistance (decreasing temperature).
|
||||||
|
// (We have verified this in the sanity check above.)
|
||||||
// Search for the interval that contains R, then interpolate linearly
|
// Search for the interval that contains R, then interpolate linearly
|
||||||
// (using log(R)).
|
// (using log(R)).
|
||||||
// NOTE: This assumes that the sonde sends the sampling points as described
|
|
||||||
// above. Shall we do a sanity check to confirm?
|
|
||||||
// For the time being, T=NAN in case the search doesn't find an interval.
|
|
||||||
for (j = 0; j < 11; j++) {
|
for (j = 0; j < 11; j++) {
|
||||||
if (R < gpx.cfg[34+j]) {
|
if (R < gpx.cfg[34+j]) {
|
||||||
f = (logf(R) - logf(gpx.cfg[33+j])) / (logf(gpx.cfg[34+j]) - logf(gpx.cfg[33+j]));
|
f = (logf(R) - logf(gpx.cfg[33+j])) / (logf(gpx.cfg[34+j]) - logf(gpx.cfg[33+j]));
|
||||||
|
|
Ładowanie…
Reference in New Issue