61
61
except ImportError :
62
62
pass
63
63
64
+ try :
65
+ from typing import Callable , Optional , Type
66
+ from circuitpython_typing import WriteableBuffer , ReadableBuffer
67
+ from digitalio import DigitalInOut
68
+ from busio import SPI
69
+ except ImportError :
70
+ pass
71
+
64
72
__version__ = "0.0.0+auto.0"
65
73
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_RFM69.git"
66
74
134
142
# pylint: disable=too-many-instance-attributes
135
143
136
144
137
- def ticks_diff (ticks1 , ticks2 ) :
145
+ def ticks_diff (ticks1 : int , ticks2 : int ) -> int :
138
146
"""Compute the signed difference between two ticks values
139
147
assuming that they are within 2**28 ticks
140
148
"""
@@ -143,7 +151,7 @@ def ticks_diff(ticks1, ticks2):
143
151
return diff
144
152
145
153
146
- def check_timeout (flag , limit ) :
154
+ def check_timeout (flag : Callable , limit : float ) -> bool :
147
155
"""test for timeout waiting for specified flag"""
148
156
timed_out = False
149
157
if HAS_SUPERVISOR :
@@ -224,7 +232,7 @@ class _RegisterBits:
224
232
# check from pylint.
225
233
# pylint: disable=protected-access
226
234
227
- def __init__ (self , address , * , offset = 0 , bits = 1 ) :
235
+ def __init__ (self , address : int , * , offset : int = 0 , bits : int = 1 ) -> None :
228
236
assert 0 <= offset <= 7
229
237
assert 1 <= bits <= 8
230
238
assert (offset + bits ) <= 8
@@ -236,11 +244,11 @@ def __init__(self, address, *, offset=0, bits=1):
236
244
self ._mask <<= offset
237
245
self ._offset = offset
238
246
239
- def __get__ (self , obj , objtype ):
247
+ def __get__ (self , obj : Optional [ "RFM69" ] , objtype : Type [ "RFM69" ] ):
240
248
reg_value = obj ._read_u8 (self ._address )
241
249
return (reg_value & self ._mask ) >> self ._offset
242
250
243
- def __set__ (self , obj , val ) :
251
+ def __set__ (self , obj : Optional [ "RFM69" ] , val : int ) -> None :
244
252
reg_value = obj ._read_u8 (self ._address )
245
253
reg_value &= ~ self ._mask
246
254
reg_value |= (val & 0xFF ) << self ._offset
@@ -274,19 +282,19 @@ def __set__(self, obj, val):
274
282
dio_0_mapping = _RegisterBits (_REG_DIO_MAPPING1 , offset = 6 , bits = 2 )
275
283
276
284
# pylint: disable=too-many-statements
277
- def __init__ (
285
+ def __init__ ( # pylint: disable=invalid-name
278
286
self ,
279
- spi ,
280
- cs ,
281
- reset ,
282
- frequency ,
287
+ spi : SPI ,
288
+ cs : DigitalInOut ,
289
+ reset : DigitalInOut ,
290
+ frequency : int ,
283
291
* ,
284
- sync_word = b"\x2D \xD4 " ,
285
- preamble_length = 4 ,
286
- encryption_key = None ,
287
- high_power = True ,
288
- baudrate = 2000000
289
- ):
292
+ sync_word : bytes = b"\x2D \xD4 " ,
293
+ preamble_length : int = 4 ,
294
+ encryption_key : Optional [ bytes ] = None ,
295
+ high_power : bool = True ,
296
+ baudrate : int = 2000000
297
+ ) -> None :
290
298
self ._tx_power = 13
291
299
self .high_power = high_power
292
300
# Device support SPI mode 0 (polarity & phase = 0) up to a max of 10mhz.
@@ -389,7 +397,9 @@ def __init__(
389
397
390
398
# pylint: disable=no-member
391
399
# Reconsider this disable when it can be tested.
392
- def _read_into (self , address , buf , length = None ):
400
+ def _read_into (
401
+ self , address : int , buf : WriteableBuffer , length : Optional [int ] = None
402
+ ) -> None :
393
403
# Read a number of bytes from the specified address into the provided
394
404
# buffer. If length is not specified (the default) the entire buffer
395
405
# will be filled.
@@ -401,12 +411,14 @@ def _read_into(self, address, buf, length=None):
401
411
device .write (self ._BUFFER , end = 1 )
402
412
device .readinto (buf , end = length )
403
413
404
- def _read_u8 (self , address ) :
414
+ def _read_u8 (self , address : int ) -> int :
405
415
# Read a single byte from the provided address and return it.
406
416
self ._read_into (address , self ._BUFFER , length = 1 )
407
417
return self ._BUFFER [0 ]
408
418
409
- def _write_from (self , address , buf , length = None ):
419
+ def _write_from (
420
+ self , address : int , buf : ReadableBuffer , length : Optional [int ] = None
421
+ ) -> None :
410
422
# Write a number of bytes to the provided address and taken from the
411
423
# provided buffer. If no length is specified (the default) the entire
412
424
# buffer is written.
@@ -418,7 +430,7 @@ def _write_from(self, address, buf, length=None):
418
430
device .write (self ._BUFFER , end = 1 )
419
431
device .write (buf , end = length ) # send data
420
432
421
- def _write_u8 (self , address , val ) :
433
+ def _write_u8 (self , address : int , val : int ) -> None :
422
434
# Write a byte register to the chip. Specify the 7-bit address and the
423
435
# 8-bit value to write to that address.
424
436
with self ._device as device :
@@ -427,27 +439,27 @@ def _write_u8(self, address, val):
427
439
self ._BUFFER [1 ] = val & 0xFF
428
440
device .write (self ._BUFFER , end = 2 )
429
441
430
- def reset (self ):
442
+ def reset (self ) -> None :
431
443
"""Perform a reset of the chip."""
432
444
# See section 7.2.2 of the datasheet for reset description.
433
445
self ._reset .value = True
434
446
time .sleep (0.0001 ) # 100 us
435
447
self ._reset .value = False
436
448
time .sleep (0.005 ) # 5 ms
437
449
438
- def idle (self ):
450
+ def idle (self ) -> None :
439
451
"""Enter idle standby mode (switching off high power amplifiers if necessary)."""
440
452
# Like RadioHead library, turn off high power boost if enabled.
441
453
if self ._tx_power >= 18 :
442
454
self ._write_u8 (_REG_TEST_PA1 , _TEST_PA1_NORMAL )
443
455
self ._write_u8 (_REG_TEST_PA2 , _TEST_PA2_NORMAL )
444
456
self .operation_mode = STANDBY_MODE
445
457
446
- def sleep (self ):
458
+ def sleep (self ) -> None :
447
459
"""Enter sleep mode."""
448
460
self .operation_mode = SLEEP_MODE
449
461
450
- def listen (self ):
462
+ def listen (self ) -> None :
451
463
"""Listen for packets to be received by the chip. Use :py:func:`receive` to listen, wait
452
464
and retrieve packets as they're available.
453
465
"""
@@ -460,7 +472,7 @@ def listen(self):
460
472
# Enter RX mode (will clear FIFO!).
461
473
self .operation_mode = RX_MODE
462
474
463
- def transmit (self ):
475
+ def transmit (self ) -> None :
464
476
"""Transmit a packet which is queued in the FIFO. This is a low level function for
465
477
entering transmit mode and more. For generating and transmitting a packet of data use
466
478
:py:func:`send` instead.
@@ -475,7 +487,7 @@ def transmit(self):
475
487
self .operation_mode = TX_MODE
476
488
477
489
@property
478
- def temperature (self ):
490
+ def temperature (self ) -> float :
479
491
"""The internal temperature of the chip in degrees Celsius. Be warned this is not
480
492
calibrated or very accurate.
481
493
@@ -491,7 +503,7 @@ def temperature(self):
491
503
return 166.0 - temp
492
504
493
505
@property
494
- def operation_mode (self ):
506
+ def operation_mode (self ) -> int :
495
507
"""The operation mode value. Unless you're manually controlling the chip you shouldn't
496
508
change the operation_mode with this property as other side-effects are required for
497
509
changing logical modes--use :py:func:`idle`, :py:func:`sleep`, :py:func:`transmit`,
@@ -501,7 +513,7 @@ def operation_mode(self):
501
513
return (op_mode >> 2 ) & 0b111
502
514
503
515
@operation_mode .setter
504
- def operation_mode (self , val ) :
516
+ def operation_mode (self , val : int ) -> None :
505
517
assert 0 <= val <= 4
506
518
# Set the mode bits inside the operation mode register.
507
519
op_mode = self ._read_u8 (_REG_OP_MODE )
@@ -521,7 +533,7 @@ def operation_mode(self, val):
521
533
raise TimeoutError ("Operation Mode failed to set." )
522
534
523
535
@property
524
- def sync_word (self ):
536
+ def sync_word (self ) -> bytearray :
525
537
"""The synchronization word value. This is a byte string up to 8 bytes long (64 bits)
526
538
which indicates the synchronization word for transmitted and received packets. Any
527
539
received packet which does not include this sync word will be ignored. The default value
@@ -539,7 +551,7 @@ def sync_word(self):
539
551
return sync_word
540
552
541
553
@sync_word .setter
542
- def sync_word (self , val ) :
554
+ def sync_word (self , val : Optional [ bytearray ]) -> None :
543
555
# Handle disabling sync word when None value is set.
544
556
if val is None :
545
557
self .sync_on = 0
@@ -553,7 +565,7 @@ def sync_word(self, val):
553
565
self .sync_on = 1
554
566
555
567
@property
556
- def preamble_length (self ):
568
+ def preamble_length (self ) -> int :
557
569
"""The length of the preamble for sent and received packets, an unsigned 16-bit value.
558
570
Received packets must match this length or they are ignored! Set to 4 to match the
559
571
RadioHead RFM69 library.
@@ -563,13 +575,13 @@ def preamble_length(self):
563
575
return ((msb << 8 ) | lsb ) & 0xFFFF
564
576
565
577
@preamble_length .setter
566
- def preamble_length (self , val ) :
578
+ def preamble_length (self , val : int ) -> None :
567
579
assert 0 <= val <= 65535
568
580
self ._write_u8 (_REG_PREAMBLE_MSB , (val >> 8 ) & 0xFF )
569
581
self ._write_u8 (_REG_PREAMBLE_LSB , val & 0xFF )
570
582
571
583
@property
572
- def frequency_mhz (self ):
584
+ def frequency_mhz (self ) -> float :
573
585
"""The frequency of the radio in Megahertz. Only the allowed values for your radio must be
574
586
specified (i.e. 433 vs. 915 mhz)!
575
587
"""
@@ -584,7 +596,7 @@ def frequency_mhz(self):
584
596
return frequency
585
597
586
598
@frequency_mhz .setter
587
- def frequency_mhz (self , val ) :
599
+ def frequency_mhz (self , val : float ) -> None :
588
600
assert 290 <= val <= 1020
589
601
# Calculate FRF register 24-bit value using section 6.2 of the datasheet.
590
602
frf = int ((val * 1000000.0 ) / _FSTEP ) & 0xFFFFFF
@@ -597,7 +609,7 @@ def frequency_mhz(self, val):
597
609
self ._write_u8 (_REG_FRF_LSB , lsb )
598
610
599
611
@property
600
- def encryption_key (self ):
612
+ def encryption_key (self ) -> bytearray :
601
613
"""The AES encryption key used to encrypt and decrypt packets by the chip. This can be set
602
614
to None to disable encryption (the default), otherwise it must be a 16 byte long byte
603
615
string which defines the key (both the transmitter and receiver must use the same key
@@ -612,7 +624,7 @@ def encryption_key(self):
612
624
return key
613
625
614
626
@encryption_key .setter
615
- def encryption_key (self , val ) :
627
+ def encryption_key (self , val : bytearray ) -> None :
616
628
# Handle if unsetting the encryption key (None value).
617
629
if val is None :
618
630
self .aes_on = 0
@@ -623,7 +635,7 @@ def encryption_key(self, val):
623
635
self .aes_on = 1
624
636
625
637
@property
626
- def tx_power (self ):
638
+ def tx_power (self ) -> int :
627
639
"""The transmit power in dBm. Can be set to a value from -2 to 20 for high power devices
628
640
(RFM69HCW, high_power=True) or -18 to 13 for low power devices. Only integer power
629
641
levels are actually set (i.e. 12.5 will result in a value of 12 dBm).
@@ -648,7 +660,7 @@ def tx_power(self):
648
660
raise RuntimeError ("Power amplifiers in unknown state!" )
649
661
650
662
@tx_power .setter
651
- def tx_power (self , val ):
663
+ def tx_power (self , val : float ):
652
664
val = int (val )
653
665
# Determine power amplifier and output power values depending on
654
666
# high power state and requested power.
@@ -685,7 +697,7 @@ def tx_power(self, val):
685
697
self ._tx_power = val
686
698
687
699
@property
688
- def rssi (self ):
700
+ def rssi (self ) -> float :
689
701
"""The received strength indicator (in dBm).
690
702
May be inaccuate if not read immediatey. last_rssi contains the value read immediately
691
703
receipt of the last packet.
@@ -694,7 +706,7 @@ def rssi(self):
694
706
return - self ._read_u8 (_REG_RSSI_VALUE ) / 2.0
695
707
696
708
@property
697
- def bitrate (self ):
709
+ def bitrate (self ) -> float :
698
710
"""The modulation bitrate in bits/second (or chip rate if Manchester encoding is enabled).
699
711
Can be a value from ~489 to 32mbit/s, but see the datasheet for the exact supported
700
712
values.
@@ -704,47 +716,47 @@ def bitrate(self):
704
716
return _FXOSC / ((msb << 8 ) | lsb )
705
717
706
718
@bitrate .setter
707
- def bitrate (self , val ) :
719
+ def bitrate (self , val : float ) -> None :
708
720
assert (_FXOSC / 65535 ) <= val <= 32000000.0
709
721
# Round up to the next closest bit-rate value with addition of 0.5.
710
722
bitrate = int ((_FXOSC / val ) + 0.5 ) & 0xFFFF
711
723
self ._write_u8 (_REG_BITRATE_MSB , bitrate >> 8 )
712
724
self ._write_u8 (_REG_BITRATE_LSB , bitrate & 0xFF )
713
725
714
726
@property
715
- def frequency_deviation (self ):
727
+ def frequency_deviation (self ) -> float :
716
728
"""The frequency deviation in Hertz."""
717
729
msb = self ._read_u8 (_REG_FDEV_MSB )
718
730
lsb = self ._read_u8 (_REG_FDEV_LSB )
719
731
return _FSTEP * ((msb << 8 ) | lsb )
720
732
721
733
@frequency_deviation .setter
722
- def frequency_deviation (self , val ) :
734
+ def frequency_deviation (self , val : float ) -> None :
723
735
assert 0 <= val <= (_FSTEP * 16383 ) # fdev is a 14-bit unsigned value
724
736
# Round up to the next closest integer value with addition of 0.5.
725
737
fdev = int ((val / _FSTEP ) + 0.5 ) & 0x3FFF
726
738
self ._write_u8 (_REG_FDEV_MSB , fdev >> 8 )
727
739
self ._write_u8 (_REG_FDEV_LSB , fdev & 0xFF )
728
740
729
- def packet_sent (self ):
741
+ def packet_sent (self ) -> bool :
730
742
"""Transmit status"""
731
743
return (self ._read_u8 (_REG_IRQ_FLAGS2 ) & 0x8 ) >> 3
732
744
733
- def payload_ready (self ):
745
+ def payload_ready (self ) -> bool :
734
746
"""Receive status"""
735
747
return (self ._read_u8 (_REG_IRQ_FLAGS2 ) & 0x4 ) >> 2
736
748
737
749
# pylint: disable=too-many-branches
738
750
def send (
739
751
self ,
740
- data ,
752
+ data : ReadableBuffer ,
741
753
* ,
742
- keep_listening = False ,
743
- destination = None ,
744
- node = None ,
745
- identifier = None ,
746
- flags = None
747
- ):
754
+ keep_listening : bool = False ,
755
+ destination : Optional [ int ] = None ,
756
+ node : Optional [ int ] = None ,
757
+ identifier : Optional [ int ] = None ,
758
+ flags : Optional [ int ] = None
759
+ ) -> bool :
748
760
"""Send a string of data using the transmitter.
749
761
You can only send 60 bytes at a time
750
762
(limited by chip's FIFO size and appended headers).
@@ -801,7 +813,7 @@ def send(
801
813
self .idle ()
802
814
return not timed_out
803
815
804
- def send_with_ack (self , data ) :
816
+ def send_with_ack (self , data : int ) -> bool :
805
817
"""Reliable Datagram mode:
806
818
Send a packet with data and wait for an ACK response.
807
819
The packet header is automatically generated.
@@ -839,8 +851,13 @@ def send_with_ack(self, data):
839
851
return got_ack
840
852
841
853
def receive (
842
- self , * , keep_listening = True , with_ack = False , timeout = None , with_header = False
843
- ):
854
+ self ,
855
+ * ,
856
+ keep_listening : bool = True ,
857
+ with_ack : bool = False ,
858
+ timeout : Optional [float ] = None ,
859
+ with_header : bool = False
860
+ ) -> int :
844
861
"""Wait to receive a packet from the receiver. If a packet is found the payload bytes
845
862
are returned, otherwise None is returned (which indicates the timeout elapsed with no
846
863
reception).
0 commit comments