Example #1
0
def loggingUIMain(argv, stdout, env):
    global master
    #check arguments for a help flag
    optlist, args = getopt.getopt(argv[1:], "h?", ["help"])
    if filter(lambda x: x in ["-h", "-?", "--help"], optlist):
        usage(stdout, argv[0])
        return

    # HACK to get things running
    serverUri = 'http://localhost:%s/' % rospy.DEFAULT_TEST_PORT
    print "TEST MODE: Providing ROS parameters manually"
    print "NOTE: assuming server at %s" % serverUri
    os.environ[rospy.ROS_PORT] = str(0)  #any
    os.environ[rospy.ROS_MASTER_URI] = serverUri
    os.environ[rospy.ROS_NODE] = NAME

    rospy.start()  #blocks until connected to master
    master = rospy.getMaster()
    print "ready to run"

    root = Tkinter.Tk()
    #Tkinter.Button(root,text="Load Graph").pack()
    #root.update()

    f = InitialPrompt(root)

    #   root.wait_window(f.top)
    #   print "got my initial prompt"
    #d = RecordManagement(root)
    #    print "record management has returned"
    #    root.wait_window(d.top)
    #    Tkinter.Button(root, text="test").pack()

    #    root.update()
    root.mainloop()
Example #2
0
def viewGraphMain(argv, stdout, env):
    # default arguments
    server = "http://localhost"
    server_port = rospy.DEFAULT_TEST_PORT

    #check arguments for a help flag
    optlist, args = getopt.getopt(argv[1:], "h?p:s:",
                                  ["help", "port=", "server=", "test"])
    for o, a in optlist:
        if o in ("-h", "-?", "--help"):
            usage(stdout, argv[0])
            return
        elif o in ("--test"):
            server_port = rospy.DEFAULT_TEST_PORT
        elif o in ("-p", "--port"):
            server_port = a
        elif o in ("-s", "--server"):
            server = a

    serverUri = '%s:%s/' % (server, server_port)
    print "Looking for server at %s" % serverUri
    os.environ[rospy.ROS_MASTER_URI] = serverUri
    os.environ[rospy.ROS_NODE] = "viewGraph"
    os.environ[rospy.ROS_PORT] = str(0)  # any

    master = rospy.getMaster()
    rospy.ready()

    while 1:
        status_code, statusMessage, [nodes, flows] = master.getGraph()
        #        print 'nodes' + str(nodes)
        #        print 'flows ' + str(flows)

        print '--------------------------------------------'
        print 'This is the graph:'
        print 'refreshing every 10 seconds'
        print '--------------------------------------------'

        for anode in nodes:
            status_code, statusMessage, [machine, address,
                                         port] = master.getNodeAddress(anode)
            print 'NODE: ' + str(anode) + ' on ' + str(machine) + ' at ' + str(
                address) + ' on port: ' + str(port)
            for aflow in flows:
                aflow_split = str(aflow[1]).split(':')
                destination = aflow_split[0]
                aflow_split_source = str(aflow[0]).split(':')
                source = aflow_split_source[0]
                if destination == anode:
                    print '\tINFLOW: ' + str(aflow_split[1]) + ' from: ' + str(
                        aflow[0])
                if source == anode:
                    print '\tOUTFLOW: ' + str(
                        aflow_split_source[1]) + ' to: ' + str(aflow[1])

        print '--------------------------------------------'
        time.sleep(10.0)
Example #3
0
def viewGraphMain(argv, stdout, env):
    # default arguments
    server = "http://localhost"
    server_port = rospy.DEFAULT_TEST_PORT

    #check arguments for a help flag
    optlist, args = getopt.getopt(argv[1:], "h?p:s:", ["help","port=","server=","test"])
    for o, a in optlist:
        if o in ("-h","-?","--help"):
            usage(stdout, argv[0])
            return
        elif o in ("--test"):
            server_port = rospy.DEFAULT_TEST_PORT
        elif o in ("-p", "--port"):
            server_port = a
        elif o in ("-s", "--server"):
            server = a


    serverUri = '%s:%s/'%(server,server_port)
    print "Looking for server at %s"%serverUri
    os.environ[rospy.ROS_MASTER_URI] = serverUri
    os.environ[rospy.ROS_NODE] = "viewGraph"
    os.environ[rospy.ROS_PORT] = str(0) # any

            
    master = rospy.getMaster()
    rospy.ready()

    while 1:
        status_code, statusMessage, [nodes,flows] = master.getGraph()
        #        print 'nodes' + str(nodes)
        #        print 'flows ' + str(flows)
        
        print '--------------------------------------------'
        print 'This is the graph:'
        print 'refreshing every 10 seconds'
        print '--------------------------------------------'
        
        for anode in nodes:
            status_code, statusMessage, [machine, address, port] = master.getNodeAddress(anode)
            print 'NODE: ' + str(anode) + ' on ' + str(machine) + ' at ' + str(address) + ' on port: ' + str(port)
            for aflow in flows:
                aflow_split= str(aflow[1]).split(':')
                destination = aflow_split[0]
                aflow_split_source = str(aflow[0]).split(':')
                source = aflow_split_source[0]
                if destination == anode:
                    print '\tINFLOW: ' + str(aflow_split[1]) + ' from: ' + str(aflow[0])
                if source == anode:
                    print '\tOUTFLOW: ' + str(aflow_split_source[1]) + ' to: ' + str(aflow[1])

        print '--------------------------------------------'
        time.sleep(10.0)
Example #4
0
def viewGraphMain(argv, stdout, env):
    # default arguments
    server = "http://localhost"
    server_port = rospy.DEFAULT_TEST_PORT

    #check arguments for a help flag
    optlist, args = getopt.getopt(argv[1:], "h?p:s:", ["help","port=","server=","test"])
    for o, a in optlist:
        if o in ("-h","-?","--help"):
            usage(stdout, argv[0])
            return
        elif o in ("--test"):
            server_port = rospy.DEFAULT_TEST_PORT
        elif o in ("-p", "--port"):
            server_port = a
        elif o in ("-s", "--server"):
            server = a


    serverUri = '%s:%s/'%(server,server_port)
    print "Looking for server at %s"%serverUri
    os.environ[rospy.ROS_MASTER_URI] = serverUri
    os.environ[rospy.ROS_NODE] = "watchBatteries"
    os.environ[rospy.ROS_PORT] = str(0) # any

            
    master = rospy.getMaster()
    rospy.ready()

    while 1:
        print "-------------------------------------------------------------------"
        print "Getting IBPS params from Parameter Server"
        print "-------------------------------------------------------------------"
        status_code, statusMessage, current = master.getParam('IBPS.current')
        print  "Current (A into Battery)"
        print current
        status_code, statusMessage, voltage = master.getParam('IBPS.voltage')
        print  "Voltage (V)"
        print voltage
        status_code, statusMessage, time_remaining = master.getParam('IBPS.time_remaining')
        print  "Time Remaining (minutes)"
        print  time_remaining
        status_code, statusMessage, average_charge = master.getParam('IBPS.average_charge')
        print  "Average Charge (percentage)"
        print average_charge

        
        time.sleep(1.0)
Example #5
0
def logging_nodeMain(argv, stdout, env):
    #check arguments for a help flag
    optlist, args = getopt.getopt(argv[1:], "h?", ["help"])
    if filter(lambda x: x in ["-h", "-?", "--help"], optlist):
        usage(stdout, argv[0])
        return

    rospy.start()  #blocks until connected to master
    master = rospy.getMaster()
    #initialize flows
    in_string_in = common_flows.FlowString(".input")
    while 1:  #TODO: replace with shutdown check
        #read/publish flows
        # - read inflow data
        #print master.getParam('.name')
        string_inData = in_string_in.receive()
        print "logging_node recieved: " + string_inData.data
Example #6
0
def logging_nodeMain(argv, stdout, env):
    #check arguments for a help flag
    optlist, args = getopt.getopt(argv[1:], "h?", ["help"])
    if filter(lambda x: x in ["-h","-?","--help"], optlist):
        usage(stdout, argv[0])
        return

    rospy.start() #blocks until connected to master
    master = rospy.getMaster();
    #initialize flows
    in_string_in = common_flows.FlowString(".input")
    while 1: #TODO: replace with shutdown check
        #read/publish flows
        # - read inflow data
        #print master.getParam('.name')
        string_inData = in_string_in.receive()
        print "logging_node recieved: " + string_inData.data
Example #7
0
def loggingUIMain(argv, stdout, env):
    global master
    #check arguments for a help flag
    optlist, args = getopt.getopt(argv[1:], "h?", ["help"])
    if filter(lambda x: x in ["-h","-?","--help"], optlist):
        usage(stdout, argv[0])
        return

    # HACK to get things running
    serverUri = 'http://localhost:%s/'%rospy.DEFAULT_TEST_PORT
    print "TEST MODE: Providing ROS parameters manually"
    print "NOTE: assuming server at %s"%serverUri
    os.environ[rospy.ROS_PORT] = str(0) #any
    os.environ[rospy.ROS_MASTER_URI] = serverUri
    os.environ[rospy.ROS_NODE] = NAME

    
    

    rospy.start() #blocks until connected to master
    master = rospy.getMaster()
    print "ready to run"
    
    root = Tkinter.Tk()
    #Tkinter.Button(root,text="Load Graph").pack()
    #root.update()


    f = InitialPrompt(root)
    
    #   root.wait_window(f.top)
    #   print "got my initial prompt"
    #d = RecordManagement(root)
    #    print "record management has returned"
    #    root.wait_window(d.top)
    #    Tkinter.Button(root, text="test").pack()
    
    #    root.update()
    root.mainloop()
Example #8
0
def monitorBatteriesMain(argv, stdout, env):
    # default arguments
    server = "http://localhost"
    server_port = rospy.DEFAULT_TEST_PORT

    #check arguments for a help flag
    optlist, args = getopt.getopt(argv[1:], "h?p:s:", ["help","port=","server=","test"])
    for o, a in optlist:
        if o in ("-h","-?","--help"):
            usage(stdout, argv[0])
            return
        elif o in ("--test"):
            server_port = rospy.DEFAULT_TEST_PORT
        elif o in ("-p", "--port"):
            server_port = a
        elif o in ("-s", "--server"):
            server = a
            
    serverUri = '%s:%s/'%(server,server_port)
    print "Looking for server at %s"%serverUri
    os.environ[rospy.ROS_MASTER_URI] = serverUri
    os.environ[rospy.ROS_NODE] = NAME
    os.environ[rospy.ROS_PORT] = str(0) # any


    master = rospy.getMaster()


    rospy.ready()


    setupPorts()
    
#f= open('testfile.txt','r')
    f0 = open('/dev/ttyUSB0','r')
    f1 = open('/dev/ttyUSB1','r')
    f2 = open('/dev/ttyUSB2','r')
    f3 = open('/dev/ttyUSB3','r')
# split on %  to string and checksum
# check checksum

    myPow = robotPower()

    start_time = time.time()
    last_time = start_time
    while True:
        current, blah, blah2 = select.select([f0,f1,f2,f3],[],[],1)
        for f in current:
            if f == f0:
                port = 0;
                port_string = 'f0'
            if f == f1:
                port = 1;
                port_string = 'f1'
            if f == f2:
                port = 2;
                port_string = 'f2'
            if f == f3:
                port = 3;
                port_string = 'f3'
            line = f.readline()
            halves = line.split('%')
            if len(halves) != 2:
                #            print 'I did not split on \% correctly'
                continue
            halves[1]=halves[1].strip()
            halves[0]=halves[0].lstrip('$')

#        print line
#    print halves
#    print len(halves)
#    print checksum256(halves[0])
#    print hex2dec(halves[1])
            #    print hex(255)


            # read first char and switch
            message = halves[0]

            # case C controller

            # split on commas
            # first element is controller number
            # for each pair
            # read index  01-07
            # record value
            if len(message) < 2:
                print "error message too short: \"%s\" from \"%s\""%(message, line)
                print "This often indicates a misconfigured serial port check port:"
                print f
                continue
            if message[0] == 'C':
                controller_number = int(message[1])
                #print 'Controller on port %s says:'%(port_string)
                splitmessage = message.split(',')

                #print 'batteries present'
                #print  readmask(splitmessage[2])
                mask = readmask(splitmessage[2])
                for i in range(0,8):
                    myPow.controllers[port].batteries[i].present = mask[i]
                #print 'batteries charging'
                #print  readmask(splitmessage[4])
                mask = readmask(splitmessage[2])
                for i in range(0,8):
                    myPow.controllers[port].batteries[i].charging = mask[i]
                #print 'batteries supplying power to system'
                #print  readmask(splitmessage[6])
                mask = readmask(splitmessage[6])
                for i in range(0,8):
                    myPow.controllers[port].batteries[i].supplying_power = mask[i]
                #print 'batteries which have charge power present'
                #print  readmask(splitmessage[10])
                mask = readmask(splitmessage[10])
                for i in range(0,8):
                    myPow.controllers[port].batteries[i].w_charge_power = mask[i]
                #print 'batteries with "Power no good"'
                #print  readmask(splitmessage[12])
                mask = readmask(splitmessage[12])
                for i in range(0,8):
                    myPow.controllers[port].batteries[i].power_no_good = mask[i]
                #print 'batteries charge inhibited'
                #print  readmask(splitmessage[14])
                mask = readmask(splitmessage[14])
                for i in range(0,8):
                    myPow.controllers[port].batteries[i].charge_inhibited = mask[i]

            else:
                pass

            if message[0] == 'B':
                controller_number = int(message[1])
                battery_number = int(message[2])

                #print 'Battery %d on Controller %d'%(battery_number, controller_number)

                splitmessage = message.split(',')

                for i in range(0,(len(splitmessage)-1)/2):
                    key = splitmessage[i*2+1]
                    value = splitmessage[i*2+2]
#                print 'key %s , value %s'%(splitmessage[i*2+1],splitmessage[i*2+2])
#                print 'key %s , value dec %s'%(splitmessage[i*2+1],hex2dec(splitmessage[i*2+2]))



                    if key == '09':
                        #print 'voltage is %f'%(float(hex2dec(value))/1000.0)
                        myPow.controllers[port].batteries[battery_number].voltage = float(hex2dec(value))/1000.0 


                    if key == '0A':
                        intval = float(hex2dec(value))
                        if intval < 32767:
                            val = intval
                        else:
                            val = (intval - 65636.0)
                        #print 'current is %f'%(val/1000.0)
                        myPow.controllers[port].batteries[battery_number].current = val/1000.0


# case B battery
# split on commas
# first number is battery number
# foreach pair
# lookup index
# record value cast properly so pages 13 to 35

#case S system data
            if message[0] == 'S':
                splitmessage = message.split(',')
                #print 'System Message'
                for i in range(0,(len(splitmessage)-1)/2):
                    key = splitmessage[i*2+1]
                    value = splitmessage[i*2+2]
#            print 'key %s , value %s'%(key,value)
#            print 'key %s , value dec %s'%(key,hex2dec(value))

                    if key == '01':
                        #print 'time until exhaustion = %s minutes'%hex2dec(value)
                        myPow.controllers[port].time_remaining = int(hex2dec(value))
                    if key == '02':
                        #reserved
                        pass

                    if key == '03':
                        #print 'text message to the system %s'%value
                        myPow.controllers[port].new_system_message(value)

                    if key == '04':
                        #print 'average charge percent %d'% hex2dec(value)
                        myPow.controllers[port].average_charge = int(hex2dec(value))

        #print time.time()
        increment = 1.0
        if time.time() - last_time > increment:
            last_time = last_time + increment
            print "displaying to screen"
            myPow.print_remaining()
            print "updating param server"
            myPow.updateParamServer(master)
Example #9
0
def renderGraphMain(argv, stdout, env):
    # default arguments
    server = "http://localhost"
    server_port = rospy.DEFAULT_TEST_PORT

    #check arguments for a help flag
    optlist, args = getopt.getopt(argv[1:], "h?p:s:",
                                  ["help", "port=", "server=", "test"])
    for o, a in optlist:
        if o in ("-h", "-?", "--help"):
            usage(stdout, argv[0])
            return
        elif o in ("--test"):
            server_port = rospy.DEFAULT_TEST_PORT
        elif o in ("-p", "--port"):
            server_port = a
        elif o in ("-s", "--server"):
            server = a

    serverUri = '%s:%s/' % (server, server_port)
    print "Looking for server at %s" % serverUri
    os.environ[rospy.ROS_MASTER_URI] = serverUri
    os.environ[rospy.ROS_NODE] = NAME
    os.environ[rospy.ROS_PORT] = str(0)  # any

    master = rospy.getMaster()

    out_FlowImageString = OutflowpyImageString(".imageOut")
    require(
        master.addMachine('default', rospy.getRosRoot(), 'localhost', 22, '',
                          ''))
    require(
        master.addNode('', 'imageViewer', 'pyImageViewer', 'imageViewer',
                       'default', 0))

    rospy.ready()

    require(
        master.connectFlow(out_FlowImageString.locator, "imageViewer:imageIn",
                           1))
    while not rospy.isShutdown():
        status_code, statusMessage, [nodes, flows] = master.getGraph()
        #        print 'nodes' + str(nodes)
        #        print 'flows ' + str(flows)

        print '--------------------------------------------'
        print 'This is the graph:'
        print 'refreshing every ' + str(sleep_time) + ' seconds'
        print '--------------------------------------------'

        for anode in nodes:
            status_code, statusMessage, [machine, address,
                                         port] = master.getNodeAddress(anode)
            print 'NODE: ' + str(anode) + ' on ' + str(machine) + ' at ' + str(
                address) + ' on port: ' + str(port)
            for aflow in flows:
                aflow_split = str(aflow[1]).split('.')
                destination = aflow_split[0]
                aflow_split_source = str(aflow[0]).split('.')
                source = aflow_split_source[0]
                if destination == anode:
                    print '\tINFLOW: ' + str(aflow_split[1]) + ' from: ' + str(
                        aflow[0])
                if source == anode:
                    print '\tOUTFLOW: ' + str(
                        aflow_split_source[1]) + ' to: ' + str(aflow[1])

        output_file = 'ROSGraph.jpeg'
        pid = os.fork(
        )  # This is a hack to get around an underlying memory leak in
        # the agraph library.
        if pid == 0:
            #print "starting yapgvb process"
            try:
                print '--------------------------------------------'
                ygraph = yapgvb.Digraph('ROSGraph')
                gnodes = {}
                for anode in nodes:
                    gnodes[anode] = ygraph.add_node(label=anode)
                #print "added allnodes"
                #print flows
                for aflow in flows:
                    aflow_split = str(aflow[1]).split(':')
                    destination = aflow_split[0]
                    aflow_split_source = str(aflow[0]).split(':')
                    source = aflow_split_source[0]
                    gnodes[source] >> gnodes[destination]
                #print "done setting up graph for rendering"
                ygraph.layout(yapgvb.engines.dot)
                ygraph.render(output_file)
            finally:
                mpid = os.getpid()
                os.kill(mpid, 9)
        else:
            os.wait()

        # Wrap up the image and send it out over a flow
        imToSend = Image.open(output_file)

        future_packet = pyImageString()
        future_packet.imageString = imToSend.tostring()

        future_packet.imageFormat = "RGB"
        future_packet.width, future_packet.height = imToSend.size

        out_FlowImageString.publish(future_packet)

        # don't loop too fast
        time.sleep(sleep_time)
Example #10
0
def renderGraphMain(argv, stdout, env):
    # default arguments
    server = "http://localhost"
    server_port = rospy.DEFAULT_TEST_PORT

    #check arguments for a help flag
    optlist, args = getopt.getopt(argv[1:], "h?p:s:", ["help","port=","server=","test"])
    for o, a in optlist:
        if o in ("-h","-?","--help"):
            usage(stdout, argv[0])
            return
        elif o in ("--test"):
            server_port = rospy.DEFAULT_TEST_PORT
        elif o in ("-p", "--port"):
            server_port = a
        elif o in ("-s", "--server"):
            server = a


    serverUri = '%s:%s/'%(server,server_port)
    print "Looking for server at %s"%serverUri
    os.environ[rospy.ROS_MASTER_URI] = serverUri
    os.environ[rospy.ROS_NODE] = NAME
    os.environ[rospy.ROS_PORT] = str(0) # any

            
    master = rospy.getMaster()

    out_FlowImageString = OutflowpyImageString(".imageOut")
    require(master.addMachine('default', rospy.getRosRoot(), 'localhost', 22, '', ''))
    require(master.addNode('','imageViewer','pyImageViewer','imageViewer','default',0))

    rospy.ready()

    require(master.connectFlow(out_FlowImageString.locator, "imageViewer:imageIn",1))
    while not rospy.isShutdown():
        status_code, statusMessage, [nodes,flows] = master.getGraph()
        #        print 'nodes' + str(nodes)
        #        print 'flows ' + str(flows)
        
        print '--------------------------------------------'
        print 'This is the graph:'
        print 'refreshing every '+str(sleep_time)+' seconds'
        print '--------------------------------------------'
        
        for anode in nodes:
            status_code, statusMessage, [machine, address, port] = master.getNodeAddress(anode)
            print 'NODE: ' + str(anode) + ' on ' + str(machine) + ' at ' + str(address) + ' on port: ' + str(port)
            for aflow in flows:
                aflow_split= str(aflow[1]).split('.')
                destination = aflow_split[0]
                aflow_split_source = str(aflow[0]).split('.')
                source = aflow_split_source[0]
                if destination == anode:
                    print '\tINFLOW: ' + str(aflow_split[1]) + ' from: ' + str(aflow[0])
                if source == anode:
                    print '\tOUTFLOW: ' + str(aflow_split_source[1]) + ' to: ' + str(aflow[1])

        output_file = 'ROSGraph.jpeg'
        pid = os.fork()  # This is a hack to get around an underlying memory leak in
        # the agraph library.  
        if pid == 0:
            #print "starting yapgvb process"
            try:
                print '--------------------------------------------'
                ygraph = yapgvb.Digraph('ROSGraph');
                gnodes = {}
                for anode in nodes:
                    gnodes[anode] = ygraph.add_node(label = anode)
                #print "added allnodes"
                #print flows
                for aflow in flows:
                    aflow_split= str(aflow[1]).split(':')
                    destination = aflow_split[0]
                    aflow_split_source = str(aflow[0]).split(':')
                    source = aflow_split_source[0]
                    gnodes[source] >> gnodes[destination]
                #print "done setting up graph for rendering"
                ygraph.layout(yapgvb.engines.dot)
                ygraph.render(output_file)
            finally:
                mpid = os.getpid()
                os.kill(mpid,9)
        else:
            os.wait()
            
        # Wrap up the image and send it out over a flow
        imToSend = Image.open(output_file)

        future_packet = pyImageString()
        future_packet.imageString = imToSend.tostring()

        future_packet.imageFormat = "RGB"
        future_packet.width, future_packet.height = imToSend.size

        out_FlowImageString.publish(future_packet)

        # don't loop too fast
        time.sleep(sleep_time)
Example #11
0
def monitorBatteriesMain(argv, stdout, env):
    # default arguments
    server = "http://localhost"
    server_port = rospy.DEFAULT_TEST_PORT

    #check arguments for a help flag
    optlist, args = getopt.getopt(argv[1:], "h?p:s:",
                                  ["help", "port=", "server=", "test"])
    for o, a in optlist:
        if o in ("-h", "-?", "--help"):
            usage(stdout, argv[0])
            return
        elif o in ("--test"):
            server_port = rospy.DEFAULT_TEST_PORT
        elif o in ("-p", "--port"):
            server_port = a
        elif o in ("-s", "--server"):
            server = a

    serverUri = '%s:%s/' % (server, server_port)
    print "Looking for server at %s" % serverUri
    os.environ[rospy.ROS_MASTER_URI] = serverUri
    os.environ[rospy.ROS_NODE] = NAME
    os.environ[rospy.ROS_PORT] = str(0)  # any

    master = rospy.getMaster()

    rospy.ready()

    setupPorts()

    #f= open('testfile.txt','r')
    f0 = open('/dev/ttyUSB0', 'r')
    f1 = open('/dev/ttyUSB1', 'r')
    f2 = open('/dev/ttyUSB2', 'r')
    f3 = open('/dev/ttyUSB3', 'r')
    # split on %  to string and checksum
    # check checksum

    myPow = robotPower()

    start_time = time.time()
    last_time = start_time
    while True:
        current, blah, blah2 = select.select([f0, f1, f2, f3], [], [], 1)
        for f in current:
            if f == f0:
                port = 0
                port_string = 'f0'
            if f == f1:
                port = 1
                port_string = 'f1'
            if f == f2:
                port = 2
                port_string = 'f2'
            if f == f3:
                port = 3
                port_string = 'f3'
            line = f.readline()
            halves = line.split('%')
            if len(halves) != 2:
                #            print 'I did not split on \% correctly'
                continue
            halves[1] = halves[1].strip()
            halves[0] = halves[0].lstrip('$')

            #        print line
            #    print halves
            #    print len(halves)
            #    print checksum256(halves[0])
            #    print hex2dec(halves[1])
            #    print hex(255)

            # read first char and switch
            message = halves[0]

            # case C controller

            # split on commas
            # first element is controller number
            # for each pair
            # read index  01-07
            # record value
            if len(message) < 2:
                print "error message too short: \"%s\" from \"%s\"" % (message,
                                                                       line)
                print "This often indicates a misconfigured serial port check port:"
                print f
                continue
            if message[0] == 'C':
                controller_number = int(message[1])
                #print 'Controller on port %s says:'%(port_string)
                splitmessage = message.split(',')

                #print 'batteries present'
                #print  readmask(splitmessage[2])
                mask = readmask(splitmessage[2])
                for i in range(0, 8):
                    myPow.controllers[port].batteries[i].present = mask[i]
                #print 'batteries charging'
                #print  readmask(splitmessage[4])
                mask = readmask(splitmessage[2])
                for i in range(0, 8):
                    myPow.controllers[port].batteries[i].charging = mask[i]
                #print 'batteries supplying power to system'
                #print  readmask(splitmessage[6])
                mask = readmask(splitmessage[6])
                for i in range(0, 8):
                    myPow.controllers[port].batteries[
                        i].supplying_power = mask[i]
                #print 'batteries which have charge power present'
                #print  readmask(splitmessage[10])
                mask = readmask(splitmessage[10])
                for i in range(0, 8):
                    myPow.controllers[port].batteries[i].w_charge_power = mask[
                        i]
                #print 'batteries with "Power no good"'
                #print  readmask(splitmessage[12])
                mask = readmask(splitmessage[12])
                for i in range(0, 8):
                    myPow.controllers[port].batteries[i].power_no_good = mask[
                        i]
                #print 'batteries charge inhibited'
                #print  readmask(splitmessage[14])
                mask = readmask(splitmessage[14])
                for i in range(0, 8):
                    myPow.controllers[port].batteries[
                        i].charge_inhibited = mask[i]

            else:
                pass

            if message[0] == 'B':
                controller_number = int(message[1])
                battery_number = int(message[2])

                #print 'Battery %d on Controller %d'%(battery_number, controller_number)

                splitmessage = message.split(',')

                for i in range(0, (len(splitmessage) - 1) / 2):
                    key = splitmessage[i * 2 + 1]
                    value = splitmessage[i * 2 + 2]
                    #                print 'key %s , value %s'%(splitmessage[i*2+1],splitmessage[i*2+2])
                    #                print 'key %s , value dec %s'%(splitmessage[i*2+1],hex2dec(splitmessage[i*2+2]))

                    if key == '09':
                        #print 'voltage is %f'%(float(hex2dec(value))/1000.0)
                        myPow.controllers[
                            port].batteries[battery_number].voltage = float(
                                hex2dec(value)) / 1000.0

                    if key == '0A':
                        intval = float(hex2dec(value))
                        if intval < 32767:
                            val = intval
                        else:
                            val = (intval - 65636.0)
                        #print 'current is %f'%(val/1000.0)
                        myPow.controllers[port].batteries[
                            battery_number].current = val / 1000.0


# case B battery
# split on commas
# first number is battery number
# foreach pair
# lookup index
# record value cast properly so pages 13 to 35

#case S system data
            if message[0] == 'S':
                splitmessage = message.split(',')
                #print 'System Message'
                for i in range(0, (len(splitmessage) - 1) / 2):
                    key = splitmessage[i * 2 + 1]
                    value = splitmessage[i * 2 + 2]
                    #            print 'key %s , value %s'%(key,value)
                    #            print 'key %s , value dec %s'%(key,hex2dec(value))

                    if key == '01':
                        #print 'time until exhaustion = %s minutes'%hex2dec(value)
                        myPow.controllers[port].time_remaining = int(
                            hex2dec(value))
                    if key == '02':
                        #reserved
                        pass

                    if key == '03':
                        #print 'text message to the system %s'%value
                        myPow.controllers[port].new_system_message(value)

                    if key == '04':
                        #print 'average charge percent %d'% hex2dec(value)
                        myPow.controllers[port].average_charge = int(
                            hex2dec(value))

        #print time.time()
        increment = 1.0
        if time.time() - last_time > increment:
            last_time = last_time + increment
            print "displaying to screen"
            myPow.print_remaining()
            print "updating param server"
            myPow.updateParamServer(master)