Skip to content

Commit

Permalink
Emma service update (txt part) for new Emma Racom client (new CSV sta…
Browse files Browse the repository at this point in the history
…rtlist export - for single race & relays) - for CSV starlist need to use Emma Client from 2023-8 or newer.
  • Loading branch information
arnost00 committed Aug 14, 2023
1 parent 02d017a commit fefc93b
Show file tree
Hide file tree
Showing 5 changed files with 219 additions and 18 deletions.
152 changes: 139 additions & 13 deletions quickevent/app/quickevent/plugins/Event/src/services/emmaclient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,10 @@ void EmmaClient::onExportTimerTimeOut()
if (ss.exportStartTypeTxt())
{
qfInfo() << "EmmaClient startlist creation called";
exportStartListRacomTxt();
if(settings().startExportType() == EmmaClientSettings::StartExportType::CSV)
exportStartListRacomCsv();
else
exportStartListRacomTxt();
}
if (ss.exportFinishTypeTxt())
{
Expand Down Expand Up @@ -406,7 +409,7 @@ void EmmaClient::exportStartListRacomTxt()
int current_stage = getPlugin<EventPlugin>()->currentStageId();
qfs::QueryBuilder qb;
qb.select2("runs", "startTimeMs, siId, competitorId, isrunning, leg")
.select2("competitors","firstName, lastName, registration, club")
.select2("competitors","firstName, lastName, registration")
.select2("classes","name")
.select2("cards", "id, startTime")
.from("runs")
Expand Down Expand Up @@ -496,18 +499,141 @@ void EmmaClient::exportStartListRacomTxt()
if (id != 0) // filter bad data
{
QString s = QString("%1 %2 %3 %4 %5 %6").arg(id_or_bib , 5, 10, QChar(' ')).arg(si, 8, 10, QChar(' ')).arg(class_name).arg(reg).arg(name).arg(tm2);
ts << s;
QString club = q2.value("competitors.club").toString();
if (club.isEmpty()) {
qf::core::sql::Query q;
q.exec(QStringLiteral("SELECT name FROM clubs WHERE abbr='%1'").arg(reg.left(3)), qf::core::Exception::Throw);
if (q.next()) {
club = q.value(0).toString();
ts << " " << club << "\n";
}
ts << s << "\n";
}
}
}

void EmmaClient::exportStartListRacomCsv()
{
EmmaClientSettings ss = settings();
QString export_dir = ss.exportDir();
QFile f(export_dir + '/' + ss.fileNameBase() + ".start.csv");
if(!f.open(QFile::WriteOnly)) {
qfError() << "Canot open file:" << f.fileName() << "for writing.";
return;
}

QTextStream ts(&f);
ts.setGenerateByteOrderMark(true); // BOM
bool is_relays = getPlugin<EventPlugin>()->eventConfig()->isRelays();
int current_stage = getPlugin<EventPlugin>()->currentStageId();
const QString separator(";");

ts << "ID" << separator << "Class" << separator << "SI" << separator
<< "Name" << separator << "Starttime" << separator << "Club" << separator <<"Bib";
if (is_relays)
ts << separator << "Leg";
ts << "\n";

qfs::QueryBuilder qb;
qb.select2("runs", "startTimeMs, siId, competitorId, isrunning, leg")
.select2("competitors","firstName, lastName, registration, club, startNumber")
.select2("classes","name")
.select2("cards", "id, startTime")
.from("runs")
.join("runs.competitorId","competitors.id")
.join("runs.id", "cards.runId")
.where("runs.stageId=" QF_IARG(current_stage));
if(is_relays) {
qb.select2("relays","number");
qb.join("runs.relayId", "relays.id");
qb.join("relays.classId", "classes.id");
qb.orderBy("runs.leg, relays.number ASC");
}
else {
qb.join("competitors.classId","classes.id");
qb.orderBy("runs.id ASC");
}

int start00 = getPlugin<EventPlugin>()->stageStartMsec(current_stage);
qfDebug() << qb.toString();
qfs::Query q2;
q2.execThrow(qb.toString());
int last_id = -1;
QMap <int,int> start_times_relays;
while(q2.next()) {
int id = q2.value("runs.competitorId").toInt();
if (id == last_id)
continue;
bool is_running = (q2.value("runs.isrunning").isNull()) ? false : q2.value("runs.isrunning").toBool();
if (!is_running)
continue;
last_id = id;
int si = q2.value("runs.siId").toInt();
int start_time = q2.value("runs.startTimeMs").toInt();
int bib = q2.value("competitors.startNumber").toInt();
bool start_time_card_null = q2.value("runs.startTimeMs").isNull();
int start_time_card = q2.value("cards.startTime").toInt();
if (start_time_card == 61166 || start_time_card_null)
start_time_card = 0;
QString name = q2.value("competitors.lastName").toString() + " " + q2.value("competitors.firstName").toString();
QString class_name = q2.value("classes.name").toString();
if (class_name.isEmpty())
continue;
int id_or_bib = id;
int leg_no = q2.value("runs.leg").toInt();
if (is_relays) {
// EmmaClient uses for all relays start time of 1st leg
int rel_num = q2.value("relays.number").toInt();
if (rel_num > 0)
bib = rel_num;
if (leg_no == 1 && rel_num > 0) {
start_times_relays.insert(rel_num,start_time);
} else if (rel_num > 0) {
auto it = start_times_relays.find(rel_num);
if (it != start_times_relays.end())
start_time = it.value();
}
id_or_bib = (rel_num > 0) ? rel_num : 10000+id; // when no number, use id with offset
}

int msec = start_time;
if (start_time_card != 0 && !start_time_card_null && !is_relays)
{
// has start in si card (P, T, HDR) & not used in relays
start_time_card *= 1000; // msec
start_time_card -= start00;
msec = start_time_card;
}

int min = (msec / 60000);
int sec = (abs(msec) % 60000 / 1000);
int zzzz = abs(msec) % 1000 * 10;

QString tm2 = QString("%1.%2,%3").arg(min,3,10,QChar('0')).arg(sec,2,10,QChar('0')).arg(zzzz,4,10,QChar('0'));

QString club = q2.value("competitors.club").toString();
QString reg = q2.value("competitors.registration").toString();
if (club.isEmpty() && !reg.isEmpty()) {
qf::core::sql::Query q;
q.exec(QStringLiteral("SELECT name FROM clubs WHERE abbr='%1'").arg(reg.left(3)), qf::core::Exception::Throw);
if (q.next()) {
club = q.value(0).toString();
}
}

if (id != 0){ // filter bad data
// columns are :
// ID, Class, SI, Name, Starttime, Club, Bib, [Leg]
ts << id_or_bib;
ts << separator;
ts << class_name;
ts << separator;
ts << si;
ts << separator;
ts << name;
ts << separator;
ts << tm2;
ts << separator;
ts << club;
ts << separator;
ts << bib;
if (is_relays) {
ts << separator;
ts << leg_no;
}
else
ts << " " << club << "\n";
ts << "\n";
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,20 @@ namespace services {
class EmmaClientSettings : public ServiceSettings
{
using Super = ServiceSettings;

public:
enum StartExportType {
TXT = 0,
CSV
};
private:
QF_VARIANTMAP_FIELD2(bool, e, setE, xportStartListTypeXml3, 0)
QF_VARIANTMAP_FIELD2(bool, e, setE, xportResultTypeXml3, 0)
QF_VARIANTMAP_FIELD(QString, e, setE, xportDir)
QF_VARIANTMAP_FIELD(QString, f, setF, ileNameBase)
QF_VARIANTMAP_FIELD2(int, e, setE, xportIntervalSec, 0)
QF_VARIANTMAP_FIELD2(bool, e, setE, xportStartTypeTxt, 0)
QF_VARIANTMAP_FIELD2(bool, e, setE, xportFinishTypeTxt, 0)
QF_VARIANTMAP_FIELD2(int, s, setS, tartExportType, 0)
public:
EmmaClientSettings(const QVariantMap &o = QVariantMap()) : Super(o) {}
};
Expand All @@ -41,6 +47,7 @@ class EmmaClient : public Service
void exportStartListIofXml3();
void exportFinishRacomTxt();
void exportStartListRacomTxt();
void exportStartListRacomCsv();
bool preExport();
void loadSettings() override;
private:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ EmmaClientWidget::EmmaClientWidget(QWidget *parent)
ui->chExportResultsXml30->setCheckState((ss.exportResultTypeXml3()) ? Qt::Checked : Qt::Unchecked);
if (ui->edFileNameBase->text().isEmpty())
ui->edFileNameBase->setText(getPlugin<EventPlugin>()->eventName());
if (ss.startExportType() == EmmaClientSettings::StartExportType::CSV)
ui->rbRacomStartCsv->setChecked(true);
}

connect(ui->btChooseExportDir, &QPushButton::clicked, this, &EmmaClientWidget::onBtChooseExportDirClicked);
Expand Down Expand Up @@ -99,6 +101,10 @@ bool EmmaClientWidget::saveSettings()
ss.setExportFinishTypeTxt(ui->chExportFinishTxt->isChecked());
ss.setExportStartListTypeXml3(ui->chExportStartListXml30->isChecked());;
ss.setExportResultTypeXml3(ui->chExportResultsXml30->isChecked());;
EmmaClientSettings::StartExportType type = EmmaClientSettings::StartExportType::TXT;
if (ui->rbRacomStartCsv->isChecked())
type = EmmaClientSettings::StartExportType::CSV;
ss.setStartExportType(type);
if (ss.fileNameBase().isEmpty())
ss.setFileNameBase(getPlugin<EventPlugin>()->eventName());

Expand All @@ -125,7 +131,10 @@ void EmmaClientWidget::onBtExportStartListTxtClicked()
EmmaClient *svc = service();
if(svc) {
saveSettings();
svc->exportStartListRacomTxt();
if (svc->settings().startExportType() == EmmaClientSettings::StartExportType::CSV)
svc->exportStartListRacomCsv();
else
svc->exportStartListRacomTxt();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@
<rect>
<x>0</x>
<y>0</y>
<width>528</width>
<height>444</height>
<width>560</width>
<height>520</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>550</width>
<height>0</height>
</size>
</property>
<property name="windowTitle">
<string>Emma Client</string>
</property>
Expand Down Expand Up @@ -184,6 +190,57 @@
</item>
</layout>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Startlist export type</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbRacomStartTxt">
<property name="text">
<string>Text</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbRacomStartCsv">
<property name="text">
<string>CSV</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_5">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Startlist CVS export is only supported by EmmaClient after 2023-08.&lt;br/&gt;Support can be verified in EmmaClient in 'New Racom Connection' dialog,&lt;br/&gt;if it contain checkbox 'Use extended csv file read (2023)'&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::MarkdownText</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
Expand Down Expand Up @@ -211,6 +268,8 @@
<tabstop>chExportResultsXml30</tabstop>
<tabstop>btExportStartListXml30</tabstop>
<tabstop>btExportResultsXml30</tabstop>
<tabstop>rbRacomStartTxt</tabstop>
<tabstop>rbRacomStartCsv</tabstop>
<tabstop>chExportStartListTxt</tabstop>
<tabstop>chExportFinishTxt</tabstop>
<tabstop>btExportSplitsTxt</tabstop>
Expand Down
2 changes: 1 addition & 1 deletion quickevent/app/quickevent/plugins/Oris/src/xmlimporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -814,7 +814,7 @@ bool XmlImporter::importEvent(QXmlStreamReader &reader, const XmlCreators creato
bool XmlImporter::importXML30()
{
qf::qmlwidgets::framework::MainWindow *fwk = qf::qmlwidgets::framework::MainWindow::frameWork();
QString fn = qfd::FileDialog::getOpenFileName(fwk, tr("Open XML Entry file"), QString(), tr("IOF XML v3 files (*.xml)"));
QString fn = qfd::FileDialog::getOpenFileName(fwk, tr("Open IOF XML 3.0 file"), QString(), tr("IOF XML v3 files (*.xml)"));
if(fn.isEmpty())
return false;
QFile file(fn);
Expand Down

0 comments on commit fefc93b

Please sign in to comment.