Source code for n2k.n2k

# static functions and helpers probably?
from enum import IntEnum

from n2k import constants


[docs] def is_broadcast(source: int) -> bool: return source == constants.N2K_BROADCAST_CAN_BUS_ADDRESS
[docs] def is_fast_packet_first_frame(byte: int) -> bool: return byte & 0x1F == 0
[docs] class PGN(IntEnum): IsoAcknowledgement = 59392 # prio: 6, period: NA IsoRequest = 59904 # prio: 6, period: NA TransportProtocolDataTransfer = 60160 # prio: 6, period: NA TransportProtocolConnectionManagement = 60416 # prio: 6, period: NA IsoAddressClaim = 60928 # prio: 6, period: NA CommandedAddress = 65240 # prio: 6, period: NA RequestGroupFunction = 126208 # prio: 3, period: NA CommandGroupFunction = 126208 # prio: 3, period: NA AcknowledgeGroupFunction = 126208 # prio: 3, period: NA SupportedPGNList = 126464 # prio: 6, period: NA SystemDateTime = 126992 # prio: 3, period: 1000 Heartbeat = 126993 # prio: 7, period: 60000 ProductInformation = 126996 # prio: 6, period: NA ConfigurationInformation = 126998 # prio: 6, period: NA Rudder = 127245 # prio: 2, period: 100 VesselHeading = 127250 # prio: 2, period: 100 RateOfTurn = 127251 # prio: 2, period: 100 Heave = 127252 # prio: 3, period: 100 Attitude = 127257 # prio: 3, period: 1000 EngineParametersRapid = 127488 # prio: 2, period: 100, rapid update TransmissionParameters = 127493 # prio: 2, period: 100, dynamic LoadControllerConnectionStateControl = 127500 # TODO: find prio and control BinaryStatusReport = 127501 # prio: 3, period: NA SwitchBankControl = 127502 # TODO: find prio and period FluidLevel = 127505 # prio: 6, period: 2500 ConverterStatus = 127750 # prio: 6, period: 1500 BatteryStatus = 127508 # prio: 6, period: 1500 MagneticVariation = 127258 # prio: 6, period: NA Leeway = 128000 # prio: 4, period: NA BoatSpeed = 128259 # prio: 2, period: 1000 WaterDepth = 128267 # prio: 3, period: 1000 AnchorWindlassControlStatus = 128776 # prio: 2, period: NA AnchorWindlassOperatingStatus = 128777 # prio: 2, period: NA AnchorWindlassMonitoringStatus = 128778 # prio: 2, period: NA LatLonRapid = 129025 # prio: 2, period: 100 CogSogRapid = 129026 # prio: 2, period: 250 DateTimeLocalOffset = 129033 # prio: 3, period: NA CrossTrackError = 129283 # prio: 3, period: 1000 WindSpeed = 130306 # prio: 2, period: 100 OutsideEnvironmentalParameters = 130310 # prio: 5, period: 500 EnvironmentalParameters = 130311 # prio: 5, period: 500 Temperature = 130312 # prio: 5, period: 2000 Humidity = 130313 # prio: 5, period: 2000 ActualPressure = 130314 # prio: 5, period: 2000 SetPressure = 130315 # prio: 5, period: 2000 TemperatureExtendedRange = 130316 # prio: 5, period: 2000 SmallCraftStatusTrimTabPosition = 130576 # prio: 2, period: 200 # Default Messages Alert = 126983 # prio: 2, period: 1000 AlertResponse = 126984 # prio: 2, period: NA AlertText = 126985 # prio: 2, period: 10000 AlertConfiguration = 126986 # prio: 2, period: NA AlertThreshold = 126987 # prio: 2, period: NA AlertValue = 126988 # prio: 2, period: 10000 ManOverBoard = 127233 # prio: 3, period: NA HeadingTrackControl = 127237 # prio: 2, period: 250 EngineParametersDynamic = 127489 # prio: 2, period: 500 ElectricDriveStatusDynamic = 127490 # prio: 1, period: 1500 ElectricEnergyStorageStatusDynamic = 127491 # prio: 7, period: 1500 ElectricDriveInformation = 127494 # prio: 4, period: NA ElectricEnergyStorageInformation = 127495 # prio: 6, period: NA TripFuelConsumptionVessel = 127496 # prio: 5, period: 1000 TripFuelConsumptionEngine = 127497 # prio: 5, period: 1000 EngineParametersStatic = 127498 # prio: 5, period: NA ACInputStatus = 127503 # prio: 6, period: 1500 ACOutputStatus = 127504 # prio: 6, period: 1500 DCDetailedStatus = 127506 # prio: 6, period: 1500 ChargerStatus = 127507 # prio: 6, period: 1500 InverterStatus = 127509 # prio: 6, period: 1500 ChargerConfigurationStatus = 127510 # prio: 6, period: NA InverterConfigurationStatus = 127511 # prio: 6, period: NA AGSConfigurationStatus = 127512 # prio: 6, period: NA BatteryConfigurationStatus = 127513 # prio: 6, period: NA AGSStatus = 127514 # prio: 6, period: 1500 DistanceLog = 128275 # prio: 6, period: 1000 TrackedTargetData = 128520 # prio: 2, period: 1000 ElevatorCarStatus = 128538 # prio: 6, period: 100 GNSSPositionData = 129029 # prio: 3, period: 1000 AISClassAPositionReport = 129038 # prio: 4, period: NA AISClassBPositionReport = 129039 # prio: 4, period: NA AISClassBExtendedPositionReport = 129040 # prio: 4, period: NA AISAidsToNavigationReport = 129041 # prio: 4, period: NA (AtoN) Datum = 129044 # prio: 6, period: 10000 UserDatumSettings = 129045 # prio: 6, period: NA NavigationInfo = 129284 # prio: 3, period: 1000 WaypointList = 129285 # prio: 3, period: NA TimeToMark = 129301 # prio: 3, period: 1000 BearingAndDistanceBetweenTwoMarks = 129302 # prio: 6, period: NA GNSSControlStatus = 129538 # prio: 6, period: NA GNSSDOPData = 129539 # prio: 6, period: NA GNSSSatellitesInView = 129540 # prio: 6, period: 1000 GPSAlmanacData = 129541 # prio: 6, period: NA GNSSPseudorangeNoiseStatistics = 129542 # prio: 6, period: 1000 GNSS_RAIM_Output = 129545 # prio: 6, period: NA GNSSPseudorangeErrorStatistics = 129547 # prio: 6, period: NA DGNSSCorrections = 129549 # prio: 6, period: NA GNSSDifferentialCorrectionReceiverSignal = 129551 # prio: 6, period: NA GLONASSAlmanacData = 129556 # prio: 6, period: NA AIS_DGNSS_Broadcast_Binary_Message = 129792 # prio: 6, period: NA AIS_UTC_And_Date_Report = 129793 # prio: 7, period: NA AISClassAStaticData = 129794 # prio: 6, period: NA AISAddressedBinaryMessage = 129795 # prio: 5, period: NA AISAcknowledge = 129796 # prio: 7, period: NA AISBinaryBroadcastMessage = 129797 # prio: 5, period: NA AIS_SAR_Aircraft_Position_Report = 129798 # prio: 4, period: NA RadioFrequencyModePower = 129799 # prio: 3, period: NA AIS_UTC_Date_Inquiry = 129800 # prio: 7, period: NA AISAddressedSafetyRelatedMessage = 129801 # prio: 5, period: NA AISSafetyRelatedBroadcastMessage = 129802 # prio: 5, period: NA AISInterrogationPGN = 129803 # prio: 7, period: NA AISAssignmentModeCommand = 129804 # prio: 7, period: NA AISDataLinkManagementMessage = 129805 # prio: 7, period: NA AISChannelManagement = 129806 # prio: 7, period: NA AISGroupAssignment = 129807 # prio: 7, period: NA DSCCallInformation = 129808 # prio: 8, period: NA AISClassBStaticDataPartA = 129809 # prio: 6, period: NA AISClassBStaticDataPartB = 129810 # prio: 6, period: NA AISSingleSlotBinaryMessageDEPRECATED = 129811 # prio: 5, period: NA AISMultiSlotBinaryMessageDEPRECATED = 129812 # prio: 5, period: NA AISLongRangeBroadcastMessage = 129813 # prio: 5, period: NA AISSingleSlotBinaryMessage = 129814 # prio: 5, period: NA AISMultiSlotBinaryMessage = 129815 # prio: 5, period: NA AISAcknowledge2 = 129816 # prio: 7, period: NA LoranCTDData = 130052 # prio: 3, period: 1000 LoranCRangeData = 130053 # prio: 3, period: 1000 LoranCSignalData = 130054 # prio: 3, period: 1000 Label = 130060 # prio: 7, period: NA ChannelSourceConfiguration = 130061 # prio: 7, period: NA RouteAndWaypointServiceDatabaseList = 130064 # prio: 7, period: NA RouteAndWaypointServiceRouteList = 130065 # prio: 7, period: NA RouteAndWaypointServiceRouteWPListAttributes = 130066 # prio: 7, period: NA RouteAndWaypointServiceRouteWPNameAndPosition = 130067 # prio: 7, period: NA RouteAndWaypointServiceRouteWPName = 130068 # prio: 7, period: NA RouteAndWaypointServiceXTELimitAndNavigationMethod = 130069 # prio: 7, period: NA RouteAndWaypointServiceWPComment = 130070 # prio: 7, period: NA RouteAndWaypointServiceRouteComment = 130071 # prio: 7, period: NA RouteAndWaypointServiceDatabaseComment = 130072 # prio: 7, period: NA RouteAndWaypointServiceRadiusOfTurn = 130073 # prio: 7, period: NA RouteAndWaypointServiceWPListWPNameAndPosition = 130074 # prio: 7, period: NA TideStationData = 130320 # prio: 6, period: 1000 SalinityStationData = 130321 # prio: 6, period: 1000 CurrentStationData = 130322 # prio: 6, period: 1000 MeteorologicalStationData = 130323 # prio: 6, period: 1000 MooredBuoyStationData = 130324 # prio: 6, period: 1000 LightingSystemSettings = 130330 # prio: 7, period: NA LightingZone = 130561 # prio: 7, period: NA LightingScene = 130562 # prio: 7, period: NA LightingDevice = 130563 # prio: 7, period: NA LightingDeviceEnumeration = 130564 # prio: 7, period: NA LightingColorSequence = 130565 # prio: 7, period: NA LightingProgram = 130566 # prio: 7, period: NA WatermakerInputSettingAndStatus = 130567 # prio: 6, period: 2500 DirectionData = 130577 # prio: 3, period: 1000 VesselSpeedComponents = 130578 # prio: 2, period: 250 EntertainmentCurrentFileAndStatus = 130569 # prio: 6, period: 500 EntertainmentLibraryDataFile = 130570 # prio: 6, period: NA EntertainmentLibraryDataGroup = 130571 # prio: 6, period: NA EntertainmentLibraryDataSearch = 130572 # prio: 6, period: NA EntertainmentSupportedSourceData = 130573 # prio: 6, period: NA EntertainmentSupportedZoneData = 130574 # prio: 6, period: NA EntertainmentSystemConfigurationStatus = 130580 # prio: 6, period: NA EntertainmentZoneConfigurationStatusDEPRECATED = 130581 # prio: 6, period: NA EntertainmentAvailableAudioEQPresets = 130583 # prio: 6, period: NA EntertainmentBluetoothDevices = 130584 # prio: 6, period: NA EntertainmentZoneConfigurationStatus = 130586 # prio: 6, period: NA
DefaultTransmitMessages = [ PGN.IsoAcknowledgement, PGN.IsoRequest, PGN.TransportProtocolDataTransfer, PGN.TransportProtocolConnectionManagement, PGN.IsoAddressClaim, PGN.RequestGroupFunction, # same number as command and acknowledge versions PGN.SupportedPGNList, PGN.Heartbeat, PGN.ProductInformation, PGN.ConfigurationInformation, ] DefaultReceiveMessages = [ PGN.IsoAcknowledgement, PGN.IsoRequest, PGN.TransportProtocolDataTransfer, PGN.TransportProtocolConnectionManagement, PGN.IsoAddressClaim, PGN.CommandedAddress, PGN.RequestGroupFunction, # same number as command and acknowledge versions ]
[docs] def is_single_frame_system_message(pgn: int) -> bool: return pgn in [ PGN.IsoAcknowledgement, PGN.TransportProtocolDataTransfer, PGN.TransportProtocolConnectionManagement, PGN.IsoRequest, PGN.IsoAddressClaim, ]
[docs] def is_fast_packet_system_message(pgn: int) -> bool: return pgn in (PGN.CommandedAddress, PGN.RequestGroupFunction)
[docs] def is_default_single_frame_message(pgn: int) -> bool: return pgn in [ PGN.SystemDateTime, PGN.Heartbeat, PGN.Rudder, PGN.VesselHeading, PGN.RateOfTurn, PGN.Heave, PGN.Attitude, PGN.EngineParametersRapid, PGN.TransmissionParameters, PGN.BinaryStatusReport, PGN.FluidLevel, PGN.BatteryStatus, PGN.ConverterStatus, PGN.BoatSpeed, PGN.WaterDepth, PGN.LatLonRapid, PGN.CogSogRapid, PGN.CrossTrackError, PGN.WindSpeed, PGN.OutsideEnvironmentalParameters, PGN.Temperature, PGN.Humidity, PGN.ActualPressure, PGN.SetPressure, PGN.TemperatureExtendedRange, PGN.SmallCraftStatusTrimTabPosition, ]
[docs] def is_mandatory_fast_packet_message(pgn: int) -> bool: return pgn in [ PGN.SupportedPGNList, PGN.ProductInformation, PGN.ConfigurationInformation, ]
[docs] def is_default_fast_packet_message(pgn: int) -> bool: return pgn in [ PGN.Alert, PGN.AlertResponse, PGN.AlertText, PGN.AlertConfiguration, PGN.AlertThreshold, PGN.AlertValue, PGN.ManOverBoard, PGN.HeadingTrackControl, PGN.EngineParametersDynamic, PGN.ElectricDriveStatusDynamic, PGN.ElectricEnergyStorageStatusDynamic, PGN.ElectricDriveInformation, PGN.ElectricEnergyStorageInformation, PGN.TripFuelConsumptionVessel, PGN.TripFuelConsumptionEngine, PGN.EngineParametersStatic, PGN.ACInputStatus, PGN.ACOutputStatus, PGN.DCDetailedStatus, PGN.ChargerStatus, PGN.InverterStatus, PGN.ChargerConfigurationStatus, PGN.InverterConfigurationStatus, PGN.AGSConfigurationStatus, PGN.BatteryConfigurationStatus, PGN.AGSStatus, PGN.DistanceLog, PGN.TrackedTargetData, PGN.ElevatorCarStatus, PGN.GNSSPositionData, PGN.AISClassAPositionReport, PGN.AISClassBPositionReport, PGN.AISClassBExtendedPositionReport, PGN.AISAidsToNavigationReport, PGN.Datum, PGN.UserDatumSettings, PGN.NavigationInfo, PGN.WaypointList, PGN.TimeToMark, PGN.BearingAndDistanceBetweenTwoMarks, PGN.GNSSControlStatus, PGN.GNSSSatellitesInView, PGN.GPSAlmanacData, PGN.GNSSPseudorangeNoiseStatistics, PGN.GNSS_RAIM_Output, PGN.GNSSPseudorangeErrorStatistics, PGN.DGNSSCorrections, PGN.GNSSDifferentialCorrectionReceiverSignal, PGN.GLONASSAlmanacData, PGN.AIS_DGNSS_Broadcast_Binary_Message, PGN.AIS_UTC_And_Date_Report, PGN.AISClassAStaticData, PGN.AISAddressedBinaryMessage, PGN.AISAcknowledge, PGN.AISBinaryBroadcastMessage, PGN.AIS_SAR_Aircraft_Position_Report, PGN.RadioFrequencyModePower, PGN.AIS_UTC_Date_Inquiry, PGN.AISAddressedSafetyRelatedMessage, PGN.AISSafetyRelatedBroadcastMessage, PGN.AISInterrogationPGN, PGN.AISAssignmentModeCommand, PGN.AISDataLinkManagementMessage, PGN.AISChannelManagement, PGN.AISGroupAssignment, PGN.DSCCallInformation, PGN.AISClassBStaticDataPartA, PGN.AISClassBStaticDataPartB, PGN.AISSingleSlotBinaryMessageDEPRECATED, PGN.AISMultiSlotBinaryMessageDEPRECATED, PGN.AISLongRangeBroadcastMessage, PGN.AISSingleSlotBinaryMessage, PGN.AISMultiSlotBinaryMessage, PGN.AISAcknowledge2, PGN.LoranCTDData, PGN.LoranCRangeData, PGN.LoranCSignalData, PGN.Label, PGN.ChannelSourceConfiguration, PGN.RouteAndWaypointServiceDatabaseList, PGN.RouteAndWaypointServiceRouteList, PGN.RouteAndWaypointServiceRouteWPListAttributes, PGN.RouteAndWaypointServiceRouteWPNameAndPosition, PGN.RouteAndWaypointServiceRouteWPName, PGN.RouteAndWaypointServiceXTELimitAndNavigationMethod, PGN.RouteAndWaypointServiceWPComment, PGN.RouteAndWaypointServiceRouteComment, PGN.RouteAndWaypointServiceDatabaseComment, PGN.RouteAndWaypointServiceRadiusOfTurn, PGN.RouteAndWaypointServiceWPListWPNameAndPosition, PGN.TideStationData, PGN.SalinityStationData, PGN.CurrentStationData, PGN.MeteorologicalStationData, PGN.MooredBuoyStationData, PGN.LightingSystemSettings, PGN.LightingZone, PGN.LightingScene, PGN.LightingDevice, PGN.LightingDeviceEnumeration, PGN.LightingColorSequence, PGN.LightingProgram, PGN.WatermakerInputSettingAndStatus, PGN.DirectionData, PGN.VesselSpeedComponents, PGN.EntertainmentCurrentFileAndStatus, PGN.EntertainmentLibraryDataFile, PGN.EntertainmentLibraryDataGroup, PGN.EntertainmentLibraryDataSearch, PGN.EntertainmentSupportedSourceData, PGN.EntertainmentSupportedZoneData, PGN.EntertainmentSystemConfigurationStatus, PGN.EntertainmentZoneConfigurationStatusDEPRECATED, PGN.EntertainmentAvailableAudioEQPresets, PGN.EntertainmentBluetoothDevices, PGN.EntertainmentZoneConfigurationStatus, ]
[docs] def is_proprietary_fast_packet_message(pgn: int) -> bool: return pgn == 126720 or 130816 <= pgn <= 131071 # noqa: PLR2004
[docs] def is_proprietary_message(pgn: int) -> bool: """ Test if a message is part of the NMEA2000 specifications or proprietary :param pgn: PGN to be tested :return: Whether the message is part of the NMEA2000 spec """ return ( is_proprietary_fast_packet_message(pgn) or pgn == 61184 or 65280 <= pgn <= 65535 # noqa: PLR2004 )