Skip to content

Commit 61e6a5b

Browse files
committed
WIP on missing bit correction & reenable read()
1 parent 9afc89b commit 61e6a5b

File tree

5 files changed

+200
-167
lines changed

5 files changed

+200
-167
lines changed

am2302.pxd

+9-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ cdef extern from 'array':
77

88
cdef extern from 'bitset':
99
cdef cppclass bitset:
10-
pass
10+
unsigned size()
11+
unsigned count()
12+
bool test(unsigned)
1113

1214
cdef extern from 'wiringPi.h':
1315
void wiringPiSetup()
@@ -16,12 +18,14 @@ cdef extern from 'am2302_py.hpp':
1618

1719
cdef cppclass StreamReader:
1820
int pin
21+
bitset bits
22+
1923
void run()
24+
void fillBits()
25+
2026
void print()
2127
bool valid()
22-
bool correct()
2328

24-
bitset bits()
2529
uint16_t temperature(const bitset &)
2630
uint16_t humidity(const bitset &)
2731
uint8_t parity(const bitset &)
@@ -30,5 +34,5 @@ cdef extern from 'am2302_py.hpp':
3034
array timingsHigh
3135
array timingsLow
3236

33-
int defectHigh()
34-
int defectLow()
37+
bitset missingBits()
38+
bool tryCorrect()

am2302.pyx

+55-13
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,41 @@ cdef class Stream:
2121
def __init__(self, pin):
2222
self.reader.pin = pin
2323

24+
# Poll sensor and read data
25+
2426
def run(self):
2527
self.reader.run()
2628

29+
#
30+
# Debug output
31+
#
32+
2733
def print(self):
2834
self.reader.print()
2935

36+
#
37+
# Get results
38+
#
39+
40+
@property
3041
def valid(self):
3142
return self.reader.valid()
3243

33-
def correct(self):
34-
return self.reader.correct()
35-
44+
@property
3645
def humidity(self):
37-
return float(self.reader.humidity(self.reader.bits())) / 10.0
46+
return float(self.reader.humidity(self.reader.bits)) / 10.0
3847

48+
@property
3949
def temperature(self):
40-
t = self.reader.temperature(self.reader.bits())
50+
t = self.reader.temperature(self.reader.bits)
4151
if t & 0x8000:
4252
t = (~t + 1) | 0x8000
4353
return float(t) / 10.0
4454

55+
#
56+
# Internal timing arrays
57+
#
58+
4559
def timingsStart(self, i, val=None):
4660
if val is None:
4761
return self.reader.timingsStart[i]
@@ -60,12 +74,40 @@ cdef class Stream:
6074
else:
6175
self.reader.timingsLow[i] = val
6276

63-
def defectHigh(self):
64-
i = self.reader.defectHigh()
65-
if i >= 0:
66-
return i
77+
def fillBits(self):
78+
self.reader.fillBits()
79+
80+
#
81+
# Error detection
82+
#
83+
84+
def missingBits(self):
85+
return self.reader.missingBits().count()
86+
87+
def tryCorrect(self):
88+
return self.reader.tryCorrect()
89+
90+
class Result:
91+
def __init__(self, temperature, humidity):
92+
self.temperature = temperature
93+
self.humidity = humidity
94+
95+
def read(pin=7, retries=10):
96+
97+
# make sure we're initialized
98+
setup()
99+
100+
# load stream
101+
s = Stream(pin=pin)
67102

68-
def defectLow(self):
69-
i = self.reader.defectLow()
70-
if i >= 0:
71-
return i
103+
m = 1 + retries # number of attempts
104+
for i in range(m):
105+
s.run()
106+
if s.valid:
107+
return Result(
108+
temperature=s.temperature,
109+
humidity=s.humidity,
110+
)
111+
# sleep and retry
112+
if i < m-1:
113+
time.sleep(2)

0 commit comments

Comments
 (0)