37
37
# Initiator sets up first.
38
38
_DELAY = const (20 ) # μs
39
39
40
+
40
41
# Base class provides user interface and send/receive object buffers
41
42
class Channel (io .IOBase ):
42
43
def __init__ (self , i2c , own , rem , verbose , rxbufsize ):
@@ -80,7 +81,7 @@ def _txdone(self):
80
81
self .txsiz [0 ] = 0
81
82
self .txsiz [1 ] = 0
82
83
83
- # Stream interface
84
+ # Stream interface
84
85
85
86
def ioctl (self , req , arg ):
86
87
ret = _MP_STREAM_ERROR
@@ -102,7 +103,7 @@ def readline(self):
102
103
self .rxbyt = b''
103
104
else :
104
105
t = self .rxbyt [: n + 1 ]
105
- self .rxbyt = self .rxbyt [n + 1 :]
106
+ self .rxbyt = self .rxbyt [n + 1 :]
106
107
return t .decode ()
107
108
108
109
def read (self , n ):
@@ -120,7 +121,7 @@ def write(self, buf, off, sz):
120
121
if off == 0 and sz == len (buf ):
121
122
d = buf
122
123
else :
123
- d = buf [off : off + sz ]
124
+ d = buf [off : off + sz ]
124
125
d = d .encode ()
125
126
l = len (d )
126
127
self .txbyt = d
@@ -129,7 +130,7 @@ def write(self, buf, off, sz):
129
130
return l
130
131
return 0
131
132
132
- # User interface
133
+ # User interface
133
134
134
135
# Wait for sync
135
136
async def ready (self ):
@@ -140,27 +141,29 @@ async def ready(self):
140
141
def close (self ):
141
142
self .own (1 )
142
143
144
+
143
145
# Responder is I2C master. It is cross-platform and uses machine.
144
146
# It does not handle errors: if I2C fails it dies and awaits reset by initiator.
145
147
# send_recv is triggered by Interrupt from Initiator.
146
148
147
149
class Responder (Channel ):
148
150
addr = 0x12
149
151
rxbufsize = 200
152
+
150
153
def __init__ (self , i2c , pin , pinack , verbose = True ):
151
154
super ().__init__ (i2c , pinack , pin , verbose , self .rxbufsize )
152
155
loop = asyncio .get_event_loop ()
153
156
loop .create_task (self ._run ())
154
157
155
158
async def _run (self ):
156
159
await self ._sync () # own pin ->0, wait for remote pin == 0
157
- self .rem .irq (handler = self ._handler , trigger = machine .Pin .IRQ_RISING )
160
+ self .rem .irq (handler = self ._handler , trigger = machine .Pin .IRQ_RISING )
158
161
159
162
# Request was received: immediately read payload size, then payload
160
163
# On Pyboard blocks for 380μs to 1.2ms for small amounts of data
161
164
def _handler (self , _ , sn = bytearray (2 ), txnull = bytearray (2 )):
162
165
addr = Responder .addr
163
- self .rem .irq (handler = None , trigger = machine .Pin .IRQ_RISING )
166
+ self .rem .irq (handler = None , trigger = machine .Pin .IRQ_RISING )
164
167
utime .sleep_us (_DELAY ) # Ensure Initiator has set up to write.
165
168
self .i2c .readfrom_into (addr , sn )
166
169
self .own (1 )
@@ -173,7 +176,7 @@ def _handler(self, _, sn=bytearray(2), txnull=bytearray(2)):
173
176
if n :
174
177
self .waitfor (1 )
175
178
utime .sleep_us (_DELAY )
176
- mv = memoryview (self .rx_mv [0 : n ]) # allocates
179
+ mv = memoryview (self .rx_mv [0 : n ]) # allocates
177
180
self .i2c .readfrom_into (addr , mv )
178
181
self .own (1 )
179
182
self .waitfor (0 )
@@ -200,4 +203,4 @@ def _handler(self, _, sn=bytearray(2), txnull=bytearray(2)):
200
203
self .own (0 )
201
204
self .waitfor (0 )
202
205
self ._txdone () # Invalidate source
203
- self .rem .irq (handler = self ._handler , trigger = machine .Pin .IRQ_RISING )
206
+ self .rem .irq (handler = self ._handler , trigger = machine .Pin .IRQ_RISING )
0 commit comments