주요 내용 {#highlights}
‘장치 범위 설정’에 대한 변경 사항이 이제 해당 장치를 보유한 모든 클라이언트 세션에 반영됩니다. 이 방식은 쓰기 작업이 수행된 세션에만 반영되던 방식이 아닙니다. 두 번째 뷰어는 폴링을 하는 대신 자체적으로 세션 업데이트됨 이벤트가 수신되면 페이지가 새로 고침됩니다. 디바이스를 보유한 각 세션마다 정확히 한 번의 이벤트가 발생하며, 쓰기 작업을 수행한 클라이언트에서는 두 번 발생하지 않습니다.이제 클라이언트에 디바이스의 실제 마운트 위치를 보고할 수 있습니다. 이는 서비스가 항상 세션에 설정된 마운트만 보고하던 방식과는 다릅니다. 두 값 중 어느 쪽을 보고 있는지 알려주는 레이블은 이제 모든 출력 형식에서 구조적으로 정확합니다.디바이스가 자체 마운트 기준값을 유지하는 경우 서비스도 이를 따릅니다. 이전에는 서비스가 디바이스 기동 시 캡처한 값을 그대로 제공했고 다시 확인하지 않았습니다. 이제 클라이언트의 렌더링 주기에 맞춰 요청 시 기준값을 새로 고칠 수 있습니다. 빠른 클라이언트가 디바이스 링크에 과부하를 주지 않도록 서비스 측에서 속도를 제한하며, 마운트가 실제로 회전한 후에 변경 사항을 한 번 알립니다.내부 개선 사항 {#internal-improvements}
실험적 그립 요(yaw) 드리프트 자동 보정. 새로운 서비스 모듈이 Wireless VerseGrip의 관성 요 드리프트에 대한 보정 루프를 완성합니다. 그립의 절대 요 값을 그립이 부착된 페어링된 Inverse3 또는 Minverse의 움직임에 맞추고, 일련의 품질 게이트가 모두 충족되면 단일 보정값을 그립 펌웨어에 기록합니다. 이 기능은 기본적으로 비활성화된 상태로 배포되며, 실험용 옵트인 스위치를 켠 경우에만 사용할 수 있습니다. 또한 런타임 스위치가 포함되어 있어, 스위치를 전환하는 순간 활성 상태인 모든 그립의 보정을 강제적으로 비활성화합니다. 이 기능은 장치 펌웨어에 쓰기 작업을 수행하므로 이 스위치는 필수적입니다.모든 디바이스를 대상으로 하는 설정 적용은 이제 완전히 적용되거나 아예 적용되지 않습니다. 디바이스를 변경하기 전에 전체 선택 항목에 대해 펌웨어 기능과 디바이스 준비 상태를 검증합니다. 따라서 펌웨어 버전이 혼합된 디바이스 그룹에서 두 번째 디바이스에 오류가 발생하여 절반만 전환된 상태로 남는 일이 더 이상 발생하지 않습니다.그립 펌웨어 확인 응답을 이제 요청별로 추적합니다. 단일 공유 결과 슬롯으로 인해 두 명의 동시 요청자가 서로의 응답을 놓칠 수 있었으며, 모호한 하나의 값이 “거부됨”과 “아직 응답 없음”을 동시에 의미하기도 했습니다. 그 결과, 거부가 재시도 폭주로 이어질 수 있었습니다. 이제 각 요청은 고유한 토큰을 가지며, 실제로 전송되지 않은 요청은 등록되지 않습니다. 응답이 누락되면 중단되지 않고 실패로 처리됩니다. 이를 수행하는 스윕(sweep)은 대기 중인 요청이 없을 때 비용이 발생하지 않습니다.Inkwell 도크 보정은 새로운 그립 펌웨어 기능 검사의 영향을 받지 않습니다. 펜을 도킹하면 전체 자세 재보정이 수행되며, 이는 펌웨어 버전과 관계없이 출하된 모든 펜에서 정상적인 동작입니다. 이 경로는 계산된 방향 보정을 위해 도입된 최소 기능 요건에서 명시적으로 제외되어 있으며, 해당 제외 사항은 추론에 맡기지 않고 호출 지점에 명시되어 있습니다.수정 사항 {#fixes}
중력 보상을 재설정할 때, 이제 초과 보상이 아닌 실제 기본값으로 복원됩니다. 이름과는 달리 config/중력 보정의 스케일링 계수 이 필드는 승수가 아닙니다. 이 필드는 장치가 자체 무게 외에 추가로 지탱할 수 있는 엔드 이펙터 페이로드 질량(킬로그램 단위)을 나타냅니다. 재설정 시 이 이름을 그대로 채택하여 “중립” 계수인 1로 복원했습니다. 이는 1킬로그램짜리 가상 페이로드를 설정한 것과 같아서, 재설정 후 기기가 핸들을 위쪽으로 밀어 올리는 상태가 되었습니다. 새로 연결된 기기는 그렇게 작동하지 않습니다. 이제 재설정 시 실제 기본값이 적용됩니다. 보상이 활성화되고 스케일링 계수는 0로 설정되어 있어, 디바이스가 자체 무게만 지탱하고 페이로드가 없다고 가정합니다. 애플리케이션이 재설정을 통해 보상 강도를 높이고 있었다면, 원하는 값을 명시적으로 설정하십시오.‘홈 복귀(home return)’ 재설정 기능이 이제 실제로 다시 활성화됩니다. config/home_return재설정 기능은 호출자에게 활성화되었다고 알리면서도 실제로는 홈 화면 복귀 기능을 비활성화하고 있었습니다. 이제 재설정 시 공장 기본값(켜짐)이 실제로 복원되며, 이후 애플리케이션이 읽어오는 값은 기기가 실제로 사용하는 값과 일치합니다.디바이스 범위 마운트 또는 방향 쓰기 후 다른 클라이언트에 이전 값이 남아 있지 않습니다. 3.5.6 이전 버전에서는 디바이스 자체에 적용된 쓰기(해당 디바이스를 보유한 모든 세션이 공유)가 쓰기를 수행한 클라이언트의 설정만 새로 고쳤으며, 디바이스 전역 경로는 어떤 클라이언트도 새로 고치지 않았습니다. 같은 디바이스를 사용하는 다른 클라이언트는 폴링을 수행하기 전까지 이전 값을 계속 표시했습니다. 이제 해당 디바이스를 보유한 모든 세션에 알림이 전달됩니다.Inkwell 도크 시도를 반복할 때, 한 번의 거부만으로 포기하지 않습니다. 이전 도크의 상태가 도크 간에 유지되어, 두 번째 도크에서는 첫 번째 거부를 재시도 기간의 종료로 간주했습니다. 이제 재시도 기간은 도크 시도마다 재설정됩니다.무선 VerseGrip 디바이스 틱의 데이터 레이스를 수정했습니다. 스테이징 경로가 다른 락에서 데이터를 읽는 동안 연결 스레드가 디바이스 식별자를 재할당할 수 있었습니다. 이제 식별자는 올바른 락 아래에서 한 번에 스냅샷으로 저장되며, 그 아래의 모든 경로(거부 처리 포함)는 이 사본을 기준으로 동작합니다.무선 VerseGrip 송신기 4곳에서 메시지 스테이징이 동기화되지 않던 문제를 수정했습니다. 메시지 전송 경로 4곳이 페이로드와 체크섬을 조립한 후 쓰기 잠금을 획득하지 않은 상태에서 전송을 요청했기 때문에, 두 송신기가 공유 버퍼에서 데이터를 뒤섞을 수 있었습니다.호환성을 저해할 가능성이 있는 변경 사항 {#potential-breaking-changes}
API, 와이어 포맷, 설정 변경 사항은 없습니다. 기본 출력은 3.5.5 버전과 바이트 단위로 동일하며, 삭제되거나 경로가 변경된 라우트가 없고, 공개 C API에도 차이가 없으며, 설정 키의 이름이 변경되거나 삭제되거나 새로운 기본값이 부여된 것도 없습니다. 다만 SDK의 프리뷰 또는 실험적 기능에 옵트인한 애플리케이션은 이번 주기 내에 마이그레이션 작업이 필요합니다. 여기에는 스위치 등급 변경 및 제거된 토큰 세트가 포함되며, 모든 단계는 엔지니어링 참고용 변경 로그에 문서화되어 있습니다.중력 보상 재설정이 3.5.5 버전과는 다른 값을 반환합니다. 필드, 경로, 응답 형식은 변경되지 않았지만, 재설정이 스케일링 계수를 1에 기록한다는 점에 의존하던 애플리케이션은 이제 공장 출하 시 기본값인 0을 받게 됩니다. 어떤 경우든 보상 자체는 계속 활성화된 상태입니다. 재설정에 의존하지 말고 값을 명시적으로 설정하십시오. 위의 수정 사항을 참조하십시오.‘홈 복귀’를 재설정한 후에는 ‘홈 복귀’ 기능이 꺼지지 않고 켜진 상태로 유지됩니다. 필드, 경로, 응답 형식은 변경되지 않았지만, 재설정을 통해 ‘홈 복귀’ 기능을 비활성화하던애플리케이션은 이제 ‘홈 복귀’ 기능이 활성화된 상태를 확인하게 됩니다. 기능을 끄고 싶다면 재설정 후 명시적으로 비활성화하십시오. 위의 수정 사항을 참조하십시오.클라이언트는 추가 설정 이벤트를 수신하게 됩니다. 세션 업데이트됨 이전에 이벤트가 자신의 쓰기 작업으로 인해 발생했을 때만 수신된다고 가정했던 애플리케이션은, 이제 다른 클라이언트가 함께 사용 중인 디바이스를 변경할 때도 이벤트를 수신하게 되며, 그 후 전체 설정 렌더링이 이어집니다. 이는 앞서 설명한 팬아웃의 의도된 결과입니다. 이벤트를 수신한 후 단순히 다시 읽기만 하는 클라이언트는 변경할 필요가 없습니다.