-//Function substitutions to ease GPIO manipulation
-#ifdef __AVR__
- #define pin_t uint8_t
- #define setPinInput(pin) _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF)
- #define setPinInputHigh(pin) ({\
- _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF);\
- _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF);\
- })
- #define setPinInputLow(pin) _Static_assert(0, "AVR Processors cannot impliment an input as pull low")
- #define setPinOutput(pin) _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF)
-
- #define writePinHigh(pin) _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF)
- #define writePinLow(pin) _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF)
- static inline void writePin(pin_t pin, uint8_t level){
- if (level){
- _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF);
- } else {
- _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF);
- }
- }
-
- #define readPin(pin) (_SFR_IO8(pin >> 4) & _BV(pin & 0xF))
+#ifdef HAPTIC_ENABLE
+ #include "haptic.h"
+#endif
+
+#ifdef OLED_DRIVER_ENABLE
+ #include "oled_driver.h"
+#endif
+
+// Function substitutions to ease GPIO manipulation
+#if defined(__AVR__)
+ typedef uint8_t pin_t;
+
+ #define PIN_ADDRESS(p, offset) (_SFR_IO8(ADDRESS_BASE + ((p) >> PORT_SHIFTER) + (offset)))
+ #define setPinInput(pin) (PIN_ADDRESS(pin, 1) &= ~_BV((pin) & 0xF))
+ #define setPinInputHigh(pin) (PIN_ADDRESS(pin, 1) &= ~_BV((pin) & 0xF), \
+ PIN_ADDRESS(pin, 2) |= _BV((pin) & 0xF))
+ #define setPinInputLow(pin) _Static_assert(0, "AVR processors cannot implement an input as pull low")
+ #define setPinOutput(pin) (PIN_ADDRESS(pin, 1) |= _BV((pin) & 0xF))
+
+ #define writePinHigh(pin) (PIN_ADDRESS(pin, 2) |= _BV((pin) & 0xF))
+ #define writePinLow(pin) (PIN_ADDRESS(pin, 2) &= ~_BV((pin) & 0xF))
+ #define writePin(pin, level) ((level) ? writePinHigh(pin) : writePinLow(pin))
+
+ #define readPin(pin) ((bool)(PIN_ADDRESS(pin, 0) & _BV((pin) & 0xF)))