driverge-mcp 0.0.0 → 0.0.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.
Files changed (81) hide show
  1. package/README.md +275 -29
  2. package/dist/codegen/esp32.d.ts +11 -3
  3. package/dist/codegen/esp32.js +221 -10
  4. package/dist/codegen/esp32.js.map +1 -1
  5. package/dist/codegen/ident.d.ts +24 -2
  6. package/dist/codegen/ident.js +37 -4
  7. package/dist/codegen/ident.js.map +1 -1
  8. package/dist/codegen/index.d.ts +12 -7
  9. package/dist/codegen/index.js +17 -14
  10. package/dist/codegen/index.js.map +1 -1
  11. package/dist/codegen/lint.js +28 -8
  12. package/dist/codegen/lint.js.map +1 -1
  13. package/dist/codegen/portable-cpp.d.ts +8 -0
  14. package/dist/codegen/portable-cpp.js +281 -0
  15. package/dist/codegen/portable-cpp.js.map +1 -0
  16. package/dist/codegen/portable.d.ts +99 -3
  17. package/dist/codegen/portable.js +419 -99
  18. package/dist/codegen/portable.js.map +1 -1
  19. package/dist/codegen/stm32.d.ts +11 -3
  20. package/dist/codegen/stm32.js +156 -11
  21. package/dist/codegen/stm32.js.map +1 -1
  22. package/dist/codegen/types.d.ts +32 -0
  23. package/dist/codegen/types.js +27 -0
  24. package/dist/codegen/types.js.map +1 -1
  25. package/dist/mcp/cache.d.ts +15 -2
  26. package/dist/mcp/cache.js +32 -4
  27. package/dist/mcp/cache.js.map +1 -1
  28. package/dist/mcp/register.d.ts +17 -0
  29. package/dist/mcp/register.js +149 -21
  30. package/dist/mcp/register.js.map +1 -1
  31. package/dist/mcp/summary.js +8 -0
  32. package/dist/mcp/summary.js.map +1 -1
  33. package/dist/pdf/address.d.ts +4 -0
  34. package/dist/pdf/address.js +28 -0
  35. package/dist/pdf/address.js.map +1 -0
  36. package/dist/pdf/command.js +87 -14
  37. package/dist/pdf/command.js.map +1 -1
  38. package/dist/pdf/extract.js +23 -2
  39. package/dist/pdf/extract.js.map +1 -1
  40. package/dist/pdf/generic-register-table.d.ts +5 -0
  41. package/dist/pdf/generic-register-table.js +125 -0
  42. package/dist/pdf/generic-register-table.js.map +1 -0
  43. package/dist/pdf/index.d.ts +2 -0
  44. package/dist/pdf/index.js +2 -0
  45. package/dist/pdf/index.js.map +1 -1
  46. package/dist/pdf/interface-kind.d.ts +11 -0
  47. package/dist/pdf/interface-kind.js +18 -0
  48. package/dist/pdf/interface-kind.js.map +1 -1
  49. package/dist/pdf/manufacturer.js +39 -0
  50. package/dist/pdf/manufacturer.js.map +1 -1
  51. package/dist/pdf/maxim-register-map.d.ts +11 -0
  52. package/dist/pdf/maxim-register-map.js +544 -0
  53. package/dist/pdf/maxim-register-map.js.map +1 -0
  54. package/dist/pdf/part.js +8 -0
  55. package/dist/pdf/part.js.map +1 -1
  56. package/dist/pdf/prose-commands.d.ts +4 -0
  57. package/dist/pdf/prose-commands.js +90 -0
  58. package/dist/pdf/prose-commands.js.map +1 -0
  59. package/dist/pdf/st-bit-layout.d.ts +3 -0
  60. package/dist/pdf/st-bit-layout.js +238 -0
  61. package/dist/pdf/st-bit-layout.js.map +1 -0
  62. package/dist/pdf/ti-field-descriptions.d.ts +10 -0
  63. package/dist/pdf/ti-field-descriptions.js +87 -0
  64. package/dist/pdf/ti-field-descriptions.js.map +1 -0
  65. package/dist/pdf/ti-register-map.d.ts +5 -0
  66. package/dist/pdf/ti-register-map.js +84 -0
  67. package/dist/pdf/ti-register-map.js.map +1 -0
  68. package/dist/pdf/types.d.ts +15 -3
  69. package/dist/pdf/types.js +4 -1
  70. package/dist/pdf/types.js.map +1 -1
  71. package/dist/schema/assemble.d.ts +35 -3
  72. package/dist/schema/assemble.js +86 -13
  73. package/dist/schema/assemble.js.map +1 -1
  74. package/dist/schema/types.d.ts +21 -1
  75. package/dist/schema/validate.js +37 -10
  76. package/dist/schema/validate.js.map +1 -1
  77. package/dist/server.d.ts +18 -0
  78. package/dist/server.js +49 -3
  79. package/dist/server.js.map +1 -1
  80. package/package.json +1 -1
  81. package/schemas/datasheet.schema.json +17 -3
@@ -1 +1 @@
1
- {"version":3,"file":"esp32.js","sourceRoot":"","sources":["../../src/codegen/esp32.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kFAAkF;AAClF,sEAAsE;AACtE,gFAAgF;AAChF,+EAA+E;AAC/E,4DAA4D;AAG5D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAGvD,SAAS,OAAO,CAAC,IAAY,EAAE,MAAc;IAC3C,MAAM,OAAO,GAAG;QACd,IAAI;QACJ,MAAM,MAAM,0EAA0E;QACtF,IAAI;QACJ,4EAA4E;QAC5E,6EAA6E;QAC7E,4DAA4D,IAAI,eAAe;QAC/E,gFAAgF;QAChF,KAAK;QACL,aAAa,IAAI,KAAK;QACtB,qBAAqB;QACrB,gCAAgC;QAChC,gCAAgC;QAChC,4BAA4B;QAC5B,EAAE;QACF,WAAW,MAAM,iBAAiB;QAClC,WAAW,MAAM,sBAAsB;QACvC,QAAQ;QACR,EAAE;QACF,oCAAoC,IAAI,OAAO;QAC/C,EAAE;QACF,yBAAyB,MAAM,mDAAmD;QAClF,6EAA6E;QAC7E,aAAa,IAAI,mEAAmE;QACpF,iCAAiC;QACjC,gDAAgD;QAChD,6BAA6B,MAAM,YAAY;QAC/C,uCAAuC;QACvC,QAAQ;QACR,sDAAsD,IAAI,QAAQ;QAClE,GAAG;QACH,EAAE;QACF,8EAA8E;QAC9E,sBAAsB;QACtB,yEAAyE;QACzE,0CAA0C;QAC1C,iBAAiB;QACjB,OAAO;QACP,mBAAmB;QACnB,iCAAiC;QACjC,6BAA6B,IAAI,gCAAgC,MAAM,mBAAmB;QAC1F,GAAG;QACH,EAAE;QACF,6EAA6E;QAC7E,iBAAiB;QACjB,qCAAqC,IAAI,6BAA6B,MAAM,mBAAmB;QAC/F,GAAG;QACH,EAAE;QACF,kCAAkC;QAClC,oCAAoC;QACpC,GAAG;QACH,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,cAAc,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,mBAAmB,CAAC,IAAmB;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAE1C,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,aAAa,EAAE;YACb,GAAG,IAAI,CAAC,aAAa;YACrB,cAAc,EAAE,wGAAwG,IAAI,+DAA+D,MAAM,4BAA4B;SAC9N;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"esp32.js","sourceRoot":"","sources":["../../src/codegen/esp32.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,30 @@ export declare const HEX_ONLY: RegExp;
3
3
  export declare function slug(part: string): string;
4
4
  /** UPPER token safe for a macro fragment. */
5
5
  export declare function macro(s: string): string;
6
- /** 8-bit mask for a [msb:lsb] field. */
7
- export declare function fieldMask(msb: number, lsb: number): number;
6
+ /**
7
+ * Mask for a [msb:lsb] field within a `regWidth`-bit register. Computed
8
+ * arithmetically so it is correct up to 32 bits (no 32-bit shift overflow); for
9
+ * valid 8-bit fields it equals the historical `& 0xff` result (e.g. 7:5 → 0xE0).
10
+ */
11
+ export declare function fieldMask(msb: number, lsb: number, regWidth?: number): number;
8
12
  export declare function hex2(n: number): string;
13
+ /** Hex literal padded to a register width's digit count (8→2, 16→4, 32→8). */
14
+ export declare function maskHex(n: number, regWidth?: number): string;
15
+ /**
16
+ * Neutralizes C block-comment delimiters in free text lifted verbatim from a
17
+ * parsed datasheet (e.g. `metadata.manufacturer`, a `Register.name`) before it
18
+ * is embedded inside a generated `/* ... *\/` block comment. Without this, text
19
+ * containing `*\/` closes the enclosing comment early and whatever follows
20
+ * becomes live, uncommented source — a comment-escape injection (B2). Splits
21
+ * both delimiters ("* /" and "/ *") so the string can neither close an
22
+ * existing comment nor open a bogus one; still reads fine as prose either way.
23
+ */
24
+ export declare function commentSafe(s: string): string;
9
25
  /** Macro prefix for a part, e.g. "BME280". */
10
26
  export declare function prefixOf(part: string): string;
27
+ /**
28
+ * PascalCase a lower-snake slug for a C++ class name, e.g. "bme280" -> "Bme280",
29
+ * "tmag5170" -> "Tmag5170". Used only by the cpp codegen flavor (Session D); the
30
+ * C flavor has no class, so this never touches C output.
31
+ */
32
+ export declare function pascalCase(s: string): string;
@@ -16,16 +16,49 @@ export function macro(s) {
16
16
  .replace(/[^A-Z0-9]+/g, "_")
17
17
  .replace(/^_+|_+$/g, "");
18
18
  }
19
- /** 8-bit mask for a [msb:lsb] field. */
20
- export function fieldMask(msb, lsb) {
21
- const width = msb - lsb + 1;
22
- return (((1 << width) - 1) << lsb) & 0xff;
19
+ /**
20
+ * Mask for a [msb:lsb] field within a `regWidth`-bit register. Computed
21
+ * arithmetically so it is correct up to 32 bits (no 32-bit shift overflow); for
22
+ * valid 8-bit fields it equals the historical `& 0xff` result (e.g. 7:5 → 0xE0).
23
+ */
24
+ export function fieldMask(msb, lsb, regWidth = 8) {
25
+ const bits = msb - lsb + 1;
26
+ const mask = (2 ** bits - 1) * 2 ** lsb;
27
+ return mask % 2 ** regWidth;
23
28
  }
24
29
  export function hex2(n) {
25
30
  return `0x${n.toString(16).toUpperCase().padStart(2, "0")}`;
26
31
  }
32
+ /** Hex literal padded to a register width's digit count (8→2, 16→4, 32→8). */
33
+ export function maskHex(n, regWidth = 8) {
34
+ return `0x${n.toString(16).toUpperCase().padStart(regWidth / 4, "0")}`;
35
+ }
36
+ /**
37
+ * Neutralizes C block-comment delimiters in free text lifted verbatim from a
38
+ * parsed datasheet (e.g. `metadata.manufacturer`, a `Register.name`) before it
39
+ * is embedded inside a generated `/* ... *\/` block comment. Without this, text
40
+ * containing `*\/` closes the enclosing comment early and whatever follows
41
+ * becomes live, uncommented source — a comment-escape injection (B2). Splits
42
+ * both delimiters ("* /" and "/ *") so the string can neither close an
43
+ * existing comment nor open a bogus one; still reads fine as prose either way.
44
+ */
45
+ export function commentSafe(s) {
46
+ return s.replace(/\*\//g, "* /").replace(/\/\*/g, "/ *");
47
+ }
27
48
  /** Macro prefix for a part, e.g. "BME280". */
28
49
  export function prefixOf(part) {
29
50
  return macro(slug(part));
30
51
  }
52
+ /**
53
+ * PascalCase a lower-snake slug for a C++ class name, e.g. "bme280" -> "Bme280",
54
+ * "tmag5170" -> "Tmag5170". Used only by the cpp codegen flavor (Session D); the
55
+ * C flavor has no class, so this never touches C output.
56
+ */
57
+ export function pascalCase(s) {
58
+ return s
59
+ .split("_")
60
+ .filter(Boolean)
61
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
62
+ .join("");
63
+ }
31
64
  //# sourceMappingURL=ident.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ident.js","sourceRoot":"","sources":["../../src/codegen/ident.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,uEAAuE;AAEvE,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAEzC,8EAA8E;AAC9E,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,IAAI;SACX,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,QAAQ,CAAC;AACvB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,KAAK,CAAC,CAAS;IAC7B,OAAO,CAAC;SACL,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,GAAW;IAChD,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,CAAS;IAC5B,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"ident.js","sourceRoot":"","sources":["../../src/codegen/ident.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,uEAAuE;AAEvE,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAEzC,8EAA8E;AAC9E,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,IAAI;SACX,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,QAAQ,CAAC;AACvB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,KAAK,CAAC,CAAS;IAC7B,OAAO,CAAC;SACL,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,GAAW,EAAE,QAAQ,GAAG,CAAC;IAC9D,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;IACxC,OAAO,IAAI,GAAG,CAAC,IAAI,QAAQ,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,CAAS;IAC5B,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,OAAO,CAAC,CAAS,EAAE,QAAQ,GAAG,CAAC;IAC7C,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACzE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,CAAC;SACL,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"}
@@ -1,15 +1,20 @@
1
1
  import type { DatasheetJson } from "../schema/types.js";
2
- import type { CodegenTarget, DriverArtifact } from "./types.js";
2
+ import type { CodegenLanguage, CodegenTarget, DriverArtifact } from "./types.js";
3
3
  export * from "./types.js";
4
4
  export { generatePortableDriver } from "./portable.js";
5
+ export { generatePortableCppDriver } from "./portable-cpp.js";
5
6
  export { generateEsp32Driver } from "./esp32.js";
6
7
  export { generateStm32Driver } from "./stm32.js";
7
8
  export { lintDriver } from "./lint.js";
8
9
  export { slug, prefixOf } from "./ident.js";
9
- /** arduino lands in a later session; portable + esp32 + stm32 render today. */
10
- export declare class UnsupportedTargetError extends Error {
11
- readonly target: string;
12
- constructor(target: string);
10
+ export interface GenerateDriverOptions {
11
+ /** Output language flavor; "c" (default) is byte-identical to pre-Session-D
12
+ * output, "cpp" renders a class wrapper — see CodegenLanguage. */
13
+ language?: CodegenLanguage;
13
14
  }
14
- /** Render a driver for a target, dispatching to the right generator. */
15
- export declare function generateDriver(json: DatasheetJson, target: CodegenTarget): DriverArtifact;
15
+ /**
16
+ * Render a driver for a target, dispatching to the right generator/language.
17
+ * `opts` is optional and additive — omitted, `{}`, and `{ language: "c" }` all
18
+ * produce today's byte-identical C output (Session D: cpp language option).
19
+ */
20
+ export declare function generateDriver(json: DatasheetJson, target: CodegenTarget, opts?: GenerateDriverOptions): DriverArtifact;
@@ -1,30 +1,33 @@
1
1
  // Public surface of the codegen layer.
2
2
  import { generateEsp32Driver } from "./esp32.js";
3
+ import { generatePortableCppDriver } from "./portable-cpp.js";
3
4
  import { generatePortableDriver } from "./portable.js";
4
5
  import { generateStm32Driver } from "./stm32.js";
6
+ import { UnsupportedTargetError } from "./types.js";
7
+ // UnsupportedTargetError and UnsupportedBusError live in ./types.js (cycle-free:
8
+ // esp32.js/stm32.js import UnsupportedBusError from there too, and this module
9
+ // imports esp32.js/stm32.js) — re-exported here for the public codegen surface.
5
10
  export * from "./types.js";
6
11
  export { generatePortableDriver } from "./portable.js";
12
+ export { generatePortableCppDriver } from "./portable-cpp.js";
7
13
  export { generateEsp32Driver } from "./esp32.js";
8
14
  export { generateStm32Driver } from "./stm32.js";
9
15
  export { lintDriver } from "./lint.js";
10
16
  export { slug, prefixOf } from "./ident.js";
11
- /** arduino lands in a later session; portable + esp32 + stm32 render today. */
12
- export class UnsupportedTargetError extends Error {
13
- target;
14
- constructor(target) {
15
- super(`codegen target "${target}" is not available yet — supported targets: portable, esp32, stm32`);
16
- this.target = target;
17
- this.name = "UnsupportedTargetError";
17
+ /**
18
+ * Render a driver for a target, dispatching to the right generator/language.
19
+ * `opts` is optional and additive — omitted, `{}`, and `{ language: "c" }` all
20
+ * produce today's byte-identical C output (Session D: cpp language option).
21
+ */
22
+ export function generateDriver(json, target, opts = {}) {
23
+ const language = opts.language ?? "c";
24
+ if (target === "portable") {
25
+ return language === "cpp" ? generatePortableCppDriver(json) : generatePortableDriver(json);
18
26
  }
19
- }
20
- /** Render a driver for a target, dispatching to the right generator. */
21
- export function generateDriver(json, target) {
22
- if (target === "portable")
23
- return generatePortableDriver(json);
24
27
  if (target === "esp32")
25
- return generateEsp32Driver(json);
28
+ return generateEsp32Driver(json, { language });
26
29
  if (target === "stm32")
27
- return generateStm32Driver(json);
30
+ return generateStm32Driver(json, { language });
28
31
  throw new UnsupportedTargetError(target);
29
32
  }
30
33
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAGvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE5C,+EAA+E;AAC/E,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACnB;IAA5B,YAA4B,MAAc;QACxC,KAAK,CACH,mBAAmB,MAAM,oEAAoE,CAC9F,CAAC;QAHwB,WAAM,GAAN,MAAM,CAAQ;QAIxC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAC5B,IAAmB,EACnB,MAAqB;IAErB,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC/D,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAGvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGpD,iFAAiF;AACjF,+EAA+E;AAC/E,gFAAgF;AAChF,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQ5C;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAmB,EACnB,MAAqB,EACrB,OAA8B,EAAE;IAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;IACtC,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvE,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvE,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC"}
@@ -3,17 +3,27 @@
3
3
  // skeleton: it confirms the host AI finished its work (no leftover TODOs), stayed
4
4
  // on the thin-HAL seam, didn't hallucinate registers/commands, and didn't corrupt
5
5
  // the deterministic bit-field masks. Pure/text-based — no compiler needed.
6
- import { fieldMask, hex2, macro, prefixOf } from "./ident.js";
6
+ import { registerWidth } from "../pdf/types.js";
7
+ import { fieldMask, macro, maskHex, prefixOf } from "./ident.js";
7
8
  // Vendor peripheral APIs that must NEVER appear in a portable/thin-HAL driver —
8
9
  // all bus access goes through the hal_* seam instead.
9
10
  const FORBIDDEN = [
10
11
  { re: /\bHAL_(?:I2C|SPI|UART)_\w+/, api: "STM32 CubeHAL" },
11
12
  { re: /\bLL_(?:I2C|SPI)_\w+/, api: "STM32 LL" },
12
- { re: /\bi2c_master_\w+|\bspi_device_\w+|\bi2c_cmd_\w+/, api: "ESP-IDF" },
13
+ {
14
+ re: /\bi2c_master_\w+|\bspi_device_\w+|\bi2c_cmd_\w+|\buart_write_bytes\w*|\buart_read_bytes\w*|\btwai_\w+/,
15
+ api: "ESP-IDF",
16
+ },
13
17
  { re: /\bWire\.\w+|\bSPI\.(?:transfer|begin)\w*/, api: "Arduino" },
14
18
  ];
15
- // Allowed thin-HAL seam functions (families).
16
- const HAL_ALLOWED = /^hal_(?:i2c_(?:read|write)|spi_(?:read|write)|delay_ms)$/;
19
+ // Allowed thin-HAL seam functions (families). SPI is a single combined
20
+ // hal_spi_transfer(tx, tx_len, rx, rx_len) — one call per CS-framed transaction —
21
+ // not a hal_spi_write/hal_spi_read pair; those are retired and must lint as
22
+ // unknown HAL functions (see decisions: thin-hal-non-negotiable). UART
23
+ // (Session B) adds hal_uart_write/hal_uart_read; CAN (Session C) adds the
24
+ // single combined hal_can_transfer — any other hal_uart_*/hal_can_* name (e.g.
25
+ // a hypothetical hal_uart_flush or hal_can_filter) must still lint as unknown.
26
+ const HAL_ALLOWED = /^hal_(?:i2c_(?:read|write)|spi_transfer|uart_(?:write|read)|can_transfer|delay_ms)$/;
17
27
  function balanced(text, open, close) {
18
28
  let depth = 0;
19
29
  for (const ch of text) {
@@ -34,7 +44,16 @@ export function lintDriver(files, json) {
34
44
  const prefix = prefixOf(json.metadata.part);
35
45
  const all = files.map((f) => `/* ${f.path} */\n${f.content}`).join("\n\n");
36
46
  // Comments carry the TODO markers and prose; strip them before code-shape checks.
37
- const strip = (s) => s.replace(/\/\*[\s\S]*?\*\//g, " ").replace(/\/\/[^\n]*/g, " ");
47
+ // String/char literal BODIES are stripped too (after comments) so a stray brace
48
+ // or paren inside "..." or '...' never throws off the balance check — and, as a
49
+ // side effect, keeps the forbidden-API/hal_*/reference scans from matching text
50
+ // that only appears inside a literal. `all` (TODO detection, #define scans) stays
51
+ // unstripped on purpose.
52
+ const strip = (s) => s
53
+ .replace(/\/\*[\s\S]*?\*\//g, " ")
54
+ .replace(/\/\/[^\n]*/g, " ")
55
+ .replace(/"(?:\\.|[^"\\])*"/g, " ")
56
+ .replace(/'(?:\\.|[^'\\])*'/g, " ");
38
57
  const code = strip(all);
39
58
  // Thin-HAL purity applies to the driver CORE, not the seam implementation:
40
59
  // a native target's <part>_hal_<target>.c is *where* platform calls belong.
@@ -57,7 +76,7 @@ export function lintDriver(files, json) {
57
76
  }
58
77
  for (const m of coreCode.matchAll(/\bhal_[a-z0-9_]+/g)) {
59
78
  if (!HAL_ALLOWED.test(m[0])) {
60
- errors.push(`unknown HAL function "${m[0]}" — thin HAL is hal_i2c_*/hal_spi_*/hal_delay_ms only`);
79
+ errors.push(`unknown HAL function "${m[0]}" — thin HAL is hal_i2c_*/hal_spi_*/hal_uart_*/hal_can_transfer/hal_delay_ms only`);
61
80
  }
62
81
  }
63
82
  // 4. Register/command reference existence: any PREFIX_REG_* / PREFIX_CMD_* used
@@ -84,14 +103,15 @@ export function lintDriver(files, json) {
84
103
  }
85
104
  function checkMasks(registers, prefix, text, errors) {
86
105
  for (const r of registers) {
106
+ const width = registerWidth(r);
87
107
  for (const f of r.bitFields) {
88
108
  const base = `${prefix}_${macro(r.name)}_${macro(f.name)}`;
89
109
  const maskDef = new RegExp(`#define\\s+${base}_MASK\\s+(0x[0-9a-fA-F]+)`).exec(text);
90
110
  if (maskDef) {
91
111
  const got = Number.parseInt(maskDef[1], 16);
92
- const want = fieldMask(f.msb, f.lsb);
112
+ const want = fieldMask(f.msb, f.lsb, width);
93
113
  if (got !== want) {
94
- errors.push(`${base}_MASK is ${maskDef[1]} but ${r.name}.${f.name} [${f.msb}:${f.lsb}] implies ${hex2(want)}`);
114
+ errors.push(`${base}_MASK is ${maskDef[1]} but ${r.name}.${f.name} [${f.msb}:${f.lsb}] implies ${maskHex(want, width)}`);
95
115
  }
96
116
  }
97
117
  const shiftDef = new RegExp(`#define\\s+${base}_SHIFT\\s+(\\d+)`).exec(text);
@@ -1 +1 @@
1
- {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/codegen/lint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/codegen/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DatasheetJson } from "../schema/types.js";
2
+ import type { DriverArtifact } from "./types.js";
3
+ /**
4
+ * Render the portable thin-HAL driver skeleton, cpp flavor: same dispatch rule
5
+ * as generatePortableDriver (register_map-first fallback), just calling the
6
+ * class-wrapper renderers above.
7
+ */
8
+ export declare function generatePortableCppDriver(json: DatasheetJson): DriverArtifact;
@@ -0,0 +1,281 @@
1
+ // Portable thin-HAL codegen — "cpp" language flavor (Session D). Renders a
2
+ // CLASS WRAPPER around the exact same #define macro constants and thin-HAL
3
+ // seam as generatePortableDriver's C output: the same register_map/command_set
4
+ // constants, TODO(driverge) markers, and fill_in_brief keys, just shaped as a
5
+ // class (<slug>.hpp/.cpp) instead of a struct + free functions (<slug>.h/.c).
6
+ //
7
+ // Deliberately reuses portable.ts's pure #define/TODO/seam-declaration builders
8
+ // (registerConstants, bitFieldMacros, registerMapTodo, commandSetTodo, BUS_SEAM
9
+ // decl, uartFramingBody/canFramingBody, registerBrief/commandBrief) instead of
10
+ // re-deriving them, so the two language flavors can never drift on the
11
+ // macro/seam contract that validate_driver and the native _hal_<target>.c seam
12
+ // files depend on — see wiki: thin-hal-non-negotiable, json-schema-as-contract.
13
+ //
14
+ // What genuinely differs (and is NOT shared) is the struct-vs-class /
15
+ // free-function-vs-method shape: the driver handle's address state becomes a
16
+ // private class member, and register_map's read_register(dev, reg, *value)
17
+ // becomes a method readRegister(reg, uint8_t &value) with no dev pointer to
18
+ // null-check.
19
+ import { registerWidth } from "../pdf/types.js";
20
+ import { commentSafe, macro, pascalCase, slug } from "./ident.js";
21
+ import { AUTOGEN, BUS_SEAM, COMMAND_INIT_TODO, I2C_COMMAND_FRAME_NOTE, bitFieldMacros, canFramingBody, commandBrief, commandReadDataTodo, commandSetTodo, crc8Body, makeFiles, registerBrief, registerConstants, registerInitTodo, registerMapTodo, registerMapTodoText, seamBusFor, uartFramingBody, } from "./portable.js";
22
+ const CPP_EXT = { header: "hpp", source: "cpp" };
23
+ /** extern "C" wrapper note — explains why the seam stays linkable from a
24
+ * native target's `_hal_<target>.c` seam file (compiled as C) even though the
25
+ * core here is C++. */
26
+ const EXTERN_C_NOTE = [
27
+ '/* Thin-HAL seam — implement these for your platform (see thin-hal). Wrapped',
28
+ ' * in extern "C" so the class methods below link against a plain-C',
29
+ ' * implementation — including the native _hal_<target>.c seam file Driverge',
30
+ " * attaches for esp32/stm32 targets, which is compiled as C, unchanged. */",
31
+ ];
32
+ function cppBusSeam(busKind, prefix) {
33
+ if (busKind === "I2C") {
34
+ return {
35
+ member: [" uint8_t i2c_addr_;"],
36
+ initMember: [` i2c_addr_ = ${prefix}_I2C_ADDR;`],
37
+ readBody: [" hal_i2c_read(i2c_addr_, reg, &value, 1);", " return 0;"],
38
+ writeBody: [" hal_i2c_write(i2c_addr_, reg, &value, 1);", " return 0;"],
39
+ };
40
+ }
41
+ if (busKind === "SPI") {
42
+ return {
43
+ member: [],
44
+ initMember: [],
45
+ readBody: [" hal_spi_transfer(&reg, 1, &value, 1);", " return 0;"],
46
+ writeBody: [
47
+ " uint8_t frame[2];",
48
+ " frame[0] = reg;",
49
+ " frame[1] = value;",
50
+ " hal_spi_transfer(frame, 2, nullptr, 0);",
51
+ " return 0;",
52
+ ],
53
+ };
54
+ }
55
+ if (busKind === "UART") {
56
+ return {
57
+ member: [],
58
+ initMember: [],
59
+ readBody: uartFramingBody(["reg", "value"]),
60
+ writeBody: uartFramingBody(["reg", "value"]),
61
+ };
62
+ }
63
+ return {
64
+ member: [],
65
+ initMember: [],
66
+ readBody: canFramingBody(["reg", "value"]),
67
+ writeBody: canFramingBody(["reg", "value"]),
68
+ };
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // register_map
72
+ // ---------------------------------------------------------------------------
73
+ function registerDriverCpp(json, registers, name, prefix) {
74
+ const busKind = seamBusFor(json.protocol.bus);
75
+ const spi = busKind === "SPI";
76
+ const uart = busKind === "UART";
77
+ const can = busKind === "CAN";
78
+ const seam = BUS_SEAM[busKind];
79
+ const cppSeam = cppBusSeam(busKind, prefix);
80
+ const addr = json.protocol.addresses?.[0];
81
+ const guard = `${prefix}_HPP`;
82
+ const className = pascalCase(name);
83
+ const hpp = [
84
+ AUTOGEN(json.metadata.part || name, json.metadata.manufacturer, spi
85
+ ? "Bus: SPI"
86
+ : uart
87
+ ? "Bus: UART"
88
+ : can
89
+ ? "Bus: CAN"
90
+ : `Bus: I2C, address ${addr ?? "(unknown — see TODO)"}`),
91
+ "",
92
+ `#ifndef ${guard}`,
93
+ `#define ${guard}`,
94
+ "",
95
+ "#include <cstdint>",
96
+ "",
97
+ ];
98
+ if (!spi && !uart && !can) {
99
+ if (addr) {
100
+ hpp.push("/* I2C device address. */", `#define ${prefix}_I2C_ADDR ${addr}`, "");
101
+ }
102
+ else {
103
+ hpp.push("/* TODO(driverge): set the I2C device address (not found in the datasheet parse). */", `#define ${prefix}_I2C_ADDR 0x00`, "");
104
+ }
105
+ }
106
+ const regLines = registerConstants(prefix, registers);
107
+ const hasRegs = regLines.some((l) => l.startsWith("#define"));
108
+ hpp.push(...(hasRegs ? regLines : registerMapTodo(prefix, json.extraction?.detectedPages ?? [])));
109
+ if (registers.some((r) => registerWidth(r) > 8)) {
110
+ hpp.push("", "/* NOTE: some registers here are wider than 8 bits (see the per-register", " * annotations). Bit-field masks are register-width correct; multi-byte access", " * framing (byte order / transfer size) is device-specific and belongs on the", " * hal_* seam. */");
111
+ }
112
+ const bits = bitFieldMacros(prefix, registers);
113
+ if (bits.length > 0)
114
+ hpp.push("", "/* Bit-field mask/shift accessors. */", ...bits);
115
+ hpp.push("", ...EXTERN_C_NOTE, 'extern "C" {', ...seam.decl, "void hal_delay_ms (uint32_t ms);", "}", "", `class ${className} {`, "public:", " int init();", " int readRegister(uint8_t reg, uint8_t &value);", " int writeRegister(uint8_t reg, uint8_t value);");
116
+ if (cppSeam.member.length > 0) {
117
+ hpp.push("", "private:", ...cppSeam.member);
118
+ }
119
+ hpp.push("};", "", `#endif /* ${guard} */`, "");
120
+ const cpp = [
121
+ `#include "${name}.hpp"`,
122
+ "",
123
+ `int ${className}::init() {`,
124
+ ...cppSeam.initMember,
125
+ ...registerInitTodo(uart, can, "writeRegister()"),
126
+ " return 0;",
127
+ "}",
128
+ "",
129
+ `int ${className}::readRegister(uint8_t reg, uint8_t &value) {`,
130
+ ...cppSeam.readBody,
131
+ "}",
132
+ "",
133
+ `int ${className}::writeRegister(uint8_t reg, uint8_t value) {`,
134
+ ...cppSeam.writeBody,
135
+ "}",
136
+ "",
137
+ ];
138
+ const brief = registerBrief(json, {
139
+ init: "init",
140
+ readRegister: "readRegister",
141
+ writeRegister: "writeRegister",
142
+ });
143
+ if (!hasRegs) {
144
+ brief.register_map_todo = registerMapTodoText(json, name, prefix);
145
+ }
146
+ return { files: makeFiles(name, hpp, cpp, CPP_EXT), fill_in_brief: brief };
147
+ }
148
+ // ---------------------------------------------------------------------------
149
+ // command_set
150
+ // ---------------------------------------------------------------------------
151
+ function commandDriverCpp(json, commands, name, prefix) {
152
+ const uart = json.protocol.bus === "UART";
153
+ const can = json.protocol.bus === "CAN";
154
+ const noAddrBus = uart || can;
155
+ const addr = json.protocol.addresses?.[0];
156
+ const crc = commands.find((c) => c.crc)?.crc;
157
+ const guard = `${prefix}_HPP`;
158
+ const className = pascalCase(name);
159
+ const hpp = [
160
+ AUTOGEN(json.metadata.part || name, json.metadata.manufacturer, uart
161
+ ? "Bus: UART · command-set device"
162
+ : can
163
+ ? "Bus: CAN · command-set device"
164
+ : `Bus: I2C, address ${addr ?? "(unknown — see TODO)"} · command-set device`),
165
+ "",
166
+ `#ifndef ${guard}`,
167
+ `#define ${guard}`,
168
+ "",
169
+ "#include <cstdint>",
170
+ "",
171
+ ];
172
+ if (noAddrBus) {
173
+ // No bus device address on UART/CAN — see fill_in_brief.framing_todo.
174
+ }
175
+ else if (addr) {
176
+ hpp.push("/* I2C device address. */", `#define ${prefix}_I2C_ADDR ${addr}`, "");
177
+ }
178
+ else {
179
+ hpp.push("/* TODO(driverge): set the I2C device address. */", `#define ${prefix}_I2C_ADDR 0x00`, "");
180
+ }
181
+ if (commands.length === 0) {
182
+ hpp.push(...commandSetTodo(prefix, json.extraction?.detectedPages ?? []));
183
+ }
184
+ else {
185
+ hpp.push("/* Command codes. */");
186
+ const seen = new Set();
187
+ for (const c of commands) {
188
+ const macroName = `${prefix}_CMD_${macro(c.name)}`;
189
+ if (seen.has(macroName))
190
+ continue;
191
+ seen.add(macroName);
192
+ const line = `#define ${macroName} ${c.code.toUpperCase().replace("0X", "0x")}`;
193
+ // See the C flavor's identical comment in portable.ts commandDriver — c.params
194
+ // is defensively commentSafe'd even though today's only producer is hex-safe.
195
+ hpp.push(c.params && c.params.length > 0
196
+ ? `${line} /* params: ${commentSafe(c.params.join(", "))} */`
197
+ : line);
198
+ }
199
+ }
200
+ if (crc) {
201
+ hpp.push("", `/* CRC-${crc.width} checksum parameters. */`, `#define ${prefix}_CRC_POLY ${crc.poly}`, `#define ${prefix}_CRC_INIT ${crc.init}`);
202
+ }
203
+ hpp.push("", ...EXTERN_C_NOTE, 'extern "C" {', ...(uart
204
+ ? BUS_SEAM.UART.decl
205
+ : can
206
+ ? BUS_SEAM.CAN.decl
207
+ : [
208
+ "void hal_i2c_write(uint8_t addr, uint8_t reg, uint8_t *data, uint16_t len);",
209
+ "void hal_i2c_read (uint8_t addr, uint8_t reg, uint8_t *data, uint16_t len);",
210
+ ]), "void hal_delay_ms (uint32_t ms);", "}", "", `class ${className} {`, "public:", " int init();", " int sendCommand(uint16_t command);", " int readData(uint8_t *buffer, uint16_t len);", ...(crc ? [" uint8_t crc8(const uint8_t *data, uint16_t len);"] : []));
211
+ if (!noAddrBus) {
212
+ hpp.push("", "private:", " uint8_t i2c_addr_;");
213
+ }
214
+ hpp.push("};", "", `#endif /* ${guard} */`, "");
215
+ const cpp = [
216
+ `#include "${name}.hpp"`,
217
+ "",
218
+ `int ${className}::init() {`,
219
+ ...(noAddrBus ? [] : [` i2c_addr_ = ${prefix}_I2C_ADDR;`]),
220
+ ...COMMAND_INIT_TODO,
221
+ " return 0;",
222
+ "}",
223
+ "",
224
+ `int ${className}::sendCommand(uint16_t command) {`,
225
+ ...(uart
226
+ ? uartFramingBody(["command"])
227
+ : can
228
+ ? canFramingBody(["command"])
229
+ : [
230
+ " uint8_t msb;",
231
+ " uint8_t lsb;",
232
+ " msb = (uint8_t)(command >> 8);",
233
+ " lsb = (uint8_t)(command & 0xFF);",
234
+ ...I2C_COMMAND_FRAME_NOTE,
235
+ " hal_i2c_write(i2c_addr_, msb, &lsb, 1);",
236
+ " return 0;",
237
+ ]),
238
+ "}",
239
+ "",
240
+ `int ${className}::readData(uint8_t *buffer, uint16_t len) {`,
241
+ ...(uart
242
+ ? uartFramingBody(["buffer", "len"])
243
+ : can
244
+ ? canFramingBody(["buffer", "len"])
245
+ : [
246
+ " if (buffer == nullptr) {",
247
+ " return -1;",
248
+ " }",
249
+ ...commandReadDataTodo("crc8"),
250
+ " (void)buffer;",
251
+ " (void)len;",
252
+ " return 0;",
253
+ ]),
254
+ "}",
255
+ "",
256
+ ];
257
+ if (crc) {
258
+ cpp.push(...crc8Body(`${className}::crc8`, crc, prefix));
259
+ }
260
+ const brief = commandBrief(json, commands, crc, uart, can, name, prefix, {
261
+ sendCommand: "sendCommand",
262
+ readData: "readData",
263
+ crc8: "crc8",
264
+ });
265
+ return { files: makeFiles(name, hpp, cpp, CPP_EXT), fill_in_brief: brief };
266
+ }
267
+ // ---------------------------------------------------------------------------
268
+ /**
269
+ * Render the portable thin-HAL driver skeleton, cpp flavor: same dispatch rule
270
+ * as generatePortableDriver (register_map-first fallback), just calling the
271
+ * class-wrapper renderers above.
272
+ */
273
+ export function generatePortableCppDriver(json) {
274
+ const part = json.metadata.part;
275
+ const name = slug(part);
276
+ const prefix = macro(name);
277
+ return json.interface.kind === "command_set"
278
+ ? commandDriverCpp(json, json.interface.commands, name, prefix)
279
+ : registerDriverCpp(json, json.interface.registers, name, prefix);
280
+ }
281
+ //# sourceMappingURL=portable-cpp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-cpp.js","sourceRoot":"","sources":["../../src/codegen/portable-cpp.ts"],"names":[],"mappings":"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"}