Add support for RGBY endpoints

This commit is contained in:
cnlohr 2017-05-23 22:55:45 -04:00
parent 3703ac096f
commit 96e12af024

View file

@ -30,6 +30,7 @@ struct DPODriver
int fliprg; int fliprg;
int firstval; int firstval;
int port; int port;
int is_rgby;
int oldport; int oldport;
int skittlequantity; //When LEDs are in a ring, backwards and forwards This is the number of LEDs in the ring. int skittlequantity; //When LEDs are in a ring, backwards and forwards This is the number of LEDs in the ring.
char address[PARAM_BUFF]; char address[PARAM_BUFF];
@ -88,56 +89,90 @@ static void DPOUpdate(void * id, struct NoteFinder*nf)
buffer[i++] = d->firstval; buffer[i++] = d->firstval;
} }
if( d->leds * 3 + i >= MAX_BUFFER ) if( d->is_rgby )
d->leds = (MAX_BUFFER-1)/3;
if( d->fliprg )
{
for( j = 0; j < d->leds; j++ )
{
lbuff[i++] = OutLEDs[j*3+1]; //GREEN??
lbuff[i++] = OutLEDs[j*3+0]; //RED??
lbuff[i++] = OutLEDs[j*3+2]; //BLUE
}
}
else
{
for( j = 0; j < d->leds; j++ )
{
lbuff[i++] = OutLEDs[j*3+0]; //RED
lbuff[i++] = OutLEDs[j*3+2]; //BLUE
lbuff[i++] = OutLEDs[j*3+1]; //GREEN
}
}
if( d->skittlequantity )
{ {
i = d->skipfirst; i = d->skipfirst;
int k = 0;
if( d->leds * 4 + i >= MAX_BUFFER )
d->leds = (MAX_BUFFER-1)/4;
//Copy from OutLEDs[] into buffer, with size i.
for( j = 0; j < d->leds; j++ ) for( j = 0; j < d->leds; j++ )
{ {
int ledw = j; int r = OutLEDs[k++];
int ledpor = ledw % d->skittlequantity; int g = OutLEDs[k++];
int ol; int b = OutLEDs[k++];
int y = 0;
int rg_common;
if( r/2 > g ) rg_common = g;
else rg_common = r/2;
if( ledw >= d->skittlequantity ) if( rg_common > 255 ) rg_common = 255;
{ y = rg_common;
ol = ledpor*2-1; r -= rg_common;
ol = d->skittlequantity*2 - ol -2; g -= rg_common;
} if( r < 0 ) r = 0;
else if( g < 0 ) g = 0;
{
ol = ledpor*2;
}
buffer[i++] = lbuff[ol*3+0+d->skipfirst]; //Conversion from RGB to RAGB. Consider: A is shifted toward RED.
buffer[i++] = lbuff[ol*3+1+d->skipfirst]; buffer[i++] = g; //Green
buffer[i++] = lbuff[ol*3+2+d->skipfirst]; buffer[i++] = r; //Red
buffer[i++] = b; //Blue
buffer[i++] = y; //Amber
} }
printf( "I: %d [%d %d %d %d]\n",i, buffer[i-4], buffer[i-3], buffer[i-2], buffer[i-1] );
} }
else else
{ {
memcpy( buffer, lbuff, i ); if( d->fliprg )
{
for( j = 0; j < d->leds; j++ )
{
lbuff[i++] = OutLEDs[j*3+1]; //GREEN??
lbuff[i++] = OutLEDs[j*3+0]; //RED??
lbuff[i++] = OutLEDs[j*3+2]; //BLUE
}
}
else
{
for( j = 0; j < d->leds; j++ )
{
lbuff[i++] = OutLEDs[j*3+0]; //RED
lbuff[i++] = OutLEDs[j*3+2]; //BLUE
lbuff[i++] = OutLEDs[j*3+1]; //GREEN
}
}
if( d->skittlequantity )
{
i = d->skipfirst;
for( j = 0; j < d->leds; j++ )
{
int ledw = j;
int ledpor = ledw % d->skittlequantity;
int ol;
if( ledw >= d->skittlequantity )
{
ol = ledpor*2-1;
ol = d->skittlequantity*2 - ol -2;
}
else
{
ol = ledpor*2;
}
buffer[i++] = lbuff[ol*3+0+d->skipfirst];
buffer[i++] = lbuff[ol*3+1+d->skipfirst];
buffer[i++] = lbuff[ol*3+2+d->skipfirst];
}
}
else
{
memcpy( buffer, lbuff, i );
}
} }
int r = sendto( d->socket, buffer, i, MSG_NOSIGNAL,(const struct sockaddr *) &d->servaddr, sizeof( d->servaddr ) ); int r = sendto( d->socket, buffer, i, MSG_NOSIGNAL,(const struct sockaddr *) &d->servaddr, sizeof( d->servaddr ) );
if( r < 0 ) if( r < 0 )
{ {
@ -160,6 +195,7 @@ static void DPOParams(void * id )
d->firstval = 0; RegisterValue( "firstval", PAINT, &d->firstval, sizeof( d->firstval ) ); d->firstval = 0; RegisterValue( "firstval", PAINT, &d->firstval, sizeof( d->firstval ) );
RegisterValue( "address", PABUFFER, d->address, sizeof( d->address ) ); RegisterValue( "address", PABUFFER, d->address, sizeof( d->address ) );
d->fliprg = 0; RegisterValue( "fliprg", PAINT, &d->fliprg, sizeof( d->fliprg ) ); d->fliprg = 0; RegisterValue( "fliprg", PAINT, &d->fliprg, sizeof( d->fliprg ) );
d->is_rgby = 0; RegisterValue( "rgby", PAINT, &d->is_rgby, sizeof( d->is_rgby ) );
d->skittlequantity=0;RegisterValue( "skittlequantity", PAINT, &d->skittlequantity, sizeof( d->skittlequantity ) ); d->skittlequantity=0;RegisterValue( "skittlequantity", PAINT, &d->skittlequantity, sizeof( d->skittlequantity ) );
d->socket = -1; d->socket = -1;
d->oldaddress[0] = 0; d->oldaddress[0] = 0;