2019-07-12 15:40:13 +02:00
|
|
|
/*
|
|
|
|
|
/ _____) _ | |
|
|
|
|
|
( (____ _____ ____ _| |_ _____ ____| |__
|
|
|
|
|
\____ \| ___ | (_ _) ___ |/ ___) _ \
|
|
|
|
|
_____) ) ____| | | || |_| ____( (___| | | |
|
|
|
|
|
(______/|_____)_|_|_| \__)_____)\____)_| |_|
|
|
|
|
|
(C)2019 Semtech
|
|
|
|
|
|
|
|
|
|
Description:
|
|
|
|
|
SX1302 timestamp counter Hardware Abstraction Layer
|
|
|
|
|
Handles the conversion of a 32-bits 32MHz counter into a 32-bits 1 MHz counter.
|
|
|
|
|
This modules MUST be called regularly by the application to maintain counter
|
|
|
|
|
wrapping handling for conversion in 1MHz counter.
|
|
|
|
|
Provides function to compute the correction to be applied to the received
|
|
|
|
|
timestamp for demodulation processing time.
|
|
|
|
|
|
|
|
|
|
License: Revised BSD License, see LICENSE.TXT file include in the project
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _LORAGW_SX1302_TIMESTAMP_H
|
|
|
|
|
#define _LORAGW_SX1302_TIMESTAMP_H
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* --- DEPENDANCIES --------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
#include <stdint.h> /* C99 types*/
|
|
|
|
|
#include <stdbool.h> /* boolean type */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "config.h" /* library configuration options (dynamically generated) */
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* --- PUBLIC CONSTANTS ----------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* --- PUBLIC MACROS -------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* --- PUBLIC TYPES --------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@struct timestamp_counter_s
|
|
|
|
|
@brief context to maintain the internal counters (inst and pps trig) wrapping
|
|
|
|
|
*/
|
|
|
|
|
typedef struct timestamp_counter_s {
|
|
|
|
|
uint32_t counter_us_raw_27bits_inst_prev;
|
|
|
|
|
uint32_t counter_us_raw_27bits_pps_prev;
|
|
|
|
|
uint8_t counter_us_raw_27bits_inst_wrap;
|
|
|
|
|
uint8_t counter_us_raw_27bits_pps_wrap;
|
|
|
|
|
} timestamp_counter_t;
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* --- PUBLIC FUNCTIONS ----------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
/**
|
2019-09-20 11:06:37 +02:00
|
|
|
@brief Initialize the timestamp_counter instance
|
|
|
|
|
@param self Pointer to the counter handler
|
|
|
|
|
@return N/A
|
2019-07-12 15:40:13 +02:00
|
|
|
*/
|
|
|
|
|
void timestamp_counter_new(timestamp_counter_t * self);
|
|
|
|
|
|
|
|
|
|
/**
|
2019-09-20 11:06:37 +02:00
|
|
|
@brief Reset the timestamp_counter instance
|
|
|
|
|
@param self Pointer to the counter handler
|
|
|
|
|
@return N/A
|
2019-07-12 15:40:13 +02:00
|
|
|
*/
|
|
|
|
|
void timestamp_counter_delete(timestamp_counter_t * self);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@brief Update the counter wrapping status based on given current counter
|
|
|
|
|
@param self Pointer to the counter handler
|
|
|
|
|
@param pps Set to true to update the PPS trig counter status
|
|
|
|
|
@param cnt Current value of the counter to be used for the update
|
|
|
|
|
@return N/A
|
|
|
|
|
*/
|
|
|
|
|
void timestamp_counter_update(timestamp_counter_t * self, bool pps, uint32_t cnt);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@brief Convert the 27-bits counter given by the SX1302 to a 32-bits counter which wraps on a uint32_t.
|
|
|
|
|
@param self Pointer to the counter handler
|
|
|
|
|
@param pps Set to true to expand the counter based on the PPS trig wrapping status
|
|
|
|
|
@param cnt_us The 27-bits counter to be expanded
|
|
|
|
|
@return the 32-bits counter
|
|
|
|
|
*/
|
|
|
|
|
uint32_t timestamp_counter_expand(timestamp_counter_t * self, bool pps, uint32_t cnt_us);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@brief Reads the SX1302 internal counter register, and return the 32-bits 1 MHz counter
|
|
|
|
|
@param self Pointer to the counter handler
|
|
|
|
|
@param pps Set to true to expand the counter based on the PPS trig wrapping status
|
|
|
|
|
@return the current 32-bits counter
|
|
|
|
|
*/
|
|
|
|
|
uint32_t timestamp_counter_get(timestamp_counter_t * self, bool pps);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@brief Get the timestamp correction to applied to the packet timestamp
|
|
|
|
|
@param ifmod modem type
|
|
|
|
|
@param bandwidth modulation bandwidth
|
|
|
|
|
@param datarate modulation datarate
|
|
|
|
|
@param coderate modulation coding rate
|
|
|
|
|
@param crc_en indicates if CRC is enabled or disabled
|
|
|
|
|
@param payload_length payload length
|
|
|
|
|
@return The correction to be applied to the packet timestamp, in microseconds
|
|
|
|
|
*/
|
|
|
|
|
uint32_t timestamp_counter_correction(int ifmod, uint8_t bandwidth, uint8_t datarate, uint8_t coderate, uint32_t crc_en, uint16_t payload_length);
|
|
|
|
|
|
|
|
|
|
/**
|
2019-09-20 11:06:37 +02:00
|
|
|
@brief Configure the SX1302 to output legacy timestamp or precision timestamp
|
|
|
|
|
@note Legacy timestamp gives a timestamp latched at the end of the packet
|
|
|
|
|
@note Precision timestamp gives a timestamp latched at the end of the header
|
|
|
|
|
@note and additionally supplies metrics every N symbols troughout the payload.
|
|
|
|
|
@param enable_precision_ts A boolean to enable precision timestamp output.
|
|
|
|
|
@param max_ts_metrics The number of timestamp metrics to be returned when precision timestamp is enabled
|
|
|
|
|
@param nb_symbols The sampling rate of timestamp metrics
|
|
|
|
|
@return LGW_REG_SUCCESS if success, LGW_REG_ERROR otherwise
|
2019-07-12 15:40:13 +02:00
|
|
|
*/
|
|
|
|
|
int timestamp_counter_mode(bool enable_precision_ts, uint8_t max_ts_metrics, uint8_t nb_symbols);
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* --- EOF ------------------------------------------------------------------ */
|