#!/usr/bin/env python

import sys, subprocess
import Tkinter
from  Tkinter import *
import tkFont

#helv36 = tkFont.Font(family='Helvetica', size=36, weight='bold')

class sysid:
  Version = ''
  SysId = ''
  SubId = ''
  Date  = ''
 
class VMon:
  DACSp1 = 0.0
  DACSp2 = 0.0
  DACValue1 = 0.0
  DACValue2 = 0.0
  LoMonitor = 0.0
  LoTemperature = 0.0
  VDD = 0.0
  V1d2 = 0.0
  V3d3 = 0.0
  Temperature = 0.0

def racc(reg):
    sshcmd="ssh"
    dev="/dev/sis8300-8"
    host="laci@ioc-b34-cd43"
    rcmd="""/afs/slac/u/qb/strauman/racc -d """ + dev \
         + " " + str(reg)  + """ | awk '{printf("%u",$2);}' """
    return int( subprocess.check_output([sshcmd,"-x",host,rcmd]) )
   
def wacc(reg,data):
    sshcmd="ssh"
    dev="/dev/sis8300-8"
    host="laci@ioc-b34-cd43"
    rcmd="""/afs/slac/u/qb/strauman/racc -d """ + dev \
         + " " + str(reg)  + " " + str(data) 
    return int( subprocess.call([sshcmd,"-x",host,rcmd]) )

def UpdateValues():
  x= wacc(0x410,6)
  count =0
  x = racc(0x400)
  while (x != 0):
    x = racc(0x400)
    count = count + 1 
    if (count > 20):
      x = 0

      

def GetMonitor():
  t = VMon() 
  t.DACSp1 = racc(0x418)/65535.0*DacConvert
  t.DACSp2 = racc(0x419)/65535.0*DacConvert
  t.DACValue1 = racc(0x430)*305.18e-6
  t.DACValue2 = racc(0x431)*305.18e-6
  t.LoMonitor = racc(0x432)*305.18e-6
  t.LoTemperature = racc(0x433)*305.18e-6
  t.VDD = racc(0x434)*2.0*305.18e-6
  t.V1d2 = racc(0x435)*305.18e-6
  t.V3d3 = racc(0x436)*305.18e-6 + 2.5
  t.Temperature = racc(0x437)*.0625
  return (t)

DacConvert = 3.2

def UpDateDAC1():
  DAC1 = int(float(Entry.get(e_DACSp1)) / DacConvert * 65535.0)
  wacc(0x418, DAC1)
  Refresh()
  return

def UpDateDAC2():
  DAC2 = int(float(Entry.get(e_DACSp2)) / DacConvert * 65535.0)
  wacc(0x419, DAC2) 
  Refresh()
  return

def DecodeString(val):
  s = ""
  for i in range (1,5):
    s += chr(int(val) >> (32 - i*8) & 0xFF)
  return s

def UpDateAtten():
  val = int(Entry.get(e_Atten1A))
  wacc(0x420, val)
  val = int(Entry.get(e_Atten1B))
  wacc(0x421, val)
  val = int(Entry.get(e_Atten2A))
  wacc(0x422, val)
  val = int(Entry.get(e_Atten2B))
  wacc(0x423, val)
  val = int(Entry.get(e_Atten3A))
  wacc(0x424, val)
  val = int(Entry.get(e_Atten3B))
  wacc(0x425, val)
  val = int(Entry.get(e_Atten4A))
  wacc(0x426, val)
  val = int(Entry.get(e_Atten4B))
  wacc(0x427, val)
  val = int(Entry.get(e_Atten5A))
  wacc(0x428, val)
  val = int(Entry.get(e_Atten5B))
  wacc(0x429, val)
  val = int(Entry.get(e_Atten6A))
  wacc(0x42A, val)
  val = int(Entry.get(e_Atten6B))
  wacc(0x42B, val)
  val = int(Entry.get(e_Atten7A))
  wacc(0x42C, val)
  val = int(Entry.get(e_Atten7B))
  wacc(0x42D, val)
  val = int(Entry.get(e_Atten8A))
  wacc(0x42E, val)
  val = int(Entry.get(e_Atten8B))
  wacc(0x42F, val)
  Refresh()
  return
	
def GetId(reg):
  t = sysid()
  # Version
  t.Version = '0x{0:X}'.format(racc(reg))

  #sys ID  
  t.SysId = DecodeString(racc(reg+1)) + DecodeString(racc(reg+2))

  #Sub ID  
  t.SubId = DecodeString(racc(reg+3)) + DecodeString(racc(reg+4))
  
  #Date 
  t.Date=  DecodeString(racc(reg+5)) + DecodeString(racc(reg+6))
  return(t)
  
def PrintId(sysid):
  print "   Version = " + sysid.Version
  print " System ID = " + sysid.SysId    
  print "    Sub ID = " + sysid.SubId    
  print "      Date = " + sysid.Date


def cmd_Sw1():
	wacc(0x411,v_Sw1.get())

def cmd_Sw2():
	wacc(0x412,v_Sw2.get())

def cmd_Sw3():
	wacc(0x413,v_Sw3.get())

  
def ResetRTM():
  wacc(0x410,0x10000)
  Refresh()
  
AMCId = sysid()
RTMId = sysid()
VoltageMonitor = VMon()  
  
UpdateValues()

AMCId = GetId(0x401)
RTMId = GetId(0x440)
VoltageMonitor = GetMonitor()

def Refresh():
    UpdateValues()
    VoltageMonitor =GetMonitor()
    v_DACSp1.set('{0:2.3f}'.format(VoltageMonitor.DACSp1))
    v_DACSp2.set('{0:2.3f}'.format(VoltageMonitor.DACSp2))
    v_DACValue1.set('{0:2.4f}'.format(VoltageMonitor.DACValue1))
    v_DACValue2.set('{0:2.4f}'.format(VoltageMonitor.DACValue2))
    v_LoMonitor.set('{0:2.4f}'.format(VoltageMonitor.LoMonitor))
    v_LoTemperature.set('{0:2.4f}'.format(VoltageMonitor.LoTemperature))
    v_VDD.set('{0:2.4f}'.format(VoltageMonitor.VDD))
    v_V1d2.set('{0:2.4f}'.format(VoltageMonitor.V1d2))
    v_V3d3.set('{0:2.4f}'.format(VoltageMonitor.V3d3))
    v_Temperature.set('{0:2.3f}'.format(VoltageMonitor.Temperature))

    v_Atten1A.set('{0}'.format(racc(0x420)))
    v_Atten1B.set('{0}'.format(racc(0x421)))
    v_Atten2A.set('{0}'.format(racc(0x422)))
    v_Atten2B.set('{0}'.format(racc(0x423)))
    v_Atten3A.set('{0}'.format(racc(0x424)))
    v_Atten3B.set('{0}'.format(racc(0x425)))
    v_Atten4A.set('{0}'.format(racc(0x426)))
    v_Atten4B.set('{0}'.format(racc(0x427)))
    v_Atten5A.set('{0}'.format(racc(0x428)))
    v_Atten5B.set('{0}'.format(racc(0x429)))
    v_Atten6A.set('{0}'.format(racc(0x42A)))
    v_Atten6B.set('{0}'.format(racc(0x42B)))
    v_Atten7A.set('{0}'.format(racc(0x42C)))
    v_Atten7B.set('{0}'.format(racc(0x42D)))
    v_Atten8A.set('{0}'.format(racc(0x42E)))
    v_Atten8B.set('{0}'.format(racc(0x42F)))

    v_Sw1.set(racc(0x411))
    v_Sw2.set(racc(0x412))
    v_Sw3.set(racc(0x413))

    v_CSR.set('0x{0:08x}'.format(racc(0x400)))

    return

top = Tk()

v_DACSp1 = StringVar()
v_DACSp2 = StringVar()
v_DACValue1 = StringVar()
v_DACValue2 = StringVar()
v_LoMonitor = StringVar()
v_LoTemperature = StringVar()
v_VDD = StringVar()
v_V1d2= StringVar()
v_V3d3 = StringVar()
v_Temperature = StringVar()

v_Atten1A = StringVar()
v_Atten1B = StringVar()
v_Atten2A = StringVar()
v_Atten2B = StringVar()
v_Atten3A = StringVar()
v_Atten3B = StringVar()
v_Atten4A = StringVar()
v_Atten4B = StringVar()
v_Atten5A = StringVar()
v_Atten5B = StringVar()
v_Atten6A = StringVar()
v_Atten6B = StringVar()
v_Atten7A = StringVar()
v_Atten7B = StringVar()
v_Atten8A = StringVar()
v_Atten8B = StringVar()

v_Sw1 = IntVar()
v_Sw2 = IntVar()
v_Sw3 = IntVar()

v_CSR = IntVar()

f_title = Frame(top)
f_amc = Frame(top, bd=4, relief=RIDGE)
f_rtm = Frame(top, bd=4, relief=RIDGE)
f_AD9510 = Frame(top, bd=4, relief=RIDGE)
f_Csr = Frame(top, bd=4, relief=RIDGE)

f_monitor = Frame(top, bd=4, relief=RIDGE)

f_Atten = Frame(top, bd=4, relief=RIDGE)
f_Switch = Frame(top, bd=4, relief=RIDGE)

f_title.grid(row = 0, column = 0, columnspan=3)
f_amc.grid(row=1,column=0, sticky = N)
f_rtm.grid(row=2,column=0, sticky = N)
f_AD9510.grid(row=3, column=0, rowspan=3, sticky = N)

f_monitor.grid(row=1, column=1, rowspan=3, columnspan=2, sticky=N)

f_Atten.grid(row=1, column = 3, rowspan=4)
f_Switch.grid(row=3, column = 1, rowspan = 3, sticky=W)


Button(top, text = "Reset", command= ResetRTM).grid(row=5, column=2)

f_Csr.grid(row=4, column=2)
Label(f_Csr, text = "CSR = ").grid(row=1, column = 0, sticky = E)
Label(f_Csr, textvariable = v_CSR, width=10).grid(row =1, column = 1, sticky = W)

Label(f_title, text = "ESS BMP Test Interface", fg = "blue", font =('Times', '24', 'bold italic')).grid(row=0, column = 0)

Label(f_amc, text = "AMC ID", fg = "blue").grid(row=0, column = 0)
Label(f_amc, text = 'Version ' + AMCId.Version).grid(row = 1, column=0, sticky = W)
Label(f_amc, text = 'Sytem ID ' + AMCId.SysId).grid(row = 2, column=0, sticky = W)
Label(f_amc, text = 'Sub ID ' + AMCId.SubId).grid(row = 3, column=0, sticky = W)
Label(f_amc, text = 'Date ' + AMCId.Date).grid(row = 4, column=0, sticky = W)

Label(f_rtm, text = "RTM ID", fg = "blue").grid(row=0, column = 0)
Label(f_rtm, text = 'Version ' + RTMId.Version).grid(row = 1, column=0, sticky = W)
Label(f_rtm, text = 'Sytem ID ' + RTMId.SysId).grid(row = 2, column=0, sticky = W)
Label(f_rtm, text = 'Sub ID ' + RTMId.SubId).grid(row = 3, column=0, sticky = W)
Label(f_rtm, text = 'Date ' + RTMId.Date).grid(row = 4, column=0, sticky = W)

Label(f_monitor, text = 'Monitor', fg = "blue").grid(row=1, column = 0, columnspan =3)
Label(f_monitor, text = 'Dac Set Point 1 ').grid(row=2, column = 0, sticky = E)
Label(f_monitor, text = '  Dac Voltage 1 ').grid(row=3, column = 0, sticky = E)
Label(f_monitor, text = 'Dac Set Point 2 ').grid(row=4, column = 0, sticky = E)
Label(f_monitor, text = '  Dac Voltage 2 ').grid(row=5, column = 0, sticky = E, pady=4)
Label(f_monitor, text = '     LO Monitor ').grid(row=6, column = 0, sticky = E, pady=4)
Label(f_monitor, text = 'LO Temperature  ').grid(row=7, column = 0, sticky = E, pady=4)
Label(f_monitor, text = '      VDD(5.0V) ').grid(row=8, column = 0, sticky = E, pady=4)
Label(f_monitor, text = '           1.2V ').grid(row=9, column = 0, sticky = E, pady=4)
Label(f_monitor, text = '           3.3V ').grid(row=10, column = 0, sticky = E, pady=4)
Label(f_monitor, text = '    Temperature ').grid(row=11, column = 0, sticky = E, pady=4)

#Label(f_monitor, textvariable = v_DACSp1, width=10).grid(row =2, column = 1)
Label(f_monitor, textvariable = v_DACValue1, width=10).grid(row =3, column = 1)
#Label(f_monitor, textvariable = v_DACSp2, width=10).grid(row =4, column = 1)
Label(f_monitor, textvariable = v_DACValue2, width=10).grid(row =5, column = 1)
Label(f_monitor, textvariable = v_LoMonitor, width=10).grid(row =6, column = 1)
Label(f_monitor, textvariable = v_LoTemperature, width=10).grid(row =7, column = 1)
Label(f_monitor, textvariable = v_VDD, width=10).grid(row =8, column = 1)
Label(f_monitor, textvariable = v_V1d2, width=10).grid(row =9, column = 1)
Label(f_monitor, textvariable = v_V3d3, width=10).grid(row =10, column = 1)
Label(f_monitor, textvariable = v_Temperature, width=10).grid(row =11, column = 1)

Refresh()

e_DACSp1 = Entry(f_monitor, textvariable = v_DACSp1, width=6)
e_DACSp1.grid(row=2, column=1, sticky=E, padx=15)

e_DACSp2 = Entry(f_monitor, textvariable = v_DACSp2, width=6)
e_DACSp2.grid(row=4, column=1, sticky=E, padx=15)

Button(f_monitor, text = "UpDate", command= UpDateDAC1).grid(row=2, column=3)
Button(f_monitor, text = "UpDate", command= UpDateDAC2).grid(row=4, column=3)

Label(f_AD9510, text = 'AD9510', fg = "blue").grid(row=1, column = 0)
Label(f_AD9510, text = 'Channel 0        {0:2X}'.format(racc(0x4BC))).grid(row=2, column = 0, sticky = E)
Label(f_AD9510, text = 'Channel 1        {0:2X}'.format(racc(0x4BE))).grid(row=3, column = 0, sticky = E)
Label(f_AD9510, text = 'Channel 2        {0:2X}'.format(racc(0x4BE))).grid(row=4, column = 0, sticky = E)
Label(f_AD9510, text = 'Channel 3        {0:2X}'.format(racc(0x4BF))).grid(row=5, column = 0, sticky = E)
Label(f_AD9510, text = 'Channel 4        {0:2X}'.format(racc(0x4C0))).grid(row=6, column = 0, sticky = E)
Label(f_AD9510, text = 'Channel 5        {0:2X}'.format(racc(0x4C1))).grid(row=7, column = 0, sticky = E)
Label(f_AD9510, text = 'Channel 6        {0:2X}'.format(racc(0x4C2))).grid(row=8, column = 0, sticky = E)
Label(f_AD9510, text = 'Channel 7        {0:2X}'.format(racc(0x4C3))).grid(row=9, column = 0, sticky = E)
Label(f_AD9510, text = 'Clock Select     {0:2X}'.format(racc(0x4C5))).grid(row=10, column = 0, sticky = E)
Label(f_AD9510, text = 'Function Select  {0:2X}'.format(racc(0x4D8))).grid(row=11, column = 0, sticky = E)

Label(f_Atten, text = 'Attenuators', fg = "blue").grid(row=1, column = 0, columnspan= 3)
Label(f_Atten, text = 'Atten1A ').grid(row=2, column = 0, sticky = E)
Label(f_Atten, text = 'Atten1B ').grid(row=3, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten2A ').grid(row=4, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten2B ').grid(row=5, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten3A ').grid(row=6, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten3B ').grid(row=7, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten4A ').grid(row=8, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten4B ').grid(row=9, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten5A ').grid(row=10, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten5B ').grid(row=11, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten6A ').grid(row=12, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten6B ').grid(row=13, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten7A ').grid(row=14, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten7B ').grid(row=15, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten8A ').grid(row=16, column = 0, sticky = E, pady=4)
Label(f_Atten, text = 'Atten8B ').grid(row=17, column = 0, sticky = E, pady=4)

#Label(f_Atten, textvariable = v_Atten1A ).grid(row=2, column = 1, sticky = E)
#Label(f_Atten, textvariable = v_Atten1B ).grid(row=3, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten2A ).grid(row=4, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten2B ).grid(row=5, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten3A ).grid(row=6, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten3B ).grid(row=7, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten4A ).grid(row=8, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten4B ).grid(row=9, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten5A ).grid(row=10, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten5B ).grid(row=11, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten6A ).grid(row=12, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten6B ).grid(row=13, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten7A ).grid(row=14, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten7B ).grid(row=15, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten8A ).grid(row=16, column = 1, sticky = E, pady=4)
#Label(f_Atten, textvariable = v_Atten8B ).grid(row=17, column = 1, sticky = E, pady=4)


e_Atten1A = Entry(f_Atten, textvariable = v_Atten1A, width=5)
e_Atten1B = Entry(f_Atten, textvariable = v_Atten1B,width=5)
e_Atten2A = Entry(f_Atten, textvariable = v_Atten2A,width=5)
e_Atten2B = Entry(f_Atten, textvariable = v_Atten2B,width=5)
e_Atten3A = Entry(f_Atten, textvariable = v_Atten3A,width=5)
e_Atten3B = Entry(f_Atten, textvariable = v_Atten3B,width=5)
e_Atten4A = Entry(f_Atten, textvariable = v_Atten4A,width=5)
e_Atten4B = Entry(f_Atten, textvariable = v_Atten4B,width=5)
e_Atten5A = Entry(f_Atten, textvariable = v_Atten5A,width=5)
e_Atten5B = Entry(f_Atten, textvariable = v_Atten5B,width=5)
e_Atten6A = Entry(f_Atten, textvariable = v_Atten6A,width=5)
e_Atten6B = Entry(f_Atten, textvariable = v_Atten6B,width=5)
e_Atten7A = Entry(f_Atten, textvariable = v_Atten7A,width=5)
e_Atten7B = Entry(f_Atten, textvariable = v_Atten7B,width=5)
e_Atten8A = Entry(f_Atten, textvariable = v_Atten8A,width=5)
e_Atten8B = Entry(f_Atten, textvariable = v_Atten8B,width=5)

e_Atten1A.grid(row=2, column=2, padx=15)
e_Atten1B.grid(row=3, column=2, padx=15)
e_Atten2A.grid(row=4, column=2, padx=15)
e_Atten2B.grid(row=5, column=2, padx=15)
e_Atten3A.grid(row=6, column=2, padx=15)
e_Atten3B.grid(row=7, column=2, padx=15)
e_Atten4A.grid(row=8, column=2, padx=15)
e_Atten4B.grid(row=9, column=2, padx=15)
e_Atten5A.grid(row=10, column=2, padx=15)
e_Atten5B.grid(row=11, column=2, padx=15)
e_Atten6A.grid(row=12, column=2, padx=15)
e_Atten6B.grid(row=13, column=2, padx=15)
e_Atten7A.grid(row=14, column=2, padx=15)
e_Atten7B.grid(row=15, column=2, padx=15)
e_Atten8A.grid(row=16, column=2, padx=15)
e_Atten8B.grid(row=17, column=2, padx=15)

Label(f_Switch, text = 'Switches', fg = "blue").grid(row=1, column = 0, sticky = W, pady=4)
chkb_Sw1 = Checkbutton(f_Switch, text = "Sw1", command = cmd_Sw1, variable = v_Sw1, onvalue = 1,	 \
	offvalue = 0)
chkb_Sw2 = Checkbutton(f_Switch, text = "Sw2", command = cmd_Sw2, variable = v_Sw2, onvalue = 1,	 \
	offvalue = 0)
chkb_Sw3 = Checkbutton(f_Switch, text = "Sw3", command = cmd_Sw3, variable = v_Sw3, onvalue = 1,	 \
offvalue = 0)

chkb_Sw1.grid(row=2, column = 0)
chkb_Sw2.grid(row=3, column = 0)
chkb_Sw3.grid(row=4, column = 0)


Button(f_Atten, text = "UpDate", command= UpDateAtten).grid(row=2, column=3)
top.mainloop()
