@blackmagic-controller/core
Version:
An npm module for interfacing with the Blackmagic usb/bluetooth controllers
74 lines • 2.75 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DefaultLedService = void 0;
const util_js_1 = require("../../util.js");
class DefaultLedService {
#device;
// readonly #controls: readonly BlackmagicControllerControlDefinition[]
#bufferSize = 32; // Future: this may need to vary
#lastPrimaryBuffer;
constructor(device, _controls) {
this.#device = device;
// this.#controls = controls
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] = 0x02;
}
return buffer;
}
async setControlColors(values) {
this.#lastPrimaryBuffer = this.#createBuffer(this.#lastPrimaryBuffer);
for (const value of values) {
if (value.type === 'button') {
this.#setButtonValue(value.control, value.red, value.green, value.blue);
}
else {
this.#setTBarValue(value.control, value.leds);
}
}
await this.#device.sendReports([this.#lastPrimaryBuffer]);
}
#setButtonValue(control, red, green, blue) {
const buttonOffset = 3;
const firstBitIndex = (control.encodedIndex - 1) * 3;
const firstByteIndex = Math.floor(firstBitIndex / 8);
const firstBitIndexInValue = firstBitIndex % 8;
const view = (0, util_js_1.uint8ArrayToDataView)(this.#lastPrimaryBuffer);
let uint16Value = view.getUint16(buttonOffset + firstByteIndex, true);
uint16Value = maskValue(uint16Value, 1 << firstBitIndexInValue, red);
uint16Value = maskValue(uint16Value, 1 << (firstBitIndexInValue + 1), green);
uint16Value = maskValue(uint16Value, 1 << (firstBitIndexInValue + 2), blue);
view.setUint16(buttonOffset + firstByteIndex, uint16Value, true);
}
#setTBarValue(control, values) {
let value = 0;
values.forEach((v, i) => {
if (v)
value |= 1 << i;
});
const view = (0, util_js_1.uint8ArrayToDataView)(this.#lastPrimaryBuffer);
view.setUint16(1, value, true);
}
async clearPanel() {
this.#lastPrimaryBuffer = this.#createBuffer(null);
await this.#device.sendReports([this.#lastPrimaryBuffer]);
// TODO - flashing buffers?
}
}
exports.DefaultLedService = DefaultLedService;
function maskValue(value, mask, set) {
if (set) {
return value | mask;
}
else {
return value & ~mask;
}
}
//# sourceMappingURL=default.js.map