clang-format the lot
This commit is contained in:
parent
40cb6a9cac
commit
a51676db5e
5 changed files with 1564 additions and 1515 deletions
|
|
@ -64,41 +64,41 @@ extern Protomatter_core *_PM_protoPtr; ///< In core.c (via arch.h)
|
|||
// arch.h) because it's not architecture-specific.
|
||||
#define _PM_ROW_DELAY 8 ///< Delay time between row address line changes (ms)
|
||||
|
||||
Adafruit_Protomatter::Adafruit_Protomatter(uint16_t bitWidth, uint8_t bitDepth,
|
||||
uint8_t rgbCount, uint8_t *rgbList,
|
||||
uint8_t addrCount, uint8_t *addrList,
|
||||
uint8_t clockPin, uint8_t latchPin,
|
||||
uint8_t oePin, bool doubleBuffer,
|
||||
void *timer)
|
||||
: GFXcanvas16(bitWidth, (2 << min(addrCount, 5)) * min(rgbCount, 5)) {
|
||||
if (bitDepth > 6)
|
||||
bitDepth = 6; // GFXcanvas16 color limit (565)
|
||||
|
||||
Adafruit_Protomatter::Adafruit_Protomatter(
|
||||
uint16_t bitWidth, uint8_t bitDepth,
|
||||
uint8_t rgbCount, uint8_t *rgbList,
|
||||
uint8_t addrCount, uint8_t *addrList,
|
||||
uint8_t clockPin, uint8_t latchPin, uint8_t oePin,
|
||||
bool doubleBuffer, void *timer) :
|
||||
GFXcanvas16(bitWidth, (2 << min(addrCount, 5)) * min(rgbCount, 5)) {
|
||||
if(bitDepth > 6) bitDepth = 6; // GFXcanvas16 color limit (565)
|
||||
|
||||
// Arguments are passed through to the C _PM_init() function which does
|
||||
// some input validation and minor allocation. Return value is ignored
|
||||
// because we can't really do anything about it in a C++ constructor.
|
||||
// The class begin() function checks rgbPins for NULL to determine
|
||||
// whether to proceed or indicate an error.
|
||||
(void)_PM_init(&core, bitWidth, bitDepth, rgbCount, rgbList,
|
||||
addrCount, addrList, clockPin, latchPin, oePin, doubleBuffer, timer);
|
||||
// Arguments are passed through to the C _PM_init() function which does
|
||||
// some input validation and minor allocation. Return value is ignored
|
||||
// because we can't really do anything about it in a C++ constructor.
|
||||
// The class begin() function checks rgbPins for NULL to determine
|
||||
// whether to proceed or indicate an error.
|
||||
(void)_PM_init(&core, bitWidth, bitDepth, rgbCount, rgbList, addrCount,
|
||||
addrList, clockPin, latchPin, oePin, doubleBuffer, timer);
|
||||
}
|
||||
|
||||
Adafruit_Protomatter::~Adafruit_Protomatter(void) {
|
||||
_PM_free(&core);
|
||||
_PM_protoPtr = NULL;
|
||||
_PM_free(&core);
|
||||
_PM_protoPtr = NULL;
|
||||
}
|
||||
|
||||
ProtomatterStatus Adafruit_Protomatter::begin(void) {
|
||||
_PM_protoPtr = &core;
|
||||
return _PM_begin(&core);
|
||||
_PM_protoPtr = &core;
|
||||
return _PM_begin(&core);
|
||||
}
|
||||
|
||||
// Transfer data from GFXcanvas16 to the matrix framebuffer's weird
|
||||
// internal format. The actual conversion functions referenced below
|
||||
// are in core.c, reasoning is explained there.
|
||||
void Adafruit_Protomatter::show(void) {
|
||||
_PM_convert_565(&core, getBuffer(), WIDTH);
|
||||
_PM_swapbuffer_maybe(&core);
|
||||
_PM_convert_565(&core, getBuffer(), WIDTH);
|
||||
_PM_swapbuffer_maybe(&core);
|
||||
}
|
||||
|
||||
// Returns current value of frame counter and resets its value to zero.
|
||||
|
|
@ -106,5 +106,5 @@ void Adafruit_Protomatter::show(void) {
|
|||
// intervals), can be used to get a rough frames-per-second value for
|
||||
// the matrix (since this is difficult to estimate beforehand).
|
||||
uint32_t Adafruit_Protomatter::getFrameCount(void) {
|
||||
return _PM_getFrameCount(_PM_protoPtr);
|
||||
return _PM_getFrameCount(_PM_protoPtr);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,99 +7,99 @@
|
|||
#include "core.h"
|
||||
#include <Adafruit_GFX.h>
|
||||
|
||||
/*!
|
||||
/*!
|
||||
@brief Class representing the Arduino-facing side of the Protomatter
|
||||
library. Subclass of Adafruit_GFX's GFXcanvas16 to allow all
|
||||
the drawing operations.
|
||||
*/
|
||||
class Adafruit_Protomatter : public GFXcanvas16 {
|
||||
public:
|
||||
/*!
|
||||
@brief Adafruit_Protomatter constructor.
|
||||
@param bitWidth Total width of RGB matrix chain, in pixels.
|
||||
Usu. some multiple of 32, but maybe exceptions.
|
||||
@param bitDepth Color "depth" in bitplanes, determines range of
|
||||
shades of red, green and blue. e.g. passing 4
|
||||
bits = 16 shades ea. R,G,B = 16x16x16 = 4096
|
||||
colors. Max is 6, since the GFX library works
|
||||
with "565" RGB colors (6 bits green, 5 red/blue).
|
||||
@param rgbCount Number of "sets" of RGB data pins, each set
|
||||
containing 6 pins (2 ea. R,G,B). Typically 1,
|
||||
indicating a single matrix (or matrix chain).
|
||||
In theory (but not yet extensively tested),
|
||||
multiple sets of pins can be driven in parallel,
|
||||
up to 5 on some devices (if the hardware design
|
||||
provides all those bits on one PORT).
|
||||
@param rgbList A uint8_t array of pins (Arduino pin numbering),
|
||||
6X the prior rgbCount value, corresponding to
|
||||
the 6 output color bits for a matrix (or chain).
|
||||
Order is upper-half red, green, blue, lower-half
|
||||
red, green blue (repeat for each add'l chain).
|
||||
All the RGB pins (plus the clock pin below on
|
||||
some architectures) MUST be on the same PORT
|
||||
register. It's recommended (but not required)
|
||||
that all RGB pins (and clock depending on arch)
|
||||
be within the same byte of a PORT (but do not
|
||||
need to be sequential or contiguous within that
|
||||
byte) for more efficient RAM utilization. For
|
||||
two concurrent chains, same principle but 16-bit
|
||||
word instead of byte.
|
||||
@param addrCount Number of row address lines required of matrix.
|
||||
Total pixel height is then 2 x 2^addrCount, e.g.
|
||||
32-pixel-tall matrices have 4 row address lines.
|
||||
@param addrList A uint8_t array of pins (Arduino pin numbering),
|
||||
one per row address line.
|
||||
@param clockPin RGB clock pin (Arduino pin #).
|
||||
@param latchPin RGB data latch pin (Arduino pin #).
|
||||
@param oePin Output enable pin (Arduino pin #), active low.
|
||||
@param doubleBuffer If true, two matrix buffers are allocated,
|
||||
so changing display contents doesn't introduce
|
||||
artifacts mid-conversion. Requires ~2X RAM.
|
||||
@param timer Pointer to timer peripheral or timer-related
|
||||
struct (architecture-dependent), or NULL to
|
||||
use a default timer ID (also arch-dependent).
|
||||
*/
|
||||
Adafruit_Protomatter(uint16_t bitWidth, uint8_t bitDepth,
|
||||
uint8_t rgbCount, uint8_t *rgbList,
|
||||
uint8_t addrCount, uint8_t *addrList,
|
||||
uint8_t clockPin, uint8_t latchPin, uint8_t oePin,
|
||||
bool doubleBuffer, void *timer=NULL);
|
||||
~Adafruit_Protomatter(void);
|
||||
public:
|
||||
/*!
|
||||
@brief Adafruit_Protomatter constructor.
|
||||
@param bitWidth Total width of RGB matrix chain, in pixels.
|
||||
Usu. some multiple of 32, but maybe exceptions.
|
||||
@param bitDepth Color "depth" in bitplanes, determines range of
|
||||
shades of red, green and blue. e.g. passing 4
|
||||
bits = 16 shades ea. R,G,B = 16x16x16 = 4096
|
||||
colors. Max is 6, since the GFX library works
|
||||
with "565" RGB colors (6 bits green, 5 red/blue).
|
||||
@param rgbCount Number of "sets" of RGB data pins, each set
|
||||
containing 6 pins (2 ea. R,G,B). Typically 1,
|
||||
indicating a single matrix (or matrix chain).
|
||||
In theory (but not yet extensively tested),
|
||||
multiple sets of pins can be driven in parallel,
|
||||
up to 5 on some devices (if the hardware design
|
||||
provides all those bits on one PORT).
|
||||
@param rgbList A uint8_t array of pins (Arduino pin numbering),
|
||||
6X the prior rgbCount value, corresponding to
|
||||
the 6 output color bits for a matrix (or chain).
|
||||
Order is upper-half red, green, blue, lower-half
|
||||
red, green blue (repeat for each add'l chain).
|
||||
All the RGB pins (plus the clock pin below on
|
||||
some architectures) MUST be on the same PORT
|
||||
register. It's recommended (but not required)
|
||||
that all RGB pins (and clock depending on arch)
|
||||
be within the same byte of a PORT (but do not
|
||||
need to be sequential or contiguous within that
|
||||
byte) for more efficient RAM utilization. For
|
||||
two concurrent chains, same principle but 16-bit
|
||||
word instead of byte.
|
||||
@param addrCount Number of row address lines required of matrix.
|
||||
Total pixel height is then 2 x 2^addrCount, e.g.
|
||||
32-pixel-tall matrices have 4 row address lines.
|
||||
@param addrList A uint8_t array of pins (Arduino pin numbering),
|
||||
one per row address line.
|
||||
@param clockPin RGB clock pin (Arduino pin #).
|
||||
@param latchPin RGB data latch pin (Arduino pin #).
|
||||
@param oePin Output enable pin (Arduino pin #), active low.
|
||||
@param doubleBuffer If true, two matrix buffers are allocated,
|
||||
so changing display contents doesn't introduce
|
||||
artifacts mid-conversion. Requires ~2X RAM.
|
||||
@param timer Pointer to timer peripheral or timer-related
|
||||
struct (architecture-dependent), or NULL to
|
||||
use a default timer ID (also arch-dependent).
|
||||
*/
|
||||
Adafruit_Protomatter(uint16_t bitWidth, uint8_t bitDepth, uint8_t rgbCount,
|
||||
uint8_t *rgbList, uint8_t addrCount, uint8_t *addrList,
|
||||
uint8_t clockPin, uint8_t latchPin, uint8_t oePin,
|
||||
bool doubleBuffer, void *timer = NULL);
|
||||
~Adafruit_Protomatter(void);
|
||||
|
||||
/*!
|
||||
@brief Start a Protomatter matrix display running -- initialize
|
||||
pins, timer and interrupt into existence.
|
||||
@return A ProtomatterStatus status, one of:
|
||||
PROTOMATTER_OK if everything is good.
|
||||
PROTOMATTER_ERR_PINS if data and/or clock pins are split
|
||||
across different PORTs.
|
||||
PROTOMATTER_ERR_MALLOC if insufficient RAM to allocate
|
||||
display memory.
|
||||
PROTOMATTER_ERR_ARG if a bad value was passed to the
|
||||
constructor.
|
||||
*/
|
||||
ProtomatterStatus begin(void);
|
||||
/*!
|
||||
@brief Start a Protomatter matrix display running -- initialize
|
||||
pins, timer and interrupt into existence.
|
||||
@return A ProtomatterStatus status, one of:
|
||||
PROTOMATTER_OK if everything is good.
|
||||
PROTOMATTER_ERR_PINS if data and/or clock pins are split
|
||||
across different PORTs.
|
||||
PROTOMATTER_ERR_MALLOC if insufficient RAM to allocate
|
||||
display memory.
|
||||
PROTOMATTER_ERR_ARG if a bad value was passed to the
|
||||
constructor.
|
||||
*/
|
||||
ProtomatterStatus begin(void);
|
||||
|
||||
/*!
|
||||
@brief Process data from GFXcanvas16 to the matrix framebuffer's
|
||||
internal format for display.
|
||||
*/
|
||||
void show(void);
|
||||
/*!
|
||||
@brief Process data from GFXcanvas16 to the matrix framebuffer's
|
||||
internal format for display.
|
||||
*/
|
||||
void show(void);
|
||||
|
||||
/*!
|
||||
@brief Returns current value of frame counter and resets its value
|
||||
to zero. Two calls to this, timed one second apart (or use
|
||||
math with other intervals), can be used to get a rough
|
||||
frames-per-second value for the matrix (since this is
|
||||
difficult to estimate beforehand).
|
||||
@return Frame count since previous call to function, as a uint32_t.
|
||||
*/
|
||||
uint32_t getFrameCount(void);
|
||||
private:
|
||||
Protomatter_core core; // Underlying C struct
|
||||
void convert_byte(uint8_t *dest); // GFXcanvas16-to-matrix
|
||||
void convert_word(uint16_t *dest); // conversion functions
|
||||
void convert_long(uint32_t *dest); // for 8/16/32 bit bufs
|
||||
/*!
|
||||
@brief Returns current value of frame counter and resets its value
|
||||
to zero. Two calls to this, timed one second apart (or use
|
||||
math with other intervals), can be used to get a rough
|
||||
frames-per-second value for the matrix (since this is
|
||||
difficult to estimate beforehand).
|
||||
@return Frame count since previous call to function, as a uint32_t.
|
||||
*/
|
||||
uint32_t getFrameCount(void);
|
||||
|
||||
private:
|
||||
Protomatter_core core; // Underlying C struct
|
||||
void convert_byte(uint8_t *dest); // GFXcanvas16-to-matrix
|
||||
void convert_word(uint16_t *dest); // conversion functions
|
||||
void convert_long(uint32_t *dest); // for 8/16/32 bit bufs
|
||||
};
|
||||
|
||||
#endif // _ADAFRUIT_PROTOMATTER_H_
|
||||
|
|
|
|||
98
core.h
98
core.h
|
|
@ -21,15 +21,15 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/** Status type returned by some functions. */
|
||||
typedef enum {
|
||||
PROTOMATTER_OK, // Everything is hunky-dory!
|
||||
PROTOMATTER_ERR_PINS, // Clock and/or data pins on different PORTs
|
||||
PROTOMATTER_ERR_MALLOC, // Couldn't allocate memory for display
|
||||
PROTOMATTER_ERR_ARG, // Bad input to function
|
||||
PROTOMATTER_OK, // Everything is hunky-dory!
|
||||
PROTOMATTER_ERR_PINS, // Clock and/or data pins on different PORTs
|
||||
PROTOMATTER_ERR_MALLOC, // Couldn't allocate memory for display
|
||||
PROTOMATTER_ERR_ARG, // Bad input to function
|
||||
} ProtomatterStatus;
|
||||
|
||||
/** Struct for matrix control lines NOT related to RGB data or clock, i.e.
|
||||
|
|
@ -39,10 +39,10 @@ typedef enum {
|
|||
RGB data but do NOT need the set or clear registers, so those items are
|
||||
also declared as separate things in the core structure that follows. */
|
||||
typedef struct {
|
||||
volatile void *setReg; ///< GPIO bit set register
|
||||
volatile void *clearReg; ///< GPIO bit clear register
|
||||
uint32_t bit; ///< GPIO bitmask
|
||||
uint8_t pin; ///< Some unique ID, e.g. Arduino pin #
|
||||
volatile void *setReg; ///< GPIO bit set register
|
||||
volatile void *clearReg; ///< GPIO bit clear register
|
||||
uint32_t bit; ///< GPIO bitmask
|
||||
uint8_t pin; ///< Some unique ID, e.g. Arduino pin #
|
||||
} _PM_pin;
|
||||
|
||||
/** Struct with info about an RGB matrix chain and lots of state and buffer
|
||||
|
|
@ -56,38 +56,38 @@ typedef struct {
|
|||
to put any toggle-specific stuff at the end of the struct with an ifdef
|
||||
check, but that's just dirty pool and asking for trouble.) */
|
||||
typedef struct {
|
||||
void *timer; ///< Arch-specific timer/counter info
|
||||
void *setReg; ///< RGBC bit set register (cast to use)
|
||||
void *clearReg; ///< RGBC bit clear register "
|
||||
void *toggleReg; ///< RGBC bit toggle register "
|
||||
uint8_t *rgbPins; ///< Array of RGB data pins (mult of 6)
|
||||
void *rgbMask; ///< PORT bit mask for each RGB pin
|
||||
uint32_t clockMask; ///< PORT bit mask for RGB clock
|
||||
uint32_t rgbAndClockMask; ///< PORT bit mask for RGB data + clock
|
||||
volatile void *addrPortToggle; ///< See singleAddrPort below
|
||||
void *screenData; ///< Per-bitplane RGB data for matrix
|
||||
_PM_pin latch; ///< RGB data latch
|
||||
_PM_pin oe; ///< !OE (LOW out enable)
|
||||
_PM_pin *addr; ///< Array of address pins
|
||||
uint32_t bufferSize; ///< Bytes per matrix buffer
|
||||
uint32_t bitZeroPeriod; ///< Bitplane 0 timer period
|
||||
uint32_t minPeriod; ///< Plane 0 timer period for ~250Hz
|
||||
volatile uint32_t frameCount; ///< For estimating refresh rate
|
||||
uint16_t width; ///< Matrix chain width in bits
|
||||
uint8_t bytesPerElement; ///< Using 8, 16 or 32 bits of PORT?
|
||||
uint8_t clockPin; ///< RGB clock pin identifier
|
||||
uint8_t parallel; ///< Number of concurrent matrix outs
|
||||
uint8_t numAddressLines; ///< Number of address line pins
|
||||
uint8_t portOffset; ///< Active 8- or 16-bit pos. in PORT
|
||||
uint8_t numPlanes; ///< Display bitplanes (1 to 6)
|
||||
uint8_t numRowPairs; ///< Addressable row pairs
|
||||
bool doubleBuffer; ///< 2X buffers for clean switchover
|
||||
bool singleAddrPort; ///< If 1, all addr lines on same PORT
|
||||
volatile uint8_t activeBuffer; ///< Index of currently-displayed buf
|
||||
volatile uint8_t plane; ///< Current bitplane (changes in ISR)
|
||||
volatile uint8_t row; ///< Current scanline (changes in ISR)
|
||||
volatile uint8_t prevRow; ///< Scanline from prior ISR
|
||||
volatile bool swapBuffers; ///< If 1, awaiting double-buf switch
|
||||
void *timer; ///< Arch-specific timer/counter info
|
||||
void *setReg; ///< RGBC bit set register (cast to use)
|
||||
void *clearReg; ///< RGBC bit clear register "
|
||||
void *toggleReg; ///< RGBC bit toggle register "
|
||||
uint8_t *rgbPins; ///< Array of RGB data pins (mult of 6)
|
||||
void *rgbMask; ///< PORT bit mask for each RGB pin
|
||||
uint32_t clockMask; ///< PORT bit mask for RGB clock
|
||||
uint32_t rgbAndClockMask; ///< PORT bit mask for RGB data + clock
|
||||
volatile void *addrPortToggle; ///< See singleAddrPort below
|
||||
void *screenData; ///< Per-bitplane RGB data for matrix
|
||||
_PM_pin latch; ///< RGB data latch
|
||||
_PM_pin oe; ///< !OE (LOW out enable)
|
||||
_PM_pin *addr; ///< Array of address pins
|
||||
uint32_t bufferSize; ///< Bytes per matrix buffer
|
||||
uint32_t bitZeroPeriod; ///< Bitplane 0 timer period
|
||||
uint32_t minPeriod; ///< Plane 0 timer period for ~250Hz
|
||||
volatile uint32_t frameCount; ///< For estimating refresh rate
|
||||
uint16_t width; ///< Matrix chain width in bits
|
||||
uint8_t bytesPerElement; ///< Using 8, 16 or 32 bits of PORT?
|
||||
uint8_t clockPin; ///< RGB clock pin identifier
|
||||
uint8_t parallel; ///< Number of concurrent matrix outs
|
||||
uint8_t numAddressLines; ///< Number of address line pins
|
||||
uint8_t portOffset; ///< Active 8- or 16-bit pos. in PORT
|
||||
uint8_t numPlanes; ///< Display bitplanes (1 to 6)
|
||||
uint8_t numRowPairs; ///< Addressable row pairs
|
||||
bool doubleBuffer; ///< 2X buffers for clean switchover
|
||||
bool singleAddrPort; ///< If 1, all addr lines on same PORT
|
||||
volatile uint8_t activeBuffer; ///< Index of currently-displayed buf
|
||||
volatile uint8_t plane; ///< Current bitplane (changes in ISR)
|
||||
volatile uint8_t row; ///< Current scanline (changes in ISR)
|
||||
volatile uint8_t prevRow; ///< Scanline from prior ISR
|
||||
volatile bool swapBuffers; ///< If 1, awaiting double-buf switch
|
||||
} Protomatter_core;
|
||||
|
||||
// Protomatter core function prototypes. Environment-specific code (like the
|
||||
|
|
@ -148,12 +148,12 @@ typedef struct {
|
|||
PROTOMATTER_ERR_ARG if a bad value (core or timer pointer) was
|
||||
passed in.
|
||||
*/
|
||||
extern ProtomatterStatus _PM_init(Protomatter_core *core,
|
||||
uint16_t bitWidth, uint8_t bitDepth,
|
||||
uint8_t rgbCount, uint8_t *rgbList,
|
||||
uint8_t addrCount, uint8_t *addrList,
|
||||
uint8_t clockPin, uint8_t latchPin, uint8_t oePin,
|
||||
bool doubleBuffer, void *timer);
|
||||
extern ProtomatterStatus _PM_init(Protomatter_core *core, uint16_t bitWidth,
|
||||
uint8_t bitDepth, uint8_t rgbCount,
|
||||
uint8_t *rgbList, uint8_t addrCount,
|
||||
uint8_t *addrList, uint8_t clockPin,
|
||||
uint8_t latchPin, uint8_t oePin,
|
||||
bool doubleBuffer, void *timer);
|
||||
|
||||
/*!
|
||||
@brief Allocate display buffers and populate additional elements of a
|
||||
|
|
@ -246,8 +246,8 @@ extern uint32_t _PM_timerGetCount(void *tptr);
|
|||
@param width Width of canvas in pixels, as this may be different than
|
||||
the matrix pixel width due to row padding.
|
||||
*/
|
||||
extern void _PM_convert_565(Protomatter_core *core,
|
||||
uint16_t *source, uint16_t width);
|
||||
extern void _PM_convert_565(Protomatter_core *core, uint16_t *source,
|
||||
uint16_t width);
|
||||
|
||||
/*!
|
||||
@brief Pauses until the next vertical blank to avoid 'tearing' animation
|
||||
|
|
|
|||
Loading…
Reference in a new issue