From 0b320673c11d2ddaf937e1e584116b0a49033c24 Mon Sep 17 00:00:00 2001 From: rob tillaart Date: Tue, 22 Nov 2022 13:46:07 +0100 Subject: [PATCH] 0.1.7 PinOutGroup --- libraries/PinOutGroup/.arduino-ci.yml | 19 +++++++- libraries/PinOutGroup/CHANGELOG.md | 49 +++++++++++++++++++ libraries/PinOutGroup/PinOutGroup.cpp | 32 +++--------- libraries/PinOutGroup/PinOutGroup.h | 36 ++++++++------ libraries/PinOutGroup/README.md | 18 +++++-- libraries/PinOutGroup/keywords.txt | 3 +- libraries/PinOutGroup/library.json | 2 +- libraries/PinOutGroup/library.properties | 2 +- libraries/PinOutGroup/test/unit_test_001.cpp | 51 ++++++++++++++++++-- 9 files changed, 160 insertions(+), 52 deletions(-) create mode 100644 libraries/PinOutGroup/CHANGELOG.md diff --git a/libraries/PinOutGroup/.arduino-ci.yml b/libraries/PinOutGroup/.arduino-ci.yml index cecf5850..e189eb67 100644 --- a/libraries/PinOutGroup/.arduino-ci.yml +++ b/libraries/PinOutGroup/.arduino-ci.yml @@ -1,5 +1,21 @@ +platforms: + rpipico: + board: rp2040:rp2040:rpipico + package: rp2040:rp2040 + gcc: + features: + defines: + - ARDUINO_ARCH_RP2040 + warnings: + flags: + +packages: + rp2040:rp2040: + url: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json + compile: # Choosing to run compilation tests on 2 different Arduino platforms + # selected only those that work platforms: - uno # - due @@ -7,5 +23,6 @@ compile: # - leonardo - m4 - esp32 - # - esp8266 + - esp8266 # - mega2560 + - rpipico diff --git a/libraries/PinOutGroup/CHANGELOG.md b/libraries/PinOutGroup/CHANGELOG.md new file mode 100644 index 00000000..cada47e8 --- /dev/null +++ b/libraries/PinOutGroup/CHANGELOG.md @@ -0,0 +1,49 @@ +# Change Log PinOutGroup + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/) +and this project adheres to [Semantic Versioning](http://semver.org/). + + +## [ 0.1.7] - 2022-11-22 +- add changelog.md +- add RP2040 to build-CI +- add PINOUTGROUP_ERROR_PIN +- update unit test +- obsolete getIdx() + + +## [0.1.6] - 2021-12-23 +- update library.json +- update license +- minor edits + +## [0.1.5] - 2021-11-13 +- update Arduino-CI +- update readme.md - badges. +- fix version numbers and history +- fix bug in allHIGH() +- renamed variables for readability +- add getIndex() to replace getIdx(), +- add getMaxSize(), + +## [0.1.4] - 2021-01-22 +- ? + +## [0.1.3] - 2021-01-05 +- add Arduino-CI + unit test + +## [0.1.2] - 2020-06-19 +- fix library.json + +## [0.1.1] - 2020-05-19 +- main refactor; +- added tests +- added clear(); +- added write(idx, value) +- renamed set to write() to be in line with digitalWrite() + +## [0.1.0] - 20-08-2017 +- initial version (based upon experimental pinGroup) + diff --git a/libraries/PinOutGroup/PinOutGroup.cpp b/libraries/PinOutGroup/PinOutGroup.cpp index bd4651e3..c23a9add 100644 --- a/libraries/PinOutGroup/PinOutGroup.cpp +++ b/libraries/PinOutGroup/PinOutGroup.cpp @@ -1,7 +1,7 @@ // // FILE: PinOutGroup.cpp // AUTHOR: Rob Tillaart -// VERSION: 0.1.6 +// VERSION: 0.1.7 // DATE: 2017-04-26 // PURPOSE: PinOutGroup library for Arduino // goal is to easily change a group of pins that logically @@ -9,23 +9,7 @@ // these pins can be in any order. // URL: https://github.com/RobTillaart/PinOutGroup // http://forum.arduino.cc/index.php?topic=469599.0 -// -// HISTORY -// -// 0.1.0 20-08-2017 initial version (based upon experimental pinGroup) -// 0.1.1 2020-05-19 main refactor; -// added tests; added clear(); added write(idx, value) -// renamed set to write() to be in line with digitalWrite() -// 0.1.2 2020-06-19 fix library.json -// 0.1.3 2021-01-05 add Arduino-CI + unit test -// 0.1.4 2021-01-22 -// 0.1.5 2021-11-13 update Arduino-CI, readme.md badges. -// fix version numbers and history -// fix bug in allHIGH() -// renamed variables for readability -// add getIndex() to replace getIdx(), -// add getMaxSize(), -// 0.1.6 2021-12-23 update library.json, license, minor edits + #include "PinOutGroup.h" @@ -39,7 +23,7 @@ PinOutGroup::PinOutGroup() void PinOutGroup::clear() { - // safety: set all to LOW before cleaning up. + // safety: set all to LOW before cleaning up. allLOW(); _size = 0; } @@ -62,7 +46,7 @@ uint8_t PinOutGroup::add(uint8_t pin, uint8_t value) _pins[_size] = pin; pinMode(pin, OUTPUT); - write(_size, value); // takes care of _lastValue + write(_size, value); // takes care of _lastValue _size++; return 1; } @@ -81,7 +65,7 @@ uint8_t PinOutGroup::isInGroup(uint8_t pin) uint8_t PinOutGroup::write(uint16_t value) { - uint16_t changed = _lastValue ^ value; // detect pins that changed + uint16_t changed = _lastValue ^ value; // detect pins that changed if (changed == 0) return 0; uint16_t bitMask = 1; @@ -107,7 +91,7 @@ uint8_t PinOutGroup::write(uint8_t index, uint8_t value) uint16_t mask = (1 << index); uint16_t lastValue = _lastValue & mask; - if ((value > 0) == (lastValue > 0)) return 0; // no change + if ((value > 0) == (lastValue > 0)) return 0; // no change digitalWrite(_pins[index], value); if (value == LOW) _lastValue &= ~mask; @@ -133,7 +117,7 @@ void PinOutGroup::allHIGH() for (uint8_t i = 0; i < _size; i++) { digitalWrite(_pins[i], HIGH); - value |= (1 << i); // set flags. + value |= (1 << i); // set flags. } _lastValue = value; } @@ -156,5 +140,5 @@ uint8_t PinOutGroup::getIndex(uint8_t pin) } -// --- END OF FILE --- +// -- END OF FILE -- diff --git a/libraries/PinOutGroup/PinOutGroup.h b/libraries/PinOutGroup/PinOutGroup.h index 452ebcd7..2d585f39 100644 --- a/libraries/PinOutGroup/PinOutGroup.h +++ b/libraries/PinOutGroup/PinOutGroup.h @@ -1,60 +1,64 @@ #pragma once // FILE: PinOutGroup.h // AUTHOR: Rob Tillaart -// VERSION: 0.1.6 +// VERSION: 0.1.7 // DATE: 2017-04-26 // PURPOSE: PinOutGroup library for Arduino // URL: https://github.com/RobTillaart/PinOutGroup -// #include "Arduino.h" -#define PINOUTGROUP_LIB_VERSION (F("0.1.6")) +#define PINOUTGROUP_LIB_VERSION (F("0.1.7")) // smaller MAXSIZE will reduce memory footprint with ditto bytes. #ifndef PINOUTGROUP_MAXSIZE #define PINOUTGROUP_MAXSIZE 16 -#endif +#endif + + +#define PINOUTGROUP_ERROR_PIN 0xFF class PinOutGroup { public: PinOutGroup(); - - // enables one to reset at he pinGroup and repopulate it + + // enables one to reset at he pinGroup and repopulate it void clear(); - // adds a predefined array of pin numbers to the PinOutGroup - // sets all to (LOW, HIGH) + // adds a predefined array of pin numbers to the PinOutGroup + // sets all to (LOW, HIGH) uint8_t add(uint8_t size, uint8_t* pinArray, uint8_t value = LOW); - // adds a single pin to the PinOutGroup, default to LOW. + // adds a single pin to the PinOutGroup, default to LOW. uint8_t add(uint8_t pin, uint8_t value = LOW); - // returns count of pin in the group => only 0 or 1 makes sense + // returns count of pin in the group => only 0 or 1 makes sense uint8_t isInGroup(uint8_t pin); - // set up to 16 pins "simultaneously" in one call. + // set up to 16 pins "simultaneously" in one call. uint8_t write(uint16_t value); - // write to a single pin while maintaining internal admin + // write to a single pin while maintaining internal admin uint8_t write(uint8_t index, uint8_t value); void allLOW(); void allHIGH(); - // retrieve the last set value + // retrieve the last set value uint16_t read() { return _lastValue; }; uint8_t size() { return _size; }; - // check how many free "slots" there are... + // check how many free "slots" there are... uint8_t available() { return PINOUTGROUP_MAXSIZE - _size; }; uint8_t getMaxSize() { return PINOUTGROUP_MAXSIZE; }; uint8_t getPin(uint8_t index); uint8_t getIndex(uint8_t pin); - uint8_t getIdx(uint8_t pin) { return getIndex(pin); }; // will be obsolete in 0.2.0 + + // obsolete + // uint8_t getIdx(uint8_t pin) { return getIndex(pin); }; private: @@ -64,5 +68,5 @@ private: }; -// -- END OF FILE -- +// -- END OF FILE -- diff --git a/libraries/PinOutGroup/README.md b/libraries/PinOutGroup/README.md index 45b91fdd..7ef675fc 100644 --- a/libraries/PinOutGroup/README.md +++ b/libraries/PinOutGroup/README.md @@ -48,10 +48,12 @@ This is platform, group size and pin state dependent. ### Administration -- **void clear()** resets all pins in the group to LOW and sets the size to zero +- **void clear()** resets all pins in the group to LOW and sets the size to zero. so one can repopulate. -- **uint8_t add(uint8_t size, uint8_t \* pinArray, uint8_t value = LOW)** adds a predefined array of pins to the group. Returns the number of pins added. Default the pins are set to LOW. -- **uint8_t add(uint8_t pin, uint8_t mode = LOW)** adds a single pin to the group. Returns the number of pins added (1 or 0). value can be LOW (=0, default) or HIGH (1 and other values). +- **uint8_t add(uint8_t size, uint8_t \* pinArray, uint8_t value = LOW)** adds a predefined array of pins to the group. +Returns the number of pins added. Default the pins are set to LOW. +- **uint8_t add(uint8_t pin, uint8_t mode = LOW)** adds a single pin to the group. +Returns the number of pins added (1 or 0). value can be LOW (=0, default) or HIGH (1 and other values). - **uint8_t getPin(uint8_t index)** index = 0..15; returns the pin at slot index or 255 (0xFF) when out of range. - **uint8_t getIndex(uint8_t pin)** returns the (first) index of the slot with pin number. 255 (0xFF) if not found. - **uint8_t isInGroup(uint8_t pin)** returns how often a pin is added to a group. Can be more than once. @@ -78,9 +80,19 @@ See examples ## Future +#### must +- update documentation + +#### should +- move code from .h to .cpp +- should clear() have a flag to set to LOW/HIGH/NOCHANGE when clearing? + +#### could - Optimize the low level writing For AVR this could be interesting (performance). - extend to 32 bits / pins. class hierarchy. 8, 24 ? - give **clear(skip)** a bool flag to skip setting the pins to LOW ? - remove function? - check PinInGroup to stay in "sync" API wise. + + diff --git a/libraries/PinOutGroup/keywords.txt b/libraries/PinOutGroup/keywords.txt index f1934ae9..b9dbf5dc 100644 --- a/libraries/PinOutGroup/keywords.txt +++ b/libraries/PinOutGroup/keywords.txt @@ -21,6 +21,7 @@ allHIGH KEYWORD2 # Constants (LITERAL1) PINOUTGROUP_LIB_VERSION LITERAL1 + PINOUTGROUP_MAXSIZE LITERAL1 - +PINOUTGROUP_ERROR_PIN LITERAL1 diff --git a/libraries/PinOutGroup/library.json b/libraries/PinOutGroup/library.json index b3178ba6..8804e658 100644 --- a/libraries/PinOutGroup/library.json +++ b/libraries/PinOutGroup/library.json @@ -15,7 +15,7 @@ "type": "git", "url": "https://github.com/RobTillaart/PinOutGroup.git" }, - "version": "0.1.6", + "version": "0.1.7", "license": "MIT", "frameworks": "arduino", "platforms": "*", diff --git a/libraries/PinOutGroup/library.properties b/libraries/PinOutGroup/library.properties index 830ade8a..610e5a98 100644 --- a/libraries/PinOutGroup/library.properties +++ b/libraries/PinOutGroup/library.properties @@ -1,5 +1,5 @@ name=PinOutGroup -version=0.1.6 +version=0.1.7 author=Rob Tillaart maintainer=Rob Tillaart sentence=A class that groups output pins so they can be updated easier and slightly faster on average. diff --git a/libraries/PinOutGroup/test/unit_test_001.cpp b/libraries/PinOutGroup/test/unit_test_001.cpp index c1448b9a..04e86add 100644 --- a/libraries/PinOutGroup/test/unit_test_001.cpp +++ b/libraries/PinOutGroup/test/unit_test_001.cpp @@ -47,24 +47,65 @@ unittest_teardown() } +unittest(test_constants) +{ + assertEqual(16, PINOUTGROUP_MAXSIZE); + assertEqual(0xFF, PINOUTGROUP_ERROR_PIN); +} + + unittest(test_all) { PinOutGroup POG; - uint8_t ar[46] = {2, 3, 4, 5, 6, 7}; + uint8_t ar[16] = {2, 3, 4, 5, 6, 7}; - assertEqual(0, POG.size()); + assertEqual(0, POG.size()); assertEqual(16, POG.available()); assertEqual(16, POG.getMaxSize()); - assertFalse(POG.isInGroup(2)); + assertEqual(0, POG.isInGroup(2)); POG.add(6, ar, LOW); - assertEqual(6, POG.size()); + assertEqual(6, POG.size()); assertEqual(10, POG.available()); assertEqual(16, POG.getMaxSize()); - assertTrue(POG.isInGroup(2)); + assertEqual(1, POG.isInGroup(2)); } +unittest(test_getPin) +{ + PinOutGroup POG; + uint8_t ar[16] = {2, 3, 4, 5, 6, 7}; + POG.add(6, ar, LOW); + + assertEqual(2, POG.getPin(0)); + assertEqual(3, POG.getPin(1)); + assertEqual(4, POG.getPin(2)); + assertEqual(5, POG.getPin(3)); + assertEqual(6, POG.getPin(4)); + assertEqual(7, POG.getPin(5)); + assertEqual(0xFF, POG.getPin(6)); +} + + +unittest(test_getIndex) +{ + PinOutGroup POG; + uint8_t ar[16] = {2, 3, 4, 5, 6, 7}; + POG.add(6, ar, LOW); + + assertEqual(0xFF, POG.getIndex(0)); // pin 0 is not in group + assertEqual(0xFF, POG.getIndex(1)); + assertEqual(0, POG.getIndex(2)); + assertEqual(1, POG.getIndex(3)); + assertEqual(2, POG.getIndex(4)); + assertEqual(3, POG.getIndex(5)); + assertEqual(0xFF, POG.getIndex(8)); +} + + + + unittest_main()