#!/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)]

APSStandardSetup

proc logCASW {pid} {
    if {![eof $pid]} {
        set sec [clock seconds]
        global starttime fid previousRow iocnames data filename currentRow startday
        if {[clock format $sec -format %j] != [clock format $starttime -format %j]} {
            catch {close $fid}
            initilizeLogFile
        }
        gets $pid line
        set iocname [lindex $line 0]
        set tstamp [lrange $line 1 2]
        set i [string first . $tstamp]
        set tsec [clock scan [string range $tstamp 0 [expr {$i - 1}]]][string range $tstamp $i end]
        set index [lsearch -exact $iocnames $iocname]
        if {$index == -1} {
            catch {close $fid}
            if {[catch {sdds load $filename data} results]} {
                puts "Error: $results"
                exit 1
            }
            set data(Layout.DataMode.NoRowCount) 1
            append iocnames " $iocname"
            set previousRow($iocname) -1
            set i 0
            foreach iocname $iocnames {
                append iocnamearray "$i $iocname "
                incr i
            }
            set data(Array.ControlNameString) [list $iocnamearray]
            if {[catch {sdds save $filename data} results]} {
                puts "Error: $results"
                exit 1
            }
            if {[catch {open $filename a} fid]} {
                puts "Error: $fid"
                exit 1
            }
            set index [lsearch -exact $iocnames $iocname]
        }
        puts $fid "$previousRow($iocname) [expr {($sec - $startday) / 3600.0}] [expr {($tsec - $startday) / 3600.0}] $index"
        flush $fid
        set previousRow($iocname) $currentRow
        incr currentRow
        
        
    } else {
        exit
    }
}

set iocnames ""

proc initilizeLogFile {args} {
    global data filename iocnames starttime fid previousRow filename currentRow startday
    set filename /home/helios/oagData/Alarms/casw/[APSNextGenerationedName -name casw-[clock format [clock seconds] -format "%Y-%j-%m%d"].0001 -separator "." -directory /home/helios/oagData/Alarms/casw -newFile 1] 

    set data(Layout.DataMode.NoRowCount) 1
    set data(ParameterNames) "TimeStamp PageTimeStamp StartTime YearStartTime StartYear StartJulianDay StartMonth StartDayOfMonth StartHour Filename"
    set data(ArrayNames) "ControlNameString"
    set data(ColumnNames) "PreviousRow TimeOfDayWS TimeOfDay ControlNameIndex"
    set data(ParameterInfo.StartTime) "type SDDS_DOUBLE"
    set data(ParameterInfo.YearStartTime) "type SDDS_DOUBLE"
    set data(ParameterInfo.StartYear) "type SDDS_SHORT"
    set data(ParameterInfo.StartJulianDay) "type SDDS_SHORT"
    set data(ParameterInfo.StartMonth) "type SDDS_SHORT"
    set data(ParameterInfo.StartDayOfMonth) "type SDDS_SHORT"
    set data(ParameterInfo.StartHour) "type SDDS_DOUBLE"
    set data(ColumnInfo.PreviousRow) "type SDDS_LONG"
    set data(ColumnInfo.TimeOfDayWS) "type SDDS_FLOAT"
    set data(ColumnInfo.TimeOfDay) "type SDDS_FLOAT"
    set data(ColumnInfo.ControlNameIndex) "type SDDS_LONG"

    set sec [clock seconds]
    set starttime $sec
    set startday [clock scan "00:00:00 [clock format $sec -format %D]"]
    set data(Parameter.TimeStamp) [list [clock format $sec]]
    set data(Parameter.PageTimeStamp) [list [clock format $sec]]
    set data(Parameter.StartTime) [list $sec]
    set data(Parameter.YearStartTime) [list [clock scan 1/1/[clock format $sec -format "%Y"]]]
    set data(Parameter.StartYear) [list [clock format $sec -format "%Y"]]
    set data(Parameter.StartJulianDay) [list [string trimleft [clock format $sec -format %j] 0]]
    set data(Parameter.StartMonth) [list [string trimleft [clock format $sec -format %m] 0]]
    set data(Parameter.StartDayOfMonth) [list [string trimleft [clock format $sec -format %d] 0]]
    set data(Parameter.StartHour) [list [expr {"[clock format $sec -format %H]." + ("[clock format $sec -format %M]." / 60.0) + ("[clock format $sec -format %S]." / 3600.0)}]]
    set data(Parameter.Filename) [list [file tail $filename]]

    set iocnamearray ""
    set i 0
    foreach iocname $iocnames {
        append iocnamearray "$i $iocname "
        incr i
    }
    set data(Array.ControlNameString) [list $iocnamearray]

    set data(Column.PreviousRow) [list ""]
    set data(Column.TimeOfDayWS) [list ""]
    set data(Column.TimeOfDay) [list ""]
    set data(Column.ControlNameIndex) [list ""]
    
    if {[catch {sdds save $filename data} results]} {
        puts "Error: $results"
        exit 1
    }
    if {[catch {open $filename a} fid]} {
        puts "Error: $fid"
        exit 1
    }
    set currentRow 0
}

if {[catch {exec ps -fe | fgrep "casw" | fgrep "/usr/local/iocapps/R3.14.11/base/3-14-11-asd1"} results]} {
    
    initilizeLogFile
    
    set pid [open "|/usr/local/iocapps/R3.14.11/base/3-14-11-asd1/bin/$env(EPICS_HOST_ARCH)/casw" r]
    fconfigure $pid -blocking 0
    fileevent $pid readable [list logCASW $pid]
    
    vwait forever
} else {
    #Process still running
}
