void resetNext2( iOLcDriver inst, Boolean unLock ) { iOLcDriverData data = Data(inst); listBlocks(inst); if( data->next2Block != NULL && data->next1Block == data->next2Block ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4204, "setting next2Block [%s] to NULL", data->next2Block->base.id(data->next2Block) ); data->next2Block = NULL; data->next2Route = NULL; } if( data->next3Block != NULL && data->next1Block == data->next3Block ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4204, "setting next3Block [%s] to NULL", data->next3Block->base.id(data->next3Block) ); data->next3Block = NULL; data->next3Route = NULL; } if( data->next2Block != NULL ) { if( unLock ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4204, "reset next2Block [%s]", data->next2Block->base.id(data->next2Block) ); if(data->curBlock != data->next2Block && data->next1Block != data->next2Block ) data->next2Block->unLock(data->next2Block, data->loc->getId(data->loc), NULL); } data->next2Block = NULL; if( unLock ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4204, "reset next2Route [%s]", data->next2Route->getId(data->next2Route) ); if( data->next2Route != NULL && data->next2Route != data->next1Route ) data->next2Route->unLock(data->next2Route, data->loc->getId(data->loc), NULL, True, False); } data->next2Route = NULL; } /* most likely next3Block should be reseted too */ if( data->next3Block != NULL ) { if( unLock ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4204, "reset next3Block [%s]", data->next3Block->base.id(data->next3Block) ); if( data->curBlock != data->next3Block && data->next1Block != data->next3Block ) data->next3Block->unLock(data->next3Block, data->loc->getId(data->loc), NULL); } data->next3Block = NULL; if( unLock ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4204, "reset next3Route [%s]", data->next3Route->getId(data->next3Route) ); if( data->next3Route != NULL && data->next3Route != data->next1Route ) data->next3Route->unLock(data->next3Route, data->loc->getId(data->loc), NULL, True, False); } data->next3Route = NULL; } }
Boolean setSignals(iOLcDriver inst, Boolean onEnter ) { iOLcDriverData data = Data(inst); Boolean semaphore = False; Boolean reverse = False; Boolean signalpair = False; /* default false for the forwards signals */ iIBlockBase curBlock = data->curBlock; TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals...(useCurBlock4Signals=%d)", data->useCurBlock4Signals ); listBlocks(inst); if( data->useCurBlock4Signals ) { /* fix for free prev block on enter */ curBlock = data->curBlock4Signals; data->useCurBlock4Signals = False; } /* set signal current block on enter */ if( onEnter && curBlock != NULL ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals for curBlock[%s] to default aspect", curBlock->base.id(curBlock) ); if( data->next1Route != NULL ) { if( __checkSignalPair(inst, data->next1Route, curBlock, data->next1RouteFromTo, &signalpair) ) { data->curBlock->setDefaultAspect( curBlock, signalpair ); /* crossing blocks ... */ setCrossingblockSignals( inst, data->next1Route, DEFAULT_ASPECT, !signalpair ); setCrossingblockSignals( inst, data->next1Route, DEFAULT_ASPECT, signalpair ); } } else { curBlock->setDefaultAspect( data->curBlock, True ); curBlock->setDefaultAspect( data->curBlock, False ); } } /* set signal current block */ else if( data->curBlock != NULL && data->next1Block != NULL && data->next2Block != NULL && data->curBlock != data->next1Block && data->next1Block != data->next2Block ) { if( data->next1Route != NULL && data->next1Route->hasThrownSwitch(data->next1Route) ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals for curBlock to white: thrown switches in route [%s], reverse[%s]", data->next1Route->getId(data->next1Route), data->next1RouteFromTo?"false":"true" ); if( __checkSignalPair(inst, data->next1Route, data->curBlock, data->next1RouteFromTo, &signalpair) ) { semaphore |= data->curBlock->white( data->curBlock, True, signalpair ); semaphore |= data->curBlock->white( data->curBlock, False, signalpair ); } if( data->next1Route != NULL && data->next1Route->isSetCrossingblockSignals(data->next1Route) ) { /* Set the crossing block signals */ setCrossingblockSignals( inst, data->next1Route, WHITE_ASPECT, signalpair ); } if( data->next2Route != NULL && data->next2Route->isSetCrossingblockSignals(data->next2Route) ) { /* Set the crossing block signals */ if( __checkSignalPair(inst, data->next2Route, data->next2Block, data->next2RouteFromTo, &signalpair) ) setCrossingblockSignals( inst, data->next2Route, WHITE_ASPECT, !data->next2RouteFromTo ); } } else { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals for curBlock to green, reverse[%s]", data->next1RouteFromTo?"false":"true"); if( __checkSignalPair(inst, data->next1Route, data->curBlock, data->next1RouteFromTo, &signalpair) ) { semaphore |= data->curBlock->green( data->curBlock, True, signalpair ); semaphore |= data->curBlock->green( data->curBlock, False, signalpair ); } if( data->next1Route != NULL && data->next1Route->isSetCrossingblockSignals(data->next1Route) ) { /* Set the crossing block signals */ setCrossingblockSignals( inst, data->next1Route, GREEN_ASPECT, signalpair ); } if( data->next2Route != NULL && data->next2Route->isSetCrossingblockSignals(data->next2Route) ) { /* Set the crossing block signals */ if( __checkSignalPair(inst, data->next2Route, data->next2Block, data->next2RouteFromTo, &signalpair) ) setCrossingblockSignals( inst, data->next2Route, GREEN_ASPECT, signalpair ); } } } /* no second next block available: YELLOW */ else if( data->curBlock != NULL && data->next1Block != NULL && data->next2Block == NULL && data->curBlock != data->next1Block ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 9999, "no second next block available: YELLOW" ); if( __checkSignalPair(inst, data->next1Route, data->curBlock, data->next1RouteFromTo, &signalpair) ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signalpair[%s] for curBlock", signalpair?"forwards":"reverse"); if( data->next1Route != NULL && data->next1Route->hasThrownSwitch(data->next1Route) ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals for curBlock to white: thrown switches in route [%s], reverse[%s]", data->next1Route->getId(data->next1Route), data->next1RouteFromTo?"false":"true" ); semaphore |= data->curBlock->white( data->curBlock, True, signalpair ); semaphore |= data->curBlock->white( data->curBlock, False, signalpair ); if( data->next1Route != NULL && data->next1Route->isSetCrossingblockSignals(data->next1Route) ) { /* Set the crossing block signals */ setCrossingblockSignals( inst, data->next1Route, WHITE_ASPECT, signalpair ); } } else if( data->greenaspect ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals for curBlock to green: Use green aspect instead of yellow if next block has red." ); semaphore |= data->curBlock->green( data->curBlock, True, signalpair ); semaphore |= data->curBlock->green( data->curBlock, False, signalpair ); if( data->next1Route != NULL && data->next1Route->isSetCrossingblockSignals(data->next1Route) ) { /* Set the crossing block signals */ setCrossingblockSignals( inst, data->next1Route, GREEN_ASPECT, signalpair ); } } else { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals for curBlock to yellow." ); semaphore |= data->curBlock->yellow( data->curBlock, True, signalpair ); semaphore |= data->curBlock->yellow( data->curBlock, False, signalpair ); if( data->next1Route != NULL && data->next1Route->isSetCrossingblockSignals(data->next1Route) ) { /* Set the crossing block signals */ TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals for crossing to yellow." ); setCrossingblockSignals( inst, data->next1Route, YELLOW_ASPECT, signalpair ); } else { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "**not** [%d] setting signals for crossing to yellow.", data->next1Route->isSetCrossingblockSignals(data->next1Route) ); } } } } /* no next block available: RED */ else if( data->curBlock != NULL ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals for curBlock to red, reverse[%s]", data->next1RouteFromTo?"false":"true"); semaphore |= data->curBlock->red( data->curBlock, True, False ); semaphore |= data->curBlock->red( data->curBlock, False, False ); semaphore |= data->curBlock->red( data->curBlock, True, True ); semaphore |= data->curBlock->red( data->curBlock, False, True ); } /* signal next1Block */ if( data->next1Block != NULL && data->next2Block != NULL && data->next3Block != NULL && data->next1Block != data->next2Block && data->next2Block != data->next3Block ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 9999, "set signals in block [%s]", data->next1Block->base.id(data->next1Block) ); if( data->next2Route != NULL && data->next2Route->hasThrownSwitch(data->next2Route) ) { if( __checkSignalPair(inst, data->next2Route, data->next1Block, data->next2RouteFromTo, &signalpair) ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals for next1Block to white: thrown switches in route [%s]", data->next2Route->getId(data->next2Route) ); data->next1Block->white( data->next1Block, True, signalpair ); data->next1Block->white( data->next1Block, False, signalpair ); if( data->next2Route != NULL && data->next2Route->isSetCrossingblockSignals(data->next2Route) ) { /* Set the crossing block signals */ setCrossingblockSignals( inst, data->next2Route, WHITE_ASPECT, signalpair ); } } } else { if( __checkSignalPair(inst, data->next2Route, data->next1Block, data->next2RouteFromTo, &signalpair) ) { data->next1Block->green( data->next1Block, True, signalpair ); data->next1Block->green( data->next1Block, False, signalpair ); if( data->next2Route != NULL && data->next2Route->isSetCrossingblockSignals(data->next2Route) ) { /* Set the crossing block signals */ setCrossingblockSignals( inst, data->next2Route, GREEN_ASPECT, signalpair ); } } } } else if( data->next1Block != NULL && data->next2Block != NULL && data->next1Block != data->next2Block ) { Boolean hasThrownSwitches = False; if( data->next2Route != NULL && data->next2Route->hasThrownSwitch(data->next2Route) ) { hasThrownSwitches = True; } TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 9999, "set signals in block [%s]", data->next1Block->base.id(data->next1Block) ); if( __checkSignalPair(inst, data->next2Route, data->next1Block, data->next2RouteFromTo, &signalpair) ) { if( hasThrownSwitches ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals for next1Block to white: thrown switches in route [%s]", data->next2Route->getId(data->next2Route) ); data->next1Block->white( data->next1Block, True, signalpair ); data->next1Block->white( data->next1Block, False, signalpair ); } else if( data->greenaspect ) { data->next1Block->green( data->next1Block, True, signalpair ); data->next1Block->green( data->next1Block, False, signalpair ); if( data->next2Route != NULL && data->next2Route->isSetCrossingblockSignals(data->next2Route) ) { /* Set the crossing block signals */ setCrossingblockSignals( inst, data->next2Route, hasThrownSwitches?WHITE_ASPECT:GREEN_ASPECT, signalpair ); } } else { data->next1Block->yellow( data->next1Block, True, signalpair ); data->next1Block->yellow( data->next1Block, False, signalpair ); if( data->next2Route != NULL && data->next2Route->isSetCrossingblockSignals(data->next2Route) ) { /* Set the crossing block signals */ setCrossingblockSignals( inst, data->next2Route, YELLOW_ASPECT, signalpair ); } } } } else if( data->next1Block != NULL ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 9999, "set signals in block [%s]", data->next1Block->base.id(data->next1Block) ); if( __checkSignalPair(inst, data->next1Route, data->next1Block, data->next1RouteFromTo, &signalpair) ) { if( data->model->getStage(data->model, data->next1Block->base.id(data->next1Block) ) == NULL ) { /* only set signals to red on non staging (real) blocks */ data->next1Block->red( data->next1Block, True, signalpair ); data->next1Block->red( data->next1Block, False, signalpair ); } else { /* staging blocks handle setting to red internally */ TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setSignals[%s] blBaseName=%s name=%s SKIPPED", data->next1Block->base.id(data->next1Block), data->next1Block->base.name(), name ); } } } /* signal next2Block */ if( data->next2Block != NULL && data->next3Block != NULL && data->next2Block != data->next3Block ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 9999, "set signals in block [%s]", data->next2Block->base.id(data->next2Block) ); if( __checkSignalPair(inst, data->next3Route, data->next2Block, data->next3RouteFromTo, &signalpair) ) { if( data->next3Route->hasThrownSwitch(data->next3Route) ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setting signals for next2Block to white: thrown switches in route [%s]", data->next3Route->getId(data->next3Route) ); data->next2Block->white( data->next2Block, True, signalpair ); data->next2Block->white( data->next2Block, False, signalpair ); } else if( data->greenaspect ) { data->next2Block->green( data->next2Block, True, signalpair ); data->next2Block->green( data->next2Block, False, signalpair ); } else { data->next2Block->yellow( data->next2Block, True, signalpair ); data->next2Block->yellow( data->next2Block, False, signalpair ); } } } else if( data->next2Block != NULL ) { TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 9999, "set signals in block [%s]", data->next2Block->base.id(data->next2Block) ); if( data->model->getStage(data->model, data->next2Block->base.id(data->next2Block) ) == NULL ) { /* only set signals to red on non staging (real) blocks */ if( __checkSignalPair(inst, data->next2Route, data->next2Block, data->next2RouteFromTo, &signalpair) ) { data->next2Block->red( data->next2Block, True, signalpair ); data->next2Block->red( data->next2Block, False, signalpair ); } else { /* staging blocks handle setting to red internally */ TraceOp.trc( name, TRCLEVEL_USER1, __LINE__, 4202, "setSignals[%s] blBaseName=%s name=%s SKIPPED", data->next2Block->base.id(data->next2Block), data->next2Block->base.name(), name ); } } } return semaphore; }