Files
sea/tcl/drivers/fungen.tcl
2022-08-18 15:04:28 +02:00

187 lines
4.1 KiB
Tcl

namespace eval fungen {} {
}
proc stdConfig::fungen {} {
controller std "\n" 5
prop startcmd "*IDN?"
pollperiod 1 1
obj "AGILENT33210A" rd
prop read fungen::read
kids "function generator settings" {
node remote -int wr
default 1
prop check fungen::remote
prop read fungen::remoteupd
prop write stdSct::complete
prop enum 1
node waveform -text par SIN
node freq out
default 1000
prop write "fungen::write 0"
node volt out
default 0
prop write "fungen::write 0"
node offset out
default 0
prop write "fungen::write 0"
node width wr
prop writecmd "FUNC:PULS:WIDT %g\nFUNC:PULS:WIDT?"
prop readcmd "FUNC:PULS:WIDT?"
prop readfmt "%g"
node burstfreq out
default 1000
prop write "fungen::write 1"
prop newline 1
node burstvolt out
default 0
prop write "fungen::write 1"
node burstoffset out
default 0
prop write "fungen::write 1"
node burstcycles wr -int
default 1
prop writecmd "BURS:NCYC %d\nBURS:NCYC?"
prop readcmd "BURS:NCYC?"
prop readfmt "%f"
node burstperiod wr
prop writecmd "BURS:INT:PER %g\nBURS:INT:PER?"
prop readcmd "BURS:INT:PER?"
prop readfmt "%f"
node burst -int out
default 0
prop enum continuous,burst,off
prop write fungen::burst
}
return "AGILENT 33210a function generator"
}
proc fungen::remoteupd {} {
sct update 1
return idle
}
proc fungen::remote {} {
if {[sct target]} {
[sct controller] reconnect
} else {
[sct controller] disconnect
}
sct update [sct target]
return idle
}
proc fungen::read {} {
sct send "APPLY?;OUTP?;BURS:STAT?"
return fungen::complete
}
proc fungen::complete {} {
stdSct::scanf {"%s %f,%f,%f";%d;%d} waveform freq volt offset output burst
if {$output == 0} {
updateval [sct]/burst 2
sct update 0
return idle
}
set oldburst [hvali [sct]/burst]
if {$oldburst < 2} {
updateval [sct]/burst $burst
}
updateval [sct]/waveform $waveform
sct update $freq
if {$burst != $oldburst} {
return idle
}
if {$burst} {
updateval [sct]/burstfreq $freq
updateval [sct]/burstvolt $volt
updateval [sct]/burstoffset $offset
} else {
updateval [sct]/freq $freq
updateval [sct]/volt $volt
updateval [sct]/offset $offset
}
return idle
}
proc fungen::write {burstmode} {
set burst [sctval [sct parent]/burst]
if {$burst != $burstmode} {
sct update [sct target]
return idle
}
set waveform [sctval [sct parent]/waveform]
if {$burst} {
set freq [sctval [sct parent]/burstfreq]
set volt [sctval [sct parent]/burstvolt]
set offset [sctval [sct parent]/burstoffset]
} else {
set freq [sctval [sct parent]/freq]
set volt [sctval [sct parent]/volt]
set offset [sctval [sct parent]/offset]
}
sct send "APPLY:$waveform $freq Hz,$volt Vpp,$offset V\nAPPLY?"
return "fungen::acomplete $burst"
}
proc fungen::acomplete {burst} {
stdSct::scanf {"%s %f,%f,%f"} waveform freq volt offset
if {$burst} {
updateval [sct parent]/burstfreq $freq
updateval [sct parent]/burstvolt $volt
updateval [sct parent]/burstoffset $offset
} else {
updateval [sct parent]/freq $freq
updateval [sct parent]/volt $volt
updateval [sct parent]/offset $offset
}
updateval [sct parent] $freq
return idle
}
proc fungen::burst {} {
if {[sct target] == 2} {
sct send "OUTP 0\nOUTP?"
return stdSct::completeUpdate
}
set waveform [sctval [sct parent]/waveform]
if {[sct target]} {
set freq [sctval [sct parent]/burstfreq]
set volt [sctval [sct parent]/burstvolt]
set offset [sctval [sct parent]/burstoffset]
} else {
set freq [sctval [sct parent]/freq]
set volt [sctval [sct parent]/volt]
set offset [sctval [sct parent]/offset]
}
sct send "APPLY:$waveform $freq Hz,$volt Vpp,$offset V\nOUTP 1\nBURS:STAT [sct target]\nOUTP?"
return stdSct::completeUpdate
}
proc fungen::readburst {} {
sct send "BURS:STAT?"
return fungen::updateburst
}
proc fungen::updateburst {} {
set burst [sct result]
if {[sctval [sct]] <= 1} {
sct update $burst
}
return idle
}