SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
PmicGpioBase.hpp
Go to the documentation of this file.
1
31#pragma once
32#include <stdint.h>
33
35{
36public:
40 virtual ~PmicGpioBase() = default;
41
45 enum class Direction : uint8_t {
46 Input = 0,
47 Output = 1,
48 };
49
53 enum class DriveType : uint8_t {
54 PushPull = 0,
55 OpenDrain = 1,
56 Keep = 0xFF,
57 };
58
64 enum class Level : uint8_t {
65 Low = 0,
66 HiZ = 1,
67 High = 2,
68 };
69
73 enum class Pull : uint8_t {
74 None = 0,
75 Down = 1,
76 Up = 2,
77 Keep = 0xFF,
78 };
79
83 enum class Status : uint8_t {
84 Ok = 0,
85 InvalidPin = 1,
86 Failed = 2,
87 };
88
89 static constexpr bool isOk(Status s)
90 {
91 return s == Status::Ok;
92 }
93
101 Pull pull = Pull::Keep, uint8_t func = 0xFF)
102 {
103 if (drive != DriveType::Keep) {
104 Status st = setDrive(pin, drive);
105 if (!isOk(st) && getDrive(pin) != drive) return st;
106 }
107
108 if (pull != Pull::Keep) {
109 Status st = setPull(pin, pull);
110 if (!isOk(st) && getPull(pin) != pull) return st;
111 }
112
113 return Status::Ok;
114 }
115
120 virtual uint8_t getPinCount() const = 0;
121
131 virtual Status setDirection(uint8_t pin, Direction dir) = 0;
132
142 virtual Direction getDirection(uint8_t pin) = 0;
143
155 virtual Status setDrive(uint8_t pin, DriveType drive) = 0;
156
164 virtual DriveType getDrive(uint8_t pin) = 0;
165
174 virtual Status read(uint8_t pin, bool &high) = 0;
175
185 virtual Status write(uint8_t pin, Level level) = 0;
186
199 virtual Status setFunction(uint8_t pin, uint8_t func)
200 {
201 (void)pin;
202 (void)func;
203 return Status::Failed;
204 }
205
211 virtual uint8_t getFunction(uint8_t pin)
212 {
213 (void)pin;
214 return 0xFF;
215 }
216
227 virtual Status setPull(uint8_t pin, Pull pull)
228 {
229 (void)pin;
230 (void)pull;
231 return Status::Failed;
232 }
233
239 virtual Pull getPull(uint8_t pin)
240 {
241 (void)pin;
242 return Pull::None;
243 }
244};
uint8_t level
virtual Pull getPull(uint8_t pin)
Get current internal pull resistor setting.
virtual Direction getDirection(uint8_t pin)=0
Get current GPIO pin direction.
virtual Status setDirection(uint8_t pin, Direction dir)=0
Set GPIO pin direction.
virtual Status setDrive(uint8_t pin, DriveType drive)=0
Set GPIO drive type.
DriveType
GPIO drive type.
@ Keep
Keep current drive type (do not change)
@ OpenDrain
Open-drain output: only pulls low, high-impedance for high.
@ PushPull
Push-pull output: actively drives high or low.
Status pinMode(uint8_t pin, Direction dir, DriveType drive=DriveType::Keep, Pull pull=Pull::Keep, uint8_t func=0xFF)
Configure a pin with a single high-level call.
Level
Output level control.
@ Low
Logic low (active drive low or open-drain pulled low)
@ High
Logic high (active drive high)
@ HiZ
High-impedance (input mode or open-drain not pulling low)
virtual ~PmicGpioBase()=default
Virtual destructor.
virtual Status write(uint8_t pin, Level level)=0
Set output level.
virtual DriveType getDrive(uint8_t pin)=0
Get current GPIO drive type.
virtual Status read(uint8_t pin, bool &high)=0
Read input level.
virtual uint8_t getPinCount() const =0
Get number of GPIO pins supported by this PMIC.
Pull
Internal pull resistor configuration.
@ Keep
Keep current pull setting (do not change)
@ Down
Pull-down enabled.
@ Up
Pull-up enabled.
@ None
No pull resistor.
static constexpr bool isOk(Status s)
Direction
GPIO pin direction.
@ Output
Configure pin as output (drive external circuits)
@ Input
Configure pin as input (read external signals)
virtual Status setPull(uint8_t pin, Pull pull)
Set internal pull resistor.
virtual Status setFunction(uint8_t pin, uint8_t func)
Set GPIO pin function mode (chip-specific multiplexing)
Status
GPIO operation status code.
virtual uint8_t getFunction(uint8_t pin)
Get current GPIO pin function mode.