From a95737952d4fbb658b6de3bec312109b56caf6a6 Mon Sep 17 00:00:00 2001 From: Julian Picht Date: Tue, 20 Dec 2016 21:32:44 +0100 Subject: hacked in my disambiguator --- src/disambiguator.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/disambiguator.c (limited to 'src/disambiguator.c') diff --git a/src/disambiguator.c b/src/disambiguator.c new file mode 100644 index 0000000..9b55fa4 --- /dev/null +++ b/src/disambiguator.c @@ -0,0 +1,83 @@ +#include "../include/disambiguator.h" +#include +#include + +void disambiguator_init(disambiguator * d) { + memset(&(d->times), 0x0, sizeof(d->times)); + memset(&(d->scores), 0x0, sizeof(d->scores)); + d->state = D_STATE_UNLOCKED; + d->last = 0; + d->max_confidence = 0; +} + +inline void disambiguator_discard(disambiguator * d, long age); + +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; +} + +inline int disambiguator_find_nearest(disambiguator * d, long time, int max_diff); + +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 { + d->scores[idx]++; + if (d->scores[idx] >= 30) { + d->state = D_STATE_LOCKED; + } + + 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; +} -- cgit v1.2.3 From bbb1ef6a917a3e0b94c8278b3c6643b523aad5c0 Mon Sep 17 00:00:00 2001 From: Julian Picht Date: Tue, 20 Dec 2016 22:26:25 +0100 Subject: add copyright headers --- src/disambiguator.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/disambiguator.c') diff --git a/src/disambiguator.c b/src/disambiguator.c index 9b55fa4..f03299d 100644 --- a/src/disambiguator.c +++ b/src/disambiguator.c @@ -1,3 +1,7 @@ +// (C) 2016 Julian Picht, MIT/x11 License. +// +//All MIT/x11 Licensed Code in this file may be relicensed freely under the GPL or LGPL licenses. + #include "../include/disambiguator.h" #include #include -- cgit v1.2.3 From 093802f9cc7ebaa0bfe8d862766e7e08026576f0 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Tue, 20 Dec 2016 22:44:10 -0500 Subject: switch to a hidden disambiguator. --- src/disambiguator.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'src/disambiguator.c') diff --git a/src/disambiguator.c b/src/disambiguator.c index f03299d..8a5a993 100644 --- a/src/disambiguator.c +++ b/src/disambiguator.c @@ -2,11 +2,11 @@ // //All MIT/x11 Licensed Code in this file may be relicensed freely under the GPL or LGPL licenses. -#include "../include/disambiguator.h" +#include "disambiguator.h" #include #include -void disambiguator_init(disambiguator * d) { +void disambiguator_init( struct disambiguator * d ) { memset(&(d->times), 0x0, sizeof(d->times)); memset(&(d->scores), 0x0, sizeof(d->scores)); d->state = D_STATE_UNLOCKED; @@ -14,9 +14,10 @@ void disambiguator_init(disambiguator * d) { d->max_confidence = 0; } -inline void disambiguator_discard(disambiguator * d, long age); +inline void disambiguator_discard( struct disambiguator * d, long age ); -void disambiguator_discard(disambiguator * d, long age) { +void disambiguator_discard( struct 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) { @@ -31,9 +32,10 @@ void disambiguator_discard(disambiguator * d, long age) { d->max_confidence = confidence; } -inline int disambiguator_find_nearest(disambiguator * d, long time, int max_diff); +inline int disambiguator_find_nearest( struct disambiguator * d, long time, int max_diff ); -int disambiguator_find_nearest(disambiguator * d, long time, int max_diff) { +int disambiguator_find_nearest( struct 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) { @@ -49,7 +51,8 @@ int disambiguator_find_nearest(disambiguator * d, long time, int max_diff) { return idx; } -pulse_type disambiguator_step(disambiguator * d, long time, int length) { +pulse_type disambiguator_step( struct disambiguator * d, long time, int length) +{ if (length < 2750) { return d->state == D_STATE_LOCKED ? P_SWEEP : P_UNKNOWN; } -- cgit v1.2.3 From 170219fe413602508b31c39df23c8938adc6c35f Mon Sep 17 00:00:00 2001 From: cnlohr Date: Tue, 20 Dec 2016 23:36:55 -0500 Subject: get the new disambiguator closer, but it's still not perfect. --- src/disambiguator.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/disambiguator.c') diff --git a/src/disambiguator.c b/src/disambiguator.c index 8a5a993..f641834 100644 --- a/src/disambiguator.c +++ b/src/disambiguator.c @@ -56,10 +56,13 @@ pulse_type disambiguator_step( struct disambiguator * d, long time, int length) if (length < 2750) { return d->state == D_STATE_LOCKED ? P_SWEEP : P_UNKNOWN; } + //printf( "%d %d\n", time, length ); + //printf( "." ); + //time -= length/2; disambiguator_discard(d, time - 10000000); int idx = disambiguator_find_nearest(d, time - 400000, 100); - + if (time - d->last > 401000) { d->state = D_STATE_UNLOCKED; } -- cgit v1.2.3