Skip to content

Commit 4cb7b65

Browse files
authored
refactor (#9)
* refactor * update readme
1 parent 40b1399 commit 4cb7b65

File tree

6 files changed

+107
-69
lines changed

6 files changed

+107
-69
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

88

9+
## [0.3.0] - 2022-11-05
10+
- major refactor
11+
12+
913
## [0.2.5] - 2022-11-05
1014
- add changelog.md
1115
- add rp2040 to build-CI

FastShiftOut.cpp

Lines changed: 71 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -12,112 +12,133 @@
1212
#include "FastShiftOut.h"
1313

1414

15-
FastShiftOut::FastShiftOut(const uint8_t datapin, const uint8_t clockpin, const uint8_t bitOrder)
15+
FastShiftOut::FastShiftOut(uint8_t dataOut, uint8_t clockPin, uint8_t bitOrder)
1616
{
17-
_bitorder = bitOrder;
18-
pinMode(datapin, OUTPUT);
19-
pinMode(clockpin, OUTPUT);
17+
_bitOrder = bitOrder;
18+
pinMode(dataOut, OUTPUT);
19+
pinMode(clockPin, OUTPUT);
2020
// https://www.arduino.cc/reference/en/language/functions/advanced-io/shiftout/
21-
digitalWrite(clockpin, LOW); // assume rising pulses from clock
21+
digitalWrite(clockPin, LOW); // assume rising pulses from clock
2222

2323
#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
2424

25-
// uint8_t _datatimer = digitalPinToTimer(datapin);
26-
// if (_datatimer != NOT_ON_TIMER) turnOffPWM(_datatimer); TODO
27-
uint8_t _dataport = digitalPinToPort(datapin);
28-
_dataout = portOutputRegister(_dataport);
29-
_databit = digitalPinToBitMask(datapin);
25+
uint8_t _port = digitalPinToPort(dataOut);
26+
_dataOutRegister = portOutputRegister(_port);
27+
_dataOutBit = digitalPinToBitMask(dataOut);
3028

31-
// uint8_t _clocktimer = digitalPinToTimer(clockpin);
32-
// if (_clocktimer != NOT_ON_TIMER) turnOffPWM(_clocktimer);
33-
uint8_t _clockport = digitalPinToPort(clockpin);
34-
_clockout = portOutputRegister(_clockport);
35-
_clockbit = digitalPinToBitMask(clockpin);
29+
_port = digitalPinToPort(clockPin);
30+
_clockRegister = portOutputRegister(_port);
31+
_clockBit = digitalPinToBitMask(clockPin);
3632

3733
#else // reference implementation
3834

39-
// reuse these variables as pin to save some space
40-
_databit = datapin;
41-
_clockbit = clockpin;
35+
_dataPinOut = dataOut;
36+
_clockPin = clockPin;
4237

4338
#endif
4439
}
4540

4641

47-
size_t FastShiftOut::write(const uint8_t data)
42+
size_t FastShiftOut::write(uint8_t data)
4843
{
4944
_value = data;
50-
if (_bitorder == LSBFIRST)
45+
if (_bitOrder == LSBFIRST)
5146
{
5247
return writeLSBFIRST(data);
5348
}
5449
return writeMSBFIRST(data);
5550
}
5651

5752

58-
size_t FastShiftOut::writeLSBFIRST(const uint8_t data)
53+
size_t FastShiftOut::writeLSBFIRST(uint8_t data)
5954
{
55+
uint8_t value = data;
56+
_value = value;
57+
6058
#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
61-
uint8_t cbmask1 = _clockbit;
62-
uint8_t cbmask2 = ~_clockbit;
63-
uint8_t dbmask1 = _databit;
64-
uint8_t dbmask2 = ~_databit;
6559

66-
for (uint8_t i = 0, m = 1; i < 8; i++)
60+
uint8_t cbmask1 = _clockBit;
61+
uint8_t cbmask2 = ~_clockBit;
62+
uint8_t outmask1 = _dataOutBit;
63+
uint8_t outmask2 = ~_dataOutBit;
64+
65+
for (uint8_t m = 1; m > 0; m <<= 1)
6766
{
6867
uint8_t oldSREG = SREG;
6968
noInterrupts();
70-
if ((data & m) == 0) *_dataout &= dbmask2;
71-
else *_dataout |= dbmask1;
72-
*_clockout |= cbmask1;
73-
*_clockout &= cbmask2;
69+
if ((value & m) == 0) *_dataOutRegister &= outmask2;
70+
else *_dataOutRegister |= outmask1;
71+
*_clockRegister |= cbmask1;
72+
*_clockRegister &= cbmask2;
7473
SREG = oldSREG;
75-
m <<= 1;
7674
}
77-
return 1;
75+
7876
#else
79-
shiftOut(_databit, _clockbit, LSBFIRST, data);
80-
return 1;
77+
78+
shiftOut(_dataPinOut, _clockPin, LSBFIRST, value);
79+
8180
#endif
81+
82+
return 1;
8283
}
8384

8485

85-
size_t FastShiftOut::writeMSBFIRST(const uint8_t data)
86+
size_t FastShiftOut::writeMSBFIRST(uint8_t data)
8687
{
88+
uint8_t value = data;
89+
_value = value;
90+
8791
#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
88-
uint8_t cbmask1 = _clockbit;
89-
uint8_t cbmask2 = ~_clockbit;
90-
uint8_t dbmask1 = _databit;
91-
uint8_t dbmask2 = ~_databit;
9292

93-
for (uint8_t i = 0, n = 128; i < 8; i++)
93+
uint8_t cbmask1 = _clockBit;
94+
uint8_t cbmask2 = ~_clockBit;
95+
uint8_t outmask1 = _dataOutBit;
96+
uint8_t outmask2 = ~_dataOutBit;
97+
98+
for (uint8_t m = 0x80; m > 0; m >>= 1)
9499
{
95100
uint8_t oldSREG = SREG;
96101
noInterrupts();
97-
if ((data & n) == 0) *_dataout &= dbmask2;
98-
else *_dataout |= dbmask1;
99-
*_clockout |= cbmask1;
100-
*_clockout &= cbmask2;
102+
if ((value & m) == 0) *_dataOutRegister &= outmask2;
103+
else *_dataOutRegister |= outmask1;
104+
*_clockRegister |= cbmask1;
105+
*_clockRegister &= cbmask2;
101106
SREG = oldSREG;
102-
n >>= 1;
103107
}
104-
return 1;
105-
#else // reference implementation // note this has no cli()
106-
shiftOut(_databit, _clockbit, MSBFIRST, data);
107-
return 1;
108+
109+
#else
110+
111+
shiftOut(_dataPinOut, _clockPin, MSBFIRST, value);
112+
108113
#endif
114+
115+
return 1;
116+
109117
}
110118

111119

120+
uint8_t FastShiftOut::lastWritten(void)
121+
{
122+
return _value;
123+
};
124+
125+
112126
bool FastShiftOut::setBitOrder(const uint8_t bitOrder)
113127
{
114128
if ((bitOrder == LSBFIRST) || (bitOrder == MSBFIRST))
115129
{
116-
_bitorder = bitOrder;
130+
_bitOrder = bitOrder;
117131
return true;
118132
};
119133
return false;
120134
}
121135

122136

137+
uint8_t FastShiftOut::getBitOrder(void)
138+
{
139+
return _bitOrder;
140+
};
141+
142+
123143
// -- END OF FILE --
144+

FastShiftOut.h

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
//
33
// FILE: FastShiftOut.h
44
// AUTHOR: Rob Tillaart
5-
// VERSION: 0.2.5
5+
// VERSION: 0.3.0
66
// PURPOSE: shiftOut class that implements the Print interface
77
// DATE: 2013-08-22
88
// URL: https://github.com/RobTillaart/FastShiftOut
@@ -11,34 +11,44 @@
1111
#include "Arduino.h"
1212
#include "Print.h"
1313

14-
#define FASTSHIFTOUT_LIB_VERSION (F("0.2.5"))
14+
#define FASTSHIFTOUT_LIB_VERSION (F("0.3.0"))
1515

1616

1717
class FastShiftOut : public Print
1818
{
1919
public:
2020
// bitOrder = { LSBFIRST, MSBFIRST };
21-
FastShiftOut(const uint8_t datapin, const uint8_t clockpin, const uint8_t bitOrder = LSBFIRST);
21+
FastShiftOut(uint8_t dataOut, uint8_t clockPin, uint8_t bitOrder = LSBFIRST);
2222

23-
size_t write(const uint8_t data);
24-
uint8_t lastWritten(void) { return _value; };
23+
size_t write(uint8_t data);
24+
uint8_t lastWritten(void);
2525

26-
bool setBitOrder(const uint8_t bitOrder);
27-
uint8_t getBitOrder(void) { return _bitorder; };
26+
bool setBitOrder(uint8_t bitOrder);
27+
uint8_t getBitOrder(void);
2828

2929
// overrule bitOrder (most optimized).
30-
size_t writeLSBFIRST(const uint8_t data);
31-
size_t writeMSBFIRST(const uint8_t data);
30+
size_t writeLSBFIRST(uint8_t data);
31+
size_t writeMSBFIRST(uint8_t data);
3232

3333
private:
34-
uint8_t _bitorder;
34+
uint8_t _bitOrder;
3535
int _value;
3636

37-
uint8_t _databit;
38-
volatile uint8_t *_dataout;
3937

40-
uint8_t _clockbit;
41-
volatile uint8_t *_clockout;
38+
#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
39+
40+
volatile uint8_t *_dataOutRegister;
41+
uint8_t _dataOutBit;
42+
43+
volatile uint8_t *_clockRegister;
44+
uint8_t _clockBit;
45+
46+
#else
47+
48+
uint8_t _dataPinOut;
49+
uint8_t _clockPin;
50+
51+
#endif
4252
};
4353

4454

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@
88

99
# FastShiftOut
1010

11-
Arduino library for (AVR) optimized shiftOut - e.g. 74HC595.
11+
Arduino library for **AVR** optimized shiftOut - e.g. 74HC595.
1212

13-
- library for FastShiftIn - https://github.com/RobTillaart/FastShiftIn
14-
- library for FastShiftInOut - https://github.com/RobTillaart/FastShiftInOut
13+
Related libraries
14+
- https://github.com/RobTillaart/FastShiftIn
15+
- https://github.com/RobTillaart/FastShiftInOut
16+
- https://github.com/RobTillaart/ShiftInSlow
17+
- https://github.com/RobTillaart/ShiftOutSlow
1518

1619

1720
## Description

library.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"type": "git",
1616
"url": "https://github.com/RobTillaart/FastShiftOut.git"
1717
},
18-
"version": "0.2.5",
18+
"version": "0.3.0",
1919
"license": "MIT",
2020
"frameworks": "arduino",
2121
"platforms": "*",

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=FastShiftOut
2-
version=0.2.5
2+
version=0.3.0
33
author=Rob Tillaart <rob.tillaart@gmail.com>
44
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
55
sentence=Arduino library for (AVR) optimized shiftOut - e.g. 74HC595

0 commit comments

Comments
 (0)