Skip to content

Commit 3913469

Browse files
committed
More work on stream history. Add support for video in error reports.
1 parent 177e8cc commit 3913469

26 files changed

+331
-160
lines changed

Common/Cpp/Exceptions.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ namespace PokemonAutomation{
1111

1212

1313

14+
void Exception::log(Logger& logger) const{
15+
logger.log(std::string(name()) + ": " + message(), COLOR_RED);
16+
}
1417
std::string Exception::message() const{
1518
return "";
1619
}

Common/Cpp/Exceptions.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,21 @@
77
#ifndef PokemonAutomation_Exceptions_H
88
#define PokemonAutomation_Exceptions_H
99

10+
#include <utility>
1011
#include "Common/Compiler.h"
1112
#include "AbstractLogger.h"
1213

1314
namespace PokemonAutomation{
1415

1516

17+
template <typename ExceptionType, class... Args>
18+
[[noreturn]] void throw_and_log(Logger& logger, Args&&... args){
19+
ExceptionType exception(std::forward<Args>(args)...);
20+
exception.log(logger);
21+
throw exception;
22+
}
23+
24+
1625
// Definitions:
1726
// Catch: To catch the exception using a try-catch.
1827
// Consume: To catch the exception and not rethrow it.
@@ -22,6 +31,8 @@ namespace PokemonAutomation{
2231
class Exception{
2332
public:
2433
virtual ~Exception() = default;
34+
35+
virtual void log(Logger& logger) const;
2536
virtual const char* name() const = 0;
2637
virtual std::string message() const;
2738
virtual std::string to_str() const;

SerialPrograms/Source/CommonFramework/AudioPipeline/Backends/AudioPassthroughPairQt.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,12 @@ class AudioPassthroughPairQt::SampleListener final : public AudioFloatStreamList
5757
if (parent.m_writer){
5858
parent.m_writer->operator AudioFloatStreamListener&().on_samples(data, frames);
5959
}
60-
for (AudioFloatStreamListener* listener : m_parent.m_stream_listeners){
61-
listener->on_samples(data, frames);
62-
}
6360
if (parent.m_fft_runner){
6461
parent.m_fft_runner->on_samples(data, frames);
6562
}
66-
63+
for (AudioFloatStreamListener* listener : m_parent.m_stream_listeners){
64+
listener->on_samples(data, frames);
65+
}
6766
}
6867

6968
private:

SerialPrograms/Source/CommonFramework/ErrorReports/ErrorReports.cpp

Lines changed: 66 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "CommonFramework/Logging/Logger.h"
1616
#include "CommonFramework/Notifications/ProgramNotifications.h"
1717
#include "CommonFramework/Options/Environment/ThemeSelectorOption.h"
18+
#include "CommonFramework/Tools/ConsoleHandle.h"
1819
#include "ProgramDumper.h"
1920
#include "ErrorReports.h"
2021

@@ -55,6 +56,11 @@ ErrorReportOption::ErrorReportOption()
5556
LockMode::UNLOCK_WHILE_RUNNING,
5657
true
5758
)
59+
, VIDEO(
60+
"<b>Include Video:</b><br>Include a video leading up to the error. (if possible)",
61+
LockMode::UNLOCK_WHILE_RUNNING,
62+
true
63+
)
5864
, LOGS(
5965
"<b>Include Logs:</b><br>Include the recent log leading up to the error.",
6066
LockMode::UNLOCK_WHILE_RUNNING,
@@ -65,20 +71,23 @@ ErrorReportOption::ErrorReportOption()
6571
LockMode::UNLOCK_WHILE_RUNNING,
6672
true
6773
)
68-
#if 0
6974
, FILES(
7075
"<b>Include Other Files:</b><br>Include other files that may be helpful for the developers.",
7176
LockMode::UNLOCK_WHILE_RUNNING,
7277
true
7378
)
74-
#endif
7579
{
7680
PA_ADD_STATIC(DESCRIPTION);
7781
PA_ADD_OPTION(SEND_MODE);
7882
PA_ADD_OPTION(SCREENSHOT);
83+
if (PreloadSettings::instance().DEVELOPER_MODE){
84+
PA_ADD_OPTION(VIDEO);
85+
}
7986
PA_ADD_OPTION(LOGS);
8087
PA_ADD_OPTION(DUMPS);
81-
// PA_ADD_OPTION(FILES);
88+
if (PreloadSettings::instance().DEVELOPER_MODE){
89+
PA_ADD_OPTION(FILES);
90+
}
8291
}
8392

8493

@@ -97,7 +106,8 @@ SendableErrorReport::SendableErrorReport(
97106
const ProgramInfo& info,
98107
std::string title,
99108
std::vector<std::pair<std::string, std::string>> messages,
100-
const ImageViewRGB32& image
109+
const ImageViewRGB32& image,
110+
ConsoleHandle* console
101111
)
102112
: SendableErrorReport()
103113
{
@@ -126,10 +136,15 @@ SendableErrorReport::SendableErrorReport(
126136
}
127137
file.write(log.c_str());
128138
file.flush();
129-
m_files.emplace_back(ERROR_LOGS_NAME);
139+
m_logs_name = ERROR_LOGS_NAME;
140+
}
141+
if (console){
142+
if (console->save_stream_history(m_directory + "Video.mp4")){
143+
m_video_name = "Video.mp4";
144+
}
130145
}
131146
if (program_dump(logger, m_directory + ERROR_DUMP_NAME)){
132-
m_files.emplace_back(ERROR_DUMP_NAME);
147+
m_dump_name = ERROR_DUMP_NAME;
133148
}
134149
}
135150

@@ -140,11 +155,6 @@ SendableErrorReport::SendableErrorReport(std::string directory)
140155
m_directory += '/';
141156
}
142157

143-
try{
144-
m_image_owner = ImageRGB32(m_directory + "Image.png");
145-
m_image = m_image_owner;
146-
}catch (FileException&){}
147-
148158
JsonValue json = load_json_file(m_directory + "Report.json");
149159
const JsonObject& obj = json.to_object_throw();
150160
m_timestamp = obj.get_string_throw("Timestamp");
@@ -165,6 +175,33 @@ SendableErrorReport::SendableErrorReport(std::string directory)
165175
);
166176
}
167177
}
178+
{
179+
const std::string* image_name = obj.get_string("Screenshot");
180+
if (image_name){
181+
try{
182+
m_image_owner = ImageRGB32(*image_name);
183+
m_image = m_image_owner;
184+
}catch (FileException&){}
185+
}
186+
}
187+
{
188+
const std::string* video_name = obj.get_string("Video");
189+
if (video_name){
190+
m_video_name = *video_name;
191+
}
192+
}
193+
{
194+
const std::string* dump_name = obj.get_string("Dump");
195+
if (dump_name){
196+
m_dump_name = *dump_name;
197+
}
198+
}
199+
{
200+
const std::string* logs_name = obj.get_string("Logs");
201+
if (logs_name){
202+
m_logs_name = *logs_name;
203+
}
204+
}
168205
{
169206
const JsonArray& files = obj.get_array_throw("Files");
170207
for (const JsonValue& file : files){
@@ -200,8 +237,21 @@ void SendableErrorReport::save(Logger* logger) const{
200237
}
201238
report["Messages"] = std::move(messages);
202239
}
203-
204-
m_image.save(m_directory + "Image.png");
240+
if (m_image){
241+
std::string image_name = m_directory + "Screenshot.png";
242+
if (m_image.save(image_name)){
243+
report["Screenshot"] = std::move(image_name);
244+
}
245+
}
246+
if (!m_video_name.empty()){
247+
report["Video"] = m_video_name;
248+
}
249+
if (!m_dump_name.empty()){
250+
report["Dump"] = m_dump_name;
251+
}
252+
if (!m_logs_name.empty()){
253+
report["Logs"] = m_logs_name;
254+
}
205255

206256
JsonArray array;
207257
for (const std::string& file : m_files){
@@ -314,6 +364,7 @@ void report_error(
314364
std::string title,
315365
std::vector<std::pair<std::string, std::string>> messages,
316366
const ImageViewRGB32& image,
367+
ConsoleHandle* console,
317368
const std::vector<std::string>& files
318369
){
319370
if (logger == nullptr){
@@ -326,7 +377,8 @@ void report_error(
326377
info,
327378
std::move(title),
328379
std::move(messages),
329-
image
380+
image,
381+
console
330382
);
331383

332384
std::vector<std::string> full_file_paths;

SerialPrograms/Source/CommonFramework/ErrorReports/ErrorReports.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,16 @@
1919
namespace PokemonAutomation{
2020

2121

22+
class ConsoleHandle;
23+
24+
2225
extern const std::string& ERROR_LOGS_NAME;
2326
extern const std::string& ERROR_DUMP_NAME;
2427
extern const std::string& ERROR_PATH_UNSENT;
2528
extern const std::string& ERROR_PATH_SENT;
2629

2730

31+
2832
enum class ErrorReportSendMode{
2933
SEND_AUTOMATICALLY,
3034
PROMPT_WHEN_CONVENIENT,
@@ -40,9 +44,10 @@ class ErrorReportOption : public GroupOption{
4044
EnumDropdownOption<ErrorReportSendMode> SEND_MODE;
4145

4246
BooleanCheckBoxOption SCREENSHOT;
47+
BooleanCheckBoxOption VIDEO;
4348
BooleanCheckBoxOption LOGS;
4449
BooleanCheckBoxOption DUMPS;
45-
// BooleanCheckBoxOption FILES;
50+
BooleanCheckBoxOption FILES;
4651
};
4752

4853

@@ -57,7 +62,8 @@ class SendableErrorReport{
5762
const ProgramInfo& info = ProgramInfo(),
5863
std::string title = "",
5964
std::vector<std::pair<std::string, std::string>> messages = {},
60-
const ImageViewRGB32& image = ImageViewRGB32()
65+
const ImageViewRGB32& image = ImageViewRGB32(),
66+
ConsoleHandle* console = nullptr
6167
);
6268

6369
// Deserialize from existing report.
@@ -85,6 +91,9 @@ class SendableErrorReport{
8591
std::vector<std::pair<std::string, std::string>> m_messages;
8692
ImageRGB32 m_image_owner;
8793
ImageViewRGB32 m_image;
94+
std::string m_logs_name;
95+
std::string m_video_name;
96+
std::string m_dump_name;
8897
std::vector<std::string> m_files;
8998
};
9099

@@ -99,6 +108,7 @@ void report_error(
99108
std::string title = "",
100109
std::vector<std::pair<std::string, std::string>> messages = {},
101110
const ImageViewRGB32& image = ImageViewRGB32(),
111+
ConsoleHandle* console = nullptr,
102112
const std::vector<std::string>& files = {}
103113
);
104114

SerialPrograms/Source/CommonFramework/Exceptions/FatalProgramException.cpp

Lines changed: 5 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,71 +4,20 @@
44
*
55
*/
66

7-
#include "CommonFramework/ImageTypes/ImageRGB32.h"
8-
#include "CommonFramework/Notifications/ProgramNotifications.h"
9-
#include "CommonFramework/ErrorReports/ErrorReports.h"
10-
//#include "CommonFramework/Tools/ErrorDumper.h"
11-
#include "CommonFramework/Tools/ProgramEnvironment.h"
12-
#include "CommonFramework/Tools/ConsoleHandle.h"
137
#include "FatalProgramException.h"
148

159
namespace PokemonAutomation{
1610

1711

1812
FatalProgramException::FatalProgramException(ScreenshotException&& e)
19-
: ScreenshotException(e.m_send_error_report, std::move(e.m_message), std::move(e.m_screenshot))
13+
: ScreenshotException(
14+
e.m_send_error_report,
15+
std::move(e.m_message),
16+
std::move(e.m_screenshot)
17+
)
2018
{}
21-
FatalProgramException::FatalProgramException(ErrorReport error_report, Logger& logger, std::string message)
22-
: ScreenshotException(error_report, std::move(message))
23-
{
24-
logger.log(std::string(FatalProgramException::name()) + ": " + m_message, COLOR_RED);
25-
}
26-
FatalProgramException::FatalProgramException(ErrorReport error_report, Logger& logger, std::string message, std::shared_ptr<const ImageRGB32> screenshot)
27-
: ScreenshotException(error_report, std::move(message), std::move(screenshot))
28-
{
29-
logger.log(std::string(FatalProgramException::name()) + ": " + m_message, COLOR_RED);
30-
}
31-
FatalProgramException::FatalProgramException(ErrorReport error_report, ConsoleHandle& console, std::string message, bool take_screenshot)
32-
: ScreenshotException(error_report, console, std::move(message), take_screenshot)
33-
{
34-
console.log(std::string(FatalProgramException::name()) + ": " + m_message, COLOR_RED);
35-
}
3619

3720

38-
void FatalProgramException::send_notification(ProgramEnvironment& env, EventNotificationOption& notification) const{
39-
std::vector<std::pair<std::string, std::string>> embeds;
40-
if (!m_message.empty()){
41-
embeds.emplace_back(std::pair<std::string, std::string>("Message:", m_message));
42-
}
43-
if (m_send_error_report == ErrorReport::SEND_ERROR_REPORT){
44-
report_error(
45-
&env.logger(),
46-
env.program_info(),
47-
name(),
48-
embeds,
49-
screenshot()
50-
);
51-
#if 0
52-
std::string label = name();
53-
std::string filename = dump_image_alone(env.logger(), env.program_info(), label, *m_screenshot);
54-
send_program_telemetry(
55-
env.logger(), true, COLOR_RED,
56-
env.program_info(),
57-
label,
58-
embeds,
59-
filename
60-
);
61-
#endif
62-
}
63-
send_program_notification(
64-
env, notification,
65-
COLOR_RED,
66-
"Program Error",
67-
std::move(embeds), "",
68-
screenshot()
69-
);
70-
}
71-
7221

7322

7423

SerialPrograms/Source/CommonFramework/Exceptions/FatalProgramException.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#ifndef PokemonAutomation_FatalProgramException_H
88
#define PokemonAutomation_FatalProgramException_H
99

10-
#include <memory>
1110
#include "ScreenshotException.h"
1211

1312
namespace PokemonAutomation{
@@ -16,15 +15,10 @@ namespace PokemonAutomation{
1615
// A generic exception that should not be caught outside of infra.
1716
class FatalProgramException : public ScreenshotException{
1817
public:
18+
using ScreenshotException::ScreenshotException;
1919
FatalProgramException(ScreenshotException&& e);
20-
explicit FatalProgramException(ErrorReport error_report, Logger& logger, std::string message);
21-
explicit FatalProgramException(ErrorReport error_report, Logger& logger, std::string message, std::shared_ptr<const ImageRGB32> screenshot);
22-
explicit FatalProgramException(ErrorReport error_report, ConsoleHandle& console, std::string message, bool take_screenshot);
2320

2421
virtual const char* name() const override{ return "FatalProgramException"; }
25-
virtual std::string message() const override{ return m_message; }
26-
27-
virtual void send_notification(ProgramEnvironment& env, EventNotificationOption& notification) const override;
2822
};
2923

3024

0 commit comments

Comments
 (0)