[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