实训台接线:串口要选对。接线做成数据(BoardState.wiring),默认按教材布局图 COM2 ADAM-4017+、COM3 ADAM-4150、COM4 ZigBee 协调器、COM5 LED 屏,实验可在 meta.json 的 wiring 里改:项目 7 的书上代码在一个串口上打开两个模块,这三个实验把 4150 并到 COM2 的 485 总线上。选错串口时返回值照反编译的真机版 dll(4017 全 null、4150 全 false,4150 的 OnOff 和 LED 推送返回成功但设备不动作,ZigBee 返回 false);串口没打开时照教材仿真版。Open / Close / 没打开就读写报告给服务器,实训台最上方用红字提示("程序在 COM2 上打开 ADAM-4150,它接在 COM3""ADAM-4150 的串口没有打开,程序却在读写它"),评分不通过时也附上。只读接线展示:鼠标移到实训台设备上,标题栏写出线路,对应通道、模块、串口高亮;串口服务器按接线列出设备,程序打开的口亮绿点;程序里串口下拉框的灰字按当前接线。打开实验时浏览器发 experiment 消息换接线,老师看学生提交时按作业的实验接线(提交接口返回 sampleId)。"4017"统一写成 ADAM-4017+
CI/CD / test (push) Canceled after 0s
CI/CD / deploy (push) Canceled after 0s

上课前逐个检查 23 个实验后的修改:补上三处评分漏洞(项目 3 任务 1、项目 4 任务 3 的关闭和项目 7 任务 2 的熄灯,程序什么都不做也能通过);评分说明的空格;任务说明按实测补充(项目 2 任务 1–3、项目 3 任务 2、项目 4 任务 2、项目 7 任务 1–3、项目 8 任务 5)。使用说明、设计方案同步,设计方案记下以后可能扩展"物联网设备安装与调试"课

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-28 17:40:57 +08:00
1 parent 163e553de4
commit 46e0f40cce
35 files changed
+637 -98

No files matched your search

+49
View File
@@ -1,5 +1,7 @@
import { expect, test } from 'bun:test'
import { DEFAULT_WIRING, describePortProblem, portProblems } from '@iot/shared'
import { Board } from '../src/board'
import { sampleWiring } from '../src/samples'
test('滑块输入取整并限制在范围内,开关输入只接受布尔值', () => {
const board = new Board()
@@ -31,3 +33,50 @@ test('学生程序控制输出设备:LED 屏、4150 继电器、ZigBee 继电
expect(board.state.relays.every((on) => !on)).toBe(true)
expect(board.state.ledText).toBe('')
})
test('接线:记下程序打开的串口,指出打开错了的设备;复位不改接线,程序结束时串口关闭', () => {
const board = new Board()
board.applyDevice({ type: 'device', device: 'adam4017', action: 'open', data: 'COM2' })
board.applyDevice({ type: 'device', device: 'adam4150', action: 'open', data: 'com2' })
board.applyDevice({ type: 'device', device: 'led', action: 'open', data: '' })
expect(portProblems(board.state).map(describePortProblem)).toEqual([
'程序在 com2 上打开 ADAM-4150,它接在 COM3',
'程序没有选串口就打开了 LED 屏,它接在 COM5',
])
// 项目 7:4150 并到 COM2 的 485 总线上
expect(board.setWiring({ ...DEFAULT_WIRING, adam4150: 'COM2' })).toBe(true)
expect(board.setWiring({ ...DEFAULT_WIRING, adam4150: 'COM2' })).toBe(false)
expect(board.runnerInputs().wiring?.adam4150).toBe('COM2')
expect(portProblems(board.state).map((w) => w.device)).toEqual(['led'])
board.applyDevice({ type: 'device', device: 'led', action: 'close', data: null })
expect(portProblems(board.state)).toEqual([])
board.reset()
expect(board.state.wiring.adam4150).toBe('COM2')
expect(board.state.opened.adam4017).toBe('COM2')
board.programExited()
expect(Object.values(board.state.opened).every((port) => port === null)).toBe(true)
})
test('串口没打开(或已关闭)时程序还在读写设备:提示一次,打开后、程序结束时清除', () => {
const board = new Board()
expect(board.applyDevice({ type: 'device', device: 'adam4150', action: 'unopened', data: null })).toBe(true)
expect(board.applyDevice({ type: 'device', device: 'adam4150', action: 'unopened', data: null })).toBe(false)
expect(portProblems(board.state).map(describePortProblem)).toEqual(['ADAM-4150 的串口没有打开,程序却在读写它(它接在 COM3)'])
board.applyDevice({ type: 'device', device: 'adam4150', action: 'open', data: 'COM3' })
expect(portProblems(board.state)).toEqual([])
board.applyDevice({ type: 'device', device: 'adam4150', action: 'close', data: null })
board.applyDevice({ type: 'device', device: 'adam4150', action: 'unopened', data: null })
expect(portProblems(board.state).map((p) => p.device)).toEqual(['adam4150'])
board.programExited()
expect(portProblems(board.state)).toEqual([])
})
test('实验的接线:项目 7 把 4150 并到 COM2,其他实验和未知实验用默认接线', async () => {
expect(await sampleWiring('p7-t1-智慧教室')).toEqual({ ...DEFAULT_WIRING, adam4150: 'COM2' })
expect(await sampleWiring('p4-t3-报警灯')).toEqual(DEFAULT_WIRING)
expect(await sampleWiring('../p7-t1-智慧教室')).toEqual(DEFAULT_WIRING)
expect(await sampleWiring()).toEqual(DEFAULT_WIRING)
})