00001 #ifndef __J2K__Train__Track_CPP__
00002 #define __J2K__Train__Track_CPP__
00003
00004 Track::Track()
00005 {
00006 initSegments();
00007 initSwitches();
00008 initGeometry();
00009
00010
00011 }
00012
00013
00014 void Track::initSegments()
00015 {
00016 int i;
00017 for( i = 0; i < NSEG; i++ ) {
00018 segment[i].setSegmentID(i+1);
00019 }
00020 }
00021
00022 void Track::initSwitches()
00023 {
00024 int i;
00025
00026
00027 for( i = 0; i < NSW; i++ ) {
00028 switch[i].setSwitchID(i+1);
00029 }
00030 }
00031
00032 void Track::initGeometry()
00033 {
00034
00035
00036
00037 segment[ 1-1].setNext(2);
00038 segment[ 2-1].setNext(5);
00039 segment[ 3-1].setNext(4);
00040 segment[ 4-1].setNext(7);
00041 segment[ 5-1].setNext(6);
00042 segment[ 6-1].setNext(7);
00043 segment[ 7-1].setNext(8);
00044 segment[ 8-1].setNext(9);
00045 segment[ 9-1].setNext(10);
00046 segment[10-1].setNext(11);
00047 segment[11-1].setNext(12);
00048 segment[12-1].setNext(15);
00049 segment[13-1].setNext(14);
00050 segment[14-1].setNext(15);
00051 segment[15-1].setNext(16);
00052 segment[16-1].setNext(1);
00053
00054 segment[ 1-1].setPrev(16);
00055 segment[ 2-1].setPrev(1);
00056 segment[ 3-1].setPrev(2);
00057 segment[ 4-1].setPrev(3);
00058 segment[ 5-1].setPrev(2);
00059 segment[ 6-1].setPrev(5);
00060 segment[ 7-1].setPrev(6);
00061 segment[ 8-1].setPrev(7);
00062 segment[ 9-1].setPrev(8);
00063 segment[10-1].setPrev(9);
00064 segment[11-1].setPrev(10);
00065 segment[12-1].setPrev(11);
00066 segment[13-1].setPrev(10);
00067 segment[14-1].setPrev(13);
00068 segment[15-1].setPrev(12);
00069 segment[16-1].setPrev(15);
00070
00071 showGeometry();
00072 }
00073
00074 void Track::showGeometry()
00075 {
00076 int ID;
00077 printf("Track Geometry\n==============\n\n");
00078
00079 for( ID = 1; ID <= NSEG; ID++) {
00080 printf("(%2d) --> %2d\t", ID, segment[ID-1].getNext() );
00081
00082 if ( ID % 4 == 0 ) { printf("\n"); }
00083 }
00084
00085 printf("\n\n\n");
00086 for( ID = 1; ID <= NSEG; ID++) {
00087 printf("(%2d) <-- %2d\t", ID, segment[ID-1].getPrev() );
00088 if ( ID % 4 == 0 ) { printf("\n"); }
00089 }
00090
00091 printf("\n\n");
00092 }
00093
00094 Track::~Track() { }
00095
00096 void Track::testSwitches()
00097 {
00098 delay( 5000 );
00099
00100 for( int Sw = 1; Sw <= NSW; Sw++ ) {
00101 setSwitch( Sw, 1 );
00102 delay( 250 );
00103
00104 setSwitch( Sw, 0 );
00105 delay( 250 );
00106 }
00107 }
00108
00109 int Track::isSegmentOccupied(int Seg)
00110 {
00111 if ( Seg >= 1 && Seg <= NSEG ) {
00112 return segment[Seg-1].isOccupied();
00113 } else {
00114 printf("Track ERROR - isActive: Zone out of range\a\n");
00115 exit(1);
00116 return 0;
00117 }
00118 }
00119
00120 void Track::setSwitch(int S, int P) {
00121 if ( Seg >= 1 && Seg <= NSEG ) {
00122 switch[S-1].setSwitch(P);
00123 updateTrack(S,P);
00124 } else {
00125 printf("Track ERROR - setSwitch: Switch out of range\a\n");
00126 exit(1);
00127 }
00128 }
00129
00130 void Track::updateTrack(int ID, int P) {
00131
00132 if ( P == OPEN ) {
00133 switch( ID ) {
00134 case 1: segment[2-1].setNext(3);
00135 segment[3-1].setPrev(2);
00136 segment[5-1].setPrev(2);
00137 break;
00138
00139 case 2: segment[7-1].setPrev(4);
00140 segment[4-1].setNext(7);
00141 segment[6-1].setNext(7);
00142 break;
00143
00144 case 3: segment[10-1].setNext(13);
00145 segment[13-1].setPrev(10);
00146 segment[11-1].setPrev(10);
00147 break;
00148
00149 case 4: segment[15-1].setPrev(14);
00150 segment[14-1].setNext(15);
00151 segment[12-1].setNext(15);
00152 break;
00153 }
00154
00155 } else {
00156 switch( ID ) {
00157 case 1: segment[2-1].setNext(5);
00158 segment[3-1].setPrev(2);
00159 segment[5-1].setPrev(2);
00160 break;
00161
00162 case 2: segment[7-1].setPrev(6);
00163 segment[4-1].setNext(7);
00164 segment[6-1].setNext(7);
00165 break;
00166
00167 case 3: segment[10-1].setNext(11);
00168 segment[13-1].setPrev(10);
00169 segment[11-1].setPrev(10);
00170 break;
00171
00172 case 4: segment[15-1].setPrev(12);
00173 segment[14-1].setNext(15);
00174 segment[12-1].setNext(15);
00175 break;
00176 }
00177 }
00178 }
00179
00180 int Track::GetNext( int s )
00181 {
00182 return segment[s-1].getNext();
00183 }
00184
00185 int Track::GetPrev( int s )
00186 {
00187 return segment[s-1].getPrev();
00188 }
00189
00190 #endif