Switching a relay on and off using "millis()" without interfering with the runtime of the other piece of code

mr. Blackfin

void relay( void ) 
{
    uint8_t
        stateRelay = RLY_OFF;
    static uint32_t
        timeRelay;
    uint32_t
        timeNow = millis();
        
    switch( stateRelay )
    {
        case    RLY_IDLE:
            //waiting for flag to indicate relay sequence
            if( bRelay == true )
            {                
                timeRelay = timeNow;
                stateRelay = RLY_ON;

I also tried your last suggestion, but there was a compilation error in this part. I fixed it as follows, but there is no movement in the relay.

//==============================================================================
void relay( void ) 
{
    uint8_t
        stateRelay = RLY_IDLE;
    static uint32_t
        timeRelay;
    uint32_t
        timeNow = millis();
        
    switch( stateRelay )
    {
        case    RLY_IDLE:
            //waiting for flag to indicate relay sequence
            if( bRelay == true )
            {
                bRelay = false;
                timeRelay = timeNow;
                stateRelay = RLY_IDLE;
                
            }//if
            
        break;

        case    RLY_DELAY:
            //delay before turning the relay on
            if( millis() - timeRelay >= K_RELAY_DELAY_TIME )
            {
                digitalWrite( relay2, LOW );   //relay on 
                timeRelay = timeNow;
                stateRelay = RLY_HOLD;
                    
            }//if
            
        break;

        case    RLY_HOLD:
            //relay on-timing
            if( millis() - timeRelay >= K_RELAY_HOLD_TIME )
            {
                digitalWrite( relay2, HIGH );    
                stateRelay = RLY_IDLE;
                    
            }//if
        
        break;
                
    }//switch

}//relay