Commit Graph

  • 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