ws2801-alexa
Version:
An alexa connector for the WS2801-Pi module.
79 lines (68 loc) • 2.13 kB
text/typescript
import {HueColor, RgbColor} from './types/index';
export class ColorConverter {
public static convertHueToRgb(hueColor: HueColor): RgbColor {
const c: number = hueColor.brightness * hueColor.saturation;
const x: number = c * (1 - Math.abs((hueColor.hue / 60) % 2 - 1));
const m: number = hueColor.brightness - c;
let red1: number;
let green1: number;
let blue1: number;
if (hueColor.hue >= 0 && hueColor.hue < 60) {
red1 = c;
green1 = x;
blue1 = 0;
} else if (hueColor.hue >= 60 && hueColor.hue < 120) {
red1 = x;
green1 = c;
blue1 = 0;
} else if (hueColor.hue >= 120 && hueColor.hue < 180) {
red1 = 0;
green1 = c;
blue1 = x;
} else if (hueColor.hue >= 180 && hueColor.hue < 240) {
red1 = 0;
green1 = x;
blue1 = c;
} else if (hueColor.hue >= 240 && hueColor.hue < 300) {
red1 = x;
green1 = 0;
blue1 = c;
} else if (hueColor.hue >= 300 && hueColor.hue < 360) {
red1 = c;
green1 = 0;
blue1 = x;
} else {
throw new Error(`Hue value ${hueColor.hue} is not supported!`);
}
return {
red: (red1 + m) * 255,
green: (green1 + m) * 255,
blue: (blue1 + m) * 255,
};
}
public static convertRgbToHue(rgbColor: RgbColor): HueColor {
const red1: number = rgbColor.red / 255;
const green1: number = rgbColor.green / 255;
const blue1: number = rgbColor.blue / 255;
const cMax: number = Math.max(red1, green1, blue1);
const cMin: number = Math.min(red1, green1, blue1);
const delta: number = cMax - cMin;
let hue: number;
if (delta === 0) {
hue = 0;
} else if (cMax === red1) {
hue = 60 * (((green1 - blue1) / delta) % 6);
} else if (cMax === green1) {
hue = 60 * ((blue1 - red1) / delta + 2);
} else if (cMax === blue1) {
hue = 60 * ((red1 - green1) / delta + 4);
}
const saturation: number = cMax === 0 ? 0 : delta / cMax;
const brightness: number = cMax;
return {
hue: hue,
saturation: saturation,
brightness: brightness,
};
}
}