encodeLocationMessage function

List<int> encodeLocationMessage({
  1. required Location location,
  2. required double altitudePressure,
  3. required double altitudeGeodetic,
  4. required double height,
  5. required double verticalSpeed,
  6. required double horizontalSpeed,
  7. required int direction,
  8. required Duration timestamp,
})

Implementation

List<int> encodeLocationMessage({
  required Location location,
  required double altitudePressure,
  required double altitudeGeodetic,
  required double height,
  required double verticalSpeed,
  required double horizontalSpeed,
  required int direction,
  required Duration timestamp,
}) {
  // second byte contains flags
  final eastWestBit = direction < 180 ? 0 : 1;
  final secondByte =
      (OperationalStatus.airborne.value << 4) +
      (HeightType.aboveGroundLevel.value << 2) +
      (eastWestBit << 1);

  final locationAccuracyByte =
      (VerticalAccuracy.meters_1.value << 4) +
      HorizontalAccuracy.meters_1.value;
  final baroAndSpeedAccuracyByte =
      (VerticalAccuracy.meters_1.value << 4) +
      SpeedAccuracy.meterPerSecond_1.value;

  return mergeFieldsToMessage([
    encodeField(encodeFirstByte, MessageType.location),
    [secondByte],
    encodeField(encodeDirection, direction),
    encodeField(encodeHorizontalSpeed, horizontalSpeed),
    encodeField(encodeVerticalSpeed, verticalSpeed),
    encodeField(encodeCoordinate, location.latitude),
    encodeField(encodeCoordinate, location.longitude),
    encodeField(encodeAltitude, altitudePressure),
    encodeField(encodeAltitude, altitudeGeodetic),
    encodeField(encodeAltitude, height),
    [locationAccuracyByte, baroAndSpeedAccuracyByte],
    encodeField(encodeLocationTimestamp, timestamp),
    encodeField(encodeTimestampAccuracy, const Duration(milliseconds: 500)),
    [0x00], // filler byte
  ]);
}