55 * by Watterott electronic (www.watterott.com)
66 * based on https://code.google.com/p/digitalwritefast
77 *
8+ * The value of DigitalReadFast() is the content of the input register e.g. 0x04 for pin2 and NOT always 0 or 1.
9+ *
810 * License: BSD 3-Clause License (https://opensource.org/licenses/BSD-3-Clause)
911 */
1012
@@ -324,18 +326,22 @@ int NonConstantsUsedForDigitalReadFast( void ) __attribute__ (( error("Paramete
324326# if (defined(__AVR__ ) || defined(ARDUINO_ARCH_AVR )) && defined(__digitalPinToPortReg )
325327# if defined(THROW_ERROR_IF_NOT_FAST )
326328#define digitalWriteFast (P , V ) \
327- if (__builtin_constant_p(P)) { \
328- BIT_WRITE(*__digitalPinToPortReg(P), __digitalPinToBit(P), (V)); \
329- } else { \
329+ do { \
330+ if (__builtin_constant_p(P)) { \
331+ BIT_WRITE(*__digitalPinToPortReg(P), __digitalPinToBit(P), (V)); \
332+ } else { \
330333 NonConstantsUsedForDigitalWriteFast(); \
331- }
334+ } \
335+ } while (0)
332336# else
333337#define digitalWriteFast (P , V ) \
334- if (__builtin_constant_p(P)) { \
335- BIT_WRITE(*__digitalPinToPortReg(P), __digitalPinToBit(P), (V)); \
336- } else { \
337- digitalWrite((P), (V)); \
338- }
338+ do { \
339+ if (__builtin_constant_p(P)) { \
340+ BIT_WRITE(*__digitalPinToPortReg(P), __digitalPinToBit(P), (V)); \
341+ } else { \
342+ digitalWrite((P), (V)); \
343+ } \
344+ } while (0)
339345# endif // defined(THROW_ERROR_IF_NOT_FAST)
340346# else
341347#define digitalWriteFast digitalWrite
@@ -346,28 +352,32 @@ if (__builtin_constant_p(P)) { \
346352# if (defined(__AVR__ ) || defined(ARDUINO_ARCH_AVR )) && defined(__digitalPinToPortReg )
347353# if defined(THROW_ERROR_IF_NOT_FAST )
348354#define pinModeFast (P , V ) \
349- if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
350- if (V == INPUT_PULLUP) {\
351- BIT_CLEAR(*__digitalPinToDDRReg(P), __digitalPinToBit(P)); \
352- BIT_SET(*__digitalPinToPortReg(P), __digitalPinToBit(P)); \
355+ do { \
356+ if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
357+ if (V == INPUT_PULLUP) {\
358+ BIT_CLEAR(*__digitalPinToDDRReg(P), __digitalPinToBit(P)); \
359+ BIT_SET(*__digitalPinToPortReg(P), __digitalPinToBit(P)); \
360+ } else { \
361+ BIT_WRITE(*__digitalPinToDDRReg(P), __digitalPinToBit(P), (V)); \
362+ } \
353363 } else { \
354- BIT_WRITE(*__digitalPinToDDRReg(P), __digitalPinToBit(P), (V)); \
355- } \
356- } else { \
357364 NonConstantsUsedForPinModeFast(); \
358- }
365+ } \
366+ } while (0)
359367# else
360368#define pinModeFast (P , V ) \
361- if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
362- if (V == INPUT_PULLUP) {\
363- BIT_CLEAR(*__digitalPinToDDRReg(P), __digitalPinToBit(P)); \
364- BIT_SET(*__digitalPinToPortReg(P), __digitalPinToBit(P)); \
369+ do { \
370+ if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
371+ if (V == INPUT_PULLUP) {\
372+ BIT_CLEAR(*__digitalPinToDDRReg(P), __digitalPinToBit(P)); \
373+ BIT_SET(*__digitalPinToPortReg(P), __digitalPinToBit(P)); \
374+ } else { \
375+ BIT_WRITE(*__digitalPinToDDRReg(P), __digitalPinToBit(P), (V)); \
376+ } \
365377 } else { \
366- BIT_WRITE(*__digitalPinToDDRReg(P), __digitalPinToBit (P), (V)); \
378+ pinMode( (P), (V)); \
367379 } \
368- } else { \
369- pinMode((P), (V)); \
370- }
380+ } while (0)
371381# endif // defined(THROW_ERROR_IF_NOT_FAST)
372382# else
373383#define pinModeFast pinMode
@@ -379,17 +389,11 @@ if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
379389# if defined(THROW_ERROR_IF_NOT_FAST )
380390#define digitalReadFast (P ) ( (int) __digitalReadFast((P)) )
381391// since we have return values, it is easier to implement it by ?:
382- #define __digitalReadFast (P ) \
383- (__builtin_constant_p(P) ) ? \
384- (( BIT_READ(*__digitalPinToPINReg(P), __digitalPinToBit(P))) ? HIGH:LOW ) : \
385- NonConstantsUsedForDigitalReadFast()
392+ #define __digitalReadFast (P ) ( (__builtin_constant_p(P) ) ? (( BIT_READ(*__digitalPinToPINReg(P), __digitalPinToBit(P))) ? HIGH:LOW ) : NonConstantsUsedForDigitalReadFast() )
386393# else
387394#define digitalReadFast (P ) ( (int) __digitalReadFast((P)) )
388395// since we have return values, it is easier to implement it by ?:
389- #define __digitalReadFast (P ) \
390- (__builtin_constant_p(P) ) ? \
391- (( BIT_READ(*__digitalPinToPINReg(P), __digitalPinToBit(P))) ? HIGH:LOW ) : \
392- digitalRead((P))
396+ #define __digitalReadFast (P ) ( (__builtin_constant_p(P) ) ? (( BIT_READ(*__digitalPinToPINReg(P), __digitalPinToBit(P))) ? HIGH:LOW ) : digitalRead((P)) )
393397# endif // defined(THROW_ERROR_IF_NOT_FAST)
394398# else
395399#define digitalReadFast digitalRead
@@ -400,18 +404,22 @@ if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \
400404# if (defined(__AVR__ ) || defined(ARDUINO_ARCH_AVR )) && defined(__digitalPinToPINReg )
401405# if defined(THROW_ERROR_IF_NOT_FAST )
402406#define digitalToggleFast (P ) \
403- if (__builtin_constant_p(P)) { \
404- BIT_SET(*__digitalPinToPINReg(P), __digitalPinToBit(P)); \
405- } else { \
407+ do { \
408+ if (__builtin_constant_p(P)) { \
409+ BIT_SET(*__digitalPinToPINReg(P), __digitalPinToBit(P)); \
410+ } else { \
406411 NonConstantsUsedForDigitalToggleFast(); \
407- }
412+ } \
413+ } while (0)
408414# else
409415#define digitalToggleFast (P ) \
410- if (__builtin_constant_p(P)) { \
411- BIT_SET(*__digitalPinToPINReg(P), __digitalPinToBit(P)); \
412- } else { \
413- digitalWrite(P, ! digitalRead(P)); \
414- }
416+ do { \
417+ if (__builtin_constant_p(P)) { \
418+ BIT_SET(*__digitalPinToPINReg(P), __digitalPinToBit(P)); \
419+ } else { \
420+ digitalWrite(P, ! digitalRead(P)); \
421+ } \
422+ } while (0)
415423# endif // defined(THROW_ERROR_IF_NOT_FAST)
416424# else
417425#define digitalToggleFast (P ) digitalWrite(P, ! digitalRead(P))
0 commit comments