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

set args $argv
set pvaName ""
set output ""
set exclude ""
if {[APSStrictParseArguments {pvaName output exclude}]} {
    puts stderr "usage: pva2sddsLoggerInput -pvaName <name> -output <filename> -exclude <filter,filter,...>"
    exit 1
}
if {([llength $pvaName] == 0) || ([llength $output] == 0)} {
    puts stderr "usage: pva2sddsLoggerInput -pvaName <name> -output <filename> -exclude <filter,filter,...>"
    exit 1
}
set exclude [split $exclude ","]
lappend exclude "*SKIP*"

set data(ColumnNames) "ControlName ReadbackName ReadbackUnits Provider ExpectNumeric ExpectFieldType ExpectElements"
set data(ColumnInfo.ControlName) "type SDDS_STRING"
set data(ColumnInfo.ReadbackName) "type SDDS_STRING"
set data(ColumnInfo.ReadbackUnits) "type SDDS_STRING"
set data(ColumnInfo.Provider) "type SDDS_STRING"
set data(ColumnInfo.ExpectNumeric) "type SDDS_CHARACTER"
set data(ColumnInfo.ExpectFieldType) "type SDDS_STRING"
set data(ColumnInfo.ExpectElements) "type SDDS_LONG"

set ControlName ""
set ReadbackName ""
set ReadbackUnits ""
set Provider ""
set ExpectNumeric ""
set ExpectFieldType ""
set ExpectElements ""

#set pvaName S-DAQTBT:Dec1:Data:DEBUG
#set pvaName S23-DAQPS:Raw:Data

if {[catch {exec pvget $pvaName} results]} {
    puts "ERROR: $results"
    exit
}

set lines [lrange [split $results \n] 1 end]
set structureDepth 0
foreach line $lines {
    set len [string length $line]
    set line [string trim $line]
    set len [expr $len - [string length $line]]
    set depth [expr round($len / 4)]
    if {([lindex $line 0] == "structure") || \
            ([lindex $line 0] == "time_t")} {
        set structureDepth $depth
        if {$structureDepth > 0} {
            set structure($structureDepth) [lindex $line 1]
        }
        continue
    }
    if {([lindex $line 0] == "structure\[\]")} {
        set structureDepth $depth
        if {$structureDepth > 0} {
            set structure($structureDepth) "SKIP"
        }
        continue
    }
    if {$depth == $structureDepth} {
        incr structureDepth -1
    }
    if {[llength $line] >= 2} {
        set type [lindex $line 0]
        set name [lindex $line 1]
        set nElements 1
        set nElements [llength [split [lrange $line 2 end] ","]]
        if {[string range $type end-1 end] == "\[\]"} {
            set fieldType "scalarArray"
            set type [string range $type 0 end-2]
        } else {
            set fieldType "scalar"
        }
        if {($type == "string") || ($type == "char")} {
            set numeric "n"
        } else {
            set numeric "y"
        }
        set extName ""
        for {set i 1} {$i <= $structureDepth} {incr i} {
            if {$structure($i) != ""} {
                append extName "$structure($i)."
            }
        }
        append extName "$name"
        set skip 0
        foreach f $exclude {
            if {[string match $f $extName]} {
                set skip 1
                break
            }
        }
        if {$skip} {
            continue
        }
        lappend ControlName ${pvaName}.$extName
        lappend ReadbackName $extName
        lappend ReadbackUnits ""
        lappend Provider "pva"
        lappend ExpectNumeric $numeric
        lappend ExpectFieldType $fieldType
        lappend ExpectElements $nElements
    }
}
set data(Column.ControlName) [list $ControlName]
set data(Column.ReadbackName) [list $ReadbackName]
set data(Column.ReadbackUnits) [list $ReadbackUnits]
set data(Column.Provider) [list $Provider]
set data(Column.ExpectNumeric) [list $ExpectNumeric]
set data(Column.ExpectFieldType) [list $ExpectFieldType]
set data(Column.ExpectElements) [list $ExpectElements]
sdds save $output data

puts "Data written to $output"
puts "Testing with: sddspvalogger $output ${output}.TEST -sampleInterval=1 -steps=1 -overwrite"
if {[catch {exec sddspvalogger $output ${output}.TEST -sampleInterval=1 -steps=1 -overwrite -verbose -pend=5} results]} {
    puts "$results"
    exit
}
exec sddsedit ${output}.TEST &
after 5000
file delete ${output}.TEST

