v3.5.1
3.5.1은 안정성 확보와 품질 향상을 위한 릴리스입니다. 주요 내용은 다음과 같습니다. 1:1 구성의 Inverse3 + 그립 구성에 대한 자동 페어링, 열린 WebSocket 세션이 없더라도 GET /devices/{id} 최신 모션 상태를 확인할 수 있으며, 힘/위치 모드 전환 시 발생하던 삐걱거리는 소음을 해소하고, 지속적인 부하 하에서 스스로 조정되는 서비스 틱 스케줄러입니다.
하이라이트
- 1↔1 방식의 Inverse3 + 그립 구성의 자동 페어링. Inverse3 기기 1대와 그립 1개가 준비되면 SDK가 자동으로 페어링을 등록합니다. 이를 통해 다중 기기 구성에서
pen_attachedMinverse 의 보정 해제 명령이 실수로 라우팅되는 문제가 더 이상 발생하지 않습니다. - 세션을 열지 않아도 최신
GET /devices/{id}스냅샷을 생성할 수 있게 되었습니다. 펌웨어 v7.5 이상 버전의 Inverse3 / Inverse3x / Minverse 에서는 WebSocket 작동 여부와 관계없이 모션 상태가 20 Hz로 폴링됩니다. v7.5 이전 펌웨어에서는 폴링을 건너뛰고 한 번만 경고를 출력합니다. - 힘/위치 전환 시 삐걱거리는 소리가 더 이상 나지 않게 되었습니다.
set_cursor_force↔set_cursor_position전환은 슬롯 배타적으로 이루어지며, 틱 사이에는 장치별로 최신 값만 유지됩니다.HARP 에 명시된 200 ms 유휴 간격 회피 조치는 더 이상 필요하지 않게 되었습니다. - 자동 조정형 틱 스케줄러. 메인 루프는 부하에 따라 전송 속도를 조정하므로, 처리 속도가 느린 틱으로 인해 명령어 큐가 끝없이 커지는 일은 없습니다.
- 부하 상태에서의 1입력 1출력 스트리밍 응답. WS 메시지별 스트리밍 응답은 세션당 1/ms로 제한됩니다. 상한값으로 인해 응답이 거부된 경우 직전 버퍼가 재생되므로, 시뮬레이션 루프가
recv()로 인해 차단되는 일은 없습니다.
내부 개선
장치
- 기기별 Inverse3 ↔ VerseGrip 페어링 레지스트리.
GET|POST|DELETE /devices/{sel}/paired_with는 각 장치별 1대1 매핑입니다.POST는 양쪽 모두에서 중복되는 기존 페어링을 삭제합니다.DELETE선택된 항목을 지웁니다. 선택기는 하나의 ID로 해결되어야 합니다. - 펌웨어 v7.5 이상에서 20 Hz 모션 상태 폴링.
GET /devices/{id}50 ms마다 최신cursor_position、cursor_velocity、angular_position、angular_velocity을 반환합니다. 활성 세션에 대해서는 투명하게 작동합니다. - 무선 VerseGrip의
set_extension_data속도 제어 모드로 변경. 오래된 데이터를 삭제하고, 유휴 상태일 때 반복적으로 전송하는 파이프라인을 서비스 틱마다 처리합니다. 이제 과도한 전송으로 인해 무선 링크가 포화되는 일이 없어졌을 뿐만 아니라, 전송이 부족해 오래된 값이 남아 있는 일도 없어졌습니다.
세션
- 제어 전용 배치(힘/위치)를 위해 WS 수신을 위한 새로운 고속 경로를 추가했습니다. 이 경로에서는 configure 단계를 고려한 파이프라인을 건너뜁니다.
configure、set_profile、커스텀 명령은 계속해서 레이스 상태 수정 처리를 거칩니다.
관측 가능성
- 탐지 로그의 발생 빈도는 포트별로, 그리고 지속성을 고려하여 제어되도록 변경되었습니다. 블랙리스트에 등록된 각 포트는 독립적으로 제어됩니다. 반복적으로 출력되는
"...blacklisted: skipping"해당 행에는 발화 기간 동안 출력이 억제된 틱 수를 나타낸다(×N)가 붙게 되었습니다. - WVG가 아닌 장치를 프로브할 때, 무선 VerseGrip이 감지되어 로그가 넘쳐나는 현상이 더 이상 발생하지 않습니다.
수정
POST /device.config.preset에서defaults또는arm_front을 지정한 경우는 이제 장치의 마운트를 공장 출하 시 기본값으로 재설정합니다(이전에는 아무런 조치도 취하지 않았습니다).basis는 유지되므로, 앱에서 설정된 기본값은 마운트 프리셋을 변경한 후에도 그대로 유지됩니다.force_render_full_state하지만config블록이 누락된 스냅샷을 더 이상 반환하지 않습니다.. 해당 configure가 동일한 WS 메시지 내에서 수신된 경우, configure 처리가 스냅샷 생성 전에 동기적으로 완료됩니다.- 세션 간에
force_render_full_state하지만 이제 대상의 완전한 스냅샷을 반환하게 되었습니다. 이제 A와 B 모두 완전한 페이로드를 수신하게 되었습니다(기존에는 A가 스트리밍만 수신했습니다). - 알 수 없는
target_session_id세션을 넘나드는 명령어가 더 이상 요청/응답 루프를 멈추게 하지 않습니다. 요청 출처는 자신의 스냅샷과,session-command-dropped이벤트(cross-session-unknown-target)를 수령합니다. - Minverse 다중 장치 보정 잠금 해제가 잘못 라우팅되는 문제가 해결되었습니다. Minverse A의 보정으로 인해 Minverse B의 잠금이 해제되는 일이 더 이상 발생하지 않습니다. inkwell-success 헤더 브로드캐스트도 마찬가지로 수정되었습니다.
- HTTP 장치 선택기 는, 장치 ID로
#1234그리고1234두 가지 모두를 지원합니다. 셀렉터 클래스(inverse3、verse_grip)는 인덱스와 함께 작동합니다. 404 오류 메시지에는 원래의 선택자 표현식이 그대로 유지됩니다. - 무선 VerseGrip의
ready플래그는 초기 장치 정보 핸드셰이크 과정을 거친 후에 설정되도록 변경되었습니다.。이전에는 특정 재연결 경로에서, 장치가 자신을 완전히 알리기 전에 플래그가 전환될 가능성이 있었습니다. - keyed-rate-gate를 기반으로 하는 설정의 실행 시 변경 사항이 다음 참조 시점부터 반영되도록 변경되었습니다(기존에는 첫 번째 emplace 시점에 고정되어 있었으며, 변경 사항은 새로운 세션에서만 반영되었습니다).
파괴적인 변경의 가능성
basis、preset、mount、transform、force_gate전체적으로 HTTP의 404 오류 메시지를 통일했습니다:"{type} device #{id} not found"를"no device matches selector '{expr}'"로 변경했습니다. 세션의 404도 마찬가지로 변경했습니다.- 힘 스케일 이득, 힘 게이트 이득, 제어 타임아웃,
safeties/expose_in_snapshot에 대한 설정 glob을devices/inverse*/...부터devices/*inverse/...로 변경했습니다。구식 리터럴을 사용하는 3.5.0 설정 파일은 바인딩에 실패합니다. - 설정: 직렬화 관련 전역 설정을
session/serialization/*로 이동했습니다(explicit_fields、force_complete_transforms、preview/*). 기존 패스의serialization/*는 권장되지 않는 별칭을 통해 계속해서 해결되지만, 4.0 버전에서 삭제될 예정입니다. - 동작: 메시지별 WS 응답을 틱 동기화 핸드셰이크로 사용하는 클라이언트의 경우, 지속적인 트래픽이 발생하는 상황에서도 세션당 1ms마다 최대 1건의 응답만 수신하게 됩니다. 설정 변경 시 생성되는 전체 스냅샷에는 영향을 미치지 않습니다.
권장하지 않음
3.5.1 버전에서는 비추천 항목이 없습니다. 미리보기 모드의 마스터 스위치는 향후 3.6 버전에서 도입될 ‘무통보’에서 ‘경고’로의 전환 파이프라인을 위한 비추천 조치의 기반이 됩니다. 첫 번째 비추천 조치는 3.5.2 버전에서 이루어질 예정입니다.