Skip to content
Open
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
1 change: 1 addition & 0 deletions libquickevent/libquickeventcore/src/si/checkedcard.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class QUICKEVENTCORE_DECL_EXPORT CheckedCard : public QVariantMap
QF_VARIANTMAP_FIELD(bool, is, set, BadCheck)
QF_VARIANTMAP_FIELD(bool, is, set, MisPunch)
QF_VARIANTMAP_FIELD(QVariantMap, d, setD, ata)
QF_VARIANTMAP_FIELD(QVariantList, m, setM, issingCodes)
public:
CheckedCard(const QVariantMap &data = QVariantMap());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,22 +101,24 @@ quickevent::core::si::CheckedCard CardCheckerClassicCpp::checkCard(const quickev
}
}

QVariantList missing_codes;
int read_punch_check_ix = 0;
for(int j=0; j<course_codes.length(); j++) {
quickevent::core::CodeDef course_code(course_codes[j].toMap());
quickevent::core::si::CheckedPunch checked_punch = quickevent::core::si::CheckedPunch::fromCodeDef(course_code);
//checked_punch.setCode(course_code.value(QStringLiteral("code")).toInt());
int code = course_code.value(QStringLiteral("code")).toInt();
int alt_code = course_code.value(QStringLiteral("altcode")).toInt();
int k;
for(k=read_punch_check_ix; k<read_punches.length(); k++) { //scan card
const quickevent::core::si::ReadPunch &read_punch = read_punches[k];
int code = course_code.value(QStringLiteral("code")).toInt();
int alt_code = course_code.value(QStringLiteral("altcode")).toInt();
qfDebug() << j << k << "looking for:" << checked_punch.code() << "on card:" << read_punch.code() << "vs. code:" << code << "alt:" << alt_code;
//console.info("code:", JSON.stringify(course_code, null, 2));
if(read_punch.code() == code || read_punch.code() == alt_code) {
int read_punch_time_ms = read_punch.time() * 1000;
if(read_punch.msec())
if(read_punch.msec()) {
read_punch_time_ms += read_punch.msec();
}
checked_punch.setStpTimeMs(msecIntervalAM(checked_card.stageStartTimeMs() + checked_card.startTimeMs(), read_punch_time_ms));
qfDebug() << j << "OK";
break;
Expand All @@ -126,15 +128,18 @@ quickevent::core::si::CheckedCard CardCheckerClassicCpp::checkCard(const quickev
// code not found
qfDebug() << j << "NOT FOUND";
bool code_ooo = course_code.value(QStringLiteral("outoforder")).toBool();
if(!code_ooo) // for postgres, Query.values() should return lower case keys
if(!code_ooo) {// for postgres, Query.values() should return lower case keys
error_mis_punch = true;
missing_codes.insert(missing_codes.size(), QVariantList{ j+1, code });
}
}
else {
read_punch_check_ix = k + 1;
}
checked_punches << checked_punch;
}
checked_card.setMisPunch(error_mis_punch);
checked_card.setMissingCodes(missing_codes);

quickevent::core::si::CheckedPunch finish_punch;
if(!finish_code.isEmpty())
Expand All @@ -156,8 +161,9 @@ quickevent::core::si::CheckedCard CardCheckerClassicCpp::checkCard(const quickev
}
{
QVariantList lst;
for(const quickevent::core::si::CheckedPunch &p : checked_punches)
for(const quickevent::core::si::CheckedPunch &p : checked_punches) {
lst << p;
}
checked_card.setPunches(lst);
}
qfDebug() << "check result:" << checked_card.toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -287,28 +287,6 @@ int CardReaderPlugin::saveCardToSql(const quickevent::core::si::ReadCard &read_c
qfError() << "Update runs error, query:" << e.what();
return 0;
}
// qf::core::sql::Query q;
// q.prepare(QStringLiteral("INSERT INTO cards (stationNumber, siId, checkTime, startTime, finishTime, punches, runId, stageId, readerConnectionId, runIdAssignError, data)"
// " VALUES (:stationNumber, :siId, :checkTime, :startTime, :finishTime, :punches, :runId, :stageId, :readerConnectionId, :runIdAssignError, :data)")
// , qf::core::Exception::Throw);
// q.bindValue(QStringLiteral(":stationNumber"), read_card.stationNumber());
// q.bindValue(QStringLiteral(":siId"), read_card.cardNumber());
// q.bindValue(QStringLiteral(":checkTime"), read_card.checkTime());
// q.bindValue(QStringLiteral(":startTime"), read_card.startTime());
// q.bindValue(QStringLiteral(":finishTime"), read_card.finishTime());
// q.bindValue(QStringLiteral(":punches"), '[' + punches.join(", ") + ']');
// q.bindValue(QStringLiteral(":runId"), read_card.runId());
// q.bindValue(QStringLiteral(":stageId"), currentStageId());
// q.bindValue(QStringLiteral(":readerConnectionId"), qf::core::sql::Connection::defaultConnection().connectionId());
// q.bindValue(QStringLiteral(":runIdAssignError"), read_card.runIdAssignError());
// q.bindValue(QStringLiteral(":data"), qf::core::Utils::qvariantToJson(read_card.data()));
// if(q.exec()) {
// ret = q.lastInsertId().toInt();
// }
// else {
// qfError() << tr("Save card ERROR: %1").arg(q.lastErrorText());
// }
// return ret;
}

int CardReaderPlugin::savePunchRecordToSql(const quickevent::core::si::PunchRecord &punch_record)
Expand Down Expand Up @@ -383,7 +361,7 @@ int CardReaderPlugin::savePunchRecordToSql(const quickevent::core::si::PunchReco
// return ret;
}

void CardReaderPlugin::updateCheckedCardValuesSql(const quickevent::core::si::CheckedCard &checked_card) noexcept(false)
void CardReaderPlugin::updateCheckedCardValuesSql(int card_id, const quickevent::core::si::CheckedCard &checked_card)
{
QF_TIME_SCOPE("updateCheckedCardValuesSql()");
int run_id = checked_card.runId();
Expand Down Expand Up @@ -418,16 +396,29 @@ void CardReaderPlugin::updateCheckedCardValuesSql(const quickevent::core::si::Ch

try {
auto *app = qf::gui::framework::Application::instance();
QVariantMap rec {
{"checkTimeMs", checked_card.checkTimeMs()},
{"timeMs", checked_card.timeMs()},
{"finishTimeMs", checked_card.finishTimeMs()},
{"misPunch", checked_card.isMisPunch()},
{"badCheck", checked_card.isBadCheck()},
{"notStart", false},
{"penaltyTimeMs", {}},
};
app->updateDbRecord("runs", run_id, rec);
{
QVariantMap rec {
{"checkTimeMs", checked_card.checkTimeMs()},
{"timeMs", checked_card.timeMs()},
{"finishTimeMs", checked_card.finishTimeMs()},
{"misPunch", checked_card.isMisPunch()},
{"badCheck", checked_card.isBadCheck()},
{"notStart", false},
{"penaltyTimeMs", {}},
};
app->updateDbRecord("runs", run_id, rec);
}
if (auto missing_codes = checked_card.missingCodes(); !missing_codes.isEmpty()) {
QStringList missing_str;
for (const auto &vl : missing_codes) {
auto vll = vl.toList();
missing_str << QStringLiteral("%1-%2").arg(vll.value(0).toInt()).arg(vll.value(1).toInt());
}
QVariantMap rec {
{"runIdAssignError", tr("Missing codes: %1").arg(missing_str.join(','))},
};
app->updateDbRecord("cards", card_id, rec);
}
}
catch (const std::exception &e) {
qfError() << "Update runs error, query:" << e.what();
Expand Down Expand Up @@ -583,9 +574,9 @@ bool CardReaderPlugin::processCardToRunAssignment(int card_id, int run_id)
}
}
}
quickevent::core::si::CheckedCard checked_card = checkCard(card_id, run_id);
auto checked_card = checkCard(card_id, run_id);
//qfDebug() << checked_card.toString();
updateCheckedCardValuesSql(checked_card);
updateCheckedCardValuesSql(card_id, checked_card);
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_CARD_PROCESSED_AND_ASSIGNED, checked_card, true);

q.execThrow("SELECT id, startTimeMs, finishTimeMs FROM runs"
Expand Down Expand Up @@ -620,8 +611,8 @@ bool CardReaderPlugin::processCardToRunAssignment(int card_id, int run_id)
}
}
else {
quickevent::core::si::CheckedCard checked_card = checkCard(card_id, run_id);
updateCheckedCardValuesSql(checked_card);
auto checked_card = checkCard(card_id, run_id);
updateCheckedCardValuesSql(card_id, checked_card);
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_CARD_PROCESSED_AND_ASSIGNED, checked_card, true);
}
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class CardReaderPlugin : public qf::gui::framework::Plugin

void updateCardToRunAssignmentInPunches(int stage_id, int card_id, int run_id);
bool saveCardAssignedRunnerIdSql(int card_id, int run_id);
void updateCheckedCardValuesSql(const quickevent::core::si::CheckedCard &checked_card) noexcept(false);
void updateCheckedCardValuesSql(int card_id, const quickevent::core::si::CheckedCard &checked_card) ;
void setStartTime(int relay_id, int leg, int start_time);
private:
QList<CardChecker*> m_cardCheckers;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
#include <plugins/Receipts/src/receiptsplugin.h>
#include <plugins/Event/src/eventplugin.h>
#include <plugins/Runs/src/findrunnerwidget.h>
// #include <plugins/Competitors/src/competitorsplugin.h>
#include <plugins/Runs/src/runflagsdialog.h>
#include <plugins/Runs/src/runsplugin.h>

Expand All @@ -69,7 +68,6 @@ using qf::gui::framework::getPlugin;
using Event::EventPlugin;
using CardReader::CardReaderPlugin;
using Receipts::ReceiptsPlugin;
// using Competitors::CompetitorsPlugin;
using Runs::RunsPlugin;

namespace {
Expand Down Expand Up @@ -261,6 +259,8 @@ CardReaderWidget::CardReaderWidget(QWidget *parent)
}
}
}, Qt::QueuedConnection);

connect(qf::gui::framework::Application::instance(), &qf::gui::framework::Application::dbRecChng, this, &CardReaderWidget::onDbRecChng, Qt::QueuedConnection);
}

CardReaderWidget::~CardReaderWidget()
Expand Down Expand Up @@ -511,6 +511,20 @@ void CardReaderWidget::reload()
m_cardsModel->reload();
}

void CardReaderWidget::onDbRecChng(const qf::core::sql::RecChng &recchng)
{
if(isVisible()) {
if (recchng.table == "cards" && recchng.op == qf::core::sql::RecOp::Update) {
for (int i = 0; i < m_cardsModel->rowCount(); ++i) {
if (m_cardsModel->value(i, "cards.id").toInt() == recchng.id) {
m_cardsModel->reloadRow(i);
break;
}
}
}
}
}

void CardReaderWidget::onDbEventNotify(const QString &domain, int connection_id, const QVariant &data)
{
Q_UNUSED(connection_id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ namespace Ui {
}

namespace quickevent::gui::og { class SqlTableModel; }
namespace qf::core::sql { struct RecChng; }

namespace qf {
namespace gui {
namespace qf::gui {
class Action;
namespace framework { class PartWidget; class Plugin; }
}
}


namespace siut { class DeviceDriver; class CommPort; class SICard; class SIPunch; }

Expand Down Expand Up @@ -67,8 +67,9 @@ class CardReaderWidget : public QFrame
Q_SLOT void reset();
Q_SLOT void reload();

private:
void onDbRecChng(const qf::core::sql::RecChng &recchng);
void onDbEventNotify(const QString &domain, int connection_id, const QVariant &data);
private slots:
void appendLog(NecroLog::Level level, const QString &msg);
void processDriverInfo(NecroLog::Level level, const QString &msg);
void logDriverRawData(const QByteArray &data);
Expand Down
3 changes: 2 additions & 1 deletion quickevent/app/quickevent/plugins/Oris/src/txtimporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,9 @@ void TxtImporter::importParsedCsv(const QList<QVariantList> &csv)
QString reg = row.value(ColRegistration).toString();
QString class_name = row.value(ColClassName).toString();
int class_id = classes_map.value(class_name);
if(class_id == 0)
if(class_id == 0) {
QF_EXCEPTION(tr("Undefined class name: '%1'").arg(class_name));
}
//fwk->showProgress("Importing: " + reg_no + ' ' + last_name + ' ' + first_name, items_processed, items_count);
// qfWarning() << tr("%1 %2 %3 SI: %4 is duplicit!").arg(reg_no).arg(last_name).arg(first_name).arg(siid);
doc.setValue("classId", class_id);
Expand Down