0.1.7 PinOutGroup

This commit is contained in:
rob tillaart 2022-11-22 13:46:07 +01:00
parent 27c7ab6520
commit 0b320673c1
9 changed files with 160 additions and 52 deletions

View File

@ -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

View File

@ -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)

View File

@ -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 --

View File

@ -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 --

View File

@ -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.

View File

@ -21,6 +21,7 @@ allHIGH KEYWORD2
# Constants (LITERAL1)
PINOUTGROUP_LIB_VERSION LITERAL1
PINOUTGROUP_MAXSIZE LITERAL1
PINOUTGROUP_ERROR_PIN LITERAL1

View File

@ -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": "*",

View File

@ -1,5 +1,5 @@
name=PinOutGroup
version=0.1.6
version=0.1.7
author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=A class that groups output pins so they can be updated easier and slightly faster on average.

View File

@ -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()