-
Notifications
You must be signed in to change notification settings - Fork 101
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Initialize with different options #113
Comments
OK I've made v1.x work with node14. Had to update And because some functions are deprecated I had to modify const options = {
dma: config.leds.dma,
freq: config.leds.freq,
channels: [
{ count: 20, gpio: 18, invert: false, brightness: 255, stripType: ws281x.stripType.WS2812 },
{ count: 20, gpio: 19, invert: false, brightness: 255, stripType: ws281x.stripType.WS2812 }
],
};
// ---- trap the SIGINT and reset before exit
process.on('SIGINT', function () {
ws281x.reset();
log.debug("Reseting Leds on exit...")
process.nextTick(function () { process.exit(0); });
});
const channel = ws281x.init(options);
// Rainbow test on channel 1
var offset = 0;
setInterval(function () {
for (var i = 0; i < 20; i++) {
channel[1].array[i] = colorwheel((offset + i) % 256);
}
offset = (offset + 1) % 256;
ws281x.render();
}, 1000 / 30); //rpi-ws281x.cc
#include <nan.h>
#include <v8.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <algorithm>
extern "C" {
#include "rpi_ws281x/ws2811.h"
}
using namespace v8;
#define DEFAULT_TARGET_FREQ 800000
#define DEFAULT_GPIO_PIN 18
#define DEFAULT_DMANUM 10
#define PARAM_FREQ 1
#define PARAM_DMANUM 2
#define PARAM_GPIONUM 3
#define PARAM_COUNT 4
#define PARAM_INVERT 5
#define PARAM_BRIGHTNESS 6
#define PARAM_STRIP_TYPE 7
ws2811_t ws281x;
/**
* ws281x.setParam(param:Number, value:Number)
* wrap setting global params in ws2811_t
*/
void setParam(const Nan::FunctionCallbackInfo<v8::Value> &info)
{
if (info.Length() != 2)
{
Nan::ThrowTypeError("setParam(): expected two params");
return;
}
if (!info[0]->IsNumber())
{
Nan::ThrowTypeError("setParam(): expected argument 1 to be the parameter-id");
return;
}
if (!info[1]->IsNumber())
{
Nan::ThrowTypeError("setParam(): expected argument 2 to be the value");
return;
}
const int param = Nan::To<int32_t>(info[0]).FromJust();
const int value = Nan::To<int32_t>(info[1]).FromJust();
switch (param)
{
case PARAM_FREQ:
ws281x.freq = value;
break;
case PARAM_DMANUM:
ws281x.dmanum = value;
break;
default:
Nan::ThrowTypeError("setParam(): invalid parameter-id");
return;
}
}
/**
* ws281x.setChannelParam(channel:Number, param:Number, value:Number)
*
* wrap setting params in ws2811_channel_t
*/
void setChannelParam(const Nan::FunctionCallbackInfo<v8::Value> &info)
{
if (info.Length() != 3)
{
Nan::ThrowTypeError("setChannelParam(): missing argument");
return;
}
// retrieve channelNumber from argument 1
if (!info[0]->IsNumber())
{
Nan::ThrowTypeError("setChannelParam(): expected argument 1 to be the channel-number");
return;
}
const int channelNumber = Nan::To<int32_t>(info[0]).FromJust();
if (channelNumber > 1 || channelNumber < 0)
{
Nan::ThrowError("setChannelParam(): invalid chanel-number");
return;
}
if (!info[1]->IsNumber())
{
Nan::ThrowTypeError("setChannelParam(): expected argument 2 to be the parameter-id");
return;
}
if (!info[2]->IsNumber() && !info[2]->IsBoolean())
{
Nan::ThrowTypeError("setChannelParam(): expected argument 3 to be the value");
return;
}
ws2811_channel_t* channel = &ws281x.channel[channelNumber];
const int param = Nan::To<int32_t>(info[1]).FromJust();
const int value = Nan::To<int32_t>(info[2]).FromJust();
switch (param)
{
case PARAM_GPIONUM:
channel->gpionum = value;
break;
case PARAM_COUNT:
channel->count = value;
break;
case PARAM_INVERT:
channel->invert = value;
break;
case PARAM_BRIGHTNESS:
channel->brightness = (uint8_t)value;
break;
case PARAM_STRIP_TYPE:
channel->strip_type = value;
break;
default:
Nan::ThrowTypeError("setChannelParam(): invalid parameter-id");
return;
}
}
/**
* ws281x.setChannelData(channel:Number, buffer:Buffer)
*
* wrap copying data to ws2811_channel_t.leds
*/
void setChannelData(const Nan::FunctionCallbackInfo<v8::Value> &info)
{
if (info.Length() != 2)
{
Nan::ThrowTypeError("setChannelData(): missing argument.");
return;
}
// retrieve channelNumber from argument 1
if (!info[0]->IsNumber())
{
Nan::ThrowTypeError("setChannelData(): expected argument 1 to be the channel-number.");
return;
}
int channelNumber = Nan::To<int32_t>(info[0]).FromJust();
if (channelNumber > 1 || channelNumber < 0)
{
Nan::ThrowError("setChannelData(): invalid chanel-number");
return;
}
ws2811_channel_t channel = ws281x.channel[channelNumber];
// retrieve buffer from argument 2
if (!node::Buffer::HasInstance(info[1]))
{
Nan::ThrowTypeError("setChannelData(): expected argument 2 to be a Buffer");
return;
}
v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext();
auto buffer = info[1]->ToObject(context).ToLocalChecked();
uint32_t *data = (uint32_t *)node::Buffer::Data(buffer);
if (channel.count == 0 || channel.leds == NULL)
{
Nan::ThrowError("setChannelData(): channel not ready");
return;
}
const int numBytes = std::min(
node::Buffer::Length(buffer),
sizeof(ws2811_led_t) * ws281x.channel[0].count);
// FIXME: handle memcpy-result
memcpy(channel.leds, data, numBytes);
}
/**
* ws281x.init()
*
* wrap ws2811_init()
*/
void init(const Nan::FunctionCallbackInfo<v8::Value> &info)
{
ws2811_return_t ret;
ret = ws2811_init(&ws281x);
if (ret != WS2811_SUCCESS)
{
Nan::ThrowError(ws2811_get_return_t_str(ret));
return;
}
}
/**
* ws281x.render()
*
* wrap ws2811_wait() and ws2811_render()
*/
void render(const Nan::FunctionCallbackInfo<v8::Value> &info)
{
ws2811_return_t ret;
ret = ws2811_wait(&ws281x);
if (ret != WS2811_SUCCESS)
{
Nan::ThrowError(ws2811_get_return_t_str(ret));
return;
}
ret = ws2811_render(&ws281x);
if (ret != WS2811_SUCCESS)
{
Nan::ThrowError(ws2811_get_return_t_str(ret));
return;
}
}
/**
* ws281x.finalize()
*
* wrap ws2811_wait() and ws2811_fini()
*/
void finalize(const Nan::FunctionCallbackInfo<v8::Value> &info)
{
ws2811_return_t ret;
ret = ws2811_wait(&ws281x);
if (ret != WS2811_SUCCESS)
{
Nan::ThrowError(ws2811_get_return_t_str(ret));
return;
}
ws2811_fini(&ws281x);
}
/**
* initializes the module.
*/
void initialize(Local<Object> exports)
{
ws281x.freq = DEFAULT_TARGET_FREQ;
ws281x.dmanum = DEFAULT_DMANUM;
NAN_EXPORT(exports, setParam);
NAN_EXPORT(exports, setChannelParam);
NAN_EXPORT(exports, setChannelData);
NAN_EXPORT(exports, init);
NAN_EXPORT(exports, render);
NAN_EXPORT(exports, finalize);
}
NODE_MODULE(rpi_ws281x, initialize)
// vi: ts=2 sw=2 expandtab
|
I am trying 19 on channel 1 with no results unfortunately. I've used your update to the rpi-ws281x.cc with no success. Any other hints or thoughts on this one? I cannot use 13. 18 is working for me, so I'd like to use 19 as a second set. |
I am having difficulties trying to make it work.
I used C library previously with settings for my stripe:
That was working fine in Cpp
No I am trying to convert that to this library but I can't make it to work.
I can't test it on default gpio 18 because I broke it ;)
how do you properly set it up ? Tried that:
and that:
The text was updated successfully, but these errors were encountered: