from subprocess import PIPE, Popen ################################################################## read_count = 0 write_count = 0 ################################################################## def py_vme_init ( ) : # needs to be declared because we modify it global read_count global write_count read_count = 0 write_count = 0 cmd = [ "which", "vme" ] subp = Popen ( cmd, stdout=PIPE, stderr=PIPE ) stdout, stderr = subp.communicate() if ( stderr.find ( "no vme" ) != -1 ) : print "py_vme_exists: Detected that the 'vme' command is not defined." print " Please setup the l1calo software and try again." return "Fail" else : return "Ok" ################################################################## def py_vme_read ( vme_addr_hex, return_stdout = False ) : # needs to be declared because we modify it global read_count read_count += 1 #print "py_vme_read#%d: called to read %s" % \ # ( read_count, # vme_addr_hex ) vme_addr_int = eval ( vme_addr_hex ) cmd = [ "vme", "dump", hex(vme_addr_int), hex(vme_addr_int+1) ] subp = Popen ( cmd, stdout=PIPE, stderr=PIPE ) stdout, stderr = subp.communicate() #print "stdout" + stdout #print "stderr" + stderr if ( stdout.find ( "bus error" ) != -1 ) : print "py_vme_read#%d: detected a bus error during 'vme dump' command:\n %s" % \ ( read_count, stdout ) data_hex = "****" else : try: stdout_addr_target = "%s:" % vme_addr_hex[2:] loc_address = stdout.rfind ( stdout_addr_target.lower() ) data_hex = "0x%s" % stdout[loc_address:].split()[1] except: print "py_vme_read#%d: error parsing 'stdout' from 'vme dump' command:\n%s" % \ ( read_count, stdout ) data_hex = "????" if ( stderr != "" ) : # this seems to never happen anyway print "py_vme_read#%d: 'stderr' from 'vme dump' command was not empty:\n %s" % \ ( read_count, stderr ) if ( return_stdout == True ) : return data_hex, stdout else : return data_hex ################################################################## def py_vme_write ( vme_addr_hex, data_hex, return_stdout = False ) : # needs to be declared because we modify it global write_count write_count += 1 #print "py_vme_write#%d: called to write %s at %s" % \ # ( write_count, # data_hex, # vme_addr_hex ) if ( data_hex[:2] != "0x" ) : print "py_vme_write#%d: incorrect data parameter <%s> does not start with 0x" % \ ( write_count, data_hex ) if ( len(data_hex) != 6 ) : print "py_vme_write#%d: incorrect data parameter <%s> expected 4 digits after 0x" % \ ( write_count, data_hex ) vme_addr_int = eval ( vme_addr_hex ) cmd = [ "vme", "edit", hex(vme_addr_int), hex(vme_addr_int+1) ] subp = Popen ( cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE ) stdout, stderr = subp.communicate( input = "%s\n" % data_hex[2:] ) if ( stdout.find ( "bus error" ) != -1 ) : print "py_vme_write#%d: detected a bus error during 'vme edit' command:\n %s" % \ ( write_count, stdout ) if ( stderr != "" ) : # this seems to never happen anyway print "py_vme_write#%d: 'stderr' from 'vme edit' command was not empty:\n %s" % \ ( write_count, stderr ) if ( return_stdout == True ) : return stdout else : return ################################################################## def py_vme_read_count ( ) : return read_count def py_vme_write_count ( ) : return write_count