This website requires JavaScript.
3c69740470
fix(audio,schedule): 音乐只扫 audio/music 避免错播短提示音假失败 + 远端主机完全离线时通过 HTTP REST + WS 主动推送拿到时刻表
main
Henry_Du
2026-08-17 20:10:54 +08:00
9c5d6e9659
fix(audio): 修复线缆 token 死锁(holder=CE-01) + 同组 approaching 等优先级饿死 + 线缆太长前端主机听不到
Henry_Du
2026-08-17 19:48:36 +08:00
dc8f94ce22
fix(broadcast): 修复播放音乐失败 + 临时广播失败 (group.memberNames nodeId/stationName 语义混淆)
Henry_Du
2026-08-17 19:34:10 +08:00
8c9c72fcba
feat(display): 优化外接显示器小屏自适应显示方案
Henry_Du
2026-08-17 19:17:40 +08:00
0335e245e1
fix(audio): 修复终点站/下一站漏播 + 广播卡顿跳音 + 音频wav多变体查找
Henry_Du
2026-08-17 18:34:15 +08:00
1179130656
fix(cablemanager): 修复线缆分组详情编辑时成员被自动刷新打回且保存无效的问题 根因: - cablemanager 每 900ms scheduleAutoReload() 通过 WS state_update 触发 reloadAll({silent:true}),之前 reloadAll 在 detail-view 场景下每次都会无条件把 detailTempMembers 从服务器读回、selectedAvailable/selectedMembers 清空,所以用户刚把某站台 » 加进成员,下一次被动刷新到了就立刻还原(视觉上就是「点过去又跳回来」) - 保存 saveDetail() PUT 本身是能成功的(server PUT /api/audio-cable-groups/:id 的 stationNames 接口契约没问题),但保存之后 loadGroups() 拉完数据又立刻触发 broadcastUpdate()→WS state_update→scheduleAutoReload→又一次 reloadAll()→把刚保存的 detailTempMembers 用服务器值覆盖掉,用户看起来就是「保存无效」 修复 (cablemanager.html reloadAll): 1. 保存 refresh 前后的 prevGroups/prevStations 快照,只有 name/color/description 或站台列表真的变了(groupListChanged/ stationListChanged)才重绘列表和快选,避免心跳、lastSeen、tokenHolder 这些纯瞬时字段反复重绘 2. 区分 silent (被动自动刷) vs 非 silent (用户手动点刷新): - 非 silent:保持原语义,完全用服务器值覆盖所有本地编辑(用户主动点刷新就是要回到当前后台状态) - silent: * 只在 metaChanged 时同步 name/description/color(并且不抢焦点的 input,避免正在打字被重置) * 只在 membersChanged(后台 stationNames 真的跟上次不一样)时才同步成员到 detailTempMembers,否则保持用户未保存的成员编辑不变;同时清理 selected 中已不存在的名字 * renderDualLists 仅在 membersChanged || stationListChanged || metaChanged 才调用,其余时间完全不重绘详情 3. 服务器 PUT 端再验证过 stationNames 接口契约没问题:前端 saveDetail 发 {name,color,description,stationNames} 对得上 server PUT handler,保存完 /api/audio-cable-groups 读回 stationNames 正确 APP_VERSION_TEXT bump 到 v1.0.111
Henry_Du
2026-08-17 18:11:57 +08:00
a58632272e
fix(announce): 修复进站预告音频终点站名字被跳过的问题 根因链: - station_broadcast.lua 通过 BlockReader / CreateTarget 两个分支触发 train_approaching 发送时,只带 destination (中文名/站名),未带 destCode;server 端只能走 getStationCodeFromName(destination) 正则解析,正则没匹配到就会得到 UNK → ch-UNK.wav / ja-UNK.wav 不存在 → 整条目的地段音频被 ffmpeg concat 跳过 - 对比 train_arrival (Peripherals.station 分支) 是有 destCode 字段的(由 Utils.getStationCode + schedule 解析得到),所以到站广播终点站名能正常播出,预告(走 Display/BlockReader 分支)不能 修复: 1. station_broadcast.lua 四处 train_approaching / train_alert Network.send 全部补 destCode = Utils.getStationCode(destination): - L4053 (alert, blockreader) / L4091 (approach, blockreader) - L4221 (alert, createTarget) / L4257 (approach, createTarget) 2. server.js 新增 resolveStationAudioCode(rawCode, rawName) 三级兜底解析: - L1: 直接用 raw destCode(优先级最高,客户端算好的) - L2: 正则解析 destination 名字抽取 code(parens/dash/下划线模式) - L3: 把 destination 名拿去 findStationByFlexibleName 已注册站台表里 fuzzy 匹配,取其 code - 解析不到就打 WARN 日志,提示会跳过这一段 3. handleTrainApproaching / handleTrainArrival / handleTrainDeparture 三个 handler 的 destCode / nextCode 全部切到 resolveStationAudioCode 统一入口,不再各写一遍正则,所有预告/到站/发车音频用同一条解析链,保证结果一致 APP_VERSION_TEXT bump 到 v1.0.110
Henry_Du
2026-08-17 18:05:21 +08:00
fb17de6493
fix(cablemanager): 修复 cablemanager 无法操作 + 一直刷新的问题 - 根因1: GET /api/audio-cable-groups 服务端返回 {groups: list},但前端 loadGroups() 读 data.audioCableGroups → 永远读到 undefined → 始终空列表 修复: 服务端 L3447 同时返回 groups 和 audioCableGroups 两个别名;前端 loadGroups() 优先读 audioCableGroups,不存在则回退 groups - 根因2: WebSocket onmessage 收到 init_state/state_update 立即 reloadAll(带 toast),若事件频繁会反复 re-render + 连弹『数据已刷新』toast → 看起来一直刷新且输入框总被重置 修复: 新增 scheduleAutoReload() 节流(两次自动刷新之间至少间隔 900ms);且自动刷新统一走 reloadAll({silent:true}) 不弹成功/失败 toast;仅用户点刷新按钮才弹提示 - 本地实测: PORT=8999 启动 server 后 /api/stations → {success:true, stations:[]},/api/audio-cable-groups → {success:true, groups:[], audioCableGroups:[]},两个端点均 200 且响应结构含双别名 key - APP_VERSION_TEXT bump 到 v1.0.109
Henry_Du
2026-08-17 17:55:09 +08:00
a3ff8664ee
fix(station_broadcast): 修复 Utils 为 nil 导致启动崩溃的前向引用问题 - 原因: Lua local 变量按声明顺序起作用域,Peripherals.init() 在 L96 定义(体内 L188 引用 Utils.log),而 local Utils={} 原本在 L195 才声明,导致函数体内引用成 _G.Utils(全局,nil) - 修复: 在文件 L71 附近集中前向声明所有顶层模块(Peripherals / Utils / Display / Audio / Network / Main),删除各章节头部重复的 local Module = {},保证 Lua 解析时能正确捕获 local 上值 - APP_VERSION_TEXT bump 到 v1.0.108
Henry_Du
2026-08-17 17:39:15 +08:00
5e466f4553
fix(ui): 补齐 generator.html 和 listmanager.html 的问号剥离兜底 - generator.html: 新增 ds() 钩子,在 renderList / batch 预览 / showToast 三个渲染点统一问号剥离 - listmanager.html: 新增 ds() 钩子,在 renderList / renderSequence / 自定义 select 选项 / showToast 四个点统一问号剥离 - APP_VERSION_TEXT bump 到 v1.0.107
Henry_Du
2026-08-17 17:32:01 +08:00
4c049050ce
feat(ui): 显示层去问号化 + 网页统一 CableManager 风格 + 补齐 select 下拉样式
Henry_Du
2026-08-17 16:17:38 +08:00
e0a1252db6
chore(ui): 首页导航黄色按钮从 Full Info Board 换成 Cable Manager 入口
Henry_Du
2026-08-17 15:53:13 +08:00
b2c415f253
fix(server): 彻底放弃 :path(*) 等参数化通配路由,改用 app.use + req.path 手动截取,解决 path-to-regexp v8.3 启动崩溃
Henry_Du
2026-08-17 15:49:59 +08:00
a6d9b6c418
fix(server): 修复 serve-static 不接受数组 root、改为按请求逐个挂载,避免启动时 TypeError: root path must be a string
Henry_Du
2026-08-17 15:44:38 +08:00
5c462a4d09
fix(server): 改用 Express 5 + path-to-regexp v7 兼容的通配写法,避免路由启动崩溃
Henry_Du
2026-08-17 15:41:36 +08:00
fc66e43379
fix: 修复新版 path-to-regexp 不兼容 '*' 通配符导致启动崩溃
Henry_Du
2026-08-17 15:38:41 +08:00
c9d8994942
chore: 版本号升到 v1.0.100
Henry_Du
2026-08-17 15:33:54 +08:00
4c7d94f2c9
feat(A1+B1): 引入站台多主机识别、音频线缆分组互斥令牌、本地Modem仲裁、线缆分组管理WebUI
Henry_Du
2026-08-17 15:32:20 +08:00
6ac05d3a84
feat(server): 实施 A1 方案 - 多连接存储、站台分组 Master 选举、audioCableGroup 互斥令牌机制
Henry_Du
2026-08-17 15:15:23 +08:00
55f0312314
feat(audio): 支持斜杠格式的车站编号和模糊搜索匹配
Henry_Du
2026-08-17 14:54:21 +08:00
849b43af39
fix: 修复音乐和临时广播无法播放(AUDIO FREE)的问题 - 重写 waitForInterruptibleDelay/waitForNativeSpeakersEmpty 使用 os.clock() 轮询,替换会抢占 websocket_message 事件的 os.pullEvent() - 重写 queueSamplesSynchronized/playChunkOnSpeakers 重试循环使用 os.sleep() 轮询,不再调用 pullEvent 吞掉音频分块事件 - 重写 Audio.createStream().read() 与 Audio.playerLoop 使用 sleep 轮询, 不再使用 os.pullEvent('audio_chunk')/'audio_queue' 抢事件 - 修复 Audio.playItem 将 wav-stream/wav-stream-live 错误路由到 playPcmS16LEItem,改为路由到 playWavStreamItem(服务端分块每块 带完整 44 字节 WAV 头,需 decodeWavChunkToSamples) - Network.messageLoop audio_start 分支将 wav-stream-live 加入流式 接收判定,避免走 chunks 缓冲逻辑 - 版本号升级至 v1.0.97
Henry_Du
2026-08-17 14:30:54 +08:00
e9819d4894
fix(multiplayer): normalize CRN BlockReader NBT structure with unwrapNbtObject helper to handle SP vs MP differences (single-player wraps every nested object as { [1] = obj } one-element arrays, while multiplayer uses direct maps without [1] wrapper)
Henry_Du
2026-08-16 14:35:18 +08:00
66683f6d13
fix(upcoming): prevent UPCOMING freeze caused by NBT parsing errors in CC environment
Henry_Du
2026-08-16 14:23:43 +08:00
50746ce766
fix(nbt): unwrap single-element arrays in CRN BlockReader NBT parsing (Station[1]/RealTimeStation[1]/ScheduledStation[1]/StationInfo[1]/Train[1]) to get real TrainName/Destination/StationName/Platform; fallback destination to precise StationName code (e.g. CE-03 2) when Destination is invalid or is CRN aggregated tag name. Bump to v1.0.74
Henry_Du
2026-08-16 14:15:24 +08:00
0de59531f9
test(br): diagnose block_reader instead of bailing
Henry_Du
2026-08-16 14:07:13 +08:00
926db04a3e
test: add block_reader NBT dumper for advanced display
Henry_Du
2026-08-16 14:02:38 +08:00
ae213a84a1
feat: 从机站台吸附识别与时刻表自动同步 v1.0.73
Henry_Du
2026-08-16 13:33:10 +08:00
cd5b1d47b0
fix(crn): 修复CRN聚合站(如「千叶」)在CC中文环境下变????导致校正匹配失败引发终点站广播漏播
Henry_Du
2026-08-16 13:25:39 +08:00
716a23cad5
fix(data): 修复权威时刻表与NBT显示粒度不一致导致终点站漏播(「千叶」聚合名 vs「千叶CB-03 6」具体站台)
Henry_Du
2026-08-16 13:05:57 +08:00
ae96c86288
feat: departure广播新增下一站播报 + 客户端预解析station code
Henry_Du
2026-08-16 13:01:32 +08:00
17b03ce0f7
fix(data): 修复NBT(BlockReader/CreateTarget)与车站时刻表数据源不一致导致终点站广播漏播的问题
Henry_Du
2026-08-16 12:44:09 +08:00
32b2c8ce9d
fix: 终点站到达时下一站广播播放异常 + getNextStation 不回绕起点
Henry_Du
2026-08-16 12:41:19 +08:00
34d9ed00d6
fix: 解决自动更新无限重启循环 + 终点站列车不显示在预测列表
Henry_Du
2026-08-16 12:32:11 +08:00
82a4ecd3e8
fix: 确保在站列车(包括终点站列车)始终显示在预测列表中
Henry_Du
2026-08-16 12:22:50 +08:00
1b958c25df
feat(display): 标注终点站[END]与下一站[NEXT]并修复多项显示bug
Henry_Du
2026-08-16 12:01:04 +08:00
1d99634957
fix(audio): 修复导致完全没有声音的回归错误,添加超时防止挂起,修复等待缓冲区清空的逻辑
Henry_Du
2026-08-16 11:58:31 +08:00
af00d57e68
feat: 发布更新时优先使用远程 Gitea 仓库的版本号
Henry_Du
2026-08-16 11:54:29 +08:00
4b972c3ae6
fix(display): 修复时刻表不显示的多个问题
Henry_Du
2026-08-16 11:50:44 +08:00
71f6800a2a
feat(display): 列车进站后在屏幕右侧显示时刻表信息
Henry_Du
2026-08-16 11:45:37 +08:00
b74eb252e3
feat: 在后端增加解析远程 Gitea 最新版本号的接口并展示在前端
Henry_Du
2026-08-16 11:40:47 +08:00
298308b7f3
fix(audio): 修复非高音质环境下 PCM 音频分片播放时的爆音问题
Henry_Du
2026-08-16 11:32:00 +08:00
6b1a531b77
fix(audio): 修复在没有高音质模块时,回退播放实时音频流产生刺耳噪音及可能导致卡死的问题
Henry_Du
2026-08-15 23:30:09 +08:00
2eddc9fefe
1.0.61
Henry_Du
2026-08-15 23:13:10 +08:00
51968cc825
fix(audio): 当扬声器不支持高音质时退回使用默认原版解码播放
Henry_Du
2026-08-15 23:11:25 +08:00
8f70c1f1d3
fix: 发车音乐列表过长时自动换行显示,修复 UI 溢出重叠问题
Henry_Du
2026-08-04 13:13:03 +08:00
d8eee041c8
feat: 明确音频优先级,优化发车音频触发时机
Henry_Du
2026-08-04 13:00:04 +08:00
01ac488aef
fix(client): 解决终端配置界面文字重叠与停站状态进站预告误报问题
Henry_Du
2026-08-04 11:29:45 +08:00
c86fca8449
feat(client): 全面增强站名模糊匹配逻辑,支持中英文混排关键词提取
Henry_Du
2026-08-04 07:42:57 +08:00
6398146ee6
fix(client): 优化停站预告判断条件,彻底解决停站倒秒重复播报
Henry_Du
2026-08-04 07:37:11 +08:00
86e58a5c59
feat(蜂鸣音频资源): 添加 fc2 至 fc14 共13个蜂鸣音效文件
Henry_Du
2026-08-03 19:45:57 +08:00
aa10f0ebe1
chore(server): 屏蔽 HLS RTMP 推流失败的错误日志
Henry_Du
2026-08-03 12:35:16 +08:00
effcd30291
1
Henry_Du
2026-08-03 12:33:59 +08:00
3c25040a84
chore(client): 优化日志输出并清理测试代码
Henry_Du
2026-08-03 12:27:37 +08:00
fdbcfa3b9b
fix(client): 优化停站时间获取,并在列车停站时禁用进站预告
Henry_Du
2026-08-03 12:20:54 +08:00
87fda31485
fix(client): 在 NBT 分支中也应用非车站指令过滤
Henry_Du
2026-08-03 12:09:08 +08:00
f846004091
fix(client): 过滤非车站指令并修复列车停站后重复播报进站预告的问题
Henry_Du
2026-08-03 12:04:13 +08:00
439ed9ea3c
chore(client): 增加调试日志以导出 NBT stop 结构
Henry_Du
2026-08-03 11:28:32 +08:00
eb018dbae9
fix(client): 修复多个同名同目的地的列车互相清除 pending 状态的问题
Henry_Du
2026-08-03 11:14:40 +08:00
619d4e9a20
杂项(station_broadcast): 更新版本至v1.0.50并添加列车ETA调试日志
Henry_Du
2026-08-03 11:09:44 +08:00
3c71d64f79
chore(station_broadcast): 升级版本至v1.0.49并调整ETA触发阈值
Henry_Du
2026-08-03 10:40:12 +08:00
a36b21cfaf
fix(server): 完善列车接近音频的处理与日志记录
Henry_Du
2026-08-03 10:22:04 +08:00
101d392840
fix(CloudServer/server): 修复列车接近处理的ch序列遗漏的站台编号参数
Henry_Du
2026-08-03 09:59:58 +08:00
c8681417a8
refactor(音频模块): 重构wav音频播放与解码逻辑
Henry_Du
2026-08-03 09:51:33 +08:00
bf1895ebc5
perf(audio): 优化音频播放帧处理逻辑,升级版本至v1.0.50
Henry_Du
2026-08-03 09:49:01 +08:00
394f81b9fa
1
Henry_Du
2026-08-03 09:39:00 +08:00
5fb81e3998
feat(audio): 实现流式WAV解码器并优化音频播放逻辑
Henry_Du
2026-08-03 09:37:00 +08:00
e89b82a8b4
1
Henry_Du
2026-08-03 09:27:51 +08:00
5dbd3d667f
fix: restore speaker peripheral detection
Henry_Du
2026-08-03 09:24:58 +08:00
6964e7a47d
refactor(station_broadcast): 清理冗余代码与注释,移除无用文件并更新gitignore
Henry_Du
2026-08-02 22:03:06 +08:00
59865138c7
11
Henry_Du
2026-08-02 21:26:41 +08:00
b2888c6c88
chore(安装脚本与文档): 修改安装脚本下载源并新增教程视频
Henry_Du
2026-08-02 21:24:57 +08:00
aef63ca444
fix: install updater alongside startup script
Henry_Du
2026-08-02 21:20:28 +08:00
10d15dfddc
feat: add station auto update publishing
Henry_Du
2026-08-02 20:04:55 +08:00
52a643a868
tune: shorten delay alert confirmation to 15 seconds
Henry_Du
2026-08-02 19:48:01 +08:00
e29cc0c2ba
tune: trigger approaching announcement earlier
Henry_Du
2026-08-02 19:34:27 +08:00
73f0ba8e69
tune: trigger stable approaching announcement at 45 seconds
Henry_Du
2026-08-02 19:29:26 +08:00
22ea43c1c1
tune: stabilize approaching trigger and show precise ETA
Henry_Du
2026-08-02 19:25:57 +08:00
fb1256fbcc
tune: add delay confirmation and approaching cooldown
Henry_Du
2026-08-02 19:22:01 +08:00
04591fc0c8
fix: dedupe delay alerts to reduce music stutter
Henry_Du
2026-08-02 19:19:00 +08:00
906594008a
fix: remove ch-min from delay announcement
Henry_Du
2026-08-02 19:06:20 +08:00
126aaaf02f
fix: trigger delay alerts from displayed CRN delay
Henry_Du
2026-08-02 19:04:10 +08:00
278de7de6b
feat: announce delay alerts as soon as they appear
Henry_Du
2026-08-02 18:58:54 +08:00
ea22c79008
fix: rename Japanese delay reason audio files
Henry_Du
2026-08-02 18:52:43 +08:00
39dc446958
功能(站点广播): 实现延误与停运列车的双语广播功能
Henry_Du
2026-08-02 18:50:49 +08:00
f922ace154
fix: trigger approaching broadcast under 30 seconds
Henry_Du
2026-08-02 17:42:49 +08:00
b7be4cd00d
fix: use NBT ETA and clean monitor debug output
Henry_Du
2026-08-02 17:33:05 +08:00
9060e79006
fix: use earlier realtime tick for arrival ETA
Henry_Du
2026-08-02 17:14:51 +08:00
426e55a7f0
fix: normalize upcoming ETA keys before text override
Henry_Du
2026-08-02 17:11:31 +08:00
db818209f2
debug: show raw create target line and eta fields
Henry_Du
2026-08-02 17:08:59 +08:00
a1db54b295
fix: parse CRN ETA as value plus unit
Henry_Du
2026-08-02 17:05:53 +08:00
96222ebf06
debug: expand text ETA parsing and show raw eta string
Henry_Du
2026-08-02 17:03:43 +08:00
9f2dc5bb3d
debug: compare text and NBT ETA keys on monitor
Henry_Du
2026-08-02 17:00:24 +08:00
4b95c86af6
fix: align NBT destination with CRN display stopovers
Henry_Du
2026-08-02 16:55:15 +08:00
432b82eae9
feat: prefer CRN display ETA text when available
Henry_Du
2026-08-02 16:48:42 +08:00
23196cd59d
fix: compute ETA using measured tick rate
Henry_Du
2026-08-02 16:44:12 +08:00
ea288b6572
feat: show delay reason/status from CRN NBT on monitor
Henry_Du
2026-08-02 16:41:01 +08:00
61576a7d9e
fix: detect advanced peripherals block reader by type or method
Henry_Du
2026-08-02 16:33:50 +08:00
b725c74e1d
debug: add upcoming trains data probe
Henry_Du
2026-08-02 16:31:07 +08:00
c13a0c9dcc
fix: avoid monitor log overlap and show upcoming status
Henry_Du
2026-08-02 16:24:32 +08:00
5134a4ebf0
fix: restore main loop block structure
Henry_Du
2026-08-02 16:22:44 +08:00