Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/adapter/adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,13 @@ export abstract class Adapter extends events.EventEmitter<AdapterEventMap> {

public abstract sendZclFrameInterPANToIeeeAddr(zclFrame: Zcl.Frame, ieeeAddress: string): Promise<void>;

public abstract sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number): Promise<AdapterEvents.ZclPayload>;
public abstract sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: false): Promise<AdapterEvents.ZclPayload>;
public abstract sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: true): Promise<undefined>;
public abstract sendZclFrameInterPANBroadcast(
zclFrame: Zcl.Frame,
timeout: number,
disableResponse: boolean,
): Promise<AdapterEvents.ZclPayload | undefined>;

public abstract restoreChannelInterPAN(): Promise<void>;
}
Expand Down
8 changes: 7 additions & 1 deletion src/adapter/deconz/adapter/deconzAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,13 @@ export class DeconzAdapter extends Adapter {
public async sendZclFrameInterPANToIeeeAddr(_zclFrame: Zcl.Frame, _ieeeAddr: string): Promise<void> {
await Promise.reject(new Error("not supported"));
}
public async sendZclFrameInterPANBroadcast(_zclFrame: Zcl.Frame, _timeout: number): Promise<Events.ZclPayload> {
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: false): Promise<Events.ZclPayload>;
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: true): Promise<undefined>;
public async sendZclFrameInterPANBroadcast(
_zclFrame: Zcl.Frame,
_timeout: number,
_disableResponse: boolean,
): Promise<Events.ZclPayload | undefined> {
return await Promise.reject(new Error("not supported"));
}
public async sendZclFrameInterPANBroadcastWithResponse(_zclFrame: Zcl.Frame, _timeout: number): Promise<Events.ZclPayload> {
Expand Down
28 changes: 16 additions & 12 deletions src/adapter/ember/adapter/emberAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2171,7 +2171,9 @@ export class EmberAdapter extends Adapter {
}

// queued
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number): Promise<ZclPayload> {
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: false): Promise<ZclPayload>;
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: true): Promise<undefined>;
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: boolean): Promise<ZclPayload | undefined> {
const command = zclFrame.command;

if (command.response === undefined) {
Expand All @@ -2190,7 +2192,7 @@ export class EmberAdapter extends Adapter {
sequence: 0, // set by stack
};

return await this.queue.execute<ZclPayload>(async () => {
return await this.queue.execute<ZclPayload | undefined>(async () => {
const msgBuffalo = new EzspBuffalo(Buffer.alloc(MAXIMUM_INTERPAN_LENGTH));

// cache-enabled getters
Expand Down Expand Up @@ -2219,17 +2221,19 @@ export class EmberAdapter extends Adapter {

// NOTE: can use ezspRawTransmitCompleteHandler if needed here

const result = await this.oneWaitress.startWaitingFor<ZclPayload>(
{
target: undefined,
apsFrame: apsFrame,
zclSequence: zclFrame.header.transactionSequenceNumber,
commandIdentifier: command.response,
},
timeout,
);
if (!disableResponse) {
const result = await this.oneWaitress.startWaitingFor<ZclPayload>(
{
target: undefined,
apsFrame: apsFrame,
zclSequence: zclFrame.header.transactionSequenceNumber,
commandIdentifier: command.response,
},
timeout,
);

return result;
return result;
}
});
}

Expand Down
18 changes: 13 additions & 5 deletions src/adapter/ezsp/adapter/ezspAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -526,16 +526,22 @@ export class EZSPAdapter extends Adapter {
});
}

public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number): Promise<ZclPayload> {
return await this.queue.execute<ZclPayload>(async () => {
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: false): Promise<ZclPayload>;
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: true): Promise<undefined>;
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: boolean): Promise<ZclPayload | undefined> {
return await this.queue.execute<ZclPayload | undefined>(async () => {
logger.debug("sendZclFrameInterPANBroadcast", NS);
const command = zclFrame.command;

if (command.response === undefined) {
throw new Error(`Command '${command.name}' has no response, cannot wait for response`);
}

const response = this.waitForInternal(undefined, 0xfe, undefined, zclFrame.cluster.ID, command.response, timeout);
let response: ReturnType<typeof this.waitForInternal> | undefined;

if (!disableResponse) {
this.waitForInternal(undefined, 0xfe, undefined, zclFrame.cluster.ID, command.response, timeout);
}

try {
const frame = this.driver.makeEmberRawFrame();
Expand All @@ -551,11 +557,13 @@ export class EZSPAdapter extends Adapter {

await this.driver.rawrequest(frame, zclFrame.toBuffer());
} catch (error) {
response.cancel();
response?.cancel();
throw error;
}

return await response.start().promise;
if (response) {
return await response.start().promise;
}
});
}

Expand Down
40 changes: 26 additions & 14 deletions src/adapter/z-stack/adapter/zStackAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1062,23 +1062,33 @@ export class ZStackAdapter extends Adapter {
});
}

public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number): Promise<Events.ZclPayload> {
return await this.queue.execute<Events.ZclPayload>(async () => {
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: false): Promise<Events.ZclPayload>;
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: true): Promise<undefined>;
public async sendZclFrameInterPANBroadcast(
zclFrame: Zcl.Frame,
timeout: number,
disableResponse: boolean,
): Promise<Events.ZclPayload | undefined> {
return await this.queue.execute<Events.ZclPayload | undefined>(async () => {
const command = zclFrame.command;
if (command.response === undefined) {
throw new Error(`Command '${command.name}' has no response, cannot wait for response`);
}

const response = this.waitForInternal(
undefined,
0xfe,
zclFrame.header.frameControl.frameType,
Zcl.Direction.SERVER_TO_CLIENT,
undefined,
zclFrame.cluster.ID,
command.response,
timeout,
);
let response: ReturnType<typeof this.waitForInternal> | undefined;

if (!disableResponse) {
response = this.waitForInternal(
undefined,
0xfe,
zclFrame.header.frameControl.frameType,
Zcl.Direction.SERVER_TO_CLIENT,
undefined,
zclFrame.cluster.ID,
command.response,
timeout,
);
}

try {
await this.dataRequestExtended(
Expand All @@ -1094,11 +1104,13 @@ export class ZStackAdapter extends Adapter {
false,
);
} catch (error) {
response.cancel();
response?.cancel();
throw error;
}

return await response.start().promise;
if (response) {
return await response.start().promise;
}
});
}

Expand Down
8 changes: 6 additions & 2 deletions src/adapter/zboss/adapter/zbossAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -464,8 +464,12 @@ export class ZBOSSAdapter extends Adapter {
return;
}

public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number): Promise<ZclPayload> {
return await Promise.reject(new Error(`NOT SUPPORTED: sendZclFrameInterPANBroadcast(${JSON.stringify(zclFrame)},${timeout})`));
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: false): Promise<ZclPayload>;
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: true): Promise<undefined>;
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: boolean): Promise<ZclPayload | undefined> {
return await Promise.reject(
new Error(`NOT SUPPORTED: sendZclFrameInterPANBroadcast(${JSON.stringify(zclFrame)},${timeout},${disableResponse})`),
);
}

public async restoreChannelInterPAN(): Promise<void> {
Expand Down
8 changes: 7 additions & 1 deletion src/adapter/zigate/adapter/zigateAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -550,7 +550,13 @@ export class ZiGateAdapter extends Adapter {
public async sendZclFrameInterPANToIeeeAddr(_zclFrame: Zcl.Frame, _ieeeAddress: string): Promise<void> {
await Promise.reject(new Error("Not supported"));
}
public async sendZclFrameInterPANBroadcast(_zclFrame: Zcl.Frame, _timeout: number): Promise<Events.ZclPayload> {
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: false): Promise<Events.ZclPayload>;
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: true): Promise<undefined>;
public async sendZclFrameInterPANBroadcast(
_zclFrame: Zcl.Frame,
_timeout: number,
_disableResponse: boolean,
): Promise<Events.ZclPayload | undefined> {
return await Promise.reject(new Error("Not supported"));
}

Expand Down
6 changes: 4 additions & 2 deletions src/adapter/zoh/adapter/zohAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -724,8 +724,10 @@ export class ZoHAdapter extends Adapter {
/* v8 ignore stop */

/* v8 ignore start */
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number): Promise<ZclPayload> {
return await Promise.reject(new Error(`not supported ${JSON.stringify(zclFrame)}, ${timeout}`));
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: false): Promise<ZclPayload>;
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: true): Promise<undefined>;
public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number, disableResponse: boolean): Promise<ZclPayload | undefined> {
return await Promise.reject(new Error(`not supported ${JSON.stringify(zclFrame)}, ${timeout}, ${disableResponse}`));
}
/* v8 ignore stop */

Expand Down
Loading
Loading