예제 #1
0
 def test_is_remote_response_parsed_as_io(self):
     """
     I/O data in a Remote AT response for an IS command is parsed.
     """
      ## Build IO data
     # One sample, ADC 0 enabled
     # DIO 1,3,5,7 enabled
     header = b'\x01\x02\xAA'
     
     # First 7 bits ignored, DIO8 low, DIO 0-7 alternating
     # ADC0 value of 255
     sample = b'\x00\xAA\x00\xFF'
     data = header + sample
     
     device = FakeReadDevice(
         APIFrame(data = b'\x97D\x00\x13\xa2\x00@oG\xe4v\x1aIS\x00' + data).output()
     )
     
     xbee = XBee(device)
     
     info = xbee.wait_read_frame()
     expected_info = {'id':'remote_at_response',
                      'frame_id':b'D',
                      'source_addr_long': b'\x00\x13\xa2\x00@oG\xe4',
                      'source_addr': b'v\x1a',
                      'command':b'IS',
                      'status':b'\x00',
                      'parameter':[{'dio-1':True,
                                   'dio-3':True,
                                   'dio-5':True,
                                   'dio-7':True,
                                   'adc-0':255}]}
     self.assertEqual(info, expected_info)
예제 #2
0
 def test_is_remote_response_parsed_as_io(self):
     """
     I/O data in a Remote AT response for an IS command is parsed.
     """
      ## Build IO data
     # One sample, ADC 0 enabled
     # DIO 1,3,5,7 enabled
     header = b'\x01\x02\xAA'
     
     # First 7 bits ignored, DIO8 low, DIO 0-7 alternating
     # ADC0 value of 255
     sample = b'\x00\xAA\x00\xFF'
     data = header + sample
     
     device = FakeReadDevice(
         APIFrame(data = b'\x97D\x00\x13\xa2\x00@oG\xe4v\x1aIS\x00' + data).output()
     )
     
     xbee = XBee(device)
     
     info = xbee.wait_read_frame()
     expected_info = {'id':'remote_at_response',
                      'frame_id':b'D',
                      'source_addr_long': b'\x00\x13\xa2\x00@oG\xe4',
                      'source_addr': b'v\x1a',
                      'command':b'IS',
                      'status':b'\x00',
                      'parameter':[{'dio-1':True,
                                   'dio-3':True,
                                   'dio-5':True,
                                   'dio-7':True,
                                   'adc-0':255}]}
     self.assertEqual(info, expected_info)
예제 #3
0
 def test_read_io_data(self):
     """
     XBee class should properly read and parse incoming IO data
     """
     ## Build IO data
     # One sample, ADC 0 enabled
     # DIO 1,3,5,7 enabled
     header = b'\x01\x02\xAA'
     
     # First 7 bits ignored, DIO8 low, DIO 0-7 alternating
     # ADC0 value of 255
     sample = b'\x00\xAA\x00\xFF'
     data = header + sample
     
     ## Wrap data in frame
     # RX frame data
     rx_io_resp = b'\x83\x00\x01\x28\x00'
 
     device = FakeReadDevice(
         b'\x7E\x00\x0C'+ rx_io_resp + data + b'\xfd'
     )
     xbee = XBee(device)
     
     info = xbee.wait_read_frame()
     expected_info = {'id':'rx_io_data',
                      'source_addr':b'\x00\x01',
                      'rssi':b'\x28',
                      'options':b'\x00',
                      'samples': [{'dio-1':True,
                                   'dio-3':True,
                                   'dio-5':True,
                                   'dio-7':True,
                                   'adc-0':255}]
                     }
     self.assertEqual(info, expected_info)
예제 #4
0
 def test_read_io_data(self):
     """
     XBee class should properly read and parse incoming IO data
     """
     ## Build IO data
     # One sample, ADC 0 enabled
     # DIO 1,3,5,7 enabled
     header = b'\x01\x02\xAA'
     
     # First 7 bits ignored, DIO8 low, DIO 0-7 alternating
     # ADC0 value of 255
     sample = b'\x00\xAA\x00\xFF'
     data = header + sample
     
     ## Wrap data in frame
     # RX frame data
     rx_io_resp = b'\x83\x00\x01\x28\x00'
 
     device = FakeReadDevice(
         b'\x7E\x00\x0C'+ rx_io_resp + data + b'\xfd'
     )
     xbee = XBee(device)
     
     info = xbee.wait_read_frame()
     expected_info = {'id':'rx_io_data',
                      'source_addr':b'\x00\x01',
                      'rssi':b'\x28',
                      'options':b'\x00',
                      'samples': [{'dio-1':True,
                                   'dio-3':True,
                                   'dio-5':True,
                                   'dio-7':True,
                                   'adc-0':255}]
                     }
     self.assertEqual(info, expected_info)
예제 #5
0
 def test_read_empty_string(self):
     """
     Reading an empty string must not cause a crash
     
     Occasionally, the serial port fails to read properly, and returns
     an empty string. In this event, we must not crash.
     """
     
     class BadReadDevice(FakeReadDevice):
         def __init__(self, bad_read_index, data):
             self.read_id = 0
             self.bad_read_index = bad_read_index
             super(BadReadDevice, self).__init__(data)
         
         def inWaiting(self):
             return 1
             
         def read(self):
             if self.read_id == self.bad_read_index:
                 self.read_id += 1
                 return ''
             else:
                 self.read_id += 1
                 return super(BadReadDevice, self).read()
             
     badDevice = BadReadDevice(1, b'\x7E\x00\x05\x88DMY\x01\x8c')
     xbee = XBee(badDevice)
     
     try:
         xbee.wait_read_frame()
     except Exception:
         exc_type, exc_value, exc_traceback = sys.exc_info()
         self.fail("".join(traceback.format_exception(exc_type, exc_value, exc_traceback)))
예제 #6
0
 def test_read_empty_string(self):
     """
     Reading an empty string must not cause a crash
     
     Occasionally, the serial port fails to read properly, and returns
     an empty string. In this event, we must not crash.
     """
     
     class BadReadDevice(FakeReadDevice):
         def __init__(self, bad_read_index, data):
             self.read_id = 0
             self.bad_read_index = bad_read_index
             super(BadReadDevice, self).__init__(data)
         
         def inWaiting(self):
             return 1
             
         def read(self):
             if self.read_id == self.bad_read_index:
                 self.read_id += 1
                 return ''
             else:
                 self.read_id += 1
                 return super(BadReadDevice, self).read()
             
     badDevice = BadReadDevice(1, b'\x7E\x00\x05\x88DMY\x01\x8c')
     xbee = XBee(badDevice)
     
     try:
         xbee.wait_read_frame()
     except Exception:
         exc_type, exc_value, exc_traceback = sys.exc_info()
         self.fail("".join(traceback.format_exception(exc_type, exc_value, exc_traceback)))
예제 #7
0
 def test_shorthand_disabled(self):
     """
     When shorthand is disabled, any attempt at calling a 
     non-existant attribute should raise AttributeError
     """
     self.xbee = XBee(self.ser, shorthand=False)
     
     try:
         self.xbee.at
     except AttributeError:
         pass
     else:
         self.fail("Specified shorthand command should not exist")
예제 #8
0
 def test_read_at(self):
     """
     read and parse a parameterless AT command
     """
     device = FakeReadDevice(b'\x7E\x00\x05\x88DMY\x01\x8c')
     xbee = XBee(device)
     
     info = xbee.wait_read_frame()
     expected_info = {'id':'at_response',
                      'frame_id':b'D',
                      'command':b'MY',
                      'status':b'\x01'}
     self.assertEqual(info, expected_info)
예제 #9
0
 def test_read_at(self):
     """
     read and parse a parameterless AT command
     """
     device = FakeReadDevice(b'\x7E\x00\x05\x88DMY\x01\x8c')
     xbee = XBee(device)
     
     info = xbee.wait_read_frame()
     expected_info = {'id':'at_response',
                      'frame_id':b'D',
                      'command':b'MY',
                      'status':b'\x01'}
     self.assertEqual(info, expected_info)
예제 #10
0
class TestSendShorthand(unittest.TestCase):
    """
    Tests shorthand for sending commands to an XBee provided by
    XBee.__getattr__
    """
    def setUp(self):
        """
        Prepare a fake device to read from
        """
        self.ser = FakeDevice()
        self.xbee = XBee(self.ser)

    def test_send_at_command(self):
        """
        Send an AT command with a shorthand call
        """
        # Send an AT command
        self.xbee.at(frame_id=stringToBytes('A'), command=stringToBytes('MY'))

        # Expect a full packet to be written to the device
        expected_data = b'\x7E\x00\x04\x08AMY\x10'
        self.assertEqual(self.ser.data, expected_data)

    def test_send_at_command_with_param(self):
        """
        calling send should write a full API frame containing the
        API AT command packet to the serial device.
        """

        # Send an AT command
        self.xbee.at(frame_id=stringToBytes('A'),
                     command=stringToBytes('MY'),
                     parameter=b'\x00\x00')

        # Expect a full packet to be written to the device
        expected_data = b'\x7E\x00\x06\x08AMY\x00\x00\x10'
        self.assertEqual(self.ser.data, expected_data)

    def test_shorthand_disabled(self):
        """
        When shorthand is disabled, any attempt at calling a 
        non-existant attribute should raise AttributeError
        """
        self.xbee = XBee(self.ser, shorthand=False)

        try:
            self.xbee.at
        except AttributeError:
            pass
        else:
            self.fail("Specified shorthand command should not exist")
예제 #11
0
class TestSendShorthand(unittest.TestCase):
    """
    Tests shorthand for sending commands to an XBee provided by
    XBee.__getattr__
    """
    
    def setUp(self):
        """
        Prepare a fake device to read from
        """
        self.ser = FakeDevice()
        self.xbee = XBee(self.ser)
    
    def test_send_at_command(self):
        """
        Send an AT command with a shorthand call
        """
        # Send an AT command
        self.xbee.at(frame_id=stringToBytes('A'), command=stringToBytes('MY'))
        
        # Expect a full packet to be written to the device
        expected_data = b'\x7E\x00\x04\x08AMY\x10'
        self.assertEqual(self.ser.data, expected_data)
        
    def test_send_at_command_with_param(self):
        """
        calling send should write a full API frame containing the
        API AT command packet to the serial device.
        """
        
        # Send an AT command
        self.xbee.at(frame_id=stringToBytes('A'), command=stringToBytes('MY'), parameter=b'\x00\x00')
        
        # Expect a full packet to be written to the device
        expected_data = b'\x7E\x00\x06\x08AMY\x00\x00\x10'
        self.assertEqual(self.ser.data, expected_data)
        
    def test_shorthand_disabled(self):
        """
        When shorthand is disabled, any attempt at calling a 
        non-existant attribute should raise AttributeError
        """
        self.xbee = XBee(self.ser, shorthand=False)
        
        try:
            self.xbee.at
        except AttributeError:
            pass
        else:
            self.fail("Specified shorthand command should not exist")
예제 #12
0
 def test_read_rx_with_close_brace(self):
     """
     An rx data frame including a close brace must be read properly.
     """
     device = FakeReadDevice(APIFrame(b'\x81\x01\x02\x55\x00{test=1}').output())
     xbee = XBee(device)
     
     info = xbee.wait_read_frame()
     expected_info = {'id':'rx',
                      'source_addr':b'\x01\x02',
                      'rssi':b'\x55',
                      'options':b'\x00',
                      'rf_data':b'{test=1}'}
     self.assertEqual(info, expected_info)
예제 #13
0
 def test_empty_frame_ignored(self):
     """
     If an empty frame is received from a device, it must be ignored.
     """
     device = FakeReadDevice(b'\x7E\x00\x00\xFF\x7E\x00\x05\x88DMY\x01\x8c')
     xbee = XBee(device)
     
     #import pdb
     #pdb.set_trace()
     info = xbee.wait_read_frame()
     expected_info = {'id':'at_response',
                      'frame_id':b'D',
                      'command':b'MY',
                      'status':b'\x01'}
     self.assertEqual(info, expected_info)
예제 #14
0
 def test_send_at_command(self):
     """
     calling send should write a full API frame containing the
     API AT command packet to the serial device.
     """
     
     serial_port = FakeDevice()
     xbee = XBee(serial_port)
     
     # Send an AT command
     xbee.send('at', frame_id=stringToBytes('A'), command=stringToBytes('MY'))
     
     # Expect a full packet to be written to the device
     expected_data = b'\x7E\x00\x04\x08AMY\x10'
     self.assertEqual(serial_port.data, expected_data)
예제 #15
0
 def test_empty_frame_ignored(self):
     """
     If an empty frame is received from a device, it must be ignored.
     """
     device = FakeReadDevice(b'\x7E\x00\x00\xFF\x7E\x00\x05\x88DMY\x01\x8c')
     xbee = XBee(device)
     
     #import pdb
     #pdb.set_trace()
     info = xbee.wait_read_frame()
     expected_info = {'id':'at_response',
                      'frame_id':b'D',
                      'command':b'MY',
                      'status':b'\x01'}
     self.assertEqual(info, expected_info)
예제 #16
0
 def test_send_at_command(self):
     """
     calling send should write a full API frame containing the
     API AT command packet to the serial device.
     """
     
     serial_port = FakeDevice()
     xbee = XBee(serial_port)
     
     # Send an AT command
     xbee.send('at', frame_id=stringToBytes('A'), command=stringToBytes('MY'))
     
     # Expect a full packet to be written to the device
     expected_data = b'\x7E\x00\x04\x08AMY\x10'
     self.assertEqual(serial_port.data, expected_data)
예제 #17
0
    def test_send_at_command_with_param(self):
        """
        calling send should write a full API frame containing the
        API AT command packet to the serial device.
        """

        serial_port = FakeDevice()
        xbee = XBee(serial_port)

        # Send an AT command
        xbee.send('at', frame_id='A', command='MY', parameter='\x00\x00')

        # Expect a full packet to be written to the device
        expected_data = '\x7E\x00\x06\x08AMY\x00\x00\x10'
        self.assertEqual(serial_port.data, expected_data)
예제 #18
0
 def test_read_at_params(self):
     """
     read and parse an AT command with a parameter
     """
     device = FakeReadDevice(
         '\x7E\x00\x08\x88DMY\x01\x00\x00\x00\x8c'
     )
     xbee = XBee(device)
     
     info = xbee.wait_read_frame()
     expected_info = {'id':'at_response',
                      'frame_id':'D',
                      'command':'MY',
                      'status':'\x01',
                      'parameter':'\x00\x00\x00'}
     self.assertEqual(info, expected_info)
예제 #19
0
 def test_read_at_params_in_escaped_mode(self):
     """
     read and parse an AT command with a parameter in escaped API mode
     """
     device = FakeReadDevice(
         b'~\x00\t\x88DMY\x01}^}]}1}3m'
     )
     xbee = XBee(device, escaped=True)
     
     info = xbee.wait_read_frame()
     expected_info = {'id':'at_response',
                      'frame_id':b'D',
                      'command':b'MY',
                      'status':b'\x01',
                      'parameter':b'\x7E\x7D\x11\x13'}
     self.assertEqual(info, expected_info)
예제 #20
0
 def test_read_at_params_in_escaped_mode(self):
     """
     read and parse an AT command with a parameter in escaped API mode
     """
     device = FakeReadDevice(
         b'~\x00\t\x88DMY\x01}^}]}1}3m'
     )
     xbee = XBee(device, escaped=True)
     
     info = xbee.wait_read_frame()
     expected_info = {'id':'at_response',
                      'frame_id':b'D',
                      'command':b'MY',
                      'status':b'\x01',
                      'parameter':b'\x7E\x7D\x11\x13'}
     self.assertEqual(info, expected_info)
예제 #21
0
    def test_read_at_params(self):
        """
        read and parse an AT command with a parameter
        """
        device = FakeReadDevice('\x7E\x00\x08\x88DMY\x01\x00\x00\x00\x8c')
        xbee = XBee(device)

        info = xbee.wait_read_frame()
        expected_info = {
            'id': 'at_response',
            'frame_id': 'D',
            'command': 'MY',
            'status': '\x01',
            'parameter': '\x00\x00\x00'
        }
        self.assertEqual(info, expected_info)
예제 #22
0
    def test_send_at_command_with_param(self):
        """
        calling send should write a full API frame containing the
        API AT command packet to the serial device.
        """

        serial_port = Serial()
        xbee = XBee(serial_port)

        # Send an AT command
        xbee.send('at',
                  frame_id=stringToBytes('A'),
                  command=stringToBytes('MY'),
                  parameter=b'\x00\x00')

        # Expect a full packet to be written to the device
        result_data = serial_port.get_data_written()
        expected_data = b'\x7E\x00\x06\x08AMY\x00\x00\x10'
        self.assertEqual(result_data, expected_data)
예제 #23
0
 def test_send_at_command_with_param(self):
     """
     calling send should write a full API frame containing the
     API AT command packet to the serial device.
     """
     
     serial_port = FakeDevice()
     xbee = XBee(serial_port)
     
     # Send an AT command
     xbee.send(
         'at', 
         frame_id='A', 
         command='MY', 
         parameter='\x00\x00'
     )
     
     # Expect a full packet to be written to the device
     expected_data = '\x7E\x00\x06\x08AMY\x00\x00\x10'
     self.assertEqual(serial_port.data, expected_data)
예제 #24
0
 def test_shorthand_disabled(self):
     """
     When shorthand is disabled, any attempt at calling a 
     non-existant attribute should raise AttributeError
     """
     self.xbee = XBee(self.ser, shorthand=False)
     
     try:
         self.xbee.at
     except AttributeError:
         pass
     else:
         self.fail("Specified shorthand command should not exist")
예제 #25
0
    def test_is_response_parsed_as_io(self):
        """
        I/O data in a AT response for an IS command is parsed.
        """
        ## Build IO data
        # One sample, ADC 0 enabled
        # DIO 1,3,5,7 enabled
        header = b'\x01\x02\xAA'

        # First 7 bits ignored, DIO8 low, DIO 0-7 alternating
        # ADC0 value of 255
        sample = b'\x00\xAA\x00\xFF'
        data = header + sample

        device = Serial()
        device.set_read_data(APIFrame(data=b'\x88DIS\x00' + data).output())
        xbee = XBee(device)

        info = xbee.wait_read_frame()
        expected_info = {
            'id':
            'at_response',
            'frame_id':
            b'D',
            'command':
            b'IS',
            'status':
            b'\x00',
            'parameter': [{
                'dio-1': True,
                'dio-3': True,
                'dio-5': True,
                'dio-7': True,
                'adc-0': 255
            }]
        }
        self.assertEqual(info, expected_info)
예제 #26
0
 def setUp(self):
     """
     Prepare a fake device to read from
     """
     self.ser = FakeDevice()
     self.xbee = XBee(self.ser)
예제 #27
0
 def setUp(self):
     """
     Initialize XBee object
     """
     self.xbee = XBee(None)
예제 #28
0
 def setUp(self):
     """
     Prepare a fake device to read from
     """
     self.ser = FakeDevice()
     self.xbee = XBee(self.ser)
예제 #29
0
class TestSendShorthand(unittest.TestCase):
    """
    Tests shorthand for sending commands to an XBee provided by
    XBee.__getattr__
    """
    def setUp(self):
        """
        Prepare a fake device to read from
        """
        self.ser = Serial()
        self.xbee = XBee(self.ser)

    def test_send_at_command(self):
        """
        Send an AT command with a shorthand call
        """
        # Send an AT command
        self.xbee.at(frame_id=stringToBytes('A'), command=stringToBytes('MY'))

        # Expect a full packet to be written to the device
        result_data = self.ser.get_data_written()
        expected_data = b'\x7E\x00\x04\x08AMY\x10'
        self.assertEqual(result_data, expected_data)

    def test_send_at_command_with_param(self):
        """
        calling send should write a full API frame containing the
        API AT command packet to the serial device.
        """

        # Send an AT command
        self.xbee.at(frame_id=stringToBytes('A'),
                     command=stringToBytes('MY'),
                     parameter=b'\x00\x00')

        # Expect a full packet to be written to the device
        result_data = self.ser.get_data_written()
        expected_data = b'\x7E\x00\x06\x08AMY\x00\x00\x10'
        self.assertEqual(result_data, expected_data)

    def test_send_tx_with_close_brace(self):
        """
        Calling tx where the given data string includes a close brace '}'
        must write correctly.
        """
        self.xbee.tx(dest_addr=b'\x01\x02', data=b'{test=1}')
        result_data = self.ser.get_data_written()
        expected_data = b'\x7E\x00\x0D\x01\x00\x01\x02\x00{test=1}\xD5'
        self.assertEqual(result_data, expected_data)

    def test_shorthand_disabled(self):
        """
        When shorthand is disabled, any attempt at calling a 
        non-existant attribute should raise AttributeError
        """
        self.xbee = XBee(self.ser, shorthand=False)

        try:
            self.xbee.at
        except AttributeError:
            pass
        else:
            self.fail("Specified shorthand command should not exist")
import xbee_relay_resp_pb2

import serial
from xbee.ieee import XBee

import xbee_relay_IF
from xbee_utils import *
import sensor_packet

BROADCAST_SINK = float(config.map['xbee_relay']['broadcast_sink'])

xbee_relay_IF.connect();
xbee_relay_IF.register_as_relay();

ser = serial.Serial(SERIAL_PORT,int(config.map['xbee_relay']['serial_speed']))
xbee = XBee(ser, callback=frame_recieved, escaped=True)


 
init_xbee(ser, xbee);

children_cache = set()

ts_sent_update = {}
ts_updated = set()
ts_noupdate = set()

def ts_send(addr):
    global ts_sent_update, ts_updated, ts_noupdate
    if addr in ts_noupdate:
        return;