@typecad/framework-arduino 0.1.0-alpha.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +192 -0
  3. package/dist/arduino/i2c-arduino.d.ts +47 -0
  4. package/dist/arduino/i2c-arduino.js +6 -0
  5. package/dist/arduino/index.d.ts +6 -0
  6. package/dist/arduino/index.js +8 -0
  7. package/dist/arduino/spi-arduino.d.ts +42 -0
  8. package/dist/arduino/spi-arduino.js +6 -0
  9. package/dist/arduino/stubs-uno.d.ts +9 -0
  10. package/dist/arduino/stubs-uno.js +65 -0
  11. package/dist/arduino/uart-arduino.d.ts +41 -0
  12. package/dist/arduino/uart-arduino.js +6 -0
  13. package/dist/arduino-class-map.d.ts +5 -0
  14. package/dist/arduino-class-map.js +21 -0
  15. package/dist/arduino-compile.d.ts +24 -0
  16. package/dist/arduino-compile.js +316 -0
  17. package/dist/arduino-libs.d.ts +6 -0
  18. package/dist/arduino-libs.js +11 -0
  19. package/dist/cli-metadata.d.ts +12 -0
  20. package/dist/cli-metadata.js +196 -0
  21. package/dist/cpp-parser.d.ts +47 -0
  22. package/dist/cpp-parser.js +292 -0
  23. package/dist/debug-codegen.d.ts +20 -0
  24. package/dist/debug-codegen.js +115 -0
  25. package/dist/displays/ili9341-spi.d.ts +6 -0
  26. package/dist/displays/ili9341-spi.js +28 -0
  27. package/dist/displays/ssd1309-i2c.d.ts +2 -0
  28. package/dist/displays/ssd1309-i2c.js +16 -0
  29. package/dist/displays/st7796-spi.d.ts +2 -0
  30. package/dist/displays/st7796-spi.js +20 -0
  31. package/dist/graphics/ili9341.d.ts +24 -0
  32. package/dist/graphics/ili9341.js +59 -0
  33. package/dist/index.d.ts +13 -0
  34. package/dist/index.js +27 -0
  35. package/dist/lib-declaration.d.ts +35 -0
  36. package/dist/lib-declaration.js +399 -0
  37. package/dist/lib-discovery.d.ts +38 -0
  38. package/dist/lib-discovery.js +189 -0
  39. package/dist/profile.d.ts +8 -0
  40. package/dist/profile.js +584 -0
  41. package/dist/strategy.d.ts +174 -0
  42. package/dist/strategy.js +2032 -0
  43. package/package.json +73 -0
  44. package/src/arduino/i2c-arduino.ts +72 -0
  45. package/src/arduino/index.ts +18 -0
  46. package/src/arduino/spi-arduino.ts +63 -0
  47. package/src/arduino/stubs-uno.ts +80 -0
  48. package/src/arduino/uart-arduino.ts +59 -0
  49. package/src/arduino-class-map.ts +32 -0
  50. package/src/arduino-compile.ts +359 -0
  51. package/src/arduino-libs.ts +33 -0
  52. package/src/cli-metadata.ts +250 -0
  53. package/src/cpp-parser.ts +361 -0
  54. package/src/debug-codegen.ts +155 -0
  55. package/src/displays/ili9341-spi.ts +33 -0
  56. package/src/displays/ssd1309-i2c.ts +19 -0
  57. package/src/displays/st7796-spi.ts +23 -0
  58. package/src/graphics/ili9341.ts +80 -0
  59. package/src/index.ts +37 -0
  60. package/src/lib-declaration.ts +493 -0
  61. package/src/lib-discovery.ts +267 -0
  62. package/src/profile.ts +676 -0
  63. package/src/strategy.ts +2126 -0
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "@typecad/framework-arduino",
3
+ "version": "0.1.0-alpha.1",
4
+ "description": "TypeCAD framework package for Arduino framework code generation",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./arduino": {
14
+ "types": "./dist/arduino/index.d.ts",
15
+ "default": "./dist/arduino/index.js"
16
+ },
17
+ "./graphics/ili9341": {
18
+ "types": "./dist/graphics/ili9341.d.ts",
19
+ "default": "./dist/graphics/ili9341.js"
20
+ },
21
+ "./displays/ili9341-spi": {
22
+ "types": "./dist/displays/ili9341-spi.d.ts",
23
+ "default": "./dist/displays/ili9341-spi.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "src"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc",
32
+ "prepublishOnly": "npm run build",
33
+ "test:hw": "npm exec -- cuttlefish-test",
34
+ "test:hw:basics": "npm exec -- cuttlefish-test tests/01-basics.test.ts"
35
+ },
36
+ "dependencies": {
37
+ "@typecad/hal": "0.1.0-alpha.1"
38
+ },
39
+ "devDependencies": {
40
+ "@typecad/expect": "0.1.0-alpha.1",
41
+ "@typecad/board-esp32-devkit": "0.1.0-alpha.1"
42
+ },
43
+ "license": "MIT",
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/justind000/typecode.git",
50
+ "directory": "packages/framework-arduino"
51
+ },
52
+ "homepage": "https://github.com/justind000/typecode/tree/main/packages/framework-arduino",
53
+ "bugs": {
54
+ "url": "https://github.com/justind000/typecode/issues"
55
+ },
56
+ "keywords": [
57
+ "arduino",
58
+ "cpp",
59
+ "cuttlefish",
60
+ "embedded",
61
+ "esp32",
62
+ "firmware",
63
+ "framework",
64
+ "microcontroller",
65
+ "typecad",
66
+ "typescript"
67
+ ],
68
+ "engines": {
69
+ "node": ">=18"
70
+ },
71
+ "author": "typecad0",
72
+ "sideEffects": false
73
+ }
@@ -0,0 +1,72 @@
1
+ // ---------------------------------------------------------------------------
2
+ // @typecad/framework-arduino — I2C Arduino-compatible API interface
3
+ //
4
+ // Arduino Wire-compatible methods for I2C communication.
5
+ // ---------------------------------------------------------------------------
6
+
7
+ import type { I2CAddress } from '@typecad/hal';
8
+
9
+ // ---------------------------------------------------------------------------
10
+ // Arduino Wire-compatible Interface
11
+ // ---------------------------------------------------------------------------
12
+
13
+ /**
14
+ * Arduino Wire-compatible I2C bus interface.
15
+ *
16
+ * Usage:
17
+ * ```typescript
18
+ * import { I2C0 } from '@typecad/framework-arduino/arduino';
19
+ *
20
+ * I2C0.begin();
21
+ * I2C0.setClock(400000);
22
+ * I2C0.beginTransmission(0x76);
23
+ * I2C0.write(0xFA);
24
+ * const status = I2C0.endTransmission();
25
+ * const bytesAvailable = I2C0.requestFrom(0x76, 2);
26
+ * const data = I2C0.read();
27
+ * ```
28
+ */
29
+ export interface II2CArduino {
30
+ readonly busNumber: number;
31
+ readonly isInitialized: boolean;
32
+
33
+ // --- Initialization ---
34
+ /** Initialize as I2C master. */
35
+ begin(): void;
36
+ /** Initialize as I2C slave with given address. */
37
+ begin(address: I2CAddress): void;
38
+
39
+ // --- Transactional write API ---
40
+ /** Begin a transmission to the given address. */
41
+ beginTransmission(address: I2CAddress): void;
42
+ /** Write data to the transmission buffer. Returns number of bytes written. */
43
+ write(data: number | Uint8Array | string): number;
44
+ /** End the transmission and send data. Returns status code. */
45
+ endTransmission(stop?: boolean): number;
46
+
47
+ // --- Read API ---
48
+ /** Request bytes from a slave. Returns number of bytes available. */
49
+ requestFrom(address: I2CAddress, quantity: number, stop?: boolean): number;
50
+ /** Number of bytes available to read. */
51
+ available(): number;
52
+ /** Read a single byte from the buffer. Returns -1 if no data available. */
53
+ read(): number;
54
+
55
+ // --- Clock control ---
56
+ /** Set the I2C clock frequency in Hz. */
57
+ setClock(clock: number): void;
58
+
59
+ // --- Slave mode callbacks ---
60
+ /** Register a callback for when data is received as slave. */
61
+ onReceive(handler: (howMany: number) => void): void;
62
+ /** Register a callback for when data is requested from slave. */
63
+ onRequest(handler: () => void): void;
64
+
65
+ // --- Cleanup ---
66
+ /** Disable the Wire peripheral. */
67
+ end(): void;
68
+
69
+ // --- Bus recovery ---
70
+ /** Attempt to recover a stuck bus (toggles SCL to release stuck slaves). */
71
+ recover(): boolean;
72
+ }
@@ -0,0 +1,18 @@
1
+ // ---------------------------------------------------------------------------
2
+ // @typecad/framework-arduino/arduino — Arduino-compatible API types and stubs
3
+ //
4
+ // Import from '@typecad/framework-arduino/arduino' to use Arduino-style APIs
5
+ // (Wire, SPI, Serial) with full TypeScript type checking.
6
+ // ---------------------------------------------------------------------------
7
+
8
+ // Interface definitions
9
+ export type { II2CArduino } from './i2c-arduino.js';
10
+ export type { ISPIArduino } from './spi-arduino.js';
11
+ export type { ISerialArduino } from './uart-arduino.js';
12
+
13
+ // Supporting types from core (re-exported for convenience)
14
+ export type { I2CAddress } from '@typecad/hal';
15
+ export type { SPIMode, SPIBitOrder, SPISettings } from '@typecad/hal';
16
+
17
+ // Arduino Uno stubs
18
+ export { I2C0, SPI0, UART0 } from './stubs-uno.js';
@@ -0,0 +1,63 @@
1
+ // ---------------------------------------------------------------------------
2
+ // @typecad/framework-arduino — SPI Arduino-compatible API interface
3
+ //
4
+ // Arduino SPI-compatible methods for SPI communication.
5
+ // ---------------------------------------------------------------------------
6
+
7
+ import type { SPIMode, SPIBitOrder, SPISettings } from '@typecad/hal';
8
+
9
+ // ---------------------------------------------------------------------------
10
+ // Arduino SPI-compatible Interface
11
+ // ---------------------------------------------------------------------------
12
+
13
+ /**
14
+ * Arduino SPI-compatible bus interface.
15
+ *
16
+ * Usage:
17
+ * ```typescript
18
+ * import { SPI0 } from '@typecad/framework-arduino/arduino';
19
+ *
20
+ * SPI0.begin();
21
+ * SPI0.setMode(0);
22
+ * SPI0.setBitOrder('msb');
23
+ * SPI0.setFrequency(1_000_000);
24
+ *
25
+ * const response = SPI0.transfer(0xAA);
26
+ * SPI0.transferBuffer(buffer);
27
+ * ```
28
+ */
29
+ export interface ISPIArduino {
30
+ readonly isInitialized: boolean;
31
+
32
+ // --- Initialization ---
33
+ /** Initialize the SPI bus. */
34
+ begin(): void;
35
+ /** Disable the SPI bus. */
36
+ end(): void;
37
+
38
+ // --- Transactions ---
39
+ /** Begin a transaction with specific settings. */
40
+ beginTransaction(settings: SPISettings): void;
41
+ /** End the current transaction. */
42
+ endTransaction(): void;
43
+
44
+ // --- Transfer ---
45
+ /** Transfer a single byte (full-duplex). Returns received byte. */
46
+ transfer(data: number): number;
47
+ /** Transfer a buffer (full-duplex). Returns received bytes. */
48
+ transferBuffer(buffer: Uint8Array): Uint8Array;
49
+
50
+ // --- Write (transfer ignoring return) ---
51
+ /** Write a single byte. */
52
+ write(data: number): void;
53
+ /** Write a 16-bit value. */
54
+ write16(data: number): void;
55
+
56
+ // --- Configuration ---
57
+ /** Set clock frequency in Hz. */
58
+ setFrequency(hz: number): void;
59
+ /** Set SPI mode (0-3). */
60
+ setMode(mode: SPIMode): void;
61
+ /** Set bit order. */
62
+ setBitOrder(order: SPIBitOrder): void;
63
+ }
@@ -0,0 +1,80 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Arduino Uno — Arduino-compatible API stub implementations
3
+ //
4
+ // Empty stubs for type checking. The transpiler replaces these with Arduino
5
+ // C++ calls via framework-arduino handlers.
6
+ // ---------------------------------------------------------------------------
7
+
8
+ import type { II2CArduino } from './i2c-arduino.js';
9
+ import type { I2CAddress } from '@typecad/hal';
10
+ import type { ISPIArduino } from './spi-arduino.js';
11
+ import type { SPIMode, SPIBitOrder, SPISettings } from '@typecad/hal';
12
+ import type { ISerialArduino } from './uart-arduino.js';
13
+
14
+ // ---------------------------------------------------------------------------
15
+ // I2C — Wire (bus 0) - Arduino API
16
+ // ---------------------------------------------------------------------------
17
+
18
+ /** Arduino Uno I2C bus 0 (Wire library, pins A4=SDA / A5=SCL). */
19
+ export const I2C0: II2CArduino = {
20
+ busNumber: 0,
21
+ isInitialized: false,
22
+
23
+ begin(_address?: I2CAddress) { /* transpiler: Wire.begin(); or Wire.begin(addr); */ },
24
+ beginTransmission(_address: I2CAddress) { /* transpiler: Wire.beginTransmission(addr); */ },
25
+ write(_data: number | Uint8Array | string): number { return 0; },
26
+ endTransmission(_stop?: boolean): number { return 0; },
27
+ requestFrom(_address: I2CAddress, _quantity: number, _stop?: boolean): number { return 0; },
28
+ available(): number { return 0; },
29
+ read(): number { return -1; },
30
+ setClock(_clock: number) { /* transpiler: Wire.setClock(hz); */ },
31
+ onReceive(_handler: (howMany: number) => void) {},
32
+ onRequest(_handler: () => void) {},
33
+ end() { /* transpiler: Wire.end(); */ },
34
+ recover(): boolean { return true; },
35
+ } as II2CArduino;
36
+
37
+ // ---------------------------------------------------------------------------
38
+ // SPI — SPI (bus 0) - Arduino API
39
+ // ---------------------------------------------------------------------------
40
+
41
+ /** Arduino Uno SPI bus 0 (pins D11=MOSI, D12=MISO, D13=SCK, D10=SS). */
42
+ export const SPI0: ISPIArduino = {
43
+ isInitialized: false,
44
+
45
+ begin() { /* transpiler: SPI.begin(); */ },
46
+ end() { /* transpiler: SPI.end(); */ },
47
+ beginTransaction(_settings: SPISettings) {
48
+ /* transpiler: SPI.beginTransaction(SPISettings(freq, bitOrder, mode)); */
49
+ },
50
+ endTransaction() { /* transpiler: SPI.endTransaction(); */ },
51
+ transfer(_data: number): number { return 0; },
52
+ transferBuffer(_buffer: Uint8Array): Uint8Array { return new Uint8Array(0); },
53
+ write(_data: number): void {},
54
+ write16(_data: number): void {},
55
+ setFrequency(_hz: number): void {},
56
+ setMode(_mode: SPIMode): void {},
57
+ setBitOrder(_order: SPIBitOrder): void {},
58
+ } as ISPIArduino;
59
+
60
+ // ---------------------------------------------------------------------------
61
+ // UART0 — UART 0 (USB / pins D0=RX, D1=TX) - Arduino API
62
+ // ---------------------------------------------------------------------------
63
+
64
+ /** Arduino Uno hardware serial (UART 0, pins D0/RX, D1/TX, + USB). */
65
+ export const UART0: ISerialArduino = {
66
+ uartNumber: 0,
67
+ baudRate: 9600,
68
+ isInitialized: false,
69
+
70
+ begin(_baud: number) { /* transpiler: Serial.begin(baud); */ },
71
+ end() { /* transpiler: Serial.end(); */ },
72
+ available(): number { return 0; },
73
+ peek(): number { return -1; },
74
+ read(): number { return -1; },
75
+ write(_data: number | Uint8Array | string): number { return 0; },
76
+ flush() {},
77
+ print(..._args: unknown[]) {},
78
+ println(..._args: unknown[]) {},
79
+ printf(_format: string, ..._args: unknown[]) {},
80
+ } as ISerialArduino;
@@ -0,0 +1,59 @@
1
+ // ---------------------------------------------------------------------------
2
+ // @typecad/framework-arduino — UART/Serial Arduino-compatible API interface
3
+ //
4
+ // Arduino Serial-compatible methods for UART communication.
5
+ // ---------------------------------------------------------------------------
6
+
7
+ // ---------------------------------------------------------------------------
8
+ // Arduino Serial-compatible Interface
9
+ // ---------------------------------------------------------------------------
10
+
11
+ /**
12
+ * Arduino Serial-compatible UART interface.
13
+ *
14
+ * Usage:
15
+ * ```typescript
16
+ * import { UART0 } from '@typecad/framework-arduino/arduino';
17
+ *
18
+ * UART0.begin(9600);
19
+ * UART0.println("Hello, World!");
20
+ *
21
+ * if (UART0.available() > 0) {
22
+ * const data = UART0.read();
23
+ * UART0.write(data);
24
+ * }
25
+ * ```
26
+ */
27
+ export interface ISerialArduino {
28
+ readonly uartNumber: number;
29
+ readonly baudRate: number;
30
+ readonly isInitialized: boolean;
31
+
32
+ // --- Initialization ---
33
+ /** Initialize with baud rate. */
34
+ begin(baud: number): void;
35
+ /** Deinitialize the UART. */
36
+ end(): void;
37
+
38
+ // --- Read API ---
39
+ /** Number of bytes available to read. */
40
+ available(): number;
41
+ /** Peek at next byte without consuming. Returns -1 if no data. */
42
+ peek(): number;
43
+ /** Read a single byte. Returns -1 if no data available. */
44
+ read(): number;
45
+ /** Write a single byte or buffer. Returns number of bytes written. */
46
+ write(data: number | Uint8Array | string): number;
47
+
48
+ // --- Buffer control ---
49
+ /** Wait for transmission to complete. */
50
+ flush(): void;
51
+
52
+ // --- Print helpers ---
53
+ /** Print values without newline. */
54
+ print(...args: unknown[]): void;
55
+ /** Print values with newline. */
56
+ println(...args: unknown[]): void;
57
+ /** Printf-style formatted print. */
58
+ printf(format: string, ...args: unknown[]): void;
59
+ }
@@ -0,0 +1,32 @@
1
+ import { getArduinoLibraryClassNames, isArduinoLibraryImport } from "./arduino-libs.js";
2
+
3
+ // Module-level cache for Arduino library class name mappings.
4
+ // Maps module specifier -> (simple class name -> fully qualified name)
5
+ const arduinoClassNameCache = new Map<string, Map<string, string>>();
6
+
7
+ export interface ArduinoImportLike {
8
+ moduleSpecifier: string;
9
+ namedImports: string[];
10
+ }
11
+
12
+ export function buildArduinoClassNameMap(imports: ArduinoImportLike[]): Map<string, string> {
13
+ const result = new Map<string, string>();
14
+
15
+ for (const importedModule of imports) {
16
+ if (!isArduinoLibraryImport(importedModule.moduleSpecifier)) {
17
+ continue;
18
+ }
19
+
20
+ let classMap = arduinoClassNameCache.get(importedModule.moduleSpecifier);
21
+ if (!classMap) {
22
+ classMap = getArduinoLibraryClassNames(importedModule.moduleSpecifier);
23
+ arduinoClassNameCache.set(importedModule.moduleSpecifier, classMap);
24
+ }
25
+
26
+ for (const [simpleName, fullName] of classMap) {
27
+ result.set(simpleName, fullName);
28
+ }
29
+ }
30
+
31
+ return result;
32
+ }