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';