@@ -479,6 +479,31 @@ export function grabTranslation2dArray(log: Log, key: string, timestamp: number,
479479}
480480
481481export function grabTranslation3dArray ( log : Log , key : string , timestamp : number , uuid ?: string ) : AnnotatedPose3d [ ] {
482+ // Try reading directly from the raw WPILib struct byte array
483+ // Special case to support large arrays of game piece poses (#477 workaround)
484+ let rawData = getOrDefault ( log , key , LoggableType . Raw , timestamp , null , uuid ) ;
485+ if ( rawData !== null ) {
486+ let poses : AnnotatedPose3d [ ] = [ ] ;
487+ let dataView = new DataView ( rawData . buffer , rawData . byteOffset , rawData . byteLength ) ;
488+
489+ // A Translation3d WPILib struct is 3 little-endian doubles (24 bytes)
490+ for ( let i = 0 ; i <= rawData . byteLength - 24 ; i += 24 ) {
491+ poses . push ( {
492+ pose : {
493+ translation : [
494+ dataView . getFloat64 ( i , true ) , // x
495+ dataView . getFloat64 ( i + 8 , true ) , // y
496+ dataView . getFloat64 ( i + 16 , true ) // z
497+ ] ,
498+ rotation : Rotation3dZero
499+ } ,
500+ annotation : { is2DSource : false }
501+ } ) ;
502+ }
503+ return poses ;
504+ }
505+
506+ // Fallback to reading parsed child fields
482507 return indexArray ( getOrDefault ( log , key + "/length" , LoggableType . Number , timestamp , 0 , uuid ) ) . reduce (
483508 ( array , index ) => array . concat ( grabTranslation3d ( log , key + "/" + index . toString ( ) , timestamp ) ) ,
484509 [ ] as AnnotatedPose3d [ ]
@@ -551,6 +576,36 @@ export function grabChoreoSampleArray(log: Log, key: string, timestamp: number,
551576}
552577
553578export function grabPose3dArray ( log : Log , key : string , timestamp : number , uuid ?: string ) : AnnotatedPose3d [ ] {
579+ // Try reading directly from the raw WPILib struct byte array
580+ // Special case to support large arrays of game piece poses (#477 workaround)
581+ let rawData = getOrDefault ( log , key , LoggableType . Raw , timestamp , null , uuid ) ;
582+ if ( rawData !== null ) {
583+ let poses : AnnotatedPose3d [ ] = [ ] ;
584+ let dataView = new DataView ( rawData . buffer , rawData . byteOffset , rawData . byteLength ) ;
585+
586+ // A Pose3d/Transform3d WPILib struct is 7 little-endian doubles (56 bytes)
587+ for ( let i = 0 ; i <= rawData . byteLength - 56 ; i += 56 ) {
588+ poses . push ( {
589+ pose : {
590+ translation : [
591+ dataView . getFloat64 ( i , true ) , // x
592+ dataView . getFloat64 ( i + 8 , true ) , // y
593+ dataView . getFloat64 ( i + 16 , true ) // z
594+ ] ,
595+ rotation : [
596+ dataView . getFloat64 ( i + 24 , true ) , // w
597+ dataView . getFloat64 ( i + 32 , true ) , // x
598+ dataView . getFloat64 ( i + 40 , true ) , // y
599+ dataView . getFloat64 ( i + 48 , true ) // z
600+ ]
601+ } ,
602+ annotation : { is2DSource : false }
603+ } ) ;
604+ }
605+ return poses ;
606+ }
607+
608+ // Fallback to reading parsed child fields
554609 return indexArray ( getOrDefault ( log , key + "/length" , LoggableType . Number , timestamp , 0 , uuid ) ) . reduce (
555610 ( array , index ) => array . concat ( grabPose3d ( log , key + "/" + index . toString ( ) , timestamp ) ) ,
556611 [ ] as AnnotatedPose3d [ ]
0 commit comments