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