IoAbstraction
Loading...
Searching...
No Matches
IoAbstractionWire.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 https://www.thecoderscorner.com (Dave Cherry).
3 * This product is licensed under an Apache license, see the LICENSE file in the top-level directory.
4 */
5
11
12#ifndef _IOABSTRACTION_IOABSTRACTIONWIRE_H_
13#define _IOABSTRACTION_IOABSTRACTIONWIRE_H_
14
15//
16// An addition mode for devices that support LED controlled output, where the output is a controlled current source
17//
18#define LED_CURRENT_OUTPUT 0x99
19#define AW9523_LED_OUTPUT LED_CURRENT_OUTPUT
20
21#include "PlatformDeterminationWire.h"
22#include "IoAbstraction.h"
24#include <math.h>
25
33public:
34 enum { NEEDS_WRITE_FLAG, PINS_CONFIGURED_READ_FLAG, PCF8575_16BIT_FLAG, INVERTED_LOGIC };
35private:
36 WireType wireImpl;
37 uint8_t address;
38 uint8_t lastRead[2];
39 uint8_t toWrite[2];
40 uint8_t flags;
41 uint8_t interruptPin;
42public:
51 PCF8574IoAbstraction(uint8_t addr, uint8_t interruptPin, WireType wireInstance = nullptr, bool mode16bit = false, bool invertedLogic = false);
52 virtual ~PCF8574IoAbstraction() { }
53
55 void overrideReadFlag() { bitWrite(flags, PINS_CONFIGURED_READ_FLAG, true); }
56
61 void pinDirection(pinid_t pin, uint8_t mode) override;
62
66 void writeValue(pinid_t pin, uint8_t value) override;
67
71 uint8_t readValue(pinid_t pin) override;
72
76 void writePort(pinid_t pin, uint8_t port) override;
77
81 uint8_t readPort(pinid_t pin) override;
82
88 void attachInterrupt(pinid_t pin, RawIntHandler intHandler, uint8_t mode) override;
89
93 bool runLoop() override;
94};
95
96class Standard16BitDevice : public BasicIoAbstraction {
97protected:
98 uint16_t lastRead;
99 uint16_t toWrite;
100 uint8_t flags;
101 virtual void initDevice()=0;
102public:
103 Standard16BitDevice();
104 ~Standard16BitDevice() override = default;
105
106 void writeValue(pinid_t pin, uint8_t value) override;
107 uint8_t readValue(pinid_t pin) override;
108 void writePort(pinid_t pin, uint8_t port) override;
109 uint8_t readPort(pinid_t pin) override;
110 void clearChangeFlags();
111 void setReadPort(int port);
112 bool isReadPortSet(int port) const;
113 bool isWritePortSet(int port) const;
114 bool isInitNeeded() const;
115 void markInitialised();
116};
117
123 NOT_ENABLED = 0, ACTIVE_HIGH_OPEN = 0b110, ACTIVE_LOW_OPEN = 0b100, ACTIVE_HIGH = 0b010, ACTIVE_LOW = 0b000
124};
125
131class MCP23017IoAbstraction : public Standard16BitDevice {
132private:
133 WireType wireImpl;
134 uint8_t address;
135 pinid_t intPinA;
136 pinid_t intPinB;
137 uint8_t intMode;
138public:
144 MCP23017IoAbstraction(uint8_t address, Mcp23xInterruptMode intMode, pinid_t intPinA, pinid_t intPinB, WireType wireImpl = nullptr);
149 explicit MCP23017IoAbstraction(uint8_t address, WireType wireImpl = nullptr);
150
156 MCP23017IoAbstraction(uint8_t address, Mcp23xInterruptMode intMode, pinid_t intPinA, WireType wireImpl = nullptr);
157
158
159 ~MCP23017IoAbstraction() override = default;
160
166 void pinDirection(pinid_t pin, uint8_t mode) override;
167
172 void attachInterrupt(pinid_t pin, RawIntHandler intHandler, uint8_t mode) override;
173
177 bool runLoop() override;
178
189 void setInvertInputPin(pinid_t pin, bool shouldInvert);
190
197 void resetDevice(int resetPin);
198
199private:
200 void initDevice() override;
201};
202
209class AW9523IoAbstraction : public Standard16BitDevice {
210private:
211 WireType wireImpl;
212 uint8_t i2cAddress;
213 pinid_t interruptPin;
214public:
215 enum AW9523CurrentControl: uint8_t { FULL_CURRENT = 0, CURRENT_THREE_QUARTER = 1, CURRENT_HALF = 2, CURRENT_QUARTER = 3 };
216
226 explicit AW9523IoAbstraction(uint8_t addr, pinid_t intPin = IO_PIN_NOT_DEFINED, WireType wirePtr = nullptr);
227 ~AW9523IoAbstraction() override = default;
228
233 uint8_t deviceId();
234
235
243 void pinDirection(pinid_t pin, uint8_t mode) override;
244
249 void attachInterrupt(pinid_t pin, RawIntHandler intHandler, uint8_t mode) override;
250
254 bool runLoop() override;
255
262 void setPinLedCurrent(pinid_t pin, uint8_t pwr);
263
271 void writeGlobalControl(bool pushPullP0, AW9523CurrentControl maxCurrentMode = FULL_CURRENT);
272
276 void softwareReset();
277private:
278 void initDevice() override;
279};
280
286class AW9523AnalogAbstraction : public AnalogDevice {
287private:
288 AW9523IoAbstraction& theAbstraction;
289public:
290 explicit AW9523AnalogAbstraction(AW9523IoAbstraction &abs): theAbstraction(abs) {}
291
292 int getMaximumRange(AnalogDirection direction, pinid_t pin) override { return 255; }
293
294 int getBitDepth(AnalogDirection direction, pinid_t pin) override { return 8; }
295
296 void initPin(pinid_t pin, AnalogDirection direction) override;
297
298 unsigned int getCurrentValue(pinid_t pin) override { return -1; }
299
300 float getCurrentFloat(pinid_t pin) override { return NAN; }
301
302 void setCurrentValue(pinid_t pin, unsigned int newValue) override { theAbstraction.setPinLedCurrent(pin, newValue); }
303
304 void setCurrentFloat(pinid_t pin, float newValue) override { theAbstraction.setPinLedCurrent(pin, (uint8_t)(newValue * 255.0F)); }
305};
306
307//
308// These definitions help with accessing the various registers, and provide default values and layouts for the MPR121
309// You can use many of them with the read/write register functions if you need to directly access the chips registers.
310// Only a subset of the available operations are directly handled within IoAbstraction directly, but this gives you
311// access to the rest.
312//
313#define MPR121_FIRST_GPIO 4
314#define MPR121_TOTAL_PINS 13
315#define MPR121_PROXIMITY_PIN 12
316
317#define MPR121_TOUCH_STATUS_16 0x00
318#define MPR121_OOR_STATUS_16 0x02
319#define MPR121_ELECTRODE_DATA_2ND 0x04
320#define MPR121_BASELINE_DATA_3RD 0x1E
321#define MPR121_MHD_RISING 0x2B
322#define MPR121_NHD_RISING 0x2C
323#define MPR121_NCL_RISING 0x2D
324#define MPR121_FDL_RISING 0x2E
325#define MPR121_MHD_FALLING 0x2F
326#define MPR121_NHD_FALLING 0x30
327#define MPR121_NCL_FALLING 0x31
328#define MPR121_FDL_FALLING 0x32
329#define MPR121_NHD_TOUCHED 0x33
330#define MPR121_NCL_TOUCHED 0x34
331#define MPR121_FDL_TOUCHED 0x35
332#define MPR121_TCH_REL_THRESHOLD 0x41
333#define MPR121_DEBOUNCE_REG 0x5B
334#define MPR121_AFE_CONFIG_1 0x5C
335#define MPR121_AFE_CONFIG_2 0x5D
336#define MPR121_ELECTRODE_CONFIG 0x5E
337#define MPR121_ELECTRODE_CURRENT_0 0x5F
338#define MPR121_CHARGE_TIME_0 0x6C
339#define MPR121_GPIO_CONTROL_0 0x73
340#define MPR121_GPIO_CONTROL_1 0x74
341#define MPR121_GPIO_DATA 0x75
342#define MPR121_GPIO_DIRECTION_0 0x76
343#define MPR121_GPIO_ENABLE 0x77
344#define MPR121_GPIO_DATA_SET 0x78
345#define MPR121_GPIO_DATA_CLEAR 0x79
346#define MPR121_GPIO_DATA_TOGGLE 0x7A
347#define MPR121_AUTO_CONFIG_0 0x7B
348#define MPR121_AUTO_CONFIG_1 0x7C
349#define MPR121_UPPER_LIMIT 0x7D
350#define MPR121_LOWER_LIMIT 0x7E
351#define MPR121_TARGET_LIMIT 0x7F
352#define MPR121_SOFT_RESET 0x80
353#define MPR121_SOFT_RESET_VALUE 0x63
354#define MPR121_LED_PWM_0 0x81
355#define MPR121_LED_PWM_1 0x82
356#define MPR121_LED_PWM_2 0x83
357#define MPR121_LED_PWM_3 0x84
358
362enum MPR121ConfigType: uint8_t { MPR121_MANUAL_CONFIG, MPR121_AUTO_CONFIG };
363
374class MPR121IoAbstraction : public Standard16BitDevice {
375private:
376 WireType wireImpl;
377 uint8_t i2cAddress;
378 pinid_t interruptPin;
379 pinid_t maximumTouchPin = 0;
380public:
390 explicit MPR121IoAbstraction(uint8_t addr, pinid_t intPin = IO_PIN_NOT_DEFINED, WireType wirePtr = nullptr);
391 ~MPR121IoAbstraction() override = default;
392
403 void begin(int maxTouchPin, MPR121ConfigType configType, uint8_t configReg1 = 0x10, uint8_t configReg2 = 0x20);
404
412 void pinDirection(pinid_t pin, uint8_t mode) override;
413
418 void attachInterrupt(pinid_t pin, RawIntHandler intHandler, uint8_t mode) override;
419
423 bool runLoop() override;
424
436 void electrodeSettingsForPin(pinid_t pin, uint8_t touchThreshold, uint8_t releaseThreshold, uint8_t current=0, uint8_t chargeTime=0);
437
441 uint16_t getOutOfRangeRegister();
442
450 void configureDebounce(uint8_t debounceTouch, uint8_t debounceRelease);
451
458 uint16_t read2ndFilteredData(uint8_t pin);
459
466 void setPinLedCurrent(pinid_t pin, uint8_t pwr);
467
471 void softwareReset();
472 void initDevice() override { /* ignored */ }
473
474 void writeReg8(uint8_t reg, uint8_t data);
475 void writeReg16(uint8_t reg, uint16_t data);
476 uint8_t readReg8(uint8_t reg);
477 uint16_t readReg16(uint8_t reg);
478protected:
479 void enableTouchSupportOnPin(pinid_t pin);
480};
481
487class MPR121AnalogAbstraction : public AnalogDevice {
488private:
489 MPR121IoAbstraction& theAbstraction;
490public:
491 explicit MPR121AnalogAbstraction(MPR121IoAbstraction &abs): theAbstraction(abs) {}
492
493 int getMaximumRange(AnalogDirection direction, pinid_t pin) override { return 255; }
494
495 int getBitDepth(AnalogDirection direction, pinid_t pin) override { return 8; }
496
497 void initPin(pinid_t pin, AnalogDirection direction) override;
498
499 unsigned int getCurrentValue(pinid_t pin) override { return theAbstraction.read2ndFilteredData(pin) >> 2; }
500
501 float getCurrentFloat(pinid_t pin) override { return theAbstraction.read2ndFilteredData(pin) / 1024.0F; }
502
503 void setCurrentValue(pinid_t pin, unsigned int newValue) override { theAbstraction.setPinLedCurrent(pin, newValue >> 4); }
504
505 void setCurrentFloat(pinid_t pin, float newValue) override { theAbstraction.setPinLedCurrent(pin, (uint8_t)(newValue * 15.0F)); }
506};
507
508// to remain compatible with old code
509#define ioFrom8754 ioFrom8575
510
522IoAbstractionRef ioFrom8574(uint8_t addr, pinid_t interruptPin, WireType wireImpl, bool invertedLogic = false);
523
535IoAbstractionRef ioFrom8575(uint8_t addr, pinid_t interruptPin, WireType wireImpl, bool invertedLogic = false);
536
546IoAbstractionRef ioFrom23017(pinid_t addr, WireType wireImpl);
547
559IoAbstractionRef ioFrom23017(uint8_t addr, Mcp23xInterruptMode intMode, pinid_t interruptPin, WireType wireImpl);
560
573IoAbstractionRef ioFrom23017IntPerPort(pinid_t addr, Mcp23xInterruptMode intMode, pinid_t interruptPinA, pinid_t interruptPinB, WireType wireImpl);
574
575inline IoAbstractionRef ioFrom8574(uint8_t addr, pinid_t interruptPin = 0xff, bool invertedLogic = false) {
576 return ioFrom8574(addr, interruptPin, defaultWireTypePtr, invertedLogic);
577};
578
579inline IoAbstractionRef ioFrom8575(uint8_t addr, pinid_t interruptPin = 0xff, bool invertedLogic = false) {
580 return ioFrom8575(addr, interruptPin, defaultWireTypePtr, invertedLogic);
581};
582
583inline IoAbstractionRef ioFrom23017IntPerPort(uint8_t addr, Mcp23xInterruptMode intMode, pinid_t interruptPinA, pinid_t interruptPinB) {
584 return ioFrom23017IntPerPort(addr, intMode, interruptPinA, interruptPinB, defaultWireTypePtr);
585}
586
587inline IoAbstractionRef ioFrom23017(uint8_t addr, Mcp23xInterruptMode intMode, pinid_t interruptPin) {
588 return ioFrom23017(addr, intMode, interruptPin, defaultWireTypePtr);
589}
590
591inline IoAbstractionRef ioFrom23017(pinid_t addr) {
592 return ioFrom23017(addr, defaultWireTypePtr);
593}
594
595#endif /* _IOABSTRACTION_IOABSTRACTIONWIRE_H_ */
Contains a series of helper classes for dealing with analog devices, these are compatible across a wi...
AnalogDirection
Definition AnalogDeviceAbstraction.h:22
BasicIoAbstraction * IoAbstractionRef
Definition BasicIoAbstraction.h:174
Using basic IoFacilities allows one to abstract away the use of IoExpanders, such that the switching ...
IoAbstractionRef ioFrom8574(uint8_t addr, pinid_t interruptPin, WireType wireImpl, bool invertedLogic=false)
Definition IoAbstractionWire.cpp:88
MPR121ConfigType
Definition IoAbstractionWire.h:362
IoAbstractionRef ioFrom23017IntPerPort(pinid_t addr, Mcp23xInterruptMode intMode, pinid_t interruptPinA, pinid_t interruptPinB, WireType wireImpl)
Definition IoAbstractionWire.cpp:245
Mcp23xInterruptMode
Definition IoAbstractionWire.h:122
IoAbstractionRef ioFrom23017(pinid_t addr, WireType wireImpl)
Definition IoAbstractionWire.cpp:237
IoAbstractionRef ioFrom8575(uint8_t addr, pinid_t interruptPin, WireType wireImpl, bool invertedLogic=false)
Definition IoAbstractionWire.cpp:92
int getBitDepth(AnalogDirection direction, pinid_t pin) override
Definition IoAbstractionWire.h:294
void setCurrentFloat(pinid_t pin, float newValue) override
Definition IoAbstractionWire.h:304
int getMaximumRange(AnalogDirection direction, pinid_t pin) override
Definition IoAbstractionWire.h:292
unsigned int getCurrentValue(pinid_t pin) override
Definition IoAbstractionWire.h:298
void setCurrentValue(pinid_t pin, unsigned int newValue) override
Definition IoAbstractionWire.h:302
void initPin(pinid_t pin, AnalogDirection direction) override
Definition IoAbstractionWire.cpp:448
Definition IoAbstractionWire.h:209
void setPinLedCurrent(pinid_t pin, uint8_t pwr)
Definition IoAbstractionWire.cpp:426
void writeGlobalControl(bool pushPullP0, AW9523CurrentControl maxCurrentMode=FULL_CURRENT)
Definition IoAbstractionWire.cpp:442
AW9523IoAbstraction(uint8_t addr, pinid_t intPin=IO_PIN_NOT_DEFINED, WireType wirePtr=nullptr)
Definition IoAbstractionWire.cpp:342
void attachInterrupt(pinid_t pin, RawIntHandler intHandler, uint8_t mode) override
Definition IoAbstractionWire.cpp:363
void softwareReset()
Definition IoAbstractionWire.cpp:434
void pinDirection(pinid_t pin, uint8_t mode) override
Definition IoAbstractionWire.cpp:380
bool runLoop() override
Definition IoAbstractionWire.cpp:399
uint8_t deviceId()
Definition IoAbstractionWire.cpp:438
Definition AnalogDeviceAbstraction.h:31
Definition BasicIoAbstraction.h:42
void attachInterrupt(pinid_t pin, RawIntHandler intHandler, uint8_t mode) override
Definition IoAbstractionWire.cpp:203
MCP23017IoAbstraction(uint8_t address, Mcp23xInterruptMode intMode, pinid_t intPinA, pinid_t intPinB, WireType wireImpl=nullptr)
Definition IoAbstractionWire.cpp:121
void setInvertInputPin(pinid_t pin, bool shouldInvert)
Definition IoAbstractionWire.cpp:226
void pinDirection(pinid_t pin, uint8_t mode) override
Definition IoAbstractionWire.cpp:166
void resetDevice(int resetPin)
Definition IoAbstractionWire.cpp:230
bool runLoop() override
Definition IoAbstractionWire.cpp:175
unsigned int getCurrentValue(pinid_t pin) override
Definition IoAbstractionWire.h:499
int getMaximumRange(AnalogDirection direction, pinid_t pin) override
Definition IoAbstractionWire.h:493
void setCurrentFloat(pinid_t pin, float newValue) override
Definition IoAbstractionWire.h:505
void setCurrentValue(pinid_t pin, unsigned int newValue) override
Definition IoAbstractionWire.h:503
int getBitDepth(AnalogDirection direction, pinid_t pin) override
Definition IoAbstractionWire.h:495
void initPin(pinid_t pin, AnalogDirection direction) override
Definition IoAbstractionWire.cpp:606
Definition IoAbstractionWire.h:374
uint16_t getOutOfRangeRegister()
Definition IoAbstractionWire.cpp:512
void configureDebounce(uint8_t debounceTouch, uint8_t debounceRelease)
Definition IoAbstractionWire.cpp:493
bool runLoop() override
Definition IoAbstractionWire.cpp:576
void pinDirection(pinid_t pin, uint8_t mode) override
Definition IoAbstractionWire.cpp:516
void begin(int maxTouchPin, MPR121ConfigType configType, uint8_t configReg1=0x10, uint8_t configReg2=0x20)
Definition IoAbstractionWire.cpp:537
void softwareReset()
Definition IoAbstractionWire.cpp:461
MPR121IoAbstraction(uint8_t addr, pinid_t intPin=IO_PIN_NOT_DEFINED, WireType wirePtr=nullptr)
Definition IoAbstractionWire.cpp:456
uint16_t read2ndFilteredData(uint8_t pin)
Definition IoAbstractionWire.cpp:508
void attachInterrupt(pinid_t pin, RawIntHandler intHandler, uint8_t mode) override
Definition IoAbstractionWire.cpp:598
void electrodeSettingsForPin(pinid_t pin, uint8_t touchThreshold, uint8_t releaseThreshold, uint8_t current=0, uint8_t chargeTime=0)
Definition IoAbstractionWire.cpp:498
void setPinLedCurrent(pinid_t pin, uint8_t pwr)
Definition IoAbstractionWire.cpp:467
void attachInterrupt(pinid_t pin, RawIntHandler intHandler, uint8_t mode) override
Definition IoAbstractionWire.cpp:79
uint8_t readValue(pinid_t pin) override
Definition IoAbstractionWire.cpp:36
uint8_t readPort(pinid_t pin) override
Definition IoAbstractionWire.cpp:41
void pinDirection(pinid_t pin, uint8_t mode) override
Definition IoAbstractionWire.cpp:19
void overrideReadFlag()
Definition IoAbstractionWire.h:55
bool runLoop() override
Definition IoAbstractionWire.cpp:52
void writeValue(pinid_t pin, uint8_t value) override
Definition IoAbstractionWire.cpp:30
PCF8574IoAbstraction(uint8_t addr, uint8_t interruptPin, WireType wireInstance=nullptr, bool mode16bit=false, bool invertedLogic=false)
Definition IoAbstractionWire.cpp:9
void writePort(pinid_t pin, uint8_t port) override
Definition IoAbstractionWire.cpp:46
uint8_t readValue(pinid_t pin) override
Definition IoAbstractionWire.cpp:269
void writePort(pinid_t pin, uint8_t port) override
Definition IoAbstractionWire.cpp:285
void writeValue(pinid_t pin, uint8_t value) override
Definition IoAbstractionWire.cpp:273
uint8_t readPort(pinid_t pin) override
Definition IoAbstractionWire.cpp:281