00001 class PositionTracker
00002 {
00003 public:
00004
00005 PostionTracker();
00006 virtual PositionTracker();
00007
00008 int Wrap( int val, int max ) {
00009 if ( val < 0 ) return (val + max + 1);
00010 if ( val > max ) return (val - max - 1);
00011 return val;
00012 }
00013
00014 int Check( int bit, int val ) {
00015 if ( bit < 0 || bit > 65536 ) return -1;
00016 int bit2 = 1 << bit;
00017 return ( ( val && bit2 ) == bit2 );
00018
00019
00020
00021 }
00022
00023 int UpdateTrack() {
00024
00025 int r = board->Read();
00026 int i = 0;
00027 int t = 0;
00028 int Tracks[ 16 ];
00029 int OldTracks[ 16 ];
00030
00031 for( int k = 1; k < 65536; k *= 2 ) {
00032 t = ( ( r & k) == k );
00033 OldTracks[ i ] = Tracks[ i ];
00034 Tracks[ i ] = t;
00035 i++;
00036 }
00037
00038 for( int m = 0; m < 3; m++ ) {
00039 int pos = Train[ m ]->position;
00040 int prev = Train[ m ]->prev_position;
00041 int prevT1 = Wrap( tr - 1, 15 );
00042 int nextT1 = Wrap( tr + 1, 15 );
00043 int prevT3 = Wrap( tr - 3, 15 );
00044 int nextT3 = Wrap( tr + 3, 15 );
00045
00046 Train[ m ]->prev_position = pos;
00047
00048 if ( Tracks[ pos ] ) {
00049 Tracks[ pos ] = m;
00050 } else if ( OldTracks[ nextT1 ] == m ) {
00051 Tracks[ pos ] = m;
00052 } else if ( OldTracks[ prevT1 ] == m ) {
00053 Tracks[ pos ] = m;
00054 } else if ( OldTracks[ nextT3 ] == m ) {
00055 Tracks[ pos ] = m;
00056 } else if ( OldTracks[ prevT3 ] == m ) {
00057 Tracks[ pos ] = m;
00058 }
00059 }
00060 }
00061 };