pinebuds/services/ble_profiles/lan/lan_common.h

400 lines
12 KiB
C
Raw Permalink Normal View History

2022-08-15 04:20:27 -05:00
#ifndef _LANP_COMMON_H_
#define _LANP_COMMON_H_
/**
****************************************************************************************
* @addtogroup LANP Location and Navigation Profile
* @ingroup PROFILE
* @brief Location and Navigation Profile
*
* The Location and Navigation Profile is used to enable a collector device in order to obtain
* data from a Location and Navigation Sensor (LAN Sensor) that exposes the Location and Navigation Service.
*
* This file contains all definitions that are common for the server and the client parts
* of the profile.
*****************************************************************************************
*/
/*
* INCLUDE FILES
****************************************************************************************
*/
#include "prf_types.h"
#include <stdint.h>
/*
* DEFINES
****************************************************************************************
*/
/// Inappropriate Connection Parameters Error Code
#define LAN_ERROR_INAPP_CONNECT_PARAMS (0x80)
/// Procedure Already in Progress Error Code
#define LAN_ERROR_PROC_IN_PROGRESS (0x80)
#define LANP_LAN_LSPEED_MAX_PAIR_SIZE (8)
/// LAN Location and Speed Value Max Length
#define LANP_LAN_LOC_SPEED_MAX_LEN (28)
/// LAN Location and Speed Value Min Length
#define LANP_LAN_LOC_SPEED_MIN_LEN (2)
/// LAN Position Quality Value Max Length
#define LANP_LAN_POSQ_MAX_LEN (16)
/// LAN Position Quality Value Min Length
#define LANP_LAN_POSQ_MIN_LEN (2)
/// LAN Control Point Value Request Max Length
#define LANP_LAN_LN_CNTL_PT_REQ_MAX_LEN (5)
/// LAN Control Point Value Request Min Length
#define LANP_LAN_LN_CNTL_PT_REQ_MIN_LEN (1)
/// LAN Control Point data Max Length (from 2 to max route name)
#define LANP_LAN_LN_CNTL_DATA_MAX_LEN (128)
/// LAN Control Point Value Response Max Length
#define LANP_LAN_LN_CNTL_PT_RSP_MAX_LEN (3 + LANP_LAN_LN_CNTL_DATA_MAX_LEN)
/// LAN Control Point Value Response Min Length
#define LANP_LAN_LN_CNTL_PT_RSP_MIN_LEN (3)
/// LAN Navigation Value Max Length
#define LANP_LAN_NAVIGATION_MAX_LEN (21)
/// LAN Navigation Value Min Length
#define LANP_LAN_NAVIGATION_MIN_LEN (6)
/*
* ENUMERATIONS
****************************************************************************************
*/
/// LANP Service Characteristics
enum lanp_lans_char
{
/// LN Feature
LANP_LANS_LN_FEAT_CHAR,
/// Location and speed
LANP_LANS_LOC_SPEED_CHAR,
/// Position quality
LANP_LANS_POS_Q_CHAR,
/// LN Control Point
LANP_LANS_LN_CTNL_PT_CHAR,
/// Navigation
LANP_LANS_NAVIG_CHAR,
LANP_LANS_CHAR_MAX
};
/// LANP Feature Flags
enum lanp_feat_flags
{
/// Instantaneous Speed Supported
LANP_FEAT_INSTANTANEOUS_SPEED_SUPP = 0x00000001,
/// Total Distance Supported
LANP_FEAT_TOTAL_DISTANCE_SUPP = 0x00000002,
/// Location Supported
LANP_FEAT_LOCATION_SUPP = 0x00000004,
/// Elevation Supported
LANP_FEAT_ELEVATION_SUPP = 0x00000008,
/// Heading Supported
LANP_FEAT_HEADING_SUPP = 0x00000010,
/// Rolling Time Supported
LANP_FEAT_ROLLING_TIME_SUPP = 0x00000020,
/// UTC Time Supported
LANP_FEAT_UTC_TIME_SUPP = 0x00000040,
/// Remaining Distance Supported
LANP_FEAT_REMAINING_DISTANCE_SUPP = 0x00000080,
/// Remaining Vertical Distance Supported
LANP_FEAT_REMAINING_VERTICAL_DISTANCE_SUPP = 0x00000100,
/// Estimated Time of Arrival Supported
LANP_FEAT_ESTIMATED_TIME_OF_ARRIVAL_SUPP = 0x00000200,
/// Number of Beacons in Solution Supported
LANP_FEAT_NUMBER_OF_BEACONS_IN_SOLUTION_SUPP = 0x00000400,
/// Number of Beacons in View Supported
LANP_FEAT_NUMBER_OF_BEACONS_IN_VIEW_SUPP = 0x00000800,
/// Time to First Fix Supported
LANP_FEAT_TIME_TO_FIRST_FIX_SUPP = 0x00001000,
/// Estimated Horizontal Position Error Supported
LANP_FEAT_ESTIMATED_HOR_POSITION_ERROR_SUPP = 0x00002000,
/// Estimated Vertical Position Error Supported
LANP_FEAT_ESTIMATED_VER_POSITION_ERROR_SUPP = 0x00004000,
/// Horizontal Dilution of Precision Supported
LANP_FEAT_HOR_DILUTION_OF_PRECISION_SUPP = 0x00008000,
/// Vertical Dilution of Precision Supported
LANP_FEAT_VER_DILUTION_OF_PRECISION_SUPP = 0x00010000,
/// Location and Speed Characteristic Content Masking Supported
LANP_FEAT_LSPEED_CHAR_CT_MASKING_SUPP = 0x00020000,
/// Fix Rate Setting Supported
LANP_FEAT_FIX_RATE_SETTING_SUPP = 0x00040000,
/// Elevation Setting Supported
LANP_FEAT_ELEVATION_SETTING_SUPP = 0x00080000,
/// Position Status Supported
LANP_FEAT_POSITION_STATUS_SUPP = 0x00100000,
/// All Supported
LANP_FEAT_ALL_SUPP = 0x001FFFFF
};
/// LANP Location and speed Flags
enum lanp_lspeed_flags
{
/// Instantaneous Speed Present
LANP_LSPEED_INST_SPEED_PRESENT = 0x0001,
/// Total Distance Present
LANP_LSPEED_TOTAL_DISTANCE_PRESENT = 0x0002,
/// Location Present
LANP_LSPEED_LOCATION_PRESENT = 0x0004,
/// Elevation Present
LANP_LSPEED_ELEVATION_PRESENT = 0x0008,
/// Heading Present
LANP_LSPEED_HEADING_PRESENT = 0x0010,
/// Rolling Time Present
LANP_LSPEED_ROLLING_TIME_PRESENT = 0x0020,
/// UTC Time Present
LANP_LSPEED_UTC_TIME_PRESENT = 0x0040,
/// Position Status LSB
LANP_LSPEED_POSITION_STATUS_LSB = 0x0080,
/// Position Status MSB
LANP_LSPEED_POSITION_STATUS_MSB = 0x0100,
/// Speed and Distance format
LANP_LSPEED_SPEED_AND_DISTANCE_FORMAT = 0x0200,
/// Elevation Source LSB
LANP_LSPEED_ELEVATION_SOURCE_LSB = 0x0400,
/// Elevation Source MSB
LANP_LSPEED_ELEVATION_SOURCE_MSB = 0x0800,
/// Heading Source
LANP_LSPEED_HEADING_SOURCE = 0x1000,
/// All Present
LANP_LSPEED_ALL_PRESENT = 0x1FFF
};
/// LANP Position quality Flags
enum lanp_posq_flags
{
/// Number of Beacons in Solution Present
LANP_POSQ_NUMBER_OF_BEACONS_IN_SOLUTION_PRESENT = 0x0001,
/// Number of Beacons in View Present
LANP_POSQ_NUMBER_OF_BEACONS_IN_VIEW_PRESENT = 0x0002,
/// Time to First Fix Present
LANP_POSQ_TIME_TO_FIRST_FIX_PRESENT = 0x0004,
/// EHPE Present
LANP_POSQ_EHPE_PRESENT = 0x0008,
/// EVPE Present
LANP_POSQ_EVPE_PRESENT = 0x0010,
/// HDOP Present
LANP_POSQ_HDOP_PRESENT = 0x0020,
/// VDOP Present
LANP_POSQ_VDOP_PRESENT = 0x0040,
/// Position Status LSB
LANP_POSQ_POSITION_STATUS_LSB = 0x0080,
/// Position Status MSB
LANP_POSQ_POSITION_STATUS_MSB = 0x0100,
/// All Present
LANP_POSQ_ALL_PRESENT = 0x01FF
};
/// LANP Control Point Keys
enum lanp_ln_ctnl_pt_code
{
/// Reserved value
LANP_LN_CTNL_PT_RESERVED = 0,
/// Set Cumulative Value
LANP_LN_CTNL_PT_SET_CUMUL_VALUE,
/// Mask Location and Speed Characteristic Content
LANP_LN_CTNL_PT_MASK_LSPEED_CHAR_CT,
/// Navigation Control
LANP_LN_CTNL_PT_NAVIGATION_CONTROL,
/// Request Number of Routes
LANP_LN_CTNL_PT_REQ_NUMBER_OF_ROUTES,
/// Request Name of Route
LANP_LN_CTNL_PT_REQ_NAME_OF_ROUTE,
/// Select Route
LANP_LN_CTNL_PT_SELECT_ROUTE,
/// Set Fix Rate
LANP_LN_CTNL_PT_SET_FIX_RATE,
/// Set Elevation
LANP_LN_CTNL_PT_SET_ELEVATION,
/// Response Code
LANP_LN_CTNL_PT_RESPONSE_CODE = 32
};
/// LANP Control Point Response Value
enum lanp_ctnl_pt_resp_val
{
/// Reserved value
LANP_LN_CTNL_PT_RESP_RESERVED = 0,
/// Success
LANP_LN_CTNL_PT_RESP_SUCCESS,
/// Operation Code Not Supported
LANP_LN_CTNL_PT_RESP_NOT_SUPP,
/// Invalid Parameter
LANP_LN_CTNL_PT_RESP_INV_PARAM,
/// Operation Failed
LANP_LN_CTNL_PT_RESP_FAILED,
};
/// LANP Navigation Control parameter
enum lanp_navi_control
{
/// Stop Navigation
LANP_LN_CTNL_STOP_NAVI = 0x00,
/// Start Navigation
LANP_LN_CTNL_START_NAVI = 0x01,
/// Pause Navigation
LANP_LN_CTNL_PAUSE_NAVI = 0x02,
/// Resume Navigation
LANP_LN_CTNL_RESUME_NAVI = 0x03,
/// Skip waypoint on route
LANP_LN_CTNL_SKIP_WPT = 0x04,
/// Start Navigation from the nearest waypoint
LANP_LN_CTNL_START_NST_WPT = 0x05,
};
/// LANP Navigation flags
enum lanp_navi_flags
{
/// Remaining Distance Present
LANP_NAVI_REMAINING_DIS_PRESENT = 0x0001,
/// Remaining Vertical Distance Present
LANP_NAVI_REMAINING_VER_DIS_PRESENT = 0x0002,
/// Estimated Time of Arrival Present
LANP_NAVI_ESTIMATED_TIME_OF_ARRIVAL_PRESENT = 0x0004,
/// Position Status lsb
LANP_NAVI_POSITION_STATUS_LSB = 0x0008,
/// Position Status msb
LANP_NAVI_POSITION_STATUS_MSB = 0x0010,
/// Heading Source
LANP_NAVI_HEADING_SOURCE = 0x0020,
/// Navigation Indicator Type
LANP_NAVI_NAVIGATION_INDICATOR_TYPE = 0x0040,
/// Waypoint Reached
LANP_NAVI_WAYPOINT_REACHED = 0x0080,
/// Destination Reached
LANP_NAVI_DESTINATION_REACHED = 0x0100,
/// ALl present
LANP_NAVI_ALL_PRESENT = 0x01FF
};
/*
* STRUCTURES
****************************************************************************************
*/
/// Location and Speed
struct lanp_loc_speed
{
/// Flags
uint16_t flags;
/// Instantaneous Speed
uint16_t inst_speed;
/// Total distance
uint32_t total_dist;
/// Location - Latitude
int32_t latitude;
/// Location - Longitude
int32_t longitude;
/// Elevation
int32_t elevation;
/// Heading
uint16_t heading;
/// Rolling time
uint8_t rolling_time;
/// UTC Time
struct prf_date_time date_time;
};
/// LAN Position quality
struct lanp_posq
{
/// Flags
uint16_t flags;
/// Time to First Fix
uint16_t time_first_fix;
/// EHPE
uint32_t ehpe;
/// EVPE
uint32_t evpe;
/// Number of Beacons in Solution
uint8_t n_beacons_solution;
/// Number of Beacons in view
uint8_t n_beacons_view;
/// HDOP
uint8_t hdop;
/// VDOP
uint8_t vdop;
};
/// LN Control Point Request
struct lan_ln_ctnl_pt_req
{
/// Operation code
uint8_t op_code;
/// Value
union lanp_ln_ctnl_pt_req_val
{
/// Cumulative Value (24 bits)
uint32_t cumul_val;
/// Mask Content
uint16_t mask_content;
/// Navigation Control
uint8_t control_value;
/// Route number
uint16_t route_number;
/// Fix rate
uint8_t fix_rate;
/// Elevation
int32_t elevation;
} value;
};
/// LAN Control Point Response
struct lanp_ln_ctnl_pt_rsp
{
/// Operation code
uint8_t req_op_code;
/// Response Value
uint8_t resp_value;
/// Value
union lanp_ctnl_pt_rsp_val
{
/// Number of routes
uint16_t number_of_routes;
struct lanp_route_name
{
uint8_t length;
/// Name of Route UTF-8
uint8_t name[__ARRAY_EMPTY];
} route;
} value;
};
/// LAN Navigation
struct lanp_navigation
{
/// Flags
uint16_t flags;
/// Bearing
uint16_t bearing;
/// Heading
uint16_t heading;
/// Remaining Distance (24 bits)
uint32_t remaining_distance;
/// Remaining Vertical Distance (24 bits)
uint32_t remaining_ver_distance;
/// Estimated Time of Arrival
struct prf_date_time estimated_arrival_time;
};
/// @} lanp_common
#endif //(_LANP_COMMON_H_)