11#include <QtCore/QDateTime>
12#include <QtCore/QFileInfo>
13#include <QtCore/QString>
22 (void) connect(&_timer, &QTimer::timeout,
this, &SubtitleWriter::_captureTelemetry);
39 for (
int colIndex = 0; colIndex < grid->
columns()->
count(); colIndex++) {
41 for (
int rowIndex = 0; rowIndex < list->
count(); rowIndex++) {
44 _facts += value->
fact();
51 _lastEndTime = QTime(0, 0);
53 const QFileInfo videoFileInfo(videoFile);
54 const QString subtitleFilePath = QStringLiteral(
"%1/%2.ass").arg(videoFileInfo.path(), videoFileInfo.completeBaseName());
55 qCDebug(SubtitleWriterLog) <<
"Writing overlay to file:" << subtitleFilePath;
56 _file.setFileName(subtitleFilePath);
58 if (!_file.open(QIODevice::ReadWrite)) {
59 qCWarning(SubtitleWriterLog) <<
"Unable to write subtitle data to file";
63 QTextStream stream(&_file);
66 static constexpr int baseWidth = 640;
67 static constexpr int baseFontSize = 12;
68 const int scaledFontSize = (_size.width() * baseFontSize) / baseWidth;
71 stream << QStringLiteral(
73 "Title: QGroundControl Subtitle Telemetry file\n"
74 "ScriptType: v4.00+\n"
76 "ScaledBorderAndShadow: yes\n"
77 "YCbCr Matrix: TV.601\n"
82 "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n"
83 "Style: Default,Monospace,%3,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,1,10,10,10,1\n"
86 "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n"
87 ).arg(_size.width()).arg(_size.height()).arg(scaledFontSize);
92 _timer.start(1000 / _kSampleRate);
97 qCDebug(SubtitleWriterLog) <<
"Stopping writing";
102void SubtitleWriter::_captureTelemetry()
105 qCWarning(SubtitleWriterLog) <<
"Attempting to capture fact data with no active vehicle!";
110 QStringList namesStrings;
111 QStringList valuesStrings;
114 for (
const Fact *fact : std::as_const(_facts)) {
115 valuesStrings << QStringLiteral(
"%2 %3").arg(fact->cookedValueString(), fact->cookedUnits());
116 namesStrings << QStringLiteral(
"%1:").arg(fact->shortDescription());
120 const QTime start = _lastEndTime;
123 const QTime end = start.addMSecs(1000 / _kSampleRate);
128 static constexpr int offsetFactor = 100;
129 static constexpr float nRows = 3;
130 static const int rowWidth = (_size.width() + offsetFactor) / (nRows + 1);
131 const int nValuesByRow = ceil(_facts.length() / nRows);
133 QStringList stringColumns;
137 static const QString namesLine = QStringLiteral(
"Dialogue: 0,%3,%4,Default,,0,0,0,,{\\an3\\pos(%1,%2)}%5\n");
138 static const QString valuesLine = QStringLiteral(
"Dialogue: 0,%3,%4,Default,,0,0,0,,{\\pos(%1,%2)}%5\n");
141 for (
int i = 0; i < nRows; i++) {
142 const QStringList currentColumnNameStrings = namesStrings.mid(i * nValuesByRow, nValuesByRow);
143 const QStringList currentColumnValueStrings = valuesStrings.mid(i * nValuesByRow, nValuesByRow);
146 const QString names = namesLine.arg(QString::number((-offsetFactor / 2) + (rowWidth * (i + 1)) - 10),
147 QString::number(_size.height() - 30),
148 start.toString(
"H:mm:ss.zzz").chopped(2),
149 end.toString(
"H:mm:ss.zzz").chopped(2),
150 currentColumnNameStrings.join(
"\\N"));
151 stringColumns << names;
154 const QString values = valuesLine.arg(QString::number((-offsetFactor / 2) + (rowWidth * (i + 1))),
155 QString::number(_size.height() - 30),
156 start.toString(
"H:mm:ss.zzz").chopped(2),
157 end.toString(
"H:mm:ss.zzz").chopped(2),
158 currentColumnValueStrings.join(
"\\N"));
159 stringColumns << values;
163 stringColumns << QStringLiteral(
"Dialogue: 0,%1,%2,Default,,0,0,0,,{\\pos(10,35)}%3\n").arg(
164 start.toString(
"H:mm:ss.zzz").chopped(2),
165 end.toString(
"H:mm:ss.zzz").chopped(2),
166 QDateTime::currentDateTime().toString(QLocale::system().dateFormat(QLocale::ShortFormat)));
168 QTextStream stream(&_file);
169 for (
const QString &col : std::as_const(stringColumns)) {
#define QGC_LOGGING_CATEGORY(name, categoryStr)
QmlObjectListModel * columns(void) const
void componentComplete(void) final
A Fact is used to hold a single value within the system.
static const QString telemetryBarSettingsGroup
static MultiVehicleManager * instance()
int count() const override final
void stopCapturingTelemetry()
void startCapturingTelemetry(const QString &videoFile, QSize size)