Просмотр исходного кода

Api Hal OS/Power: split insomnia and return to where it belongs. (#393)

あく 4 лет назад
Родитель
Сommit
81ace53cc1

+ 4 - 1
firmware/targets/api-hal-include/api-hal-power.h

@@ -39,8 +39,11 @@ void api_hal_power_insomnia_enter();
  */
 void api_hal_power_insomnia_exit();
 
+/** Check if sleep availble */
+bool api_hal_power_sleep_available();
+
 /** Check if deep sleep availble */
-bool api_hal_power_deep_available();
+bool api_hal_power_deep_sleep_available();
 
 /** Go to sleep */
 void api_hal_power_sleep();

+ 20 - 7
firmware/targets/f4/api-hal/api-hal-power.c

@@ -12,7 +12,16 @@
 #include <bq27220.h>
 #include <bq25896.h>
 
-volatile uint32_t api_hal_power_insomnia = 1;
+typedef struct {
+    volatile uint32_t insomnia;
+    volatile uint32_t deep_insomnia;
+} ApiHalPower;
+
+static volatile ApiHalPower api_hal_power = {
+    .insomnia = 0,
+    .deep_insomnia = 1,
+};
+
 const ParamCEDV cedv = {
     .full_charge_cap = 2100,
     .design_cap = 2100,
@@ -48,19 +57,23 @@ void api_hal_power_init() {
 }
 
 uint16_t api_hal_power_insomnia_level() {
-    return api_hal_power_insomnia;
+    return api_hal_power.insomnia;
 }
 
 void api_hal_power_insomnia_enter() {
-    api_hal_power_insomnia++;
+    api_hal_power.insomnia++;
 }
 
 void api_hal_power_insomnia_exit() {
-    api_hal_power_insomnia--;
+    api_hal_power.insomnia--;
+}
+
+bool api_hal_power_sleep_available() {
+    return api_hal_power.insomnia == 0;
 }
 
-bool api_hal_power_deep_available() {
-    return api_hal_bt_is_alive() && api_hal_power_insomnia == 0;
+bool api_hal_power_deep_sleep_available() {
+    return api_hal_bt_is_alive() && api_hal_power.deep_insomnia == 0;
 }
 
 void api_hal_power_light_sleep() {
@@ -112,7 +125,7 @@ void api_hal_power_deep_sleep() {
 }
 
 void api_hal_power_sleep() {
-    if(api_hal_power_deep_available()) {
+    if(api_hal_power_deep_sleep_available()) {
         api_hal_power_deep_sleep();
     } else {
         api_hal_power_light_sleep();

+ 5 - 0
firmware/targets/f5/api-hal/api-hal-os.c

@@ -99,6 +99,11 @@ static inline uint32_t api_hal_os_sleep(TickType_t expected_idle_ticks) {
 }
 
 void vPortSuppressTicksAndSleep(TickType_t expected_idle_ticks) {
+    if(!api_hal_power_sleep_available()) {
+        __WFI();
+        return;
+    }
+
     // Limit mount of ticks to maximum that timer can count
     if (expected_idle_ticks > API_HAL_OS_MAX_SLEEP) {
         expected_idle_ticks = API_HAL_OS_MAX_SLEEP;

+ 21 - 8
firmware/targets/f5/api-hal/api-hal-power.c

@@ -13,7 +13,16 @@
 #include <bq27220.h>
 #include <bq25896.h>
 
-volatile uint32_t api_hal_power_insomnia = 1;
+typedef struct {
+    volatile uint32_t insomnia;
+    volatile uint32_t deep_insomnia;
+} ApiHalPower;
+
+static volatile ApiHalPower api_hal_power = {
+    .insomnia = 0,
+    .deep_insomnia = 1,
+};
+
 const ParamCEDV cedv = {
     .full_charge_cap = 2100,
     .design_cap = 2100,
@@ -49,19 +58,23 @@ void api_hal_power_init() {
 }
 
 uint16_t api_hal_power_insomnia_level() {
-    return api_hal_power_insomnia;
+    return api_hal_power.insomnia;
 }
 
 void api_hal_power_insomnia_enter() {
-    api_hal_power_insomnia++;
+    api_hal_power.insomnia++;
 }
 
 void api_hal_power_insomnia_exit() {
-    api_hal_power_insomnia--;
+    api_hal_power.insomnia--;
+}
+
+bool api_hal_power_sleep_available() {
+    return api_hal_power.insomnia == 0;
 }
 
-bool api_hal_power_deep_available() {
-    return api_hal_bt_is_alive() && api_hal_power_insomnia == 0;
+bool api_hal_power_deep_sleep_available() {
+    return api_hal_bt_is_alive() && api_hal_power.deep_insomnia == 0;
 }
 
 void api_hal_power_light_sleep() {
@@ -113,7 +126,7 @@ void api_hal_power_deep_sleep() {
 }
 
 void api_hal_power_sleep() {
-    if(api_hal_power_deep_available()) {
+    if(api_hal_power_deep_sleep_available()) {
         api_hal_power_deep_sleep();
     } else {
         api_hal_power_light_sleep();
@@ -186,7 +199,7 @@ float api_hal_power_get_battery_temperature(ApiHalPowerIC ic) {
 }
 
 float api_hal_power_get_usb_voltage(){
-    return (float)bq25896_get_vbus_voltage() / 1000.0f;;
+    return (float)bq25896_get_vbus_voltage() / 1000.0f;
 }
 
 void api_hal_power_dump_state(string_t buffer) {