指南针timer稳定性问题解决,数据还不准
authorSnickerSun <snickersun@163.com>
Mon, 22 Jan 2024 16:12:47 +0000 (00:12 +0800)
committerSnickerSun <snickersun@163.com>
Mon, 22 Jan 2024 16:12:47 +0000 (00:12 +0800)
code/sdk/drivers/peripheral/acc/lis2doc_STdC/examples/lis2doc_read_data_single.c
code/sdk/drivers/peripheral/mag/CMakeLists.txt
code/sdk/drivers/peripheral/mag/mmc5603/MMC5603.c
code/sdk/drivers/peripheral/mag/mmc5603/mmc5603_at_cmd.c
code/sdk/drivers/peripheral/mag/mmc5603/mmc5603_main.c
code/sdk/drivers/peripheral/mag/mmc5603/mmc_customer.c [moved from code/sdk/drivers/peripheral/mag/mmc5603/Customer.c with 95% similarity]
code/sdk/drivers/peripheral/mag/mmc5603/mmc_customer.h [moved from code/sdk/drivers/peripheral/mag/mmc5603/Customer.h with 93% similarity]
code/sdk/drivers/peripheral/mag/service/mag_service.c

index e21c050..42a01a8 100644 (file)
@@ -165,6 +165,10 @@ int lis2doc_read_data_single_init(void)
   pm.low_noise = 1;\r
   lis2doc_power_mode_set(&dev_ctx, pm);\r
 \r
+  //lis2doc_power_mode_set(&dev_ctx, LIS2DOC_CONT_LOW_PWR_LOW_NOISE_12bit);\r
+  /* Set Output Data Rate */\r
+  // lis2doc_data_rate_set(&dev_ctx, LIS2DOC_XL_ODR_25Hz);\r
+  \r
   lis2doc_data_rate_set(&dev_ctx, LIS2DOC_XL_SET_SW_TRIG);\r
   return ERRCODE_SUCC;\r
 }\r
@@ -187,7 +191,7 @@ int lis2doc_read_data_single(float *x,float *y ,float *z)
     uint8_t val = uapi_gpio_get_val(G_INT1_PIN);\r
     uint8_t val2 = uapi_gpio_get_val(G_INT2_PIN);\r
     // PRINT("G_INT1_PIN %u,G_INT2_PIN %u \r\n",val,val2);\r
-    if( val == 0 || val2 == 0)\r
+    // if( val == 0 || val2 == 0)\r
     {\r
       /* Read acceleration data */\r
       memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));\r
index 0ef2a27..ff0f262 100644 (file)
@@ -7,7 +7,7 @@ set(COMPONENT_NAME "mag_sensor")
 
 if("MAG_MMC5603" IN_LIST DEFINES)
 set(SOURCES ${SOURCES}
-    ${CMAKE_CURRENT_SOURCE_DIR}/mmc5603/Customer.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/mmc5603/mmc_customer.c
     ${CMAKE_CURRENT_SOURCE_DIR}/mmc5603/mmc5603_main.c
     ${CMAKE_CURRENT_SOURCE_DIR}/mmc5603/MMC5603.c
     ${CMAKE_CURRENT_SOURCE_DIR}/mmc5603/mmc5603_at_cmd.c
@@ -23,7 +23,7 @@ set(PUBLIC_DEFINES
 )
 else()
 set(SOURCES ${SOURCES}
-    ${CMAKE_CURRENT_SOURCE_DIR}/mmc5603/Customer.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/mmc5603/mmc_customer.c
     ${CMAKE_CURRENT_SOURCE_DIR}/mmc5603/mmc5603_main.c
     ${CMAKE_CURRENT_SOURCE_DIR}/mmc5603/MMC5603.c
     ${CMAKE_CURRENT_SOURCE_DIR}/mmc5603/mmc5603_at_cmd.c
index 8b5ab41..9003731 100644 (file)
@@ -15,8 +15,7 @@
  */\r
 \r
 #include "MMC5603.h"\r
-#include "Customer.h"\r
-\r
+#include "mmc_customer.h"\r
 #include "math.h"\r
 \r
 /* Indicate working mode of sensor */\r
@@ -450,10 +449,10 @@ void MMC5603_GetData(float *mag_out)
        mag_out[1] = ((float)data_temp[1] - MMC5603_16BIT_OFFSET)/MMC5603_16BIT_SENSITIVITY;\r
        mag_out[2] = ((float)data_temp[2] - MMC5603_16BIT_OFFSET)/MMC5603_16BIT_SENSITIVITY;\r
 \r
-       mag_out[0] = get_filter_data_x(mag_out[0]);\r
-       mag_out[1] = get_filter_data_y(mag_out[1]);\r
-       mag_out[2] = get_filter_data_z(mag_out[2]);\r
-       filter_index_plus();\r
+       // mag_out[0] = get_filter_data_x(mag_out[0]);\r
+       // mag_out[1] = get_filter_data_y(mag_out[1]);\r
+       // mag_out[2] = get_filter_data_z(mag_out[2]);\r
+       // filter_index_plus();\r
        \r
        MMC5603_Auto_Switch(data_temp); \r
                        \r
index 869c7c2..7f368b4 100644 (file)
@@ -5,7 +5,7 @@
 #include "at_cmd_api.h"
 #include "pm_control.h"
 #include "MMC5603.h"
-#include "Customer.h"
+#include "mmc_customer.h"
 #include "mag_service.h"
 
 #define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
index 7f3aa4f..50a23ea 100644 (file)
@@ -8,12 +8,15 @@
  \r
 #include "MemsicAlgo.h"\r
 #include "MemsicCompass.h"\r
-#include "Customer.h"\r
+#include "mmc_customer.h"\r
 #include "MMC5603.h" \r
 \r
 #ifdef ACC_LIS2DOC\r
 #include "acc_service.h"\r
 #endif\r
+\r
+#include "time.h"\r
+\r
 float magnetic_field_x;\r
 float magnetic_field_y;\r
 float magnetic_field_z;\r
@@ -111,6 +114,12 @@ extern uint8_t is_xts_test_done(void);
                return 0;\r
 #endif\r
        int i;\r
+       static uint32_t MILLISEC_TO_NANOSEC = 1000000;\r
+    static uint16_t SEC_TO_MILLISEC = 1000;\r
+       struct timespec time;\r
+    clock_gettime(CLOCK_MONOTONIC, &time);\r
+       uint32_t _startTimestamp = (uint32_t ) time.tv_sec * SEC_TO_MILLISEC + time.tv_nsec / MILLISEC_TO_NANOSEC;\r
+       \r
        \r
        /* This variable is used to store the accelerometer and magnetometer raw data.\r
         * please NOTE that the data is going to store here MUST has been transmitted \r
@@ -147,12 +156,19 @@ extern uint8_t is_xts_test_done(void);
        float caliMagPara[4] = {0.0f};  \r
        /* convert the coordinate system */             \r
        acc_coordinate_raw_to_real(A_LAYOUT, acc_raw_data, acc_real_data);                      \r
-       \r
+       MMC_LOG("acc_coordinate_raw_to_real raw(%.02f,%.02f,%.02f) , real(%.02f,%.02f,%.02f)\r\n",\r
+       acc_raw_data[0],acc_raw_data[1],acc_raw_data[2],\r
+       acc_real_data[0],acc_real_data[1],acc_real_data[2]\r
+       );      \r
        /* Get the MMC5603 mag raw data, unit is gauss */\r
        MMC5603_GetData(mag_raw_data);\r
 \r
        /* Convert the coordinate system */             \r
-       mag_coordinate_raw_to_real(M_LAYOUT, mag_raw_data, mag_real_data);                      \r
+       mag_coordinate_raw_to_real(M_LAYOUT, mag_raw_data, mag_real_data);              \r
+       MMC_LOG("mag_coordinate_raw_to_real raw(%.02f,%.02f,%.02f) , real(%.02f,%.02f,%.02f)\r\n",\r
+       mag_raw_data[0],mag_raw_data[1],mag_raw_data[2],\r
+       mag_real_data[0],mag_real_data[1],mag_real_data[2]\r
+       );      \r
 \r
        /* Below functions are algorithm interface. \r
                * input acc, mag data into algorithm\r
@@ -181,21 +197,33 @@ extern uint8_t is_xts_test_done(void);
                        fPitch    = caliOri[1];\r
                        fRoll     = caliOri[2]; \r
                        if(iAccuracy == 3){\r
-                               PRINT("== Mag x %.02F,y %.02F , z %.02F\r\n",\r
+                               MMC_LOG("== Mag x %.02F,y %.02F , z %.02F\r\n",\r
                                calMagX,//高斯X\r
                                calMagY,//高斯Y\r
                                calMagZ//高斯Z\r
                                );\r
-                               PRINT("iAccuracy %d== Acc Azimuth %.02F,Pitch %.02F , Roll %.02F\r\n", \r
+                               MMC_LOG("iAccuracy %d== Acc Azimuth %.02F,Pitch %.02F , Roll %.02F\r\n", \r
                                iAccuracy,//可信度\r
                                fAzimuth, //水平方向角,左转右转\r
                                fPitch,//上下俯仰角\r
                                fRoll//左右翻滚角\r
                                );\r
                        }else{\r
-                               PRINT("iAccuracy %d < 3 skip\r\n", \r
+                               MMC_LOG("--iAccuracy %d < 3 skip\r\n", \r
                                iAccuracy   //可信度\r
                                );\r
+\r
+                               MMC_LOG("--== Mag x %.02F,y %.02F , z %.02F\r\n",\r
+                               calMagX,//高斯X\r
+                               calMagY,//高斯Y\r
+                               calMagZ//高斯Z\r
+                               );\r
+                               MMC_LOG("--iAccuracy %d== Acc Azimuth %.02F,Pitch %.02F , Roll %.02F\r\n", \r
+                               iAccuracy,//可信度\r
+                               fAzimuth, //水平方向角,左转右转\r
+                               fPitch,//上下俯仰角\r
+                               fRoll//左右翻滚角\r
+                               );\r
                        \r
                        }\r
        }\r
@@ -205,7 +233,7 @@ extern uint8_t is_xts_test_done(void);
        if(GetMagSaturation())  \r
        {\r
                //MEMSIC_Magnetic_Sensor_SET(); //Do SET action\r
-               PRINT("Do SET action MMC5603_SET\r\n");\r
+               MMC_LOG("Do SET action MMC5603_SET\r\n");\r
                MMC5603_SET();\r
        }\r
        \r
@@ -222,12 +250,16 @@ extern uint8_t is_xts_test_done(void);
                /* Save the calpara buffer into the system file */\r
                /* This function should be create by customer.If customer can not implement this function, should comment it out */     \r
                SavePara(saveData);                                                             \r
-               PRINT("save para \r\n");        \r
+               MMC_LOG("save para \r\n");      \r
        }\r
 \r
        /* Sampling interval is 20ms. */\r
        // mmc5603_Delay_Ms(20);\r
+\r
+       clock_gettime(CLOCK_MONOTONIC, &time);\r
+       uint32_t _endTimestamp = (uint32_t ) time.tv_sec * SEC_TO_MILLISEC + time.tv_nsec / MILLISEC_TO_NANOSEC;\r
        \r
+       MMC_LOG("mmc5603_check  cost %u\r\n",(_endTimestamp-_startTimestamp));\r
        return 0;\r
 }\r
 \r
@@ -276,7 +308,7 @@ void acc_coordinate_raw_to_real(int layout, float *in, float *out)
 {\r
        switch (layout) {\r
        case 0:\r
-               out[0] =  in[0];\r
+               out[0] =  -in[0];\r
                out[1] =  in[1];\r
                out[2] =  in[2];\r
                break;\r
@@ -354,7 +386,7 @@ void mag_coordinate_raw_to_real(int layout, float *in, float *out)
                break;\r
        case 5:\r
                out[0] = -in[0];\r
-               out[1] =  in[1];\r
+               out[1] = -in[1];\r
                out[2] = -in[2];\r
                break;\r
        case 6:\r
@@ -1,4 +1,4 @@
-#include "Customer.h"\r
+#include "mmc_customer.h"\r
 #include "osal_timer.h"\r
 #include "osal_mutex.h"\r
 #include "pinctrl.h"\r
@@ -4,7 +4,10 @@
 #include <stdio.h>\r
 #include "debug_print.h"\r
 \r
+\r
+#ifndef XTS_SUPPORT\r
 #define MMC_DEBUG\r
+#endif \r
 \r
 #ifdef MMC_DEBUG\r
 #define MMC_LOG(fmt, ...)                    \\r
index dd008ef..0ca7728 100644 (file)
@@ -69,6 +69,7 @@ static bool g_batter_service_initialled = false;
 #include "mmc5603_hal.h"
 #include "mag_service.h"
 
+#include "mmc_customer.h"
 
 /***
  * 其他cmd在Header里定义,对外开放
@@ -78,7 +79,7 @@ static bool g_batter_service_initialled = false;
 osTimerId_t g_mag_service_timer = NULL;
 
 static bool g_bat_timer_is_running = false;
-#define MAG_CHECK_MS 200
+#define MAG_CHECK_MS 20
 static unsigned long g_app_queue;
 
 static bool mag_service_running_stat = false;
@@ -131,7 +132,7 @@ void do_mag_service_check_msg(int cmd)
     ret = osal_msg_queue_write_copy(g_app_queue, (void *)&mail,
                                     sizeof(common_notify_mail_t), 0);
     if (ret != OSAL_SUCCESS) {
-        PRINT("Error mag Check MSG 0x%02X send failed! err=0x%x! \r\n",cmd, ret);
+        MMC_ERROR("Error mag Check MSG 0x%02X send failed! err=0x%x! \r\n",cmd, ret);
     }
     
 }
@@ -153,15 +154,20 @@ static void mag_service_check_task(void const *arg)
         if (mail.comm.app == MAG_SERVICE_CMD_TIMER_CHECK) {
             // mag_service_check_and_enable_charge();
             // mmc5603_check();
-            PRINT("MAG_SERVICE_CMD_TIMER_CHECK\r\n");
+            MMC_LOG("MAG_SERVICE_CMD_TIMER_CHECK\r\n");
         }else if (mail.comm.app == MAG_SERVICE_CMD_START_CHECK){
-            mag_service_running_stat = true;
             mmc5603_start();
+            uapi_tcxo_delay_ms(20);
+            mag_service_running_stat = true;
+            // uapi_pm_add_sleep_veto(PM_ID_SCREEN);
             mag_service_timer_start_check(MAG_CHECK_MS);
         }else if (mail.comm.app == MAG_SERVICE_CMD_STOP_CHECK){
             mag_service_running_stat = false;
             osTimerStop(g_mag_service_timer);
             mmc5603_stop();
+            uapi_tcxo_delay_ms(20);
+
+            // uapi_pm_remove_sleep_veto(PM_ID_SCREEN);
         }
     }
 }
@@ -170,7 +176,7 @@ errcode_t uapi_mag_service_init(void)
 {
     if (osal_msg_queue_create("mag_service_queue", APP_BOARD_MSG_COUNT, &g_app_queue,
                               0, sizeof(common_notify_mail_t)) != ERRCODE_SUCC) {
-        PRINT("[mag][service] app create mail fail\n");
+        MMC_ERROR("[mag][service] app create mail fail\n");
         return ERRCODE_FAIL;
     }
 
@@ -179,12 +185,12 @@ errcode_t uapi_mag_service_init(void)
                                                  "mag_service_service", APP_BOARD_TASK_SIZE);
     if (task_handle == NULL) {
         osal_msg_queue_is_full(g_app_queue);
-        PRINT("create mag service thread fail!\r\n");
+        MMC_ERROR("create mag service thread fail!\r\n");
         return ERRCODE_FAIL;
     }
 
-    // osal_kthread_set_priority(task_handle, APP_BOARD_TASK_PRIO);
-    osal_kthread_set_priority(task_handle, 10);
+    osal_kthread_set_priority(task_handle, APP_BOARD_TASK_PRIO);
+    // osal_kthread_set_priority(task_handle, 10);
 
     g_mag_service_timer = osTimerNew((osTimerFunc_t)mag_service_check_timer_callback, osTimerPeriodic, NULL, NULL);
   
@@ -194,10 +200,10 @@ errcode_t uapi_mag_service_init(void)
 
 // void mag_service_service_resume(void)
 // {
-//     PRINT("mag_service_service resume!\r\n");
+//     MMC_LOG("mag_service_service resume!\r\n");
 //     mag_service_check_timer_callback(0);
 // }
 // void mag_service_service_suspend(void)
 // {
-//     PRINT("mag_service_service suspend!\r\n");
+//     MMC_LOG("mag_service_service suspend!\r\n");
 // }
\ No newline at end of file