#!/usr/bin/env python

import corr, time, struct, sys,logging, stats, socket

#Decide where we're going to send the data, and from which addresses:
dest_ip  =192*(2**24)+168*(2**16)+3*(2**8)+10  #192.168.3.10
fabric_port=10000         
source_ip= 192*(2**24)+168*(2**16)+3*(2**8)+14  #192.168.3.14
mac_base=(2<<40) + (2<<32)
ip_prefix='192.168.3..'     #Used for the purposes of printing output because snap blocks, arp tables and some registers only store Least significant word.

ten_Gbe= 'ten_Gbe_v2'
katcp_port=7147
boffile='parkes10mar25_2010_Mar_29_1028.bof'

def get_gbe_config(fpga, dev_name, ip_prefix):
    '''This function grabs data from a 10GbE core and decodes it.'''
    port_dump=list(struct.unpack('>16384B',fpga.read(dev_name,16384)))
    ip_prefix= '%3d.%3d.%3d.'%(port_dump[0x10],port_dump[0x11],port_dump[0x12])
    print '------------------------'
    print 'GBE0 Configuration...'
    print 'My MAC: ',
    for m in port_dump[02:02+6]:
        print '%02X'%m,
    print ''
    print 'Gateway: ',
    for g in port_dump[0x0c:0x0c+4]:
        print '%3d'%g,
    print ''
    print 'This IP: ',
    for i in port_dump[0x10:0x10+4]:
        print '%3d'%i,
    print ''
    print 'Gateware Port: ',
    print '%5d'%(port_dump[0x22]*(2**8)+port_dump[0x23])
    print 'Fabric interface is currently: ',
    if port_dump[0x21]&1: print 'Enabled'
    else: print 'Disabled'

if __name__ == '__main__':
    from optparse import OptionParser
    
    p = OptionParser()
    p.set_usage('Parks.py <ROACH_HOSTNAME_or_IP> [options]')
    p.set_description(__doc__)
    p.add_option('-a', '--arp', dest='arp', action='store_true',
                 help='Print the ARP table and other interesting bits.')  
    
    opts, args = p.parse_args(sys.argv[1:])
    
    if args==[]:
        print 'Please specify a ROACH board. \nExiting.'
        exit()
    else:
        roach = args[0]
        
 
    print('Connecting to server %s on port %i... '%(roach,katcp_port)),
    fpga = corr.katcp_wrapper.FpgaClient(roach, katcp_port, timeout=10)
    time.sleep(1) 
       
    print '------------------------'
    print 'Programming FPGA...',
    sys.stdout.flush()
    fpga.progdev(boffile)
    time.sleep(10)
    print 'ok'

    print 'Configuring transmitter core...',
    sys.stdout.flush()
    fpga.tap_start(ten_Gbe,mac_base+source_ip,source_ip,fabric_port)
    print 'done'

    print 'Setting-up destination addresses...',
    sys.stdout.flush()
    fpga.write_int('tgeC_ip_softIn1',dest_ip)
    fpga.write_int('tgeC_port_softIn1',fabric_port)
    fpga.write_int('reg_arm',0)
    fpga.write_int('reg_arm',1)
    print 'done'
   
    if opts.arp:
         print '\n\n==============================='
         print '10GbE Transmitter core details:'
         print '==============================='
         get_gbe_config(fpga,ten_Gbe,ip_prefix)