SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
DeviceBeginCommon.hpp
Go to the documentation of this file.
1
30#pragma once
31#include "../../SensorPlatform.hpp"
32#include "../SensorCommWrapper.hpp"
33
35{
36public:
38 {
39 if (comm) {
40 comm->deinit();
41 }
42 }
43
44 uint8_t getAddress() const
45 {
46 return _addr;
47 }
48 uint8_t getInterface() const
49 {
50 return _iface;
51 }
52
53protected:
54 DeviceBeginCommon() = default;
55
56 virtual bool initImpl(uint8_t param) = 0;
57
58 virtual bool ensureValid() const override
59 {
60 if (!comm) return false;
61 return true;
62 }
63
64 virtual SensorCommBase *getComm() const override
65 {
66 return comm.get();
67 }
68
69 // ---- Hooks functions ----
70
71 // 1) Before comm/hal/staticComm is created (some parameters can be prepared).
72 virtual void beforeBegin() {}
73
74 // 2) comm/hal/staticComm has been created + comm->init() has been completed,
75 // but initImpl has not yet run
76 // Typical use case: Touch driver sets hal->setCustomMode/Read/Write
77 virtual void afterCommReady() {}
78
79 // 3) initImpl has succeeded (default register configuration, cache reset, etc. can be done here)
80 virtual void afterInitSuccess(uint8_t param) {}
81
82 // 4) If any begin operation fails (error code can be logged).
83 virtual void onBeginFail() {}
84
85 // 5) Unified fail handling to ensure consistent error paths for each begin branch
86 bool fail()
87 {
89 return false;
90 }
91
93 {
94 staticComm.reset();
95 if (comm) {
96 comm->deinit();
97 }
98 comm.reset();
99 hal.reset();
100 _addr = 0;
102 }
103
104 template<typename CreateComm>
105 bool beginLifecycle(uint8_t addr, uint8_t iface, uint8_t initParam, CreateComm createComm)
106 {
107 beforeBegin();
108 if (!createComm()) {
110 return fail();
111 }
112
113 _addr = addr;
114 _iface = iface;
116
117 if (!initImpl(initParam)) {
119 return fail();
120 }
121
122 afterInitSuccess(initParam);
123 return true;
124 }
125
126protected:
127 std::unique_ptr<SensorCommBase> comm;
128 std::unique_ptr<SensorHal> hal;
129 std::unique_ptr<SensorCommStatic> staticComm;
130
131 uint8_t _addr = 0;
133};
@ COMM_CUSTOM
virtual bool initImpl(uint8_t param)=0
std::unique_ptr< SensorCommBase > comm
virtual void onBeginFail()
virtual SensorCommBase * getComm() const override
DeviceBeginCommon()=default
virtual void beforeBegin()
bool beginLifecycle(uint8_t addr, uint8_t iface, uint8_t initParam, CreateComm createComm)
virtual void afterCommReady()
uint8_t getAddress() const
virtual bool ensureValid() const override
std::unique_ptr< SensorCommStatic > staticComm
uint8_t getInterface() const
virtual void afterInitSuccess(uint8_t param)
std::unique_ptr< SensorHal > hal
Abstract base class for low‑level sensor communication.