Skip to content

Commit 71f5282

Browse files
committed
wip: refactoring
1 parent 5dfbeca commit 71f5282

File tree

5 files changed

+82
-75
lines changed

5 files changed

+82
-75
lines changed

packages/core/src/models/base.ts

+13-31
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import type {
1010
StreamDeckEvents,
1111
StreamDeckLcdStripService,
1212
} from '../types'
13-
import type { StreamdeckImageWriter } from '../services/imageWriter/types'
14-
import { ButtonLcdImagePacker, ButtonsLcdService } from '../services/buttonsLcd'
13+
import type { ButtonsLcdService } from '../services/buttonsLcd'
1514
import type { StreamDeckButtonControlDefinition, StreamDeckControlDefinition } from './controlDefinition'
1615

1716
export type EncodeJPEGHelper = (buffer: Buffer, width: number, height: number) => Promise<Buffer>
@@ -42,7 +41,7 @@ export type StreamDeckProperties = Readonly<{
4241
KEY_SPACING_VERTICAL: number
4342
}>
4443

45-
export abstract class StreamDeckInputBase extends EventEmitter<StreamDeckEvents> implements StreamDeck {
44+
export abstract class StreamDeckBase extends EventEmitter<StreamDeckEvents> implements StreamDeck {
4645
get CONTROLS(): Readonly<StreamDeckControlDefinition[]> {
4746
return this.deviceProperties.CONTROLS
4847
}
@@ -78,14 +77,21 @@ export abstract class StreamDeckInputBase extends EventEmitter<StreamDeckEvents>
7877

7978
protected readonly device: HIDDevice
8079
protected readonly deviceProperties: Readonly<StreamDeckProperties>
80+
private readonly buttonsLcdService: ButtonsLcdService
8181
// private readonly options: Readonly<OpenStreamDeckOptions>
8282
private readonly keyState: boolean[]
8383

84-
constructor(device: HIDDevice, _options: OpenStreamDeckOptions, properties: StreamDeckProperties) {
84+
constructor(
85+
device: HIDDevice,
86+
_options: OpenStreamDeckOptions,
87+
properties: StreamDeckProperties,
88+
buttonsLcdService: ButtonsLcdService
89+
) {
8590
super()
8691

8792
this.deviceProperties = properties
8893
this.device = device
94+
this.buttonsLcdService = buttonsLcdService
8995

9096
const maxButtonIndex = properties.CONTROLS.filter(
9197
(control): control is StreamDeckButtonControlDefinition => control.type === 'button'
@@ -136,7 +142,9 @@ export abstract class StreamDeckInputBase extends EventEmitter<StreamDeckEvents>
136142
}
137143
}
138144

139-
public abstract calculateFillPanelDimensions(options?: FillPanelDimensionsOptions): Dimension | null
145+
public calculateFillPanelDimensions(options?: FillPanelDimensionsOptions): Dimension | null {
146+
return this.buttonsLcdService.calculateFillPanelDimensions(options)
147+
}
140148

141149
public async close(): Promise<void> {
142150
return this.device.close()
@@ -153,32 +161,6 @@ export abstract class StreamDeckInputBase extends EventEmitter<StreamDeckEvents>
153161
public abstract getFirmwareVersion(): Promise<string>
154162
public abstract getSerialNumber(): Promise<string>
155163

156-
public abstract fillKeyColor(keyIndex: KeyIndex, r: number, g: number, b: number): Promise<void>
157-
public abstract fillKeyBuffer(keyIndex: KeyIndex, imageBuffer: Buffer, options?: FillImageOptions): Promise<void>
158-
public abstract fillPanelBuffer(imageBuffer: Buffer, options?: FillPanelOptions): Promise<void>
159-
160-
public abstract clearKey(keyIndex: KeyIndex): Promise<void>
161-
public abstract clearPanel(): Promise<void>
162-
}
163-
164-
export abstract class StreamDeckBase extends StreamDeckInputBase {
165-
protected readonly buttonsLcdService: ButtonsLcdService
166-
167-
constructor(
168-
device: HIDDevice,
169-
options: OpenStreamDeckOptions,
170-
properties: StreamDeckProperties,
171-
imageWriter: StreamdeckImageWriter,
172-
imagePacker: ButtonLcdImagePacker
173-
) {
174-
super(device, options, properties)
175-
this.buttonsLcdService = new ButtonsLcdService(imageWriter, imagePacker, device, properties)
176-
}
177-
178-
public calculateFillPanelDimensions(options?: FillPanelDimensionsOptions): Dimension | null {
179-
return this.buttonsLcdService.calculateFillPanelDimensions(options)
180-
}
181-
182164
public async fillKeyColor(keyIndex: KeyIndex, r: number, g: number, b: number): Promise<void> {
183165
this.checkValidKeyIndex(keyIndex, null)
184166

packages/core/src/models/generic-gen1.ts

+14-8
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { HIDDevice } from '../hid-device'
22
import { OpenStreamDeckOptions, StreamDeckBase, StreamDeckProperties } from './base'
33
import { StreamdeckImageWriter } from '../services/imageWriter/types'
44
import { BMP_HEADER_LENGTH, FillImageTargetOptions, transformImageBuffer, writeBMPHeader } from '../util'
5-
import { ButtonLcdImagePacker, InternalFillImageOptions } from '../services/buttonsLcd'
5+
import { ButtonLcdImagePacker, DefaultButtonsLcdService, InternalFillImageOptions } from '../services/buttonsLcd'
66

77
function extendDevicePropertiesForGen1(rawProps: StreamDeckGen1Properties): StreamDeckProperties {
88
return {
@@ -25,16 +25,22 @@ export class StreamDeckGen1 extends StreamDeckBase {
2525
targetOptions: FillImageTargetOptions,
2626
bmpImagePPM: number
2727
) {
28+
const fullProperties = extendDevicePropertiesForGen1(properties)
29+
2830
super(
2931
device,
3032
options,
31-
extendDevicePropertiesForGen1(properties),
32-
imageWriter,
33-
new Gen1ButtonLcdImagePacker(
34-
targetOptions,
35-
bmpImagePPM,
36-
properties.BUTTON_WIDTH_PX,
37-
properties.BUTTON_HEIGHT_PX
33+
fullProperties,
34+
new DefaultButtonsLcdService(
35+
imageWriter,
36+
new Gen1ButtonLcdImagePacker(
37+
targetOptions,
38+
bmpImagePPM,
39+
properties.BUTTON_WIDTH_PX,
40+
properties.BUTTON_HEIGHT_PX
41+
),
42+
device,
43+
fullProperties
3844
)
3945
)
4046
}

packages/core/src/models/generic-gen2.ts

+14-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { StreamdeckDefaultImageWriter } from '../services/imageWriter/imageWrite
55
import { StreamdeckGen2ImageHeaderGenerator } from '../services/imageWriter/headerGenerator'
66
import type { StreamDeckLcdStripService, StreamDeckLcdStripServiceInternal } from '../types'
77
import { EncoderInputService } from '../services/encoder'
8-
import { ButtonLcdImagePacker, InternalFillImageOptions } from '../services/buttonsLcd'
8+
import { ButtonLcdImagePacker, DefaultButtonsLcdService, InternalFillImageOptions } from '../services/buttonsLcd'
99

1010
function extendDevicePropertiesForGen2(rawProps: StreamDeckGen2Properties): StreamDeckProperties {
1111
return {
@@ -35,16 +35,22 @@ export class StreamDeckGen2 extends StreamDeckBase {
3535
lcdStripService: StreamDeckLcdStripServiceInternal | null,
3636
disableXYFlip?: boolean
3737
) {
38+
const fullProperties = extendDevicePropertiesForGen2(properties)
39+
3840
super(
3941
device,
4042
options,
41-
extendDevicePropertiesForGen2(properties),
42-
new StreamdeckDefaultImageWriter(new StreamdeckGen2ImageHeaderGenerator()),
43-
new Gen2ButtonLcdImagePacker(
44-
options.encodeJPEG,
45-
!disableXYFlip,
46-
properties.BUTTON_WIDTH_PX,
47-
properties.BUTTON_HEIGHT_PX
43+
fullProperties,
44+
new DefaultButtonsLcdService(
45+
new StreamdeckDefaultImageWriter(new StreamdeckGen2ImageHeaderGenerator()),
46+
new Gen2ButtonLcdImagePacker(
47+
options.encodeJPEG,
48+
!disableXYFlip,
49+
properties.BUTTON_WIDTH_PX,
50+
properties.BUTTON_HEIGHT_PX
51+
),
52+
device,
53+
fullProperties
4854
)
4955
)
5056

packages/core/src/models/pedal.ts

+11-9
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { HIDDevice } from '../hid-device'
2-
import { OpenStreamDeckOptions, StreamDeckInputBase, StreamDeckProperties } from './base'
2+
import { OpenStreamDeckOptions, StreamDeckBase, StreamDeckProperties } from './base'
33
import { DeviceModelId, Dimension } from '../id'
44
import { FillImageOptions, FillPanelDimensionsOptions, FillPanelOptions } from '../types'
55
import { StreamDeckControlDefinition } from './controlDefinition'
66
import { freezeDefinitions } from './controlsGenerator'
7+
import type { ButtonsLcdService } from '../services/buttonsLcd'
78

89
const pedalControls: StreamDeckControlDefinition[] = [
910
{
@@ -46,9 +47,9 @@ const pedalProperties: StreamDeckProperties = {
4647
KEY_SPACING_VERTICAL: 0,
4748
}
4849

49-
class StreamDeckPedal extends StreamDeckInputBase {
50+
class StreamDeckPedal extends StreamDeckBase {
5051
constructor(device: HIDDevice, options: Required<OpenStreamDeckOptions>) {
51-
super(device, options, pedalProperties)
52+
super(device, options, pedalProperties, new PedalLcdService())
5253
}
5354

5455
/**
@@ -74,25 +75,26 @@ class StreamDeckPedal extends StreamDeckInputBase {
7475
const val = await this.device.getFeatureReport(6, 32)
7576
return val.toString('ascii', 2, 14)
7677
}
78+
}
7779

80+
class PedalLcdService implements ButtonsLcdService {
7881
public calculateFillPanelDimensions(_options?: FillPanelDimensionsOptions): Dimension | null {
7982
// Not supported
8083
return null
8184
}
82-
83-
public async fillKeyColor(_keyIndex: number, _r: number, _g: number, _b: number): Promise<void> {
85+
public async clearKey(_keyIndex: number): Promise<void> {
8486
// Not supported
8587
}
86-
public async fillKeyBuffer(_keyIndex: number, _imageBuffer: Buffer, _options?: FillImageOptions): Promise<void> {
88+
public async clearPanel(): Promise<void> {
8789
// Not supported
8890
}
89-
public async fillPanelBuffer(_imageBuffer: Buffer, _options?: FillPanelOptions): Promise<void> {
91+
public async fillKeyColor(_keyIndex: number, _r: number, _g: number, _b: number): Promise<void> {
9092
// Not supported
9193
}
92-
public async clearKey(_keyIndex: number): Promise<void> {
94+
public async fillKeyBuffer(_keyIndex: number, _imageBuffer: Buffer, _options?: FillImageOptions): Promise<void> {
9395
// Not supported
9496
}
95-
public async clearPanel(): Promise<void> {
97+
public async fillPanelBuffer(_imageBuffer: Buffer, _options?: FillPanelOptions): Promise<void> {
9698
// Not supported
9799
}
98100
}

packages/core/src/services/buttonsLcd.ts

+30-19
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,18 @@ interface GridSpan {
2424
maxCol: number
2525
}
2626

27-
export class ButtonsLcdService {
27+
export interface ButtonsLcdService {
28+
calculateFillPanelDimensions(options: FillPanelDimensionsOptions | undefined): Dimension | null
29+
30+
clearPanel(): Promise<void>
31+
clearKey(keyIndex: KeyIndex): Promise<void>
32+
33+
fillKeyColor(keyIndex: KeyIndex, r: number, g: number, b: number): Promise<void>
34+
fillKeyBuffer(keyIndex: KeyIndex, imageBuffer: Buffer, options?: FillImageOptions): Promise<void>
35+
fillPanelBuffer(imageBuffer: Buffer, options: FillPanelOptions | undefined): Promise<void>
36+
}
37+
38+
export class DefaultButtonsLcdService implements ButtonsLcdService {
2839
readonly #imageWriter: StreamdeckImageWriter
2940
readonly #imagePacker: ButtonLcdImagePacker
3041
readonly #device: HIDDevice
@@ -128,6 +139,24 @@ export class ButtonsLcdService {
128139
await Promise.all(ps)
129140
}
130141

142+
public async clearKey(keyIndex: KeyIndex): Promise<void> {
143+
const control = this.#deviceProperties.CONTROLS.find(
144+
(control): control is StreamDeckButtonControlDefinition =>
145+
control.type === 'button' && control.index === keyIndex
146+
)
147+
148+
if (this.#deviceProperties.SUPPORTS_RGB_KEY_FILL || control?.feedbackType === 'rgb') {
149+
await this.sendKeyRgb(keyIndex, 0, 0, 0)
150+
} else {
151+
const pixels = Buffer.alloc(this.imageRgbBytes, 0)
152+
await this.fillImageRange(keyIndex, pixels, {
153+
format: 'rgb',
154+
offset: 0,
155+
stride: this.#imagePacker.imageWidth * 3,
156+
})
157+
}
158+
}
159+
131160
public async fillKeyColor(keyIndex: KeyIndex, r: number, g: number, b: number): Promise<void> {
132161
this.checkRGBValue(r)
133162
this.checkRGBValue(g)
@@ -214,24 +243,6 @@ export class ButtonsLcdService {
214243
await this.#device.sendFeatureReport(Buffer.from([0x03, 0x06, keyIndex, red, green, blue]))
215244
}
216245

217-
public async clearKey(keyIndex: KeyIndex): Promise<void> {
218-
const control = this.#deviceProperties.CONTROLS.find(
219-
(control): control is StreamDeckButtonControlDefinition =>
220-
control.type === 'button' && control.index === keyIndex
221-
)
222-
223-
if (this.#deviceProperties.SUPPORTS_RGB_KEY_FILL || control?.feedbackType === 'rgb') {
224-
await this.sendKeyRgb(keyIndex, 0, 0, 0)
225-
} else {
226-
const pixels = Buffer.alloc(this.imageRgbBytes, 0)
227-
await this.fillImageRange(keyIndex, pixels, {
228-
format: 'rgb',
229-
offset: 0,
230-
stride: this.#imagePacker.imageWidth * 3,
231-
})
232-
}
233-
}
234-
235246
private async fillImageRange(keyIndex: KeyIndex, imageBuffer: Buffer, sourceOptions: InternalFillImageOptions) {
236247
const buttonControl = this.#deviceProperties.CONTROLS.find(
237248
(control): control is StreamDeckButtonControlDefinition =>

0 commit comments

Comments
 (0)