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
100
120 Status SetState(State state) { return DoSetState(state); }
121
142 PW_TRY_ASSIGN(const State state, GetState());
143 return state == State::kActive;
144 }
145
166 Status SetStateActive() { return SetState(State::kActive); }
167
188 Status SetStateInactive() { return SetState(State::kInactive); }
189
218 Status SetInterruptHandler(InterruptTrigger trigger,
219 InterruptHandler&& handler) {
220 if (handler == nullptr) {
221 return Status::InvalidArgument();
222 }
223 return DoSetInterruptHandler(trigger, std::move(handler));
224 }
225
242 PW_TRY(DisableInterruptHandler());
243 return DoSetInterruptHandler(InterruptTrigger::kActivatingEdge, nullptr);
244 }
245
265
284
305 Status Enable() { return DoEnable(true); }
306
326 if (provides_interrupt()) {
327 PW_TRY(DisableInterruptHandler());
328 }
329 return DoEnable(false);
330 }
331
332 private:
333 friend class DigitalInterrupt;
334 friend class DigitalIn;
335 friend class DigitalInInterrupt;
336 friend class DigitalOut;
337 friend class DigitalOutInterrupt;
338 friend class DigitalInOut;
339 friend class DigitalInOutInterrupt;
340
341 // Private constructor so that only friends can extend us.
342 constexpr DigitalIoOptional(internal::Provides config) : config_(config) {}
343
371 virtual Status DoEnable(bool enable) = 0;
372
389
408 virtual Status DoSetState(State level) = 0;
409
440 virtual Status DoSetInterruptHandler(InterruptTrigger trigger,
441 InterruptHandler&& handler) = 0;
442
464 virtual Status DoEnableInterruptHandler(bool enable) = 0;
465
466 // The configuration of this line.
467 const internal::Provides config_;
468};
469
470// A digital I/O line that supports only interrupts.
471//
472// The input and output methods are hidden and must not be called.
473//
474// Use this class in APIs when only interrupt functionality is required.
475// Extend this class to implement a line that only supports interrupts.
476//
478 : public DigitalIoOptional,
479 public internal::Conversions<DigitalInterrupt, DigitalIoOptional> {
480 public:
481 // Available functionality
486
487 protected:
488 constexpr DigitalInterrupt()
489 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalInterrupt>()) {}
490
491 private:
492 // Unavailable functionality
496
502
503 // These overrides invoke PW_CRASH.
504 Status DoSetState(State) final;
506};
507
508// A digital I/O line that supports only input (getting state).
509//
510// The output and interrupt methods are hidden and must not be called.
511//
512// Use this class in APIs when only input functionality is required.
513// Extend this class to implement a line that only supports getting state.
514//
516 public internal::Conversions<DigitalIn, DigitalIoOptional> {
517 public:
518 // Available functionality
521
522 protected:
523 constexpr DigitalIn()
524 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalIn>()) {}
525
526 private:
527 // Unavailable functionality
531
539
540 // These overrides invoke PW_CRASH.
541 Status DoSetState(State) final;
542 Status DoSetInterruptHandler(InterruptTrigger, InterruptHandler&&) final;
544};
545
546// An input line that supports interrupts.
547//
548// The output methods are hidden and must not be called.
549//
550// Use in APIs when input and interrupt functionality is required.
551//
552// Extend this class to implement a line that supports input (getting state) and
553// listening for interrupts at the same time.
554//
556 : public DigitalIoOptional,
557 public internal::Conversions<DigitalInInterrupt, DigitalIoOptional> {
558 public:
559 // Available functionality
566
567 protected:
568 constexpr DigitalInInterrupt()
569 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalInInterrupt>()) {}
570
571 private:
572 // Unavailable functionality
576
580
581 // These overrides invoke PW_CRASH.
582 Status DoSetState(State) final;
583};
584
585// A digital I/O line that supports only output (setting state).
586//
587// Input and interrupt functions are hidden and must not be called.
588//
589// Use in APIs when only output functionality is required.
590// Extend this class to implement a line that supports output only.
591//
593 public internal::Conversions<DigitalOut, DigitalIoOptional> {
594 public:
595 // Available functionality
599
600 protected:
601 constexpr DigitalOut()
602 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalOut>()) {}
603
604 private:
605 // Unavailable functionality
609
616
617 // These overrides invoke PW_CRASH.
619 Status DoSetInterruptHandler(InterruptTrigger, InterruptHandler&&) final;
621};
622
623// A digital I/O line that supports output and interrupts.
624//
625// Input methods are hidden and must not be called.
626//
627// Use in APIs when output and interrupt functionality is required. For
628// example, to represent a two-way signalling line.
629//
630// Extend this class to implement a line that supports both output and
631// listening for interrupts at the same time.
632//
634 : public DigitalIoOptional,
635 public internal::Conversions<DigitalOutInterrupt, DigitalIoOptional> {
636 public:
637 // Available functionality
645
646 protected:
647 constexpr DigitalOutInterrupt()
648 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalOutInterrupt>()) {}
649
650 private:
651 // Unavailable functionality
655
658
659 // These overrides invoke PW_CRASH.
661};
662
663// A digital I/O line that supports both input and output.
664//
665// Use in APIs when both input and output functionality is required. For
666// example, to represent a line which is shared by multiple controllers.
667//
668// Extend this class to implement a line that supports both input and output at
669// the same time.
670//
672 : public DigitalIoOptional,
673 public internal::Conversions<DigitalInOut, DigitalIoOptional> {
674 public:
675 // Available functionality
681
682 protected:
683 constexpr DigitalInOut()
684 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalInOut>()) {}
685
686 private:
687 // Unavailable functionality
691
696
697 // These overrides invoke PW_CRASH.
698 Status DoSetInterruptHandler(InterruptTrigger, InterruptHandler&&) final;
700};
701
702// A line that supports input, output, and interrupts.
703//
704// Use in APIs when input, output, and interrupts are required. For example to
705// represent a two-way shared line with state transition notifications.
706//
707// Extend this class to implement a line that supports all the functionality at
708// the same time.
709//
711 : public DigitalIoOptional,
712 public internal::Conversions<DigitalInOutInterrupt, DigitalIoOptional> {
713 public:
714 // Available functionality
724
725 protected:
726 constexpr DigitalInOutInterrupt()
727 : DigitalIoOptional(internal::AlwaysProvidedBy<DigitalInOutInterrupt>()) {
728 }
729
730 private:
731 // Unavailable functionality
735};
736
737} // namespace pw::digital_io
Definition: poll.h:25
Definition: status.h:86
Definition: digital_io.h:516
Definition: digital_io.h:557
Definition: digital_io.h:673
Definition: digital_io.h:712
Definition: digital_io.h:479
Definition: digital_io.h:72
Definition: digital_io.h:593
Definition: digital_io.h:635
virtual Status DoSetState(State level)=0
Status DoSetInterruptHandler(InterruptTrigger, InterruptHandler &&) final
Status EnableInterruptHandler()
Definition: digital_io.h:264
Status SetState(State state)
Definition: digital_io.h:120
virtual Status DoSetInterruptHandler(InterruptTrigger trigger, InterruptHandler &&handler)=0
Status Disable()
Definition: digital_io.h:325
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:188
Result< State > DoGetState() final
Result< State > DoGetState() final
Status SetStateActive()
Definition: digital_io.h:166
Status Enable()
Definition: digital_io.h:305
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:218
Result< bool > IsStateActive()
Definition: digital_io.h:141
constexpr bool provides_input() const
Definition: digital_io.h:77
Status ClearInterruptHandler()
Definition: digital_io.h:241
Result< State > GetState()
Definition: digital_io.h:99
Status DisableInterruptHandler()
Definition: digital_io.h:283
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
GPIO library.
Definition: digital_io.h:24