ba63 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,10 @@
1
1
  import HID from "node-hid";
2
2
  import type { Charset } from "../constants/charset";
3
3
  type RenderOptions = Partial<{
4
- /** If the message reaches the end of the top line, start printing on the bottom line.*/
4
+ /** If the message reaches the end of the top line, start printing on the bottom line */
5
5
  wrap: boolean;
6
+ /** Reset cursor position to where it was prior to rendering */
7
+ preserveCursorPos: boolean;
6
8
  }>;
7
9
  /** The start and end column positions of the section of cells used */
8
10
  type UsedCells = {
@@ -22,10 +24,10 @@ export declare class BA63 {
22
24
  static create(): Promise<BA63>;
23
25
  private run;
24
26
  render(message: string | number[], options?: RenderOptions): Promise<void>;
25
- renderCenter(message: string): Promise<UsedCells>;
26
- renderLeft(message: string): Promise<UsedCells>;
27
- renderRight(message: string): Promise<UsedCells>;
28
- fill(input: number[] | string): Promise<void>;
27
+ renderCenter(message: string, options?: RenderOptions): Promise<UsedCells>;
28
+ renderLeft(message: string, options?: RenderOptions): Promise<UsedCells>;
29
+ renderRight(message: string, options?: RenderOptions): Promise<UsedCells>;
30
+ fill(input: number[] | string, options?: RenderOptions): Promise<void>;
29
31
  testRender(): Promise<void>;
30
32
  carriageReturn(): Promise<void>;
31
33
  lineFeed(): Promise<void>;
@@ -36,6 +38,7 @@ export declare class BA63 {
36
38
  setCursorColumn(column: number): Promise<void>;
37
39
  setCursorRow(row: (typeof this.cursorPos)[0]): Promise<void>;
38
40
  clearDisplay(): Promise<void>;
41
+ clearRow(row?: number): Promise<void>;
39
42
  get lengthToEnd(): number;
40
43
  get row(): "top" | "bottom";
41
44
  get currentRow(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"BA63.d.ts","sourceRoot":"","sources":["../../src/classes/BA63.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAMpD,KAAK,aAAa,GAAG,OAAO,CAAC;IAC3B,wFAAwF;IACxF,IAAI,EAAE,OAAO,CAAC;CACf,CAAC,CAAC;AAEH,sEAAsE;AACtE,KAAK,SAAS,GAAG;IACf,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAe;IAE7B,sDAAsD;IACtD,SAAS,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAU;IAE/C;;OAEG;gBACS,MAAM,EAAE,GAAG,CAAC,QAAQ;WAInB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAsCtB,GAAG;IAUX,MAAM,CACV,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC;IAgCV,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAajD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAY/C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAahD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAMzB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAM1B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,YAAY,CAAC,GAAG,EAAE,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnC,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,GAAG,IAAI,KAAK,GAAG,QAAQ,CAE1B;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;CACF"}
1
+ {"version":3,"file":"BA63.d.ts","sourceRoot":"","sources":["../../src/classes/BA63.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAMpD,KAAK,aAAa,GAAG,OAAO,CAAC;IAC3B,wFAAwF;IACxF,IAAI,EAAE,OAAO,CAAC;IACd,+DAA+D;IAC/D,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC,CAAC;AAEH,sEAAsE;AACtE,KAAK,SAAS,GAAG;IACf,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAe;IAE7B,sDAAsD;IACtD,SAAS,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAU;IAE/C;;OAEG;gBACS,MAAM,EAAE,GAAG,CAAC,QAAQ;WAInB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAsCtB,GAAG;IAUX,MAAM,CACV,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC;IAqCV,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,SAAS,CAAC;IAaf,UAAU,CACd,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,SAAS,CAAC;IAYf,WAAW,CACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,SAAS,CAAC;IAaf,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBtE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAMzB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAM1B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,YAAY,CAAC,GAAG,EAAE,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3C,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,GAAG,IAAI,KAAK,GAAG,QAAQ,CAE1B;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;CACF"}
package/dist/index.js CHANGED
@@ -49,6 +49,7 @@ class BA63 {
49
49
  }
50
50
  async render(message, options) {
51
51
  const trimmedMessage = message.slice(0, this.lengthToEnd);
52
+ const savedPos = this.cursorPos;
52
53
  const arr = typeof trimmedMessage === "string" ? Array.from(Buffer.from(trimmedMessage, "ascii")) : trimmedMessage;
53
54
  await this.run(arr);
54
55
  this.setCursorColumn(this.currentColumn + arr.length);
@@ -58,42 +59,44 @@ class BA63 {
58
59
  const excessArr = typeof excessMessage === "string" ? Array.from(Buffer.from(excessMessage, "ascii")) : excessMessage;
59
60
  await this.run(excessArr);
60
61
  this.setCursorColumn(this.currentColumn + excessArr.length);
61
- return;
62
+ }
63
+ if (options?.preserveCursorPos) {
64
+ this.setCursorPosition(...savedPos);
62
65
  }
63
66
  }
64
- async renderCenter(message) {
67
+ async renderCenter(message, options) {
65
68
  const trimmedMessage = message.slice(0, 20);
66
69
  const padding = Math.floor((20 - trimmedMessage.length) / 2);
67
70
  this.setCursorPosition(this.cursorPos[0], padding);
68
- await this.render(trimmedMessage);
71
+ await this.render(trimmedMessage, options);
69
72
  const columnCellsUsed = {
70
73
  start: padding,
71
74
  end: padding + trimmedMessage.length - 1
72
75
  };
73
76
  return columnCellsUsed;
74
77
  }
75
- async renderLeft(message) {
78
+ async renderLeft(message, options) {
76
79
  const trimmedMessage = message.slice(0, 20);
77
80
  this.setCursorPosition(this.cursorPos[0], 0);
78
- await this.render(trimmedMessage);
81
+ await this.render(trimmedMessage, options);
79
82
  const columnCellsUsed = {
80
83
  start: 0,
81
84
  end: trimmedMessage.length - 1
82
85
  };
83
86
  return columnCellsUsed;
84
87
  }
85
- async renderRight(message) {
88
+ async renderRight(message, options) {
86
89
  const trimmedMessage = message.slice(0, 20);
87
90
  const startPos = 20 - trimmedMessage.length;
88
91
  this.setCursorPosition(this.cursorPos[0], startPos);
89
- await this.render(trimmedMessage);
92
+ await this.render(trimmedMessage, options);
90
93
  const columnCellsUsed = {
91
94
  start: startPos,
92
95
  end: 19
93
96
  };
94
97
  return columnCellsUsed;
95
98
  }
96
- async fill(input) {
99
+ async fill(input, options) {
97
100
  const savedPos = this.cursorPos;
98
101
  let charCodes = [];
99
102
  const isString = typeof input === "string";
@@ -105,7 +108,7 @@ class BA63 {
105
108
  }
106
109
  }
107
110
  await this.setCursorPosition(0, 0);
108
- await this.render(charCodes, { wrap: true });
111
+ await this.render(charCodes, { wrap: true, ...options });
109
112
  this.setCursorPosition(...savedPos);
110
113
  }
111
114
  async testRender() {
@@ -155,6 +158,14 @@ class BA63 {
155
158
  const command = [27, 91, 50, 74];
156
159
  await this.run(command);
157
160
  }
161
+ async clearRow(row) {
162
+ if (row !== undefined) {
163
+ await this.setCursorPosition(row, 0);
164
+ } else {
165
+ await this.setCursorPosition(this.currentRow, 0);
166
+ }
167
+ await this.deleteToEOL();
168
+ }
158
169
  get lengthToEnd() {
159
170
  return 20 - this.cursorPos[1];
160
171
  }
@@ -200,4 +211,4 @@ export {
200
211
  BA63
201
212
  };
202
213
 
203
- //# debugId=7A4A1AC59E3B2AEF64756E2164756E21
214
+ //# debugId=9FBCBC57D6583F4264756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,11 +2,11 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/classes/BA63.ts", "../src/constants/blocks.ts", "../src/constants/charset.ts"],
4
4
  "sourcesContent": [
5
- "import HID from \"node-hid\";\nimport type { Charset } from \"../constants/charset\";\nimport { blocks } from \"../constants/blocks\";\n\nconst vendorId = 2727;\nconst productId = 512;\n\ntype RenderOptions = Partial<{\n /** If the message reaches the end of the top line, start printing on the bottom line.*/\n wrap: boolean;\n}>;\n\n/** The start and end column positions of the section of cells used */\ntype UsedCells = {\n /** The start position of the section of cells used */\n start: number;\n /** The end position of the section of cells used */\n end: number;\n};\n\nexport class BA63 {\n private device: HID.HIDAsync;\n\n /** Current cursor position in [row, column] format */\n protected cursorPos: [number, number] = [0, 0];\n\n /**\n * **NOTE**: This constructor should only be used if you already have an open HID device to interface with.\n */\n constructor(device: HID.HIDAsync) {\n this.device = device;\n }\n\n static async create(): Promise<BA63> {\n const devices = HID.devices();\n const ba63Devices = devices.filter(\n (device) => device.vendorId === vendorId && device.productId === productId\n );\n\n if (ba63Devices.length === 0) {\n throw new Error(\"BA63 device not found\");\n }\n\n /*\n * When connecting to a BA63, you'll find that there are two different interfaces\n * to connect to. Interface 0 is for updating the BA63's firmware whereas interface 1\n * is for communicating with the display itself.\n */\n const displayInterface = ba63Devices.find((d) => d.interface === 1);\n\n if (!displayInterface) {\n throw new Error(\"BA63 display interface (Interface 1) not found!\");\n }\n\n const device = await HID.HIDAsync.open(displayInterface.path!);\n\n // device.on(\"data\", (data) => {\n // console.log(\"Data received:\", data);\n // });\n\n // device.on(\"error\", (err) => {\n // console.error(\"Error:\", err);\n // });\n\n const ba63 = new BA63(device);\n await ba63.clearDisplay();\n await ba63.setCharset(0); // Set to USA charset\n\n return ba63;\n }\n\n private async run(command: number[]): Promise<void> {\n // Pad to 32 bytes (HID report size)\n const writeCommand = [0x02, 0x00, command.length, ...command];\n while (writeCommand.length < 32) {\n writeCommand.push(0x00);\n }\n\n await this.device.write(writeCommand);\n }\n\n async render(\n message: string | number[],\n options?: RenderOptions\n ): Promise<void> {\n const trimmedMessage = message.slice(0, this.lengthToEnd);\n\n const arr =\n typeof trimmedMessage === \"string\"\n ? Array.from(Buffer.from(trimmedMessage, \"ascii\"))\n : trimmedMessage;\n\n await this.run(arr);\n this.setCursorColumn(this.currentColumn + arr.length);\n\n // If wrapping is enabled, we're on the top line, and there's more message to render, continue rendering on next line\n if (\n options?.wrap &&\n this.row === \"top\" &&\n message.length > trimmedMessage.length\n ) {\n const excessMessage = message.slice(trimmedMessage.length);\n\n await this.setCursorPosition(1, 0);\n\n const excessArr =\n typeof excessMessage === \"string\"\n ? Array.from(Buffer.from(excessMessage, \"ascii\"))\n : excessMessage;\n\n await this.run(excessArr);\n this.setCursorColumn(this.currentColumn + excessArr.length);\n return;\n }\n }\n\n async renderCenter(message: string): Promise<UsedCells> {\n const trimmedMessage = message.slice(0, 20);\n const padding = Math.floor((20 - trimmedMessage.length) / 2);\n this.setCursorPosition(this.cursorPos[0], padding);\n\n await this.render(trimmedMessage);\n const columnCellsUsed = {\n start: padding,\n end: padding + trimmedMessage.length - 1,\n };\n return columnCellsUsed;\n }\n\n async renderLeft(message: string): Promise<UsedCells> {\n const trimmedMessage = message.slice(0, 20);\n this.setCursorPosition(this.cursorPos[0], 0);\n\n await this.render(trimmedMessage);\n const columnCellsUsed = {\n start: 0,\n end: trimmedMessage.length - 1,\n };\n return columnCellsUsed;\n }\n\n async renderRight(message: string): Promise<UsedCells> {\n const trimmedMessage = message.slice(0, 20);\n const startPos = 20 - trimmedMessage.length;\n this.setCursorPosition(this.cursorPos[0], startPos);\n\n await this.render(trimmedMessage);\n const columnCellsUsed = {\n start: startPos,\n end: 19,\n };\n return columnCellsUsed;\n }\n\n async fill(input: number[] | string): Promise<void> {\n const savedPos = this.cursorPos;\n let charCodes: number[] = [];\n\n const isString = typeof input === \"string\";\n\n for (let i = 0; i < 40; i++) {\n if (isString) {\n charCodes.push(input.charCodeAt(i % input.length));\n } else {\n charCodes.push(input[i % input.length]!);\n }\n }\n\n await this.setCursorPosition(0, 0);\n await this.render(charCodes, { wrap: true });\n this.setCursorPosition(...savedPos);\n }\n\n async testRender(): Promise<void> {\n const testMessage = \"Hello from BA63!\";\n await this.fill([blocks.LIGHT_SHADE]);\n await this.renderCenter(testMessage);\n await this.setCursorRow(1);\n await this.renderCenter(\"- Caleb\");\n }\n\n async carriageReturn(): Promise<void> {\n const command = [0x0d];\n await this.run(command);\n this.setCursorColumn(0);\n }\n\n async lineFeed(): Promise<void> {\n const command = [0x0a];\n await this.run(command);\n this.setCursorRow(1);\n }\n\n async backspace(): Promise<void> {\n const command = [0x08];\n await this.run(command);\n this.setCursorColumn(Math.max(0, this.currentColumn - 1));\n }\n\n async setCharset(charset: Charset): Promise<void> {\n const command = [0x1b, 0x52, charset];\n await this.run(command);\n }\n\n async deleteToEOL(): Promise<void> {\n const command = [0x1b, 0x5b, 0x30, 0x4b];\n await this.run(command);\n }\n\n async setCursorPosition(row: number, column: number): Promise<void> {\n this.cursorPos = [row, column];\n\n const asciiRow = (row + 1).toString().charCodeAt(0);\n // asciiColumn can be more than one digit\n const asciiColumn = (column + 1)\n .toString()\n .split(\"\")\n .map((char) => char.charCodeAt(0));\n\n const command = [0x1b, 0x5b, asciiRow, 0x3b, ...asciiColumn, 0x48];\n await this.run(command);\n }\n\n async setCursorColumn(column: number): Promise<void> {\n this.setCursorPosition(this.cursorPos[0], column);\n }\n\n async setCursorRow(row: (typeof this.cursorPos)[0]): Promise<void> {\n this.setCursorPosition(row, this.cursorPos[1]);\n }\n\n async clearDisplay(): Promise<void> {\n const command = [0x1b, 0x5b, 0x32, 0x4a];\n await this.run(command);\n }\n\n get lengthToEnd(): number {\n return 20 - this.cursorPos[1];\n }\n\n get row(): \"top\" | \"bottom\" {\n return this.cursorPos[0] === 0 ? \"top\" : \"bottom\";\n }\n\n get currentRow(): number {\n return this.cursorPos[0];\n }\n\n get currentColumn(): number {\n return this.cursorPos[1];\n }\n}\n",
5
+ "import HID from \"node-hid\";\nimport type { Charset } from \"../constants/charset\";\nimport { blocks } from \"../constants/blocks\";\n\nconst vendorId = 2727;\nconst productId = 512;\n\ntype RenderOptions = Partial<{\n /** If the message reaches the end of the top line, start printing on the bottom line */\n wrap: boolean;\n /** Reset cursor position to where it was prior to rendering */\n preserveCursorPos: boolean;\n}>;\n\n/** The start and end column positions of the section of cells used */\ntype UsedCells = {\n /** The start position of the section of cells used */\n start: number;\n /** The end position of the section of cells used */\n end: number;\n};\n\nexport class BA63 {\n private device: HID.HIDAsync;\n\n /** Current cursor position in [row, column] format */\n protected cursorPos: [number, number] = [0, 0];\n\n /**\n * **NOTE**: This constructor should only be used if you already have an open HID device to interface with.\n */\n constructor(device: HID.HIDAsync) {\n this.device = device;\n }\n\n static async create(): Promise<BA63> {\n const devices = HID.devices();\n const ba63Devices = devices.filter(\n (device) => device.vendorId === vendorId && device.productId === productId\n );\n\n if (ba63Devices.length === 0) {\n throw new Error(\"BA63 device not found\");\n }\n\n /*\n * When connecting to a BA63, you'll find that there are two different interfaces\n * to connect to. Interface 0 is for updating the BA63's firmware whereas interface 1\n * is for communicating with the display itself.\n */\n const displayInterface = ba63Devices.find((d) => d.interface === 1);\n\n if (!displayInterface) {\n throw new Error(\"BA63 display interface (Interface 1) not found!\");\n }\n\n const device = await HID.HIDAsync.open(displayInterface.path!);\n\n // device.on(\"data\", (data) => {\n // console.log(\"Data received:\", data);\n // });\n\n // device.on(\"error\", (err) => {\n // console.error(\"Error:\", err);\n // });\n\n const ba63 = new BA63(device);\n await ba63.clearDisplay();\n await ba63.setCharset(0); // Set to USA charset\n\n return ba63;\n }\n\n private async run(command: number[]): Promise<void> {\n // Pad to 32 bytes (HID report size)\n const writeCommand = [0x02, 0x00, command.length, ...command];\n while (writeCommand.length < 32) {\n writeCommand.push(0x00);\n }\n\n await this.device.write(writeCommand);\n }\n\n async render(\n message: string | number[],\n options?: RenderOptions\n ): Promise<void> {\n const trimmedMessage = message.slice(0, this.lengthToEnd);\n\n const savedPos = this.cursorPos;\n\n const arr =\n typeof trimmedMessage === \"string\"\n ? Array.from(Buffer.from(trimmedMessage, \"ascii\"))\n : trimmedMessage;\n\n await this.run(arr);\n this.setCursorColumn(this.currentColumn + arr.length);\n\n // If wrapping is enabled, we're on the top line, and there's more message to render, continue rendering on next line\n if (\n options?.wrap &&\n this.row === \"top\" &&\n message.length > trimmedMessage.length\n ) {\n const excessMessage = message.slice(trimmedMessage.length);\n\n await this.setCursorPosition(1, 0);\n\n const excessArr =\n typeof excessMessage === \"string\"\n ? Array.from(Buffer.from(excessMessage, \"ascii\"))\n : excessMessage;\n\n await this.run(excessArr);\n this.setCursorColumn(this.currentColumn + excessArr.length);\n }\n\n if (options?.preserveCursorPos) {\n this.setCursorPosition(...savedPos);\n }\n }\n\n async renderCenter(\n message: string,\n options?: RenderOptions\n ): Promise<UsedCells> {\n const trimmedMessage = message.slice(0, 20);\n const padding = Math.floor((20 - trimmedMessage.length) / 2);\n this.setCursorPosition(this.cursorPos[0], padding);\n\n await this.render(trimmedMessage, options);\n const columnCellsUsed = {\n start: padding,\n end: padding + trimmedMessage.length - 1,\n };\n return columnCellsUsed;\n }\n\n async renderLeft(\n message: string,\n options?: RenderOptions\n ): Promise<UsedCells> {\n const trimmedMessage = message.slice(0, 20);\n this.setCursorPosition(this.cursorPos[0], 0);\n\n await this.render(trimmedMessage, options);\n const columnCellsUsed = {\n start: 0,\n end: trimmedMessage.length - 1,\n };\n return columnCellsUsed;\n }\n\n async renderRight(\n message: string,\n options?: RenderOptions\n ): Promise<UsedCells> {\n const trimmedMessage = message.slice(0, 20);\n const startPos = 20 - trimmedMessage.length;\n this.setCursorPosition(this.cursorPos[0], startPos);\n\n await this.render(trimmedMessage, options);\n const columnCellsUsed = {\n start: startPos,\n end: 19,\n };\n return columnCellsUsed;\n }\n\n async fill(input: number[] | string, options?: RenderOptions): Promise<void> {\n const savedPos = this.cursorPos;\n let charCodes: number[] = [];\n\n const isString = typeof input === \"string\";\n\n for (let i = 0; i < 40; i++) {\n if (isString) {\n charCodes.push(input.charCodeAt(i % input.length));\n } else {\n charCodes.push(input[i % input.length]!);\n }\n }\n\n await this.setCursorPosition(0, 0);\n await this.render(charCodes, { wrap: true, ...options });\n this.setCursorPosition(...savedPos);\n }\n\n async testRender(): Promise<void> {\n const testMessage = \"Hello from BA63!\";\n await this.fill([blocks.LIGHT_SHADE]);\n await this.renderCenter(testMessage);\n await this.setCursorRow(1);\n await this.renderCenter(\"- Caleb\");\n }\n\n async carriageReturn(): Promise<void> {\n const command = [0x0d];\n await this.run(command);\n this.setCursorColumn(0);\n }\n\n async lineFeed(): Promise<void> {\n const command = [0x0a];\n await this.run(command);\n this.setCursorRow(1);\n }\n\n async backspace(): Promise<void> {\n const command = [0x08];\n await this.run(command);\n this.setCursorColumn(Math.max(0, this.currentColumn - 1));\n }\n\n async setCharset(charset: Charset): Promise<void> {\n const command = [0x1b, 0x52, charset];\n await this.run(command);\n }\n\n async deleteToEOL(): Promise<void> {\n const command = [0x1b, 0x5b, 0x30, 0x4b];\n await this.run(command);\n }\n\n async setCursorPosition(row: number, column: number): Promise<void> {\n this.cursorPos = [row, column];\n\n const asciiRow = (row + 1).toString().charCodeAt(0);\n // asciiColumn can be more than one digit\n const asciiColumn = (column + 1)\n .toString()\n .split(\"\")\n .map((char) => char.charCodeAt(0));\n\n const command = [0x1b, 0x5b, asciiRow, 0x3b, ...asciiColumn, 0x48];\n await this.run(command);\n }\n\n async setCursorColumn(column: number): Promise<void> {\n this.setCursorPosition(this.cursorPos[0], column);\n }\n\n async setCursorRow(row: (typeof this.cursorPos)[0]): Promise<void> {\n this.setCursorPosition(row, this.cursorPos[1]);\n }\n\n async clearDisplay(): Promise<void> {\n const command = [0x1b, 0x5b, 0x32, 0x4a];\n await this.run(command);\n }\n\n async clearRow(row?: number): Promise<void> {\n if (row !== undefined) {\n await this.setCursorPosition(row, 0);\n } else {\n await this.setCursorPosition(this.currentRow, 0);\n }\n await this.deleteToEOL();\n }\n\n get lengthToEnd(): number {\n return 20 - this.cursorPos[1];\n }\n\n get row(): \"top\" | \"bottom\" {\n return this.cursorPos[0] === 0 ? \"top\" : \"bottom\";\n }\n\n get currentRow(): number {\n return this.cursorPos[0];\n }\n\n get currentColumn(): number {\n return this.cursorPos[1];\n }\n}\n",
6
6
  "export const blocks = {\n EMPTY: 0,\n LIGHT_SHADE: 176,\n MEDIUM_SHADE_1: 177,\n MEDIUM_SHADE_2: 178,\n LOWER_HALF: 220,\n UPPER_HALF: 223,\n LEFT_HALF: 221,\n RIGHT_HALF: 222,\n FULL: 219,\n};\n\nexport type Block = (typeof blocks)[keyof typeof blocks];\n",
7
7
  "export const charset = {\n USA: 0,\n France: 1,\n Germany: 2,\n UK: 3,\n Denmark1: 4,\n Sweden: 5,\n Italy: 6,\n Spain1: 7,\n Japan: 8,\n Norway: 9,\n Denmark2: 10,\n Spain2: 11,\n LatinAmerica: 12,\n Standard: 30,\n Latin1: 31,\n Latin2: 32,\n Latin5_Turkey: 33,\n LatinInternational: 34,\n Cyrillic: 35,\n Hebrew: 37,\n Greek2: 36,\n Katakana: 63,\n SpacePage: 73,\n} as const;\n\nexport type Charset = (typeof charset)[keyof typeof charset];\n"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "7A4A1AC59E3B2AEF64756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "9FBCBC57D6583F4264756E2164756E21",
11
11
  "names": []
12
12
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ba63",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "author": {
5
5
  "name": "Caleb Perry",
6
6
  "url": "https://github.com/foxtrotperry",