<reponame>uwacits4419/DSR
#==================================README=======================================
#
#This is a DSR protocol implementation using Python.
#
#It is the project for CITS4419 - Mobile and Wireless Computing
#at The University of Western Australia.
#
#<AUTHOR> = <NAME>, <NAME>, <NAME>, <NAME>,
#           <NAME>, <NAME>, <NAME>, <NAME>,
#           <NAME>, Zhiqiang (<NAME>
#
#<SUPERVISOR> = Prof. <NAME>
#
#<ORGANIZATION> = The University of Western Australia
#
#<YEAR> = 2013
#
#<VERSION> = V1.0
#
#===============================================================================

#=================================BSD LICENSE===================================
#
#Copyright (c) <YEAR>, <AUTHOR>
#
#All rights reserved.
#
#Redistribution and use in source and binary forms, with or without
#modification, are permitted provided that the following conditions
#are met:
#
#  - Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  - Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
#  - Neither the name of the <ORGANIZATION> nor the names of its
#    contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
#IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
#THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
#PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
#CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
#EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
#PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
#LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
#NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#===============================================================================

from threading import Timer

class SimulatorNetwork:
  def __init__(self, q, dsr):
    self.out_p = q[0]
    self.in_p = q[1]
    self.dsr = dsr
    self.stop = False
    self._on_recieve()
    
  def _on_recieve(self):
    print('NETWORK: Triggered _on_recieve')
    inp = self.receive()
    for a, p in inp:
      self.dsr.receive_packet(p)
     
    if not self.stop:	 
      print('NETWORK: Rerunning timer')
      t = Timer(1, self._on_recieve)
      t.start()
    
  def stop_timer(self):
    self.stop = True

  def send(self, msg, addr):
    p = (addr, msg)
    print('NETWORK: Message out: {}'.format(p))
    self.out_p.send(p)

  # Returns a list of (fromaddr, msg)
  def receive(self):
    out = []
    while self.in_p.poll():
      out.append(self.in_p.recv())
   
    print('NETWORK: Messages in: {}'.format(out)) 
    return out
