#!/usr/bin/env python

# Author: Kunal Kandekar
# Copyright 2010 - 2011

from gnuradio.eng_option import eng_option
from optparse import OptionParser

from gnuradio import gr, gru, eng_notation, optfir, window
#from gnuradio import usrp
from gnuradio import blks2
from usrpm import usrp_dbid
import traceback

import sys
import math
import socket
import os
import threading

class server_src(gr.hier_block2):
    default_port_base = 6555
    port_base = 6555

    def __init__(self, sample_size, port, addr='localhost'):
        gr.hier_block2.__init__(self, "server_src",
                gr.io_signature(0, 0, 0), # Input signature
                gr.io_signature(1, 1, sample_size)) # Output signature    
        self.port = port
        if self.port <= 0:
           self.port = server_src.default_port_base
           while 1:
                try: 
                    self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    self.s.bind((addr,self.port)) 
                    break #if no error
                except socket.error, (value,message):
                    #print 'error :',value,':',message,' trying port ',self.port
                    self.port += 10
                    if self.s: 
                        self.s.close() 
        else:
            self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        
            self.s.bind((addr, self.port))
        self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
        self.sample_size = sample_size
        self._ready      = True
        self._started    = False
        self._connected  = False
        server_src.verbose('listening on '+str(self.s.getsockname()))
        #self.receiver = ClientReceiver(self)
        self.s.listen(1)    

    @staticmethod
    def verbose(logstr):
        print logstr
        pass

    def start(self):
        if (self._started): pass
        self._started = True
        server_src.verbose('Waiting for conn...')
        self.conn, self.addr = self.s.accept()
        server_src.verbose('Connected by' + str(self.addr)+ ' fileno='+str(self.conn.fileno()))
        self.src = gr.file_descriptor_source(self.sample_size, self.conn.fileno())
        #read and discard cmd from client
        #cmd = self.conn.recv(1024)
        #start receiver thread
        #self.receiver.start()

    	self.connect(self.src, self)
        return

    def __del__(self):
        self.s.close()
        if (self.conn is not None):
            self.conn.close()
        return