@aircast-4g/mavlink 1.1.11 → 1.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -86,7 +86,8 @@ declare enum MAV_TYPEEnum {
86
86
  MAV_TYPE_SPACECRAFT_ORBITER = 45,
87
87
  MAV_TYPE_GROUND_QUADRUPED = 46,
88
88
  MAV_TYPE_VTOL_GYRODYNE = 47,
89
- MAV_TYPE_GRIPPER = 48
89
+ MAV_TYPE_GRIPPER = 48,
90
+ MAV_TYPE_RADIO = 49
90
91
  }
91
92
  type MAV_TYPE = MAV_TYPEEnum;
92
93
  declare enum MAV_MODE_FLAGEnum {
@@ -207,6 +208,9 @@ declare enum MAV_COMPONENTEnum {
207
208
  MAV_COMP_ID_CAMERA4 = 103,
208
209
  MAV_COMP_ID_CAMERA5 = 104,
209
210
  MAV_COMP_ID_CAMERA6 = 105,
211
+ MAV_COMP_ID_RADIO = 110,
212
+ MAV_COMP_ID_RADIO2 = 111,
213
+ MAV_COMP_ID_RADIO3 = 112,
210
214
  MAV_COMP_ID_SERVO1 = 140,
211
215
  MAV_COMP_ID_SERVO2 = 141,
212
216
  MAV_COMP_ID_SERVO3 = 142,
@@ -267,6 +271,38 @@ declare enum MAV_BOOLEnum {
267
271
  MAV_BOOL_TRUE = 1
268
272
  }
269
273
  type MAV_BOOL = MAV_BOOLEnum;
274
+ declare enum MAV_PROTOCOL_CAPABILITYEnum {
275
+ MAV_PROTOCOL_CAPABILITY_MISSION_FLOAT = 1,
276
+ MAV_PROTOCOL_CAPABILITY_PARAM_FLOAT = 2,
277
+ MAV_PROTOCOL_CAPABILITY_MISSION_INT = 4,
278
+ MAV_PROTOCOL_CAPABILITY_COMMAND_INT = 8,
279
+ MAV_PROTOCOL_CAPABILITY_PARAM_ENCODE_BYTEWISE = 16,
280
+ MAV_PROTOCOL_CAPABILITY_FTP = 32,
281
+ MAV_PROTOCOL_CAPABILITY_SET_ATTITUDE_TARGET = 64,
282
+ MAV_PROTOCOL_CAPABILITY_SET_POSITION_TARGET_LOCAL_NED = 128,
283
+ MAV_PROTOCOL_CAPABILITY_SET_POSITION_TARGET_GLOBAL_INT = 256,
284
+ MAV_PROTOCOL_CAPABILITY_TERRAIN = 512,
285
+ MAV_PROTOCOL_CAPABILITY_RESERVED3 = 1024,
286
+ MAV_PROTOCOL_CAPABILITY_FLIGHT_TERMINATION = 2048,
287
+ MAV_PROTOCOL_CAPABILITY_COMPASS_CALIBRATION = 4096,
288
+ MAV_PROTOCOL_CAPABILITY_MAVLINK2 = 8192,
289
+ MAV_PROTOCOL_CAPABILITY_MISSION_FENCE = 16384,
290
+ MAV_PROTOCOL_CAPABILITY_MISSION_RALLY = 32768,
291
+ MAV_PROTOCOL_CAPABILITY_RESERVED2 = 65536,
292
+ MAV_PROTOCOL_CAPABILITY_PARAM_ENCODE_C_CAST = 131072,
293
+ MAV_PROTOCOL_CAPABILITY_COMPONENT_IMPLEMENTS_GIMBAL_MANAGER = 262144,
294
+ MAV_PROTOCOL_CAPABILITY_COMPONENT_ACCEPTS_GCS_CONTROL = 524288,
295
+ MAV_PROTOCOL_CAPABILITY_GRIPPER = 1048576
296
+ }
297
+ type MAV_PROTOCOL_CAPABILITY = MAV_PROTOCOL_CAPABILITYEnum;
298
+ declare enum FIRMWARE_VERSION_TYPEEnum {
299
+ FIRMWARE_VERSION_TYPE_DEV = 0,
300
+ FIRMWARE_VERSION_TYPE_ALPHA = 64,
301
+ FIRMWARE_VERSION_TYPE_BETA = 128,
302
+ FIRMWARE_VERSION_TYPE_RC = 192,
303
+ FIRMWARE_VERSION_TYPE_OFFICIAL = 255
304
+ }
305
+ type FIRMWARE_VERSION_TYPE = FIRMWARE_VERSION_TYPEEnum;
270
306
 
271
307
  interface MessageHeartbeat {
272
308
  custom_mode: number;
@@ -276,23 +312,45 @@ interface MessageHeartbeat {
276
312
  system_status: MAV_STATE;
277
313
  mavlink_version: number;
278
314
  }
279
- interface MessageProtocolVersion {
280
- spec_version_hash: number[];
281
- library_version_hash: number[];
282
- version: number;
283
- min_version: number;
284
- max_version: number;
315
+ interface MessageGlobalPositionInt {
316
+ time_boot_ms: number;
317
+ lat: number;
318
+ lon: number;
319
+ alt: number;
320
+ relative_alt: number;
321
+ vx: number;
322
+ vy: number;
323
+ vz: number;
324
+ hdg: number;
325
+ }
326
+ interface MessageAutopilotVersion {
327
+ capabilities: MAV_PROTOCOL_CAPABILITY;
328
+ uid: number;
329
+ flight_sw_version: number;
330
+ middleware_sw_version: number;
331
+ os_sw_version: number;
332
+ board_version: number;
333
+ vendor_id: number;
334
+ product_id: number;
335
+ flight_custom_version: number[];
336
+ middleware_custom_version: number[];
337
+ os_custom_version: number[];
338
+ uid2?: number[];
285
339
  }
286
340
  interface MessageTypeMap {
287
341
  HEARTBEAT: MessageHeartbeat;
288
- PROTOCOL_VERSION: MessageProtocolVersion;
342
+ GLOBAL_POSITION_INT: MessageGlobalPositionInt;
343
+ AUTOPILOT_VERSION: MessageAutopilotVersion;
289
344
  }
290
345
  type AnyMessage = ParsedMAVLinkMessage$1;
291
346
  declare function isHeartbeat(msg: ParsedMAVLinkMessage$1): msg is ParsedMAVLinkMessage$1 & {
292
347
  payload: MessageHeartbeat;
293
348
  };
294
- declare function isProtocolVersion(msg: ParsedMAVLinkMessage$1): msg is ParsedMAVLinkMessage$1 & {
295
- payload: MessageProtocolVersion;
349
+ declare function isGlobalPositionInt(msg: ParsedMAVLinkMessage$1): msg is ParsedMAVLinkMessage$1 & {
350
+ payload: MessageGlobalPositionInt;
351
+ };
352
+ declare function isAutopilotVersion(msg: ParsedMAVLinkMessage$1): msg is ParsedMAVLinkMessage$1 & {
353
+ payload: MessageAutopilotVersion;
296
354
  };
297
355
 
298
356
  interface ParsedMAVLinkMessage {
@@ -346,6 +404,8 @@ declare abstract class DialectParser {
346
404
  resetBuffer(): void;
347
405
  decode(frame: MAVLinkFrame): ParsedMAVLinkMessage;
348
406
  private decodePayload;
407
+ private sortFieldsByWireOrder;
408
+ private getFieldTypeSize;
349
409
  private getDefaultValue;
350
410
  private decodeField;
351
411
  private decodeSingleValue;
@@ -385,5 +445,5 @@ declare class StandardSerializer {
385
445
  supportsMessage(messageName: string): boolean;
386
446
  }
387
447
 
388
- export { MAV_AUTOPILOTEnum, MAV_BOOLEnum, MAV_COMPONENTEnum, MAV_MODE_FLAGEnum, MAV_MODE_FLAG_DECODE_POSITIONEnum, MAV_STATEEnum, MAV_TYPEEnum, StandardParser, StandardSerializer, isHeartbeat, isProtocolVersion };
389
- export type { AnyMessage, MAV_AUTOPILOT, MAV_BOOL, MAV_COMPONENT, MAV_MODE_FLAG, MAV_MODE_FLAG_DECODE_POSITION, MAV_STATE, MAV_TYPE, MessageHeartbeat, MessageProtocolVersion, MessageTypeMap, ParsedMAVLinkMessage$1 as ParsedMAVLinkMessage };
448
+ export { FIRMWARE_VERSION_TYPEEnum, MAV_AUTOPILOTEnum, MAV_BOOLEnum, MAV_COMPONENTEnum, MAV_MODE_FLAGEnum, MAV_MODE_FLAG_DECODE_POSITIONEnum, MAV_PROTOCOL_CAPABILITYEnum, MAV_STATEEnum, MAV_TYPEEnum, StandardParser, StandardSerializer, isAutopilotVersion, isGlobalPositionInt, isHeartbeat };
449
+ export type { AnyMessage, FIRMWARE_VERSION_TYPE, MAV_AUTOPILOT, MAV_BOOL, MAV_COMPONENT, MAV_MODE_FLAG, MAV_MODE_FLAG_DECODE_POSITION, MAV_PROTOCOL_CAPABILITY, MAV_STATE, MAV_TYPE, MessageAutopilotVersion, MessageGlobalPositionInt, MessageHeartbeat, MessageTypeMap, ParsedMAVLinkMessage$1 as ParsedMAVLinkMessage };
@@ -148,6 +148,8 @@ var MAV_TYPEEnum;
148
148
  MAV_TYPEEnum[MAV_TYPEEnum["MAV_TYPE_VTOL_GYRODYNE"] = 47] = "MAV_TYPE_VTOL_GYRODYNE";
149
149
  // Gripper
150
150
  MAV_TYPEEnum[MAV_TYPEEnum["MAV_TYPE_GRIPPER"] = 48] = "MAV_TYPE_GRIPPER";
151
+ // Radio
152
+ MAV_TYPEEnum[MAV_TYPEEnum["MAV_TYPE_RADIO"] = 49] = "MAV_TYPE_RADIO";
151
153
  })(MAV_TYPEEnum || (MAV_TYPEEnum = {}));
152
154
  // These flags encode the MAV mode, see MAV_MODE enum for useful combinations.
153
155
  var MAV_MODE_FLAGEnum;
@@ -386,6 +388,12 @@ var MAV_COMPONENTEnum;
386
388
  MAV_COMPONENTEnum[MAV_COMPONENTEnum["MAV_COMP_ID_CAMERA5"] = 104] = "MAV_COMP_ID_CAMERA5";
387
389
  // Camera #6.
388
390
  MAV_COMPONENTEnum[MAV_COMPONENTEnum["MAV_COMP_ID_CAMERA6"] = 105] = "MAV_COMP_ID_CAMERA6";
391
+ // Radio #1.
392
+ MAV_COMPONENTEnum[MAV_COMPONENTEnum["MAV_COMP_ID_RADIO"] = 110] = "MAV_COMP_ID_RADIO";
393
+ // Radio #2.
394
+ MAV_COMPONENTEnum[MAV_COMPONENTEnum["MAV_COMP_ID_RADIO2"] = 111] = "MAV_COMP_ID_RADIO2";
395
+ // Radio #3.
396
+ MAV_COMPONENTEnum[MAV_COMPONENTEnum["MAV_COMP_ID_RADIO3"] = 112] = "MAV_COMP_ID_RADIO3";
389
397
  // Servo #1.
390
398
  MAV_COMPONENTEnum[MAV_COMPONENTEnum["MAV_COMP_ID_SERVO1"] = 140] = "MAV_COMP_ID_SERVO1";
391
399
  // Servo #2.
@@ -501,14 +509,81 @@ var MAV_BOOLEnum;
501
509
  // True.
502
510
  MAV_BOOLEnum[MAV_BOOLEnum["MAV_BOOL_TRUE"] = 1] = "MAV_BOOL_TRUE";
503
511
  })(MAV_BOOLEnum || (MAV_BOOLEnum = {}));
512
+ // Bitmask of (optional) autopilot capabilities (64 bit). If a bit is set, the autopilot supports this capability.
513
+ var MAV_PROTOCOL_CAPABILITYEnum;
514
+ (function (MAV_PROTOCOL_CAPABILITYEnum) {
515
+ // Autopilot supports the MISSION_ITEM float message type.
516
+ // Note that MISSION_ITEM is deprecated, and autopilots should use MISSION_ITEM_INT instead.
517
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_MISSION_FLOAT"] = 1] = "MAV_PROTOCOL_CAPABILITY_MISSION_FLOAT";
518
+ // Autopilot supports the new param float message type.
519
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_PARAM_FLOAT"] = 2] = "MAV_PROTOCOL_CAPABILITY_PARAM_FLOAT";
520
+ // Autopilot supports MISSION_ITEM_INT scaled integer message type.
521
+ // Note that this flag must always be set if missions are supported, because missions must always use MISSION_ITEM_INT (rather than MISSION_ITEM, which is deprecated).
522
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_MISSION_INT"] = 4] = "MAV_PROTOCOL_CAPABILITY_MISSION_INT";
523
+ // Autopilot supports COMMAND_INT scaled integer message type.
524
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_COMMAND_INT"] = 8] = "MAV_PROTOCOL_CAPABILITY_COMMAND_INT";
525
+ // Parameter protocol uses byte-wise encoding of parameter values into param_value (float) fields: https://mavlink.io/en/services/parameter.html#parameter-encoding.
526
+ // Note that either this flag or MAV_PROTOCOL_CAPABILITY_PARAM_ENCODE_C_CAST should be set if the parameter protocol is supported.
527
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_PARAM_ENCODE_BYTEWISE"] = 16] = "MAV_PROTOCOL_CAPABILITY_PARAM_ENCODE_BYTEWISE";
528
+ // Autopilot supports the File Transfer Protocol v1: https://mavlink.io/en/services/ftp.html.
529
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_FTP"] = 32] = "MAV_PROTOCOL_CAPABILITY_FTP";
530
+ // Autopilot supports commanding attitude offboard.
531
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_SET_ATTITUDE_TARGET"] = 64] = "MAV_PROTOCOL_CAPABILITY_SET_ATTITUDE_TARGET";
532
+ // Autopilot supports commanding position and velocity targets in local NED frame.
533
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_SET_POSITION_TARGET_LOCAL_NED"] = 128] = "MAV_PROTOCOL_CAPABILITY_SET_POSITION_TARGET_LOCAL_NED";
534
+ // Autopilot supports commanding position and velocity targets in global scaled integers.
535
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_SET_POSITION_TARGET_GLOBAL_INT"] = 256] = "MAV_PROTOCOL_CAPABILITY_SET_POSITION_TARGET_GLOBAL_INT";
536
+ // Autopilot supports terrain protocol / data handling.
537
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_TERRAIN"] = 512] = "MAV_PROTOCOL_CAPABILITY_TERRAIN";
538
+ // Reserved for future use.
539
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_RESERVED3"] = 1024] = "MAV_PROTOCOL_CAPABILITY_RESERVED3";
540
+ // Autopilot supports the MAV_CMD_DO_FLIGHTTERMINATION command (flight termination).
541
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_FLIGHT_TERMINATION"] = 2048] = "MAV_PROTOCOL_CAPABILITY_FLIGHT_TERMINATION";
542
+ // Autopilot supports onboard compass calibration.
543
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_COMPASS_CALIBRATION"] = 4096] = "MAV_PROTOCOL_CAPABILITY_COMPASS_CALIBRATION";
544
+ // Autopilot supports MAVLink version 2.
545
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_MAVLINK2"] = 8192] = "MAV_PROTOCOL_CAPABILITY_MAVLINK2";
546
+ // Autopilot supports mission fence protocol.
547
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_MISSION_FENCE"] = 16384] = "MAV_PROTOCOL_CAPABILITY_MISSION_FENCE";
548
+ // Autopilot supports mission rally point protocol.
549
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_MISSION_RALLY"] = 32768] = "MAV_PROTOCOL_CAPABILITY_MISSION_RALLY";
550
+ // Reserved for future use.
551
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_RESERVED2"] = 65536] = "MAV_PROTOCOL_CAPABILITY_RESERVED2";
552
+ // Parameter protocol uses C-cast of parameter values to set the param_value (float) fields: https://mavlink.io/en/services/parameter.html#parameter-encoding.
553
+ // Note that either this flag or MAV_PROTOCOL_CAPABILITY_PARAM_ENCODE_BYTEWISE should be set if the parameter protocol is supported.
554
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_PARAM_ENCODE_C_CAST"] = 131072] = "MAV_PROTOCOL_CAPABILITY_PARAM_ENCODE_C_CAST";
555
+ // This component implements/is a gimbal manager. This means the GIMBAL_MANAGER_INFORMATION, and other messages can be requested.
556
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_COMPONENT_IMPLEMENTS_GIMBAL_MANAGER"] = 262144] = "MAV_PROTOCOL_CAPABILITY_COMPONENT_IMPLEMENTS_GIMBAL_MANAGER";
557
+ // Component supports locking control to a particular GCS independent of its system (via MAV_CMD_REQUEST_OPERATOR_CONTROL).
558
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_COMPONENT_ACCEPTS_GCS_CONTROL"] = 524288] = "MAV_PROTOCOL_CAPABILITY_COMPONENT_ACCEPTS_GCS_CONTROL";
559
+ // Autopilot has a connected gripper. MAVLink Grippers would set MAV_TYPE_GRIPPER instead.
560
+ MAV_PROTOCOL_CAPABILITYEnum[MAV_PROTOCOL_CAPABILITYEnum["MAV_PROTOCOL_CAPABILITY_GRIPPER"] = 1048576] = "MAV_PROTOCOL_CAPABILITY_GRIPPER";
561
+ })(MAV_PROTOCOL_CAPABILITYEnum || (MAV_PROTOCOL_CAPABILITYEnum = {}));
562
+ // These values define the type of firmware release. These values indicate the first version or release of this type. For example the first alpha release would be 64, the second would be 65.
563
+ var FIRMWARE_VERSION_TYPEEnum;
564
+ (function (FIRMWARE_VERSION_TYPEEnum) {
565
+ // development release
566
+ FIRMWARE_VERSION_TYPEEnum[FIRMWARE_VERSION_TYPEEnum["FIRMWARE_VERSION_TYPE_DEV"] = 0] = "FIRMWARE_VERSION_TYPE_DEV";
567
+ // alpha release
568
+ FIRMWARE_VERSION_TYPEEnum[FIRMWARE_VERSION_TYPEEnum["FIRMWARE_VERSION_TYPE_ALPHA"] = 64] = "FIRMWARE_VERSION_TYPE_ALPHA";
569
+ // beta release
570
+ FIRMWARE_VERSION_TYPEEnum[FIRMWARE_VERSION_TYPEEnum["FIRMWARE_VERSION_TYPE_BETA"] = 128] = "FIRMWARE_VERSION_TYPE_BETA";
571
+ // release candidate
572
+ FIRMWARE_VERSION_TYPEEnum[FIRMWARE_VERSION_TYPEEnum["FIRMWARE_VERSION_TYPE_RC"] = 192] = "FIRMWARE_VERSION_TYPE_RC";
573
+ // official stable release
574
+ FIRMWARE_VERSION_TYPEEnum[FIRMWARE_VERSION_TYPEEnum["FIRMWARE_VERSION_TYPE_OFFICIAL"] = 255] = "FIRMWARE_VERSION_TYPE_OFFICIAL";
575
+ })(FIRMWARE_VERSION_TYPEEnum || (FIRMWARE_VERSION_TYPEEnum = {}));
504
576
 
505
577
  // Auto-generated TypeScript message interfaces for standard dialect
506
578
  // Type guard functions
507
579
  function isHeartbeat(msg) {
508
580
  return msg.message_name === 'HEARTBEAT';
509
581
  }
510
- function isProtocolVersion(msg) {
511
- return msg.message_name === 'PROTOCOL_VERSION';
582
+ function isGlobalPositionInt(msg) {
583
+ return msg.message_name === 'GLOBAL_POSITION_INT';
584
+ }
585
+ function isAutopilotVersion(msg) {
586
+ return msg.message_name === 'AUTOPILOT_VERSION';
512
587
  }
513
588
 
514
589
  // Auto-generated decoder and parser for standard dialect
@@ -516,7 +591,8 @@ function isProtocolVersion(msg) {
516
591
  // Embedded MAVLink CRC implementation
517
592
  const CRC_EXTRA = {
518
593
  0: 50,
519
- 300: 0
594
+ 33: 104,
595
+ 148: 106
520
596
  };
521
597
  class MAVLinkCRC {
522
598
  static calculate(data, crcExtra) {
@@ -679,7 +755,11 @@ class DialectParser {
679
755
  const result = {};
680
756
  const view = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);
681
757
  let offset = 0;
682
- for (const field of fields) {
758
+ // MAVLink v2 wire format: fields are sorted by type size (largest first)
759
+ // Extension fields come after core fields and maintain their XML order
760
+ // See: https://mavlink.io/en/guide/serialization.html#field_reordering
761
+ const sortedFields = this.sortFieldsByWireOrder(fields);
762
+ for (const field of sortedFields) {
683
763
  if (offset >= payload.length) {
684
764
  result[field.name] = this.getDefaultValue(field);
685
765
  }
@@ -691,6 +771,43 @@ class DialectParser {
691
771
  }
692
772
  return result;
693
773
  }
774
+ // Sort fields by MAVLink v2 wire order: by type size descending, extensions last
775
+ // Uses stable sort to preserve original order for same-size fields
776
+ sortFieldsByWireOrder(fields) {
777
+ // Separate core fields and extension fields
778
+ const coreFields = [];
779
+ const extensionFields = [];
780
+ fields.forEach((field, index) => {
781
+ if (field.extension) {
782
+ extensionFields.push(field);
783
+ }
784
+ else {
785
+ coreFields.push({ field, originalIndex: index });
786
+ }
787
+ });
788
+ // Stable sort core fields by type size (descending)
789
+ // Arrays are sorted by element type size, not total array size
790
+ coreFields.sort((a, b) => {
791
+ const sizeA = this.getFieldTypeSize(a.field);
792
+ const sizeB = this.getFieldTypeSize(b.field);
793
+ if (sizeB !== sizeA) {
794
+ return sizeB - sizeA; // Descending order (largest first)
795
+ }
796
+ // Same size: maintain original XML order (stable sort)
797
+ return a.originalIndex - b.originalIndex;
798
+ });
799
+ // Extension fields maintain their XML order and come after core fields
800
+ return [...coreFields.map(c => c.field), ...extensionFields];
801
+ }
802
+ // Get the size of a single element of a field type (for wire order sorting)
803
+ getFieldTypeSize(field) {
804
+ let baseType = field.type;
805
+ // Strip array notation to get base type (arrays sort by element type, not total size)
806
+ if (baseType.includes('[') && baseType.includes(']')) {
807
+ baseType = baseType.substring(0, baseType.indexOf('['));
808
+ }
809
+ return this.getSingleFieldSize(baseType);
810
+ }
694
811
  getDefaultValue(field) {
695
812
  const isArray = field.arrayLength !== undefined && field.arrayLength > 1;
696
813
  if (isArray) {
@@ -897,15 +1014,19 @@ class DialectParser {
897
1014
  }
898
1015
  }
899
1016
  serializePayload(message, fields) {
1017
+ // MAVLink v2 wire format: fields must be sorted by type size (largest first)
1018
+ // Extension fields come after core fields and maintain their XML order
1019
+ // See: https://mavlink.io/en/guide/serialization.html#field_reordering
1020
+ const sortedFields = this.sortFieldsByWireOrder(fields);
900
1021
  // Calculate total payload size
901
1022
  let totalSize = 0;
902
- for (const field of fields) {
1023
+ for (const field of sortedFields) {
903
1024
  totalSize += this.getFieldSize(field);
904
1025
  }
905
1026
  const buffer = new ArrayBuffer(totalSize);
906
1027
  const view = new DataView(buffer);
907
1028
  let offset = 0;
908
- for (const field of fields) {
1029
+ for (const field of sortedFields) {
909
1030
  const value = message[field.name];
910
1031
  const bytesWritten = this.serializeField(view, offset, field, value);
911
1032
  offset += bytesWritten;
@@ -917,8 +1038,7 @@ class DialectParser {
917
1038
  let corePayloadSize = 0;
918
1039
  let extensionStartOffset = 0;
919
1040
  let hasExtensions = false;
920
- message.message_name;
921
- for (const field of fields) {
1041
+ for (const field of sortedFields) {
922
1042
  const fieldSize = this.getFieldSize(field);
923
1043
  // Check if this is an extension field using proper XML-based detection
924
1044
  const isExtensionField = field.extension === true;
@@ -1209,31 +1329,104 @@ const MESSAGE_DEFINITIONS = [
1209
1329
  ]
1210
1330
  },
1211
1331
  {
1212
- id: 300,
1213
- name: 'PROTOCOL_VERSION',
1332
+ id: 33,
1333
+ name: 'GLOBAL_POSITION_INT',
1214
1334
  fields: [
1215
1335
  {
1216
- name: 'spec_version_hash',
1217
- type: 'uint8_t',
1218
- arrayLength: 8,
1336
+ name: 'time_boot_ms',
1337
+ type: 'uint32_t',
1219
1338
  },
1220
1339
  {
1221
- name: 'library_version_hash',
1222
- type: 'uint8_t',
1223
- arrayLength: 8,
1340
+ name: 'lat',
1341
+ type: 'int32_t',
1224
1342
  },
1225
1343
  {
1226
- name: 'version',
1344
+ name: 'lon',
1345
+ type: 'int32_t',
1346
+ },
1347
+ {
1348
+ name: 'alt',
1349
+ type: 'int32_t',
1350
+ },
1351
+ {
1352
+ name: 'relative_alt',
1353
+ type: 'int32_t',
1354
+ },
1355
+ {
1356
+ name: 'vx',
1357
+ type: 'int16_t',
1358
+ },
1359
+ {
1360
+ name: 'vy',
1361
+ type: 'int16_t',
1362
+ },
1363
+ {
1364
+ name: 'vz',
1365
+ type: 'int16_t',
1366
+ },
1367
+ {
1368
+ name: 'hdg',
1227
1369
  type: 'uint16_t',
1228
1370
  },
1371
+ ]
1372
+ },
1373
+ {
1374
+ id: 148,
1375
+ name: 'AUTOPILOT_VERSION',
1376
+ fields: [
1377
+ {
1378
+ name: 'capabilities',
1379
+ type: 'uint64_t',
1380
+ },
1381
+ {
1382
+ name: 'uid',
1383
+ type: 'uint64_t',
1384
+ },
1385
+ {
1386
+ name: 'flight_sw_version',
1387
+ type: 'uint32_t',
1388
+ },
1389
+ {
1390
+ name: 'middleware_sw_version',
1391
+ type: 'uint32_t',
1392
+ },
1393
+ {
1394
+ name: 'os_sw_version',
1395
+ type: 'uint32_t',
1396
+ },
1397
+ {
1398
+ name: 'board_version',
1399
+ type: 'uint32_t',
1400
+ },
1229
1401
  {
1230
- name: 'min_version',
1402
+ name: 'vendor_id',
1231
1403
  type: 'uint16_t',
1232
1404
  },
1233
1405
  {
1234
- name: 'max_version',
1406
+ name: 'product_id',
1235
1407
  type: 'uint16_t',
1236
1408
  },
1409
+ {
1410
+ name: 'flight_custom_version',
1411
+ type: 'uint8_t',
1412
+ arrayLength: 8,
1413
+ },
1414
+ {
1415
+ name: 'middleware_custom_version',
1416
+ type: 'uint8_t',
1417
+ arrayLength: 8,
1418
+ },
1419
+ {
1420
+ name: 'os_custom_version',
1421
+ type: 'uint8_t',
1422
+ arrayLength: 8,
1423
+ },
1424
+ {
1425
+ name: 'uid2',
1426
+ type: 'uint8_t',
1427
+ arrayLength: 18,
1428
+ extension: true,
1429
+ },
1237
1430
  ]
1238
1431
  },
1239
1432
  ];
@@ -1293,5 +1486,5 @@ class StandardSerializer {
1293
1486
  }
1294
1487
  }
1295
1488
 
1296
- export { MAV_AUTOPILOTEnum, MAV_BOOLEnum, MAV_COMPONENTEnum, MAV_MODE_FLAGEnum, MAV_MODE_FLAG_DECODE_POSITIONEnum, MAV_STATEEnum, MAV_TYPEEnum, StandardParser, StandardSerializer, isHeartbeat, isProtocolVersion };
1489
+ export { FIRMWARE_VERSION_TYPEEnum, MAV_AUTOPILOTEnum, MAV_BOOLEnum, MAV_COMPONENTEnum, MAV_MODE_FLAGEnum, MAV_MODE_FLAG_DECODE_POSITIONEnum, MAV_PROTOCOL_CAPABILITYEnum, MAV_STATEEnum, MAV_TYPEEnum, StandardParser, StandardSerializer, isAutopilotVersion, isGlobalPositionInt, isHeartbeat };
1297
1490
  //# sourceMappingURL=index.js.map