24#ifndef PROTOCORE_NMEA2000_H
25#define PROTOCORE_NMEA2000_H
36#define N2K_FP_SEQ_SHIFT 5
37#define N2K_FP_FRAME_MASK 0x1Fu
38#define N2K_FP_F0_DATA 6u
39#define N2K_FP_FN_DATA 7u
42enum class N2kFpResult : uint8_t
61 uint8_t buf[PC_N2K_FP_MAX];
65uint8_t pc_n2k_fastpacket_num_frames(uint16_t total_len);
71bool pc_n2k_fastpacket_build_frame(
CanFrame *out, uint8_t seq, uint8_t frame_idx, uint8_t priority, uint32_t pgn,
72 uint8_t sa, uint8_t da,
const uint8_t *data, uint16_t total_len);
75void pc_n2k_fastpacket_reset(N2kFastPacketRx *rx);
78N2kFpResult pc_n2k_fastpacket_feed(N2kFastPacketRx *rx,
const CanFrame *f);
81bool pc_n2k_build_single(
CanFrame *out, uint8_t priority, uint32_t pgn, uint8_t sa, uint8_t da,
const uint8_t *data,
91#define N2K_PGN_POSITION_RAPID 129025u
92#define N2K_PGN_COG_SOG_RAPID 129026u
93#define N2K_PGN_ENGINE_RAPID 127488u
94#define N2K_PGN_ENGINE_DYNAMIC 127489u
95#define N2K_PGN_WIND_DATA 130306u
96#define N2K_PGN_SPEED 128259u
97#define N2K_PGN_WATER_DEPTH 128267u
98#define N2K_PGN_VESSEL_HEADING 127250u
99#define N2K_PGN_RUDDER 127245u
100#define N2K_PGN_ATTITUDE 127257u
101#define N2K_PGN_TEMPERATURE 130312u
104#define N2K_TEMP_SRC_SEA 0
105#define N2K_TEMP_SRC_OUTSIDE 1
106#define N2K_TEMP_SRC_INSIDE 2
107#define N2K_TEMP_SRC_ENGINE_ROOM 3
108#define N2K_TEMP_SRC_MAIN_CABIN 4
109#define N2K_TEMP_SRC_LIVE_WELL 5
110#define N2K_TEMP_SRC_BAIT_WELL 6
111#define N2K_TEMP_SRC_REFRIGERATION 7
112#define N2K_TEMP_SRC_HEATING_SYSTEM 8
113#define N2K_TEMP_SRC_FREEZER 13
114#define N2K_TEMP_SRC_EXHAUST_GAS 14
117#define N2K_COG_REF_TRUE 0
118#define N2K_COG_REF_MAGNETIC 1
119#define N2K_COG_REF_ERROR 2
120#define N2K_COG_REF_NULL 3
123#define N2K_HEADING_REF_TRUE 0
124#define N2K_HEADING_REF_MAGNETIC 1
127#define N2K_WIND_REF_TRUE_NORTH 0
128#define N2K_WIND_REF_MAGNETIC 1
129#define N2K_WIND_REF_APPARENT 2
130#define N2K_WIND_REF_TRUE_BOAT 3
131#define N2K_WIND_REF_TRUE_WATER 4
134struct N2kPositionRapid
165#define N2K_RUDDER_NO_ORDER 0
166#define N2K_RUDDER_MOVE_TO_STARBOARD 1
167#define N2K_RUDDER_MOVE_TO_PORT 2
173 uint8_t direction_order;
174 bool angle_order_valid;
175 float angle_order_rad;
207struct N2kEngineDynamic
211 bool oil_pressure_valid;
212 float oil_pressure_pa;
215 bool coolant_temp_valid;
216 float coolant_temp_c;
217 bool alt_voltage_valid;
219 bool fuel_rate_valid;
221 bool engine_hours_valid;
222 uint32_t engine_hours_s;
223 bool coolant_pressure_valid;
224 float coolant_pressure_pa;
225 bool fuel_pressure_valid;
226 float fuel_pressure_pa;
227 uint16_t discrete_status_1;
228 uint16_t discrete_status_2;
247#define N2K_SPEED_TYPE_PADDLE_WHEEL 0
248#define N2K_SPEED_TYPE_PITOT_TUBE 1
249#define N2K_SPEED_TYPE_DOPPLER 2
250#define N2K_SPEED_TYPE_CORRELATION 3
251#define N2K_SPEED_TYPE_ELECTROMAGNETIC 4
261 uint8_t water_ref_type;
274struct N2kVesselHeading
288bool pc_n2k_decode_position_rapid(
const uint8_t *payload,
size_t len, N2kPositionRapid *out);
294bool pc_n2k_decode_cog_sog_rapid(
const uint8_t *payload,
size_t len, N2kCogSogRapid *out);
300bool pc_n2k_decode_engine_rapid(
const uint8_t *payload,
size_t len, N2kEngineRapid *out);
307bool pc_n2k_decode_engine_dynamic(
const uint8_t *payload,
size_t len, N2kEngineDynamic *out);
313bool pc_n2k_decode_rudder(
const uint8_t *payload,
size_t len, N2kRudder *out);
319bool pc_n2k_decode_attitude(
const uint8_t *payload,
size_t len, N2kAttitude *out);
325bool pc_n2k_decode_temperature(
const uint8_t *payload,
size_t len, N2kTemperature *out);
329struct N2kBatteryStatus
346bool pc_n2k_decode_battery_status(
const uint8_t *payload,
size_t len, N2kBatteryStatus *out);
349#define PC_N2K_FLUID_FUEL 0
350#define PC_N2K_FLUID_WATER 1
351#define PC_N2K_FLUID_GRAY_WATER 2
352#define PC_N2K_FLUID_LIVE_WELL 3
353#define PC_N2K_FLUID_OIL 4
354#define PC_N2K_FLUID_BLACK_WATER 5
372bool pc_n2k_decode_fluid_level(
const uint8_t *payload,
size_t len, N2kFluidLevel *out);
375#define PC_N2K_PRESSURE_ATMOSPHERIC 0
376#define PC_N2K_PRESSURE_WATER 1
377#define PC_N2K_PRESSURE_STEAM 2
378#define PC_N2K_PRESSURE_COMPRESSED_AIR 3
379#define PC_N2K_PRESSURE_HYDRAULIC 4
380#define PC_N2K_PRESSURE_FILTER 5
381#define PC_N2K_PRESSURE_ALTIMETER_SETTING 6
382#define PC_N2K_PRESSURE_OIL 7
383#define PC_N2K_PRESSURE_FUEL 8
386struct N2kActualPressure
400bool pc_n2k_decode_actual_pressure(
const uint8_t *payload,
size_t len, N2kActualPressure *out);
406bool pc_n2k_decode_wind_data(
const uint8_t *payload,
size_t len, N2kWindData *out);
412bool pc_n2k_decode_speed(
const uint8_t *payload,
size_t len, N2kSpeed *out);
418bool pc_n2k_decode_water_depth(
const uint8_t *payload,
size_t len, N2kWaterDepth *out);
424bool pc_n2k_decode_vessel_heading(
const uint8_t *payload,
size_t len, N2kVesselHeading *out);
Shared CAN 2.0 frame type for the CAN-based industrial codecs (one source of truth).
SAE J1939 message codec (PC_ENABLE_J1939) - the heavy-duty-vehicle / agriculture / marine / genset CA...
User-facing configuration for ProtoCore.