diff options
author | CNLohr <charles@cnlohr.com> | 2016-12-19 23:06:40 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-19 23:06:40 -0500 |
commit | 689ab79972b969f6eff4adcfca71fec567006e93 (patch) | |
tree | 8990cfd9bdfd4c9f7b3043636f26659d96b11c84 /tools/disambiguate | |
parent | fd03e41bb541807ca441f77d36f2898c0ef01045 (diff) | |
parent | ac7e398c5d81efda7c5427ca9ca19b44cc945b22 (diff) | |
download | libsurvive-689ab79972b969f6eff4adcfca71fec567006e93.tar.gz libsurvive-689ab79972b969f6eff4adcfca71fec567006e93.tar.bz2 |
Merge pull request #9 from jpicht/disambiguate
Disambiguate
Diffstat (limited to 'tools/disambiguate')
-rw-r--r-- | tools/disambiguate/.gitignore | 2 | ||||
-rw-r--r-- | tools/disambiguate/Makefile | 5 | ||||
-rw-r--r-- | tools/disambiguate/disambiguate.c | 90 |
3 files changed, 97 insertions, 0 deletions
diff --git a/tools/disambiguate/.gitignore b/tools/disambiguate/.gitignore new file mode 100644 index 0000000..22f3a02 --- /dev/null +++ b/tools/disambiguate/.gitignore @@ -0,0 +1,2 @@ +disambiguate +raw_light_data_from_watchman.csv diff --git a/tools/disambiguate/Makefile b/tools/disambiguate/Makefile new file mode 100644 index 0000000..dd5a42b --- /dev/null +++ b/tools/disambiguate/Makefile @@ -0,0 +1,5 @@ +disambiguate: disambiguate.c + gcc -g -o $@ $^ -lm + +test: disambiguate + ./disambiguate | head -n 100 diff --git a/tools/disambiguate/disambiguate.c b/tools/disambiguate/disambiguate.c new file mode 100644 index 0000000..30034f9 --- /dev/null +++ b/tools/disambiguate/disambiguate.c @@ -0,0 +1,90 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +long times[64]; +int scores[64]; + +void discard(long age) { + for (int i = 0; i < sizeof(times)/sizeof(times[0]); ++i) { + if (times[i] != 0 && times[i] < age) { + times[i] = 0; + scores[i] = 0; + } + } +} + +int findNearest(long time) { + int diff = 1000; // max allowed diff for a match + int idx = -1; + for (int i = 0; i < sizeof(times)/sizeof(times[0]); ++i) { + if (times[i] == 0) continue; + + int a = abs(times[i] - time); + if (a < diff) { + idx = i; + diff = a; + } + + } + + //printf("DIFF: %d %d\n", diff, idx); + + return idx; +} + +int main() { + + FILE * f = fopen( "raw_light_data_from_watchman.csv", "r" ); + if (f == NULL) { + fprintf(stderr, "ERROR OPENING INPUT FILE\n"); + return -1; + } + memset(×, 0, sizeof( times )); + memset(&scores, 0, sizeof( scores )); + + long offset = 0, last = 0; + + for (;;) { + char controller[10]; + int sensor; + int unknown; + int length; + long time; + if (fscanf(f, "%s %d %d %d %li", controller, &sensor, &unknown, &length, &time) != 5) { + break; + } + /*if (time - last < 10000) { + offset += 0x100000000; + }*/ + time += offset; + last = time; + + if (length < 2750) continue; + + discard(time - 10000000); + int idx = findNearest(time - 800000); + if (idx == -1) { + for (int i = 0; i < sizeof(times)/sizeof(times[0]); ++i) { + if (times[i] == 0) { +// printf("ADD: %d %li\n", i, time); + times[i] = time; + break; + } + } + } else { + double l = length; + char cc = round(l / 500) - 6; + printf("MATCH: %li %d %d (0b%d%d%d)\n", time - times[idx], scores[idx], length, (cc >> 2) & 0x1, (cc >> 1) & 0x1, cc & 0x1); + scores[idx]++; + if (scores[idx] >= 30) { + printf("MATCH: %li %d\n", time - times[idx], scores[idx]); + return 0; + } + times[idx] = time; + } + } + fclose(f); +} + |