@blackmagic-controller/core
Version:
An npm module for interfacing with the Blackmagic usb/bluetooth controllers
86 lines • 2.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LedBuffer = void 0;
exports.maskValue = maskValue;
const util_js_1 = require("../../util.js");
function maskValue(value, mask, set) {
if (set) {
return value | mask;
}
else {
return value & ~mask;
}
}
class LedBuffer {
#reportId;
#bufferSize;
#lastPrimaryBuffer;
constructor(reportId, bufferSize) {
this.#reportId = reportId;
this.#bufferSize = bufferSize;
this.#lastPrimaryBuffer = this.#createBuffer(null);
// TODO - flashing buffers?
}
#createBuffer(copyExisting) {
const buffer = new Uint8Array(this.#bufferSize);
if (copyExisting) {
buffer.set(this.#lastPrimaryBuffer);
}
else {
buffer[0] = this.#reportId;
}
return buffer;
}
clearBuffers() {
this.#lastPrimaryBuffer = this.#createBuffer(null);
}
prepareNewBuffers() {
this.#lastPrimaryBuffer = this.#createBuffer(this.#lastPrimaryBuffer);
}
setControlColor(value) {
if (value.type === 'button-rgb') {
this.#setButtonRgbValue(value.control, value.red, value.green, value.blue);
}
else if (value.type === 'button-on-off') {
this.#setButtonOnOffValue(value.control, value.on);
}
else {
this.#setTBarValue(value.control, value.leds);
}
}
maskControlBits(startIndex, values) {
const view = (0, util_js_1.uint8ArrayToDataView)(this.#lastPrimaryBuffer);
for (let i = 0; i < values.length; i++) {
// Note: This is not particularly efficient, but it isn't done that often
const byteIndex = Math.floor((startIndex + i) / 8);
const bitIndexInValue = (startIndex + i) % 8;
let uint8Value = view.getUint8(1 + byteIndex);
uint8Value = maskValue(uint8Value, 1 << bitIndexInValue, !!values[i]);
view.setUint8(1 + byteIndex, uint8Value);
}
}
getBuffers() {
return [this.#lastPrimaryBuffer];
}
#setButtonRgbValue(control, red, green, blue) {
if (control.feedbackType !== 'rgb') {
throw new TypeError(`Control ${control.encodedIndex} is not a rgb control`);
}
this.maskControlBits(control.ledBitIndex, [red, green, blue]);
}
#setButtonOnOffValue(control, on) {
if (control.feedbackType !== 'on-off') {
throw new TypeError(`Control ${control.encodedIndex} is not an on-off control`);
}
if (control.ledBitIndex < 0)
return;
this.maskControlBits(control.ledBitIndex, [on]);
}
#setTBarValue(control, values) {
const valuesClamped = [...values];
values.length = control.ledSegments;
this.maskControlBits(control.ledBitIndex, valuesClamped);
}
}
exports.LedBuffer = LedBuffer;
//# sourceMappingURL=ledBuffer.js.map