Skip to content
This repository has been archived by the owner on May 6, 2021. It is now read-only.

Commit

Permalink
Carsten Atmolight support
Browse files Browse the repository at this point in the history
  • Loading branch information
aufano committed Feb 4, 2015
1 parent e25fabd commit cd543a0
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 0 deletions.
2 changes: 2 additions & 0 deletions libsrc/leddevice/CMakeLists.txt
Expand Up @@ -30,6 +30,7 @@ SET(Leddevice_HEADERS
${CURRENT_SOURCE_DIR}/LedDeviceTest.h
${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.h
${CURRENT_SOURCE_DIR}/LedDeviceTpm2.h
${CURRENT_SOURCE_DIR}/LedDeviceAtmo.h
)

SET(Leddevice_SOURCES
Expand All @@ -47,6 +48,7 @@ SET(Leddevice_SOURCES
${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.cpp
${CURRENT_SOURCE_DIR}/LedDevicePhilipsHue.cpp
${CURRENT_SOURCE_DIR}/LedDeviceTpm2.cpp
${CURRENT_SOURCE_DIR}/LedDeviceAtmo.cpp
)

if(ENABLE_SPIDEV)
Expand Down
44 changes: 44 additions & 0 deletions libsrc/leddevice/LedDeviceAtmo.cpp
@@ -0,0 +1,44 @@

// STL includes
#include <cstring>
#include <cstdio>
#include <iostream>

// Linux includes
#include <fcntl.h>
#include <sys/ioctl.h>

// hyperion local includes
#include "LedDeviceAtmo.h"

LedDeviceAtmo::LedDeviceAtmo(const std::string& outputDevice, const unsigned baudrate) :
LedRs232Device(outputDevice, baudrate),
_ledBuffer(0)
{
_ledBuffer.resize(4 + 3*5);
_ledBuffer[0] = 0xFF; // Startbyte
_ledBuffer[1] = 0x00; // StartChannel(Low)
_ledBuffer[2] = 0x00; // StartChannel(High)
_ledBuffer[3] = 0x0F; // Number of Databytes send (always! 15)
}

int LedDeviceAtmo::write(const std::vector<ColorRgb> &ledValues)
{
// The protocol is shomehow limited. we always need to send exactly 5 channels + header
// (19 bytes) for the hardware to recognize the data
if (ledValues.size() != 5)
{
printf("AtmoLight: %d channels configured. This should always be 5!\n", ledValues.size());
return 0;
}

// write data
memcpy(4 + _ledBuffer.data(), ledValues.data(), ledValues.size() * 3);
return writeBytes(_ledBuffer.size(), _ledBuffer.data());
}

int LedDeviceAtmo::switchOff()
{
memset(4 + _ledBuffer.data(), 0, _ledBuffer.size() - 4);
return writeBytes(_ledBuffer.size(), _ledBuffer.data());
}
38 changes: 38 additions & 0 deletions libsrc/leddevice/LedDeviceAtmo.h
@@ -0,0 +1,38 @@
#pragma once

// STL includes
#include <string>

// hyperion incluse
#include "LedRs232Device.h"

///
/// Implementation of the LedDevice interface for writing to serial device using tpm2 protocol.
///
class LedDeviceAtmo : public LedRs232Device
{
public:
///
/// Constructs the LedDevice for attached serial device using supporting tpm2 protocol
/// All LEDs in the stripe are handled as one frame
///
/// @param outputDevice The name of the output device (eg '/dev/ttyAMA0')
/// @param baudrate The used baudrate for writing to the output device
///
LedDeviceAtmo(const std::string& outputDevice, const unsigned baudrate);

///
/// 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 buffer containing the packed RGB values
std::vector<uint8_t> _ledBuffer;
};
10 changes: 10 additions & 0 deletions libsrc/leddevice/LedDeviceFactory.cpp
Expand Up @@ -30,6 +30,7 @@
#include "LedDeviceHyperionUsbasp.h"
#include "LedDevicePhilipsHue.h"
#include "LedDeviceTpm2.h"
#include "LedDeviceAtmo.h"

#ifdef ENABLE_WS2812BPWM
#include "LedDeviceWS2812b.h"
Expand Down Expand Up @@ -186,6 +187,15 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
deviceTpm2->open();
device = deviceTpm2;
}
else if (type == "atmo")
{
const std::string output = deviceConfig["output"].asString();
const unsigned rate = 38400;

LedDeviceAtmo * deviceAtmo = new LedDeviceAtmo(output, rate);
deviceAtmo->open();
device = deviceAtmo;
}
#ifdef ENABLE_WS2812BPWM
else if (type == "ws2812b")
{
Expand Down

0 comments on commit cd543a0

Please sign in to comment.