C/C++ API Reference
Loading...
Searching...
No Matches
digital_io.h
1// Copyright 2021 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14#pragma once
15
16#include "pw_assert/check.h"
17#include "pw_digital_io/internal/conversions.h"
18#include "pw_function/function.h"
19#include "pw_result/result.h"
20#include "pw_status/status.h"
21#include "pw_status/try.h"
22
24namespace pw::digital_io {
25
26// The logical state of a digital line.
27enum class State : bool {
28 kActive = true,
29 kInactive = false,
30};
31
32// The triggering configuration for an interrupt handler.
33enum class InterruptTrigger : int {
34 // Trigger on transition from kInactive to kActive.
35 kActivatingEdge,
36 // Trigger on transition from kActive to kInactive.
37 kDeactivatingEdge,
38 // Trigger on any state transition between kActive and kInactive.
39 kBothEdges,
40};
41
42// Interrupt handling function. The argument contains the latest known state of
43// the line. It is backend-specific if, when, and how this state is updated.
44using InterruptHandler = ::pw::Function<void(State sampled_state)>;
45
47
73 public:
74 virtual ~DigitalIoOptional() = default;
75
77 constexpr bool provides_input() const { return config_.input; }
79 constexpr bool provides_output() const { return config_.output; }
81 constexpr bool provides_interrupt() const { return config_.interrupt; }
82
92
105 Status SetState(State state) { return DoSetState(state); }
106
119 PW_TRY_ASSIGN(const State state, GetState());
120 return state == State::kActive;
121 }
122
136 Status SetStateActive() { return SetState(State::kActive); }
137
151 Status SetStateInactive() { return SetState(State::kInactive); }
152
174 Status SetInterruptHandler(InterruptTrigger trigger,
175 InterruptHandler&& handler) {
176 if (handler == nullptr) {
178 }
179 return DoSetInterruptHandler(trigger, std::move(handler));
180 }
181
193 return DoSetInterruptHandler(InterruptTrigger::kActivatingEdge, nullptr);
194 }
195
208
221
236 Status Enable() { return DoEnable(true); }
237
251 if (provides_interrupt()) {
253 }
254 return DoEnable(false);
255 }
256
257 private:
258 friend class DigitalInterrupt;
259 friend class DigitalIn;
260 friend class DigitalInInterrupt;
261 friend class DigitalOut;
262 friend class DigitalOutInterrupt;
263 friend class DigitalInOut;
264 friend class DigitalInOutInterrupt;
265
266 // Private constructor so that only friends can extend us.
267 constexpr DigitalIoOptional(internal::Provides config) : config_(config) {}
268
290 virtual Status DoEnable(bool enable) = 0;
291
301
313 virtual Status DoSetState(State level) = 0;
314
339 virtual Status DoSetInterruptHandler(InterruptTrigger trigger,
340 InterruptHandler&& handler) = 0;
341
356 virtual Status DoEnableInterruptHandler(bool enable) = 0;
357
358 // The configuration of this line.
359 const internal::Provides config_;
360};
361
362// A digital I/O line that supports only interrupts.
363//
364// The input and output methods are hidden and must not be called.
365//
366// Use this class in APIs when only interrupt functionality is required.
367// Extend this class to implement a line that only supports interrupts.
368//
370 : public DigitalIoOptional,
371 public internal::Conversions<DigitalInterrupt, DigitalIoOptional> {
372 public:
373 // Available functionality
378
379 protected:
380 constexpr DigitalInterrupt()
381 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalInterrupt>()) {}
382
383 private:
384 // Unavailable functionality
388
394
395 // These overrides invoke PW_CRASH.
396 Status DoSetState(State) final;
398};
399
400// A digital I/O line that supports only input (getting state).
401//
402// The output and interrupt methods are hidden and must not be called.
403//
404// Use this class in APIs when only input functionality is required.
405// Extend this class to implement a line that only supports getting state.
406//
408 public internal::Conversions<DigitalIn, DigitalIoOptional> {
409 public:
410 // Available functionality
413
414 protected:
415 constexpr DigitalIn()
416 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalIn>()) {}
417
418 private:
419 // Unavailable functionality
423
431
432 // These overrides invoke PW_CRASH.
433 Status DoSetState(State) final;
434 Status DoSetInterruptHandler(InterruptTrigger, InterruptHandler&&) final;
436};
437
438// An input line that supports interrupts.
439//
440// The output methods are hidden and must not be called.
441//
442// Use in APIs when input and interrupt functionality is required.
443//
444// Extend this class to implement a line that supports input (getting state) and
445// listening for interrupts at the same time.
446//
448 : public DigitalIoOptional,
449 public internal::Conversions<DigitalInInterrupt, DigitalIoOptional> {
450 public:
451 // Available functionality
458
459 protected:
460 constexpr DigitalInInterrupt()
461 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalInInterrupt>()) {}
462
463 private:
464 // Unavailable functionality
468
472
473 // These overrides invoke PW_CRASH.
474 Status DoSetState(State) final;
475};
476
477// A digital I/O line that supports only output (setting state).
478//
479// Input and interrupt functions are hidden and must not be called.
480//
481// Use in APIs when only output functionality is required.
482// Extend this class to implement a line that supports output only.
483//
485 public internal::Conversions<DigitalOut, DigitalIoOptional> {
486 public:
487 // Available functionality
491
492 protected:
493 constexpr DigitalOut()
494 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalOut>()) {}
495
496 private:
497 // Unavailable functionality
501
508
509 // These overrides invoke PW_CRASH.
511 Status DoSetInterruptHandler(InterruptTrigger, InterruptHandler&&) final;
513};
514
515// A digital I/O line that supports output and interrupts.
516//
517// Input methods are hidden and must not be called.
518//
519// Use in APIs when output and interrupt functionality is required. For
520// example, to represent a two-way signalling line.
521//
522// Extend this class to implement a line that supports both output and
523// listening for interrupts at the same time.
524//
526 : public DigitalIoOptional,
527 public internal::Conversions<DigitalOutInterrupt, DigitalIoOptional> {
528 public:
529 // Available functionality
537
538 protected:
539 constexpr DigitalOutInterrupt()
540 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalOutInterrupt>()) {}
541
542 private:
543 // Unavailable functionality
547
550
551 // These overrides invoke PW_CRASH.
553};
554
555// A digital I/O line that supports both input and output.
556//
557// Use in APIs when both input and output functionality is required. For
558// example, to represent a line which is shared by multiple controllers.
559//
560// Extend this class to implement a line that supports both input and output at
561// the same time.
562//
564 : public DigitalIoOptional,
565 public internal::Conversions<DigitalInOut, DigitalIoOptional> {
566 public:
567 // Available functionality
573
574 protected:
575 constexpr DigitalInOut()
576 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalInOut>()) {}
577
578 private:
579 // Unavailable functionality
583
588
589 // These overrides invoke PW_CRASH.
590 Status DoSetInterruptHandler(InterruptTrigger, InterruptHandler&&) final;
592};
593
594// A line that supports input, output, and interrupts.
595//
596// Use in APIs when input, output, and interrupts are required. For example to
597// represent a two-way shared line with state transition notifications.
598//
599// Extend this class to implement a line that supports all the functionality at
600// the same time.
601//
603 : public DigitalIoOptional,
604 public internal::Conversions<DigitalInOutInterrupt, DigitalIoOptional> {
605 public:
606 // Available functionality
616
617 protected:
618 constexpr DigitalInOutInterrupt()
619 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalInOutInterrupt>()) {
620 }
621
622 private:
623 // Unavailable functionality
627};
628
629} // namespace pw::digital_io
Definition: result.h:143
Definition: status.h:120
static constexpr Status InvalidArgument()
Definition: status.h:164
Definition: digital_io.h:408
Definition: digital_io.h:449
Definition: digital_io.h:565
Definition: digital_io.h:604
Definition: digital_io.h:371
Definition: digital_io.h:72
Definition: digital_io.h:485
Definition: digital_io.h:527
virtual Status DoSetState(State level)=0
Status DoSetInterruptHandler(InterruptTrigger, InterruptHandler &&) final
Status EnableInterruptHandler()
Definition: digital_io.h:207
Status SetState(State state)
Definition: digital_io.h:105
virtual Status DoSetInterruptHandler(InterruptTrigger trigger, InterruptHandler &&handler)=0
Status Disable()
Definition: digital_io.h:250
Result< State > DoGetState() final
virtual Result< State > DoGetState()=0
Status DoSetState(State) final
Status DoSetState(State) final
virtual Status DoEnable(bool enable)=0
Status SetStateInactive()
Definition: digital_io.h:151
Result< State > DoGetState() final
Result< State > DoGetState() final
Status SetStateActive()
Definition: digital_io.h:136
Status Enable()
Definition: digital_io.h:236
constexpr bool provides_interrupt() const
Definition: digital_io.h:81
Status DoSetInterruptHandler(InterruptTrigger, InterruptHandler &&) final
constexpr bool provides_output() const
Definition: digital_io.h:79
Status SetInterruptHandler(InterruptTrigger trigger, InterruptHandler &&handler)
Definition: digital_io.h:174
Result< bool > IsStateActive()
Definition: digital_io.h:118
constexpr bool provides_input() const
Definition: digital_io.h:77
Status ClearInterruptHandler()
Definition: digital_io.h:191
Result< State > GetState()
Definition: digital_io.h:91
Status DisableInterruptHandler()
Definition: digital_io.h:220
virtual Status DoEnableInterruptHandler(bool enable)=0
fit::function_impl< function_internal::config::kInlineCallableSize, !function_internal::config::kEnableDynamicAllocation, FunctionType, PW_FUNCTION_DEFAULT_ALLOCATOR_TYPE > Function
Definition: function.h:73
#define PW_TRY(expr)
Returns early if expr is a non-OK Status or Result.
Definition: try.h:27
#define PW_TRY_ASSIGN(lhs, expression)
Definition: try.h:42
GPIO library.
Definition: digital_io.h:24