aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorJulian Picht <julian.picht@gmail.com>2016-12-20 21:32:44 +0100
committerJulian Picht <julian.picht@gmail.com>2016-12-20 21:32:44 +0100
commita95737952d4fbb658b6de3bec312109b56caf6a6 (patch)
tree8012b1a602528ae873d2793a2bc571e148a764e6 /tools
parent6fbf801a0a1181861f82eab5af738a4290b21978 (diff)
downloadlibsurvive-a95737952d4fbb658b6de3bec312109b56caf6a6.tar.gz
libsurvive-a95737952d4fbb658b6de3bec312109b56caf6a6.tar.bz2
hacked in my disambiguator
Diffstat (limited to 'tools')
-rw-r--r--tools/disambiguate/Makefile2
-rw-r--r--tools/disambiguate/disambiguate.c138
2 files changed, 9 insertions, 131 deletions
diff --git a/tools/disambiguate/Makefile b/tools/disambiguate/Makefile
index e719469..8e8661c 100644
--- a/tools/disambiguate/Makefile
+++ b/tools/disambiguate/Makefile
@@ -1,4 +1,4 @@
-disambiguate: disambiguate.c
+disambiguate: disambiguate.c ../../src/disambiguator.c
gcc -Wall -Wextra -Werror -g -o $@ $^ -lm
test: disambiguate
diff --git a/tools/disambiguate/disambiguate.c b/tools/disambiguate/disambiguate.c
index 9a52c16..dcaf9d8 100644
--- a/tools/disambiguate/disambiguate.c
+++ b/tools/disambiguate/disambiguate.c
@@ -2,134 +2,7 @@
#include <stdlib.h>
#include <string.h>
#include <math.h>
-
-#define DIS_NUM_VALUES 64
-
-typedef enum {
- D_SYNC_J0 = 0,
- D_SYNC_K0 = 1,
- D_SYNC_J1 = 2,
- D_SYNC_K1 = 3,
- D_SYNC_J2 = 4,
- D_SYNC_K2 = 5,
- D_SYNC_J3 = 6,
- D_SYNC_K3 = 7,
-} sync_pulse;
-
-typedef enum {
- D_STATE_INVALID = 0,
- D_STATE_LOCKED = 1,
- D_STATE_UNLOCKED = -1,
-} dis_state;
-
-typedef enum {
- P_UNKNOWN = 0,
- P_SYNC = 1,
- P_SWEEP = 2,
-} pulse_type;
-
-typedef struct disambiguator_ {
- long times[DIS_NUM_VALUES];
- int scores[DIS_NUM_VALUES];
- dis_state state;
- long last;
- int max_confidence;
-} disambiguator;
-
-typedef struct classified_pulse_ {
- pulse_type t;
- int length;
-} classified_pulse;
-
-void disambiguator_init(disambiguator * d) {
- memset(&(d->times), 0x0, sizeof(d->times));
- memset(&(d->scores), 0x0, sizeof(d->times));
- d->state = D_STATE_UNLOCKED;
- d->last = 0;
- d->max_confidence = 0;
-}
-
-void disambiguator_discard(disambiguator * d, long age) {
- int confidence = 0;
- for (unsigned int i = 0; i < DIS_NUM_VALUES; ++i) {
- if (d->times[i] != 0 && d->times[i] < age) {
- d->times[i] = 0;
- d->scores[i] = 0;
- } else {
- if (d->scores[i] > confidence) {
- confidence = d->scores[i];
- }
- }
- }
- d->max_confidence = confidence;
-}
-
-int disambiguator_find_nearest(disambiguator * d, long time, int max_diff) {
- int diff = max_diff; // max allowed diff for a match
- int idx = -1;
- for (unsigned int i = 0; i < DIS_NUM_VALUES; ++i) {
- if (d->times[i] == 0) continue;
-
- int a = abs(d->times[i] - time);
- if (a < diff) {
- idx = i;
- diff = a;
- }
- }
-
- return idx;
-}
-
-pulse_type disambiguator_step(disambiguator * d, long time, int length) {
- if (length < 2750) {
- return d->state == D_STATE_LOCKED ? P_SWEEP : P_UNKNOWN;
- }
-
- disambiguator_discard(d, time - 10000000);
- int idx = disambiguator_find_nearest(d, time - 400000, 100);
-
- if (time - d->last > 401000) {
- d->state = D_STATE_UNLOCKED;
- }
-
- if (idx == -1) {
- for (int i = 0; i < DIS_NUM_VALUES; ++i) {
- if (d->times[i] == 0) {
- d->times[i] = time;
- break;
- }
- }
-
- return d->state == D_STATE_LOCKED ? P_SWEEP : P_UNKNOWN;
- } else {
- // double l = length;
- // char cc = round(l / 500) - 6;
- // printf("MATCH: %li %d %d (0b%d%d%d)\n", time - d->times[idx], d->scores[idx], length, (cc >> 2) & 0x1, (cc >> 1) & 0x1, cc & 0x1);
- d->scores[idx]++;
- if (d->scores[idx] >= 30) {
- d->state = D_STATE_LOCKED;
- // printf("MATCH: %li %d\n", time - d->times[idx], scores[idx]);
- }
-/*
- for (unsigned int i = 0; i < DIS_NUM_VALUES; ++i) {
- if (d->scores[i] > 0 && d->times[i] != 0)
- printf("TS %2d %li %d\n", i, d->times[i], d->scores[i]);
- }
-*/
- d->times[idx] = time;
- d->last = time;
- return d->state == D_STATE_LOCKED ? (
- d->scores[idx] >= d->max_confidence ? P_SYNC : P_SWEEP
- ) : P_UNKNOWN;
- }
-
- return d->state == D_STATE_LOCKED ? P_SWEEP : P_UNKNOWN;
-}
-
-sync_pulse length_to_pulse(int length) {
- double l = length - 3000;
- return round(l/500);
-}
+#include "../../include/disambiguator.h"
int main() {
@@ -139,7 +12,7 @@ int main() {
return -1;
}
- long last = 0;
+ long last = 0, lastl = 0;
disambiguator d;
disambiguator_init(&d);
@@ -153,6 +26,10 @@ int main() {
if (fscanf(f, "%s %d %d %d %li", controller, &sensor, &unknown, &length, &time) != 5) {
break;
}
+ if (lastl > time) {
+ printf("BACKWARDS: %li %li\n", lastl, time);
+ }
+ lastl = time;
switch (disambiguator_step(&d, time, length)) {
default:
@@ -163,7 +40,8 @@ int main() {
{
double l = length;
char cc = round(l / 500) - 6;
- printf("SYNC %s %2d %10li %c%d %10li\n", controller, sensor, time, cc & 0x1 ? 'j' : 'k', (cc >> 1) & 0x3, time-last);
+ int ll = (length+125)/250;
+ printf("SYNC %s %2d %10li %5d %c%d %10li %d %d\n", controller, sensor, time, length, (cc & 0x1) ? 'k' : 'j', (cc >> 1) & 0x3, time-last, ll & 1, (ll >> 1) - 6);
last = time;
}
continue;