Загрузка данных


Нужно исправить реальную работу Fujifilm PTP в проекте FujiScout на физической Fujifilm X-Pro3.

ФАКТЫ ИЗ РЕАЛЬНОГО ТЕСТА:

1. Приложение успешно запускается на физическом iPhone.
2. ImageCaptureCore успешно обнаруживает подключенную Fujifilm X-Pro3 по USB.
3. FujiScout корректно показывает:
   - модель: X-Pro3
   - firmware: 2.00
   - transport: USB / PTP
4. Значит базовое USB/PTP-соединение через ImageCaptureCore уже работает.

ПРОБЛЕМА №1 — CUSTOM SETTINGS / BACKUP

При попытке прочитать C1-C7 приложение выдаёт:

"Камера не сообщает регистры C1-C7 (D18C-D1A5)."

То есть текущая реализация scanPresets() и backup/restore неверно предполагает,
что X-Pro3 отдаёт C1-C7 напрямую через этот набор Device Properties.

ПРОБЛЕМА №2 — RAW LAB

RAW Lab открывается нормально.
RAF-файл выбирается нормально.
После запуска camera-powered RAW conversion интерфейс остаётся в состоянии загрузки БЕСКОНЕЧНО.
Ни JPEG, ни ошибка пользователю не возвращаются.

Это было проверено на реальной Fujifilm X-Pro3 firmware 2.00.

ВАЖНО:

НЕ придумывай:
- PTP operation codes
- Device Property IDs
- offsets D185
- handshake
- формат ответа камеры

НЕ используй mock/stub/fake implementation.

НЕ меняй уже рабочее обнаружение X-Pro3 через ImageCaptureCore без необходимости.

Используй как основной референс реальный open-source проект FilmKit:

https://github.com/eggricesoy/filmkit

Обязательно изучи САМ ИСХОДНЫЙ КОД FilmKit, а не только README.

Особенно найди реализации, связанные с:

- Fujifilm USB/PTP transport
- PTP session
- GetDeviceInfo
- GetDevicePropDesc
- GetDevicePropValue
- SetDevicePropValue
- D185
- custom settings / recipes
- backup / restore
- RAW conversion
- RAW upload
- conversion start
- conversion status/polling
- получением результата JPEG
- operation codes 0x900C / 0x900D и проверь их реальное назначение по коду
- timeout / retry / completion conditions
- X RAW Studio protocol

Также изучи источники, на которые опирается FilmKit, если они есть в репозитории:
rawji
fudge
libgphoto2

После исследования сравни реальную последовательность FilmKit с текущими:

FujiPTPProtocol.swift
FujiPTPManager.swift
RAWLabView.swift
CameraView.swift

ЗАДАЧА 1 — C1-C7

Исправить scanPresets() так, чтобы FujiScout реально читал Custom Settings с физической X-Pro3.

Если X-Pro3 не экспонирует C1-C7 как D18C-D1A5 напрямую, НЕ считать это ошибкой камеры.

Найди и реализуй фактический механизм Fujifilm, который использует FilmKit.

ЗАДАЧА 2 — BACKUP

Реализовать настоящий backup C1-C7.

Backup должен сохранять все необходимые реальные значения камеры для последующего точного restore.

Перед массовой записью C1-C7 автоматически создавать safety backup.

ЗАДАЧА 3 — RESTORE

Реализовать восстановление backup обратно в X-Pro3 реальным способом.

Не пересоздавать неизвестные/sentinel значения наугад.
Если FilmKit читает существующий бинарный блок и патчит поля — использовать тот же принцип.

ЗАДАЧА 4 — RAW LAB

Найти причину бесконечной загрузки.

Текущий loadRAF()/render pipeline должен быть проверен полностью.

Правильный workflow должен быть подтвержден по FilmKit:

RAF
→ передача данных камере
→ инициализация Fujifilm RAW conversion
→ чтение/получение D185
→ изменение нужных параметров
→ запуск конвертации
→ ожидание реального completion state
→ получение ObjectHandle / результата
→ GetObject / JPEG
→ возврат JPEG в RAWLabView

Проверь:
- правильно ли отправляется RAF;
- нужен ли размер RAF отдельным PTP property/operation;
- правильный ли порядок операций;
- правильные ли transaction IDs;
- требуется ли polling;
- что означает успешный response code;
- где камера сообщает завершение;
- как получается handle итогового JPEG;
- как FilmKit определяет, что conversion завершён;
- нужен ли дополнительный handshake перед первой конвертацией.

ЗАДАЧА 5 — НИКАКИХ БЕСКОНЕЧНЫХ ОЖИДАНИЙ

Это обязательно.

Ни одна PTP операция не должна ждать бесконечно.

Добавь разумные timeout'ы для:
- отправки RAF;
- чтения property;
- запуска RAW conversion;
- ожидания результата;
- получения JPEG.

Если камера не ответила, RAW Lab должен выйти из loading state и показать человеку конкретную ошибку.

Например:

"RAW conversion timeout after 15 seconds"

или:

"X-Pro3 rejected PTP operation 0xXXXX, response 0xXXXX"

ЗАДАЧА 6 — PTP DEBUG LOG

Добавь подробный диагностический лог в Debug builds.

Для каждой операции логировать:

TX:
- timestamp
- transaction ID
- operation code
- parameters
- outbound data size

RX:
- response code
- returned data size
- elapsed time

Например:

[PTP TX] #24 OP=0x900C params=[...] data=52143872 bytes
[PTP RX] #24 RC=0x2001 time=1.43s

Это необходимо, чтобы следующий тест на физической X-Pro3 можно было диагностировать без догадок.

Не логировать полный RAF/JPEG binary data.

ЗАДАЧА 7 — UI STATE

RAWLabView должен корректно обрабатывать:

idle
uploadingRAF
readingProfile
rendering
downloadingJPEG
completed
failed(error)

При любой ошибке isBusy/loading обязан сбрасываться.

Нельзя оставлять вечный ProgressView.

ЗАДАЧА 8 — X-PRO3 COMPATIBILITY

Не предполагай автоматически, что протокол X100VI идентичен X-Pro3.

Добавь camera capability layer.

Если определён X-Pro3:
использовать только подтверждённые для неё возможности.

Если конкретная операция реально отличается между поколениями Fuji —
разнести mapping/sequence по camera model.

ПОРЯДОК РАБОТЫ:

1. Сначала изучи текущий проект.
2. Изучи исходный код FilmKit.
3. Перед изменениями кратко напиши:
   - что конкретно было неверно в FujiScout;
   - как на самом деле FilmKit выполняет C1-C7;
   - как на самом деле FilmKit выполняет RAW conversion;
   - почему текущий RAW Lab мог зависать бесконечно.
4. Только после этого внеси изменения.
5. Исправь все связанные файлы проекта самостоятельно.
6. После правок проверь проект на compile errors.

Не заменяй реальную функциональность заглушками ради успешной компиляции.
Цель — работа на реальной Fujifilm X-Pro3 firmware 2.00.
ЗАДАЧА 9 — ВЫБОР СЛОТА C1–C7 ДЛЯ ЗАПИСИ РЕЦЕПТА

После успешного чтения Custom Settings с камеры FujiScout должен показывать реальные текущие слоты камеры:

C1 — [текущее название]
C2 — [текущее название]
C3 — [текущее название]
...
C7 — [текущее название]

Названия и настройки должны быть реально считаны с подключенной камеры, а не храниться как фиктивные локальные значения.

Когда Fuji Scout предлагает новый рецепт и пользователь нажимает:

"Установить в камеру"

НЕ записывать его автоматически в заранее определённый слот.

Открыть экран/Sheet выбора:

"Куда сохранить рецепт?"

и показать C1–C7 с их текущими названиями.

Например:

C1  Portra 400
C2  Classic Neg
C3  Night Chrome
C4  Street
C5  Soft Color
C6  BW Hard
C7  CineStill

Пользователь выбирает конкретный слот.

Перед перезаписью обязательно показать:

"Заменить C3 — Night Chrome?"

и кратко:

Night Chrome
↓
Fuji Scout предложенный рецепт

Только после подтверждения выполнять запись.


ЗАДАЧА 10 — ПЕРЕИМЕНОВАНИЕ CUSTOM SETTINGS

Добавить возможность изменять название каждого C1–C7 непосредственно из FujiScout.

Например:

C3
Night Chrome

→ Rename

→ пользователь вводит:

Tokyo Night

→ FujiScout записывает новое имя непосредственно в камеру.

ВАЖНО:

Не считать, что название Custom Setting является обычной String Device Property.

Изучи FilmKit/rawji/fudge/libgphoto2 и установи, каким реальным Fujifilm PTP механизмом читаются и записываются имена Custom Settings на X-Pro3.

Не придумывать property ID или binary offsets.

Если название хранится внутри D185 или другой бинарной структуры:
- сначала считать существующий блок с камеры;
- корректно распарсить его;
- изменить ТОЛЬКО поле названия;
- сохранить все неизвестные/служебные байты без изменений;
- отправить изменённую структуру обратно в камеру.

Не создавать бинарный блок с нуля, если структура полностью не подтверждена.


ЗАДАЧА 11 — БЕЗОПАСНАЯ ЗАМЕНА РЕЦЕПТА

Перед изменением выбранного C1–C7:

1. Считать его текущее состояние.
2. Создать локальный safety backup именно этого слота.
3. Записать новый рецепт.
4. Прочитать слот повторно.
5. Сравнить реально записанные значения с ожидаемыми.
6. Только после успешной проверки показать:

"Рецепт установлен в C3"

Если verification не прошёл:
- показать ошибку;
- предложить восстановить автоматически созданный safety backup.

Не считать запись успешной только потому, что PTP вернул response OK.


ЗАДАЧА 12 — РЕДАКТОР РЕЦЕПТА ПЕРЕД ЗАПИСЬЮ

Перед отправкой предложенного Fuji Scout рецепта пользователь должен иметь возможность:

- выбрать C1–C7;
- изменить название рецепта;
- посмотреть все параметры;
- при необходимости вручную изменить параметры;
- затем нажать "Записать в камеру".

Название, введённое пользователем, должно по возможности стать реальным названием Custom Setting внутри X-Pro3, а не только названием внутри приложения.


ЗАДАЧА 13 — СИНХРОНИЗАЦИЯ

После подключения камеры FujiScout должен уметь обновить список C1–C7 с камеры.

После любой операции:
- записи рецепта;
- переименования;
- restore backup;

повторно считать изменённый слот с камеры и обновить UI.

Если пользователь изменил C1–C7 непосредственно через меню самой камеры, следующая синхронизация FujiScout должна показать актуальное состояние камеры.


ОЧЕНЬ ВАЖНО:

X-Pro3 является источником истины для C1–C7.

Не создавать отдельную "виртуальную" копию C1–C7 и не выдавать её за содержимое камеры.

Локальная база FujiScout может использоваться для:
- истории;
- backup;
- библиотеки рецептов;
- safety backup;

но экран CAMERA должен показывать то, что реально прочитано с физической камеры.