From 523ef3bc77afb006be2cc24b638ab044b649f97b Mon Sep 17 00:00:00 2001 From: Everton Correia <1169768+evertonstz@users.noreply.github.com> Date: Mon, 29 Apr 2024 12:02:30 -0300 Subject: [PATCH] Add support for message requesting (#47) Fixes #46 --- src/components/MainContent/SelectedDevice.tsx | 17 +++++ src/pax/core/messages/RequestStatusMessage.ts | 69 +++++++++++++++++++ src/pax/core/messages/index.ts | 1 + 3 files changed, 87 insertions(+) create mode 100644 src/pax/core/messages/RequestStatusMessage.ts diff --git a/src/components/MainContent/SelectedDevice.tsx b/src/components/MainContent/SelectedDevice.tsx index 440eacf..e8647c3 100644 --- a/src/components/MainContent/SelectedDevice.tsx +++ b/src/components/MainContent/SelectedDevice.tsx @@ -6,7 +6,9 @@ import { BatteryPercentageMessage, BrightnessMessage, ColorThemeMessage, + RequestStatusMessage, } from '@/pax/core/messages'; +import { Messages } from '@/pax/shared/enums'; import { ColorTheme } from '@/pax/shared/types'; import { usePaxContext } from '@/state/hooks'; import { isEqual } from 'lodash'; @@ -129,6 +131,21 @@ export const SelectedDevice = ({ currentDevice }: SelectedDeviceProps) => { > {bluetoothState.connected ? 'Disconnect' : 'Connect'} + , + ) { + super(); + this.messageType = Messages.ATTRIBUTE_STATUS_UPDATE; + if (builder instanceof RequestStatusMessageBuilderFromValue) { + this.messages = builder.getMessages(); + const value = this.messages.reduce((acc, attributeId) => { + return acc + Math.pow(2, attributeId); + }, 0); + const buffer = new ArrayBuffer(16); + const view = new PaxDecryptedPacket(buffer); + view.setUint8(0, this.messageType); + view.setBigUint64(1, BigInt(value), true); + this.packet = view; + } else { + throw new Error('Invalid builder'); + } + } + + static createWithMessage(message: Messages[]): RequestStatusMessage { + const builder = + new RequestStatusMessageBuilderFromValue(); + builder.setMessages(message); + return new RequestStatusMessage(builder); + } +} + +export class RequestStatusMessageBuilderFromValue< + T extends RequestStatusMessage, +> { + private message?: Messages[]; + + setMessages(message: Messages[]): RequestStatusMessageBuilderFromValue { + this.message = message; + return this; + } + + getMessages(): Messages[] { + if (!this.message) { + throw new Error('Messages are not set'); + } + return this.message; + } + + build(ctor: new (builder: RequestStatusMessageBuilderFromValue) => T): T { + if (!this.message) { + throw new Error('Messages are not set'); + } + return new ctor(this); + } +} diff --git a/src/pax/core/messages/index.ts b/src/pax/core/messages/index.ts index c98377a..80c4b2a 100644 --- a/src/pax/core/messages/index.ts +++ b/src/pax/core/messages/index.ts @@ -9,3 +9,4 @@ export * from './HeatingStateMessage'; export * from './ColorThemeMessage'; export * from './BatteryPercentageMessage'; export * from './BrightnessMessage'; +export * from './RequestStatusMessage';