27
27
import time
28
28
from adafruit_bus_device .i2c_device import I2CDevice
29
29
30
+ try :
31
+ from typing import List , Optional , Tuple , Union
32
+ from busio import I2C
33
+ except ImportError :
34
+ pass
35
+
30
36
__version__ = "0.0.0+auto.0"
31
37
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_MLX90640.git"
32
38
@@ -84,21 +90,21 @@ class MLX90640: # pylint: disable=too-many-instance-attributes
84
90
cpKta = 0
85
91
cpKv = 0
86
92
87
- def __init__ (self , i2c_bus , address = 0x33 ):
93
+ def __init__ (self , i2c_bus : I2C , address : int = 0x33 ) -> None :
88
94
self .i2c_device = I2CDevice (i2c_bus , address )
89
95
self ._I2CReadWords (0x2400 , eeData )
90
96
# print(eeData)
91
97
self ._ExtractParameters ()
92
98
93
99
@property
94
- def serial_number (self ):
100
+ def serial_number (self ) -> Tuple [ int , int , int ] :
95
101
"""3-item tuple of hex values that are unique to each MLX90640"""
96
102
serialWords = [0 , 0 , 0 ]
97
103
self ._I2CReadWords (MLX90640_DEVICEID1 , serialWords )
98
104
return serialWords
99
105
100
106
@property
101
- def refresh_rate (self ):
107
+ def refresh_rate (self ) -> int :
102
108
"""How fast the MLX90640 will spit out data. Start at lowest speed in
103
109
RefreshRate and then slowly increase I2C clock rate and rate until you
104
110
max out. The sensor does not like it if the I2C host cannot 'keep up'!"""
@@ -107,14 +113,14 @@ def refresh_rate(self):
107
113
return (controlRegister [0 ] >> 7 ) & 0x07
108
114
109
115
@refresh_rate .setter
110
- def refresh_rate (self , rate ) :
116
+ def refresh_rate (self , rate : int ) -> None :
111
117
controlRegister = [0 ]
112
118
value = (rate & 0x7 ) << 7
113
119
self ._I2CReadWords (0x800D , controlRegister )
114
120
value |= controlRegister [0 ] & 0xFC7F
115
121
self ._I2CWriteWord (0x800D , value )
116
122
117
- def getFrame (self , framebuf ) :
123
+ def getFrame (self , framebuf : List [ int ]) -> None :
118
124
"""Request both 'halves' of a frame from the sensor, merge them
119
125
and calculate the temperature in C for each of 32x24 pixels. Placed
120
126
into the 768-element array passed in!"""
@@ -130,7 +136,7 @@ def getFrame(self, framebuf):
130
136
tr = self ._GetTa (mlx90640Frame ) - OPENAIR_TA_SHIFT
131
137
self ._CalculateTo (mlx90640Frame , emissivity , tr , framebuf )
132
138
133
- def _GetFrameData (self , frameData ) :
139
+ def _GetFrameData (self , frameData : List [ int ]) -> int :
134
140
dataReady = 0
135
141
cnt = 0
136
142
statusRegister = [0 ]
@@ -159,7 +165,7 @@ def _GetFrameData(self, frameData):
159
165
frameData [833 ] = statusRegister [0 ] & 0x0001
160
166
return frameData [833 ]
161
167
162
- def _GetTa (self , frameData ) :
168
+ def _GetTa (self , frameData : List [ int ]) -> float :
163
169
vdd = self ._GetVdd (frameData )
164
170
165
171
ptat = frameData [800 ]
@@ -175,7 +181,7 @@ def _GetTa(self, frameData):
175
181
ta = ta / self .KtPTAT + 25
176
182
return ta
177
183
178
- def _GetVdd (self , frameData ) :
184
+ def _GetVdd (self , frameData : List [ int ]) -> int :
179
185
vdd = frameData [810 ]
180
186
if vdd > 32767 :
181
187
vdd -= 65536
@@ -188,7 +194,9 @@ def _GetVdd(self, frameData):
188
194
189
195
return vdd
190
196
191
- def _CalculateTo (self , frameData , emissivity , tr , result ):
197
+ def _CalculateTo (
198
+ self , frameData : List [int ], emissivity : float , tr : float , result : List [float ]
199
+ ) -> None :
192
200
# pylint: disable=too-many-locals, too-many-branches, too-many-statements
193
201
subPage = frameData [833 ]
194
202
alphaCorrR = [0 ] * 4
@@ -341,7 +349,7 @@ def _CalculateTo(self, frameData, emissivity, tr, result):
341
349
342
350
# pylint: enable=too-many-locals, too-many-branches, too-many-statements
343
351
344
- def _ExtractParameters (self ):
352
+ def _ExtractParameters (self ) -> None :
345
353
self ._ExtractVDDParameters ()
346
354
self ._ExtractPTATParameters ()
347
355
self ._ExtractGainParameters ()
@@ -376,7 +384,7 @@ def _ExtractParameters(self):
376
384
# print("ilChessC:", self.ilChessC)
377
385
# print('-'*40)
378
386
379
- def _ExtractVDDParameters (self ):
387
+ def _ExtractVDDParameters (self ) -> None :
380
388
# extract VDD
381
389
self .kVdd = (eeData [51 ] & 0xFF00 ) >> 8
382
390
if self .kVdd > 127 :
@@ -385,7 +393,7 @@ def _ExtractVDDParameters(self):
385
393
self .vdd25 = eeData [51 ] & 0x00FF
386
394
self .vdd25 = ((self .vdd25 - 256 ) << 5 ) - 8192
387
395
388
- def _ExtractPTATParameters (self ):
396
+ def _ExtractPTATParameters (self ) -> None :
389
397
# extract PTAT
390
398
self .KvPTAT = (eeData [50 ] & 0xFC00 ) >> 10
391
399
if self .KvPTAT > 31 :
@@ -398,31 +406,31 @@ def _ExtractPTATParameters(self):
398
406
self .vPTAT25 = eeData [49 ]
399
407
self .alphaPTAT = (eeData [16 ] & 0xF000 ) / math .pow (2 , 14 ) + 8
400
408
401
- def _ExtractGainParameters (self ):
409
+ def _ExtractGainParameters (self ) -> None :
402
410
# extract Gain
403
411
self .gainEE = eeData [48 ]
404
412
if self .gainEE > 32767 :
405
413
self .gainEE -= 65536
406
414
407
- def _ExtractTgcParameters (self ):
415
+ def _ExtractTgcParameters (self ) -> None :
408
416
# extract Tgc
409
417
self .tgc = eeData [60 ] & 0x00FF
410
418
if self .tgc > 127 :
411
419
self .tgc -= 256
412
420
self .tgc /= 32
413
421
414
- def _ExtractResolutionParameters (self ):
422
+ def _ExtractResolutionParameters (self ) -> None :
415
423
# extract resolution
416
424
self .resolutionEE = (eeData [56 ] & 0x3000 ) >> 12
417
425
418
- def _ExtractKsTaParameters (self ):
426
+ def _ExtractKsTaParameters (self ) -> None :
419
427
# extract KsTa
420
428
self .KsTa = (eeData [60 ] & 0xFF00 ) >> 8
421
429
if self .KsTa > 127 :
422
430
self .KsTa -= 256
423
431
self .KsTa /= 8192
424
432
425
- def _ExtractKsToParameters (self ):
433
+ def _ExtractKsToParameters (self ) -> None :
426
434
# extract ksTo
427
435
step = ((eeData [63 ] & 0x3000 ) >> 12 ) * 10
428
436
self .ct [0 ] = - 40
@@ -446,7 +454,7 @@ def _ExtractKsToParameters(self):
446
454
self .ksTo [i ] /= KsToScale
447
455
self .ksTo [4 ] = - 0.0002
448
456
449
- def _ExtractCPParameters (self ):
457
+ def _ExtractCPParameters (self ) -> None :
450
458
# extract CP
451
459
offsetSP = [0 ] * 2
452
460
alphaSP = [0 ] * 2
@@ -489,7 +497,7 @@ def _ExtractCPParameters(self):
489
497
self .cpOffset [0 ] = offsetSP [0 ]
490
498
self .cpOffset [1 ] = offsetSP [1 ]
491
499
492
- def _ExtractAlphaParameters (self ):
500
+ def _ExtractAlphaParameters (self ) -> None :
493
501
# extract alpha
494
502
accRemScale = eeData [32 ] & 0x000F
495
503
accColumnScale = (eeData [32 ] & 0x00F0 ) >> 4
@@ -553,7 +561,7 @@ def _ExtractAlphaParameters(self):
553
561
554
562
self .alphaScale = alphaScale
555
563
556
- def _ExtractOffsetParameters (self ):
564
+ def _ExtractOffsetParameters (self ) -> None :
557
565
# extract offset
558
566
occRow = [0 ] * 24
559
567
occColumn = [0 ] * 32
@@ -600,7 +608,7 @@ def _ExtractOffsetParameters(self):
600
608
+ (occColumn [j ] << occColumnScale )
601
609
)
602
610
603
- def _ExtractKtaPixelParameters (self ): # pylint: disable=too-many-locals
611
+ def _ExtractKtaPixelParameters (self ) -> None : # pylint: disable=too-many-locals
604
612
# extract KtaPixel
605
613
KtaRC = [0 ] * 4
606
614
ktaTemp = [0 ] * 768
@@ -657,7 +665,7 @@ def _ExtractKtaPixelParameters(self): # pylint: disable=too-many-locals
657
665
self .kta [i ] = int (temp + 0.5 )
658
666
self .ktaScale = ktaScale1
659
667
660
- def _ExtractKvPixelParameters (self ):
668
+ def _ExtractKvPixelParameters (self ) -> None :
661
669
KvT = [0 ] * 4
662
670
kvTemp = [0 ] * 768
663
671
@@ -708,7 +716,7 @@ def _ExtractKvPixelParameters(self):
708
716
self .kv [i ] = int (temp + 0.5 )
709
717
self .kvScale = kvScale
710
718
711
- def _ExtractCILCParameters (self ):
719
+ def _ExtractCILCParameters (self ) -> None :
712
720
ilChessC = [0 ] * 3
713
721
714
722
self .calibrationModeEE = (eeData [10 ] & 0x0800 ) >> 4
@@ -731,7 +739,7 @@ def _ExtractCILCParameters(self):
731
739
732
740
self .ilChessC = ilChessC
733
741
734
- def _ExtractDeviatingPixels (self ):
742
+ def _ExtractDeviatingPixels (self ) -> None :
735
743
# pylint: disable=too-many-branches
736
744
pixCnt = 0
737
745
@@ -768,13 +776,13 @@ def _ExtractDeviatingPixels(self):
768
776
if self ._ArePixelsAdjacent (brokenPixel , outlierPixel ):
769
777
raise RuntimeError ("Adjacent broken and outlier pixels" )
770
778
771
- def _UniqueListPairs (self , inputList ) :
779
+ def _UniqueListPairs (self , inputList : List [ int ]) -> Tuple [ int , int ] :
772
780
# pylint: disable=no-self-use
773
781
for i , listValue1 in enumerate (inputList ):
774
782
for listValue2 in inputList [i + 1 :]:
775
- yield ( listValue1 , listValue2 )
783
+ yield listValue1 , listValue2
776
784
777
- def _ArePixelsAdjacent (self , pix1 , pix2 ) :
785
+ def _ArePixelsAdjacent (self , pix1 : int , pix2 : int ) -> bool :
778
786
# pylint: disable=no-self-use
779
787
pixPosDif = pix1 - pix2
780
788
@@ -787,13 +795,13 @@ def _ArePixelsAdjacent(self, pix1, pix2):
787
795
788
796
return False
789
797
790
- def _IsPixelBad (self , pixel ) :
798
+ def _IsPixelBad (self , pixel : int ) -> bool :
791
799
if pixel in self .brokenPixels or pixel in self .outlierPixels :
792
800
return True
793
801
794
802
return False
795
803
796
- def _I2CWriteWord (self , writeAddress , data ) :
804
+ def _I2CWriteWord (self , writeAddress : int , data : int ) -> None :
797
805
cmd = bytearray (4 )
798
806
cmd [0 ] = writeAddress >> 8
799
807
cmd [1 ] = writeAddress & 0x00FF
@@ -810,7 +818,9 @@ def _I2CWriteWord(self, writeAddress, data):
810
818
# if (dataCheck != data):
811
819
# return -2
812
820
813
- def _I2CReadWords (self , addr , buffer , * , end = None ):
821
+ def _I2CReadWords (
822
+ self , addr : int , buffer : Union [int , List [int ]], * , end : Optional [int ] = None
823
+ ) -> None :
814
824
# stamp = time.monotonic()
815
825
if end is None :
816
826
remainingWords = len (buffer )
0 commit comments