#!/bin/sh
# \
exec oagtclsh "$0" "$@"
set auto_path [linsert $auto_path 0 /usr/local/oag/apps/lib/$env(HOST_ARCH)]
set auto_path [linsert $auto_path 0 /usr/local/oag/lib_patch/$env(HOST_ARCH)]

set SF 0
set SD 0
set gain 0
set val0 0
set val1 0
set val2 0
set val3 0
set val4 0 

set tagList {val0 val1 val2 val3 val4}
set valueList {0 0 0 0 0}

set load 0
set outputDir ./
set rootname ""
set args $argv
APSParseArguments {SF SD tagList valueList load outputDir rootname}

if ![string length $tagList] {
    puts stderr "Error: tagList not provided!"
    exit 1
}
if ![string length $valueList] {
    puts stderr "Error: valueList not provided!"
    exit 1
}

if {[llength $tagList]!=[llength $valueList]} {
    puts stderr "Error: tagList and valueList length are not equal"
    exit 1
}

foreach tag $tagList val $valueList {
    set $tag $val
}

proc ComputeNewRamp {args} {
    set type SF-U
    set deltaGain 0
    set refFile ""
    set valList ""
    set load 0
    set rootname ""
    APSParseArguments {type offset deltaGain valList load refFile rootname}
    global outputDir val0 val1 val2 val3 val4
    if [string length $rootname] {
        set outFile $outputDir/${rootname}$type
    } else {
        set outFile $outputDir/${type}-offset-[format %0.3e $val0]_[format %0.3e $val1]_[format %0.3e $val2]_[format %0.3e $val3]_[format %0.3e $val4].afg100
    }
    if {$val0==0 && $val1==0 && $val2==0 && $val3==0 && $val4==0} {
        exec cp $refFile $outFile
    } else {
        set tmpRoot /tmp/[APSTmpString]
        set index 0
        set fileList ""
        set ramp0 -1
        set prevValue 0
        foreach val $valList time {30 90 150 210 270} {
            set t0 [expr $time - 30 ]
            set t2 [expr $time + 30 ]
            if [catch { exec sddsconvert $refFile -pipe=out -del=par,Ramp*,Time*  \
                          | sddsprocess -pipe=in -filter=col,RampTime,$time,$t2 \
                          "-redefine=col,OldRampSetpoint,RampSetpoint" \
                          "-redefine=col,RampSetpoint,RampSetpoint $val +"  \
                          "-process=RampSetpoint,first,Ramp1" \
                          "-process=RampTime,first,Time1" \
                          "-process=RampTime,last,Time2" \
                          "-process=RampSetpoint,last,Ramp2" \
                          $tmpRoot.a.$index } result] {
                    return -code error "Error1: $result"
            }
            if {$index==0} {
                set ramp0 [exec sddsprocess $refFile -process=RampSetpoint,first,Ramp0 -pipe=out | sdds2stream -pipe=in -par=Ramp0]
                set time0 [exec sddsprocess $refFile -process=RampTime,first,Time0 -pipe=out | sdds2stream -pipe=in -par=Time0]
                
            } else {
                set ramp0 [exec sdds2stream $tmpRoot.a.[expr $index -1] -par=Ramp2]
                set time0 [exec sdds2stream $tmpRoot.a.[expr $index -1] -par=Time2]
            }
            if {$val==0 && $prevValue==0} {
                if [catch {exec sddsprocess  $refFile $tmpRoot.b.$index -filter=col,RampTime,$t0,$time } result] {
                    return -code error "Error3: $result"
                }
                
            } else {
                if [catch {exec sddsxref $refFile $tmpRoot.a.$index -leave=* -transfer=par,Time1,Ramp1 -pipe=out \
                             | sddsprocess -pip=in $tmpRoot.b.$index -filter=col,RampTime,$t0,$time \
                             -process=RampTime,first,Time0 -process=RampSetpoint,first,Ramp0 \
                             "-redefine=col,OldRampSetpoint,RampSetpoint" \
                             "-redefine=col,RampSetpoint,Ramp1 $ramp0 - Time1 $time0 - / RampTime $time0 - * $ramp0 +" } result] {
                    return -code error "Error2: $result"
                }
            }
            lappend fileList $tmpRoot.b.$index
            lappend fileList $tmpRoot.a.$index
            set prevValue $val
            incr index
        }
        #the rest
        if [catch {exec sddsprocess $refFile -filter=col,RampTime,300,500 \
                     -process=RampTime,first,Time1 \
                     -process=RampSetpoint,first,Ramp1 $tmpRoot.1 } result] {
            return -code "Error3: $result"
        }
        lappend fileList $tmpRoot.1
        if [catch {eval exec sddscombine $fileList -merge -pipe=out \
                     | sddsconvert -pipe -del=par,Ramp0,Ramp1,Ramp2,Time0,Time1,Time2 \
                     | sddsprocess -pipe=in  \
                     "-redefine=par,delta0,$val0" "-redefine=par,delta1,$val1" "-redefine=par,delta2,$val2" \
                     "-redefine=par,delta3,$val3" "-redefine=par,delta4,$val4" \
                     $outFile } result] {
            return -code "Error4: $result"
        }
        eval file delete -force $fileList
    }
    if $load {
        if [catch {exec rampload $outFile} result] {
            return -code error "Error loading ramp for $type: $result"
        }
    }
}

if [catch {exec cavget -list=It:Bs:StartRamp2BsIp.VAL -printErrors } injTime] {
    puts stderr "Error reading injection time: $injTime"
    exit 1
}
set SFref /home/helios/oagData/booster/ramps/IRamp/safety/SF-UIref.afg100
set SDref /home/helios/oagData/booster/ramps/IRamp/safety/SD-UIref.afg100

if $SF {
    if [catch {ComputeNewRamp -type SF-U -refFile $SFref -valList $valueList  -load  $load -rootname $rootname } result] {
        puts stderr "Error: $result"
        exit 1
    }
}
if $SD {
    if [catch {ComputeNewRamp -type SD-U -refFile $SDref -valList $valueList  -load  $load -rootname $rootname } result] {
        puts stderr "Error: $result"
        exit 1
    }
}

exit 0
