From 54e0031a22abb43025bc9764ab28e2a66425fd3f Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 1 Sep 2026 11:27:53 +0300 Subject: [PATCH] Add download timeout with automatic retries and track-skip zifi_input_fifo_check now tracks inactivity in frame-counted quanta (~5s @ 50Hz, so independent of CPU/turbo clock): after ~10s of total silence from the server on a request, it's retried automatically (up to 3 times, resending the already-built request). If retries are also exhausted: for a music download, skip to the next track in the list (capped at 8 consecutive dead tracks so an unreachable network doesn't spin through the whole playlist forever); for anything else, fall back to the existing manual-cancel path. Confirmed working on hardware. --- README.md | 2 + _spg/ZIFI/zifi.spg | Bin 43520 -> 43520 bytes zifi.asm | 100 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 99 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 47b20f7..05942f7 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,8 @@ AT+CIPSNTPTIME? — получить текущее врем **Поправил позицию нижней панели управления.** Она была смещена на пару пикселей вниз относительно верхней панели с самого начала (не моя регрессия) — поправил смещение `GYOFFSL` в `int_text_off`. +**Добавил таймаут загрузки с автоматическими повторами.** Раньше при зависшем/неотвечающем сайте клиент мог ждать данные бесконечно — выйти можно было только вручную нажав крестик отмены. Теперь если от сервера ~10 секунд вообще нет никаких данных (интервал считается по кадрам экрана, 50Гц, не зависит от частоты процессора/турборежима), запрос повторяется — до 3 раз. Если и это не помогло — для музыки клиент переходит к следующему треку в списке (со своим лимитом на подряд неудачные треки, чтобы не крутиться по всему плейлисту вечно, если сети вообще нет), для остального — обычная отмена, как раньше по крестику. + **Мелкие исправления:** - перевёл обращение к порту `#EFF7` (общий системный регистр — управляет не только доступом к часам, но и видеорежимом/turbo/кэшем) на read-modify-write вместо прямой перезаписи всего байта, чтобы не сбивать остальные настройки; - исправил баг в разборе двузначного GMT-смещения из `zifi.ini` (например `+10`) — были перепутаны местами разряды; diff --git a/_spg/ZIFI/zifi.spg b/_spg/ZIFI/zifi.spg index 9686c6c11491682c0ed7216f6c2e280faf83e140..013dfefde80feb2bc6e20d92dcea9e9f66b5a283 100644 GIT binary patch delta 6517 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 WU{aUkz({7(4M5`ki@2xixBdqOm0TqN delta 6451 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