Skip to content

Conversation

obra
Copy link
Contributor

@obra obra commented Sep 22, 2021

Not every MCU offers open drain pins, but some do. This change
means that they'll no longer have to play games to implement an
API-compatible pinMode() function that offers open drain.

Fixes #155

If you're reading this commit message because you need to add another
pin mode to this enum, the hacky trivial workaround is to do something
like this in your core:

// This typedef is used to extend the PinMode typedef enum
// in the ArduinoAPI, since they don't have contants
typedef enum {
        INPUT_ANALOG = 99 , // We assume that the Arduino core will never have 99 PinModes
        OUTPUT_OPEN_DRAIN   // It'd be cleaner to be able to count the size of that enum
} PinModeExtension;

Because PinMode is an enum and not a proper type, the compiler will
let the user pass either a PinMode or a PinModeExtension to your
pinMode() function, even though the signature is
void pinMode(pin_size_t ulPin, PinMode ulMode)

@codecov-commenter
Copy link

codecov-commenter commented Sep 22, 2021

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 96.00%. Comparing base (6a524ad) to head (df98331).
⚠️ Report is 139 commits behind head on master.

Additional details and impacted files
@@           Coverage Diff           @@
##           master     #157   +/-   ##
=======================================
  Coverage   96.00%   96.00%           
=======================================
  Files          13       13           
  Lines         827      827           
=======================================
  Hits          794      794           
  Misses         33       33           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Not every MCU offers open drain pins, but some do. This change
means that they'll no longer have to play games to implement an
API-compatible pinMode() function that offers open drain.

Fixes arduino#155

If you're reading this commit message because you need to add another
pin mode to this enum, the hacky trivial workaround is to do something
like this in your core:

```
// This typedef is used to extend the PinMode typedef enum
// in the ArduinoAPI, since they don't have contants
typedef enum {
        INPUT_ANALOG = 99 , // We assume that the Arduino core will never have 99 PinModes
        OUTPUT_OPEN_DRAIN   // It'd be cleaner to be able to count the size of that enum
} PinModeExtension;
```

Because PinMode is an enum and not a proper type, the compiler will
let the user pass either a PinMode or a PinModeExtension to your
pinMode() function, even though the signature is
`void pinMode(pin_size_t ulPin, PinMode ulMode)`
@facchinm facchinm merged commit e03b653 into arduino:master Oct 1, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Extending PinMode to support MCUs with open-drain outputs?

3 participants