릴리즈 노트

CrossPoint Reader 한국어 펌웨어 버전별 변경사항

현재 버전v1.2.0-ko.15

v1.2.0-ko.15

최신
1.2.0-ko.152026년 4월 30일
GitHub

주요 변경

  • SD 카드 펌웨어 업데이트 메뉴 추가 (설정 → 시스템 → SD카드 펌웨어 업데이트)
  • OTA / SD 업데이트 모두 X4 실리콘에서 동작하도록 raw 파티션 쓰기 + 직접 otadata 갱신으로 우회 (런타임 ESP-IDF의 가짜 esp_image_verify efuse 거부 회피)
  • 빌드타임 X3 호환 패치 자동 적용firmware.bin이 X3 부트로더와도 호환되는 상태로 배포됨
  • 진행률 바 0→100% 부드럽게 표시, 완료 후 자동 재부팅

업데이트 방법

1. 처음 X3 사용자 (USB가 안 되는 OEM 펌웨어 상태)

  1. 아래 firmware.bin을 다운로드
  2. SD 카드 루트 폴더에 복사하면서 파일명을 update.bin 으로 변경
  3. SD 카드를 디바이스에 삽입
  4. 왼쪽 사이드 버튼을 누른 상태에서 전원 버튼을 길게 눌러 부팅
  5. OEM 부트로더가 update.bin을 자동 인식해 플래싱

2. 기존 사용자 (이미 CrossPoint Reader-KO를 쓰고 있는 경우)

  • SD: firmware.bin을 SD에 복사 → 설정 → 시스템 → SD카드 펌웨어 업데이트
  • OTA: WiFi 연결 상태에서 설정 → 시스템 → 업데이트
  • 웹플래셔: https://crosspoint.idlerecord.com/flasher/

3. OEM(스토어) 펌웨어로 롤백

  1. X3 OEM 펌웨어 다운로드: https://domestic-static-file.oss-cn-hangzhou.aliyuncs.com/admin_uploads/firmware/202604/27/751e134f-22b1-4a00-bbfa-0942593ef867/V5.4.3-X3-CH-PROD-0425_160909.bin
  2. SD 카드 적당한 위치에 복사
  3. 설정 → 시스템 → SD카드 펌웨어 업데이트 → 해당 펌웨어 선택

알려진 호환성 사항

  • 시리얼 넘버가 붙은 X3 패키지는 USB 플래싱이 동작하지 않습니다. SD 카드 펌웨어 업데이트 또는 OTA 사용을 권장합니다.

기술 노트

  • SD/OTA가 Arduino Update 클래스와 esp_https_ota_*를 우회하고 raw esp_partition_write + 직접 otadata 갱신으로 동작 (웹플래셔와 동일한 방식)
  • scripts/patch_firmware_image.py가 빌드 시 자동으로 min/max_efuse_blk_rev_full = 0/0xFFFF 적용 + SHA256 재계산

v1.2.0-ko.14

1.2.0-ko.142026년 4월 29일
GitHub

새 기능 — 책별 독서 타이머 (Reading Timer)

이번 릴리스는 책마다 누적 독서 시간을 자동으로 기록하는 독서 타이머 기능을 도입합니다.

핵심

  • EPUB과 TXT 두 리더 모두에서 책을 펼치는 순간부터 독서 시간이 자동 누적됩니다.
  • 누적 시간은 책의 캐시 디렉터리(.crosspoint//reading_stats.bin)에 16바이트 바이너리로 저장되어, 책을 닫고 다시 열어도 이어서 계산됩니다.
  • 리더 메뉴 상단 진행률 라인 우측에 누적 시간 칩이 표시됩니다 (Reading Time: 1h 23m).
  • 메뉴에 독서 타이머 초기화 / Reset Reading Timer 항목이 추가되었습니다 — 두 단계 확인 후에만 누적 값이 0으로 리셋됩니다.

동작 디테일

상황동작
사용자가 페이지를 넘기거나 메뉴에서 돌아옴누적 진행
자동 페이지 넘김 활성 중누적 진행 (장시간 무인 읽기에서도 끊기지 않음)
5분 동안 입력 없음일시 정지 (다음 입력 시 재개)
메뉴/서브 액티비티 진입그동안의 시간은 누적되지 않음 (메뉴 시간 제외)
30초 미만 짧은 세션저장 생략 (SD 카드 마모 방지)
활성 독서 5분마다자동 중간 저장
리더 종료 시잔여 시간 드레인 후 최종 저장

기술 내용

  • 신규 모듈: src/util/ReadingStats.{h,cpp}, src/util/ReadingTimer.{h,cpp}
  • 저장 포맷: 16바이트 (magic 'TIME', version=1, totalSeconds u32, sessionCount u32, little-endian)
  • 시간 누적은 millis() 기반이며 49.7일 롤오버에 안전한 uint32_t 차감을 사용합니다.
  • 단일 tick이 2초를 초과하면 서브 액티비티/슬립 갭으로 간주하여 누적에서 제외합니다.
  • uint32 초 단위 카운터로 약 136년치 시간을 다룰 수 있습니다.

i18n

  • STR_READING_TIME — 독서 시간 / Reading Time
  • STR_RESET_READING_TIMER — 독서 타이머 초기화 / Reset Reading Timer
  • STR_RESET_READING_TIMER_PROMPT — 이 책의 독서 시간을 초기화할까요? / Reset this book's reading time?

호환성

  • 기존 progress.bin, book.bin, section.bin 캐시 포맷에는 영향 없음.
  • reading_stats.bin은 책당 새로 생성되는 파일이며, 없으면 0초로 시작합니다.
  • 기존에 읽던 책의 누적 시간은 이 빌드를 처음 켠 시점부터 0초로 시작합니다.

빌드 정보

  • 환경: ESP32-C3 (Xteink X4)
  • Flash 사용량: ~99.7%
  • DRAM 사용량: ~51.2%

변경 파일

  • src/util/ReadingStats.{h,cpp} (신규)
  • src/util/ReadingTimer.{h,cpp} (신규)
  • src/activities/reader/{Epub,Txt}Reader{,Menu}Activity.{h,cpp}
  • lib/I18n/translations/{english,korean}.yaml
  • platformio.ini (버전 범프)

1.2.0-ko.13

1.2.0-ko.132026년 4월 27일
GitHub

TXT 리더 옵션 적용 + 설정 변경 시 첫 페이지 회귀 버그 수정

개선 사항

TXT 리더에 누락되어 있던 옵션 두 가지 적용

  • 추가 단락 간격 (extraParagraphSpacing) — 단락 사이에 약 반 줄 높이의 여백을 추가합니다. 페이지의 첫 단락 앞에는 적용되지 않아 위쪽 여백이 어색하게 늘어나지 않습니다.
  • 단락 들여쓰기 (paragraphIndent) — 각 단락의 첫 줄에 1em 만큼 들여쓰기를 적용합니다.

페이지 분할 방식 개선

기존엔 linesPerPage = viewportHeight / lineHeight 로 고정된 줄 수만큼 채웠습니다. 단락 간격이 들어가면 마지막 줄이 viewport 밖으로 잘리는 문제가 생기므로, 누적 y 좌표 기반의 동적 페이지네이션으로 교체했습니다. 단락 간격이 켜져 있어도 잘림 없이 정확히 화면에 들어가는 양만큼만 한 페이지로 묶습니다.

정렬 동작 개선

center / justify 정렬이 들여쓰기된 콘텐츠 박스를 기준으로 동작하도록 보정했습니다. 단락 첫 줄과 wrap된 다음 줄의 정렬 기준이 일관됩니다.

버그 수정

설정 변경 시 첫 페이지로 돌아가는 문제 ([현상 #1])

읽고 있는 도중에 폰트, 여백, 정렬, 줄간격 등을 바꾸면 책의 첫 페이지로 회귀하는 문제가 있었습니다.
원인: 설정 변경 감지 시 initialized = false로 다시 초기화 → loadProgress()가 다시 호출 → 진입 시 currentOffset = 0으로 리셋 후 저장된 layout과 현재 layout 비교 검증에서 한 항목이라도 다르면 그대로 0이 유지되는 문제
수정:
  • initializeReader()recomputeLayout() (레이아웃 재계산)과 진행률 로드로 분리
  • progressLoaded 플래그를 추가하여 진행률은 파일을 열 때 한 번만 로드
  • 설정 변경 분기에서는 recomputeLayout()만 호출, currentOffset은 유지하고 라인 경계로 스냅
  • loadProgress()의 layout 검증 제거 — byte offset은 layout-독립적이라 폰트/여백을 바꿔도 그대로 유효

진행률 파일 포맷 변경

progress.bin 포맷이 v1 → v2로 올라갔습니다 (extraParagraphSpacing, paragraphIndent 두 필드 추가).
기존 진행률 파일은 한 번 무효화되어 처음부터 시작합니다. 이후엔 설정 변경에도 위치가 보존됩니다.

적용 옵션 현황

옵션적용
줄간격적용됨
화면 여백적용됨
단락 정렬적용됨
추가 단락 간격이번 릴리즈부터 적용
단락 들여쓰기이번 릴리즈부터 적용
글자단위 줄바꿈적용됨
이전다음
30개의 릴리즈 중 1-3