24#ifndef PROTOCORE_NMEA2000_H
25#define PROTOCORE_NMEA2000_H
29#if PROTOCORE_ENABLE_NMEA2000
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
61 uint8_t buf[PROTOCORE_N2K_FP_MAX];
65uint8_t protocore_n2k_fastpacket_num_frames(uint16_t total_len);
71proto_bool protocore_n2k_fastpacket_build_frame(
CanFrame *out, uint8_t seq, uint8_t frame_idx, uint8_t priority,
72 uint32_t pgn, uint8_t sa, uint8_t da,
const uint8_t *data,
76void protocore_n2k_fastpacket_reset(N2kFastPacketRx *rx);
79N2kFpResult protocore_n2k_fastpacket_feed(N2kFastPacketRx *rx,
const CanFrame *f);
82proto_bool protocore_n2k_build_single(
CanFrame *out, uint8_t priority, uint32_t pgn, uint8_t sa, uint8_t da,
83 const uint8_t *data, uint8_t len);
92#define N2K_PGN_POSITION_RAPID 129025u
93#define N2K_PGN_COG_SOG_RAPID 129026u
94#define N2K_PGN_ENGINE_RAPID 127488u
95#define N2K_PGN_ENGINE_DYNAMIC 127489u
96#define N2K_PGN_WIND_DATA 130306u
97#define N2K_PGN_SPEED 128259u
98#define N2K_PGN_WATER_DEPTH 128267u
99#define N2K_PGN_VESSEL_HEADING 127250u
100#define N2K_PGN_RUDDER 127245u
101#define N2K_PGN_ATTITUDE 127257u
102#define N2K_PGN_TEMPERATURE 130312u
105#define N2K_TEMP_SRC_SEA 0
106#define N2K_TEMP_SRC_OUTSIDE 1
107#define N2K_TEMP_SRC_INSIDE 2
108#define N2K_TEMP_SRC_ENGINE_ROOM 3
109#define N2K_TEMP_SRC_MAIN_CABIN 4
110#define N2K_TEMP_SRC_LIVE_WELL 5
111#define N2K_TEMP_SRC_BAIT_WELL 6
112#define N2K_TEMP_SRC_REFRIGERATION 7
113#define N2K_TEMP_SRC_HEATING_SYSTEM 8
114#define N2K_TEMP_SRC_FREEZER 13
115#define N2K_TEMP_SRC_EXHAUST_GAS 14
118#define N2K_COG_REF_TRUE 0
119#define N2K_COG_REF_MAGNETIC 1
120#define N2K_COG_REF_ERROR 2
121#define N2K_COG_REF_NULL 3
124#define N2K_HEADING_REF_TRUE 0
125#define N2K_HEADING_REF_MAGNETIC 1
128#define N2K_WIND_REF_TRUE_NORTH 0
129#define N2K_WIND_REF_MAGNETIC 1
130#define N2K_WIND_REF_APPARENT 2
131#define N2K_WIND_REF_TRUE_BOAT 3
132#define N2K_WIND_REF_TRUE_WATER 4
166#define N2K_RUDDER_NO_ORDER 0
167#define N2K_RUDDER_MOVE_TO_STARBOARD 1
168#define N2K_RUDDER_MOVE_TO_PORT 2
174 uint8_t direction_order;
176 float angle_order_rad;
213 float oil_pressure_pa;
217 float coolant_temp_c;
223 uint32_t engine_hours_s;
225 float coolant_pressure_pa;
227 float fuel_pressure_pa;
228 uint16_t discrete_status_1;
229 uint16_t discrete_status_2;
248#define N2K_SPEED_TYPE_PADDLE_WHEEL 0
249#define N2K_SPEED_TYPE_PITOT_TUBE 1
250#define N2K_SPEED_TYPE_DOPPLER 2
251#define N2K_SPEED_TYPE_CORRELATION 3
252#define N2K_SPEED_TYPE_ELECTROMAGNETIC 4
262 uint8_t water_ref_type;
289proto_bool protocore_n2k_decode_position_rapid(
const uint8_t *payload,
size_t len, N2kPositionRapid *out);
295proto_bool protocore_n2k_decode_cog_sog_rapid(
const uint8_t *payload,
size_t len, N2kCogSogRapid *out);
301proto_bool protocore_n2k_decode_engine_rapid(
const uint8_t *payload,
size_t len, N2kEngineRapid *out);
308proto_bool protocore_n2k_decode_engine_dynamic(
const uint8_t *payload,
size_t len, N2kEngineDynamic *out);
314proto_bool protocore_n2k_decode_rudder(
const uint8_t *payload,
size_t len, N2kRudder *out);
320proto_bool protocore_n2k_decode_attitude(
const uint8_t *payload,
size_t len, N2kAttitude *out);
326proto_bool protocore_n2k_decode_temperature(
const uint8_t *payload,
size_t len, N2kTemperature *out);
347proto_bool protocore_n2k_decode_battery_status(
const uint8_t *payload,
size_t len, N2kBatteryStatus *out);
350#define PROTOCORE_N2K_FLUID_FUEL 0
351#define PROTOCORE_N2K_FLUID_WATER 1
352#define PROTOCORE_N2K_FLUID_GRAY_WATER 2
353#define PROTOCORE_N2K_FLUID_LIVE_WELL 3
354#define PROTOCORE_N2K_FLUID_OIL 4
355#define PROTOCORE_N2K_FLUID_BLACK_WATER 5
373proto_bool protocore_n2k_decode_fluid_level(
const uint8_t *payload,
size_t len, N2kFluidLevel *out);
376#define PROTOCORE_N2K_PRESSURE_ATMOSPHERIC 0
377#define PROTOCORE_N2K_PRESSURE_WATER 1
378#define PROTOCORE_N2K_PRESSURE_STEAM 2
379#define PROTOCORE_N2K_PRESSURE_COMPRESSED_AIR 3
380#define PROTOCORE_N2K_PRESSURE_HYDRAULIC 4
381#define PROTOCORE_N2K_PRESSURE_FILTER 5
382#define PROTOCORE_N2K_PRESSURE_ALTIMETER_SETTING 6
383#define PROTOCORE_N2K_PRESSURE_OIL 7
384#define PROTOCORE_N2K_PRESSURE_FUEL 8
401proto_bool protocore_n2k_decode_actual_pressure(
const uint8_t *payload,
size_t len, N2kActualPressure *out);
407proto_bool protocore_n2k_decode_wind_data(
const uint8_t *payload,
size_t len, N2kWindData *out);
413proto_bool protocore_n2k_decode_speed(
const uint8_t *payload,
size_t len, N2kSpeed *out);
419proto_bool protocore_n2k_decode_water_depth(
const uint8_t *payload,
size_t len, N2kWaterDepth *out);
425proto_bool protocore_n2k_decode_vessel_heading(
const uint8_t *payload,
size_t len, N2kVesselHeading *out);
PROTO_ENUM_PACKED
Application protocol spoken on a listener port or connection slot.
Shared CAN 2.0 frame type for the CAN-based industrial codecs (one source of truth).
SAE J1939 message codec (PROTOCORE_ENABLE_J1939) - the heavy-duty-vehicle / agriculture / marine / ge...
#define PROTOCORE_BEGIN_DECLS
Give a header's declarations C linkage, so their symbol names carry no parameter types.
_Bool proto_bool
The truth value.
#define PROTOCORE_END_DECLS