#!/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 command0 ":WAVEFORM:DATA?"
set rootname ""
set index ""
set filename ""
set channel ""
set signalName ""
set timeout 10
set instName 164.54.1.168 
APSParseArguments {filename channel signalName timeout instName}

set PeerPort 1234 
set timeout [expr $timeout * 1000]
proc WriteToSocket {s} {
    fileevent $s writable {}
    global msg end
    puts $s $msg
    flush $s
    set end 0
}

proc ReadFromSocket {s} {
    global response end
    append response [read $s]
    if {[eof $s]} {
        set end 0
    }
}

proc putsAsync {message} {
    global msg sid end timeout
    puts $message
    set msg $message
    set id [after $timeout set end 1]
    fileevent $sid writable [list WriteToSocket $sid]
    vwait end
    if {$end} {
        puts stderr "Timeout sending $msg to scope"
        exit 1
    } else {
        after cancel $id
    }
}
proc getsAsync {} {
    global response sid end timeout
    set response ""
    set id [after $timeout set end 1]
    fileevent $sid readable [list ReadFromSocket $sid]
    vwait end
    if {$end} {
        puts stderr "Timeout waiting for scope to respond"
        exit 1
    } else {
        after cancel $id
    }
}

if {[catch {socket -async $instName $PeerPort} sid]} {
    puts "Error: Socket Could not be created: $sid"
    exit
}
fconfigure $sid -blocking 0
#fconfigure $sid -buffering line

if [string length $channel] {
    set channelList $channel
    if [string length $signalName] {
        set nameList $signalName
    } else {
        set nameList Channel$channel
    }
} else {
    set channelList {1 2 3 4}
    set nameList {Channel1 Channel2 Channel3 Channel4}
} 
set indexList ""
set channels 0
set clockRateList {"2 GSa/s" "1 GSa/s" "500 MSa/s" "250 MSa/s" "100 MSa/s" "50 MSa/s" "25 MSa/s" "10 MSa/s" "5 MSa/s"
        "2.5 MSa/s" "1 MSa/s" "500 kSa/s" "250 kSa/s" "100 kSa/s" "50 kSa/s" "25 kSa/s" "10 kSa/s" "5 kSa/s"
        "2.5 kSa/s" "1 kSa/s"} 
set clockValueList {2e9 1e9 500e6 250e6 100e6 50e6 25e6 10e6 5e6 2.5e6 1e6 500e3 250e3 100e3 50e3 25e3 10e3 5e3
    2.5e3 1e3}

set commandList {":TIM:DEL?" ":TIM:RANG?" ":ACQ:TYPE?" ":ACQ:POIN?" ":TIM:SAMP:CLOCK?"}
set variableList {delay range acqType acqPoints clockRate}

putsAsync "++read_tmo_ms $timeout"

foreach comm $commandList var $variableList {
    putsAsync $comm
    putsAsync "++read eoi"
    getsAsync
    set $var $response
}

set div [expr $range / 10.0]
if {$clockRate=="AUTO"} {
    set points $acqPoints
    set deltaT [expr $range / ($points -1.0)]
    set clockValue 0
} else {
    set clockValue [lindex $clockValueList [lsearch $clockRateList [string trim $clockRate]]]
    set points [expr $div * $clockValue]
    set deltaT [expr 1.0/$clockValue * 10.0 * $points / ($acqPoints-1.0)]
}

putsAsync ":STOP"
set option ""
foreach chan $channelList name $nameList {
    set command ":CHANNEL$chan:DISPLAY?"
    putsAsync "$command"
    putsAsync "++read eoi"
    getsAsync
    if {$response == 0} {
        continue
    }
    incr channels
    #get channel scale and offse 
    putsAsync ":CHAN${chan}:OFFS?"
    putsAsync "++read eoi"
    getsAsnyc
    set offset $response
    lappend data(ParameterNames) ${name}Offset
    lappend data(Parameter.${name}Offset) $offset
    putsAsync ":CHAN${chan}:RANG?"
    putsAsync "++read eoi"
    getsAsync
    set range $response
    lappend data(ParameterNames) ${name}Range
    lappend data(Parameter.${name}Range) $range
    set command ":WAVEFORM:SOURCE CHANNEL$chan"
    putsAsync "$command"
    putsAsync ":WAVEFORM:FORMAT ASCII"
    putsAsync ":WAVEFORM:DATA?"
    putsAsync "++read eoi"
    getsAsync
    set astring [string trim [split $response ,]]
    lappend data(ColumnNames) $name
    set data(ColumnInfo.$name) "type SDDS_DOUBLE"
    lappend data(Column.$name) [lrange $astring 0 end] 
    append option " \"-redefine=col,$name,$name $offset  - $range /,units=Div\""
}

putsAsync ":RUN"
catch {close $sid}

if !$channels {
    puts stderr "No channels are turned on, no data is take."
    exit 1
}
if [catch {sdds save $filename.1 data} result] {
    puts stderr "getHP54542ScopeData: Error saving file: $result"
    exit 1
}

if [catch {eval exec sddsprocess $filename.1 -redefine=col,Index,i_row,type=long -pipe=out \
             | sddsprocess -pipe=in $filename \
             $option \
             "-define=par,Delay,$delay,units=seconds" "-define=par,TimeDiv,$div,units=seconds" \
             "-define=par,AcqPoints,$acqPoints,type=long" "-print=par,ClockRate,$clockRate" \
             "-define=par,ClockValue,$clockValue" "-define=par,PointsPerDiv,$points,type=long" \
             "-print=par,PeakDect,$acqType" \
             \"-define=col,t,$deltaT Index * $delay +,units=s\" \
} result] {
    puts stderr "getHP54542ScopeData: Error processing file: $result"
    exit 1
}
exit 0






