Skip to content

Commit 9afc89b

Browse files
committed
New stream based error correction implementation
1 parent 3f6fa28 commit 9afc89b

File tree

6 files changed

+441
-252
lines changed

6 files changed

+441
-252
lines changed

am2302.pxd

+25-22
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,34 @@
11
from libc.stdint cimport uint8_t, uint16_t, uint32_t
22
from libcpp cimport bool
33

4+
cdef extern from 'array':
5+
cdef cppclass array:
6+
uint32_t& operator[](uint32_t)
7+
8+
cdef extern from 'bitset':
9+
cdef cppclass bitset:
10+
pass
11+
412
cdef extern from 'wiringPi.h':
5-
int wiringPiSetup()
13+
void wiringPiSetup()
614

7-
int INPUT
8-
int OUTPUT
9-
void pinMode(int, int)
15+
cdef extern from 'am2302_py.hpp':
1016

11-
int HIGH
12-
int LOW
13-
void digitalWrite(int, int)
14-
int digitalRead(int)
17+
cdef cppclass StreamReader:
18+
int pin
19+
void run()
20+
void print()
21+
bool valid()
22+
bool correct()
1523

16-
void delay(unsigned int)
17-
void delayMicroseconds(unsigned int)
24+
bitset bits()
25+
uint16_t temperature(const bitset &)
26+
uint16_t humidity(const bitset &)
27+
uint8_t parity(const bitset &)
1828

19-
cdef extern from 'am2302_py.hpp':
29+
array timingsStart
30+
array timingsHigh
31+
array timingsLow
2032

21-
cdef cppclass CReader:
22-
int m_pin
23-
uint32_t m_start1, m_start2, m_start3
24-
uint16_t m_temperature, m_humidity
25-
uint8_t m_parity
26-
bool m_tempDone, m_humidityDone, m_parityDone
27-
int m_awaitLevel
28-
int m_awaitBit
29-
uint32_t m_awaitDuration
30-
31-
bool run()
33+
int defectHigh()
34+
int defectLow()

am2302.pyx

+44-74
Original file line numberDiff line numberDiff line change
@@ -15,87 +15,57 @@ def setup():
1515
def initialized():
1616
return _initialized
1717

18-
cdef class Reader:
19-
cdef am2302.CReader m_reader
18+
cdef class Stream:
19+
cdef am2302.StreamReader reader
2020

21-
def __init__(self, pin=7):
22-
self.m_reader.m_pin = pin
21+
def __init__(self, pin):
22+
self.reader.pin = pin
2323

2424
def run(self):
25-
return self.m_reader.run()
25+
self.reader.run()
2626

27-
# Main output properties
27+
def print(self):
28+
self.reader.print()
29+
30+
def valid(self):
31+
return self.reader.valid()
32+
33+
def correct(self):
34+
return self.reader.correct()
35+
36+
def humidity(self):
37+
return float(self.reader.humidity(self.reader.bits())) / 10.0
2838

29-
@property
3039
def temperature(self):
31-
t = self.m_reader.m_temperature
40+
t = self.reader.temperature(self.reader.bits())
3241
if t & 0x8000:
3342
t = (~t + 1) | 0x8000
3443
return float(t) / 10.0
3544

36-
@property
37-
def humidity(self):
38-
return float(self.m_reader.m_humidity) / 10.0
39-
40-
@property
41-
def parity(self):
42-
return self.m_reader.m_parity
43-
44-
@property
45-
def valid(self):
46-
h = self.m_reader.m_humidity
47-
t = self.m_reader.m_temperature
48-
p = self.m_reader.m_parity
49-
return (((h >> 8) + h + (t >> 8) + t) & 0xFF) == p
50-
51-
# Debug properties
52-
53-
@property
54-
def start1(self):
55-
return self.m_reader.m_start1
56-
@property
57-
def start2(self):
58-
return self.m_reader.m_start2
59-
@property
60-
def start3(self):
61-
return self.m_reader.m_start3
62-
63-
@property
64-
def tempDone(self):
65-
return self.m_reader.m_tempDone
66-
@property
67-
def humidityDone(self):
68-
return self.m_reader.m_humidityDone
69-
@property
70-
def parityDone(self):
71-
return self.m_reader.m_parityDone
72-
73-
@property
74-
def awaitLevel(self):
75-
return self.m_reader.m_awaitLevel
76-
77-
@property
78-
def awaitDuration(self):
79-
return self.m_reader.m_awaitDuration
80-
81-
@property
82-
def awaitBit(self):
83-
return self.m_reader.m_awaitBit
84-
85-
class am3202_data:
86-
def __init__(self, temperature, humidity):
87-
self.temperature = temperature
88-
self.humidity = humidity
89-
90-
def read(pin=7, retries=10):
91-
setup()
92-
reader = Reader(pin)
93-
for r in range(retries):
94-
if reader.run() and reader.valid:
95-
return am3202_data(
96-
temperature=reader.temperature,
97-
humidity=reader.humidity,
98-
)
99-
100-
# wait before checking sensor again
101-
time.sleep(1)
45+
def timingsStart(self, i, val=None):
46+
if val is None:
47+
return self.reader.timingsStart[i]
48+
else:
49+
self.reader.timingsStart[i] = val
50+
51+
def timingsHigh(self, i, val=None):
52+
if val is None:
53+
return self.reader.timingsHigh[i]
54+
else:
55+
self.reader.timingsHigh[i] = val
56+
57+
def timingsLow(self, i, val=None):
58+
if val is None:
59+
return self.reader.timingsLow[i]
60+
else:
61+
self.reader.timingsLow[i] = val
62+
63+
def defectHigh(self):
64+
i = self.reader.defectHigh()
65+
if i >= 0:
66+
return i
67+
68+
def defectLow(self):
69+
i = self.reader.defectLow()
70+
if i >= 0:
71+
return i

0 commit comments

Comments
 (0)