XPoint 0.1.0
Hardware-agnostic crosspoint matrix routing library
Loading...
Searching...
No Matches
XPoint.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (c) 2026 Douglas Quigg (dstroy0) <dquigg123@gmail.com>
3// https://github.com/dstroy0/XPoint
4
43#ifndef XPOINT_H
44#define XPOINT_H
45
47#include <stdint.h>
48#include <string.h>
49
60
69{
70 uint8_t r;
71 uint8_t c;
72 unsigned long t0;
73 bool on;
74};
75
81class XPoint
82{
83 public:
96 XPoint(uint8_t rows, uint8_t cols, RelayType type = RE_NON_LATCHING, uint16_t pdur = 0);
97
112 XPoint(uint8_t rows, uint8_t cols, bool *state, bool *ilock, bool *excl, RelayType type = RE_NON_LATCHING,
113 uint16_t pdur = 0);
114
116 ~XPoint();
117
118 XPoint(const XPoint &) = delete;
119 XPoint &operator=(const XPoint &) = delete;
120
128 void setDriver(XPointDriver *drv);
129
135 void begin();
136
150 bool connect(uint8_t row, uint8_t col);
151
163 bool disconnect(uint8_t row, uint8_t col);
164
180 bool setLevel(uint8_t row, uint8_t col, uint16_t level);
181
191 void clearAll();
192
202 void lockRows(uint8_t rowA, uint8_t rowB);
203
209 void exclusiveInput(uint8_t col);
210
218 void update();
219
220 private:
221 uint8_t _rows;
222 uint8_t _cols;
223 RelayType _type;
224 uint16_t _pdur;
225 XPointDriver *_drv;
226 bool _owns;
227
228 bool *_state;
229 bool *_ilock;
230 bool *_excl;
231
232 static const uint8_t MAX_PULSES = 8;
233 PulseEvent _pulses[MAX_PULSES];
234
236 void _init();
237};
238
255template <uint8_t ROWS, uint8_t COLS> class XPointStatic : public XPoint
256{
257 bool _stateBuf[ROWS * COLS];
258 bool _ilockBuf[ROWS * ROWS];
259 bool _exclBuf[COLS];
260
261 public:
266 XPointStatic(RelayType type = RE_NON_LATCHING, uint16_t pdur = 0)
267 : XPoint(ROWS, COLS, _stateBuf, _ilockBuf, _exclBuf, type, pdur)
268 {
269 }
270};
271
272#endif // XPOINT_H
Abstract hardware driver interface for the XPoint crosspoint matrix.
RelayType
Relay operating mode.
Definition XPoint.h:56
@ RE_NON_LATCHING
energize to connect; de-energize to disconnect.
Definition XPoint.h:57
@ RE_LATCHING_DUAL_COIL
SET coil to connect; RESET coil to disconnect.
Definition XPoint.h:58
Abstract base class for all XPoint hardware drivers.
Definition XPointDriver.h:41
Zero-heap variant of XPoint with embedded state arrays.
Definition XPoint.h:256
XPointStatic(RelayType type=RE_NON_LATCHING, uint16_t pdur=0)
Definition XPoint.h:266
Hardware-agnostic crosspoint matrix connection manager.
Definition XPoint.h:82
bool disconnect(uint8_t row, uint8_t col)
Disconnect row row from column col.
Definition XPoint.cpp:137
void setDriver(XPointDriver *drv)
Attach a driver backend.
Definition XPoint.cpp:65
void update()
Expire latching-relay coil pulses and call releaseNode() as needed.
Definition XPoint.cpp:283
XPoint(const XPoint &)=delete
void begin()
Initialize hardware by calling drv->begin().
Definition XPoint.cpp:70
bool connect(uint8_t row, uint8_t col)
Connect row row to column col.
Definition XPoint.cpp:80
void clearAll()
Disconnect all connected nodes and zero the state table.
Definition XPoint.cpp:218
void exclusiveInput(uint8_t col)
Mark column col as exclusive: at most one row may connect at a time.
Definition XPoint.cpp:272
void lockRows(uint8_t rowA, uint8_t rowB)
Prevent rowA and rowB from connecting to the same column simultaneously.
Definition XPoint.cpp:263
bool setLevel(uint8_t row, uint8_t col, uint16_t level)
analog-level connect / disconnect (PWM drivers).
Definition XPoint.cpp:183
~XPoint()
Destructor. Frees heap buffers only when constructed with the heap constructor.
Definition XPoint.cpp:36
XPoint & operator=(const XPoint &)=delete
Internal pulse-event slot for non-blocking latching-relay coil timing.
Definition XPoint.h:69
uint8_t c
Matrix column.
Definition XPoint.h:71
unsigned long t0
millis() at coil energize.
Definition XPoint.h:72
uint8_t r
Matrix row.
Definition XPoint.h:70
bool on
true = slot occupied.
Definition XPoint.h:73