vtac-terminal 1.2.0 → 1.2.1
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.
- package/README.md +1 -1
- package/dist/VTAC/VTAC.test.js +433 -0
- package/dist/VTAC/VTAC.test.js.map +1 -0
- package/dist/index.js +18 -17
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/src/index.ts +20 -18
package/README.md
CHANGED
|
@@ -267,7 +267,7 @@ vtac -p /dev/ttyUSB0 -b 115200 -a none -d 8 -t 1
|
|
|
267
267
|
|
|
268
268
|
- `-v, --version` - Output the current version
|
|
269
269
|
- `-h, --help` - Display help information
|
|
270
|
-
- `-p, --
|
|
270
|
+
- `-p, --port <port>` - Path to the serial port (e.g., /dev/ttyUSB0)
|
|
271
271
|
- `-b, --baudrate <baudrate>` - Baud rate (default: "9600")
|
|
272
272
|
- `-a, --parity <parity>` - Parity (default: "none")
|
|
273
273
|
- `-d, --databits <databits>` - Data bits (default: "8")
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const VTAC_1 = require("./VTAC");
|
|
4
|
+
const pixelIndex = (col, row, x = 0, y = 0) => {
|
|
5
|
+
return (row * 8 + y) * VTAC_1.VTAC.WIDTH + (col * 8 + x);
|
|
6
|
+
};
|
|
7
|
+
const fillCell = (vtac, col, row, color) => {
|
|
8
|
+
for (let y = 0; y < 8; y++) {
|
|
9
|
+
for (let x = 0; x < 8; x++) {
|
|
10
|
+
vtac.buffer[pixelIndex(col, row, x, y)] = color;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const expectCellColor = (vtac, col, row, color) => {
|
|
15
|
+
for (let y = 0; y < 8; y++) {
|
|
16
|
+
for (let x = 0; x < 8; x++) {
|
|
17
|
+
expect(vtac.buffer[pixelIndex(col, row, x, y)]).toBe(color);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
describe('VTAC', () => {
|
|
22
|
+
it('resets state and clears buffer', () => {
|
|
23
|
+
const vtac = new VTAC_1.VTAC();
|
|
24
|
+
vtac.column = 12;
|
|
25
|
+
vtac.row = 8;
|
|
26
|
+
vtac.mode = 'graphics';
|
|
27
|
+
vtac.foregroundColor = 0x22;
|
|
28
|
+
vtac.backgroundColor = 0x11;
|
|
29
|
+
vtac.bellDuration = 0x10;
|
|
30
|
+
vtac.bellFrequency = 0x20;
|
|
31
|
+
vtac.buffer.fill(0xAB);
|
|
32
|
+
vtac.reset();
|
|
33
|
+
expect(vtac.column).toBe(0);
|
|
34
|
+
expect(vtac.row).toBe(0);
|
|
35
|
+
expect(vtac.offset).toBe(0);
|
|
36
|
+
expect(vtac.mode).toBe('text');
|
|
37
|
+
expect(vtac.foregroundColor).toBe(0xFF);
|
|
38
|
+
expect(vtac.backgroundColor).toBe(0x00);
|
|
39
|
+
expect(vtac.bellDuration).toBe(0x3C);
|
|
40
|
+
expect(vtac.bellFrequency).toBe(0x3D);
|
|
41
|
+
expect(vtac.buffer.every((value) => value === 0x00)).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
it('parses set-column and set-row commands', () => {
|
|
44
|
+
const vtac = new VTAC_1.VTAC();
|
|
45
|
+
vtac.parse(0x0E);
|
|
46
|
+
vtac.parse(0x2A);
|
|
47
|
+
vtac.parse(0x0F);
|
|
48
|
+
vtac.parse(0x21);
|
|
49
|
+
expect(vtac.column).toBe(0x2A % VTAC_1.VTAC.COLUMNS);
|
|
50
|
+
expect(vtac.row).toBe(0x21 % VTAC_1.VTAC.ROWS);
|
|
51
|
+
expect(vtac.offset).toBe(0);
|
|
52
|
+
});
|
|
53
|
+
it('queues and dequeues bell events when bell command is parsed', () => {
|
|
54
|
+
const vtac = new VTAC_1.VTAC();
|
|
55
|
+
vtac.parse(0x05);
|
|
56
|
+
vtac.parse(0x1E);
|
|
57
|
+
vtac.parse(0x06);
|
|
58
|
+
vtac.parse(0x2E);
|
|
59
|
+
vtac.parse(0x07);
|
|
60
|
+
expect(vtac.hasQueuedBells()).toBe(true);
|
|
61
|
+
const bell = vtac.getNextBell();
|
|
62
|
+
expect(bell).toBeDefined();
|
|
63
|
+
expect(bell === null || bell === void 0 ? void 0 : bell.duration).toBe(0x1E);
|
|
64
|
+
expect(typeof (bell === null || bell === void 0 ? void 0 : bell.frequency)).toBe('number');
|
|
65
|
+
expect(bell === null || bell === void 0 ? void 0 : bell.frequency).toBeGreaterThan(0);
|
|
66
|
+
expect(vtac.hasQueuedBells()).toBe(false);
|
|
67
|
+
});
|
|
68
|
+
it('inserts command-range byte as data after data-next instruction', () => {
|
|
69
|
+
const vtac = new VTAC_1.VTAC();
|
|
70
|
+
expect(vtac.column).toBe(0);
|
|
71
|
+
expect(vtac.row).toBe(0);
|
|
72
|
+
vtac.parse(0x1A);
|
|
73
|
+
vtac.parse(0x00);
|
|
74
|
+
expect(vtac.column).toBe(1);
|
|
75
|
+
expect(vtac.row).toBe(0);
|
|
76
|
+
expect(vtac.offset).toBe(0);
|
|
77
|
+
});
|
|
78
|
+
it('toggles between text and graphics modes', () => {
|
|
79
|
+
const vtac = new VTAC_1.VTAC();
|
|
80
|
+
expect(vtac.mode).toBe('text');
|
|
81
|
+
vtac.parse(0x0B);
|
|
82
|
+
expect(vtac.mode).toBe('graphics');
|
|
83
|
+
vtac.parse(0x0B);
|
|
84
|
+
expect(vtac.mode).toBe('text');
|
|
85
|
+
});
|
|
86
|
+
it('does not queue bell when frequency is invalid or duration is zero', () => {
|
|
87
|
+
const vtac = new VTAC_1.VTAC();
|
|
88
|
+
vtac.bellFrequency = 0x00;
|
|
89
|
+
vtac.bellDuration = 0x10;
|
|
90
|
+
vtac.bell();
|
|
91
|
+
expect(vtac.hasQueuedBells()).toBe(false);
|
|
92
|
+
vtac.bellFrequency = 0x2E;
|
|
93
|
+
vtac.bellDuration = 0x00;
|
|
94
|
+
vtac.bell();
|
|
95
|
+
expect(vtac.hasQueuedBells()).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it('handles backspace, tab, line feed, and carriage return edge cases', () => {
|
|
98
|
+
const vtac = new VTAC_1.VTAC();
|
|
99
|
+
const scrollSpy = jest.spyOn(vtac, 'scroll');
|
|
100
|
+
vtac.column = 0;
|
|
101
|
+
vtac.offset = 7;
|
|
102
|
+
vtac.backspace();
|
|
103
|
+
expect(vtac.column).toBe(0);
|
|
104
|
+
expect(vtac.offset).toBe(0);
|
|
105
|
+
vtac.column = 5;
|
|
106
|
+
vtac.backspace();
|
|
107
|
+
expect(vtac.column).toBe(4);
|
|
108
|
+
vtac.column = 3;
|
|
109
|
+
vtac.tab();
|
|
110
|
+
expect(vtac.column).toBe(4);
|
|
111
|
+
vtac.column = VTAC_1.VTAC.COLUMNS - 1;
|
|
112
|
+
vtac.tab();
|
|
113
|
+
expect(vtac.column).toBe(VTAC_1.VTAC.COLUMNS - 1);
|
|
114
|
+
vtac.row = 0;
|
|
115
|
+
vtac.offset = 3;
|
|
116
|
+
vtac.lineFeed();
|
|
117
|
+
expect(vtac.row).toBe(1);
|
|
118
|
+
expect(vtac.offset).toBe(0);
|
|
119
|
+
vtac.row = VTAC_1.VTAC.ROWS - 1;
|
|
120
|
+
vtac.lineFeed();
|
|
121
|
+
expect(vtac.row).toBe(VTAC_1.VTAC.ROWS - 1);
|
|
122
|
+
expect(scrollSpy).toHaveBeenCalledWith('up');
|
|
123
|
+
vtac.column = 12;
|
|
124
|
+
vtac.offset = 2;
|
|
125
|
+
vtac.carriageReturn();
|
|
126
|
+
expect(vtac.column).toBe(0);
|
|
127
|
+
expect(vtac.offset).toBe(0);
|
|
128
|
+
});
|
|
129
|
+
it('clears ranges correctly for all deleteTo destinations', () => {
|
|
130
|
+
const vtac = new VTAC_1.VTAC();
|
|
131
|
+
vtac.backgroundColor = 0x11;
|
|
132
|
+
fillCell(vtac, 0, 0, 0xAA);
|
|
133
|
+
fillCell(vtac, 1, 0, 0xAA);
|
|
134
|
+
fillCell(vtac, 2, 0, 0xAA);
|
|
135
|
+
fillCell(vtac, 3, 0, 0xAA);
|
|
136
|
+
fillCell(vtac, 4, 0, 0xAA);
|
|
137
|
+
vtac.row = 0;
|
|
138
|
+
vtac.column = 2;
|
|
139
|
+
vtac.deleteTo('startOfLine');
|
|
140
|
+
expectCellColor(vtac, 0, 0, 0x11);
|
|
141
|
+
expectCellColor(vtac, 1, 0, 0x11);
|
|
142
|
+
expectCellColor(vtac, 2, 0, 0x11);
|
|
143
|
+
expectCellColor(vtac, 3, 0, 0xAA);
|
|
144
|
+
vtac.deleteTo('endOfLine');
|
|
145
|
+
expectCellColor(vtac, 2, 0, 0x11);
|
|
146
|
+
expectCellColor(vtac, 3, 0, 0x11);
|
|
147
|
+
expectCellColor(vtac, 4, 0, 0x11);
|
|
148
|
+
fillCell(vtac, 0, 0, 0xAA);
|
|
149
|
+
fillCell(vtac, 0, 1, 0xAA);
|
|
150
|
+
fillCell(vtac, 1, 1, 0xAA);
|
|
151
|
+
fillCell(vtac, 2, 1, 0xAA);
|
|
152
|
+
fillCell(vtac, 0, 2, 0xAA);
|
|
153
|
+
vtac.row = 1;
|
|
154
|
+
vtac.column = 1;
|
|
155
|
+
vtac.deleteTo('startOfScreen');
|
|
156
|
+
expectCellColor(vtac, 0, 0, 0x11);
|
|
157
|
+
expectCellColor(vtac, 0, 1, 0x11);
|
|
158
|
+
expectCellColor(vtac, 1, 1, 0x11);
|
|
159
|
+
expectCellColor(vtac, 2, 1, 0xAA);
|
|
160
|
+
vtac.deleteTo('endOfScreen');
|
|
161
|
+
expectCellColor(vtac, 1, 1, 0x11);
|
|
162
|
+
expectCellColor(vtac, 2, 1, 0x11);
|
|
163
|
+
expectCellColor(vtac, 0, 2, 0x11);
|
|
164
|
+
});
|
|
165
|
+
it('scrolls left/right/up/down and clears vacated cells', () => {
|
|
166
|
+
const vtac = new VTAC_1.VTAC();
|
|
167
|
+
vtac.backgroundColor = 0x05;
|
|
168
|
+
fillCell(vtac, 0, 0, 0x10);
|
|
169
|
+
fillCell(vtac, 1, 0, 0x20);
|
|
170
|
+
fillCell(vtac, 2, 0, 0x30);
|
|
171
|
+
vtac.scroll('left');
|
|
172
|
+
expectCellColor(vtac, 0, 0, 0x20);
|
|
173
|
+
expectCellColor(vtac, 1, 0, 0x30);
|
|
174
|
+
expectCellColor(vtac, VTAC_1.VTAC.COLUMNS - 1, 0, 0x05);
|
|
175
|
+
fillCell(vtac, 0, 0, 0x10);
|
|
176
|
+
fillCell(vtac, 1, 0, 0x20);
|
|
177
|
+
vtac.scroll('right');
|
|
178
|
+
expectCellColor(vtac, 1, 0, 0x10);
|
|
179
|
+
expectCellColor(vtac, 0, 0, 0x05);
|
|
180
|
+
fillCell(vtac, 0, 0, 0x60);
|
|
181
|
+
fillCell(vtac, 0, 1, 0x70);
|
|
182
|
+
vtac.scroll('up');
|
|
183
|
+
expectCellColor(vtac, 0, 0, 0x70);
|
|
184
|
+
expectCellColor(vtac, 0, VTAC_1.VTAC.ROWS - 1, 0x05);
|
|
185
|
+
fillCell(vtac, 0, 0, 0x80);
|
|
186
|
+
fillCell(vtac, 0, 1, 0x90);
|
|
187
|
+
vtac.scroll('down');
|
|
188
|
+
expectCellColor(vtac, 0, 1, 0x80);
|
|
189
|
+
expectCellColor(vtac, 0, 0, 0x05);
|
|
190
|
+
});
|
|
191
|
+
it('handles cursor movement bounds and delete operation', () => {
|
|
192
|
+
const vtac = new VTAC_1.VTAC();
|
|
193
|
+
vtac.offset = 7;
|
|
194
|
+
vtac.column = 0;
|
|
195
|
+
vtac.cursor('left');
|
|
196
|
+
expect(vtac.column).toBe(0);
|
|
197
|
+
expect(vtac.offset).toBe(0);
|
|
198
|
+
vtac.column = VTAC_1.VTAC.COLUMNS - 1;
|
|
199
|
+
vtac.cursor('right');
|
|
200
|
+
expect(vtac.column).toBe(VTAC_1.VTAC.COLUMNS - 1);
|
|
201
|
+
vtac.row = 0;
|
|
202
|
+
vtac.cursor('up');
|
|
203
|
+
expect(vtac.row).toBe(0);
|
|
204
|
+
vtac.row = VTAC_1.VTAC.ROWS - 1;
|
|
205
|
+
vtac.cursor('down');
|
|
206
|
+
expect(vtac.row).toBe(VTAC_1.VTAC.ROWS - 1);
|
|
207
|
+
vtac.backgroundColor = 0x44;
|
|
208
|
+
fillCell(vtac, 2, 2, 0x99);
|
|
209
|
+
vtac.column = 2;
|
|
210
|
+
vtac.row = 2;
|
|
211
|
+
vtac.delete();
|
|
212
|
+
expectCellColor(vtac, 2, 2, 0x44);
|
|
213
|
+
});
|
|
214
|
+
it('dispatches data insertion by mode', () => {
|
|
215
|
+
const vtac = new VTAC_1.VTAC();
|
|
216
|
+
const textSpy = jest.spyOn(vtac, 'insertTextData');
|
|
217
|
+
const graphicsSpy = jest.spyOn(vtac, 'insertGraphicsData');
|
|
218
|
+
vtac.mode = 'text';
|
|
219
|
+
vtac.data(0x41);
|
|
220
|
+
expect(textSpy).toHaveBeenCalledWith(0x41);
|
|
221
|
+
vtac.mode = 'graphics';
|
|
222
|
+
vtac.data(0xAA);
|
|
223
|
+
expect(graphicsSpy).toHaveBeenCalledWith(0xAA);
|
|
224
|
+
});
|
|
225
|
+
it('renders text data, advances cursor, wraps, and scrolls at screen end', () => {
|
|
226
|
+
const vtac = new VTAC_1.VTAC();
|
|
227
|
+
const scrollSpy = jest.spyOn(vtac, 'scroll');
|
|
228
|
+
vtac.foregroundColor = 0xF0;
|
|
229
|
+
vtac.backgroundColor = 0x0F;
|
|
230
|
+
vtac.insertTextData(0x41);
|
|
231
|
+
expect(vtac.column).toBe(1);
|
|
232
|
+
expect(vtac.row).toBe(0);
|
|
233
|
+
expect(vtac.offset).toBe(0);
|
|
234
|
+
const renderedPixels = Array.from({ length: 64 }, (_, index) => {
|
|
235
|
+
const x = index % 8;
|
|
236
|
+
const y = Math.floor(index / 8);
|
|
237
|
+
return vtac.buffer[pixelIndex(0, 0, x, y)];
|
|
238
|
+
});
|
|
239
|
+
expect(renderedPixels.some((color) => color === 0xF0)).toBe(true);
|
|
240
|
+
expect(renderedPixels.some((color) => color === 0x0F)).toBe(true);
|
|
241
|
+
vtac.column = VTAC_1.VTAC.COLUMNS - 1;
|
|
242
|
+
vtac.row = 0;
|
|
243
|
+
vtac.insertTextData(0x41);
|
|
244
|
+
expect(vtac.column).toBe(0);
|
|
245
|
+
expect(vtac.row).toBe(1);
|
|
246
|
+
vtac.column = VTAC_1.VTAC.COLUMNS - 1;
|
|
247
|
+
vtac.row = VTAC_1.VTAC.ROWS - 1;
|
|
248
|
+
vtac.insertTextData(0x41);
|
|
249
|
+
expect(vtac.column).toBe(0);
|
|
250
|
+
expect(vtac.row).toBe(VTAC_1.VTAC.ROWS - 1);
|
|
251
|
+
expect(scrollSpy).toHaveBeenCalledWith('up');
|
|
252
|
+
});
|
|
253
|
+
it('renders graphics data rows and wraps offset, column, and row', () => {
|
|
254
|
+
const vtac = new VTAC_1.VTAC();
|
|
255
|
+
vtac.foregroundColor = 0xE1;
|
|
256
|
+
vtac.backgroundColor = 0x1E;
|
|
257
|
+
vtac.insertGraphicsData(0b10100000);
|
|
258
|
+
expect(vtac.buffer[pixelIndex(0, 0, 0, 0)]).toBe(0xE1);
|
|
259
|
+
expect(vtac.buffer[pixelIndex(0, 0, 1, 0)]).toBe(0x1E);
|
|
260
|
+
expect(vtac.buffer[pixelIndex(0, 0, 2, 0)]).toBe(0xE1);
|
|
261
|
+
expect(vtac.offset).toBe(1);
|
|
262
|
+
vtac.column = VTAC_1.VTAC.COLUMNS - 1;
|
|
263
|
+
vtac.row = VTAC_1.VTAC.ROWS - 1;
|
|
264
|
+
vtac.offset = 7;
|
|
265
|
+
vtac.insertGraphicsData(0xFF);
|
|
266
|
+
expect(vtac.offset).toBe(0);
|
|
267
|
+
expect(vtac.column).toBe(0);
|
|
268
|
+
expect(vtac.row).toBe(0);
|
|
269
|
+
});
|
|
270
|
+
it('copies and clears 8x8 character cells', () => {
|
|
271
|
+
const vtac = new VTAC_1.VTAC();
|
|
272
|
+
vtac.backgroundColor = 0x33;
|
|
273
|
+
fillCell(vtac, 3, 3, 0xA5);
|
|
274
|
+
fillCell(vtac, 4, 4, 0x5A);
|
|
275
|
+
vtac.copyCharacterCell(3, 3, 4, 4);
|
|
276
|
+
expectCellColor(vtac, 4, 4, 0xA5);
|
|
277
|
+
vtac.clearCharacterCell(4, 4);
|
|
278
|
+
expectCellColor(vtac, 4, 4, 0x33);
|
|
279
|
+
});
|
|
280
|
+
it('honors parse next-byte state handlers', () => {
|
|
281
|
+
const vtac = new VTAC_1.VTAC();
|
|
282
|
+
const dataSpy = jest.spyOn(vtac, 'data');
|
|
283
|
+
vtac.cursorCharNextByte = true;
|
|
284
|
+
vtac.parse(0x5A);
|
|
285
|
+
expect(vtac.cursorChar).toBe(0x5A);
|
|
286
|
+
expect(vtac.cursorCharNextByte).toBe(false);
|
|
287
|
+
vtac.columnNextByte = true;
|
|
288
|
+
vtac.parse(0x99);
|
|
289
|
+
expect(vtac.column).toBe(0x99 % VTAC_1.VTAC.COLUMNS);
|
|
290
|
+
expect(vtac.columnNextByte).toBe(false);
|
|
291
|
+
vtac.rowNextByte = true;
|
|
292
|
+
vtac.parse(0x77);
|
|
293
|
+
expect(vtac.row).toBe(0x77 % VTAC_1.VTAC.ROWS);
|
|
294
|
+
expect(vtac.rowNextByte).toBe(false);
|
|
295
|
+
vtac.bellDurationNextByte = true;
|
|
296
|
+
vtac.parse(0x1C);
|
|
297
|
+
expect(vtac.bellDuration).toBe(0x1C);
|
|
298
|
+
expect(vtac.bellDurationNextByte).toBe(false);
|
|
299
|
+
vtac.bellFrequencyNextByte = true;
|
|
300
|
+
vtac.parse(0x2E);
|
|
301
|
+
expect(vtac.bellFrequency).toBe(0x2E);
|
|
302
|
+
expect(vtac.bellFrequencyNextByte).toBe(false);
|
|
303
|
+
vtac.foregroundColorNextByte = true;
|
|
304
|
+
vtac.parse(0xAA);
|
|
305
|
+
expect(vtac.foregroundColor).toBe(0xAA);
|
|
306
|
+
expect(vtac.foregroundColorNextByte).toBe(false);
|
|
307
|
+
vtac.backgroundColorNextByte = true;
|
|
308
|
+
vtac.parse(0xBB);
|
|
309
|
+
expect(vtac.backgroundColor).toBe(0xBB);
|
|
310
|
+
expect(vtac.backgroundColorNextByte).toBe(false);
|
|
311
|
+
vtac.dataNextByte = true;
|
|
312
|
+
vtac.parse(0x00);
|
|
313
|
+
expect(dataSpy).toHaveBeenCalledWith(0x00);
|
|
314
|
+
expect(vtac.dataNextByte).toBe(false);
|
|
315
|
+
});
|
|
316
|
+
it('routes parse command bytes to the expected operations', () => {
|
|
317
|
+
const vtac = new VTAC_1.VTAC();
|
|
318
|
+
const resetSpy = jest.spyOn(vtac, 'reset');
|
|
319
|
+
const bellSpy = jest.spyOn(vtac, 'bell');
|
|
320
|
+
const backspaceSpy = jest.spyOn(vtac, 'backspace');
|
|
321
|
+
const tabSpy = jest.spyOn(vtac, 'tab');
|
|
322
|
+
const lineFeedSpy = jest.spyOn(vtac, 'lineFeed');
|
|
323
|
+
const carriageReturnSpy = jest.spyOn(vtac, 'carriageReturn');
|
|
324
|
+
const deleteToSpy = jest.spyOn(vtac, 'deleteTo');
|
|
325
|
+
const scrollSpy = jest.spyOn(vtac, 'scroll');
|
|
326
|
+
const cursorSpy = jest.spyOn(vtac, 'cursor');
|
|
327
|
+
const dataSpy = jest.spyOn(vtac, 'data');
|
|
328
|
+
const deleteSpy = jest.spyOn(vtac, 'delete');
|
|
329
|
+
vtac.column = 5;
|
|
330
|
+
vtac.row = 6;
|
|
331
|
+
vtac.offset = 7;
|
|
332
|
+
vtac.parse(0x01);
|
|
333
|
+
expect(vtac.column).toBe(0);
|
|
334
|
+
expect(vtac.row).toBe(0);
|
|
335
|
+
expect(vtac.offset).toBe(0);
|
|
336
|
+
vtac.parse(0x02);
|
|
337
|
+
expect(vtac.cursorCharNextByte).toBe(true);
|
|
338
|
+
vtac.parse(0x5A);
|
|
339
|
+
expect(vtac.cursorChar).toBe(0x5A);
|
|
340
|
+
vtac.parse(0x03);
|
|
341
|
+
expect(vtac.cursorMode).toBe('blinking');
|
|
342
|
+
vtac.parse(0x04);
|
|
343
|
+
expect(resetSpy).toHaveBeenCalled();
|
|
344
|
+
vtac.parse(0x05);
|
|
345
|
+
expect(vtac.bellDurationNextByte).toBe(true);
|
|
346
|
+
vtac.parse(0x10);
|
|
347
|
+
expect(vtac.bellDuration).toBe(0x10);
|
|
348
|
+
vtac.parse(0x06);
|
|
349
|
+
expect(vtac.bellFrequencyNextByte).toBe(true);
|
|
350
|
+
vtac.parse(0x2E);
|
|
351
|
+
expect(vtac.bellFrequency).toBe(0x2E);
|
|
352
|
+
vtac.parse(0x07);
|
|
353
|
+
expect(bellSpy).toHaveBeenCalled();
|
|
354
|
+
vtac.parse(0x08);
|
|
355
|
+
expect(backspaceSpy).toHaveBeenCalled();
|
|
356
|
+
vtac.parse(0x09);
|
|
357
|
+
expect(tabSpy).toHaveBeenCalled();
|
|
358
|
+
vtac.parse(0x0A);
|
|
359
|
+
expect(lineFeedSpy).toHaveBeenCalled();
|
|
360
|
+
const modeBefore = vtac.mode;
|
|
361
|
+
vtac.parse(0x0B);
|
|
362
|
+
expect(vtac.mode).not.toBe(modeBefore);
|
|
363
|
+
vtac.backgroundColor = 0x24;
|
|
364
|
+
vtac.buffer.fill(0xFF);
|
|
365
|
+
vtac.parse(0x0C);
|
|
366
|
+
expect(vtac.buffer.every((value) => value === 0x24)).toBe(true);
|
|
367
|
+
vtac.parse(0x0D);
|
|
368
|
+
expect(carriageReturnSpy).toHaveBeenCalled();
|
|
369
|
+
vtac.parse(0x0E);
|
|
370
|
+
expect(vtac.columnNextByte).toBe(true);
|
|
371
|
+
vtac.parse(0x21);
|
|
372
|
+
expect(vtac.column).toBe(0x21 % VTAC_1.VTAC.COLUMNS);
|
|
373
|
+
vtac.parse(0x0F);
|
|
374
|
+
expect(vtac.rowNextByte).toBe(true);
|
|
375
|
+
vtac.parse(0x22);
|
|
376
|
+
expect(vtac.row).toBe(0x22 % VTAC_1.VTAC.ROWS);
|
|
377
|
+
vtac.parse(0x10);
|
|
378
|
+
vtac.parse(0x11);
|
|
379
|
+
vtac.parse(0x12);
|
|
380
|
+
vtac.parse(0x13);
|
|
381
|
+
expect(deleteToSpy).toHaveBeenCalledWith('startOfLine');
|
|
382
|
+
expect(deleteToSpy).toHaveBeenCalledWith('endOfLine');
|
|
383
|
+
expect(deleteToSpy).toHaveBeenCalledWith('startOfScreen');
|
|
384
|
+
expect(deleteToSpy).toHaveBeenCalledWith('endOfScreen');
|
|
385
|
+
vtac.parse(0x14);
|
|
386
|
+
vtac.parse(0x15);
|
|
387
|
+
vtac.parse(0x16);
|
|
388
|
+
vtac.parse(0x17);
|
|
389
|
+
expect(scrollSpy).toHaveBeenCalledWith('left');
|
|
390
|
+
expect(scrollSpy).toHaveBeenCalledWith('right');
|
|
391
|
+
expect(scrollSpy).toHaveBeenCalledWith('up');
|
|
392
|
+
expect(scrollSpy).toHaveBeenCalledWith('down');
|
|
393
|
+
vtac.parse(0x18);
|
|
394
|
+
expect(vtac.foregroundColorNextByte).toBe(true);
|
|
395
|
+
vtac.parse(0xAB);
|
|
396
|
+
expect(vtac.foregroundColor).toBe(0xAB);
|
|
397
|
+
vtac.parse(0x19);
|
|
398
|
+
expect(vtac.backgroundColorNextByte).toBe(true);
|
|
399
|
+
vtac.parse(0xBC);
|
|
400
|
+
expect(vtac.backgroundColor).toBe(0xBC);
|
|
401
|
+
vtac.parse(0x1A);
|
|
402
|
+
expect(vtac.dataNextByte).toBe(true);
|
|
403
|
+
vtac.parse(0x00);
|
|
404
|
+
expect(vtac.dataNextByte).toBe(false);
|
|
405
|
+
const preEscColumn = vtac.column;
|
|
406
|
+
const preEscRow = vtac.row;
|
|
407
|
+
vtac.parse(0x1B);
|
|
408
|
+
expect(vtac.column).toBe(preEscColumn);
|
|
409
|
+
expect(vtac.row).toBe(preEscRow);
|
|
410
|
+
vtac.parse(0x1C);
|
|
411
|
+
vtac.parse(0x1D);
|
|
412
|
+
vtac.parse(0x1E);
|
|
413
|
+
vtac.parse(0x1F);
|
|
414
|
+
expect(cursorSpy).toHaveBeenCalledWith('left');
|
|
415
|
+
expect(cursorSpy).toHaveBeenCalledWith('right');
|
|
416
|
+
expect(cursorSpy).toHaveBeenCalledWith('up');
|
|
417
|
+
expect(cursorSpy).toHaveBeenCalledWith('down');
|
|
418
|
+
vtac.parse(0x20);
|
|
419
|
+
vtac.parse(0x80);
|
|
420
|
+
expect(dataSpy).toHaveBeenCalledWith(0x20);
|
|
421
|
+
expect(dataSpy).toHaveBeenCalledWith(0x80);
|
|
422
|
+
vtac.parse(0x7F);
|
|
423
|
+
expect(deleteSpy).toHaveBeenCalled();
|
|
424
|
+
const preDefaultColumn = vtac.column;
|
|
425
|
+
const preDefaultRow = vtac.row;
|
|
426
|
+
vtac.parse(0x100);
|
|
427
|
+
expect(vtac.column).toBe(preDefaultColumn);
|
|
428
|
+
expect(vtac.row).toBe(preDefaultRow);
|
|
429
|
+
vtac.parse(0x00);
|
|
430
|
+
expect(vtac.column).toBe(vtac.column);
|
|
431
|
+
});
|
|
432
|
+
});
|
|
433
|
+
//# sourceMappingURL=VTAC.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VTAC.test.js","sourceRoot":"","sources":["../../src/VTAC/VTAC.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ const fs_1 = require("fs");
|
|
|
10
10
|
const sdl_1 = __importDefault(require("@kmamal/sdl"));
|
|
11
11
|
const serialport_1 = require("serialport");
|
|
12
12
|
const VTAC_1 = require("./VTAC/VTAC");
|
|
13
|
-
const VERSION = '1.2.
|
|
13
|
+
const VERSION = '1.2.1';
|
|
14
14
|
// Parse command line arguments
|
|
15
15
|
const program = new commander_1.Command();
|
|
16
16
|
program.showHelpAfterError();
|
|
@@ -19,7 +19,7 @@ program
|
|
|
19
19
|
.description('A fantasy ASCII terminal emulator.')
|
|
20
20
|
.version(VERSION, '-v, --version', 'Output the current version')
|
|
21
21
|
.helpOption('-h, --help', 'Output help / options')
|
|
22
|
-
.option('-p, --
|
|
22
|
+
.option('-p, --port <port>', 'Path to the serial port (e.g., /dev/ttyUSB0)')
|
|
23
23
|
.option('-b, --baudrate <baudrate>', 'Baud Rate', '9600')
|
|
24
24
|
.option('-a, --parity <parity>', 'Parity (odd | even | none)', 'none')
|
|
25
25
|
.option('-d, --databits <databits>', 'Data Bits (5 | 6 | 7 | 8)', '8')
|
|
@@ -31,13 +31,11 @@ program
|
|
|
31
31
|
.parse(process.argv);
|
|
32
32
|
const options = program.opts();
|
|
33
33
|
// Serial port configuration
|
|
34
|
-
const
|
|
34
|
+
const port = options.port;
|
|
35
35
|
const baudRate = parseInt(options.baudrate);
|
|
36
36
|
const parity = options.parity;
|
|
37
37
|
const dataBits = parseInt(options.databits);
|
|
38
38
|
const stopBits = parseFloat(options.stopbits);
|
|
39
|
-
const fullscreen = options.fullscreen;
|
|
40
|
-
const scale = parseInt(options.scale);
|
|
41
39
|
// Validate options
|
|
42
40
|
if (dataBits !== 5 && dataBits !== 6 && dataBits !== 7 && dataBits !== 8) {
|
|
43
41
|
console.log('Error: Invalid Data Bits');
|
|
@@ -47,14 +45,17 @@ if (stopBits !== 1 && stopBits !== 1.5 && stopBits !== 2) {
|
|
|
47
45
|
console.log('Error: Invalid Stop Bits');
|
|
48
46
|
process.exit(1);
|
|
49
47
|
}
|
|
48
|
+
// Display options
|
|
49
|
+
const fullscreen = options.fullscreen;
|
|
50
|
+
const scale = parseInt(options.scale);
|
|
50
51
|
// Create VTAC instance
|
|
51
52
|
const vtac = new VTAC_1.VTAC();
|
|
52
53
|
// Serial port instance
|
|
53
|
-
let
|
|
54
|
+
let serialPort;
|
|
54
55
|
// Setup serial port connection
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
path:
|
|
56
|
+
if (port) {
|
|
57
|
+
serialPort = new serialport_1.SerialPort({
|
|
58
|
+
path: port,
|
|
58
59
|
baudRate: baudRate,
|
|
59
60
|
parity: parity,
|
|
60
61
|
dataBits: dataBits,
|
|
@@ -64,7 +65,7 @@ if (serialPath) {
|
|
|
64
65
|
console.log('Error: ', err.message);
|
|
65
66
|
}
|
|
66
67
|
});
|
|
67
|
-
|
|
68
|
+
serialPort.on('data', (data) => {
|
|
68
69
|
for (let i = 0; i < data.length; i++) {
|
|
69
70
|
vtac.parse(data[i]);
|
|
70
71
|
}
|
|
@@ -102,7 +103,7 @@ const window = sdl_1.default.video.createWindow({
|
|
|
102
103
|
});
|
|
103
104
|
// Handle window keyboard events
|
|
104
105
|
window.on('keyDown', (event) => {
|
|
105
|
-
if (!
|
|
106
|
+
if (!serialPort || !serialPort.isOpen)
|
|
106
107
|
return;
|
|
107
108
|
let code;
|
|
108
109
|
switch (event.key) {
|
|
@@ -114,7 +115,7 @@ window.on('keyDown', (event) => {
|
|
|
114
115
|
break;
|
|
115
116
|
case 'enter':
|
|
116
117
|
case 'return':
|
|
117
|
-
|
|
118
|
+
serialPort.write([0x0D, 0x0A], 'hex');
|
|
118
119
|
return;
|
|
119
120
|
case 'escape':
|
|
120
121
|
code = 0x1B;
|
|
@@ -138,26 +139,26 @@ window.on('keyDown', (event) => {
|
|
|
138
139
|
break;
|
|
139
140
|
}
|
|
140
141
|
if (code !== undefined) {
|
|
141
|
-
|
|
142
|
+
serialPort.write([code], 'hex');
|
|
142
143
|
}
|
|
143
144
|
});
|
|
144
145
|
// Handle window text input events
|
|
145
146
|
window.on('textInput', (event) => {
|
|
146
|
-
if (!
|
|
147
|
+
if (!serialPort || !serialPort.isOpen)
|
|
147
148
|
return;
|
|
148
149
|
// Convert text to ASCII code
|
|
149
150
|
const text = event.text;
|
|
150
151
|
if (text.length === 1) {
|
|
151
152
|
const code = text.charCodeAt(0);
|
|
152
153
|
if (code >= 0x20 && code <= 0x7E) {
|
|
153
|
-
|
|
154
|
+
serialPort.write([code], 'hex');
|
|
154
155
|
}
|
|
155
156
|
}
|
|
156
157
|
});
|
|
157
158
|
// Handle window close
|
|
158
159
|
window.on('close', () => {
|
|
159
|
-
if (
|
|
160
|
-
|
|
160
|
+
if (serialPort && serialPort.isOpen) {
|
|
161
|
+
serialPort.close();
|
|
161
162
|
}
|
|
162
163
|
});
|
|
163
164
|
// Audio playback function
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,oDAA2B;AAC3B,yCAAmC;AACnC,2BAAiC;AACjC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,oDAA2B;AAC3B,yCAAmC;AACnC,2BAAiC;AACjC,sDAA6B;AAC7B,2CAAuC;AACvC,sCAAkC;AAElC,MAAM,OAAO,GAAG,OAAO,CAAA;AAEvB,+BAA+B;AAC/B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAA;AAC7B,OAAO,CAAC,kBAAkB,EAAE,CAAA;AAC5B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC;KAC/D,UAAU,CAAC,YAAY,EAAE,uBAAuB,CAAC;KACjD,MAAM,CAAC,mBAAmB,EAAE,8CAA8C,CAAC;KAC3E,MAAM,CAAC,2BAA2B,EAAE,WAAW,EAAE,MAAM,CAAC;KACxD,MAAM,CAAC,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,CAAC;KACrE,MAAM,CAAC,2BAA2B,EAAE,2BAA2B,EAAE,GAAG,CAAC;KACrE,MAAM,CAAC,2BAA2B,EAAE,yBAAyB,EAAE,GAAG,CAAC;KACnE,MAAM,CAAC,kBAAkB,EAAE,wBAAwB,EAAE,KAAK,CAAC;KAC3D,MAAM,CAAC,qBAAqB,EAAE,OAAO,EAAE,GAAG,CAAC;KAC3C,MAAM,CAAC,mBAAmB,EAAE,oDAAoD,CAAC;KACjF,WAAW,CAAC,WAAW,EAAE,gBAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,YAAY,OAAO,yBAAyB,CAAC;KAC7H,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAEtB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;AAE9B,4BAA4B;AAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;AACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;AAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAiC,CAAA;AACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAkB,CAAA;AAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAgB,CAAA;AAE5D,mBAAmB;AACnB,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AACD,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,kBAAkB;AAClB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAA;AACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAErC,uBAAuB;AACvB,MAAM,IAAI,GAAG,IAAI,WAAI,EAAE,CAAA;AAEvB,uBAAuB;AACvB,IAAI,UAAkC,CAAA;AAEtC,+BAA+B;AAC/B,IAAI,IAAI,EAAE,CAAC;IACT,UAAU,GAAG,IAAI,uBAAU,CAAC;QAC1B,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,QAAQ;KACnB,EAAE,CAAC,GAAG,EAAE,EAAE;QACT,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;QACrC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAyB,EAAE,EAAE;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACrB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,yBAAyB;AACzB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,iBAAY,EAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAA;IACzC,CAAC;AACH,CAAC;AAED,uBAAuB;AACvB,IAAI,aAAa,GAAG,KAAK,CAAA;AACzB,IAAI,eAAe,GAAQ,SAAS,CAAA;AAEpC,kBAAkB;AAClB,IAAI,cAAc,GAAG,CAAC,CAAA;AACtB,MAAM,eAAe,GAAG,IAAI,GAAG,EAAE,CAAA,CAAC,6BAA6B;AAE/D,yBAAyB;AACzB,IAAI,eAAe,GAAG,CAAC,CAAA;AACvB,IAAI,aAAa,GAAG,IAAI,CAAA;AACxB,MAAM,mBAAmB,GAAG,GAAG,CAAA,CAAC,uCAAuC;AAEvE,gBAAgB;AAChB,MAAM,MAAM,GAAG,aAAG,CAAC,KAAK,CAAC,YAAY,CAAC;IACpC,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,WAAI,CAAC,KAAK,GAAG,KAAK;IACzB,MAAM,EAAE,WAAI,CAAC,MAAM,GAAG,KAAK;IAC3B,UAAU,EAAE,UAAU;IACtB,SAAS,EAAE,KAAK;CACjB,CAAC,CAAA;AAEF,gCAAgC;AAChC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAgC,EAAE,EAAE;IACxD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,OAAM;IAE7C,IAAI,IAAwB,CAAA;IAE5B,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;QAClB,KAAK,WAAW;YACd,IAAI,GAAG,IAAI,CAAA;YACX,MAAK;QACP,KAAK,KAAK;YACR,IAAI,GAAG,IAAI,CAAA;YACX,MAAK;QACP,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ;YACX,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;YACrC,OAAM;QACR,KAAK,QAAQ;YACX,IAAI,GAAG,IAAI,CAAA;YACX,MAAK;QACP,KAAK,MAAM;YACT,IAAI,GAAG,IAAI,CAAA;YACX,MAAK;QACP,KAAK,OAAO;YACV,IAAI,GAAG,IAAI,CAAA;YACX,MAAK;QACP,KAAK,IAAI;YACP,IAAI,GAAG,IAAI,CAAA;YACX,MAAK;QACP,KAAK,MAAM;YACT,IAAI,GAAG,IAAI,CAAA;YACX,MAAK;QACP,KAAK,QAAQ;YACX,IAAI,GAAG,IAAI,CAAA;YACX,MAAK;QACP;YACE,MAAK;IACT,CAAC;IAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;IACjC,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,kCAAkC;AAClC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAkC,EAAE,EAAE;IAC5D,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,OAAM;IAE7C,6BAA6B;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAC/B,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,sBAAsB;AACtB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;IACtB,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACpC,UAAU,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,0BAA0B;AAC1B,SAAS,QAAQ,CAAC,SAAiB,EAAE,QAAgB;IACnD,kBAAkB;IAClB,aAAa,GAAG,IAAI,CAAA;IAEpB,wCAAwC;IACxC,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,KAAK,CAAA;QACxB,eAAe,GAAG,aAAG,CAAC,KAAK,CAAC,UAAU,CACpC,EAAE,IAAI,EAAE,UAAU,EAAE,EACpB;YACE,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,IAAI,CAAC,iCAAiC;SACjD,CACF,CAAA;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,4DAA4D;YAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC9B,4BAA4B;YAC5B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;YACnB,aAAa,GAAG,KAAK,CAAA;YACrB,OAAM;QACR,CAAC;QAED,iBAAiB;QACjB,eAAe,CAAC,IAAI,EAAE,CAAA;IACxB,CAAC;IAED,uDAAuD;IACvD,MAAM,UAAU,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,IAAI,CAAA;IAEzC,6BAA6B;IAC7B,MAAM,UAAU,GAAG,KAAK,CAAA;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;IAC/D,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAA;IAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,6DAA6D;QAC7D,MAAM,IAAI,GAAG,CAAC,GAAG,UAAU,CAAA;QAC3B,MAAM,SAAS,GAAG,GAAG,CAAA,CAAC,yCAAyC;QAC/D,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAA;QAEjE,iDAAiD;QACjD,MAAM,eAAe,GAAG,UAAU,GAAG,GAAG,CAAA;QACxC,IAAI,CAAC,GAAG,eAAe,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,GAAG,eAAe,CAAC,CAAA;YAC3E,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IAEpD,qDAAqD;IACrD,UAAU,CAAC,GAAG,EAAE;QACd,gCAAgC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAEnC,IAAI,QAAQ,EAAE,CAAC;YACb,iBAAiB;YACjB,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,6CAA6C;YAC7C,aAAa,GAAG,KAAK,CAAA;YACrB,IAAI,eAAe,EAAE,CAAC;gBACpB,eAAe,CAAC,UAAU,EAAE,CAAA;gBAC5B,eAAe,CAAC,KAAK,EAAE,CAAA;gBACvB,eAAe,CAAC,KAAK,EAAE,CAAA;gBACvB,eAAe,GAAG,SAAS,CAAA;YAC7B,CAAC;QACH,CAAC;IACH,CAAC,EAAE,UAAU,CAAC,CAAA;AAChB,CAAC;AAED,iCAAiC;AACjC,SAAS,UAAU,CAAC,YAAiC;IACnD,MAAM,SAAS,GAAG,WAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAA;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IAEnC,6CAA6C;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,cAAc,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,WAAI,CAAC,KAAK,CAAA;QAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YACpC,uEAAuE;YACvE,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAA;YAC/D,YAAY,CAAC,cAAc,GAAG,WAAW,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA;QACxD,CAAC;IACH,CAAC;AACH,CAAC;AAED,mBAAmB;AACnB,SAAS,MAAM;IACb,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAAC,OAAM;IAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,MAAM,OAAO,GAAG,GAAG,GAAG,cAAc,CAAA;IAEpC,4BAA4B;IAC5B,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACnC,eAAe,IAAI,OAAO,CAAA;QAC1B,IAAI,eAAe,IAAI,mBAAmB,EAAE,CAAC;YAC3C,aAAa,GAAG,CAAC,aAAa,CAAA;YAC9B,eAAe,GAAG,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,IAAI,CAAA;IACtB,CAAC;IAED,iCAAiC;IACjC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAE7C,0DAA0D;IAC1D,IAAI,aAAa,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC9C,UAAU,CAAC,YAAY,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,WAAI,CAAC,KAAK,EAAE,WAAI,CAAC,MAAM,EAAE,WAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAA;IAE1E,cAAc,GAAG,GAAG,CAAA;IAEpB,mEAAmE;IACnE,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC/B,IAAI,IAAI,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,GAAG,UAAU,CAAC,CAAA;IAEvD,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAC3B,CAAC;AAED,oBAAoB;AACpB,MAAM,EAAE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vtac-terminal",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "A fantasy ASCII terminal emulator",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -37,15 +37,15 @@
|
|
|
37
37
|
"type": "commonjs",
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@kmamal/sdl": "^0.11.13",
|
|
40
|
-
"commander": "^14.0.
|
|
41
|
-
"figlet": "^1.
|
|
40
|
+
"commander": "^14.0.3",
|
|
41
|
+
"figlet": "^1.10.0",
|
|
42
42
|
"serialport": "^13.0.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/jest": "^30.0.0",
|
|
46
|
-
"@types/node": "^
|
|
46
|
+
"@types/node": "^25.3.0",
|
|
47
47
|
"jest": "^30.2.0",
|
|
48
|
-
"ts-jest": "^29.4.
|
|
48
|
+
"ts-jest": "^29.4.6",
|
|
49
49
|
"typescript": "^5.9.3"
|
|
50
50
|
}
|
|
51
51
|
}
|
package/src/index.ts
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
import figlet from 'figlet'
|
|
4
4
|
import { Command } from 'commander'
|
|
5
5
|
import { readFileSync } from 'fs'
|
|
6
|
-
import sdl
|
|
6
|
+
import sdl from '@kmamal/sdl'
|
|
7
7
|
import { SerialPort } from 'serialport'
|
|
8
8
|
import { VTAC } from './VTAC/VTAC'
|
|
9
9
|
|
|
10
|
-
const VERSION = '1.2.
|
|
10
|
+
const VERSION = '1.2.1'
|
|
11
11
|
|
|
12
12
|
// Parse command line arguments
|
|
13
13
|
const program = new Command()
|
|
@@ -17,7 +17,7 @@ program
|
|
|
17
17
|
.description('A fantasy ASCII terminal emulator.')
|
|
18
18
|
.version(VERSION, '-v, --version', 'Output the current version')
|
|
19
19
|
.helpOption('-h, --help', 'Output help / options')
|
|
20
|
-
.option('-p, --
|
|
20
|
+
.option('-p, --port <port>', 'Path to the serial port (e.g., /dev/ttyUSB0)')
|
|
21
21
|
.option('-b, --baudrate <baudrate>', 'Baud Rate', '9600')
|
|
22
22
|
.option('-a, --parity <parity>', 'Parity (odd | even | none)', 'none')
|
|
23
23
|
.option('-d, --databits <databits>', 'Data Bits (5 | 6 | 7 | 8)', '8')
|
|
@@ -31,13 +31,11 @@ program
|
|
|
31
31
|
const options = program.opts()
|
|
32
32
|
|
|
33
33
|
// Serial port configuration
|
|
34
|
-
const
|
|
34
|
+
const port = options.port
|
|
35
35
|
const baudRate = parseInt(options.baudrate)
|
|
36
36
|
const parity = options.parity as 'odd' | 'even' | 'none'
|
|
37
37
|
const dataBits = parseInt(options.databits) as 5 | 6 | 7 | 8
|
|
38
38
|
const stopBits = parseFloat(options.stopbits) as 1 | 1.5 | 2
|
|
39
|
-
const fullscreen = options.fullscreen
|
|
40
|
-
const scale = parseInt(options.scale)
|
|
41
39
|
|
|
42
40
|
// Validate options
|
|
43
41
|
if (dataBits !== 5 && dataBits !== 6 && dataBits !== 7 && dataBits !== 8) {
|
|
@@ -49,16 +47,20 @@ if (stopBits !== 1 && stopBits !== 1.5 && stopBits !== 2) {
|
|
|
49
47
|
process.exit(1)
|
|
50
48
|
}
|
|
51
49
|
|
|
50
|
+
// Display options
|
|
51
|
+
const fullscreen = options.fullscreen
|
|
52
|
+
const scale = parseInt(options.scale)
|
|
53
|
+
|
|
52
54
|
// Create VTAC instance
|
|
53
55
|
const vtac = new VTAC()
|
|
54
56
|
|
|
55
57
|
// Serial port instance
|
|
56
|
-
let
|
|
58
|
+
let serialPort: SerialPort | undefined
|
|
57
59
|
|
|
58
60
|
// Setup serial port connection
|
|
59
|
-
if (
|
|
60
|
-
|
|
61
|
-
path:
|
|
61
|
+
if (port) {
|
|
62
|
+
serialPort = new SerialPort({
|
|
63
|
+
path: port,
|
|
62
64
|
baudRate: baudRate,
|
|
63
65
|
parity: parity,
|
|
64
66
|
dataBits: dataBits,
|
|
@@ -69,7 +71,7 @@ if (serialPath) {
|
|
|
69
71
|
}
|
|
70
72
|
})
|
|
71
73
|
|
|
72
|
-
|
|
74
|
+
serialPort.on('data', (data: Buffer<ArrayBuffer>) => {
|
|
73
75
|
for (let i = 0; i < data.length; i++) {
|
|
74
76
|
vtac.parse(data[i])
|
|
75
77
|
}
|
|
@@ -112,7 +114,7 @@ const window = sdl.video.createWindow({
|
|
|
112
114
|
|
|
113
115
|
// Handle window keyboard events
|
|
114
116
|
window.on('keyDown', (event: sdl.Events.Window.KeyDown) => {
|
|
115
|
-
if (!
|
|
117
|
+
if (!serialPort || !serialPort.isOpen) return
|
|
116
118
|
|
|
117
119
|
let code: number | undefined
|
|
118
120
|
|
|
@@ -125,7 +127,7 @@ window.on('keyDown', (event: sdl.Events.Window.KeyDown) => {
|
|
|
125
127
|
break
|
|
126
128
|
case 'enter':
|
|
127
129
|
case 'return':
|
|
128
|
-
|
|
130
|
+
serialPort.write([0x0D, 0x0A], 'hex')
|
|
129
131
|
return
|
|
130
132
|
case 'escape':
|
|
131
133
|
code = 0x1B
|
|
@@ -150,28 +152,28 @@ window.on('keyDown', (event: sdl.Events.Window.KeyDown) => {
|
|
|
150
152
|
}
|
|
151
153
|
|
|
152
154
|
if (code !== undefined) {
|
|
153
|
-
|
|
155
|
+
serialPort.write([code], 'hex')
|
|
154
156
|
}
|
|
155
157
|
})
|
|
156
158
|
|
|
157
159
|
// Handle window text input events
|
|
158
160
|
window.on('textInput', (event: sdl.Events.Window.TextInput) => {
|
|
159
|
-
if (!
|
|
161
|
+
if (!serialPort || !serialPort.isOpen) return
|
|
160
162
|
|
|
161
163
|
// Convert text to ASCII code
|
|
162
164
|
const text = event.text
|
|
163
165
|
if (text.length === 1) {
|
|
164
166
|
const code = text.charCodeAt(0)
|
|
165
167
|
if (code >= 0x20 && code <= 0x7E) {
|
|
166
|
-
|
|
168
|
+
serialPort.write([code], 'hex')
|
|
167
169
|
}
|
|
168
170
|
}
|
|
169
171
|
})
|
|
170
172
|
|
|
171
173
|
// Handle window close
|
|
172
174
|
window.on('close', () => {
|
|
173
|
-
if (
|
|
174
|
-
|
|
175
|
+
if (serialPort && serialPort.isOpen) {
|
|
176
|
+
serialPort.close()
|
|
175
177
|
}
|
|
176
178
|
})
|
|
177
179
|
|