This repository has been archived by the owner on May 6, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 234
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Another option for Ws2812 - direct spi from the pi with 1 wire (#631)
* Removed -HUP so the default -TERM signal is sent instead. - hyperiond only listens for TERM and INT. HUP is often used to get an exe to reread its config Changed pgrep to add '-x' so it wont partial match on the exe name. - I have multiple instances with multiple hyperiond-instance1 names - this ensures the service script only kills the right process * reversing errant change to hyperion.systemd.sh * This add a new device type - ws2812spi. I've (ab)used the SPI interface to send the correct timing pulses to keep the ws2812 happy. THE RATE IS IMPORTANT! A FIXED CORE_CLK IS IMPORTANT! Attach the SPI MOSI pin on the Pi to the DIN pin on your ws2812 "device" : { "name" : "MyPi", "type" : "ws2812spi", "colorOrder" : "grb", "output" : "/dev/spidev0.0", "rate" : 3800000 }, * updated hyperiond.test-binary * Updated default SPI speed to the "correct" value. My Pi was undervolted so was dropping the core clock confusing everything * Code cleanups explicitly set the final 3 bytes to 0 * Removed latchtime option - not applicable * updated test binary Former-commit-id: d3c19c8
- Loading branch information
Showing
5 changed files
with
123 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
5d75f380f2bd74d3cd6b574f0a7d05850786216b | ||
23f1b917ec588d71521aa698edf446a2e8c0ea5d |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
|
||
// STL includes | ||
#include <cstring> | ||
#include <cstdio> | ||
#include <iostream> | ||
|
||
// Linux includes | ||
#include <fcntl.h> | ||
#include <sys/ioctl.h> | ||
|
||
// hyperion local includes | ||
#include "LedDeviceWs2812SPI.h" | ||
|
||
LedDeviceWs2812SPI::LedDeviceWs2812SPI(const std::string& outputDevice, const unsigned baudrate) : | ||
LedSpiDevice(outputDevice, baudrate, 0), | ||
mLedCount(0) | ||
{ | ||
// empty | ||
} | ||
|
||
int LedDeviceWs2812SPI::write(const std::vector<ColorRgb> &ledValues) | ||
{ | ||
mLedCount = ledValues.size(); | ||
|
||
// 3 colours, 4 spi bytes per colour + 3 frame end latch bytes | ||
#define COLOURS_PER_LED 3 | ||
#define SPI_BYTES_PER_COLOUR 4 | ||
#define SPI_BYTES_PER_LED COLOURS_PER_LED * SPI_BYTES_PER_COLOUR | ||
|
||
unsigned spi_size = mLedCount * SPI_BYTES_PER_LED + 3; | ||
if(_spiBuffer.size() != spi_size){ | ||
_spiBuffer.resize(spi_size, 0x00); | ||
} | ||
|
||
unsigned spi_ptr = 0; | ||
for (unsigned i=0; i< mLedCount; ++i) { | ||
uint32_t colorBits = ((unsigned int)ledValues[i].red << 16) | ||
| ((unsigned int)ledValues[i].green << 8) | ||
| ledValues[i].blue; | ||
|
||
for (int j=SPI_BYTES_PER_LED - 1; j>=0; j--) { | ||
_spiBuffer[spi_ptr+j] = bitpair_to_byte[ colorBits & 0x3 ]; | ||
colorBits >>= 2; | ||
} | ||
spi_ptr += SPI_BYTES_PER_LED; | ||
} | ||
_spiBuffer[spi_ptr++] = 0; | ||
_spiBuffer[spi_ptr++] = 0; | ||
_spiBuffer[spi_ptr++] = 0; | ||
|
||
return writeBytes(spi_size, _spiBuffer.data()); | ||
} | ||
|
||
int LedDeviceWs2812SPI::switchOff() | ||
{ | ||
return write(std::vector<ColorRgb>(mLedCount, ColorRgb{0,0,0})); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
#pragma once | ||
|
||
// STL includes | ||
#include <string> | ||
|
||
// hyperion incluse | ||
#include "LedSpiDevice.h" | ||
|
||
/// | ||
/// Implementation of the LedDevice interface for writing to Ws2801 led device. | ||
/// | ||
class LedDeviceWs2812SPI : public LedSpiDevice | ||
{ | ||
public: | ||
/// | ||
/// Constructs the LedDevice for a string containing leds of the type Ws2812SPI | ||
/// | ||
/// @param outputDevice The name of the output device (eg '/etc/SpiDev.0.0') | ||
/// @param baudrate The used baudrate for writing to the output device | ||
/// | ||
LedDeviceWs2812SPI(const std::string& outputDevice, | ||
const unsigned baudrate); | ||
|
||
LedDeviceWs2812SPI(const std::string& outputDevice, | ||
const unsigned baudrate, | ||
const unsigned latchTime); | ||
|
||
/// | ||
/// Writes the led color values to the led-device | ||
/// | ||
/// @param ledValues The color-value per led | ||
/// @return Zero on succes else negative | ||
/// | ||
virtual int write(const std::vector<ColorRgb> &ledValues); | ||
|
||
/// Switch the leds off | ||
virtual int switchOff(); | ||
|
||
private: | ||
|
||
/// the number of leds (needed when switching off) | ||
size_t mLedCount; | ||
std::vector<uint8_t> _spiBuffer; | ||
|
||
uint8_t bitpair_to_byte[4] = { | ||
0b10001000, | ||
0b10001100, | ||
0b11001000, | ||
0b11001100, | ||
}; | ||
|
||
}; |