# 1 "/home/admin/SimulationCore2/CSharp/OperationScenarios/Common/OperationScenarios.f90"
module OperationScenariosModule
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! Paseted From ....Variables.f90
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! use OperationScenariosModule !
! use OperationScenariosModule !!CElevator...
! use COperationScenariosVariables
    use SimulationVariables
    use PermissionsModule
! use SoftwareInputsVariables
! use CUnityInputs
    use UnityModule
    use UnitySignalVariables
    use UnitySignalsModule
    use PermissionsModule
! use CTdsElevatorModesEnumVariables !
    use CHoistingVariables
    use CTopDrivePanelVariables
    use NotificationModule
    use SoftwareInputsModule

    contains

    subroutine OperationScenariosToJson(parent)

        type(json_value),pointer :: parent
        type(json_core) :: json
        type(json_value),pointer :: p

! 1. create new node
        call json%create_object(p,'OperationScenarios')
        
! 2. add member of data type to new node
        call json%add(p,"ElevatorConnection",data%State%OperationScenario%ElevatorConnection)
        call json%add(p,"StringUpdate",data%State%OperationScenario%StringUpdate)
        call json%add(p,"KellyConnection",data%State%OperationScenario%KellyConnection)
        
! 3. add new node to parent
        call json%add(parent,p)
    end subroutine

! moved from kellyConnectionEnum
    subroutine Set_KellyConnection(v)
        use CManifolds, Only: KellyConnected, KellyDisconnected
        implicit none
        integer , intent(in) :: v
        #ifdef ExcludeExtraChanges
            if(data%State%OperationScenario%KellyConnection == v) return
        #endif

        data%State%OperationScenario%KellyConnection = v
        
        if(data%State%OperationScenario%KellyConnection /= KELLY_CONNECTION_STRING) then
            call KellyDisconnected()
        else
            call KellyConnected()
        endif
        
        #ifdef deb
            if(print_log) print*, 'data%State%OperationScenario%KellyConnection=', data%State%OperationScenario%KellyConnection
        #endif
!**call data%State%OperationScenario%OnKellyConnectionChange%RunAll()
    end subroutine
    
    integer function Get_KellyConnection()
        implicit none
        Get_KellyConnection = data%State%OperationScenario%KellyConnection
    end function
    
    subroutine Evaluate_KellyConnection()
        implicit none
        if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then
            #ifdef OST
                        if(print_log) print*, 'Evaluate_KellyConnection=TopDrive'
            #endif
        endif
        if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then
            #ifdef OST
                        if(print_log) print*, 'Evaluate_KellyConnection=Kelly'
            #endif

!OPERATION-CODE=1
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
!Get_JointConnectionPossible() .and.&
                Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.&
                Get_Swing() == SWING_WELL_END .and.& 
!Get_TongNotification() .and.&
                Get_Tong() == TONG_MAKEUP_END) then
!call Log_4('KELLY_CONNECTION_STRING')
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_STRING)
                return
            end if
        
!OPERATION-CODE=2
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
                Get_StringPressure() == 0 .and.&
                Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection()) .and.&
                Get_KellyConnection() == KELLY_CONNECTION_STRING .and.&
                Get_Swing() == SWING_WELL_END .and.&  
!Get_TongNotification() .and.&
                Get_Tong() == TONG_BREAKOUT_END) then
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_NOTHING)
                call Set_SwingLed(.true.)
                return
            end if
        
            
!OPERATION-CODE=3
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
!Get_JointConnectionPossible() .and.&
                Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.&
                Get_Swing() == SWING_MOUSE_HOLE_END .and.&
!Get_TongNotification() .and.&
                Get_FillMouseHoleLed() .and.&
                Get_Tong() == TONG_MAKEUP_END) then
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_SINGLE)
                call Set_SwingLed(.false.)
                call Set_FillMouseHoleLed(.false.)
                call Set_MouseHole(MOUSE_HOLE_NEUTRAL)
                return
            end if
            
            
!OPERATION-CODE=4
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
                Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.&
                Get_Swing() == SWING_MOUSE_HOLE_END .and.& 
!Get_TongNotification() .and.&
                Get_FillMouseHoleLed() == .false. .and.&
                Get_Tong() == TONG_BREAKOUT_END) then
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_NOTHING)
                call Set_FillMouseHoleLed(.true.)
                call Set_MouseHole(MOUSE_HOLE_NEUTRAL)
                return
            end if
           
!OPERATION-CODE=5
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
!Get_JointConnectionPossible() .and.&
                Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.&
                Get_Swing() == SWING_WELL_END .and.& 
!Get_TongNotification() .and.&
                Get_Tong() == TONG_MAKEUP_END) then
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_STRING)
                call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE)
                call Set_SwingLed(.false.)
                return
            end if
            
!OPERATION-CODE=6
            if (Get_OperationCondition() == OPERATION_DRILL .and.&
                Get_StringPressure() == 0 .and.&
                Get_HookHeight() > 70.0 .and.&
                Get_KellyConnection() == KELLY_CONNECTION_STRING .and.&
!Get_TongNotification() .and.&
                Get_Swing() == SWING_WELL_END .and.&
                Get_Tong() == TONG_BREAKOUT_END) then
                call Set_Tong(TONG_NEUTRAL)
                call Set_KellyConnection(KELLY_CONNECTION_SINGLE)
                call Set_StringUpdate(STRING_UPDATE_REMOVE_SINGLE)
                return
            end if

        endif      
            
    end subroutine
    
! subroutine Subscribe_KellyConnection()
!     use CDrillingConsoleVariables
! use ConfigurationVariables
! use ConfigurationVariables
!     implicit none
        
!     call OnBreakoutLeverPress%Add(ButtonPress_Breakout)
!     call OnMakeupLeverPress%Add(ButtonPress_Makeup)
! end subroutine
    
    subroutine ButtonPress_Breakout()
        implicit none
# 187

    end subroutine
    
    subroutine ButtonPress_Makeup()
        implicit none
# 194

    end subroutine


    subroutine Set_StringUpdate(v)
        implicit none
        integer , intent(in) :: v
        #ifdef ExcludeExtraChanges
                if(data%State%OperationScenario%StringUpdate == v) return
        #endif
        data%State%OperationScenario%StringUpdate = v
!**call data%State%OperationScenario%OnStringUpdateChange%RunAll(v)
    end subroutine
    
    integer function Get_StringUpdate()
        implicit none
        Get_StringUpdate = data%State%OperationScenario%StringUpdate
    end function

    real(8) function TJH()
        use TD_DrillStemComponents
	    implicit none
	    TJH = data%State%TD_String%TopJointHeight
    end function
    
    real function TL()
	    implicit none
	    TL = 26.97
    end function
    
    real function NFC()
	    implicit none
	    NFC = Get_NearFloorConnection()
    end function
    

    subroutine Set_ElevatorConnection(v)
        implicit none
        integer , intent(in) :: v
        #ifdef ExcludeExtraChanges
            if(data%State%OperationScenario%ElevatorConnection == v) return
        #endif
        data%State%OperationScenario%ElevatorConnection = v
        
        #ifdef deb
            if(print_log) print*, 'data%State%OperationScenario%ElevatorConnection=', data%State%OperationScenario%ElevatorConnection
        #endif
!**call data%State%OperationScenario%OnElevatorConnectionChange%RunAll()
    end subroutine
    
    integer function Get_ElevatorConnection()
        implicit none
        Get_ElevatorConnection = data%State%OperationScenario%ElevatorConnection
    end function

end module OperationScenariosModule