Skip to content

Commit 8dc2ba4

Browse files
authored
Merge pull request #30 from tcfranks/main
Add Missing Type Annotations
2 parents 13b303e + 5009dbc commit 8dc2ba4

File tree

1 file changed

+40
-30
lines changed

1 file changed

+40
-30
lines changed

adafruit_mlx90640.py

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@
2727
import time
2828
from adafruit_bus_device.i2c_device import I2CDevice
2929

30+
try:
31+
from typing import List, Optional, Tuple, Union
32+
from busio import I2C
33+
except ImportError:
34+
pass
35+
3036
__version__ = "0.0.0+auto.0"
3137
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_MLX90640.git"
3238

@@ -84,21 +90,21 @@ class MLX90640: # pylint: disable=too-many-instance-attributes
8490
cpKta = 0
8591
cpKv = 0
8692

87-
def __init__(self, i2c_bus, address=0x33):
93+
def __init__(self, i2c_bus: I2C, address: int = 0x33) -> None:
8894
self.i2c_device = I2CDevice(i2c_bus, address)
8995
self._I2CReadWords(0x2400, eeData)
9096
# print(eeData)
9197
self._ExtractParameters()
9298

9399
@property
94-
def serial_number(self):
100+
def serial_number(self) -> Tuple[int, int, int]:
95101
"""3-item tuple of hex values that are unique to each MLX90640"""
96102
serialWords = [0, 0, 0]
97103
self._I2CReadWords(MLX90640_DEVICEID1, serialWords)
98104
return serialWords
99105

100106
@property
101-
def refresh_rate(self):
107+
def refresh_rate(self) -> int:
102108
"""How fast the MLX90640 will spit out data. Start at lowest speed in
103109
RefreshRate and then slowly increase I2C clock rate and rate until you
104110
max out. The sensor does not like it if the I2C host cannot 'keep up'!"""
@@ -107,14 +113,14 @@ def refresh_rate(self):
107113
return (controlRegister[0] >> 7) & 0x07
108114

109115
@refresh_rate.setter
110-
def refresh_rate(self, rate):
116+
def refresh_rate(self, rate: int) -> None:
111117
controlRegister = [0]
112118
value = (rate & 0x7) << 7
113119
self._I2CReadWords(0x800D, controlRegister)
114120
value |= controlRegister[0] & 0xFC7F
115121
self._I2CWriteWord(0x800D, value)
116122

117-
def getFrame(self, framebuf):
123+
def getFrame(self, framebuf: List[int]) -> None:
118124
"""Request both 'halves' of a frame from the sensor, merge them
119125
and calculate the temperature in C for each of 32x24 pixels. Placed
120126
into the 768-element array passed in!"""
@@ -130,7 +136,7 @@ def getFrame(self, framebuf):
130136
tr = self._GetTa(mlx90640Frame) - OPENAIR_TA_SHIFT
131137
self._CalculateTo(mlx90640Frame, emissivity, tr, framebuf)
132138

133-
def _GetFrameData(self, frameData):
139+
def _GetFrameData(self, frameData: List[int]) -> int:
134140
dataReady = 0
135141
cnt = 0
136142
statusRegister = [0]
@@ -159,7 +165,7 @@ def _GetFrameData(self, frameData):
159165
frameData[833] = statusRegister[0] & 0x0001
160166
return frameData[833]
161167

162-
def _GetTa(self, frameData):
168+
def _GetTa(self, frameData: List[int]) -> float:
163169
vdd = self._GetVdd(frameData)
164170

165171
ptat = frameData[800]
@@ -175,7 +181,7 @@ def _GetTa(self, frameData):
175181
ta = ta / self.KtPTAT + 25
176182
return ta
177183

178-
def _GetVdd(self, frameData):
184+
def _GetVdd(self, frameData: List[int]) -> int:
179185
vdd = frameData[810]
180186
if vdd > 32767:
181187
vdd -= 65536
@@ -188,7 +194,9 @@ def _GetVdd(self, frameData):
188194

189195
return vdd
190196

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:
192200
# pylint: disable=too-many-locals, too-many-branches, too-many-statements
193201
subPage = frameData[833]
194202
alphaCorrR = [0] * 4
@@ -341,7 +349,7 @@ def _CalculateTo(self, frameData, emissivity, tr, result):
341349

342350
# pylint: enable=too-many-locals, too-many-branches, too-many-statements
343351

344-
def _ExtractParameters(self):
352+
def _ExtractParameters(self) -> None:
345353
self._ExtractVDDParameters()
346354
self._ExtractPTATParameters()
347355
self._ExtractGainParameters()
@@ -376,7 +384,7 @@ def _ExtractParameters(self):
376384
# print("ilChessC:", self.ilChessC)
377385
# print('-'*40)
378386

379-
def _ExtractVDDParameters(self):
387+
def _ExtractVDDParameters(self) -> None:
380388
# extract VDD
381389
self.kVdd = (eeData[51] & 0xFF00) >> 8
382390
if self.kVdd > 127:
@@ -385,7 +393,7 @@ def _ExtractVDDParameters(self):
385393
self.vdd25 = eeData[51] & 0x00FF
386394
self.vdd25 = ((self.vdd25 - 256) << 5) - 8192
387395

388-
def _ExtractPTATParameters(self):
396+
def _ExtractPTATParameters(self) -> None:
389397
# extract PTAT
390398
self.KvPTAT = (eeData[50] & 0xFC00) >> 10
391399
if self.KvPTAT > 31:
@@ -398,31 +406,31 @@ def _ExtractPTATParameters(self):
398406
self.vPTAT25 = eeData[49]
399407
self.alphaPTAT = (eeData[16] & 0xF000) / math.pow(2, 14) + 8
400408

401-
def _ExtractGainParameters(self):
409+
def _ExtractGainParameters(self) -> None:
402410
# extract Gain
403411
self.gainEE = eeData[48]
404412
if self.gainEE > 32767:
405413
self.gainEE -= 65536
406414

407-
def _ExtractTgcParameters(self):
415+
def _ExtractTgcParameters(self) -> None:
408416
# extract Tgc
409417
self.tgc = eeData[60] & 0x00FF
410418
if self.tgc > 127:
411419
self.tgc -= 256
412420
self.tgc /= 32
413421

414-
def _ExtractResolutionParameters(self):
422+
def _ExtractResolutionParameters(self) -> None:
415423
# extract resolution
416424
self.resolutionEE = (eeData[56] & 0x3000) >> 12
417425

418-
def _ExtractKsTaParameters(self):
426+
def _ExtractKsTaParameters(self) -> None:
419427
# extract KsTa
420428
self.KsTa = (eeData[60] & 0xFF00) >> 8
421429
if self.KsTa > 127:
422430
self.KsTa -= 256
423431
self.KsTa /= 8192
424432

425-
def _ExtractKsToParameters(self):
433+
def _ExtractKsToParameters(self) -> None:
426434
# extract ksTo
427435
step = ((eeData[63] & 0x3000) >> 12) * 10
428436
self.ct[0] = -40
@@ -446,7 +454,7 @@ def _ExtractKsToParameters(self):
446454
self.ksTo[i] /= KsToScale
447455
self.ksTo[4] = -0.0002
448456

449-
def _ExtractCPParameters(self):
457+
def _ExtractCPParameters(self) -> None:
450458
# extract CP
451459
offsetSP = [0] * 2
452460
alphaSP = [0] * 2
@@ -489,7 +497,7 @@ def _ExtractCPParameters(self):
489497
self.cpOffset[0] = offsetSP[0]
490498
self.cpOffset[1] = offsetSP[1]
491499

492-
def _ExtractAlphaParameters(self):
500+
def _ExtractAlphaParameters(self) -> None:
493501
# extract alpha
494502
accRemScale = eeData[32] & 0x000F
495503
accColumnScale = (eeData[32] & 0x00F0) >> 4
@@ -553,7 +561,7 @@ def _ExtractAlphaParameters(self):
553561

554562
self.alphaScale = alphaScale
555563

556-
def _ExtractOffsetParameters(self):
564+
def _ExtractOffsetParameters(self) -> None:
557565
# extract offset
558566
occRow = [0] * 24
559567
occColumn = [0] * 32
@@ -600,7 +608,7 @@ def _ExtractOffsetParameters(self):
600608
+ (occColumn[j] << occColumnScale)
601609
)
602610

603-
def _ExtractKtaPixelParameters(self): # pylint: disable=too-many-locals
611+
def _ExtractKtaPixelParameters(self) -> None: # pylint: disable=too-many-locals
604612
# extract KtaPixel
605613
KtaRC = [0] * 4
606614
ktaTemp = [0] * 768
@@ -657,7 +665,7 @@ def _ExtractKtaPixelParameters(self): # pylint: disable=too-many-locals
657665
self.kta[i] = int(temp + 0.5)
658666
self.ktaScale = ktaScale1
659667

660-
def _ExtractKvPixelParameters(self):
668+
def _ExtractKvPixelParameters(self) -> None:
661669
KvT = [0] * 4
662670
kvTemp = [0] * 768
663671

@@ -708,7 +716,7 @@ def _ExtractKvPixelParameters(self):
708716
self.kv[i] = int(temp + 0.5)
709717
self.kvScale = kvScale
710718

711-
def _ExtractCILCParameters(self):
719+
def _ExtractCILCParameters(self) -> None:
712720
ilChessC = [0] * 3
713721

714722
self.calibrationModeEE = (eeData[10] & 0x0800) >> 4
@@ -731,7 +739,7 @@ def _ExtractCILCParameters(self):
731739

732740
self.ilChessC = ilChessC
733741

734-
def _ExtractDeviatingPixels(self):
742+
def _ExtractDeviatingPixels(self) -> None:
735743
# pylint: disable=too-many-branches
736744
pixCnt = 0
737745

@@ -768,13 +776,13 @@ def _ExtractDeviatingPixels(self):
768776
if self._ArePixelsAdjacent(brokenPixel, outlierPixel):
769777
raise RuntimeError("Adjacent broken and outlier pixels")
770778

771-
def _UniqueListPairs(self, inputList):
779+
def _UniqueListPairs(self, inputList: List[int]) -> Tuple[int, int]:
772780
# pylint: disable=no-self-use
773781
for i, listValue1 in enumerate(inputList):
774782
for listValue2 in inputList[i + 1 :]:
775-
yield (listValue1, listValue2)
783+
yield listValue1, listValue2
776784

777-
def _ArePixelsAdjacent(self, pix1, pix2):
785+
def _ArePixelsAdjacent(self, pix1: int, pix2: int) -> bool:
778786
# pylint: disable=no-self-use
779787
pixPosDif = pix1 - pix2
780788

@@ -787,13 +795,13 @@ def _ArePixelsAdjacent(self, pix1, pix2):
787795

788796
return False
789797

790-
def _IsPixelBad(self, pixel):
798+
def _IsPixelBad(self, pixel: int) -> bool:
791799
if pixel in self.brokenPixels or pixel in self.outlierPixels:
792800
return True
793801

794802
return False
795803

796-
def _I2CWriteWord(self, writeAddress, data):
804+
def _I2CWriteWord(self, writeAddress: int, data: int) -> None:
797805
cmd = bytearray(4)
798806
cmd[0] = writeAddress >> 8
799807
cmd[1] = writeAddress & 0x00FF
@@ -810,7 +818,9 @@ def _I2CWriteWord(self, writeAddress, data):
810818
# if (dataCheck != data):
811819
# return -2
812820

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:
814824
# stamp = time.monotonic()
815825
if end is None:
816826
remainingWords = len(buffer)

0 commit comments

Comments
 (0)