Skip to content

Commit e94a32f

Browse files
committed
Update to latest.
1 parent fd7c3f3 commit e94a32f

23 files changed

+345
-127
lines changed

SerialPrograms/Source/CommonFramework/Environment/SystemSleep.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,65 @@ namespace PokemonAutomation{
2424

2525

2626

27+
SystemSleepController::SystemSleepController()
28+
: m_state(SleepSuppress::NONE)
29+
{}
30+
31+
void SystemSleepController::add_listener(Listener& listener){
32+
std::lock_guard<std::mutex> lg(m_lock);
33+
m_listeners.insert(&listener);
34+
}
35+
void SystemSleepController::remove_listener(Listener& listener){
36+
std::lock_guard<std::mutex> lg(m_lock);
37+
m_listeners.erase(&listener);
38+
}
39+
void SystemSleepController::notify_listeners(SleepSuppress state){
40+
for (Listener* listener : m_listeners){
41+
listener->sleep_suppress_state_changed(state);
42+
}
43+
}
44+
45+
SleepSuppress SystemSleepController::current_state() const{
46+
return m_state.load(std::memory_order_relaxed);
47+
}
48+
49+
50+
51+
52+
53+
54+
55+
void SleepSuppressScope::clear(){
56+
switch (m_mode){
57+
case SleepSuppress::NONE:
58+
break;
59+
case SleepSuppress::NO_SLEEP:
60+
SystemSleepController::instance().pop_no_sleep();
61+
break;
62+
case SleepSuppress::SCREEN_ON:
63+
SystemSleepController::instance().pop_screen_on();
64+
break;
65+
}
66+
m_mode = SleepSuppress::NONE;
67+
}
68+
void SleepSuppressScope::operator=(SleepSuppress mode){
69+
clear();
70+
set(mode);
71+
}
72+
void SleepSuppressScope::set(SleepSuppress mode){
73+
switch (mode){
74+
case SleepSuppress::NONE:
75+
break;
76+
case SleepSuppress::NO_SLEEP:
77+
SystemSleepController::instance().push_no_sleep();
78+
break;
79+
case SleepSuppress::SCREEN_ON:
80+
SystemSleepController::instance().push_screen_on();
81+
break;
82+
}
83+
m_mode = mode;
84+
}
85+
2786

2887

2988

SerialPrograms/Source/CommonFramework/Environment/SystemSleep.h

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
#define PokemonAutomation_SystemSleep_H
99

1010
#include <memory>
11-
11+
#include <set>
12+
#include <atomic>
13+
#include <mutex>
14+
#include "Common/Compiler.h"
1215

1316
#if _WIN32
1417
#define PA_ENABLE_SLEEP_SUPPRESS
@@ -22,17 +25,39 @@
2225
namespace PokemonAutomation{
2326

2427

28+
29+
enum class SleepSuppress{
30+
NONE,
31+
NO_SLEEP,
32+
SCREEN_ON,
33+
};
34+
35+
2536
// Call OS API to prevent screen saver from running and OS from going to sleep.
2637
// Useful for running some programs like PokemonSV_VideoFastCodeEntry that require
2738
// the screen to be constantly on.
2839
class SystemSleepController{
40+
public:
41+
struct Listener{
42+
virtual void sleep_suppress_state_changed(SleepSuppress new_state) = 0;
43+
};
44+
void add_listener(Listener& listener);
45+
void remove_listener(Listener& listener);
46+
47+
2948
protected:
3049
virtual ~SystemSleepController() = default;
31-
SystemSleepController() = default;
50+
SystemSleepController();
51+
52+
// Must be called under lock.
53+
void notify_listeners(SleepSuppress state);
54+
3255

3356
public:
3457
static SystemSleepController& instance();
3558

59+
SleepSuppress current_state() const;
60+
3661
// Push: Add a request for this type of sleep-disable.
3762
// Pop: Remove a request for this type of sleep-disable.
3863
// The sleep-disable will be active as long as there is at least one
@@ -45,18 +70,19 @@ class SystemSleepController{
4570
// Allow the screen to turn off, but don't sleep.
4671
virtual void push_no_sleep(){}
4772
virtual void pop_no_sleep(){}
48-
};
49-
5073

5174

75+
protected:
76+
std::atomic<SleepSuppress> m_state;
5277

53-
enum class SleepSuppress{
54-
NONE,
55-
NO_SLEEP,
56-
SCREEN_ON,
78+
std::mutex m_lock;
79+
std::set<Listener*> m_listeners;
5780
};
5881

5982

83+
84+
85+
6086
class SleepSuppressScope{
6187
public:
6288
SleepSuppressScope(SleepSuppress mode){
@@ -68,38 +94,11 @@ class SleepSuppressScope{
6894
SleepSuppressScope(const SleepSuppressScope&) = delete;
6995
void operator=(const SleepSuppressScope&) = delete;
7096

71-
void clear(){
72-
switch (m_mode){
73-
case SleepSuppress::NONE:
74-
break;
75-
case SleepSuppress::NO_SLEEP:
76-
SystemSleepController::instance().pop_no_sleep();
77-
break;
78-
case SleepSuppress::SCREEN_ON:
79-
SystemSleepController::instance().pop_screen_on();
80-
break;
81-
}
82-
m_mode = SleepSuppress::NONE;
83-
}
84-
void operator=(SleepSuppress mode){
85-
clear();
86-
set(mode);
87-
}
97+
void clear();
98+
void operator=(SleepSuppress mode);
8899

89100
private:
90-
void set(SleepSuppress mode){
91-
switch (mode){
92-
case SleepSuppress::NONE:
93-
break;
94-
case SleepSuppress::NO_SLEEP:
95-
SystemSleepController::instance().push_no_sleep();
96-
break;
97-
case SleepSuppress::SCREEN_ON:
98-
SystemSleepController::instance().push_screen_on();
99-
break;
100-
}
101-
m_mode = mode;
102-
}
101+
void set(SleepSuppress mode);
103102

104103
private:
105104
SleepSuppress m_mode;

SerialPrograms/Source/CommonFramework/Environment/SystemSleep_Apple.tpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ private:
5656
IOReturn m_prevention_succeeded = kIOReturnError;
5757
IOPMAssertionID m_session_id = 0;
5858

59-
std::mutex m_lock;
6059
size_t m_screen_on_requests = 0;
6160
size_t m_no_sleep_requests = 0;
6261
};
@@ -113,8 +112,22 @@ bool AppleSleepController::enable_sleep(){
113112
void AppleSleepController::update_state(){
114113
// Must call under lock.
115114

115+
SleepSuppress before_state = m_state.load(std::memory_order_relaxed);
116+
SleepSuppress after_state = SleepSuppress::NONE;
117+
116118
// TODO: Distiguish these two.
117-
prevent_sleep(m_screen_on_requests > 0 || m_no_sleep_requests > 0);
119+
bool enabled = m_screen_on_requests > 0 || m_no_sleep_requests > 0;
120+
prevent_sleep(enabled);
121+
122+
after_state = enabled
123+
? SleepSuppress::SCREEN_ON
124+
: SleepSuppress::NONE,
125+
126+
m_state.store(after_state, std::memory_order_release);
127+
128+
if (before_state != after_state){
129+
notify_listeners(after_state);
130+
}
118131
}
119132

120133

SerialPrograms/Source/CommonFramework/Environment/SystemSleep_Windows.tpp

Lines changed: 62 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
#include <mutex>
8+
#include <condition_variable>
89
#include <Windows.h>
910
#include "Common/Qt/Redispatch.h"
1011
#include "CommonFramework/Logging/Logger.h"
@@ -16,64 +17,100 @@ namespace PokemonAutomation{
1617
class WindowsSleepController : public SystemSleepController{
1718
public:
1819
virtual ~WindowsSleepController(){
19-
std::lock_guard<std::mutex> lg(m_lock);
20-
m_screen_on_requests = 0;
21-
m_no_sleep_requests = 0;
22-
update_state();
20+
{
21+
std::lock_guard<std::mutex> lg(m_lock);
22+
m_stopping = true;
23+
m_cv.notify_all();
24+
}
25+
m_thread.join();
26+
if (m_state.load(std::memory_order_relaxed) != SleepSuppress::NONE){
27+
global_logger_tagged().log("Destroying WindowsSleepController with active requests...", COLOR_RED);
28+
}
2329
}
30+
WindowsSleepController()
31+
: m_screen_on_requests(0)
32+
, m_no_sleep_requests(0)
33+
, m_stopping(false)
34+
, m_thread(&WindowsSleepController::thread_loop, this)
35+
{}
36+
2437
virtual void push_screen_on() override{
2538
std::lock_guard<std::mutex> lg(m_lock);
2639
m_screen_on_requests++;
27-
update_state();
40+
m_cv.notify_all();
2841
}
2942
virtual void pop_screen_on() override{
3043
std::lock_guard<std::mutex> lg(m_lock);
3144
m_screen_on_requests--;
32-
update_state();
45+
m_cv.notify_all();
3346
}
3447
virtual void push_no_sleep() override{
3548
std::lock_guard<std::mutex> lg(m_lock);
3649
m_no_sleep_requests++;
37-
update_state();
50+
m_cv.notify_all();
3851
}
3952
virtual void pop_no_sleep() override{
4053
std::lock_guard<std::mutex> lg(m_lock);
4154
m_no_sleep_requests--;
42-
update_state();
55+
m_cv.notify_all();
4356
}
4457

4558
private:
46-
void update_state(){
59+
void thread_loop(){
4760
// SetThreadExecutionState(ES_CONTINUOUS) only lasts as long as the
48-
// thread is alive. So we redispatch to the main thread.
49-
queue_on_main_thread([
50-
screen_on_requests = m_screen_on_requests,
51-
no_sleep_requests = m_no_sleep_requests
52-
]{
53-
EXECUTION_STATE flags = ES_CONTINUOUS;
54-
if (screen_on_requests > 0){
55-
flags |= ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED;
61+
// thread is alive. So we use our own thread.
62+
while (true){
63+
std::unique_lock<std::mutex> lg(m_lock);
64+
if (m_stopping){
65+
return;
5666
}
57-
if (no_sleep_requests > 0){
67+
68+
SleepSuppress before_state = m_state.load(std::memory_order_relaxed);
69+
SleepSuppress after_state = SleepSuppress::NONE;
70+
71+
EXECUTION_STATE flags = ES_CONTINUOUS;
72+
if (m_no_sleep_requests > 0){
5873
flags |= ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED;
74+
after_state = SleepSuppress::NO_SLEEP;
75+
}
76+
if (m_screen_on_requests > 0){
77+
flags |= ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED;
78+
after_state = SleepSuppress::SCREEN_ON;
5979
}
6080
EXECUTION_STATE ret = SetThreadExecutionState(flags);
6181
if (ret == 0){
6282
global_logger_tagged().log("Unable to set system sleep state.", COLOR_RED);
63-
}else if (screen_on_requests > 0){
64-
global_logger_tagged().log("Setting sleep state to: Screen On", COLOR_BLUE);
65-
}else if (no_sleep_requests > 0){
66-
global_logger_tagged().log("Setting sleep state to: No Sleep", COLOR_BLUE);
6783
}else{
68-
global_logger_tagged().log("Setting sleep state to: None", COLOR_BLUE);
84+
switch (after_state){
85+
case SleepSuppress::NONE:
86+
global_logger_tagged().log("Setting sleep state to: None", COLOR_BLUE);
87+
break;
88+
case SleepSuppress::NO_SLEEP:
89+
global_logger_tagged().log("Setting sleep state to: No Sleep", COLOR_BLUE);
90+
break;
91+
case SleepSuppress::SCREEN_ON:
92+
global_logger_tagged().log("Setting sleep state to: Screen On", COLOR_BLUE);
93+
break;
94+
}
95+
96+
m_state.store(after_state, std::memory_order_release);
97+
98+
if (before_state != after_state){
99+
notify_listeners(after_state);
100+
}
69101
}
70-
});
102+
103+
m_cv.wait(lg);
104+
}
71105
}
72106

73107
private:
74-
std::mutex m_lock;
75108
size_t m_screen_on_requests = 0;
76109
size_t m_no_sleep_requests = 0;
110+
111+
bool m_stopping;
112+
std::condition_variable m_cv;
113+
std::thread m_thread;
77114
};
78115

79116

SerialPrograms/Source/CommonFramework/ErrorReports/ErrorReports.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ SendableErrorReport::SendableErrorReport(
122122
std::cout << "Compiling Error Report..." << std::endl;
123123
}
124124
m_program_id = info.program_id;
125-
m_program_runtime_millis = std::chrono::duration_cast<Milliseconds>(current_time() - info.start_time).count();
125+
if (info.start_time != WallClock::min()){
126+
m_program_runtime_millis = std::chrono::duration_cast<Milliseconds>(current_time() - info.start_time).count();
127+
}
126128
m_title = std::move(title);
127129
m_messages = std::move(messages);
128130
m_image = image;

SerialPrograms/Source/CommonFramework/ErrorReports/ErrorReports.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class SendableErrorReport{
8787
std::string m_processor;
8888
std::string m_program;
8989
std::string m_program_id;
90-
uint64_t m_program_runtime_millis;
90+
uint64_t m_program_runtime_millis = 0;
9191
std::string m_title;
9292
std::vector<std::pair<std::string, std::string>> m_messages;
9393
ImageRGB32 m_image_owner;

SerialPrograms/Source/CommonFramework/Globals.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace PokemonAutomation{
2525
const bool IS_BETA_VERSION = false;
2626
const int PROGRAM_VERSION_MAJOR = 0;
2727
const int PROGRAM_VERSION_MINOR = 50;
28-
const int PROGRAM_VERSION_PATCH = 15;
28+
const int PROGRAM_VERSION_PATCH = 16;
2929

3030
const std::string PROGRAM_VERSION_BASE =
3131
"v" + std::to_string(PROGRAM_VERSION_MAJOR) +

SerialPrograms/Source/CommonFramework/Inference/FrozenImageDetector.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ bool FrozenImageDetector::process_frame(const VideoSnapshot& frame){
4242
return false;
4343
}
4444

45-
double rmsd = ImageMatch::pixel_RMSD(m_previous, frame);
45+
double rmsd = ImageMatch::pixel_RMSD(
46+
extract_box_reference(m_previous, m_box),
47+
extract_box_reference(frame, m_box)
48+
);
4649
// cout << "rmsd = " << rmsd << endl;
4750
if (rmsd > m_rmsd_threshold){
4851
m_previous = frame;

0 commit comments

Comments
 (0)