diff options
author | cnlohr <lohr85@gmail.com> | 2016-12-20 22:44:10 -0500 |
---|---|---|
committer | cnlohr <lohr85@gmail.com> | 2016-12-20 22:44:10 -0500 |
commit | 093802f9cc7ebaa0bfe8d862766e7e08026576f0 (patch) | |
tree | 1336b7d27114f73b5c9f60a4f8b0850d40edf735 | |
parent | bbb1ef6a917a3e0b94c8278b3c6643b523aad5c0 (diff) | |
download | libsurvive-093802f9cc7ebaa0bfe8d862766e7e08026576f0.tar.gz libsurvive-093802f9cc7ebaa0bfe8d862766e7e08026576f0.tar.bz2 |
switch to a hidden disambiguator.
-rw-r--r-- | data_recorder.c | 43 | ||||
-rw-r--r-- | include/survive.h | 3 | ||||
-rw-r--r-- | src/disambiguator.c | 17 | ||||
-rw-r--r-- | src/disambiguator.h (renamed from include/disambiguator.h) | 14 | ||||
-rw-r--r-- | src/survive.c | 4 | ||||
-rw-r--r-- | src/survive_data.c | 10 |
6 files changed, 45 insertions, 46 deletions
diff --git a/data_recorder.c b/data_recorder.c index 913f8e0..cdcf4f5 100644 --- a/data_recorder.c +++ b/data_recorder.c @@ -33,51 +33,44 @@ void HandleMotion( int x, int y, int mask ) { } -int bufferpts[32*2]; -char buffermts[32*128]; -int buffertimeto[32]; +int bufferpts[32*2*3]; +char buffermts[32*128*3]; +int buffertimeto[32*3]; void my_light_process( struct SurviveObject * so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length ) { if( acode == -1 ) return; + int jumpoffset = sensor_id; + if( strcmp( so->codename, "WM0" ) == 0 ) jumpoffset += 32; + else if( strcmp( so->codename, "WM1" ) == 0 ) jumpoffset += 64; + + if( acode == 0 || acode == 2 ) //data = 0 { printf( "L X %s %d %d %d %d %d\n", so->codename, timecode, sensor_id, acode, timeinsweep, length ); - if( strcmp( so->codename, "HMD" ) == 0 ) - { - bufferpts[sensor_id*2+0] = (timeinsweep-100000)/500; - buffertimeto[sensor_id] = 0; - } + bufferpts[jumpoffset*2+0] = (timeinsweep-100000)/500; + buffertimeto[jumpoffset] = 0; } if( acode == 1 || acode == 3 ) //data = 1 { printf( "L Y %s %d %d %d %d %d\n", so->codename, timecode, sensor_id, acode, timeinsweep, length ); - if( strcmp( so->codename, "HMD" ) == 0 ) - { - bufferpts[sensor_id*2+1] = (timeinsweep-100000)/500; - buffertimeto[sensor_id] = 0; - } + bufferpts[jumpoffset*2+1] = (timeinsweep-100000)/500; + buffertimeto[jumpoffset] = 0; } if( acode == 4 || acode == 6 ) //data = 0 { printf( "R X %s %d %d %d %d %d\n", so->codename, timecode, sensor_id, acode, timeinsweep, length ); - if( strcmp( so->codename, "HMD" ) == 0 ) - { - bufferpts[sensor_id*2+0] = (timeinsweep-100000)/500; - buffertimeto[sensor_id] = 0; - } + bufferpts[jumpoffset*2+0] = (timeinsweep-100000)/500; + buffertimeto[jumpoffset] = 0; } if( acode == 5 || acode == 7 ) //data = 1 { printf( "R Y %s %d %d %d %d %d\n", so->codename, timecode, sensor_id, acode, timeinsweep, length ); - if( strcmp( so->codename, "HMD" ) == 0 ) - { - bufferpts[sensor_id*2+1] = (timeinsweep-100000)/500; - buffertimeto[sensor_id] = 0; - } + bufferpts[jumpoffset*2+1] = (timeinsweep-100000)/500; + buffertimeto[jumpoffset] = 0; } } @@ -105,9 +98,9 @@ void * GuiThread( void * v ) CNFGGetDimensions( &screenx, &screeny ); int i; - for( i = 0; i < 32; i++ ) + for( i = 0; i < 32*3; i++ ) { - if( buffertimeto[i] < 5 ) + if( buffertimeto[i] < 50 ) { uint32_t color = i * 3231349; uint8_t r = color & 0xff; diff --git a/include/survive.h b/include/survive.h index e29c82b..889e24d 100644 --- a/include/survive.h +++ b/include/survive.h @@ -1,7 +1,6 @@ #ifndef _SURVIVE_H #define _SURVIVE_H -#include "disambiguator.h" #include <stdint.h> #define SV_FLOAT double @@ -38,7 +37,7 @@ struct SurviveObject int32_t total_photo_time; int32_t total_pulsecode_time; #else - disambiguator d; + struct disambiguator * d; #endif }; 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 <stdlib.h> #include <string.h> -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; } diff --git a/include/disambiguator.h b/src/disambiguator.h index a17fc8d..0db19de 100644 --- a/include/disambiguator.h +++ b/src/disambiguator.h @@ -18,21 +18,21 @@ typedef enum { P_SWEEP = 2, } pulse_type; -typedef struct disambiguator_ { +struct disambiguator { long times[DIS_NUM_VALUES]; int scores[DIS_NUM_VALUES]; dis_state state; long last; int max_confidence; char code; -} disambiguator; +}; -typedef struct classified_pulse_ { +struct classified_pulse_ { pulse_type t; int length; -} classified_pulse; +}; -void disambiguator_init(disambiguator * d); -pulse_type disambiguator_step(disambiguator * d, long time, int length); +void disambiguator_init( struct disambiguator * d); +pulse_type disambiguator_step( struct disambiguator * d, long time, int length); -#endif /* DISAMBIGUATOR_H */
\ No newline at end of file +#endif /* DISAMBIGUATOR_H */ diff --git a/src/survive.c b/src/survive.c index b12c4cc..73df29d 100644 --- a/src/survive.c +++ b/src/survive.c @@ -8,6 +8,7 @@ #include <jsmn.h> #include <string.h> #include <zlib.h> +#include "disambiguator.h" static int jsoneq(const char *json, jsmntok_t *tok, const char *s) { if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start && @@ -146,12 +147,15 @@ struct SurviveContext * survive_init() ctx->headset.ctx = ctx; memcpy( ctx->headset.codename, "HMD", 4 ); + ctx->headset.d = calloc( 1, sizeof( struct disambiguator ) ); ctx->watchman[0].ctx = ctx; memcpy( ctx->watchman[0].codename, "WM0", 4 ); + ctx->watchman[0].d = calloc( 1, sizeof( struct disambiguator ) ); ctx->watchman[1].ctx = ctx; memcpy( ctx->watchman[1].codename, "WM1", 4 ); + ctx->watchman[1].d = calloc( 1, sizeof( struct disambiguator ) ); //USB must happen last. if( r = survive_usb_init( ctx ) ) diff --git a/src/survive_data.c b/src/survive_data.c index ef35e0e..cb3e8a2 100644 --- a/src/survive_data.c +++ b/src/survive_data.c @@ -42,18 +42,18 @@ static void handle_lightcap( struct SurviveObject * so, struct LightcapElement * if( le->type != 0xfe || le->length < 50 ) return; //le->timestamp += (le->length/2); - int32_t offset = le->timestamp - so->d.last; - switch(disambiguator_step(&(so->d), le->timestamp, le->length)) { + int32_t offset = le->timestamp - so->d->last; + switch( disambiguator_step( so->d, le->timestamp, le->length ) ) { default: case P_UNKNOWN: // not currently locked case P_SYNC: ct->lightproc( so, le->sensor_id, -1, 0, le->timestamp, offset ); - so->d.code = ((le->length+125)/250) - 12; + so->d->code = ((le->length+125)/250) - 12; break; case P_SWEEP: - if (so->d.code & 1) return; - ct->lightproc( so, le->sensor_id, so->d.code >> 1, offset, le->timestamp, le->length ); + if (so->d->code & 1) return; + ct->lightproc( so, le->sensor_id, so->d->code >> 1, offset, le->timestamp, le->length ); break; } #if 0 |