#! /usr/env/python #-------------------------------------------------------------------------------- """ Application: Dialog_Dac for DAQ_96_Gui DAC Control Dialog for the Graphical User Interface to the DAQ_96 Control Program """ #-------------------------------------------------------------------------------- #-------------------------------------------------------------------------------- import string from Tkinter import * import Pmw from MultiShell import updateComboBox from MultiShell import updateIntVar from Print_Utils import printLine from Misc_Utils import RegAddrString from Misc_Constants import SlotNumMax from Misc_Constants import TtTypes from Xml_Utils import CreateXmlCommand from Xml_Utils import AppendCommentField from Xml_Utils import RetrieveXmlAttr from Misc_Constants import eOk, eError from Misc_Constants import TT_EM, TT_HD, TtType_str, TtType_tot from Misc_Constants import Eta_Pos, Eta_Neg, EtaSign_tot, EtaSignTypes, EtaSign_str #-------------------------------------------------------------------------------- #-------------------------------------------------------------------------------- class Dialog_Dac : def __init__ ( self, MShell, FrameNum ) : # Flag to prevent usage of non-existing objects during dialog construction self.InterfaceCreated = "No" self.MShell = MShell self.DacFrame = FrameNum # printLine ( "Dialog", 'Frame #%d is "%s"' % ( FrameNum, MShell.frameName[FrameNum] ) ) #-------------------------------------------------------------------------------- def createInterface(self): MShell = self.MShell MShell.addFieldLabel ( nFrame = self.DacFrame, labelName = 'Access: Pedestal Dac Control', column = 1, columnspan = 4, height = 2, width = 35, row = MShell.nextFieldRow() ) # MShell.addFieldLabel ( nFrame = self.DacFrame, # labelName = "VI Mst/Slv", # column = 1, # row = MShell.nextFieldRow() ) # DacCrateMasterFrame = \ # MShell.addFieldFrame ( nFrame = self.DacFrame, # labelName = "VI Frame for Dac", # column = 2, # columnspan = 5, # row = MShell.currentFieldRow() ) self.DacMasterNum_var = IntVar() self.DacMasterNum_var.set(0) # MShell.addFieldRadioB ( frame = DacCrateMasterFrame, # labelName ="M#0", # value = 0, # variable = self.DacMasterNum_var ) # MShell.addFieldRadioB ( frame = DacCrateMasterFrame, # labelName ="#1", # value = 1, # variable = self.DacMasterNum_var ) self.DacSlaveNum_var = IntVar() self.DacSlaveNum_var.set(0) # MShell.addFieldRadioB ( frame = DacCrateMasterFrame, # labelName ="S#0", # value = 0, # variable = self.DacSlaveNum_var ) # MShell.addFieldRadioB ( frame = DacCrateMasterFrame, # labelName ="#1", # value = 1, # variable = self.DacSlaveNum_var ) # MShell.addFieldRadioB ( frame = DacCrateMasterFrame, # labelName ="#2", # value = 2, # variable = self.DacSlaveNum_var ) # MShell.addFieldRadioB ( frame = DacCrateMasterFrame, # labelName ="#3", # value = 3, # variable = self.DacSlaveNum_var ) self.DacSlotNum_box = \ MShell.addFieldCombo ( nFrame = self.DacFrame, labelName ="Slot Num (*)", helpMessage ="Slot Num", statusMessage="Slot Num", initValue ="0", width = 6, command = self.Dac_UpdateSlotNum ) self.DacRelEta_box = \ MShell.addFieldCombo ( nFrame = self.DacFrame, labelName ="Rel Eta", helpMessage ="Relative Eta 0:3", statusMessage="Relative Eta 0:3", initValue ="0", width = 6, command = self.Dac_UpdateChanNum ) self.DacChanNum_box = \ MShell.addFieldCombo ( nFrame = self.DacFrame, labelName ="or Chan#", helpMessage ="Absolute Channel Number 0:15", statusMessage="Absolute Channel Number 0:15", initValue ="0", column = 3, row = MShell.currentFieldRow(), rowspan = 2, width = 6, command = self.Dac_UpdateRelEtaPhi ) self.DacRelPhi_box = \ MShell.addFieldCombo ( nFrame = self.DacFrame, labelName ="Rel Phi", helpMessage ="Relative Phi 0:3", statusMessage="Relative Phi 0:3", initValue ="0", width = 6, command = self.Dac_UpdateChanNum ) MShell.addFieldLabel ( nFrame = self.DacFrame, labelName = '(*) or use Slot#=0 and select L1Cal TT_Eta/Phi:', column = 1, columnspan = 4, width = 40, row = MShell.nextFieldRow() ) MShell.addFieldLabel ( nFrame = self.DacFrame, labelName = "Eta Sign", column = 1, row = MShell.nextFieldRow() ) self.DacEtaSignFrame = \ MShell.addFieldFrame ( nFrame = self.DacFrame, labelName = "DAC Eta Sign", helpMessage ="Absolute Eta Sign Pos:Neg", column = 2, columnspan = 3, row = MShell.currentFieldRow() ) self.DacEtaSign_var = IntVar() self.DacEtaSign_var.set(Eta_Pos) MShell.addFieldRadioB ( frame = self.DacEtaSignFrame, labelName ="Pos", value = Eta_Pos, variable = self.DacEtaSign_var ) MShell.addFieldRadioB ( frame = self.DacEtaSignFrame, labelName ="Neg", value = Eta_Neg, variable = self.DacEtaSign_var ) self.DacEtaMagn_box = \ MShell.addFieldCombo ( nFrame = self.DacFrame, labelName ="Eta Magn", helpMessage ="Absolute Eta Magnitute 1:20", statusMessage="Absolute Eta Magnitute 1:20", initValue ="1", width = 6, row = MShell.nextFieldRow() ) self.DacPhi_box = \ MShell.addFieldCombo ( nFrame = self.DacFrame, labelName ="Phi", helpMessage ="Absolute Phi 1:32", statusMessage="Absolute Phi 1:32", initValue ="1", column = 3, width = 6, row = MShell.currentFieldRow() ) MShell.addFieldLabel ( nFrame = self.DacFrame, labelName = "TT Type", column = 1, row = MShell.nextFieldRow() ) DacTtTypeFrame = \ MShell.addFieldFrame ( nFrame = self.DacFrame, labelName = "Dac Trg Twr Type", column = 2, columnspan = 3, row = MShell.currentFieldRow() ) self.DacTtType_var = IntVar() self.DacTtType_var.set(TT_EM) MShell.addFieldRadioB ( frame = DacTtTypeFrame, labelName ="TT_EM", value = TT_EM, variable = self.DacTtType_var ) MShell.addFieldRadioB ( frame = DacTtTypeFrame, labelName ="TT_HD", value = TT_HD, variable = self.DacTtType_var ) self.DacDacValue_box = \ MShell.addFieldCombo ( nFrame = self.DacFrame, labelName ="DAC Value", helpMessage ="DAC Control Value 0:4095", statusMessage="DAC Control Value 0:4095", initValue ="0", width = 10 ) MShell.addFieldButton ( nFrame = self.DacFrame, labelName = 'Write DAC', helpMessage = 'Send Request to Write DAC', statusMessage= 'Send Request to Write DAC', column = 3, row = MShell.currentFieldRow(), width = 10, command = self.Dac_Write_Dac ) self.DacAdcValue_box = \ MShell.addFieldCombo ( nFrame = self.DacFrame, labelName ="Desired ADC", helpMessage ="Desired ADC Value 0:505", statusMessage="Desired ADC Value 0:505", initValue ="0", width = 10 ) MShell.addFieldButton ( nFrame = self.DacFrame, labelName = 'Find DAC', helpMessage = 'Send Request to Find DAC for this ADC', statusMessage= 'Send Request to Find DAC for this ADC', column = 3, row = MShell.currentFieldRow(), width = 10, command = self.Dac_Find_Dac ) self.DacDumpToFile_var = IntVar() self.DacDumpToFile_var.set(0) MShell.addFieldCheckB ( nFrame = self.DacFrame, labelName = 'Dump File', helpMessage = 'Write to Dump File', statusMessage= 'Write to Dump File', column = 4, row = MShell.currentFieldRow(), columnspan = 3, variable = self.DacDumpToFile_var ) self.DacReply_box = \ MShell.addFieldEntry ( nFrame = self.DacFrame, labelName ="Reply", helpMessage ="Reply", statusMessage="Reply", initValue ="-", bg = 'gray80', columnspan = 5, font = ('Verdana',7), width = 43 ) self.DacCrate_button = \ MShell.addFieldButton ( nFrame = self.DacFrame, labelName = 'Find DAC Crate', helpMessage = 'Find DAC on all ADF-2 Cards in Crate', statusMessage= 'Find DAC on all ADF-2 Cards in Crate', column = 2, row = MShell.nextFieldRow(), command = self.Dac_FindDacCrate ) # The interface objects have now been created self.InterfaceCreated = "Yes" # disable certain fields self.Dac_UpdateSlotNum () #-------------------------------------------------------------------------------- def Dac_Write_Dac ( self, MasterNum = None, SlaveNum = None, SlotNum = None, TtType = None, RelEta = None, RelPhi = None, EtaSign = None, EtaMagn = None, Phi = None, DacValue = None, Comment = None ) : MasterNum_int = updateIntVar ( self.DacMasterNum_var, MasterNum ) SlaveNum_int = updateIntVar ( self.DacSlaveNum_var, SlaveNum ) SlotNum_int = updateComboBox ( self.DacSlotNum_box, SlotNum ) TtType_int = updateIntVar ( self.DacTtType_var, TtType ) TtType_int = TtType_int % TtType_tot RelEta_int = updateComboBox ( self.DacRelEta_box, RelEta ) RelPhi_int = updateComboBox ( self.DacRelPhi_box, RelPhi ) EtaSign_int = updateIntVar ( self.DacEtaSign_var, EtaSign ) EtaSign_int = EtaSign_int % EtaSign_tot EtaMagn_int = updateComboBox ( self.DacEtaMagn_box, EtaMagn ) Phi_int = updateComboBox ( self.DacPhi_box, Phi ) DacValue_int = updateComboBox ( self.DacDacValue_box, DacValue ) if ( SlotNum_int == 0 ) : printLine ( "Dac_Write", "Write %s(%s%d,%d) DAC=%4d" % ( TtType_str[TtType_int], EtaSign_str[EtaSign_int], EtaMagn_int, Phi_int, DacValue_int ) ) else : printLine ( "Dac_Write", "Write %s(%d,%d) i.e.Ch#%d %s DAC=%4d" % ( TtType_str[TtType_int], RelEta_int, RelPhi_int, 4*RelEta_int+RelPhi_int, RegAddrString ( MasterNum_int, SlaveNum_int, SlotNum_int ), DacValue_int ) ) guiCmdName = "Dac_ProgOneDac" xmlCmdDoc = CreateXmlCommand ( guiCmdName, { "ADF" : { "MASTER" : str(MasterNum_int), "SLAVE" : str(SlaveNum_int), "SLOT" : str(SlotNum_int) }, "TRGTWR" : { "TYPE" : TtType_str[TtType_int], "REL_ETA" : str(RelEta_int), "REL_PHI" : str(RelPhi_int), "ETA_SIGN" : EtaSign_str[EtaSign_int], "ETA_MAGN" : str(EtaMagn_int), "PHI" : str(Phi_int) }, "DAC" : { "VALUE" : str(DacValue_int) } } ) AppendCommentField ( xmlCmdDoc, Comment ) guiCmdReply = self.MShell.sendGuiComand ( xmlCmdDoc ) Reply_Status = RetrieveXmlAttr ( CmdReply = guiCmdReply, CmdName = guiCmdName, ReplyBox = self.DacReply_box ) if ( Reply_Status != eOk ) : printLine ( "Dac_Write", "*** Error Detected ***" ) return Reply_Status #-------------------------------------------------------------------------------- def Dac_Find_Dac ( self, MasterNum = None, SlaveNum = None, SlotNum = None, TtType = None, RelEta = None, RelPhi = None, EtaSign = None, EtaMagn = None, Phi = None, AdcValue = None, DumpToFile = None, Comment = None ) : MasterNum_int = updateIntVar ( self.DacMasterNum_var, MasterNum ) SlaveNum_int = updateIntVar ( self.DacSlaveNum_var, SlaveNum ) SlotNum_int = updateComboBox ( self.DacSlotNum_box, SlotNum ) TtType_int = updateIntVar ( self.DacTtType_var, TtType ) TtType_int = TtType_int % TtType_tot RelEta_int = updateComboBox ( self.DacRelEta_box, RelEta ) RelPhi_int = updateComboBox ( self.DacRelPhi_box, RelPhi ) EtaSign_int = updateIntVar ( self.DacEtaSign_var, EtaSign ) EtaSign_int = EtaSign_int % EtaSign_tot EtaMagn_int = updateComboBox ( self.DacEtaMagn_box, EtaMagn ) Phi_int = updateComboBox ( self.DacPhi_box, Phi ) AdcValue_int = updateComboBox ( self.DacAdcValue_box, AdcValue ) DumpToFile_int = updateIntVar ( self.DacDumpToFile_var, DumpToFile ) if ( SlotNum_int == 0 ) : printLine ( "Find_Dac", "Analyse %s(%s%d,%d) Find_DAC to get ADC=%4d" \ % ( TtType_str[TtType_int], EtaSign_str[EtaSign_int], EtaMagn_int, Phi_int, AdcValue_int ) ) else : printLine ( "Find_Dac", "Analyse %s(%d,%d) i.e.Ch#%d %s Find_DAC to get ADC=%4d" \ % ( TtType_str[TtType_int], RelEta_int, RelPhi_int, 4*RelEta_int+RelPhi_int, RegAddrString ( MasterNum_int, SlaveNum_int, SlotNum_int ), AdcValue_int ) ) guiCmdName = "Dac_Find_Dac" xmlCmdDoc = CreateXmlCommand ( guiCmdName, { "ADF" : { "MASTER" : str(MasterNum_int), "SLAVE" : str(SlaveNum_int), "SLOT" : str(SlotNum_int) }, "TRGTWR" : { "TYPE" : TtType_str[TtType_int], "REL_ETA" : str(RelEta_int), "REL_PHI" : str(RelPhi_int), "ETA_SIGN" : EtaSign_str[EtaSign_int], "ETA_MAGN" : str(EtaMagn_int), "PHI" : str(Phi_int) }, "ADC" : { "VALUE" : str(AdcValue_int), "DUMPTOFILE": str(DumpToFile_int) } } ) AppendCommentField ( xmlCmdDoc, Comment ) guiCmdReply = self.MShell.sendGuiComand ( xmlCmdDoc ) DacValue_str, \ Average_str, \ Deviation_str,\ FileName_str, \ Reply_Status = RetrieveXmlAttr ( CmdReply = guiCmdReply, CmdName = guiCmdName, EltAttrList = [ [ "DATA", "DAC", self.DacDacValue_box ], [ "DATA", "AVERAGE", None ], [ "DATA", "DEVIATION", None ], [ "FILE", "NAME", "NoFile"] ], ReplyBox = self.DacReply_box ) try : Average_float = eval ( Average_str ) except : Average_float = -1.0 try : Deviation_float = eval ( Deviation_str ) except : Deviation_float = -1.0 if ( Reply_Status == eOk ) : printLine ( "Find_Dac", "DAC = %s Average = %3.2f StdDev = %2.2f " \ % ( DacValue_str, Average_float, Deviation_float ) ) if ( DumpToFile_int != 0 ) : printLine ( "Find_Dac","File Created <%s>" % FileName_str ) else : printLine ( "Find_Dac", "*** Error Detected ***" ) return DacValue_str, Average_str, Deviation_str, FileName_str, Reply_Status #-------------------------------------------------------------------------------- def Dac_FindDacCrate ( self, MasterNum = None, SlaveNum = None, SlotNum = None, AdcValue = None, DumpToFile = None, Comment = None ) : Reply_Status = eOk if ( self.MShell.confirm( "Find_DAC on this whole crate?" ) != TRUE ) : return Reply_Status MasterNum_int = updateIntVar ( self.DacMasterNum_var, MasterNum ) SlaveNum_int = updateIntVar ( self.DacSlaveNum_var, SlaveNum ) # SlotNum will be sensed # TtType will be looped obver # RelEta will be looped obver # RelPhi will be looped obver AdcValue_int = updateComboBox ( self.DacAdcValue_box, AdcValue ) # DumpToFile set to no file for SlotNum in range(SlotNumMax+1) : # i.e. slots 0,1,2,...21 if ( self.MShell.Dialog_Rio.Rio_ProbeSlot( MasterNum = MasterNum_int, SlaveNum = SlaveNum_int, SlotNum = SlotNum ) == "Yes" ) : for TtType in TtTypes : for RelEta in range(4) : for RelPhi in range(4) : DacValue_str, Average_str, Deviation_str, FileName_str, Partial_Status = \ self.Dac_Find_Dac( MasterNum = MasterNum_int, SlaveNum = SlaveNum_int, SlotNum = SlotNum, TtType = TtType, RelEta = RelEta, RelPhi = RelPhi, AdcValue = AdcValue_int, DumpToFile = 0 ) if ( Partial_Status != eOk ) : Reply_Status = eError return Reply_Status #-------------------------------------------------------------------------------- def Dac_UpdateSlotNum ( self ) : if ( self.InterfaceCreated == "Yes" ) : SlotNum = updateComboBox ( self.DacSlotNum_box ) if ( SlotNum == 0 ) : self.DacChanNum_box.configure( entry_state="disabled") self.DacRelEta_box.configure( entry_state="disabled") self.DacRelPhi_box.configure( entry_state="disabled") self.DacAdcValue_box.configure( entry_state="disabled") self.DacEtaMagn_box.configure( entry_state="normal") self.DacPhi_box.configure( entry_state="normal") else : self.DacChanNum_box.configure( entry_state="normal") self.DacRelEta_box.configure( entry_state="normal") self.DacRelPhi_box.configure( entry_state="normal") self.DacAdcValue_box.configure( entry_state="normal") self.DacEtaMagn_box.configure( entry_state="disabled") self.DacPhi_box.configure( entry_state="disabled") return #-------------------------------------------------------------------------------- def Dac_UpdateChanNum ( self ) : if ( self.InterfaceCreated == "Yes" ) : Old_ChanNum = updateComboBox ( self.DacChanNum_box ) Old_RelEta = updateComboBox ( self.DacRelEta_box ) Old_RelPhi = updateComboBox ( self.DacRelPhi_box ) New_ChanNum = 4 * Old_RelEta + Old_RelPhi if ( New_ChanNum <> Old_ChanNum ) : # stop circular call caused by setentry self.DacChanNum_box.setentry( New_ChanNum ) return #-------------------------------------------------------------------------------- def Dac_UpdateRelEtaPhi ( self ) : if ( self.InterfaceCreated == "Yes" ) : Old_ChanNum = updateComboBox ( self.DacChanNum_box ) Old_RelEta = updateComboBox ( self.DacRelEta_box ) Old_RelPhi = updateComboBox ( self.DacRelPhi_box ) New_RelEta = Old_ChanNum / 4 New_RelPhi = Old_ChanNum % 4 if ( New_RelEta <> Old_RelEta ) : # stop circular call caused by setentry self.DacRelEta_box.setentry( New_RelEta ) if ( New_RelPhi <> Old_RelPhi ) : # stop circular call caused by setentry self.DacRelPhi_box.setentry( New_RelPhi ) return #--------------------------------------------------------------------------------