[Feature]Add gnss measurement feature and lynq-gnss-test add raw_start mode
Change-Id: Ibf06aafeb26676c06630b6257d591d7ba00f26e5
diff --git a/lib/liblynq-gnss/include/lynq_gnss.h b/lib/liblynq-gnss/include/lynq_gnss.h
index a877350..e7e3816 100755
--- a/lib/liblynq-gnss/include/lynq_gnss.h
+++ b/lib/liblynq-gnss/include/lynq_gnss.h
@@ -60,6 +60,9 @@
// typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg);
+//typedef void (*gnss_measurement_ext_callback) (GnssData_ext* data);
+
+
typedef struct
{
size_t size;
@@ -69,6 +72,12 @@
gps_create_thread lynq_create_thread_cb;
}lynq_gnss_cb;
+typedef struct
+{
+ size_t size;
+ gnss_measurement_ext_callback lynq_measurement_callback;
+}lynq_raw_gnss_cbs;
+
int lynq_gnss_init(void);
@@ -88,6 +97,10 @@
int lynq_gnss_inject_fused_location(double latitude,double longitude,float accuracy);
+int lynq_gnss_start_raw_meas_mode(lynq_raw_gnss_cbs* raw_gnss_cbs);
+
+int lynq_gnss_stop_raw_meas_mode();
+
int lynq_gnss_set_start_mode(LYNQ_GNSS_MODE_CONFIGURATION start_mode);
int lynq_gnss_epo_switch(LYNQ_CONF_SWITCH switch_op);
diff --git a/lib/liblynq-gnss/src/lynq_callback.c b/lib/liblynq-gnss/src/lynq_callback.c
index 37d7490..09f6d2b 100755
--- a/lib/liblynq-gnss/src/lynq_callback.c
+++ b/lib/liblynq-gnss/src/lynq_callback.c
@@ -9,6 +9,7 @@
#include"lynq_gnss.h"
extern lynq_gnss_cb* lynq_callbacks;
+extern lynq_raw_gnss_cbs *lynq_meas_callbacks;
void lynq_gps_location_callback(GpsLocation_ext* location)
{
@@ -118,3 +119,25 @@
{
return &lynq_gps_callbacks_gnss;
}
+
+void lynq_measurement_callback(GpsData *data)
+{
+
+}
+
+void lynq_gnss_measurement_callback(GnssData_ext* data)
+{
+ lynq_meas_callbacks->lynq_measurement_callback(data);
+ return;
+}
+
+GpsMeasurementCallbacks_ext lynq_test_raw_callbacks = {
+ .size = sizeof(GpsMeasurementCallbacks_ext),
+ .measurement_callback = lynq_measurement_callback,
+ .gnss_measurement_callback = lynq_gnss_measurement_callback,
+};
+
+GpsMeasurementCallbacks_ext* lynq_gnss_get_raw_callbacks(void)
+{
+ return &lynq_test_raw_callbacks;
+}
diff --git a/lib/liblynq-gnss/src/lynq_gnss.c b/lib/liblynq-gnss/src/lynq_gnss.c
index d8423ab..12e717e 100755
--- a/lib/liblynq-gnss/src/lynq_gnss.c
+++ b/lib/liblynq-gnss/src/lynq_gnss.c
@@ -26,8 +26,12 @@
#define LOG_TAG "LYNQ_GNSS"
+
lynq_gnss_cb* lynq_callbacks =NULL ;
+lynq_raw_gnss_cbs* lynq_meas_callbacks = NULL;
+
GpsCallbacks_ext* turn_cbs = NULL;
+GpsMeasurementCallbacks_ext* raw_cbs = NULL;
/**
* @brief mark gnss initialization state
@@ -36,6 +40,13 @@
*/
static int g_lynq_gnss_init_flag = 0;
+/**
+ * @brief mark gnss raw meas state
+ * 0: deinit state
+ * 1: init state
+ */
+static int g_lynq_gnss_raw_meas_flag = 0;
+
int lynq_gnss_init(void)
{
if (g_lynq_gnss_init_flag == 1)
@@ -145,9 +156,42 @@
return 0; // 0:ok, non-zero: error; but GPS JNI will ignore it
}
/*get extension*/
-void* lynq_gnss_get_extension(const char* name)
+int lynq_gnss_start_raw_meas_mode(lynq_raw_gnss_cbs* raw_gnss_cbs)
{
-
+ if (g_lynq_gnss_raw_meas_flag == 1)
+ {
+ RLOGD("start twice is not allowed");
+ return -1;
+ }
+ g_lynq_gnss_raw_meas_flag = 1;
+
+ lynq_meas_callbacks = raw_gnss_cbs;
+ raw_cbs = lynq_gnss_get_raw_callbacks();
+ if (NULL == raw_cbs)
+ {
+ RLOGD("callbacks error");
+ return -2;
+ }
+ g_gpshal_ctx.meas_cbs = raw_cbs;
+ RLOGD("liblynq-gnss:Test for adress %p",g_gpshal_ctx.meas_cbs);
+ int ret = hal2mnl_set_gps_measurement(true, true);
+ return (ret > 0)?
+ GPS_GEOFENCE_OPERATION_SUCCESS :
+ GPS_GEOFENCE_ERROR_GENERIC;
+}
+
+int lynq_gnss_stop_raw_meas_mode()
+{
+ if (g_lynq_gnss_raw_meas_flag == 0)
+ {
+ RLOGD("must start raw meas first");
+ return -1;
+ }
+ if (hal2mnl_set_gps_measurement(false, false) == -1) {
+ LOGE("hal2mnl_set_gps_measurement failed because of safe_sendto fail ,strerror:%s \n", strerror(errno));
+ }
+ RLOGD("typethree test: stop gps raw measurement");
+ return 0;
}
int lynq_gnss_set_start_mode(LYNQ_GNSS_MODE_CONFIGURATION start_mode)
diff --git a/lib/liblynq-gnss/src/lynq_gnsshal.h b/lib/liblynq-gnss/src/lynq_gnsshal.h
index 071f16b..a7687fe 100755
--- a/lib/liblynq-gnss/src/lynq_gnsshal.h
+++ b/lib/liblynq-gnss/src/lynq_gnsshal.h
@@ -9,6 +9,7 @@
#include "hardware/gps_mtk.h"
#include "hal2mnl_interface.h"
#include "gpshal.h"
+#include "gps_mtk.h"
#define LYNQ_GNSS_MODE "GNSS_MODE"
#define LYNQ_DEBUG_STATUS "debug.dbg2file"
@@ -34,6 +35,8 @@
GpsCallbacks_ext* lynq__get_gps_callbacks(void);
+GpsMeasurementCallbacks_ext* lynq_gnss_get_raw_callbacks(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c b/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c
index 7a2861b..4cd3503 100755
--- a/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c
+++ b/packages/apps/lynq-gnss-test/lynq-gnss-test-cb.c
@@ -121,3 +121,86 @@
{
return &lynq_gnss_callbacks;
}
+
+
+void lynq_gnss__measurement_callback(GnssData_ext* data)
+{
+ printf("test for mesurement_callback 1");
+ int i;
+ int meas_cnt;
+ GnssMeasurement_ext* raw_meas;
+ GnssClock_ext* clk;
+ ElapsedRealtime* elap_realtime;
+
+ if (data == NULL) {
+ printf("param error");
+ return;
+ }
+ printf("test for mesurement_callback 2");
+
+ meas_cnt = data->measurement_count;
+ printf("==================== print_gnss_measurement ====================");
+ printf("measurement count is: %d", meas_cnt);
+ for (i = 0; i < meas_cnt; i++) {
+ raw_meas = &(data->measurements[i]);
+ printf("********* measurement message %d *********\r\n", i+1);
+ printf("flags=0x%x\r\n", raw_meas->legacyMeasurement.flags);
+ printf("svid=%d\r\n", raw_meas->legacyMeasurement.svid);
+ printf("constellation=0x%x\r\n", raw_meas->legacyMeasurement.constellation);
+ printf("time_offset_ns=%f\r\n", raw_meas->legacyMeasurement.time_offset_ns);
+ printf("state=0x%x\r\n", raw_meas->legacyMeasurement.state);
+ printf("c_n0_dbhz=%f\r\n", raw_meas->legacyMeasurement.c_n0_dbhz);
+ printf("pseudorange_rate_mps=%f\r\n", raw_meas->legacyMeasurement.pseudorange_rate_mps);
+ printf("pseudorange_rate_uncertainty_mps=%f\r\n", raw_meas->legacyMeasurement.pseudorange_rate_uncertainty_mps);
+ printf("accumulated_delta_range_state=0x%x\r\n", raw_meas->legacyMeasurement.accumulated_delta_range_state);
+ printf("accumulated_delta_range_m=%f\r\n", raw_meas->legacyMeasurement.accumulated_delta_range_m);
+ printf("accumulated_delta_range_uncertainty_m=%f\r\n", raw_meas->legacyMeasurement.accumulated_delta_range_uncertainty_m);
+ printf("carrier_frequency_hz=%f\r\n", raw_meas->legacyMeasurement.carrier_frequency_hz);
+ printf("carrier_phase=%f\r\n", raw_meas->legacyMeasurement.carrier_phase);
+ printf("carrier_phase_uncertainty=%f\r\n", raw_meas->legacyMeasurement.carrier_phase_uncertainty);
+ printf("multipath_indicator=%d\r\n", raw_meas->legacyMeasurement.multipath_indicator);
+ printf("snr_db=%f\r\n", raw_meas->legacyMeasurement.snr_db);
+
+ printf("agc_level_db=%f\r\n", raw_meas->agc_level_db);
+ printf("codeType=%s\r\n", raw_meas->codeType);
+ printf("fullInterSignalBiasNs=%f\r\n", raw_meas->fullInterSignalBiasNs);
+ printf("fullInterSignalBiasUncertaintyNs=%f\r\n", raw_meas->fullInterSignalBiasUncertaintyNs);
+ printf("satelliteInterSignalBiasNs=%f\r\n", raw_meas->satelliteInterSignalBiasNs);
+ printf("satelliteInterSignalBiasUncertaintyNs=%f\r\n", raw_meas->satelliteInterSignalBiasUncertaintyNs);
+ printf("basebandCN0DbHz=%f\r\n", raw_meas->basebandCN0DbHz);
+ }
+
+ clk = &(data->clock);
+ printf("======================= print_gnss_clock =======================");
+ printf("flags=0x%x\r\n", clk->legacyClock.flags);
+ printf("leap_second=%d\r\n", clk->legacyClock.leap_second);
+ printf("time_uncertainty_ns=%f\r\n", clk->legacyClock.time_uncertainty_ns);
+
+ printf("bias_ns=%f\r\n", clk->legacyClock.bias_ns);
+ printf("bias_uncertainty_ns=%f\r\n", clk->legacyClock.bias_uncertainty_ns);
+ printf("drift_nsps=%f\r\n", clk->legacyClock.drift_nsps);
+ printf("drift_uncertainty_nsps=%f\r\n", clk->legacyClock.drift_uncertainty_nsps);
+ printf("hw_clock_discontinuity_count=%d\r\n", clk->legacyClock.hw_clock_discontinuity_count);
+ printf("constellation=%d\r\n", clk->referenceSignalTypeForIsb.constellation);
+ printf("carrierFrequencyHz=%f\r\n", clk->referenceSignalTypeForIsb.carrierFrequencyHz);
+ printf("codeType=%s\r\n", clk->referenceSignalTypeForIsb.codeType);
+
+ elap_realtime = &(data->elapsedRealtime);
+ printf("================= print_gnss_elapsed_real_time =================");
+ printf("flags=0x%x\r\n", elap_realtime->flags);
+ printf("timestampNs=%lld\r\n", elap_realtime->timestampNs);
+ printf("timeUncertaintyNs=%lld\r\n", elap_realtime->timeUncertaintyNs);
+
+ return;
+}
+
+lynq_raw_gnss_cbs lynq_gnss_raw_callbacks =
+{
+ .size = sizeof(lynq_raw_gnss_cbs),
+ .lynq_measurement_callback = lynq_gnss__measurement_callback,
+};
+
+lynq_raw_gnss_cbs* lynq_get__raw_callbacks(void)
+{
+ return &lynq_gnss_raw_callbacks;
+}
\ No newline at end of file
diff --git a/packages/apps/lynq-gnss-test/lynq-gnss-test.c b/packages/apps/lynq-gnss-test/lynq-gnss-test.c
index 02dcb32..e3bb637 100755
--- a/packages/apps/lynq-gnss-test/lynq-gnss-test.c
+++ b/packages/apps/lynq-gnss-test/lynq-gnss-test.c
@@ -21,6 +21,7 @@
#define USER_LOG_TAG "LYNQ_GNSS"
lynq_gnss_cb* cbs =NULL;
+lynq_raw_gnss_cbs* raw_cbs = NULL;
sem_t g_lynq_test_exit_sem;
@@ -68,6 +69,7 @@
//register_broadcast_send();
LYVERBLOG("Log init");
int index = 0;
+ int ret_test = 0;
unsigned int delete_flags = 0;
if (argc == 1)
{
@@ -102,6 +104,45 @@
LYVERBLOG("LYNQ GNSS FULL START");
delete_flags = GPS_DELETE_ALL;
}
+ else if (!strncmp(argv[1],LYNQ_TEST_RAW_START,sizeof(LYNQ_TEST_RAW_START)))
+ {
+ LYVERBLOG("LYNQ GNSS MEAS MODE START");
+ cbs = lynq_test_get__gnss_callbacks();
+ if(NULL != cbs)
+ {
+ LYVERBLOG("get cbs successful");
+ }
+ else
+ {
+ LYVERBLOG("cbs get error");
+ }
+ raw_cbs = lynq_get__raw_callbacks();
+ if(NULL == raw_cbs)
+ {
+ LYVERBLOG("raw_cbs get error");
+ }
+ //open GNSS
+ ret_test = lynq_gnss_callback_reg(cbs);
+ LYVERBLOG("cbs reg ret=%d",ret_test);
+
+ int init_state = lynq_gnss_init();
+ if(init_state == 0)
+ {
+ LYVERBLOG("gnss init ret_test =%d",init_state);
+ }
+ else
+ {
+ LYVERBLOG("error");
+ }
+ ret_test = lynq_gnss_start_raw_meas_mode(raw_cbs);
+ LYVERBLOG("typethree:start raw meas address %p",raw_cbs);
+
+ LYVERBLOG("raw mode start");
+
+ lynq_test_block_here();
+
+ return 0;
+ }
else
{
LYVERBLOG("invalid in comming start type");
@@ -110,7 +151,6 @@
}
//pre set
- int ret_test = 0;
// lynq_gnss_set_start_mode(LYNQ_MODE_GPS_GLONASS_BEIDOU);
// lynq_gnss_debug_switch(LYNQ_SWITCH_ENABLE);
diff --git a/packages/apps/lynq-gnss-test/lynq-gnss-test.h b/packages/apps/lynq-gnss-test/lynq-gnss-test.h
index f4a3bf7..328e17d 100755
--- a/packages/apps/lynq-gnss-test/lynq-gnss-test.h
+++ b/packages/apps/lynq-gnss-test/lynq-gnss-test.h
@@ -9,6 +9,9 @@
}lynq_test_gnss_result;
lynq_gnss_cb* lynq_test_get__gnss_callbacks(void);
+
+lynq_raw_gnss_cbs* lynq_get__raw_callbacks(void);
+
void lynq_show_gnss_test_result(lynq_test_gnss_result* result);
#define LYNQ_TEST_HOT_START "hot"
@@ -19,5 +22,6 @@
#define LYNQ_TEST_FULL_START "full"
+#define LYNQ_TEST_RAW_START "raw_start"
#endif
\ No newline at end of file