Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion device/src/device_state.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ void handleStateTransition(connection_target_t remote, connection_id_t connectio
#if DEVICE_HAS_OLED
Widget_Refresh(&TargetWidget);
#endif
EventScheduler_Reschedule(Timer_GetCurrentTime() + POWER_MODE_UPDATE_DELAY, EventSchedulerEvent_PowerMode, "update sleep mode from device state");
EventScheduler_Reschedule(Timer_GetCurrentTime() + POWER_MODE_UPDATE_DELAY, EventSchedulerEvent_PowerModeUpdate, "update sleep mode from device state");
break;
default:
break;
Expand Down
2 changes: 1 addition & 1 deletion right/src/event_scheduler.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ static void processEvt(event_scheduler_event_t evt)
case EventSchedulerEvent_UpdateMergeSensor:
MergeSensor_Update();
break;
case EventSchedulerEvent_PowerMode:
case EventSchedulerEvent_PowerModeUpdate:
PowerMode_Update();
break;
case EventSchedulerEvent_PowerModeRestart:
Expand Down
2 changes: 1 addition & 1 deletion right/src/event_scheduler.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
EventSchedulerEvent_MouseController,
EventSchedulerEvent_ReenableUart,
EventSchedulerEvent_UpdateMergeSensor,
EventSchedulerEvent_PowerMode,
EventSchedulerEvent_PowerModeUpdate,
EventSchedulerEvent_PowerModeRestart,
EventSchedulerEvent_EndBtPairing,
EventSchedulerEvent_RestartBt,
Expand Down
27 changes: 21 additions & 6 deletions right/src/power_mode.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "power_mode.h"
#include "timer.h"
#include "usb_composite_device.h"
#include "event_scheduler.h"
#include "led_manager.h"
Expand Down Expand Up @@ -59,14 +60,18 @@ power_mode_config_t PowerModeConfig[PowerMode_Count] = {

ATTR_UNUSED static bool usbAwake = false;

static uint32_t lastWakeEvent = 0;

volatile power_mode_t CurrentPowerMode = PowerMode_Awake;

#define LIGHT_SLEEP_NOHOST_WAKEUP_LENGTH 10000

// originally written for Benedek's power callback
// TODO: remove this and simplify the rest of the code if the callback is not used.
void PowerMode_SetUsbAwake(bool awake) {
#if DEVICE_IS_UHK80_RIGHT
usbAwake = awake;
EventScheduler_Reschedule(Timer_GetCurrentTime() + POWER_MODE_UPDATE_DELAY, EventSchedulerEvent_PowerMode, "update sleep mode from power callback");
EventScheduler_Reschedule(Timer_GetCurrentTime() + POWER_MODE_UPDATE_DELAY, EventSchedulerEvent_PowerModeUpdate, "update sleep mode from power callback");
#endif
}

Expand All @@ -85,12 +90,19 @@ void PowerMode_Update() {

power_mode_t newPowerMode = someoneAwake ? PowerMode_Awake : PowerMode_LightSleep;

if (newPowerMode == someoneAwake) {
newPowerMode = RunningOnBattery ? PowerMode_Powersaving : PowerMode_Awake;
}

if (CurrentPowerMode <= PowerMode_LightSleep) {
PowerMode_ActivateMode(newPowerMode, false, false, "power mode update");
if (newPowerMode <= PowerMode_Powersaving) {
PowerMode_ActivateMode(newPowerMode, false, false, "power mode update");
return;
}

if (newPowerMode == PowerMode_LightSleep && CurrentPowerMode < PowerMode_LightSleep) {
if (Timer_GetCurrentTime() - lastWakeEvent >= LIGHT_SLEEP_NOHOST_WAKEUP_LENGTH) {
PowerMode_ActivateMode(newPowerMode, false, false, "power mode update");
} else {
EventScheduler_Schedule(lastWakeEvent + LIGHT_SLEEP_NOHOST_WAKEUP_LENGTH, EventSchedulerEvent_PowerModeUpdate, "no host short wakeup");
}
}
}
}

Expand Down Expand Up @@ -125,8 +137,11 @@ static void shutDown(power_mode_t mode) {
}

static void wake() {
lastWakeEvent = Timer_GetCurrentTime();
EventScheduler_Schedule(lastWakeEvent + LIGHT_SLEEP_NOHOST_WAKEUP_LENGTH, EventSchedulerEvent_PowerModeUpdate, "waked - check for short wake condition");
CurrentPowerMode = PowerMode_Awake;
notifyEveryone();

}

void PowerMode_ActivateMode(power_mode_t mode, bool toggle, bool force, const char* reason) {
Expand Down
1 change: 1 addition & 0 deletions right/src/usb_report_updater.c
Original file line number Diff line number Diff line change
Expand Up @@ -682,6 +682,7 @@ static void updateActionStates() {
if (CurrentPowerMode > PowerMode_LastAwake && CurrentPowerMode <= PowerMode_LightSleep) {
Trace_Printf("y1.%d", CurrentPowerMode);
PowerMode_WakeHost();
PowerMode_ActivateMode(PowerMode_Awake, false, true, "key action wakeup");
Trace_Printc("y4");
}

Expand Down