102102//
103103// Example:
104104// static const digitalinout_p_t my_type_proto = {
105- // MP_PROTO_IMPLEMENT(MP_QSTR_protocol_digitalinout )
105+ // MP_PROTO_IMPLEMENT(MP_QSTR_DigitalInOut )
106106// .construct = my_construct_func,
107107// .deinit = my_deinit_func,
108108// .deinited = my_deinited_func,
128128// See shared-bindings/digitalio/DigitalInOut.c for a complete example.
129129//
130130
131-
131+ #if CIRCUITPY_DIGITALINOUT_PROTOCOL
132132static void check_object_has_method (mp_obj_t obj , qstr method_name ) {
133133 mp_obj_t dest [2 ];
134134 mp_load_method_protected (obj , method_name , dest , true);
@@ -144,6 +144,7 @@ static void check_object_has_attr(mp_obj_t obj, qstr attr_name) {
144144 mp_raise_TypeError_varg (MP_ERROR_TEXT ("%q object missing '%q' attribute" ), MP_OBJ_TO_PTR (obj ), attr_name );
145145 }
146146}
147+ #endif
147148
148149mp_obj_t digitalinout_protocol_from_pin (
149150 mp_obj_t pin_or_dio ,
@@ -195,8 +196,9 @@ mp_obj_t digitalinout_protocol_from_pin(
195196 return dio_obj ;
196197 }
197198
199+ #if CIRCUITPY_DIGITALINOUT_PROTOCOL
198200 // Check if it natively implements the DigitalInOutProtocol
199- const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , pin_or_dio );
201+ const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_DigitalInOut , pin_or_dio );
200202 if (proto != NULL ) {
201203 // Native protocol support - use it directly
202204 return pin_or_dio ;
@@ -214,8 +216,15 @@ mp_obj_t digitalinout_protocol_from_pin(
214216
215217 // Object has all required attributes - use it as DigitalInOutProtocol
216218 return pin_or_dio ;
219+ #else
220+ mp_raise_TypeError_varg (MP_ERROR_TEXT ("'%q' object does not support '%q'" ),
221+ mp_obj_get_type_qstr (pin_or_dio ), MP_QSTR_DigitalInOut );
222+ #endif
217223}
218224
225+ // These functions are only used when CIRCUITPY_DIGITALINOUT_PROTOCOL is enabled.
226+ // Otherwise, the digitalinout_* functions are called directly.
227+ #if CIRCUITPY_DIGITALINOUT_PROTOCOL
219228void digitalinout_protocol_deinit (mp_obj_t self ) {
220229 const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , self );
221230 if (proto && proto -> deinit ) {
@@ -233,7 +242,7 @@ void digitalinout_protocol_deinit(mp_obj_t self) {
233242}
234243
235244bool digitalinout_protocol_deinited (mp_obj_t self ) {
236- const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , self );
245+ const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_DigitalInOut , self );
237246 if (proto && proto -> deinited ) {
238247 return proto -> deinited (self );
239248 }
@@ -244,7 +253,7 @@ bool digitalinout_protocol_deinited(mp_obj_t self) {
244253}
245254
246255digitalinout_result_t digitalinout_protocol_switch_to_input (mp_obj_t self , digitalio_pull_t pull ) {
247- const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , self );
256+ const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_DigitalInOut , self );
248257 if (proto && proto -> switch_to_input ) {
249258 return proto -> switch_to_input (self , pull );
250259 }
@@ -268,7 +277,7 @@ digitalinout_result_t digitalinout_protocol_switch_to_input(mp_obj_t self, digit
268277}
269278
270279digitalinout_result_t digitalinout_protocol_switch_to_output (mp_obj_t self , bool value , digitalio_drive_mode_t drive_mode ) {
271- const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , self );
280+ const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_DigitalInOut , self );
272281 if (proto && proto -> switch_to_output ) {
273282 return proto -> switch_to_output (self , value , drive_mode );
274283 }
@@ -289,7 +298,7 @@ digitalinout_result_t digitalinout_protocol_switch_to_output(mp_obj_t self, bool
289298}
290299
291300digitalio_direction_t digitalinout_protocol_get_direction (mp_obj_t self ) {
292- const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , self );
301+ const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_DigitalInOut , self );
293302 if (proto && proto -> get_direction ) {
294303 return proto -> get_direction (self );
295304 }
@@ -303,7 +312,7 @@ digitalio_direction_t digitalinout_protocol_get_direction(mp_obj_t self) {
303312}
304313
305314mp_errno_t digitalinout_protocol_set_value (mp_obj_t self , bool value ) {
306- const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , self );
315+ const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_DigitalInOut , self );
307316 if (proto && proto -> set_value ) {
308317 return proto -> set_value (self , value );
309318 }
@@ -314,7 +323,7 @@ mp_errno_t digitalinout_protocol_set_value(mp_obj_t self, bool value) {
314323}
315324
316325mp_errno_t digitalinout_protocol_get_value (mp_obj_t self , bool * value ) {
317- const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , self );
326+ const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_DigitalInOut , self );
318327 if (proto && proto -> get_value ) {
319328 return proto -> get_value (self , value );
320329 }
@@ -325,7 +334,7 @@ mp_errno_t digitalinout_protocol_get_value(mp_obj_t self, bool *value) {
325334}
326335
327336digitalinout_result_t digitalinout_protocol_set_drive_mode (mp_obj_t self , digitalio_drive_mode_t drive_mode ) {
328- const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , self );
337+ const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_DigitalInOut , self );
329338 if (proto && proto -> set_drive_mode ) {
330339 return proto -> set_drive_mode (self , drive_mode );
331340 }
@@ -339,7 +348,7 @@ digitalinout_result_t digitalinout_protocol_set_drive_mode(mp_obj_t self, digita
339348}
340349
341350digitalio_drive_mode_t digitalinout_protocol_get_drive_mode (mp_obj_t self ) {
342- const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , self );
351+ const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_DigitalInOut , self );
343352 if (proto && proto -> get_drive_mode ) {
344353 return proto -> get_drive_mode (self );
345354 }
@@ -353,7 +362,7 @@ digitalio_drive_mode_t digitalinout_protocol_get_drive_mode(mp_obj_t self) {
353362}
354363
355364digitalinout_result_t digitalinout_protocol_set_pull (mp_obj_t self , digitalio_pull_t pull ) {
356- const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , self );
365+ const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_DigitalInOut , self );
357366 if (proto && proto -> set_pull ) {
358367 return proto -> set_pull (self , pull );
359368 }
@@ -370,7 +379,7 @@ digitalinout_result_t digitalinout_protocol_set_pull(mp_obj_t self, digitalio_pu
370379}
371380
372381digitalio_pull_t digitalinout_protocol_get_pull (mp_obj_t self ) {
373- const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_protocol_digitalinout , self );
382+ const digitalinout_p_t * proto = mp_proto_get (MP_QSTR_DigitalInOut , self );
374383 if (proto && proto -> get_pull ) {
375384 return proto -> get_pull (self );
376385 }
@@ -384,3 +393,5 @@ digitalio_pull_t digitalinout_protocol_get_pull(mp_obj_t self) {
384393 }
385394 return PULL_NONE ;
386395}
396+
397+ #endif // CIRCUITPY_DIGITALINOUT_PROTOCOL
0 commit comments