ieee.py
Go to the documentation of this file.
00001 """
00002 ieee.py
00003 
00004 By Paul Malmsten, 2010
00005 Inspired by code written by Amit Synderman and Marco Sangalli
00006 pmalmsten@gmail.com
00007 
00008 This module provides an XBee (IEEE 802.15.4) API library.
00009 """
00010 import struct
00011 from xbee.base import XBeeBase
00012 
00013 class XBee(XBeeBase):
00014     """
00015     Provides an implementation of the XBee API for IEEE 802.15.4 modules
00016     with recent firmware.
00017     
00018     Commands may be sent to a device by instansiating this class with
00019     a serial port object (see PySerial) and then calling the send
00020     method with the proper information specified by the API. Data may
00021     be read from a device syncronously by calling wait_read_frame. For
00022     asynchronous reads, see the definition of XBeeBase.
00023     """
00024     # Packets which can be sent to an XBee
00025     
00026     # Format: 
00027     #        {name of command:
00028     #           [{name:field name, len:field length, default: default value sent}
00029     #            ...
00030     #            ]
00031     #         ...
00032     #         }
00033     api_commands = {"at":
00034                         [{'name':'id',        'len':1,      'default':'\x08'},
00035                          {'name':'frame_id',  'len':1,      'default':'\x00'},
00036                          {'name':'command',   'len':2,      'default':None},
00037                          {'name':'parameter', 'len':None,   'default':None}],
00038                     "queued_at":
00039                         [{'name':'id',        'len':1,      'default':'\x09'},
00040                          {'name':'frame_id',  'len':1,      'default':'\x00'},
00041                          {'name':'command',   'len':2,      'default':None},
00042                          {'name':'parameter', 'len':None,   'default':None}],
00043                     "remote_at":
00044                         [{'name':'id',              'len':1,        'default':'\x17'},
00045                          {'name':'frame_id',        'len':1,        'default':'\x00'},
00046                          # dest_addr_long is 8 bytes (64 bits), so use an unsigned long long
00047                          {'name':'dest_addr_long',  'len':8,        'default':struct.pack('>Q', 0)},
00048                          {'name':'dest_addr',       'len':2,        'default':'\xFF\xFE'},
00049                          {'name':'options',         'len':1,        'default':'\x02'},
00050                          {'name':'command',         'len':2,        'default':None},
00051                          {'name':'parameter',       'len':None,     'default':None}],
00052                     "tx_long_addr":
00053                         [{'name':'id',              'len':1,        'default':'\x00'},
00054                          {'name':'frame_id',        'len':1,        'default':'\x00'},
00055                          {'name':'dest_addr',       'len':8,        'default':None},
00056                          {'name':'options',         'len':1,        'default':'\x00'},
00057                          {'name':'data',            'len':None,     'default':None}],
00058                     "tx":
00059                         [{'name':'id',              'len':1,        'default':'\x01'},
00060                          {'name':'frame_id',        'len':1,        'default':'\x00'},
00061                          {'name':'dest_addr',       'len':2,        'default':None},
00062                          {'name':'options',         'len':1,        'default':'\x00'},
00063                          {'name':'data',            'len':None,     'default':None}]
00064                     }
00065     
00066     # Packets which can be received from an XBee
00067     
00068     # Format: 
00069     #        {id byte received from XBee:
00070     #           {name: name of response
00071     #            structure:
00072     #                [ {'name': name of field, 'len':length of field}
00073     #                  ...
00074     #                  ]
00075     #            parse_as_io_samples:name of field to parse as io
00076     #           }
00077     #           ...
00078     #        }
00079     #
00080     api_responses = {"\x80":
00081                         {'name':'rx_long_addr',
00082                          'structure':
00083                             [{'name':'source_addr', 'len':8},
00084                              {'name':'rssi',        'len':1},
00085                              {'name':'options',     'len':1},
00086                              {'name':'rf_data',     'len':None}]},
00087                      "\x81":
00088                         {'name':'rx',
00089                          'structure':
00090                             [{'name':'source_addr', 'len':2},
00091                              {'name':'rssi',        'len':1},
00092                              {'name':'options',     'len':1},
00093                              {'name':'rf_data',     'len':None}]},
00094                      "\x82":
00095                         {'name':'rx_io_data_long_addr',
00096                          'structure':
00097                             [{'name':'source_addr_long','len':8},
00098                              {'name':'rssi',            'len':1},
00099                              {'name':'options',         'len':1},
00100                              {'name':'samples',         'len':None}],
00101                          'parse_as_io_samples':'samples'},
00102                      "\x83":
00103                         {'name':'rx_io_data',
00104                          'structure':
00105                             [{'name':'source_addr', 'len':2},
00106                              {'name':'rssi',        'len':1},
00107                              {'name':'options',     'len':1},
00108                              {'name':'samples',     'len':None}],
00109                          'parse_as_io_samples':'samples'},
00110                      "\x89":
00111                         {'name':'tx_status',
00112                          'structure':
00113                             [{'name':'frame_id',    'len':1},
00114                              {'name':'status',      'len':1}]},
00115                      "\x8a":
00116                         {'name':'status',
00117                          'structure':
00118                             [{'name':'status',      'len':1}]},
00119                      "\x88":
00120                         {'name':'at_response',
00121                          'structure':
00122                             [{'name':'frame_id',    'len':1},
00123                              {'name':'command',     'len':2},
00124                              {'name':'status',      'len':1},
00125                              {'name':'parameter',   'len':None}]},
00126                      "\x97":
00127                         {'name':'remote_at_response',
00128                          'structure':
00129                             [{'name':'frame_id',        'len':1},
00130                              {'name':'source_addr_long','len':8},
00131                              {'name':'source_addr',     'len':2},
00132                              {'name':'command',         'len':2},
00133                              {'name':'status',          'len':1},
00134                              {'name':'parameter',       'len':None}]},
00135                      }
00136     
00137     def __init__(self, *args, **kwargs):
00138         # Call the super class constructor to save the serial port
00139         super(XBee, self).__init__(*args, **kwargs)


rosserial_xbee
Author(s): Adam Stambler
autogenerated on Thu Jun 6 2019 19:56:39