#! Generated by VisualDCT v2.6
#! DBDSTART
#! DBDEND


# DOSFET serial device database template file
# 
# 
# Required Macros:
# P
# EPICS prefix.
# Every PV for this device starts with this prefix
# 
# User can enable or disable all serial communications
# with the device using this PV.
# Turning it off keeps error messages from spewing to the console.
record(bo, "$(P):COMM:ENABLE") {
  field(DESC, "User Enable/Disable of comms")
  field(ZNAM, "Comm Disabled!")
  field(ONAM, "Comm Enabled")
  field(FLNK, "$(P):ID PP")
  field(PINI, "YES")
  field(VAL, "1")
}

# This record looks at $(P):COMM:ENABLE and
# one serial query PV that is used to see if
# the device is available and talking to us.
record(calcout, "$(P):COMM:NOT_READY") {
  field(INPA, "$(P):COMM:ENABLE CPP")
  field(CALC, "!A")
  field(OOPT, "When Non-zero")
  field(OUT, "$(P):COMM:SHUTDOWN PP")
  field(IVOA, "Set output to IVOV")
  field(IVOV, "1")
}

# This fanout writes 0 to one or more PV's
# which can be used to set status or other
# PV's to indicate communication is down.
record(dfanout, "$(P):COMM:SHUTDOWN") {
  field(DOL, "0")
  field(OMSL, "closed_loop")
}

#record(stringin, "$(P):VERSION") {
#  field(DESC, "Firmware Version")
#  field(DTYP, "stream")
#  field(INP, "@K2612B_RadFET.proto get_version $(PORT)")
#  field(PINI, "YES")
#  field(SDIS, "$(P):COMM:NOT_READY")
#  field(DISS, "INVALID")
#}
# Read the device serial #
record(stringin, "$(P):ID") {
  field(DESC, "Serial number")
  field(DTYP, "stream")
  field(INP, "@K2612B_RadFET.proto get_serial $(PORT)")
  field(PINI, "YES")
  field(SDIS, "$(P):COMM:NOT_READY")
  field(DISS, "INVALID")
}

# Delay between turning on and reading FET in ms. See pdf before using.
record(ai, "$(P):DELAY") {
  field(DESC, "See documentation")
  field(EGU, "s")
  field(DTYP, "stream")
  field(INP, "@K2612B_RadFET.proto get_delay $(PORT)")
  field(SDIS, "$(P):COMM:NOT_READY")
  field(DISS, "INVALID")
  field(PINI, "YES")
}

record(longout, "$(P):SET_DELAY") {
  field(DESC, "See documentation")
  field(EGU, "s")
  field(DTYP, "stream")
  field(OUT, "@K2612B_RadFET.proto set_delay $(PORT)")
  field(SDIS, "$(P):COMM:NOT_READY")
  field(FLNK, "$(P):DELAY PP")
  field(LOPR, "1")
  field(HOPR, "5000")
}

# Bias applied between reads
record(ai, "$(P):BIAS") {
  field(DESC, "See documentation")
  field(EGU, "V")
  field(DTYP, "stream")
  field(INP, "@K2612B_RadFET.proto get_bias $(PORT)")
  field(SDIS, "$(P):COMM:NOT_READY")
  field(DISS, "INVALID")
  field(PINI, "YES")
}

record(ao, "$(P):SET_BIAS") {
  field(DESC, "See documentation")
  field(EGU, "V")
  field(DTYP, "stream")
  field(OUT, "@K2612B_RadFET.proto set_bias $(PORT)")
  field(SDIS, "$(P):COMM:NOT_READY")
  field(FLNK, "$(P):BIAS PP")
  field(LOPR, "1")
  field(HOPR, "30")
}

record(bo, "$(P):REINIT") {
  field(DTYP, "stream")
  field(OUT, "@K2612B_RadFET.proto reinit $(PORT)")
}

#record(bo, "$(P):POLL_TEMPS")
#{
#  field(DESC, "Trigger temp readback")
#  field(DTYP, "stream")
#  field(OUT, "@K2612B_RadFET.proto get_all_temps($(P)) $(PORT)")
#  field(SCAN, "Passive")
#  info(autosaveFields, "SCAN")
#}
#
#record( ai, "$(P):BOARD_TEMP" )
#{
##field( DTYP, "stream" )
##field( INP, "@K2612B_RadFET.proto get_temp(internal) $(PORT)" )
#field( EGU, "C" )
#field( PREC, 4 )
##field( SCAN, "I/O Intr")
#}
# Each channel needs to take its turn updating to avoid reading each other's data.
# Make a chain where each chanel is triggered by the previous one completing
record(bo, "$(P):POLL_ENABLE") {
  field(ZNAM, "Enabled")
  field(ONAM, "Disabled")
  field(OUT, "$(P):POLL_TIMER.DOPT PP")
  field(PINI, "YES")
  info(autosaveFields, "VAL")
}

record(longout, "$(P):SET_POLL_INT") {
  field(DESC, "Sampling period, 0 to disable")
  field(EGU, "s")
  field(OUT, "$(P):POLL_TIMER")
  field(FLNK, "$(P):POLL_TIMER")
  field(PINI, "YES")
  info(autosaveFields, "VAL")
}

record(calcout, "$(P):POLL_TIMER") {
  field(DESC, "Loop, trigger dose polling")
  field(SCAN, "1 second")
  field(EGU, "s")
  field(INPA, "$(P):SET_POLL_INT PP")
  field(INPB, "$(P):GATE_POLLING PP")
  field(CALC, "(B+1)%A")
  field(OCAL, "B+1")
  field(OUT, "$(P):GATE_POLLING.A PP")
}

record(calcout, "$(P):GATE_POLLING") {
  field(DESC, "Loop, trigger dose polling")
  field(EGU, "s")
  field(CALC, "A")
  field(OOPT, "Transition To Zero")
  field(OUT, "$(P):POLL PP")
}

record(bo, "$(P):POLL") {
  field(DTYP, "stream")
  field(OUT, "@K2612B_RadFET.proto StartRead $(PORT)")
  field(DESC, "Trigger RadFET all channel readback")
}

# The pdf document for DOSFET gives this equation for RFT-300-CC10G1
# sensors from REM Oxford Ltd. irradiated under zero bias:
# exp(-b/2c-sqr(b^2/4*c^2+(loge(dV)-a)/c))
# where a = -4.33139, b = 1.05947, c = -0.04047
record(calc, "$(P):DOSE_CALC") {
  field(CALC, "EXP(E-SQR(F+(LOGE(D)-A)/C))")
  field(PREC, "7")
  field(INPA, "-4.33139")
# coefficient a according to pdf
  field(INPB, "1.05947")
# coefficient b according to pdf
  field(INPC, "-0.04047")
# coefficient c according to pdf
  field(INPD, "DELTA_VOLTS")
# Set by each channel in its own calc
  field(INPE, "1.308957252e+1")
# -B/2C
  field(INPF, "1.713369088e+2")
# -B^2/4C^2
  field(PINI, "YES")
  info(autosaveFields, "CALC DESC INPA INPB INPC INPE INPF INPG INPH INPI INPJ INPK INPL")
}

#! Further lines contain data used by VisualDCT
#! View(0,0,1.0)
#! Record("$(P):COMM:ENABLE",320,720,0,0,"$(P):COMM:ENABLE")
#! Field("$(P):COMM:ENABLE.FLNK",16777215,0,"$(P):COMM:ENABLE.FLNK")
#! Link("$(P):COMM:ENABLE.FLNK","$(P):ID")
#! Field("$(P):COMM:ENABLE.VAL",16777215,1,"$(P):COMM:ENABLE.VAL")
#! Record("$(P):COMM:NOT_READY",60,700,0,0,"$(P):COMM:NOT_READY")
#! Field("$(P):COMM:NOT_READY.INPA",16777215,1,"$(P):COMM:NOT_READY.INPA")
#! Link("$(P):COMM:NOT_READY.INPA","$(P):COMM:ENABLE.VAL")
#! Field("$(P):COMM:NOT_READY.OUT",16777215,1,"$(P):COMM:NOT_READY.OUT")
#! Link("$(P):COMM:NOT_READY.OUT","$(P):COMM:SHUTDOWN.VAL")
#! Field("$(P):COMM:NOT_READY.VAL",16777215,0,"$(P):COMM:NOT_READY.VAL")
#! Record("$(P):COMM:SHUTDOWN",340,576,0,0,"$(P):COMM:SHUTDOWN")
#! Field("$(P):COMM:SHUTDOWN.VAL",16777215,0,"$(P):COMM:SHUTDOWN.VAL")
#! Record("$(P):ID",80,500,0,0,"$(P):ID")
#! Field("$(P):ID.SDIS",16777215,0,"$(P):ID.SDIS")
#! Link("$(P):ID.SDIS","$(P):COMM:NOT_READY.VAL")
#! Record("$(P):DELAY",320,26,0,0,"$(P):DELAY")
#! Field("$(P):DELAY.SDIS",16777215,0,"$(P):DELAY.SDIS")
#! Link("$(P):DELAY.SDIS","$(P):COMM:NOT_READY.VAL")
#! Record("$(P):SET_DELAY",320,252,0,0,"$(P):SET_DELAY")
#! Field("$(P):SET_DELAY.SDIS",16777215,0,"$(P):SET_DELAY.SDIS")
#! Link("$(P):SET_DELAY.SDIS","$(P):COMM:NOT_READY.VAL")
#! Field("$(P):SET_DELAY.FLNK",16777215,0,"$(P):SET_DELAY.FLNK")
#! Link("$(P):SET_DELAY.FLNK","$(P):DELAY")
#! Record("$(P):BIAS",80,26,0,0,"$(P):BIAS")
#! Field("$(P):BIAS.SDIS",16777215,0,"$(P):BIAS.SDIS")
#! Link("$(P):BIAS.SDIS","$(P):COMM:NOT_READY.VAL")
#! Record("$(P):SET_BIAS",100,252,0,0,"$(P):SET_BIAS")
#! Field("$(P):SET_BIAS.SDIS",16777215,0,"$(P):SET_BIAS.SDIS")
#! Link("$(P):SET_BIAS.SDIS","$(P):COMM:NOT_READY.VAL")
#! Field("$(P):SET_BIAS.FLNK",16777215,0,"$(P):SET_BIAS.FLNK")
#! Link("$(P):SET_BIAS.FLNK","$(P):BIAS")
#! Record("$(P):REINIT",620,576,0,0,"$(P):REINIT")
#! Record("$(P):POLL_ENABLE",860,228,0,0,"$(P):POLL_ENABLE")
#! Field("$(P):POLL_ENABLE.OUT",16777215,0,"$(P):POLL_ENABLE.OUT")
#! Link("$(P):POLL_ENABLE.OUT","$(P):POLL_TIMER.DOPT")
#! Record("$(P):SET_POLL_INT",560,14,0,0,"$(P):SET_POLL_INT")
#! Field("$(P):SET_POLL_INT.FLNK",16777215,1,"$(P):SET_POLL_INT.FLNK")
#! Link("$(P):SET_POLL_INT.FLNK","$(P):POLL_TIMER")
#! Field("$(P):SET_POLL_INT.OUT",16777215,1,"$(P):SET_POLL_INT.OUT")
#! Link("$(P):SET_POLL_INT.OUT","$(P):POLL_TIMER.VAL")
#! Field("$(P):SET_POLL_INT.VAL",16777215,0,"$(P):SET_POLL_INT.VAL")
#! Record("$(P):POLL_TIMER",600,232,0,1,"$(P):POLL_TIMER")
#! Field("$(P):POLL_TIMER.DOPT",16777215,1,"$(P):POLL_TIMER.DOPT")
#! Field("$(P):POLL_TIMER.VAL",16777215,1,"$(P):POLL_TIMER.VAL")
#! Field("$(P):POLL_TIMER.INPA",16777215,0,"$(P):POLL_TIMER.INPA")
#! Link("$(P):POLL_TIMER.INPA","$(P):SET_POLL_INT.VAL")
#! Field("$(P):POLL_TIMER.INPB",16777215,1,"$(P):POLL_TIMER.INPB")
#! Link("$(P):POLL_TIMER.INPB","$(P):GATE_POLLING.VAL")
#! Field("$(P):POLL_TIMER.OUT",16777215,1,"$(P):POLL_TIMER.OUT")
#! Link("$(P):POLL_TIMER.OUT","$(P):GATE_POLLING.A")
#! Record("$(P):GATE_POLLING",900,394,0,0,"$(P):GATE_POLLING")
#! Field("$(P):GATE_POLLING.VAL",16777215,0,"$(P):GATE_POLLING.VAL")
#! Field("$(P):GATE_POLLING.A",16777215,0,"$(P):GATE_POLLING.A")
#! Field("$(P):GATE_POLLING.OUT",16777215,0,"$(P):GATE_POLLING.OUT")
#! Link("$(P):GATE_POLLING.OUT","$(P):POLL.VAL")
#! Record("$(P):POLL",880,622,0,0,"$(P):POLL")
#! Field("$(P):POLL.VAL",16777215,0,"$(P):POLL.VAL")
#! Record("$(P):DOSE_CALC",594,699,0,1,"$(P):DOSE_CALC")
#! Field("$(P):DOSE_CALC.INPD",16777215,1,"$(P):DOSE_CALC.INPD")
