esp32tool 1.0.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.
Files changed (115) hide show
  1. package/README.md +31 -0
  2. package/css/dark.css +156 -0
  3. package/css/light.css +156 -0
  4. package/css/style.css +870 -0
  5. package/dist/const.d.ts +277 -0
  6. package/dist/const.js +511 -0
  7. package/dist/esp_loader.d.ts +222 -0
  8. package/dist/esp_loader.js +1466 -0
  9. package/dist/index.d.ts +10 -0
  10. package/dist/index.js +15 -0
  11. package/dist/lib/spiffs/index.d.ts +15 -0
  12. package/dist/lib/spiffs/index.js +16 -0
  13. package/dist/lib/spiffs/spiffs.d.ts +26 -0
  14. package/dist/lib/spiffs/spiffs.js +132 -0
  15. package/dist/lib/spiffs/spiffsBlock.d.ts +36 -0
  16. package/dist/lib/spiffs/spiffsBlock.js +140 -0
  17. package/dist/lib/spiffs/spiffsConfig.d.ts +63 -0
  18. package/dist/lib/spiffs/spiffsConfig.js +79 -0
  19. package/dist/lib/spiffs/spiffsPage.d.ts +45 -0
  20. package/dist/lib/spiffs/spiffsPage.js +260 -0
  21. package/dist/lib/spiffs/spiffsReader.d.ts +19 -0
  22. package/dist/lib/spiffs/spiffsReader.js +192 -0
  23. package/dist/partition.d.ts +26 -0
  24. package/dist/partition.js +129 -0
  25. package/dist/struct.d.ts +2 -0
  26. package/dist/struct.js +91 -0
  27. package/dist/stubs/esp32.json +8 -0
  28. package/dist/stubs/esp32c2.json +8 -0
  29. package/dist/stubs/esp32c3.json +8 -0
  30. package/dist/stubs/esp32c5.json +8 -0
  31. package/dist/stubs/esp32c6.json +8 -0
  32. package/dist/stubs/esp32c61.json +8 -0
  33. package/dist/stubs/esp32h2.json +8 -0
  34. package/dist/stubs/esp32p4.json +8 -0
  35. package/dist/stubs/esp32p4r3.json +8 -0
  36. package/dist/stubs/esp32s2.json +8 -0
  37. package/dist/stubs/esp32s3.json +8 -0
  38. package/dist/stubs/esp8266.json +8 -0
  39. package/dist/stubs/index.d.ts +10 -0
  40. package/dist/stubs/index.js +56 -0
  41. package/dist/util.d.ts +14 -0
  42. package/dist/util.js +46 -0
  43. package/dist/wasm/filesystems.d.ts +33 -0
  44. package/dist/wasm/filesystems.js +114 -0
  45. package/dist/web/esp32-D955RjN9.js +16 -0
  46. package/dist/web/esp32c2-CJkxHDQi.js +16 -0
  47. package/dist/web/esp32c3-BhUHzH0o.js +16 -0
  48. package/dist/web/esp32c5-Chs0HtmA.js +16 -0
  49. package/dist/web/esp32c6-D6mPN6ut.js +16 -0
  50. package/dist/web/esp32c61-CQiYCWAs.js +16 -0
  51. package/dist/web/esp32h2-LsKJE9AS.js +16 -0
  52. package/dist/web/esp32p4-7nWC-HiD.js +16 -0
  53. package/dist/web/esp32p4r3-CwiPecZW.js +16 -0
  54. package/dist/web/esp32s2-CtqVheSJ.js +16 -0
  55. package/dist/web/esp32s3-CRbtB0QR.js +16 -0
  56. package/dist/web/esp8266-nEkNAo8K.js +16 -0
  57. package/dist/web/index.js +7265 -0
  58. package/electron/main.js +333 -0
  59. package/electron/preload.js +37 -0
  60. package/eslint.config.js +22 -0
  61. package/index.html +408 -0
  62. package/js/modules/esp32-D955RjN9.js +16 -0
  63. package/js/modules/esp32c2-CJkxHDQi.js +16 -0
  64. package/js/modules/esp32c3-BhUHzH0o.js +16 -0
  65. package/js/modules/esp32c5-Chs0HtmA.js +16 -0
  66. package/js/modules/esp32c6-D6mPN6ut.js +16 -0
  67. package/js/modules/esp32c61-CQiYCWAs.js +16 -0
  68. package/js/modules/esp32h2-LsKJE9AS.js +16 -0
  69. package/js/modules/esp32p4-7nWC-HiD.js +16 -0
  70. package/js/modules/esp32p4r3-CwiPecZW.js +16 -0
  71. package/js/modules/esp32s2-CtqVheSJ.js +16 -0
  72. package/js/modules/esp32s3-CRbtB0QR.js +16 -0
  73. package/js/modules/esp8266-nEkNAo8K.js +16 -0
  74. package/js/modules/esptool.js +7265 -0
  75. package/js/script.js +2237 -0
  76. package/js/utilities.js +182 -0
  77. package/license.md +11 -0
  78. package/package.json +61 -0
  79. package/script/build +12 -0
  80. package/script/develop +17 -0
  81. package/src/const.ts +599 -0
  82. package/src/esp_loader.ts +1907 -0
  83. package/src/index.ts +63 -0
  84. package/src/lib/spiffs/index.ts +22 -0
  85. package/src/lib/spiffs/spiffs.ts +175 -0
  86. package/src/lib/spiffs/spiffsBlock.ts +204 -0
  87. package/src/lib/spiffs/spiffsConfig.ts +140 -0
  88. package/src/lib/spiffs/spiffsPage.ts +357 -0
  89. package/src/lib/spiffs/spiffsReader.ts +280 -0
  90. package/src/partition.ts +155 -0
  91. package/src/struct.ts +108 -0
  92. package/src/stubs/README.md +3 -0
  93. package/src/stubs/esp32.json +8 -0
  94. package/src/stubs/esp32c2.json +8 -0
  95. package/src/stubs/esp32c3.json +8 -0
  96. package/src/stubs/esp32c5.json +8 -0
  97. package/src/stubs/esp32c6.json +8 -0
  98. package/src/stubs/esp32c61.json +8 -0
  99. package/src/stubs/esp32h2.json +8 -0
  100. package/src/stubs/esp32p4.json +8 -0
  101. package/src/stubs/esp32p4r3.json +8 -0
  102. package/src/stubs/esp32s2.json +8 -0
  103. package/src/stubs/esp32s3.json +8 -0
  104. package/src/stubs/esp8266.json +8 -0
  105. package/src/stubs/index.ts +86 -0
  106. package/src/util.ts +49 -0
  107. package/src/wasm/fatfs/fatfs.wasm +0 -0
  108. package/src/wasm/fatfs/index.d.ts +26 -0
  109. package/src/wasm/fatfs/index.js +343 -0
  110. package/src/wasm/filesystems.ts +156 -0
  111. package/src/wasm/littlefs/index.d.ts +83 -0
  112. package/src/wasm/littlefs/index.js +529 -0
  113. package/src/wasm/littlefs/littlefs.js +2 -0
  114. package/src/wasm/littlefs/littlefs.wasm +0 -0
  115. package/src/wasm/shared/types.ts +13 -0
@@ -0,0 +1,10 @@
1
+ import { Logger } from "./const";
2
+ import { ESPLoader } from "./esp_loader";
3
+ export type { Logger } from "./const";
4
+ export { ESPLoader } from "./esp_loader";
5
+ export { CHIP_FAMILY_ESP32, CHIP_FAMILY_ESP32S2, CHIP_FAMILY_ESP32S3, CHIP_FAMILY_ESP8266, CHIP_FAMILY_ESP32C2, CHIP_FAMILY_ESP32C3, CHIP_FAMILY_ESP32C5, CHIP_FAMILY_ESP32C6, CHIP_FAMILY_ESP32C61, CHIP_FAMILY_ESP32H2, CHIP_FAMILY_ESP32H4, CHIP_FAMILY_ESP32H21, CHIP_FAMILY_ESP32P4, CHIP_FAMILY_ESP32S31, } from "./const";
6
+ export declare const connect: (logger: Logger) => Promise<ESPLoader>;
7
+ export { parsePartitionTable, getPartitionTableOffset, formatSize, } from "./partition";
8
+ export type { Partition } from "./partition";
9
+ export { FilesystemType, detectFilesystemType, detectFilesystemFromImage, getDefaultBlockSize, getBlockSizeCandidates, LITTLEFS_DEFAULT_BLOCK_SIZE, LITTLEFS_BLOCK_SIZE_CANDIDATES, FATFS_DEFAULT_BLOCK_SIZE, FATFS_BLOCK_SIZE_CANDIDATES, } from "./wasm/filesystems";
10
+ export { SpiffsFS, SpiffsBuildConfig, SpiffsReader, DEFAULT_SPIFFS_CONFIG, type SpiffsFile, type SpiffsBuildConfigOptions, } from "./lib/spiffs/index";
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ /// <reference types="@types/w3c-web-serial" />
2
+ import { ESP_ROM_BAUD } from "./const";
3
+ import { ESPLoader } from "./esp_loader";
4
+ export { ESPLoader } from "./esp_loader";
5
+ export { CHIP_FAMILY_ESP32, CHIP_FAMILY_ESP32S2, CHIP_FAMILY_ESP32S3, CHIP_FAMILY_ESP8266, CHIP_FAMILY_ESP32C2, CHIP_FAMILY_ESP32C3, CHIP_FAMILY_ESP32C5, CHIP_FAMILY_ESP32C6, CHIP_FAMILY_ESP32C61, CHIP_FAMILY_ESP32H2, CHIP_FAMILY_ESP32H4, CHIP_FAMILY_ESP32H21, CHIP_FAMILY_ESP32P4, CHIP_FAMILY_ESP32S31, } from "./const";
6
+ export const connect = async (logger) => {
7
+ // - Request a port and open a connection.
8
+ const port = await navigator.serial.requestPort();
9
+ await port.open({ baudRate: ESP_ROM_BAUD });
10
+ logger.log("Connected successfully.");
11
+ return new ESPLoader(port, logger);
12
+ };
13
+ export { parsePartitionTable, getPartitionTableOffset, formatSize, } from "./partition";
14
+ export { FilesystemType, detectFilesystemType, detectFilesystemFromImage, getDefaultBlockSize, getBlockSizeCandidates, LITTLEFS_DEFAULT_BLOCK_SIZE, LITTLEFS_BLOCK_SIZE_CANDIDATES, FATFS_DEFAULT_BLOCK_SIZE, FATFS_BLOCK_SIZE_CANDIDATES, } from "./wasm/filesystems";
15
+ export { SpiffsFS, SpiffsBuildConfig, SpiffsReader, DEFAULT_SPIFFS_CONFIG, } from "./lib/spiffs/index";
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SPIFFS Module Entry Point
3
+ */
4
+ export { SpiffsFS, type SpiffsFile } from "./spiffs";
5
+ export { SpiffsBuildConfig, type SpiffsBuildConfigOptions, SpiffsFullError, } from "./spiffsConfig";
6
+ export { SpiffsReader } from "./spiffsReader";
7
+ export declare const DEFAULT_SPIFFS_CONFIG: {
8
+ pageSize: number;
9
+ blockSize: number;
10
+ objNameLen: number;
11
+ metaLen: number;
12
+ useMagic: boolean;
13
+ useMagicLen: boolean;
14
+ alignedObjIxTables: boolean;
15
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * SPIFFS Module Entry Point
3
+ */
4
+ export { SpiffsFS } from "./spiffs";
5
+ export { SpiffsBuildConfig, SpiffsFullError, } from "./spiffsConfig";
6
+ export { SpiffsReader } from "./spiffsReader";
7
+ // Default ESP32 SPIFFS configuration
8
+ export const DEFAULT_SPIFFS_CONFIG = {
9
+ pageSize: 256,
10
+ blockSize: 4096,
11
+ objNameLen: 32,
12
+ metaLen: 4,
13
+ useMagic: true,
14
+ useMagicLen: true,
15
+ alignedObjIxTables: false,
16
+ };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SPIFFS Filesystem Implementation
3
+ * Based on ESP-IDF spiffsgen.py
4
+ */
5
+ import { SpiffsBuildConfig } from "./spiffsConfig";
6
+ export interface SpiffsFile {
7
+ name: string;
8
+ size: number;
9
+ data: Uint8Array;
10
+ }
11
+ export declare class SpiffsFS {
12
+ private imgSize;
13
+ private buildConfig;
14
+ private blocks;
15
+ private blocksLim;
16
+ private remainingBlocks;
17
+ private curObjId;
18
+ constructor(imgSize: number, buildConfig: SpiffsBuildConfig);
19
+ private createBlock;
20
+ isFull(): boolean;
21
+ createFile(imgPath: string, contents: Uint8Array): void;
22
+ toBinary(): Uint8Array;
23
+ listFiles(): SpiffsFile[];
24
+ readFile(): Uint8Array;
25
+ deleteFile(): void;
26
+ }
@@ -0,0 +1,132 @@
1
+ /**
2
+ * SPIFFS Filesystem Implementation
3
+ * Based on ESP-IDF spiffsgen.py
4
+ */
5
+ import { SpiffsFullError } from "./spiffsConfig";
6
+ import { SpiffsBlock } from "./spiffsBlock";
7
+ export class SpiffsFS {
8
+ constructor(imgSize, buildConfig) {
9
+ if (imgSize % buildConfig.blockSize !== 0) {
10
+ throw new Error("image size should be a multiple of block size");
11
+ }
12
+ this.imgSize = imgSize;
13
+ this.buildConfig = buildConfig;
14
+ this.blocks = [];
15
+ this.blocksLim = Math.floor(this.imgSize / this.buildConfig.blockSize);
16
+ this.remainingBlocks = this.blocksLim;
17
+ this.curObjId = 1; // starting object id
18
+ }
19
+ createBlock() {
20
+ if (this.isFull()) {
21
+ throw new SpiffsFullError("the image size has been exceeded");
22
+ }
23
+ const block = new SpiffsBlock(this.blocks.length, this.buildConfig);
24
+ this.blocks.push(block);
25
+ this.remainingBlocks--;
26
+ return block;
27
+ }
28
+ isFull() {
29
+ return this.remainingBlocks <= 0;
30
+ }
31
+ createFile(imgPath, contents) {
32
+ if (imgPath.length > this.buildConfig.objNameLen) {
33
+ throw new Error(`object name '${imgPath}' too long`);
34
+ }
35
+ const name = imgPath;
36
+ let offset = 0;
37
+ try {
38
+ const block = this.blocks[this.blocks.length - 1];
39
+ block.beginObj(this.curObjId, contents.length, name);
40
+ }
41
+ catch {
42
+ const block = this.createBlock();
43
+ block.beginObj(this.curObjId, contents.length, name);
44
+ }
45
+ while (offset < contents.length) {
46
+ const chunkSize = Math.min(this.buildConfig.OBJ_DATA_PAGE_CONTENT_LEN, contents.length - offset);
47
+ const contentsChunk = contents.slice(offset, offset + chunkSize);
48
+ try {
49
+ const block = this.blocks[this.blocks.length - 1];
50
+ try {
51
+ block.updateObj(contentsChunk);
52
+ }
53
+ catch (e) {
54
+ if (e instanceof SpiffsFullError) {
55
+ if (block.isFull()) {
56
+ throw e;
57
+ }
58
+ // Object index exhausted, write another object index page
59
+ block.beginObj(this.curObjId, contents.length, name, block.currentObjIndexSpanIx, block.currentObjDataSpanIx);
60
+ continue;
61
+ }
62
+ throw e;
63
+ }
64
+ }
65
+ catch (e) {
66
+ if (e instanceof SpiffsFullError) {
67
+ // All pages in block exhausted, create new block
68
+ const prevBlock = this.blocks[this.blocks.length - 1];
69
+ const block = this.createBlock();
70
+ block.currentObjId = prevBlock.currentObjId;
71
+ block.currentObjIdxPage = prevBlock.currentObjIdxPage;
72
+ block.currentObjDataSpanIx = prevBlock.currentObjDataSpanIx;
73
+ block.currentObjIndexSpanIx = prevBlock.currentObjIndexSpanIx;
74
+ continue;
75
+ }
76
+ throw e;
77
+ }
78
+ offset += chunkSize;
79
+ }
80
+ const block = this.blocks[this.blocks.length - 1];
81
+ block.endObj();
82
+ this.curObjId++;
83
+ }
84
+ toBinary() {
85
+ const allBlocks = [];
86
+ for (const block of this.blocks) {
87
+ allBlocks.push(block.toBinary(this.blocksLim));
88
+ }
89
+ let bix = this.blocks.length;
90
+ let remaining = this.remainingBlocks;
91
+ if (this.buildConfig.useMagic) {
92
+ // Create empty blocks with magic numbers
93
+ while (remaining > 0) {
94
+ const block = new SpiffsBlock(bix, this.buildConfig);
95
+ allBlocks.push(block.toBinary(this.blocksLim));
96
+ remaining--;
97
+ bix++;
98
+ }
99
+ }
100
+ else {
101
+ // Fill remaining space with 0xFF
102
+ const remainingSize = this.imgSize - allBlocks.length * this.buildConfig.blockSize;
103
+ if (remainingSize > 0) {
104
+ const padding = new Uint8Array(remainingSize);
105
+ padding.fill(0xff);
106
+ allBlocks.push(padding);
107
+ }
108
+ }
109
+ // Concatenate all blocks
110
+ const totalSize = allBlocks.reduce((sum, block) => sum + block.length, 0);
111
+ const img = new Uint8Array(totalSize);
112
+ let offset = 0;
113
+ for (const block of allBlocks) {
114
+ img.set(block, offset);
115
+ offset += block.length;
116
+ }
117
+ return img;
118
+ }
119
+ listFiles() {
120
+ // This would require parsing the blocks - implement in fromBinary
121
+ throw new Error("listFiles requires fromBinary to be called first");
122
+ }
123
+ readFile() {
124
+ // This would require parsing the blocks - implement in fromBinary
125
+ throw new Error("readFile requires fromBinary to be called first");
126
+ }
127
+ deleteFile() {
128
+ // SPIFFS doesn't support in-place deletion
129
+ // Need to recreate filesystem without the file
130
+ throw new Error("deleteFile not yet implemented - requires filesystem recreation");
131
+ }
132
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * SPIFFS Block Class
3
+ * Based on ESP-IDF spiffsgen.py
4
+ */
5
+ import { SpiffsBuildConfig } from "./spiffsConfig";
6
+ import { SpiffsObjIndexPage } from "./spiffsPage";
7
+ export declare class SpiffsBlock {
8
+ private buildConfig;
9
+ private offset;
10
+ private remainingPages;
11
+ private pages;
12
+ private bix;
13
+ private luPages;
14
+ private luPageIter;
15
+ private luPage;
16
+ private curObjIndexSpanIx;
17
+ private curObjDataSpanIx;
18
+ private curObjId;
19
+ private curObjIdxPage;
20
+ constructor(bix: number, buildConfig: SpiffsBuildConfig);
21
+ private reset;
22
+ private registerPage;
23
+ beginObj(objId: number, size: number, name: string, objIndexSpanIx?: number, objDataSpanIx?: number): void;
24
+ updateObj(contents: Uint8Array): void;
25
+ endObj(): void;
26
+ isFull(): boolean;
27
+ toBinary(blocksLim: number): Uint8Array;
28
+ get currentObjIndexSpanIx(): number;
29
+ get currentObjDataSpanIx(): number;
30
+ get currentObjId(): number;
31
+ get currentObjIdxPage(): SpiffsObjIndexPage | null;
32
+ set currentObjId(value: number);
33
+ set currentObjIdxPage(value: SpiffsObjIndexPage | null);
34
+ set currentObjDataSpanIx(value: number);
35
+ set currentObjIndexSpanIx(value: number);
36
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * SPIFFS Block Class
3
+ * Based on ESP-IDF spiffsgen.py
4
+ */
5
+ import { SpiffsFullError } from "./spiffsConfig";
6
+ import { SpiffsObjLuPage, SpiffsObjIndexPage, SpiffsObjDataPage, } from "./spiffsPage";
7
+ export class SpiffsBlock {
8
+ constructor(bix, buildConfig) {
9
+ this.buildConfig = buildConfig;
10
+ this.offset = bix * this.buildConfig.blockSize;
11
+ this.remainingPages = this.buildConfig.OBJ_USABLE_PAGES_PER_BLOCK;
12
+ this.pages = [];
13
+ this.bix = bix;
14
+ this.luPages = [];
15
+ for (let i = 0; i < this.buildConfig.OBJ_LU_PAGES_PER_BLOCK; i++) {
16
+ const page = new SpiffsObjLuPage(this.bix, this.buildConfig);
17
+ this.luPages.push(page);
18
+ }
19
+ this.pages.push(...this.luPages);
20
+ this.luPageIter = this.luPages[Symbol.iterator]();
21
+ this.luPage = this.luPageIter.next().value || null;
22
+ this.curObjIndexSpanIx = 0;
23
+ this.curObjDataSpanIx = 0;
24
+ this.curObjId = 0;
25
+ this.curObjIdxPage = null;
26
+ }
27
+ reset() {
28
+ this.curObjIndexSpanIx = 0;
29
+ this.curObjDataSpanIx = 0;
30
+ this.curObjId = 0;
31
+ this.curObjIdxPage = null;
32
+ }
33
+ registerPage(page) {
34
+ if (page instanceof SpiffsObjDataPage) {
35
+ if (!this.curObjIdxPage) {
36
+ throw new Error("No current object index page");
37
+ }
38
+ this.curObjIdxPage.registerPage(page);
39
+ }
40
+ try {
41
+ if (!this.luPage) {
42
+ throw new SpiffsFullError();
43
+ }
44
+ this.luPage.registerPage(page);
45
+ }
46
+ catch (e) {
47
+ if (e instanceof SpiffsFullError) {
48
+ const next = this.luPageIter.next();
49
+ if (next.done) {
50
+ throw new Error("Invalid attempt to add page to a block when there is no more space in lookup");
51
+ }
52
+ this.luPage = next.value;
53
+ this.luPage.registerPage(page);
54
+ }
55
+ else {
56
+ throw e;
57
+ }
58
+ }
59
+ this.pages.push(page);
60
+ }
61
+ beginObj(objId, size, name, objIndexSpanIx = 0, objDataSpanIx = 0) {
62
+ if (this.remainingPages <= 0) {
63
+ throw new SpiffsFullError();
64
+ }
65
+ this.reset();
66
+ this.curObjId = objId;
67
+ this.curObjIndexSpanIx = objIndexSpanIx;
68
+ this.curObjDataSpanIx = objDataSpanIx;
69
+ const page = new SpiffsObjIndexPage(objId, this.curObjIndexSpanIx, size, name, this.buildConfig);
70
+ this.registerPage(page);
71
+ this.curObjIdxPage = page;
72
+ this.remainingPages--;
73
+ this.curObjIndexSpanIx++;
74
+ }
75
+ updateObj(contents) {
76
+ if (this.remainingPages <= 0) {
77
+ throw new SpiffsFullError();
78
+ }
79
+ const page = new SpiffsObjDataPage(this.offset + this.pages.length * this.buildConfig.pageSize, this.curObjId, this.curObjDataSpanIx, contents, this.buildConfig);
80
+ this.registerPage(page);
81
+ this.curObjDataSpanIx++;
82
+ this.remainingPages--;
83
+ }
84
+ endObj() {
85
+ this.reset();
86
+ }
87
+ isFull() {
88
+ return this.remainingPages <= 0;
89
+ }
90
+ toBinary(blocksLim) {
91
+ const img = new Uint8Array(this.buildConfig.blockSize);
92
+ img.fill(0xff);
93
+ let offset = 0;
94
+ if (this.buildConfig.useMagic) {
95
+ for (let idx = 0; idx < this.pages.length; idx++) {
96
+ const page = this.pages[idx];
97
+ if (idx === this.buildConfig.OBJ_LU_PAGES_PER_BLOCK - 1) {
98
+ if (page instanceof SpiffsObjLuPage) {
99
+ page.magicfy(blocksLim);
100
+ }
101
+ }
102
+ const pageBinary = page.toBinary();
103
+ img.set(pageBinary, offset);
104
+ offset += pageBinary.length;
105
+ }
106
+ }
107
+ else {
108
+ for (const page of this.pages) {
109
+ const pageBinary = page.toBinary();
110
+ img.set(pageBinary, offset);
111
+ offset += pageBinary.length;
112
+ }
113
+ }
114
+ return img;
115
+ }
116
+ get currentObjIndexSpanIx() {
117
+ return this.curObjIndexSpanIx;
118
+ }
119
+ get currentObjDataSpanIx() {
120
+ return this.curObjDataSpanIx;
121
+ }
122
+ get currentObjId() {
123
+ return this.curObjId;
124
+ }
125
+ get currentObjIdxPage() {
126
+ return this.curObjIdxPage;
127
+ }
128
+ set currentObjId(value) {
129
+ this.curObjId = value;
130
+ }
131
+ set currentObjIdxPage(value) {
132
+ this.curObjIdxPage = value;
133
+ }
134
+ set currentObjDataSpanIx(value) {
135
+ this.curObjDataSpanIx = value;
136
+ }
137
+ set currentObjIndexSpanIx(value) {
138
+ this.curObjIndexSpanIx = value;
139
+ }
140
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * SPIFFS Build Configuration
3
+ * Based on ESP-IDF spiffsgen.py
4
+ */
5
+ export declare const SPIFFS_PH_FLAG_USED_FINAL_INDEX = 248;
6
+ export declare const SPIFFS_PH_FLAG_USED_FINAL = 252;
7
+ export declare const SPIFFS_PH_FLAG_LEN = 1;
8
+ export declare const SPIFFS_PH_IX_SIZE_LEN = 4;
9
+ export declare const SPIFFS_PH_IX_OBJ_TYPE_LEN = 1;
10
+ export declare const SPIFFS_TYPE_FILE = 1;
11
+ export declare const SPIFFS_OBJ_ID_LEN = 2;
12
+ export declare const SPIFFS_SPAN_IX_LEN = 2;
13
+ export declare const SPIFFS_PAGE_IX_LEN = 2;
14
+ export declare const SPIFFS_BLOCK_IX_LEN = 2;
15
+ export interface SpiffsBuildConfigOptions {
16
+ pageSize: number;
17
+ blockSize: number;
18
+ objNameLen?: number;
19
+ metaLen?: number;
20
+ pageIxLen?: number;
21
+ blockIxLen?: number;
22
+ objIdLen?: number;
23
+ spanIxLen?: number;
24
+ packed?: boolean;
25
+ aligned?: boolean;
26
+ endianness?: "little" | "big";
27
+ useMagic?: boolean;
28
+ useMagicLen?: boolean;
29
+ alignedObjIxTables?: boolean;
30
+ }
31
+ export declare class SpiffsBuildConfig {
32
+ pageSize: number;
33
+ blockSize: number;
34
+ objIdLen: number;
35
+ spanIxLen: number;
36
+ packed: boolean;
37
+ aligned: boolean;
38
+ objNameLen: number;
39
+ metaLen: number;
40
+ pageIxLen: number;
41
+ blockIxLen: number;
42
+ endianness: "little" | "big";
43
+ useMagic: boolean;
44
+ useMagicLen: boolean;
45
+ alignedObjIxTables: boolean;
46
+ PAGES_PER_BLOCK: number;
47
+ OBJ_LU_PAGES_PER_BLOCK: number;
48
+ OBJ_USABLE_PAGES_PER_BLOCK: number;
49
+ OBJ_LU_PAGES_OBJ_IDS_LIM: number;
50
+ OBJ_DATA_PAGE_HEADER_LEN: number;
51
+ OBJ_DATA_PAGE_HEADER_LEN_ALIGNED: number;
52
+ OBJ_DATA_PAGE_HEADER_LEN_ALIGNED_PAD: number;
53
+ OBJ_DATA_PAGE_CONTENT_LEN: number;
54
+ OBJ_INDEX_PAGES_HEADER_LEN: number;
55
+ OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED: number;
56
+ OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED_PAD: number;
57
+ OBJ_INDEX_PAGES_OBJ_IDS_HEAD_LIM: number;
58
+ OBJ_INDEX_PAGES_OBJ_IDS_LIM: number;
59
+ constructor(options: SpiffsBuildConfigOptions);
60
+ }
61
+ export declare class SpiffsFullError extends Error {
62
+ constructor(message?: string);
63
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * SPIFFS Build Configuration
3
+ * Based on ESP-IDF spiffsgen.py
4
+ */
5
+ export const SPIFFS_PH_FLAG_USED_FINAL_INDEX = 0xf8;
6
+ export const SPIFFS_PH_FLAG_USED_FINAL = 0xfc;
7
+ export const SPIFFS_PH_FLAG_LEN = 1;
8
+ export const SPIFFS_PH_IX_SIZE_LEN = 4;
9
+ export const SPIFFS_PH_IX_OBJ_TYPE_LEN = 1;
10
+ export const SPIFFS_TYPE_FILE = 1;
11
+ // Based on typedefs under spiffs_config.h
12
+ export const SPIFFS_OBJ_ID_LEN = 2; // spiffs_obj_id
13
+ export const SPIFFS_SPAN_IX_LEN = 2; // spiffs_span_ix
14
+ export const SPIFFS_PAGE_IX_LEN = 2; // spiffs_page_ix
15
+ export const SPIFFS_BLOCK_IX_LEN = 2; // spiffs_block_ix
16
+ export class SpiffsBuildConfig {
17
+ constructor(options) {
18
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
19
+ if (options.blockSize % options.pageSize !== 0) {
20
+ throw new Error("block size should be a multiple of page size");
21
+ }
22
+ this.pageSize = options.pageSize;
23
+ this.blockSize = options.blockSize;
24
+ this.objIdLen = (_a = options.objIdLen) !== null && _a !== void 0 ? _a : SPIFFS_OBJ_ID_LEN;
25
+ this.spanIxLen = (_b = options.spanIxLen) !== null && _b !== void 0 ? _b : SPIFFS_SPAN_IX_LEN;
26
+ this.packed = (_c = options.packed) !== null && _c !== void 0 ? _c : true;
27
+ this.aligned = (_d = options.aligned) !== null && _d !== void 0 ? _d : true;
28
+ this.objNameLen = (_e = options.objNameLen) !== null && _e !== void 0 ? _e : 32;
29
+ this.metaLen = (_f = options.metaLen) !== null && _f !== void 0 ? _f : 4;
30
+ this.pageIxLen = (_g = options.pageIxLen) !== null && _g !== void 0 ? _g : SPIFFS_PAGE_IX_LEN;
31
+ this.blockIxLen = (_h = options.blockIxLen) !== null && _h !== void 0 ? _h : SPIFFS_BLOCK_IX_LEN;
32
+ this.endianness = (_j = options.endianness) !== null && _j !== void 0 ? _j : "little";
33
+ this.useMagic = (_k = options.useMagic) !== null && _k !== void 0 ? _k : true;
34
+ this.useMagicLen = (_l = options.useMagicLen) !== null && _l !== void 0 ? _l : true;
35
+ this.alignedObjIxTables = (_m = options.alignedObjIxTables) !== null && _m !== void 0 ? _m : false;
36
+ this.PAGES_PER_BLOCK = Math.floor(this.blockSize / this.pageSize);
37
+ this.OBJ_LU_PAGES_PER_BLOCK = Math.ceil(((this.blockSize / this.pageSize) * this.objIdLen) / this.pageSize);
38
+ this.OBJ_USABLE_PAGES_PER_BLOCK =
39
+ this.PAGES_PER_BLOCK - this.OBJ_LU_PAGES_PER_BLOCK;
40
+ this.OBJ_LU_PAGES_OBJ_IDS_LIM = Math.floor(this.pageSize / this.objIdLen);
41
+ this.OBJ_DATA_PAGE_HEADER_LEN =
42
+ this.objIdLen + this.spanIxLen + SPIFFS_PH_FLAG_LEN;
43
+ const pad = 4 -
44
+ (this.OBJ_DATA_PAGE_HEADER_LEN % 4 === 0
45
+ ? 4
46
+ : this.OBJ_DATA_PAGE_HEADER_LEN % 4);
47
+ this.OBJ_DATA_PAGE_HEADER_LEN_ALIGNED = this.OBJ_DATA_PAGE_HEADER_LEN + pad;
48
+ this.OBJ_DATA_PAGE_HEADER_LEN_ALIGNED_PAD = pad;
49
+ this.OBJ_DATA_PAGE_CONTENT_LEN =
50
+ this.pageSize - this.OBJ_DATA_PAGE_HEADER_LEN;
51
+ this.OBJ_INDEX_PAGES_HEADER_LEN =
52
+ this.OBJ_DATA_PAGE_HEADER_LEN_ALIGNED +
53
+ SPIFFS_PH_IX_SIZE_LEN +
54
+ SPIFFS_PH_IX_OBJ_TYPE_LEN +
55
+ this.objNameLen +
56
+ this.metaLen;
57
+ if (this.alignedObjIxTables) {
58
+ this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED =
59
+ (this.OBJ_INDEX_PAGES_HEADER_LEN + SPIFFS_PAGE_IX_LEN - 1) &
60
+ ~(SPIFFS_PAGE_IX_LEN - 1);
61
+ this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED_PAD =
62
+ this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED -
63
+ this.OBJ_INDEX_PAGES_HEADER_LEN;
64
+ }
65
+ else {
66
+ this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED = this.OBJ_INDEX_PAGES_HEADER_LEN;
67
+ this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED_PAD = 0;
68
+ }
69
+ this.OBJ_INDEX_PAGES_OBJ_IDS_HEAD_LIM = Math.floor((this.pageSize - this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED) /
70
+ this.blockIxLen);
71
+ this.OBJ_INDEX_PAGES_OBJ_IDS_LIM = Math.floor((this.pageSize - this.OBJ_DATA_PAGE_HEADER_LEN_ALIGNED) / this.blockIxLen);
72
+ }
73
+ }
74
+ export class SpiffsFullError extends Error {
75
+ constructor(message = "SPIFFS is full") {
76
+ super(message);
77
+ this.name = "SpiffsFullError";
78
+ }
79
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * SPIFFS Page Classes
3
+ * Based on ESP-IDF spiffsgen.py
4
+ */
5
+ import { SpiffsBuildConfig } from "./spiffsConfig";
6
+ export declare abstract class SpiffsPage {
7
+ protected buildConfig: SpiffsBuildConfig;
8
+ protected bix: number;
9
+ constructor(bix: number, buildConfig: SpiffsBuildConfig);
10
+ abstract toBinary(): Uint8Array;
11
+ protected pack(format: string, ...values: number[]): Uint8Array;
12
+ protected unpack(format: string, data: Uint8Array, offset?: number): number[];
13
+ private calcSize;
14
+ }
15
+ export declare abstract class SpiffsObjPageWithIdx extends SpiffsPage {
16
+ protected objId: number;
17
+ constructor(objId: number, buildConfig: SpiffsBuildConfig);
18
+ getObjId(): number;
19
+ }
20
+ export declare class SpiffsObjLuPage extends SpiffsPage {
21
+ private objIdsLimit;
22
+ private objIds;
23
+ constructor(bix: number, buildConfig: SpiffsBuildConfig);
24
+ private calcMagic;
25
+ registerPage(page: SpiffsObjPageWithIdx): void;
26
+ toBinary(): Uint8Array;
27
+ magicfy(blocksLim: number): void;
28
+ }
29
+ export declare class SpiffsObjIndexPage extends SpiffsObjPageWithIdx {
30
+ private spanIx;
31
+ private name;
32
+ private size;
33
+ private pagesLim;
34
+ private pages;
35
+ constructor(objId: number, spanIx: number, size: number, name: string, buildConfig: SpiffsBuildConfig);
36
+ registerPage(page: SpiffsObjDataPage): void;
37
+ toBinary(): Uint8Array;
38
+ }
39
+ export declare class SpiffsObjDataPage extends SpiffsObjPageWithIdx {
40
+ offset: number;
41
+ private spanIx;
42
+ private contents;
43
+ constructor(offset: number, objId: number, spanIx: number, contents: Uint8Array, buildConfig: SpiffsBuildConfig);
44
+ toBinary(): Uint8Array;
45
+ }