修复timer 问题
authorSnickerSun <snickersun@163.com>
Tue, 23 Jan 2024 06:22:35 +0000 (14:22 +0800)
committerSnickerSun <snickersun@163.com>
Tue, 23 Jan 2024 06:22:35 +0000 (14:22 +0800)
code/sdk/application/battery/service/battery_service.c
code/sdk/drivers/peripheral/mag/mmc5603/mmc5603_main.c
code/sdk/drivers/peripheral/mag/mmc5603/mmc_customer.c
code/sdk/drivers/peripheral/mag/mmc5603/mmc_customer.h
code/sdk/drivers/peripheral/mag/service/mag_service.c

index 7ff854a..4a58f84 100644 (file)
@@ -344,7 +344,8 @@ uint8_t batteryservice_get_pcb_temp(float *temp)
 
 osTimerId_t g_battery_timer = NULL;
 
-static bool g_bat_timer_is_running = false;
+// static bool g_bat_timer_is_running = false;
+#define CHARGE_CHECK_TIMER_CYCLE_MS 1000 
 #define DISABLE_CHARGE_CHECK_MS 1000
 #define ENABLE_CHARGE_TIMEOUT_MS 10000
 bool last_battery_charge_enable_status=true; // true上次刚设置在充电状态,false 上次设置不在充电状态。注意这个是充电IC的充电开关设置,并非真正处于充电状态的标识。
@@ -352,14 +353,14 @@ static unsigned long g_app_queue;
 #define BATTERY_CMD_CHECK_VOLTAGE 0x11
 #define BATTERY_CMD_DISABLE_CHARGE 0x12
 
+static uint8_t g_check_count = 0;
 
 static void battery_check_timer_callback(void* data);
 
 static void battery_timer_start_check_released(uint32_t rtc_ms)
 {
-    if (g_bat_timer_is_running)  osTimerStop(g_battery_timer);
+    if (osTimerIsRunning(g_battery_timer))  osTimerStop(g_battery_timer);
     osTimerStart(g_battery_timer, rtc_ms);
-    g_bat_timer_is_running = true;
 }
 void do_battery_check_msg(int cmd);
 static void battery_check_and_enable_charge(void);
@@ -368,22 +369,7 @@ static void battery_check_and_enable_charge(void);
 static void battery_check_timer_callback(void * data)
 {
     unused(data);
-
-    g_bat_timer_is_running = false;
-    if(last_battery_charge_enable_status == true){
-        do_battery_check_msg(BATTERY_CMD_DISABLE_CHARGE);
-        // disable_charge();
-        // uapi_tcxo_delay_ms(20);
-        battery_timer_start_check_released(DISABLE_CHARGE_CHECK_MS);
-        last_battery_charge_enable_status = false;
-    }else{
-        
-        do_battery_check_msg(BATTERY_CMD_CHECK_VOLTAGE);
-        // battery_check_and_enable_charge();
-        // uapi_tcxo_delay_ms(20);
-        battery_timer_start_check_released(ENABLE_CHARGE_TIMEOUT_MS);
-        last_battery_charge_enable_status = true;
-    }
+    do_battery_check_msg(BATTERY_CMD_CHECK_VOLTAGE);
    
 }
 void uapi_battery_deinit(void)
@@ -391,7 +377,6 @@ void uapi_battery_deinit(void)
     /* Stop the time and clear the pin map */
     osTimerStop(g_battery_timer);
     osTimerDelete(g_battery_timer);
-    g_bat_timer_is_running = false;
     g_battery_timer = NULL;
 }
 
@@ -427,6 +412,8 @@ static void battery_check_task(void const *arg)
     int32_t ret;
     common_notify_mail_t mail;
     uint32_t msgsize = (uint32_t)sizeof(common_notify_mail_t);
+    //开始timer
+    battery_timer_start_check_released(CHARGE_CHECK_TIMER_CYCLE_MS);
 
     while (1) {
         ret = osal_msg_queue_read_copy(g_app_queue, (void *)&mail, &msgsize,
@@ -441,13 +428,34 @@ static void battery_check_task(void const *arg)
                 continue;
         #endif
         // get_charge_stat();
+
         if (mail.comm.app == BATTERY_CMD_CHECK_VOLTAGE) {
-          
-            battery_check_and_enable_charge();
-            uapi_tcxo_delay_ms(20);
-        }else if (mail.comm.app == BATTERY_CMD_DISABLE_CHARGE) {
-            disable_charge();
-            uapi_tcxo_delay_ms(20);
+
+
+            g_check_count++;
+            
+            if(last_battery_charge_enable_status == true){
+            
+                if (g_check_count*CHARGE_CHECK_TIMER_CYCLE_MS  >= ENABLE_CHARGE_TIMEOUT_MS)
+                {
+                    g_check_count = 0 ;
+                    //超时交换状态
+                    disable_charge();
+                    last_battery_charge_enable_status = false;
+                }
+
+                
+
+            }else if (last_battery_charge_enable_status == false) {
+                if (g_check_count*CHARGE_CHECK_TIMER_CYCLE_MS  >= DISABLE_CHARGE_CHECK_MS)
+                {
+                    g_check_count = 0 ;
+                    //超时交换状态
+                    battery_check_and_enable_charge();
+                    last_battery_charge_enable_status = false;
+                }
+                
+            }
         }
     }
 }
@@ -469,11 +477,10 @@ errcode_t uapi_battery_init(void)
         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_battery_timer = osTimerNew((osTimerFunc_t)battery_check_timer_callback, osTimerPeriodic, NULL, NULL);
-    //开始timer
-    battery_timer_start_check_released(DISABLE_CHARGE_CHECK_MS);
+
     return ERRCODE_SUCC;
 }
 
index 50a23ea..ffbb050 100644 (file)
@@ -21,8 +21,8 @@ float magnetic_field_x;
 float magnetic_field_y;\r
 float magnetic_field_z;\r
 \r
-#define A_LAYOUT       0\r
-#define M_LAYOUT       5\r
+#define A_LAYOUT       7\r
+#define M_LAYOUT       0\r
 \r
 /* These variables are used to save the magnetic sensor calibrated data. */    \r
 float calMagX, calMagY, calMagZ;       \r
@@ -141,6 +141,7 @@ extern uint8_t is_xts_test_done(void);
        /* Get the acc raw data, unit is g*/\r
        #ifdef ACC_LIS2DOC\r
                lis2doc_read_data_single(&acc_raw_data[0],&acc_raw_data[1],&acc_raw_data[2]);\r
+               mmc5603_Delay_Ms(5);\r
        #endif\r
        //acc_raw_data[0] = ;           \r
        //acc_raw_data[1] = ;   \r
@@ -308,7 +309,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
index a3cdb76..68c69e9 100644 (file)
@@ -37,7 +37,16 @@ static void mmc5603_i2c_init(void)
     /* init i2c */\r
     if ( g_mmc_installed == 1 )\r
         return ;\r
-\r
+  \r
+    result = i2c_master_init_check(MMC5603_I2C_BUS, 400000, I2C_SPEED_MODE_FS);\r
+    if (result == ERRCODE_I2C_ALREADY_INIT) {\r
+       \r
+        MMC_WARNING("mmc5603 already installed skip :i2c_id = %d  i2c_speed = %d \r\n",\r
+                MMC5603_I2C_BUS, 400000);\r
+        g_mmc_installed = 1;\r
+        return ;\r
+    }\r
+    \r
     result = uapi_i2c_master_init(MMC5603_I2C_BUS, 400000, I2C_SPEED_MODE_FS); /* 400000: 400KHz */\r
     if (result != ERRCODE_SUCC) {\r
         MMC_ERROR("mmc5603 i2c init fail! ret=0x%x", result);\r
@@ -46,9 +55,7 @@ static void mmc5603_i2c_init(void)
 \r
     MMC_WARNING("mmc5603:i2c_id = %d  i2c_speed = %d \r\n",\r
         MMC5603_I2C_BUS, 400000);\r
-\r
     g_mmc_installed = 1;\r
-\r
     return ;\r
 }\r
 \r
index 74a3e9d..a5f8bde 100644 (file)
@@ -6,7 +6,7 @@
 \r
 \r
 #ifndef XTS_SUPPORT\r
-#define MMC_DEBUG\r
+// #define MMC_DEBUG\r
 #endif \r
 \r
 #ifdef MMC_DEBUG\r
index 0ca7728..8a74539 100644 (file)
@@ -102,10 +102,10 @@ static void mag_service_check_timer_callback(void * data)
     g_bat_timer_is_running = false;
 
     if(mag_service_running_stat == true){
-        mmc5603_check(); //此处只能直接加到timer callback中,采用queue的话,新能跟不上,系统资源会挂掉。
+        // mmc5603_check(); //此处只能直接加到timer callback中,采用queue的话,新能跟不上,系统资源会挂掉。
+        do_mag_service_check_msg(MAG_SERVICE_CMD_TIMER_CHECK);
         // mag_service_timer_start_check(MAG_CHECK_MS);
     }
-    // do_mag_service_check_msg(MAG_SERVICE_CMD_TIMER_CHECK);
     // uapi_tcxo_delay_ms(20);
    
      
@@ -153,8 +153,8 @@ 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();
-            MMC_LOG("MAG_SERVICE_CMD_TIMER_CHECK\r\n");
+            // MMC_LOG("MAG_SERVICE_CMD_TIMER_CHECK\r\n");
+            mmc5603_check();
         }else if (mail.comm.app == MAG_SERVICE_CMD_START_CHECK){
             mmc5603_start();
             uapi_tcxo_delay_ms(20);
@@ -182,7 +182,7 @@ errcode_t uapi_mag_service_init(void)
 
 
     osal_task *task_handle = osal_kthread_create((osal_kthread_handler)mag_service_check_task, NULL,
-                                                 "mag_service_service", APP_BOARD_TASK_SIZE);
+                                                 "mag_service_service", APP_BOARD_TASK_SIZE*2);
     if (task_handle == NULL) {
         osal_msg_queue_is_full(g_app_queue);
         MMC_ERROR("create mag service thread fail!\r\n");