# EPICS Database for streamdevice specific to measurement channels # # Macros # INSTR - Prefix # NAME - the device name, e.g. EL737 # PORT - StreamGenerator Port record(longout, "$(INSTR)$(NAME):FULL-RESET") { field(DESC, "Reset the DAQ") field(DTYP, "asynInt32") field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) RESET") } ################################################################################ # Status Variables record(stringin, "$(INSTR)$(NAME):MsgTxt") { field(DESC, "Unexpected received response") } # We separate the RAW-STATUS and the STATUS PV so that the state can be updated # in a sequence, that guarantees that we included the most recent time and # counts before the status switches back to Idle. # We do this via a sequenced update # # RAW-STATUS -> ELAPSED-SECONDS -> M* -> STATUS record(mbbi, "$(INSTR)$(NAME):RAW-STATUS") { field(DESC, "DAQ Status") field(DTYP, "asynInt32") field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) STATUS") field(ZRVL, "0") field(ZRST, "Idle") field(ONVL, "1") field(ONST, "Counting") field(TWVL, "2") field(TWST, "Low rate") field(THVL, "3") field(THST, "Paused") # 4 should never happen, if it does it means the DAQ reports undocumented statusbits field(FRVL, "4") field(FRST, "INVALID") # This is probably too fast. We could trigger things the same as sinqDAQ to ensure the db is update in the same order # field(SCAN, "I/O Intr") field(SCAN, ".1 second") field(FLNK, "$(INSTR)$(NAME):READALL") field(PINI, "YES") } record(fanout, "$(INSTR)$(NAME):READALL") { field(SELM, "All") field(LNK0, "$(INSTR)$(NAME):ELAPSED-TIME") field(LNK1, "$(INSTR)$(NAME):M1") field(LNK2, "$(INSTR)$(NAME):M2") field(LNK3, "$(INSTR)$(NAME):M3") field(LNK4, "$(INSTR)$(NAME):M4") field(LNK5, "$(INSTR)$(NAME):M5") # Doesn't seemt o be a problem to have more in here :D # field(LNK6, "$(INSTR)$(NAME):M5") # field(LNK7, "$(INSTR)$(NAME):M6") field(FLNK, "$(INSTR)$(NAME):STATUS") } record(mbbi, "$(INSTR)$(NAME):STATUS") { field(INP, "$(INSTR)$(NAME):RAW-STATUS NPP") field(DESC, "DAQ Status") field(ZRVL, "0") field(ZRST, "Idle") field(ONVL, "1") field(ONST, "Counting") field(TWVL, "2") field(TWST, "Low rate") field(THVL, "3") field(THST, "Paused") # 4 should never happen, if it does it means the DAQ reports undocumented statusbits field(FRVL, "4") field(FRST, "INVALID") field(PINI, "YES") } record(longin, "$(INSTR)$(NAME):CHANNELS") { field(DESC, "Total Supported Channels") field(VAL, $(CHANNELS)) field(DISP, 1) } # Trigger a change in status as clearing record(bo, "$(INSTR)$(NAME):ETT") { field(DESC, "Trigger Clearing Status") field(VAL, 1) field(OUT, "$(INSTR)$(NAME):ETS PP") } # Trigger a change in status as value returned to 0 record(seq, "$(INSTR)$(NAME):ETO") { field(DESC, "Trigger Returned to 0 Status") field(LNK0, "$(INSTR)$(NAME):ETS PP") field(DO0, 0) field(SELM, "Specified") field(SELL, "$(INSTR)$(NAME):ELAPSED-TIME.VAL") field(SCAN, ".1 second") } # Current Status of Channel, i.e. is it ready to count? record(bi, "$(INSTR)$(NAME):ETS") { field(DESC, "Channel Status") field(VAL, 0) field(ZNAM, "OK") field(ONAM, "CLEARING") field(PINI, 1) } ################################################################################ # Count Commands record(longout,"$(INSTR)$(NAME):PRESET-COUNT") { field(DESC, "Count until preset reached") field(DTYP, "asynInt32") field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) P_CNT") field(VAL, 0) } record(longout,"$(INSTR)$(NAME):PRESET-TIME") { field(DESC, "Count for specified time") field(EGU, "seconds") field(DTYP, "asynInt32") field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) P_TIME") field(VAL, 0) } record(bo,"$(INSTR)$(NAME):PAUSE") { field(DESC, "Pause the current count") field(VAL, "0") } record(bo,"$(INSTR)$(NAME):CONTINUE") { field(DESC, "Continue with a count that was paused") field(VAL, "0") } record(longout, "$(INSTR)$(NAME):STOP") { field(DESC, "Stop the current counting operation") field(DTYP, "asynInt32") field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) STOP") } record(longout, "$(INSTR)$(NAME):MONITOR-CHANNEL") { field(DESC, "PRESET-COUNT Monitors this channel") field(DTYP, "asynInt32") field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) MONITOR") field(DRVL, "1") # Smallest Monitor Channel field(DRVH, "$(CHANNELS)") # Largest Monitor Channel } record(longin, "$(INSTR)$(NAME):MONITOR-CHANNEL_RBV") { field(DESC, "PRESET-COUNT Monitors this channel") field(DTYP, "asynInt32") field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) MONITOR") field(SCAN, ".2 second") field(PINI, "YES") } record(ao,"$(INSTR)$(NAME):THRESHOLD") { field(DESC, "Minimum rate for counting to proceed") field(DTYP, "asynInt32") field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) THRESH") field(VAL, "1") # Default Rate field(DRVL, "1") # Minimum Rate field(DRVH, "100000") # Maximum Rate } record(ai,"$(INSTR)$(NAME):THRESHOLD_RBV") { field(DESC, "Minimum rate for counting to proceed") field(EGU, "cts/sec") field(DTYP, "asynInt32") field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) THRESH") field(SCAN, "I/O Intr") field(PINI, "YES") } record(longout,"$(INSTR)$(NAME):THRESHOLD-MONITOR") { field(DESC, "Channel monitored for minimum rate") field(DTYP, "asynInt32") field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) THRESH_CH") field(VAL, "1") # Monitor field(DRVL, "0") # Smallest Threshold Channel (0 is off) field(DRVH, "$(CHANNELS)") # Largest Threshold Channel } record(longin,"$(INSTR)$(NAME):THRESHOLD-MONITOR_RBV") { field(DESC, "Channel monitored for minimum rate") field(EGU, "CH") field(DTYP, "asynInt32") field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) THRESH_CH") field(SCAN, "I/O Intr") field(PINI, "YES") } record(longout, "$(INSTR)$(NAME):CT") { field(DESC, "Clear the timer") field(DTYP, "asynInt32") field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) C_TIME") field(FLNK, "$(INSTR)$(NAME):ETT") } ################################################################################ # Read all monitors values record(ai, "$(INSTR)$(NAME):ELAPSED-TIME") { field(DESC, "DAQ Measured Time") field(EGU, "sec") field(DTYP, "asynFloat64") field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) TIME") # field(SCAN, "I/O Intr") field(PINI, "YES") # field(FLNK, "$(INSTR)$(NAME):ETO") }