Skip to content

Commit

Permalink
feat(gif/oled):
Browse files Browse the repository at this point in the history
 - allow to send gif to N&B box
  • Loading branch information
thib3113 committed Jan 3, 2024
1 parent b70dbe2 commit 47c680e
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 15 deletions.
25 changes: 15 additions & 10 deletions packages/lovebox-client/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,16 +63,6 @@ if(boxWithoutColor) {

````

### OLED picture

When sending oled pictures, you need to pass an array of `1024` bytes .
This bytes will be divided in `64` rows per `128` columns,

Each row is divided by 8 bits, 1 = light off / 0 = light on (common anode)

you can use the editor [here](https://thib3113.github.io/node-lovebox/tools/editor/) to generate an example picture


### Sending gif
sending gif is very limited .
original gif are 3 frames only .
Expand All @@ -91,3 +81,18 @@ await client.sendPicture({
senderDeviceId: me.device._id
}, boxWithColor, me.device._id);
````


### OLED picture
When sending OLED pictures, you need to pass an array of `1024` bytes .
This bytes will be divided in `64` rows per `128` columns,

Each row is divided by 8 bits, 1 = light off / 0 = light on (common anode)

you can use the editor [here](https://thib3113.github.io/node-lovebox/tools/editor/) to generate an example picture


### Sending gif to OLED

to send gif to OLED, you need to add another frames in the bytes array, max 3 frames (3072 bytes)

12 changes: 7 additions & 5 deletions packages/lovebox-client/src/LoveBoxClient.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { createDebugger } from './utils.js';
import axios from 'axios';
import { DEFAULT_OLED_BASE64, LOVEBOX_API_HOST, LOVEBOX_API_URL } from './constants.js';
import { DEFAULT_OLED_BASE64, LOVEBOX_API_HOST, LOVEBOX_API_URL, OLED_PICTURE_BYTES, OLED_PICTURE_MAX_FRAME } from './constants.js';
import { LoveBoxApiLoginWithPasswordResponse } from './lovebox/types/responses.js';
import { GraphQLClient, Variables } from 'graphql-request';
import { BoxSettings, mongoId } from './lovebox/types/commons.js';
Expand Down Expand Up @@ -188,7 +188,7 @@ export class LoveBoxClient {

/**
* works only on Black and white loveBox
* @param bytes an array of 1024 bytes . Works with common anode => 0 light on / 1 light off . 64 rows by 128 columns, each row is subsidised by bits
* @param bytes an array of a multiple of 1024 bytes . Works with common anode => 0 light on / 1 light off . 64 rows by 128 columns, each row is subsidised by bits . 1024 bytes per frames (max 3 frames)
* @param frames
* @param boxId
* @param senderDeviceId
Expand All @@ -204,8 +204,9 @@ export class LoveBoxClient {
}): Promise<(typeof sendMessageV1.__response)['sendMessageV1']> {
const { box, device } = await this.getDefaultBoxAndSender(boxId, senderDeviceId, false);

if (bytes.length !== 1024 || bytes.some((b) => b > 255 || b < 0)) {
throw new Error('Bytes buffer seems incorrect . need to contain 1024 bytes');
const maxBytes = OLED_PICTURE_BYTES * OLED_PICTURE_MAX_FRAME;
if (bytes.length % OLED_PICTURE_BYTES !== 0 || bytes.length > maxBytes || bytes.some((b) => b > 255 || b < 0)) {
throw new Error(`Bytes buffer seems incorrect . need to contain a multiple of ${OLED_PICTURE_BYTES} bytes, max ${maxBytes}`);
}

return (
Expand All @@ -214,7 +215,8 @@ export class LoveBoxClient {
bytes: [...bytes],
recipient: box,
options: {
deviceId: device
deviceId: device,
premium: bytes.length > OLED_PICTURE_BYTES
}
})
).sendMessageV1;
Expand Down
3 changes: 3 additions & 0 deletions packages/lovebox-client/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@ export const LOVEBOX_API_URL = `https://${LOVEBOX_API_HOST}`;

export const DEFAULT_OLED_BASE64 =
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAEACAYAAADFkM5nAAAAAXNSR0IArs4c6QAACuhJREFUeF7t1kEBAAAIAjHpX9ogNxswfLBzBAgQIECAQE5gucQCEyBAgAABAmcAeAICBAgQIBAUMACCpYtMgAABAgQMAD9AgAABAgSCAgZAsHSRCRAgQICAAeAHCBAgQIBAUMAACJYuMgECBAgQMAD8AAECBAgQCAoYAMHSRSZAgAABAgaAHyBAgAABAkEBAyBYusgECBAgQMAA8AMECBAgQCAoYAAESxeZAAECBAgYAH6AAAECBAgEBQyAYOkiEyBAgAABA8APECBAgACBoIABECxdZAIECBAgYAD4AQIECBAgEBQwAIKli0yAAAECBAwAP0CAAAECBIICBkCwdJEJECBAgIAB4AcIECBAgEBQwAAIli4yAQIECBAwAPwAAQIECBAIChgAwdJFJkCAAAECBoAfIECAAAECQQEDIFi6yAQIECBAwADwAwQIECBAIChgAARLF5kAAQIECBgAfoAAAQIECAQFDIBg6SITIECAAAEDwA8QIECAAIGggAEQLF1kAgQIECBgAPgBAgQIECAQFDAAgqWLTIAAAQIEDAA/QIAAAQIEggIGQLB0kQkQIECAgAHgBwgQIECAQFDAAAiWLjIBAgQIEDAA/AABAgQIEAgKGADB0kUmQIAAAQIGgB8gQIAAAQJBAQMgWLrIBAgQIEDAAPADBAgQIEAgKGAABEsXmQABAgQIGAB+gAABAgQIBAUMgGDpIhMgQIAAAQPADxAgQIAAgaCAARAsXWQCBAgQIGAA+AECBAgQIBAUMACCpYtMgAABAgQMAD9AgAABAgSCAgZAsHSRCRAgQICAAeAHCBAgQIBAUMAACJYuMgECBAgQMAD8AAECBAgQCAoYAMHSRSZAgAABAgaAHyBAgAABAkEBAyBYusgECBAgQMAA8AMECBAgQCAoYAAESxeZAAECBAgYAH6AAAECBAgEBQyAYOkiEyBAgAABA8APECBAgACBoIABECxdZAIECBAgYAD4AQIECBAgEBQwAIKli0yAAAECBAwAP0CAAAECBIICBkCwdJEJECBAgIAB4AcIECBAgEBQwAAIli4yAQIECBAwAPwAAQIECBAIChgAwdJFJkCAAAECBoAfIECAAAECQQEDIFi6yAQIECBAwADwAwQI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';

export const OLED_PICTURE_BYTES = 1024;
export const OLED_PICTURE_MAX_FRAME = 3;

0 comments on commit 47c680e

Please sign in to comment.