Example #1
0
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;
  }

}
Example #2
0
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;
}