@@ -284,14 +284,20 @@ def __init__(self, api_frame_type):
284284 Class constructor. Instantiates a new :class:`.XBeeAPIPacket` object with the provided parameters.
285285
286286 Args:
287- api_frame_type (:class:`.ApiFrameType`): The API frame type.
287+ api_frame_type (:class:`.ApiFrameType` or Integer ): The API frame type.
288288
289289 .. seealso::
290290 | :class:`.ApiFrameType`
291291 | :class:`.XBeePacket`
292292 """
293293 super ().__init__ ()
294- self ._frame_type = api_frame_type
294+ # Check the type of the API frame type.
295+ if isinstance (api_frame_type , ApiFrameType ):
296+ self ._frame_type = api_frame_type
297+ self ._frame_type_value = api_frame_type .code
298+ else :
299+ self ._frame_type = ApiFrameType .get (api_frame_type )
300+ self ._frame_type_value = api_frame_type
295301 self ._frame_id = 0
296302
297303 def get_frame_spec_data (self ):
@@ -304,7 +310,7 @@ def get_frame_spec_data(self):
304310 data = self ._get_api_packet_spec_data ()
305311 if self .needs_id ():
306312 data .insert (0 , self ._frame_id )
307- data .insert (0 , self ._frame_type . code )
313+ data .insert (0 , self ._frame_type_value )
308314 return data
309315
310316 def get_frame_type (self ):
@@ -319,6 +325,18 @@ def get_frame_type(self):
319325 """
320326 return self ._frame_type
321327
328+ def get_frame_type_value (self ):
329+ """
330+ Returns the frame type integer value of this packet.
331+
332+ Returns:
333+ Integer: the frame type integer value of this packet.
334+
335+ .. seealso::
336+ | :class:`.ApiFrameType`
337+ """
338+ return self ._frame_type_value
339+
322340 def _get_frame_spec_data_dict (self ):
323341 """
324342 Override method.
@@ -516,3 +534,84 @@ def _get_api_packet_spec_data_dict(self):
516534 | :meth:`.XBeeAPIPacket._get_api_packet_spec_data_dict`
517535 """
518536 return {DictKeys .RF_DATA : self .__rf_data }
537+
538+
539+ class UnknownXBeePacket (XBeeAPIPacket ):
540+ """
541+ This class represents an unknown XBee packet.
542+
543+ .. seealso::
544+ | :class:`.XBeeAPIPacket`
545+ """
546+
547+ __MIN_PACKET_LENGTH = 5
548+
549+ def __init__ (self , api_frame , rf_data ):
550+ """
551+ Class constructor. Instantiates a :class:`.UnknownXBeePacket` object with the provided parameters.
552+
553+ Args:
554+ api_frame (Integer): the API frame integer value of this packet.
555+ rf_data (bytearray): the frame specific data without frame type and frame ID.
556+
557+ .. seealso::
558+ | :mod:`.factory`
559+ | :class:`.XBeeAPIPacket`
560+ """
561+ super ().__init__ (api_frame_type = api_frame )
562+ self .__rf_data = rf_data
563+
564+ @staticmethod
565+ def create_packet (raw , operating_mode = OperatingMode .API_MODE ):
566+ """
567+ Override method.
568+
569+ Returns:
570+ :class:`.UnknownXBeePacket`: the UnknownXBeePacket generated.
571+
572+ Raises:
573+ InvalidPacketException: if the bytearray length is less than 5. (start delim. + length (2 bytes) +
574+ frame type + checksum = 5 bytes).
575+ InvalidPacketException: if the length field of 'raw' is different than its real length. (length field: bytes
576+ 2 and 3)
577+ InvalidPacketException: if the first byte of 'raw' is not the header byte. See :class:`.SpecialByte`.
578+ InvalidPacketException: if the calculated checksum is different than the checksum field value (last byte).
579+ InvalidOperatingModeException: if ``operating_mode`` is not supported.
580+
581+ .. seealso::
582+ | :meth:`.XBeePacket.create_packet`
583+ | :meth:`.XBeeAPIPacket._check_api_packet`
584+ """
585+ if operating_mode != OperatingMode .ESCAPED_API_MODE and operating_mode != OperatingMode .API_MODE :
586+ raise InvalidOperatingModeException (operating_mode + " is not supported." )
587+
588+ XBeeAPIPacket ._check_api_packet (raw , min_length = UnknownXBeePacket .__MIN_PACKET_LENGTH )
589+
590+ return UnknownXBeePacket (raw [3 ], raw [4 :- 1 ])
591+
592+ def _get_api_packet_spec_data (self ):
593+ """
594+ Override method.
595+
596+ .. seealso::
597+ | :meth:`.XBeeAPIPacket._get_api_packet_spec_data`
598+ """
599+ return bytearray (self .__rf_data )
600+
601+ def needs_id (self ):
602+ """
603+ Override method.
604+
605+ .. seealso::
606+ | :meth:`.XBeeAPIPacket.needs_id`
607+ """
608+ return False
609+
610+ def _get_api_packet_spec_data_dict (self ):
611+ """
612+ Override method.
613+
614+ .. seealso::
615+ | :meth:`.XBeeAPIPacket._get_api_packet_spec_data_dict`
616+ """
617+ return {DictKeys .RF_DATA : self .__rf_data }
0 commit comments