Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions c/include/libsbp/cpp/message_traits.h
Original file line number Diff line number Diff line change
Expand Up @@ -1136,6 +1136,12 @@ struct MessageTraits<msg_group_meta_t> {

template<>
struct MessageTraits<msg_soln_meta_t> {
static constexpr u16 id = 65294;
};


template<>
struct MessageTraits<msg_soln_meta_dep_a_t> {
static constexpr u16 id = 65295;
};

Expand Down
48 changes: 33 additions & 15 deletions c/include/libsbp/solution_meta.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,28 +44,28 @@ typedef struct SBP_ATTR_PACKED {
} solution_input_type_t;


/** Solution Sensors Metadata
/** Deprecated
*
* This message contains all metadata about the sensors received and/or used in computing the Fuzed Solution.
* It focuses primarly, but not only, on GNSS metadata.
*/
#define SBP_MSG_SOLN_META 0xFF0F
#define SBP_SOLN_META_ALIGNMENT_STATUS_MASK (0x7)
#define SBP_SOLN_META_ALIGNMENT_STATUS_SHIFT (0u)
#define SBP_SOLN_META_ALIGNMENT_STATUS_GET(flags) \
(((flags) >> SBP_SOLN_META_ALIGNMENT_STATUS_SHIFT) \
& SBP_SOLN_META_ALIGNMENT_STATUS_MASK)
#define SBP_SOLN_META_ALIGNMENT_STATUS_SET(flags, val) \
#define SBP_MSG_SOLN_META_DEP_A 0xFF0F
#define SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_MASK (0x7)
#define SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_SHIFT (0u)
#define SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_GET(flags) \
(((flags) >> SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_SHIFT) \
& SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_MASK)
#define SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_SET(flags, val) \
do {((flags) |= \
(((val) & (SBP_SOLN_META_ALIGNMENT_STATUS_MASK)) \
<< (SBP_SOLN_META_ALIGNMENT_STATUS_SHIFT)));} while(0)
(((val) & (SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_MASK)) \
<< (SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_SHIFT)));} while(0)


#define SBP_SOLN_META_ALIGNMENT_STATUS_UNKNOWN_REASON_OR_ALREADY_ALIGNED (0)
#define SBP_SOLN_META_ALIGNMENT_STATUS_SEED_VALUES_LOADED_AND_ALIGNMENT_IN_PROGRESS (1)
#define SBP_SOLN_META_ALIGNMENT_STATUS_NO_SEED_VALUES_AND_ALIGNMENT_IN_PROGRESS (2)
#define SBP_SOLN_META_ALIGNMENT_STATUS_SEED_VALUES_LOADED_BUT_NO_GNSS_MEASUREMENTS (3)
#define SBP_SOLN_META_ALIGNMENT_STATUS_NO_SEED_VALUES_NOR_GNSS_MEASUREMENTS (4)
#define SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_UNKNOWN_REASON_OR_ALREADY_ALIGNED (0)
#define SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_SEED_VALUES_LOADED_AND_ALIGNMENT_IN_PROGRESS (1)
#define SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_NO_SEED_VALUES_AND_ALIGNMENT_IN_PROGRESS (2)
#define SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_SEED_VALUES_LOADED_BUT_NO_GNSS_MEASUREMENTS (3)
#define SBP_SOLN_META_DEP_A_ALIGNMENT_STATUS_NO_SEED_VALUES_NOR_GNSS_MEASUREMENTS (4)

typedef struct SBP_ATTR_PACKED {
u16 pdop; /**< Position Dilution of Precision, as per last available DOPS from Starling GNSS engine [0.01] */
Expand All @@ -77,6 +77,24 @@ typedef struct SBP_ATTR_PACKED {
u32 last_used_gnss_pos_tow; /**< Tow of last-used GNSS position measurement [ms] */
u32 last_used_gnss_vel_tow; /**< Tow of last-used GNSS velocity measurement [ms] */
solution_input_type_t sol_in[0]; /**< Array of Metadata describing the sensors potentially involved in the solution. Each element in the array represents a single sensor type and consists of flags containing (meta)data pertaining to that specific single sensor. Refer to each (XX)InputType descriptor in the present doc. */
} msg_soln_meta_dep_a_t;


/** Solution Sensors Metadata
*
* This message contains all metadata about the sensors received and/or used in computing the sensorfusion solution.
* It focuses primarly, but not only, on GNSS metadata.
*/
#define SBP_MSG_SOLN_META 0xFF0E

typedef struct SBP_ATTR_PACKED {
u32 tow; /**< GPS time of week rounded to the nearest millisecond [ms] */
u16 pdop; /**< Position Dilution of Precision, as per last available DOPS from Starling GNSS engine [0.01] */
u16 hdop; /**< Horizontal Dilution of Precision, as per last available DOPS from Starling GNSS engine [0.01] */
u16 vdop; /**< Vertical Dilution of Precision, as per last available DOPS from Starling GNSS engine [0.01] */
u16 age_corrections; /**< Age of the corrections (0xFFFF indicates invalid), as per last available AGE_CORRECTIONS from Starling GNSS engine [deciseconds] */
u16 age_gnss; /**< Age of the last received valid GNSS solution (0xFFFF indicates invalid) [ms] */
solution_input_type_t sol_in[0]; /**< Array of Metadata describing the sensors potentially involved in the solution. Each element in the array represents a single sensor type and consists of flags containing (meta)data pertaining to that specific single sensor. Refer to each (XX)InputType descriptor in the present doc. */
} msg_soln_meta_t;


Expand Down
Binary file modified docs/sbp.pdf
Binary file not shown.
6 changes: 6 additions & 0 deletions haskell/src/SwiftNav/SBP/Msg.hs
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ data SBPMsg =
| SBPMsgSettingsWrite MsgSettingsWrite Msg
| SBPMsgSettingsWriteResp MsgSettingsWriteResp Msg
| SBPMsgSolnMeta MsgSolnMeta Msg
| SBPMsgSolnMetaDepA MsgSolnMetaDepA Msg
| SBPMsgSpecan MsgSpecan Msg
| SBPMsgSpecanDep MsgSpecanDep Msg
| SBPMsgSsrCodeBiases MsgSsrCodeBiases Msg
Expand Down Expand Up @@ -408,6 +409,7 @@ instance Binary SBPMsg where
| _msgSBPType == msgSettingsWrite = SBPMsgSettingsWrite (decode (fromStrict (unBytes _msgSBPPayload))) m
| _msgSBPType == msgSettingsWriteResp = SBPMsgSettingsWriteResp (decode (fromStrict (unBytes _msgSBPPayload))) m
| _msgSBPType == msgSolnMeta = SBPMsgSolnMeta (decode (fromStrict (unBytes _msgSBPPayload))) m
| _msgSBPType == msgSolnMetaDepA = SBPMsgSolnMetaDepA (decode (fromStrict (unBytes _msgSBPPayload))) m
| _msgSBPType == msgSpecan = SBPMsgSpecan (decode (fromStrict (unBytes _msgSBPPayload))) m
| _msgSBPType == msgSpecanDep = SBPMsgSpecanDep (decode (fromStrict (unBytes _msgSBPPayload))) m
| _msgSBPType == msgSsrCodeBiases = SBPMsgSsrCodeBiases (decode (fromStrict (unBytes _msgSBPPayload))) m
Expand Down Expand Up @@ -606,6 +608,7 @@ instance Binary SBPMsg where
encoder (SBPMsgSettingsWrite _ m) = put m
encoder (SBPMsgSettingsWriteResp _ m) = put m
encoder (SBPMsgSolnMeta _ m) = put m
encoder (SBPMsgSolnMetaDepA _ m) = put m
encoder (SBPMsgSpecan _ m) = put m
encoder (SBPMsgSpecanDep _ m) = put m
encoder (SBPMsgSsrCodeBiases _ m) = put m
Expand Down Expand Up @@ -808,6 +811,7 @@ instance FromJSON SBPMsg where
| msgType == msgSettingsWrite = SBPMsgSettingsWrite <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
| msgType == msgSettingsWriteResp = SBPMsgSettingsWriteResp <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
| msgType == msgSolnMeta = SBPMsgSolnMeta <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
| msgType == msgSolnMetaDepA = SBPMsgSolnMetaDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
| msgType == msgSpecan = SBPMsgSpecan <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
| msgType == msgSpecanDep = SBPMsgSpecanDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
| msgType == msgSsrCodeBiases = SBPMsgSsrCodeBiases <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
Expand Down Expand Up @@ -1011,6 +1015,7 @@ instance ToJSON SBPMsg where
toJSON (SBPMsgSettingsWrite n m) = toJSON n <<>> toJSON m
toJSON (SBPMsgSettingsWriteResp n m) = toJSON n <<>> toJSON m
toJSON (SBPMsgSolnMeta n m) = toJSON n <<>> toJSON m
toJSON (SBPMsgSolnMetaDepA n m) = toJSON n <<>> toJSON m
toJSON (SBPMsgSpecan n m) = toJSON n <<>> toJSON m
toJSON (SBPMsgSpecanDep n m) = toJSON n <<>> toJSON m
toJSON (SBPMsgSsrCodeBiases n m) = toJSON n <<>> toJSON m
Expand Down Expand Up @@ -1208,6 +1213,7 @@ instance HasMsg SBPMsg where
msg f (SBPMsgSettingsWrite n m) = SBPMsgSettingsWrite n <$> f m
msg f (SBPMsgSettingsWriteResp n m) = SBPMsgSettingsWriteResp n <$> f m
msg f (SBPMsgSolnMeta n m) = SBPMsgSolnMeta n <$> f m
msg f (SBPMsgSolnMetaDepA n m) = SBPMsgSolnMetaDepA n <$> f m
msg f (SBPMsgSpecan n m) = SBPMsgSpecan n <$> f m
msg f (SBPMsgSpecanDep n m) = SBPMsgSpecanDep n <$> f m
msg f (SBPMsgSsrCodeBiases n m) = SBPMsgSsrCodeBiases n <$> f m
Expand Down
99 changes: 78 additions & 21 deletions haskell/src/SwiftNav/SBP/SolutionMeta.hs
Original file line number Diff line number Diff line change
Expand Up @@ -64,37 +64,98 @@ instance Binary SolutionInputType where
$(makeJSON "_solutionInputType_" ''SolutionInputType)
$(makeLenses ''SolutionInputType)

msgSolnMeta :: Word16
msgSolnMeta = 0xFF0F
msgSolnMetaDepA :: Word16
msgSolnMetaDepA = 0xFF0F

-- | SBP class for message MSG_SOLN_META (0xFF0F).
-- | SBP class for message MSG_SOLN_META_DEP_A (0xFF0F).
--
-- This message contains all metadata about the sensors received and/or used in
-- computing the Fuzed Solution. It focuses primarly, but not only, on GNSS
-- metadata.
data MsgSolnMeta = MsgSolnMeta
{ _msgSolnMeta_pdop :: !Word16
data MsgSolnMetaDepA = MsgSolnMetaDepA
{ _msgSolnMetaDepA_pdop :: !Word16
-- ^ Position Dilution of Precision, as per last available DOPS from Starling
-- GNSS engine
, _msgSolnMeta_hdop :: !Word16
, _msgSolnMetaDepA_hdop :: !Word16
-- ^ Horizontal Dilution of Precision, as per last available DOPS from
-- Starling GNSS engine
, _msgSolnMeta_vdop :: !Word16
, _msgSolnMetaDepA_vdop :: !Word16
-- ^ Vertical Dilution of Precision, as per last available DOPS from Starling
-- GNSS engine
, _msgSolnMeta_n_sats :: !Word8
, _msgSolnMetaDepA_n_sats :: !Word8
-- ^ Number of satellites, as per last available solution from Starling GNSS
-- engine
, _msgSolnMeta_age_corrections :: !Word16
, _msgSolnMetaDepA_age_corrections :: !Word16
-- ^ Age of the corrections (0xFFFF indicates invalid), as per last available
-- AGE_CORRECTIONS from Starling GNSS engine
, _msgSolnMeta_alignment_status :: !Word8
, _msgSolnMetaDepA_alignment_status :: !Word8
-- ^ State of alignment and the status and receipt of the alignment inputs
, _msgSolnMeta_last_used_gnss_pos_tow :: !Word32
, _msgSolnMetaDepA_last_used_gnss_pos_tow :: !Word32
-- ^ Tow of last-used GNSS position measurement
, _msgSolnMeta_last_used_gnss_vel_tow :: !Word32
, _msgSolnMetaDepA_last_used_gnss_vel_tow :: !Word32
-- ^ Tow of last-used GNSS velocity measurement
, _msgSolnMeta_sol_in :: ![SolutionInputType]
, _msgSolnMetaDepA_sol_in :: ![SolutionInputType]
-- ^ Array of Metadata describing the sensors potentially involved in the
-- solution. Each element in the array represents a single sensor type and
-- consists of flags containing (meta)data pertaining to that specific
-- single sensor. Refer to each (XX)InputType descriptor in the present
-- doc.
} deriving ( Show, Read, Eq )

instance Binary MsgSolnMetaDepA where
get = do
_msgSolnMetaDepA_pdop <- getWord16le
_msgSolnMetaDepA_hdop <- getWord16le
_msgSolnMetaDepA_vdop <- getWord16le
_msgSolnMetaDepA_n_sats <- getWord8
_msgSolnMetaDepA_age_corrections <- getWord16le
_msgSolnMetaDepA_alignment_status <- getWord8
_msgSolnMetaDepA_last_used_gnss_pos_tow <- getWord32le
_msgSolnMetaDepA_last_used_gnss_vel_tow <- getWord32le
_msgSolnMetaDepA_sol_in <- whileM (not <$> isEmpty) get
pure MsgSolnMetaDepA {..}

put MsgSolnMetaDepA {..} = do
putWord16le _msgSolnMetaDepA_pdop
putWord16le _msgSolnMetaDepA_hdop
putWord16le _msgSolnMetaDepA_vdop
putWord8 _msgSolnMetaDepA_n_sats
putWord16le _msgSolnMetaDepA_age_corrections
putWord8 _msgSolnMetaDepA_alignment_status
putWord32le _msgSolnMetaDepA_last_used_gnss_pos_tow
putWord32le _msgSolnMetaDepA_last_used_gnss_vel_tow
mapM_ put _msgSolnMetaDepA_sol_in

$(makeSBP 'msgSolnMetaDepA ''MsgSolnMetaDepA)
$(makeJSON "_msgSolnMetaDepA_" ''MsgSolnMetaDepA)
$(makeLenses ''MsgSolnMetaDepA)

msgSolnMeta :: Word16
msgSolnMeta = 0xFF0E

-- | SBP class for message MSG_SOLN_META (0xFF0E).
--
-- This message contains all metadata about the sensors received and/or used in
-- computing the sensorfusion solution. It focuses primarly, but not only, on
-- GNSS metadata.
data MsgSolnMeta = MsgSolnMeta
{ _msgSolnMeta_tow :: !Word32
-- ^ GPS time of week rounded to the nearest millisecond
, _msgSolnMeta_pdop :: !Word16
-- ^ Position Dilution of Precision, as per last available DOPS from Starling
-- GNSS engine
, _msgSolnMeta_hdop :: !Word16
-- ^ Horizontal Dilution of Precision, as per last available DOPS from
-- Starling GNSS engine
, _msgSolnMeta_vdop :: !Word16
-- ^ Vertical Dilution of Precision, as per last available DOPS from Starling
-- GNSS engine
, _msgSolnMeta_age_corrections :: !Word16
-- ^ Age of the corrections (0xFFFF indicates invalid), as per last available
-- AGE_CORRECTIONS from Starling GNSS engine
, _msgSolnMeta_age_gnss :: !Word16
-- ^ Age of the last received valid GNSS solution (0xFFFF indicates invalid)
, _msgSolnMeta_sol_in :: ![SolutionInputType]
-- ^ Array of Metadata describing the sensors potentially involved in the
-- solution. Each element in the array represents a single sensor type and
-- consists of flags containing (meta)data pertaining to that specific
Expand All @@ -104,26 +165,22 @@ data MsgSolnMeta = MsgSolnMeta

instance Binary MsgSolnMeta where
get = do
_msgSolnMeta_tow <- getWord32le
_msgSolnMeta_pdop <- getWord16le
_msgSolnMeta_hdop <- getWord16le
_msgSolnMeta_vdop <- getWord16le
_msgSolnMeta_n_sats <- getWord8
_msgSolnMeta_age_corrections <- getWord16le
_msgSolnMeta_alignment_status <- getWord8
_msgSolnMeta_last_used_gnss_pos_tow <- getWord32le
_msgSolnMeta_last_used_gnss_vel_tow <- getWord32le
_msgSolnMeta_age_gnss <- getWord16le
_msgSolnMeta_sol_in <- whileM (not <$> isEmpty) get
pure MsgSolnMeta {..}

put MsgSolnMeta {..} = do
putWord32le _msgSolnMeta_tow
putWord16le _msgSolnMeta_pdop
putWord16le _msgSolnMeta_hdop
putWord16le _msgSolnMeta_vdop
putWord8 _msgSolnMeta_n_sats
putWord16le _msgSolnMeta_age_corrections
putWord8 _msgSolnMeta_alignment_status
putWord32le _msgSolnMeta_last_used_gnss_pos_tow
putWord32le _msgSolnMeta_last_used_gnss_vel_tow
putWord16le _msgSolnMeta_age_gnss
mapM_ put _msgSolnMeta_sol_in

$(makeSBP 'msgSolnMeta ''MsgSolnMeta)
Expand Down
3 changes: 3 additions & 0 deletions java/src/com/swiftnav/sbp/client/MessageTable.java
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@
import com.swiftnav.sbp.settings.MsgSettingsReadByIndexDone;
import com.swiftnav.sbp.settings.MsgSettingsRegister;
import com.swiftnav.sbp.settings.MsgSettingsRegisterResp;
import com.swiftnav.sbp.solution_meta.MsgSolnMetaDepA;
import com.swiftnav.sbp.solution_meta.MsgSolnMeta;
import com.swiftnav.sbp.ssr.MsgSsrOrbitClock;
import com.swiftnav.sbp.ssr.MsgSsrCodeBiases;
Expand Down Expand Up @@ -532,6 +533,8 @@ static SBPMessage dispatch(SBPMessage msg) throws SBPBinaryException {
return new MsgSettingsRegister(msg);
case MsgSettingsRegisterResp.TYPE:
return new MsgSettingsRegisterResp(msg);
case MsgSolnMetaDepA.TYPE:
return new MsgSolnMetaDepA(msg);
case MsgSolnMeta.TYPE:
return new MsgSolnMeta(msg);
case MsgSsrOrbitClock.TYPE:
Expand Down
40 changes: 14 additions & 26 deletions java/src/com/swiftnav/sbp/solution_meta/MsgSolnMeta.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,22 @@
import org.json.JSONArray;


/** SBP class for message MSG_SOLN_META (0xFF0F).
/** SBP class for message MSG_SOLN_META (0xFF0E).
*
* You can have MSG_SOLN_META inherent its fields directly from
* an inherited SBP object, or construct it inline using a dict of its
* fields.
*
* This message contains all metadata about the sensors received and/or used in computing the Fuzed Solution.
* This message contains all metadata about the sensors received and/or used in computing the sensorfusion solution.
* It focuses primarly, but not only, on GNSS metadata. */

public class MsgSolnMeta extends SBPMessage {
public static final int TYPE = 0xFF0F;
public static final int TYPE = 0xFF0E;


/** GPS time of week rounded to the nearest millisecond */
public long tow;

/** Position Dilution of Precision, as per last available DOPS from Starling GNSS engine */
public int pdop;

Expand All @@ -44,20 +47,11 @@ public class MsgSolnMeta extends SBPMessage {
/** Vertical Dilution of Precision, as per last available DOPS from Starling GNSS engine */
public int vdop;

/** Number of satellites, as per last available solution from Starling GNSS engine */
public int n_sats;

/** Age of the corrections (0xFFFF indicates invalid), as per last available AGE_CORRECTIONS from Starling GNSS engine */
public int age_corrections;

/** State of alignment and the status and receipt of the alignment inputs */
public int alignment_status;

/** Tow of last-used GNSS position measurement */
public long last_used_gnss_pos_tow;

/** Tow of last-used GNSS velocity measurement */
public long last_used_gnss_vel_tow;
/** Age of the last received valid GNSS solution (0xFFFF indicates invalid) */
public int age_gnss;

/** Array of Metadata describing the sensors potentially involved in the solution. Each element in the array represents a single sensor type and consists of flags containing (meta)data pertaining to that specific single sensor. Refer to each (XX)InputType descriptor in the present doc. */
public SolutionInputType[] sol_in;
Expand All @@ -73,41 +67,35 @@ public MsgSolnMeta (SBPMessage msg) throws SBPBinaryException {
@Override
protected void parse(Parser parser) throws SBPBinaryException {
/* Parse fields from binary */
tow = parser.getU32();
pdop = parser.getU16();
hdop = parser.getU16();
vdop = parser.getU16();
n_sats = parser.getU8();
age_corrections = parser.getU16();
alignment_status = parser.getU8();
last_used_gnss_pos_tow = parser.getU32();
last_used_gnss_vel_tow = parser.getU32();
age_gnss = parser.getU16();
sol_in = parser.getArray(SolutionInputType.class);
}

@Override
protected void build(Builder builder) {
builder.putU32(tow);
builder.putU16(pdop);
builder.putU16(hdop);
builder.putU16(vdop);
builder.putU8(n_sats);
builder.putU16(age_corrections);
builder.putU8(alignment_status);
builder.putU32(last_used_gnss_pos_tow);
builder.putU32(last_used_gnss_vel_tow);
builder.putU16(age_gnss);
builder.putArray(sol_in);
}

@Override
public JSONObject toJSON() {
JSONObject obj = super.toJSON();
obj.put("tow", tow);
obj.put("pdop", pdop);
obj.put("hdop", hdop);
obj.put("vdop", vdop);
obj.put("n_sats", n_sats);
obj.put("age_corrections", age_corrections);
obj.put("alignment_status", alignment_status);
obj.put("last_used_gnss_pos_tow", last_used_gnss_pos_tow);
obj.put("last_used_gnss_vel_tow", last_used_gnss_vel_tow);
obj.put("age_gnss", age_gnss);
obj.put("sol_in", SBPStruct.toJSONArray(sol_in));
return obj;
}
Expand Down
Loading