建立 MAG160C 逆向工程交接仓库
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
/* Temperature conversion tests against the recovered CFunctions math. */
|
||||
#include "mag160c/mag160c.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
static void test_calibrate_band_select(void) {
|
||||
const uint16_t frame[4] = {1000, 2000, 3000, 4000};
|
||||
const int16_t thresh[4] = {5, 5, 5, 5};
|
||||
const uint16_t pwl[16] = {
|
||||
0, 100, 0, 100, 0, 100, 0, 100,
|
||||
0, 200, 0, 200, 0, 200, 0, 200,
|
||||
};
|
||||
mag160c_temp_tables_t t;
|
||||
memset(&t, 0, sizeof(t));
|
||||
t.thresholds = thresh;
|
||||
t.pwl = pwl;
|
||||
t.pixel_count = 4;
|
||||
t.band_count = 2;
|
||||
|
||||
uint16_t out[4];
|
||||
mag160c_temp_calibrate(frame, &t, out);
|
||||
/* diff = frame>>1 = 500..2000 all > 5 -> band 1 -> 200 */
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
assert(out[i] == 200);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_calibrate_interp_clamp(void) {
|
||||
const uint16_t frame[2] = {2000, 0x8000};
|
||||
const uint16_t baseline[2] = {0, 0x100};
|
||||
const int16_t thresh[2] = {500, 500};
|
||||
const uint16_t pwl[8] = {
|
||||
0x1000, 1000, 0x1000, 1000,
|
||||
0x0100, 2000, 0x0100, 2000,
|
||||
};
|
||||
mag160c_temp_tables_t t;
|
||||
memset(&t, 0, sizeof(t));
|
||||
t.thresholds = thresh;
|
||||
t.pwl = pwl;
|
||||
t.pixel_count = 2;
|
||||
t.band_count = 2;
|
||||
t.baseline = baseline;
|
||||
t.has_baseline = 1;
|
||||
|
||||
uint16_t out[2];
|
||||
mag160c_temp_calibrate(frame, &t, out);
|
||||
assert(out[0] == 2062); /* 2000 + (1000*256>>12) */
|
||||
assert(out[1] == 3016); /* 2000 + (16256*256>>12) */
|
||||
|
||||
/* negative diff: (int16)(100-200)>>1 = -50 -> 1000 + (-50*4096>>12) = 950 */
|
||||
const uint16_t f2[1] = {100};
|
||||
const uint16_t b2[1] = {200};
|
||||
mag160c_temp_tables_t t2;
|
||||
memset(&t2, 0, sizeof(t2));
|
||||
t2.thresholds = thresh;
|
||||
t2.pwl = pwl;
|
||||
t2.pixel_count = 1;
|
||||
t2.band_count = 2;
|
||||
t2.baseline = b2;
|
||||
t2.has_baseline = 1;
|
||||
uint16_t out2[1];
|
||||
mag160c_temp_calibrate(f2, &t2, out2);
|
||||
assert(out2[0] == 950);
|
||||
}
|
||||
|
||||
static void test_convert_response(void) {
|
||||
const uint16_t frame[4] = {100, 200, 300, 400};
|
||||
const uint16_t baseline[4] = {0, 0, 0, 0};
|
||||
mag160c_temp_gain_t cfg;
|
||||
memset(&cfg, 0, sizeof(cfg));
|
||||
cfg.gain = 0;
|
||||
cfg.shift = 0;
|
||||
cfg.coeff = 4;
|
||||
cfg.baseline = baseline;
|
||||
|
||||
uint16_t out[4];
|
||||
uint32_t sat = mag160c_temp_convert_response(frame, 4, &cfg, out);
|
||||
/* base = (50000-0)>>0 = 50000 (< 0xffff, not clamped); v = 50000 + diff*4 */
|
||||
assert(sat == 0);
|
||||
assert(out[0] == 50400 && out[1] == 50800 && out[2] == 51200 && out[3] == 51600);
|
||||
|
||||
mag160c_temp_gain_t cfg2;
|
||||
memset(&cfg2, 0, sizeof(cfg2));
|
||||
cfg2.gain = 49900; /* base = (50000-49900)>>0 = 100 */
|
||||
cfg2.shift = 0;
|
||||
cfg2.coeff = 1;
|
||||
cfg2.baseline = NULL;
|
||||
sat = mag160c_temp_convert_response(frame, 4, &cfg2, out);
|
||||
assert(sat == 0);
|
||||
assert(out[0] == 200 && out[1] == 300 && out[2] == 400 && out[3] == 500);
|
||||
}
|
||||
|
||||
static void test_t2e(void) {
|
||||
/* index 0 = value where (v+0xc350)>>13 == 0 -> v = -0xc350 */
|
||||
assert(mag160c_temp_t2e_interp(-0xc350) == 1000);
|
||||
/* at -0xc350 + 8192, idx=1 -> 0x4d3 = 1235 */
|
||||
assert(mag160c_temp_t2e_interp(-0xc350 + 8192) == 0x4d3);
|
||||
/* monotonic curve sanity (avoid int32 overflow; vendor math wraps) */
|
||||
const int32_t a = mag160c_temp_t2e_interp(-0xc350);
|
||||
const int32_t b = mag160c_temp_t2e_interp(0x40000);
|
||||
assert(a < b);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
test_calibrate_band_select();
|
||||
test_calibrate_interp_clamp();
|
||||
test_convert_response();
|
||||
test_t2e();
|
||||
printf("test_temp: all passed\n");
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user