Skip to content

Commit 70c16b0

Browse files
committed
feat(init): ask about serial interface: uart/usb/usb-serialjtag
1 parent f936825 commit 70c16b0

File tree

3 files changed

+60
-10
lines changed

3 files changed

+60
-10
lines changed

src/project/boards.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
export type BoardFamily = 'esp32' | 'rp2' | 'stm32';
22

3+
export type SerialInterface = 'uart' | 'usb' | 'usb-serialjtag';
4+
5+
export const serialInterfaces: Record<SerialInterface, string> = {
6+
uart: 'UART',
7+
usb: 'USB',
8+
'usb-serialjtag': 'USB Serial/JTAG',
9+
};
10+
311
export interface IBoard {
412
title: string;
513
type: string;
614
family: BoardFamily;
715
idfTarget?: string;
816
serialPins?: { RX: string; TX: string };
17+
serialInterfaces?: SerialInterface[];
918
}
1019

1120
export interface IFamilyInfo {
@@ -21,37 +30,43 @@ export const boards: IBoard[] = [
2130
type: 'board-esp32-c3-devkitm-1',
2231
family: 'esp32',
2332
idfTarget: 'esp32c3',
33+
serialInterfaces: ['uart', 'usb-serialjtag'],
2434
},
2535
{
2636
title: 'ESP32-C6 DevKit',
2737
type: 'board-esp32-c6-devkitc-1',
2838
family: 'esp32',
2939
idfTarget: 'esp32c6',
40+
serialInterfaces: ['uart', 'usb-serialjtag'],
3041
},
3142
{
3243
title: 'ESP32-H2 DevKit',
3344
type: 'board-esp32-h2-devkitm-1',
3445
family: 'esp32',
3546
idfTarget: 'esp32h2',
47+
serialInterfaces: ['uart', 'usb-serialjtag'],
3648
},
3749
{
3850
title: 'ESP32-P4-Function-EV-Board',
3951
type: 'board-esp32-p4-function-ev',
4052
family: 'esp32',
4153
idfTarget: 'esp32p4',
4254
serialPins: { RX: '38', TX: '37' },
55+
serialInterfaces: ['uart', 'usb-serialjtag'],
4356
},
4457
{
4558
title: 'ESP32-S2 DevKit',
4659
type: 'board-esp32-s2-devkitm-1',
4760
family: 'esp32',
4861
idfTarget: 'esp32s2',
62+
serialInterfaces: ['uart', 'usb'],
4963
},
5064
{
5165
title: 'ESP32-S3 DevKit',
5266
type: 'board-esp32-s3-devkitc-1',
5367
family: 'esp32',
5468
idfTarget: 'esp32s3',
69+
serialInterfaces: ['uart', 'usb', 'usb-serialjtag'],
5570
},
5671

5772
// ESP32-based boards
@@ -60,33 +75,44 @@ export const boards: IBoard[] = [
6075
type: 'board-esp32-c3-rust-1',
6176
family: 'esp32',
6277
serialPins: { RX: '20', TX: '21' },
78+
serialInterfaces: ['uart', 'usb-serialjtag'],
6379
},
6480
{
6581
title: 'ESP32-S3-BOX',
6682
type: 'board-esp32-s3-box',
6783
family: 'esp32',
6884
serialPins: { RX: 'G44', TX: 'G43' },
85+
serialInterfaces: ['uart', 'usb-serialjtag'],
6986
},
7087
{
7188
title: 'ESP32-S3-BOX-3',
7289
type: 'board-esp32-s3-box-3',
7390
family: 'esp32',
7491
serialPins: { RX: 'G44', TX: 'G43' },
92+
serialInterfaces: ['uart', 'usb-serialjtag'],
93+
},
94+
{
95+
title: 'M5Stack CoreS3',
96+
type: 'board-m5stack-core-s3',
97+
family: 'esp32',
98+
serialPins: { RX: 'G44', TX: 'G43' },
99+
serialInterfaces: ['uart', 'usb-serialjtag'],
75100
},
76-
{ title: 'M5Stack CoreS3', type: 'board-m5stack-core-s3', family: 'esp32' },
77101

78102
// RP2040-based boards
79103
{
80104
title: 'Raspberry Pi Pico',
81105
type: 'wokwi-pi-pico',
82106
family: 'rp2',
83107
serialPins: { RX: 'GP1', TX: 'GP0' },
108+
serialInterfaces: ['uart', 'usb'],
84109
},
85110
{
86111
title: 'Raspberry Pi Pico W',
87112
type: 'board-pi-pico-w',
88113
family: 'rp2',
89114
serialPins: { RX: 'GP1', TX: 'GP0' },
115+
serialInterfaces: ['uart', 'usb'],
90116
},
91117

92118
// STM32 boards

src/project/createDiagram.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
1-
import { families, type IBoard } from './boards.js';
1+
import { families, type IBoard, type SerialInterface } from './boards.js';
22

3-
export function createDiagram(board: IBoard) {
3+
export function createDiagram(board: IBoard, serialInterface?: SerialInterface) {
44
const familyInfo = families[board.family];
55
const serialPins = board.serialPins ?? { RX: 'RX', TX: 'TX' };
6+
const attrs: Record<string, string> = {};
67
const mcuPartId = familyInfo.mcuPartId;
78

9+
const connections: Array<[string, string, string]> = [];
10+
if (!serialInterface || serialInterface === 'uart') {
11+
connections.push(
12+
[`${mcuPartId}:${serialPins.TX}`, '$serialMonitor:RX', ''],
13+
[`${mcuPartId}:${serialPins.RX}`, '$serialMonitor:TX', ''],
14+
);
15+
} else if (serialInterface === 'usb-serialjtag') {
16+
attrs.serialInterface = 'USB_SERIAL_JTAG';
17+
}
18+
819
return {
920
version: 1,
1021
author: 'Uri Shaked',
1122
editor: 'wokwi',
12-
parts: [{ type: board.type, id: mcuPartId }],
13-
connections: [
14-
[`${mcuPartId}:${serialPins.TX}`, '$serialMonitor:RX', ''],
15-
[`${mcuPartId}:${serialPins.RX}`, '$serialMonitor:TX', ''],
16-
],
23+
parts: [{ type: board.type, id: mcuPartId, attrs }],
24+
connections,
1725
};
1826
}

src/project/initProjectWizard.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import chalkTemplate from 'chalk-template';
33
import { existsSync, mkdirSync, writeFileSync } from 'fs';
44
import path from 'path';
55
import { createWokwiToml } from '../WokwiConfig.js';
6-
import { boards, families } from './boards.js';
6+
import { boards, families, type SerialInterface, serialInterfaces } from './boards.js';
77
import { createDiagram } from './createDiagram.js';
88
import { findFirmwarePath } from './findFirmwarePath.js';
99
import { detectProjectType } from './projectType.js';
@@ -98,6 +98,22 @@ export async function initProjectWizard(rootDir: string, opts: { diagramFile?: s
9898
elfPath = elfPathResponse;
9999
}
100100

101+
let serialInterface: SerialInterface | undefined;
102+
if (board.serialInterfaces?.length) {
103+
const serialInterfaceResponse = await select({
104+
message: 'Select the serial interface to use:',
105+
options: board.serialInterfaces.map((item) => ({
106+
value: item,
107+
label: serialInterfaces[item],
108+
})),
109+
});
110+
if (isCancel(serialInterface)) {
111+
cancel('Operation cancelled.');
112+
process.exit(0);
113+
}
114+
serialInterface = serialInterfaceResponse as SerialInterface;
115+
}
116+
101117
let vsCodeDebug: boolean = false;
102118
if (projectType === 'esp-idf') {
103119
const vsCodeDebugAnswer = await confirm({
@@ -131,7 +147,7 @@ export async function initProjectWizard(rootDir: string, opts: { diagramFile?: s
131147
);
132148

133149
log.info(`Writing diagram.json...`);
134-
writeFileSync(diagramFilePath, JSON.stringify(createDiagram(board), null, 2));
150+
writeFileSync(diagramFilePath, JSON.stringify(createDiagram(board, serialInterface), null, 2));
135151

136152
if (vsCodeDebug) {
137153
log.info(`Writing .vscode/launch.json...`);

0 commit comments

Comments
 (0)