MeOS version 3.8.1326 Update 1
This commit is contained in:
parent
efa06c00c8
commit
0adbb266e9
@ -2145,11 +2145,12 @@ void TabRunner::listRunners(gdioutput &gdi, const vector<pRunner> &r, bool filte
|
|||||||
int yp = gdi.getCY();
|
int yp = gdi.getCY();
|
||||||
int xp = gdi.getCX();
|
int xp = gdi.getCX();
|
||||||
vector<pRunner> out;
|
vector<pRunner> out;
|
||||||
|
int counter = 0;
|
||||||
for (size_t k=0; k<r.size(); k++) {
|
for (size_t k=0; k<r.size(); k++) {
|
||||||
if (filterVacant && r[k]->isVacant())
|
if (filterVacant && r[k]->isVacant())
|
||||||
continue;
|
continue;
|
||||||
out.clear();
|
out.clear();
|
||||||
sprintf_s(bf, "%d.", int(k+1));
|
sprintf_s(bf, "%d.", ++counter);
|
||||||
gdi.addStringUT(yp, xp, 0, bf);
|
gdi.addStringUT(yp, xp, 0, bf);
|
||||||
gdi.addStringUT(yp, xp+gdi.scaleLength(40), 0, r[k]->getNameAndRace(true), gdi.scaleLength(190));
|
gdi.addStringUT(yp, xp+gdi.scaleLength(40), 0, r[k]->getNameAndRace(true), gdi.scaleLength(190));
|
||||||
gdi.addStringUT(yp, xp+gdi.scaleLength(200), 0, r[k]->getClass(true), gdi.scaleLength(140));
|
gdi.addStringUT(yp, xp+gdi.scaleLength(200), 0, r[k]->getClass(true), gdi.scaleLength(140));
|
||||||
|
|||||||
@ -57,7 +57,6 @@ private:
|
|||||||
void listRunners(gdioutput &gdi, const vector<pRunner> &r, bool filterVacant) const;
|
void listRunners(gdioutput &gdi, const vector<pRunner> &r, bool filterVacant) const;
|
||||||
|
|
||||||
void fillRunnerList(gdioutput &gdi);
|
void fillRunnerList(gdioutput &gdi);
|
||||||
|
|
||||||
int cardModeStartY;
|
int cardModeStartY;
|
||||||
int lastRace;
|
int lastRace;
|
||||||
wstring lastFee;
|
wstring lastFee;
|
||||||
|
|||||||
475
code/TabSI.cpp
475
code/TabSI.cpp
@ -205,23 +205,6 @@ int TabSI::siCB(gdioutput &gdi, int type, void *data)
|
|||||||
gdi.dropLine(3);
|
gdi.dropLine(3);
|
||||||
gdi.scrollToBottom();
|
gdi.scrollToBottom();
|
||||||
gdi.refresh();
|
gdi.refresh();
|
||||||
/*
|
|
||||||
fn = oe->getPropertyString("SoundOK", L"");
|
|
||||||
res = 50;
|
|
||||||
break;
|
|
||||||
case SND::NotOK:
|
|
||||||
fn = oe->getPropertyString("SoundNotOK", L"");
|
|
||||||
res = 52;
|
|
||||||
break;
|
|
||||||
case SND::Leader:
|
|
||||||
fn = oe->getPropertyString("SoundLeader", L"");
|
|
||||||
res = 51;
|
|
||||||
break;
|
|
||||||
case SND::ActionNeeded:
|
|
||||||
fn = oe->getPropertyString("SoundAction", L"");
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
else if (bi.id == "BrowseSound") {
|
else if (bi.id == "BrowseSound") {
|
||||||
vector< pair<wstring, wstring> > ext;
|
vector< pair<wstring, wstring> > ext;
|
||||||
@ -531,6 +514,15 @@ int TabSI::siCB(gdioutput &gdi, int type, void *data)
|
|||||||
if (manualInput)
|
if (manualInput)
|
||||||
showManualInput(gdi);
|
showManualInput(gdi);
|
||||||
}
|
}
|
||||||
|
else if (bi.id == "ReadoutWindow") {
|
||||||
|
gdioutput *gdi_settings = getExtraWindow("readout_view", true);
|
||||||
|
if (!gdi_settings) {
|
||||||
|
gdi_settings = createExtraWindow("readout_view", lang.tl("Brickavläsning"), gdi.scaleLength(800), gdi.scaleLength(600), false);
|
||||||
|
}
|
||||||
|
if (gdi_settings) {
|
||||||
|
showReadoutStatus(*gdi_settings, nullptr, nullptr, nullptr, L"");
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (bi.id == "Import") {
|
else if (bi.id == "Import") {
|
||||||
int origin = bi.getExtraInt();
|
int origin = bi.getExtraInt();
|
||||||
|
|
||||||
@ -663,11 +655,16 @@ int TabSI::siCB(gdioutput &gdi, int type, void *data)
|
|||||||
|
|
||||||
double t = 0.1;
|
double t = 0.1;
|
||||||
for (sic.nPunch = 0; sic.nPunch<unsigned(NC); sic.nPunch++) {
|
for (sic.nPunch = 0; sic.nPunch<unsigned(NC); sic.nPunch++) {
|
||||||
sic.Punch[sic.nPunch].Code = gdi.getTextNo("C" + itos(sic.nPunch + 1));
|
int c = gdi.getTextNo("C" + itos(sic.nPunch + 1));
|
||||||
sic.Punch[sic.nPunch].Time = int(f*t + s*(1.0 - t)) % (24 * 3600);
|
sic.Punch[sic.nPunch].Time = int(f*t + s*(1.0 - t)) % (24 * 3600);
|
||||||
t += ((1.0 - t) * (sic.nPunch + 1) / 10.0) * ((rand() % 100) + 400.0) / 500.0;
|
t += ((1.0 - t) * (sic.nPunch + 1) / 10.0) * ((rand() % 100) + 400.0) / 500.0;
|
||||||
if ((sic.nPunch % 11) == 1 || 5 == (sic.nPunch % 8))
|
if ((sic.nPunch % 11) == 1 || 5 == (sic.nPunch % 8))
|
||||||
t += min(0.2, 0.9 - t);
|
t += min(0.2, 0.9 - t);
|
||||||
|
if (sic.nPunch == 0 && c > 1000) {
|
||||||
|
sic.miliVolt = c;
|
||||||
|
c = c % 100;
|
||||||
|
}
|
||||||
|
sic.Punch[sic.nPunch].Code = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
gdi.getRecorder().record("insertCard(" + itos(sic.CardNumber) + ", \"" + sic.serializePunches() + "\"); //Readout card");
|
gdi.getRecorder().record("insertCard(" + itos(sic.CardNumber) + ", \"" + sic.serializePunches() + "\"); //Readout card");
|
||||||
@ -1373,11 +1370,7 @@ int TabSI::siCB(gdioutput &gdi, int type, void *data)
|
|||||||
gdi.enableInput("Database", true);
|
gdi.enableInput("Database", true);
|
||||||
gdi.enableInput("PrintSplits");
|
gdi.enableInput("PrintSplits");
|
||||||
gdi.enableInput("UseManualInput");
|
gdi.enableInput("UseManualInput");
|
||||||
gdi.fillDown();
|
showReadoutMode(gdi);
|
||||||
gdi.addButton("Import", "Importera från fil...", SportIdentCB);
|
|
||||||
|
|
||||||
if (gdi.isChecked("UseManualInput"))
|
|
||||||
showManualInput(gdi);
|
|
||||||
}
|
}
|
||||||
else if (mode == ModeCardData) {
|
else if (mode == ModeCardData) {
|
||||||
numSavedCardsOnCmpOpen = savedCards.size();
|
numSavedCardsOnCmpOpen = savedCards.size();
|
||||||
@ -1976,13 +1969,7 @@ bool TabSI::loadPage(gdioutput &gdi) {
|
|||||||
gdi.setRestorePoint("SIPageLoaded");
|
gdi.setRestorePoint("SIPageLoaded");
|
||||||
|
|
||||||
if (mode == ModeReadOut) {
|
if (mode == ModeReadOut) {
|
||||||
gdi.addButton("Import", "Importera från fil...", SportIdentCB);
|
showReadoutMode(gdi);
|
||||||
|
|
||||||
gdi.setRestorePoint("Help");
|
|
||||||
gdi.addString("", 10, "help:471101");
|
|
||||||
|
|
||||||
if (gdi.isChecked("UseManualInput"))
|
|
||||||
showManualInput(gdi);
|
|
||||||
|
|
||||||
gdi.dropLine();
|
gdi.dropLine();
|
||||||
}
|
}
|
||||||
@ -2015,6 +2002,30 @@ bool TabSI::loadPage(gdioutput &gdi) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TabSI::showReadoutMode(gdioutput & gdi) {
|
||||||
|
gdi.dropLine(0.5);
|
||||||
|
gdi.fillDown();
|
||||||
|
gdi.pushX();
|
||||||
|
gdi.addString("", boldLarge, "Avläsning/radiotider");
|
||||||
|
gdi.dropLine(0.2);
|
||||||
|
|
||||||
|
gdi.fillRight();
|
||||||
|
gdi.addButton("Import", "Importera från fil...", SportIdentCB);
|
||||||
|
gdi.fillDown();
|
||||||
|
gdi.addButton("ReadoutWindow", "Eget fönster", SportIdentCB);
|
||||||
|
|
||||||
|
gdi.dropLine();
|
||||||
|
gdi.popX();
|
||||||
|
gdi.setRestorePoint("Help");
|
||||||
|
gdi.fillDown();
|
||||||
|
gdi.addString("", 10, "info:readoutbase");
|
||||||
|
gdi.popX();
|
||||||
|
gdi.setCY(gdi.getHeight());
|
||||||
|
|
||||||
|
if (gdi.isChecked("UseManualInput"))
|
||||||
|
showManualInput(gdi);
|
||||||
|
}
|
||||||
|
|
||||||
void TabSI::updateReadoutFunction(gdioutput &gdi) {
|
void TabSI::updateReadoutFunction(gdioutput &gdi) {
|
||||||
bool hide = mode != SIMode::ModeReadOut;
|
bool hide = mode != SIMode::ModeReadOut;
|
||||||
gdi.hideWidget("Allow", hide);
|
gdi.hideWidget("Allow", hide);
|
||||||
@ -2176,6 +2187,12 @@ void TabSI::insertSICardAux(gdioutput &gdi, SICard &sic)
|
|||||||
if (printSplits) {
|
if (printSplits) {
|
||||||
generateSplits(savedCards.back().first, gdi);
|
generateSplits(savedCards.back().first, gdi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gdioutput *gdi_settings = getExtraWindow("readout_view", true);
|
||||||
|
if (gdi_settings) {
|
||||||
|
showReadoutStatus(*gdi_settings, nullptr, nullptr, &savedCards.back().second, L"");
|
||||||
|
}
|
||||||
|
|
||||||
if (savedCards.size() > 1 && pageLoaded) {
|
if (savedCards.size() > 1 && pageLoaded) {
|
||||||
RECT rc = {30, gdi.getCY(), gdi.scaleLength(250), gdi.getCY() + 3};
|
RECT rc = {30, gdi.getCY(), gdi.scaleLength(250), gdi.getCY() + 3};
|
||||||
gdi.addRectangle(rc);
|
gdi.addRectangle(rc);
|
||||||
@ -2183,7 +2200,7 @@ void TabSI::insertSICardAux(gdioutput &gdi, SICard &sic)
|
|||||||
|
|
||||||
if (pageLoaded) {
|
if (pageLoaded) {
|
||||||
gdi.enableInput("CreateCompetition", true);
|
gdi.enableInput("CreateCompetition", true);
|
||||||
printCard(gdi, savedCards.back().first, nullptr, false);
|
printCard(gdi, 0, savedCards.back().first, nullptr, false);
|
||||||
gdi.dropLine();
|
gdi.dropLine();
|
||||||
gdi.refreshFast();
|
gdi.refreshFast();
|
||||||
gdi.scrollToBottom();
|
gdi.scrollToBottom();
|
||||||
@ -2243,7 +2260,6 @@ void TabSI::insertSICardAux(gdioutput &gdi, SICard &sic)
|
|||||||
processCard(gdi, r, sic, true);
|
processCard(gdi, r, sic, true);
|
||||||
else {
|
else {
|
||||||
processUnmatched(gdi, sic, true);
|
processUnmatched(gdi, sic, true);
|
||||||
playReadoutSound(SND::ActionNeeded);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2512,8 +2528,7 @@ void TabSI::processInsertCard(const SICard &sic)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TabSI::processUnmatched(gdioutput &gdi, const SICard &csic, bool silent)
|
bool TabSI::processUnmatched(gdioutput &gdi, const SICard &csic, bool silent) {
|
||||||
{
|
|
||||||
SICard sic(csic);
|
SICard sic(csic);
|
||||||
pCard card=gEvent->allocateCard(0);
|
pCard card=gEvent->allocateCard(0);
|
||||||
|
|
||||||
@ -2547,6 +2562,11 @@ bool TabSI::processUnmatched(gdioutput &gdi, const SICard &csic, bool silent)
|
|||||||
//Update to SQL-source
|
//Update to SQL-source
|
||||||
card->synchronize();
|
card->synchronize();
|
||||||
|
|
||||||
|
gdioutput *gdi_settings = getExtraWindow("readout_view", true);
|
||||||
|
if (gdi_settings) {
|
||||||
|
showReadoutStatus(*gdi_settings, nullptr, card, nullptr, L"");
|
||||||
|
}
|
||||||
|
|
||||||
RECT rc;
|
RECT rc;
|
||||||
rc.left=15;
|
rc.left=15;
|
||||||
rc.right=gdi.getWidth()-10;
|
rc.right=gdi.getWidth()-10;
|
||||||
@ -2753,6 +2773,8 @@ bool TabSI::processCard(gdioutput &gdi, pRunner runner, const SICard &csic, bool
|
|||||||
rc.bottom+=gdi.getLineHeight();
|
rc.bottom+=gdi.getLineHeight();
|
||||||
|
|
||||||
set<int> clsSet;
|
set<int> clsSet;
|
||||||
|
wstring mpList;
|
||||||
|
|
||||||
if (runner->getClassId(false))
|
if (runner->getClassId(false))
|
||||||
clsSet.insert(runner->getClassId(true));
|
clsSet.insert(runner->getClassId(true));
|
||||||
gEvent->calculateResults(clsSet, oEvent::ResultType::ClassResult);
|
gEvent->calculateResults(clsSet, oEvent::ResultType::ClassResult);
|
||||||
@ -2760,10 +2782,7 @@ bool TabSI::processCard(gdioutput &gdi, pRunner runner, const SICard &csic, bool
|
|||||||
gEvent->calculateTeamResults(clsSet, oEvent::ResultType::ClassResult);
|
gEvent->calculateTeamResults(clsSet, oEvent::ResultType::ClassResult);
|
||||||
|
|
||||||
if (runner->getStatusComputed()==StatusOK || isPossibleResultStatus(runner->getStatusComputed())) {
|
if (runner->getStatusComputed()==StatusOK || isPossibleResultStatus(runner->getStatusComputed())) {
|
||||||
bool qfClass = runner->getClassId(false) != runner->getClassId(true);
|
wstring placeS = getPlace(runner);
|
||||||
wstring placeS = (runner->getTeam() && !qfClass) ?
|
|
||||||
runner->getTeam()->getLegPlaceS(runner->getLegNumber(), false) :
|
|
||||||
runner->getPlaceS();
|
|
||||||
|
|
||||||
if (placeS == L"1")
|
if (placeS == L"1")
|
||||||
playReadoutSound(SND::Leader);
|
playReadoutSound(SND::Leader);
|
||||||
@ -2780,7 +2799,8 @@ bool TabSI::processCard(gdioutput &gdi, pRunner runner, const SICard &csic, bool
|
|||||||
gdi.addStringUT(rc.top+6+2*lh, rc.left+20, 0, warnings);
|
gdi.addStringUT(rc.top+6+2*lh, rc.left+20, 0, warnings);
|
||||||
|
|
||||||
wstring statusline = lang.tl(L"Status OK, ") +
|
wstring statusline = lang.tl(L"Status OK, ") +
|
||||||
lang.tl(L"Tid: ") + runner->getRunningTimeS(true);
|
lang.tl(L"Tid: ") + getTimeString(runner);
|
||||||
|
|
||||||
if (!placeS.empty())
|
if (!placeS.empty())
|
||||||
statusline += lang.tl(L", Prel. placering: ") + placeS;
|
statusline += lang.tl(L", Prel. placering: ") + placeS;
|
||||||
|
|
||||||
@ -2803,16 +2823,17 @@ bool TabSI::processCard(gdioutput &gdi, pRunner runner, const SICard &csic, bool
|
|||||||
wstring msg=lang.tl(L"Status: ") + runner->getStatusS(true, true);
|
wstring msg=lang.tl(L"Status: ") + runner->getStatusS(true, true);
|
||||||
|
|
||||||
playReadoutSound(SND::NotOK);
|
playReadoutSound(SND::NotOK);
|
||||||
|
|
||||||
if (!MP.empty()) {
|
if (!MP.empty()) {
|
||||||
msg=msg + L", (";
|
for (int c : MP) {
|
||||||
vector<int>::iterator it;
|
if (!mpList.empty())
|
||||||
|
mpList += L", ";
|
||||||
|
mpList = mpList + itow(c);
|
||||||
|
}
|
||||||
|
mpList += lang.tl(" saknas.");
|
||||||
|
}
|
||||||
|
|
||||||
for(it=MP.begin(); it!=MP.end(); ++it) {
|
if (!mpList.empty())
|
||||||
msg = msg + itow(*it)+ L" ";
|
msg += L", (" + mpList + + L")";
|
||||||
}
|
|
||||||
msg += lang.tl(L" saknas") + L".)";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
gdi.fillDown();
|
gdi.fillDown();
|
||||||
@ -2839,6 +2860,11 @@ bool TabSI::processCard(gdioutput &gdi, pRunner runner, const SICard &csic, bool
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gdioutput *gdi_settings = getExtraWindow("readout_view", true);
|
||||||
|
if (gdi_settings) {
|
||||||
|
showReadoutStatus(*gdi_settings, runner, nullptr, nullptr, mpList);
|
||||||
|
}
|
||||||
|
|
||||||
tabForceSync(gdi, gEvent);
|
tabForceSync(gdi, gEvent);
|
||||||
gdi.makeEvent("DataUpdate", "sireadout", runner ? runner->getId() : 0, 0, true);
|
gdi.makeEvent("DataUpdate", "sireadout", runner ? runner->getId() : 0, 0, true);
|
||||||
|
|
||||||
@ -2852,6 +2878,52 @@ bool TabSI::processCard(gdioutput &gdi, pRunner runner, const SICard &csic, bool
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wstring TabSI::getPlace(const oRunner *runner) {
|
||||||
|
bool qfClass = runner->getClassId(false) != runner->getClassId(true);
|
||||||
|
wstring placeS = (runner->getTeam() && !qfClass) ?
|
||||||
|
runner->getTeam()->getLegPlaceS(runner->getLegNumber(), false) :
|
||||||
|
runner->getPlaceS();
|
||||||
|
|
||||||
|
return placeS;
|
||||||
|
}
|
||||||
|
|
||||||
|
wstring TabSI::getTimeString(const oRunner *runner) {
|
||||||
|
bool qfClass = runner->getClassId(false) != runner->getClassId(true);
|
||||||
|
wstring ts = runner->getRunningTimeS(true);
|
||||||
|
if (!qfClass && runner->getTeam()) {
|
||||||
|
cTeam t = runner->getTeam();
|
||||||
|
if (t->getLegStatus(runner->getLegNumber(), true, false) == StatusOK) {
|
||||||
|
ts += L" (" + t->getLegRunningTimeS(runner->getLegNumber(), true, false) + L")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
wstring TabSI::getTimeAfterString(const oRunner *runner) {
|
||||||
|
bool qfClass = runner->getClassId(false) != runner->getClassId(true);
|
||||||
|
int ta = runner->getTimeAfter();
|
||||||
|
|
||||||
|
wstring ts;
|
||||||
|
if (ta > 0)
|
||||||
|
ts = L"+" + formatTime(ta);
|
||||||
|
|
||||||
|
if (!qfClass && runner->getTeam()) {
|
||||||
|
cTeam t = runner->getTeam();
|
||||||
|
if (t->getLegStatus(runner->getLegNumber(), true, false) == StatusOK) {
|
||||||
|
int tat = t->getTimeAfter(runner->getLegNumber());
|
||||||
|
if (tat > 0) {
|
||||||
|
/* if (ta == 0)
|
||||||
|
ts = L"0:00";
|
||||||
|
|
||||||
|
ts += L" (+" + formatTime(tat) + L")";
|
||||||
|
*/
|
||||||
|
ts = L"+" + formatTime(tat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
void TabSI::processPunchOnly(gdioutput &gdi, const SICard &csic)
|
void TabSI::processPunchOnly(gdioutput &gdi, const SICard &csic)
|
||||||
{
|
{
|
||||||
SICard sic = csic;
|
SICard sic = csic;
|
||||||
@ -3448,12 +3520,11 @@ void TabSI::showModeCardData(gdioutput &gdi) {
|
|||||||
gdi.disableInput("StartInfo", true);
|
gdi.disableInput("StartInfo", true);
|
||||||
gdi.disableInput("UseManualInput", true);
|
gdi.disableInput("UseManualInput", true);
|
||||||
|
|
||||||
gdi.dropLine();
|
gdi.dropLine(0.5);
|
||||||
gdi.fillDown();
|
gdi.fillDown();
|
||||||
gdi.pushX();
|
gdi.pushX();
|
||||||
gdi.addString("", boldLarge, "Print Card Data");
|
gdi.addStringUT(boldLarge, lang.tl(L"Print card data", true));
|
||||||
gdi.addString("", 10, "help:analyzecard");
|
gdi.dropLine(0.2);
|
||||||
gdi.dropLine();
|
|
||||||
gdi.fillRight();
|
gdi.fillRight();
|
||||||
gdi.addButton("ClearMemory", "Clear Memory", SportIdentCB);
|
gdi.addButton("ClearMemory", "Clear Memory", SportIdentCB);
|
||||||
gdi.addButton("SaveMemory", "Spara...", SportIdentCB);
|
gdi.addButton("SaveMemory", "Spara...", SportIdentCB);
|
||||||
@ -3466,6 +3537,13 @@ void TabSI::showModeCardData(gdioutput &gdi) {
|
|||||||
gdi.addButton("Import", "Importera från fil...", SportIdentCB);
|
gdi.addButton("Import", "Importera från fil...", SportIdentCB);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
gdi.fillDown();
|
||||||
|
gdi.addButton("ReadoutWindow", "Eget fönster", SportIdentCB);
|
||||||
|
|
||||||
|
gdi.dropLine();
|
||||||
|
gdi.popX();
|
||||||
|
gdi.addString("", 10, "help:analyzecard");
|
||||||
|
|
||||||
gdi.dropLine(3);
|
gdi.dropLine(3);
|
||||||
gdi.popX();
|
gdi.popX();
|
||||||
bool first = true;
|
bool first = true;
|
||||||
@ -3477,7 +3555,7 @@ void TabSI::showModeCardData(gdioutput &gdi) {
|
|||||||
}
|
}
|
||||||
first = false;
|
first = false;
|
||||||
|
|
||||||
printCard(gdi, it->first, &it->second, false);
|
printCard(gdi, 0, it->first, &it->second, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3549,7 +3627,7 @@ void TabSI::EditCardData::handle(gdioutput &gdi, BaseInfo &info, GuiEventType ty
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabSI::printCard(gdioutput &gdi, int cardId, SICard *crdRef, bool forPrinter) const {
|
void TabSI::printCard(gdioutput &gdi, int lineBreak, int cardId, SICard *crdRef, bool forPrinter) const {
|
||||||
if (crdRef == nullptr)
|
if (crdRef == nullptr)
|
||||||
crdRef = &getCard(cardId);
|
crdRef = &getCard(cardId);
|
||||||
|
|
||||||
@ -3589,13 +3667,35 @@ void TabSI::printCard(gdioutput &gdi, int cardId, SICard *crdRef, bool forPrinte
|
|||||||
if (!clubName.empty())
|
if (!clubName.empty())
|
||||||
name += L", " + clubName;
|
name += L", " + clubName;
|
||||||
gdi.fillDown();
|
gdi.fillDown();
|
||||||
gdi.addStringUT(0, name).setExtra(cardId).setHandler(&editCardData);
|
auto &res = gdi.addStringUT(0, name);
|
||||||
|
if (cardId >= 0)
|
||||||
|
res.setExtra(cardId).setHandler(&editCardData);
|
||||||
gdi.popX();
|
gdi.popX();
|
||||||
}
|
}
|
||||||
gdi.fillDown();
|
gdi.fillDown();
|
||||||
gdi.addStringUT(0, c.readOutTime);
|
gdi.addStringUT(0, c.readOutTime);
|
||||||
gdi.popX();
|
gdi.popX();
|
||||||
|
|
||||||
|
if (c.miliVolt > 0) {
|
||||||
|
auto stat = oCard::isCriticalCardVoltage(c.miliVolt);
|
||||||
|
wstring warning;
|
||||||
|
if (stat == oCard::BatteryStatus::Bad)
|
||||||
|
warning = lang.tl("Replace[battery]");
|
||||||
|
else if (stat == oCard::BatteryStatus::Warning)
|
||||||
|
warning = lang.tl("Low");
|
||||||
|
else
|
||||||
|
warning = lang.tl("OK");
|
||||||
|
|
||||||
|
gdi.fillRight();
|
||||||
|
gdi.pushX();
|
||||||
|
gdi.addString("", normalText, L"Batteristatus:");
|
||||||
|
gdi.addStringUT(boldText, oCard::getCardVoltage(c.miliVolt));
|
||||||
|
gdi.fillDown();
|
||||||
|
gdi.addStringUT(normalText, L"(" + warning + L")");
|
||||||
|
gdi.dropLine(0.7);
|
||||||
|
gdi.popX();
|
||||||
|
}
|
||||||
|
|
||||||
int start = NOTIME;
|
int start = NOTIME;
|
||||||
if (c.CheckPunch.Code != -1)
|
if (c.CheckPunch.Code != -1)
|
||||||
gdi.addString("", 0, L"Check: X#" + formatTimeHMS(c.CheckPunch.Time));
|
gdi.addString("", 0, L"Check: X#" + formatTimeHMS(c.CheckPunch.Time));
|
||||||
@ -3609,9 +3709,19 @@ void TabSI::printCard(gdioutput &gdi, int cardId, SICard *crdRef, bool forPrinte
|
|||||||
int xp3 = xp2 + gdi.scaleLength(35);
|
int xp3 = xp2 + gdi.scaleLength(35);
|
||||||
int xp4 = xp3 + gdi.scaleLength(60);
|
int xp4 = xp3 + gdi.scaleLength(60);
|
||||||
int xp5 = xp4 + gdi.scaleLength(45);
|
int xp5 = xp4 + gdi.scaleLength(45);
|
||||||
|
const int off = xp5 - xp + gdi.scaleLength(80);
|
||||||
|
|
||||||
|
int baseCY = gdi.getCY();
|
||||||
|
int maxCY = baseCY;
|
||||||
|
int baseCX = gdi.getCX();
|
||||||
int accTime = 0;
|
int accTime = 0;
|
||||||
int days = 0;
|
int days = 0;
|
||||||
|
|
||||||
|
if (lineBreak > 0) {
|
||||||
|
int nRows = min<int>(1 + c.nPunch / lineBreak, 3);
|
||||||
|
lineBreak = c.nPunch / nRows + 1;
|
||||||
|
}
|
||||||
|
|
||||||
for (unsigned k = 0; k < c.nPunch; k++) {
|
for (unsigned k = 0; k < c.nPunch; k++) {
|
||||||
int cy = gdi.getCY();
|
int cy = gdi.getCY();
|
||||||
gdi.addStringUT(cy, xp, 0, itos(k+1) + ".");
|
gdi.addStringUT(cy, xp, 0, itos(k+1) + ".");
|
||||||
@ -3627,6 +3737,23 @@ void TabSI::printCard(gdioutput &gdi, int cardId, SICard *crdRef, bool forPrinte
|
|||||||
else {
|
else {
|
||||||
start = c.Punch[k].Time;
|
start = c.Punch[k].Time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lineBreak > 0 && (k%lineBreak) == lineBreak-1) {
|
||||||
|
maxCY = max(maxCY, gdi.getCY());
|
||||||
|
RECT rcc;
|
||||||
|
rcc.top = baseCY;
|
||||||
|
rcc.bottom = maxCY;
|
||||||
|
rcc.left = xp5 + gdi.scaleLength(60);
|
||||||
|
rcc.right = rcc.left + gdi.scaleLength(2);
|
||||||
|
|
||||||
|
gdi.addRectangle(rcc, colorLightCyan);
|
||||||
|
gdi.setCY(baseCY);
|
||||||
|
xp += off;
|
||||||
|
xp2 += off;
|
||||||
|
xp3 += off;
|
||||||
|
xp4 += off;
|
||||||
|
xp5 += off;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (c.FinishPunch.Code != -1) {
|
if (c.FinishPunch.Code != -1) {
|
||||||
int cy = gdi.getCY();
|
int cy = gdi.getCY();
|
||||||
@ -3640,9 +3767,25 @@ void TabSI::printCard(gdioutput &gdi, int cardId, SICard *crdRef, bool forPrinte
|
|||||||
|
|
||||||
gdi.addStringUT(cy, xp5 + gdi.scaleLength(40), textRight, formatTime(days*3600*24 + accTime));
|
gdi.addStringUT(cy, xp5 + gdi.scaleLength(40), textRight, formatTime(days*3600*24 + accTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maxCY = max(maxCY, gdi.getCY());
|
||||||
|
if (breakLines > 0) {
|
||||||
|
gdi.setCY(maxCY);
|
||||||
|
gdi.dropLine(2);
|
||||||
|
gdi.setCX(baseCX);
|
||||||
|
}
|
||||||
|
|
||||||
gdi.addString("", 1, L"Time: X#" + formatTime(days*3600*24 + accTime));
|
gdi.addString("", 1, L"Time: X#" + formatTime(days*3600*24 + accTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maxCY = max(maxCY, gdi.getCY());
|
||||||
|
|
||||||
|
if (breakLines > 0) {
|
||||||
|
gdi.setCY(maxCY);
|
||||||
|
gdi.dropLine(2);
|
||||||
|
gdi.setCX(baseCX);
|
||||||
|
}
|
||||||
|
|
||||||
if (forPrinter) {
|
if (forPrinter) {
|
||||||
gdi.dropLine(1);
|
gdi.dropLine(1);
|
||||||
|
|
||||||
@ -3676,7 +3819,7 @@ int TabSI::analyzePunch(SIPunch &p, int &start, int &accTime, int &days) {
|
|||||||
|
|
||||||
void TabSI::generateSplits(int cardId, gdioutput &gdi) {
|
void TabSI::generateSplits(int cardId, gdioutput &gdi) {
|
||||||
gdioutput gdiprint(2.0, gdi.getHWNDTarget(), splitPrinter);
|
gdioutput gdiprint(2.0, gdi.getHWNDTarget(), splitPrinter);
|
||||||
printCard(gdiprint, cardId, nullptr, true);
|
printCard(gdiprint, 0, cardId, nullptr, true);
|
||||||
printProtected(gdi, gdiprint);
|
printProtected(gdi, gdiprint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4407,6 +4550,16 @@ void TabSI::handleAutoComplete(gdioutput &gdi, AutoCompleteInfo &info) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (bi->id == "Runners" && ix >= 0) {
|
||||||
|
auto r = oe->getRunnerDatabase().getRunnerByIndex(ix);
|
||||||
|
if (gdi.hasWidget("Club") && r->dbe().clubNo) {
|
||||||
|
if (gdi.getText("Club").empty()) {
|
||||||
|
auto pclub = oe->getRunnerDatabase().getClub(r->dbe().clubNo);
|
||||||
|
if (pclub)
|
||||||
|
gdi.setText("Club", pclub->getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
gdi.clearAutoComplete("");
|
gdi.clearAutoComplete("");
|
||||||
gdi.TabFocus(1);
|
gdi.TabFocus(1);
|
||||||
@ -4415,8 +4568,9 @@ void TabSI::handleAutoComplete(gdioutput &gdi, AutoCompleteInfo &info) {
|
|||||||
bool TabSI::showDatabase() const {
|
bool TabSI::showDatabase() const {
|
||||||
return useDatabase && oe->useRunnerDb();
|
return useDatabase && oe->useRunnerDb();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabSI::playReadoutSound(SND type) {
|
void TabSI::playReadoutSound(SND type) {
|
||||||
if (!oe->getPropertyInt("PlaySound", 0))
|
if (!oe->getPropertyInt("PlaySound", 1))
|
||||||
return;
|
return;
|
||||||
int res = -1;
|
int res = -1;
|
||||||
wstring fn;
|
wstring fn;
|
||||||
@ -4473,3 +4627,212 @@ void TabSI::playSoundFile(const wstring& file) const {
|
|||||||
PlaySound(file.c_str(), nullptr, SND_FILENAME | SND_ASYNC);
|
PlaySound(file.c_str(), nullptr, SND_FILENAME | SND_ASYNC);
|
||||||
//OutputDebugString(file.c_str());
|
//OutputDebugString(file.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TabSI::showReadoutStatus(gdioutput &gdi, const oRunner *r,
|
||||||
|
const oCard *oCrd, SICard *siCrd,
|
||||||
|
const wstring &missingPunchList) {
|
||||||
|
gdi.clearPage(false);
|
||||||
|
gdi.hideBackground(true);
|
||||||
|
int w, h;
|
||||||
|
gdi.getTargetDimension(w, h);
|
||||||
|
double minS = min(h / 500.0, w / 700.0);
|
||||||
|
gdi.scaleSize(minS/gdi.getScale(), false, false);
|
||||||
|
|
||||||
|
int mrg = 20;
|
||||||
|
int lh = gdi.getLineHeight(boldHuge, nullptr);
|
||||||
|
bool addAutoClear = false;
|
||||||
|
bool rentalCard = false;
|
||||||
|
wstring cardVoltage;
|
||||||
|
oCard::BatteryStatus bt = oCard::BatteryStatus::OK;
|
||||||
|
RECT rc;
|
||||||
|
rc.top = mrg;
|
||||||
|
rc.bottom = h - mrg;
|
||||||
|
rc.left = mrg;
|
||||||
|
rc.right = w - mrg;
|
||||||
|
GDICOLOR bgColor = GDICOLOR::colorDefault;
|
||||||
|
|
||||||
|
if (r != nullptr) {
|
||||||
|
if (r->isHiredCard() || oe->isHiredCard(r->getCardNo()))
|
||||||
|
rentalCard = true;
|
||||||
|
|
||||||
|
gdi.addStringUT(h / 3, mrg, boldHuge | textCenter, r->getCompleteIdentification(), w - 2 * mrg);
|
||||||
|
gdi.setCX(max(w / 8, mrg * 2));
|
||||||
|
gdi.setCY(h / 3 + lh * 2);
|
||||||
|
gdi.pushX();
|
||||||
|
|
||||||
|
if (r->getCard()) {
|
||||||
|
cardVoltage = r->getCard()->getCardVoltage();
|
||||||
|
bt = r->getCard()->isCriticalCardVoltage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r->isStatusUnknown(true)) {
|
||||||
|
gdi.fillRight();
|
||||||
|
if (r->getStartTime() > 0) {
|
||||||
|
gdi.addString("", fontMediumPlus, "Start:");
|
||||||
|
gdi.addStringUT(boldHuge, r->getStartTimeS());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (r->isStatusOK(true)) {
|
||||||
|
bgColor = colorLightGreen;
|
||||||
|
gdi.fillRight();
|
||||||
|
gdi.addStringUT(boldLarge, r->getClass(true));
|
||||||
|
|
||||||
|
gdi.addString("", fontLarge, " Start:").setColor(colorGreyBlue);
|
||||||
|
gdi.addStringUT(boldLarge, r->getStartTimeS());
|
||||||
|
gdi.addString("", fontLarge, " Mål:").setColor(colorGreyBlue);
|
||||||
|
gdi.addStringUT(boldLarge, r->getFinishTimeS());
|
||||||
|
gdi.popX();
|
||||||
|
gdi.dropLine(3);
|
||||||
|
|
||||||
|
if (r->getStatusComputed() == StatusNoTiming ||
|
||||||
|
(r->getClassRef(false) && r->getClassRef(true)->getNoTiming())) {
|
||||||
|
gdi.addString("", fontMediumPlus, "Status:").setColor(colorGreyBlue);
|
||||||
|
gdi.fillDown();
|
||||||
|
gdi.addString("", boldHuge, "Godkänd");
|
||||||
|
gdi.popX();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gdi.addString("", fontMediumPlus, " Tid:").setColor(colorGreyBlue);
|
||||||
|
bool showPlace = r->getStatusComputed() == StatusOK;
|
||||||
|
if (!showPlace)
|
||||||
|
gdi.fillDown();
|
||||||
|
|
||||||
|
wstring ts = getTimeString(r);
|
||||||
|
gdi.addStringUT(boldHuge, ts);
|
||||||
|
|
||||||
|
if (showPlace) {
|
||||||
|
gdi.addString("", fontMediumPlus, " Placering:").setColor(colorGreyBlue);
|
||||||
|
gdi.fillDown();
|
||||||
|
gdi.addStringUT(boldHuge, getPlace(r) + L" ");
|
||||||
|
}
|
||||||
|
gdi.popX();
|
||||||
|
gdi.fillRight();
|
||||||
|
wstring ta = getTimeAfterString(r);
|
||||||
|
if (!ta.empty()) {
|
||||||
|
gdi.addString("", fontMediumPlus, " Efter:").setColor(colorGreyBlue);
|
||||||
|
gdi.addStringUT(boldHuge, ta + L" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
int miss = r->getMissedTime();
|
||||||
|
if (miss > 0) {
|
||||||
|
gdi.addString("", fontMediumPlus, " Bomtid:").setColor(colorGreyBlue);
|
||||||
|
gdi.addStringUT(boldHuge, formatTime(miss));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bgColor = colorLightRed;
|
||||||
|
gdi.fillDown();
|
||||||
|
gdi.addStringUT(fontLarge, r->getClass(true));
|
||||||
|
gdi.dropLine();
|
||||||
|
gdi.fillRight();
|
||||||
|
gdi.addString("", fontMediumPlus, "Start:").setColor(colorGreyBlue);
|
||||||
|
gdi.addStringUT(boldHuge, r->getStartTimeS());
|
||||||
|
gdi.addString("", fontMediumPlus, " Mål:").setColor(colorGreyBlue);
|
||||||
|
gdi.addStringUT(boldHuge, r->getFinishTimeS());
|
||||||
|
gdi.addString("", fontMediumPlus, " Status:").setColor(colorGreyBlue);
|
||||||
|
gdi.fillDown();
|
||||||
|
gdi.addString("", boldHuge, r->getStatusS(true, true));
|
||||||
|
gdi.popX();
|
||||||
|
if (!missingPunchList.empty()) {
|
||||||
|
gdi.fillRight();
|
||||||
|
gdi.addString("", boldHuge, "Kontroll: ");
|
||||||
|
gdi.fillDown();
|
||||||
|
gdi.addStringUT(boldHuge, missingPunchList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addAutoClear = true;
|
||||||
|
}
|
||||||
|
else if (oCrd != nullptr) {
|
||||||
|
if (oe->isHiredCard(oCrd->getCardNo()))
|
||||||
|
rentalCard = true;
|
||||||
|
|
||||||
|
bgColor = colorLightRed;
|
||||||
|
gdi.addString("", h / 3, mrg, boldHuge | textCenter, "Okänd bricka", w - 2 * mrg);
|
||||||
|
gdi.addString("", h / 3 + lh*2, mrg, boldHuge | textCenter, itow(oCrd->getCardNo()), w - 2 * mrg);
|
||||||
|
cardVoltage = oCrd->getCardVoltage();
|
||||||
|
bt = oCrd->isCriticalCardVoltage();
|
||||||
|
|
||||||
|
addAutoClear = true;
|
||||||
|
}
|
||||||
|
else if (siCrd != nullptr) {
|
||||||
|
rentalCard = oe->isHiredCard(siCrd->CardNumber);
|
||||||
|
|
||||||
|
printCard(gdi, 10, -1, siCrd, true);
|
||||||
|
cardVoltage = oCard::getCardVoltage(siCrd->miliVolt);
|
||||||
|
bt = oCard::isCriticalCardVoltage(siCrd->miliVolt);
|
||||||
|
|
||||||
|
addAutoClear = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gdi.addString("", h / 3, w/2-64, textImage, "513");
|
||||||
|
}
|
||||||
|
|
||||||
|
gdi.dropLine(3);
|
||||||
|
int cyBelow = gdi.getCY();
|
||||||
|
|
||||||
|
if (bgColor != GDICOLOR::colorDefault)
|
||||||
|
gdi.addRectangle(rc, bgColor);
|
||||||
|
|
||||||
|
rc.top += mrg / 2;
|
||||||
|
rc.right -= mrg / 2;
|
||||||
|
rc.left += mrg / 2;
|
||||||
|
rc.bottom = h / 6;
|
||||||
|
|
||||||
|
if (rentalCard) {
|
||||||
|
gdi.addRectangle(rc, colorYellow);
|
||||||
|
gdi.addStringUT(rc.top + (rc.bottom- rc.top)/3, mrg, boldHuge | textCenter,
|
||||||
|
"Vänligen återlämna hyrbrickan.", w - 3 * mrg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cardVoltage.empty()) {
|
||||||
|
rc.top = cyBelow;
|
||||||
|
rc.right -= mrg;
|
||||||
|
rc.left += mrg;
|
||||||
|
rc.bottom = h - mrg*3;
|
||||||
|
|
||||||
|
if (bt == oCard::BatteryStatus::OK)
|
||||||
|
gdi.addRectangle(rc, colorMediumGreen);
|
||||||
|
else if (bt == oCard::BatteryStatus::Warning)
|
||||||
|
gdi.addRectangle(rc, colorMediumYellow);
|
||||||
|
else
|
||||||
|
gdi.addRectangle(rc, colorMediumRed);
|
||||||
|
|
||||||
|
gdi.setCX(w/3);
|
||||||
|
gdi.setCY(min(rc.top + mrg, rc.bottom - gdi.scaleLength(mrg*5)));
|
||||||
|
gdi.fillDown();
|
||||||
|
gdi.pushX();
|
||||||
|
gdi.addString("", gdi.getCY(), rc.left + mrg, fontMediumPlus, "Batteristatus");
|
||||||
|
gdi.fillRight();
|
||||||
|
gdi.dropLine();
|
||||||
|
gdi.addString("", fontMediumPlus, "Spänning:");
|
||||||
|
gdi.addStringUT(boldHuge, cardVoltage);
|
||||||
|
|
||||||
|
wstring warning;
|
||||||
|
if (bt == oCard::BatteryStatus::Bad)
|
||||||
|
warning = lang.tl("Replace[battery]");
|
||||||
|
else if (bt == oCard::BatteryStatus::Warning)
|
||||||
|
warning = lang.tl("Low");
|
||||||
|
else
|
||||||
|
warning = lang.tl("OK");
|
||||||
|
|
||||||
|
gdi.addStringUT(boldHuge, L"(" + warning + L")");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addAutoClear) {
|
||||||
|
TimerInfo &ti = gdi.addTimeoutMilli(20000, "", nullptr);
|
||||||
|
|
||||||
|
class LoadDef : public GuiHandler {
|
||||||
|
public:
|
||||||
|
TabSI * si;
|
||||||
|
LoadDef(TabSI *si) : si(si) {}
|
||||||
|
void handle(gdioutput &gdi, BaseInfo &info, GuiEventType type) final {
|
||||||
|
si->showReadoutStatus(gdi, nullptr, nullptr, nullptr, L"");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ti.setHandler(make_shared<LoadDef>(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
gdi.refresh();
|
||||||
|
}
|
||||||
|
|||||||
12
code/TabSI.h
12
code/TabSI.h
@ -177,7 +177,7 @@ private:
|
|||||||
|
|
||||||
void showModeCardData(gdioutput &gdi);
|
void showModeCardData(gdioutput &gdi);
|
||||||
|
|
||||||
void printCard(gdioutput &gdi, int cardId, SICard *crdRef, bool forPrinter) const;
|
void printCard(gdioutput &gdi, int lineBreak, int cardId, SICard *crdRef, bool forPrinter) const;
|
||||||
void generateSplits(int cardId, gdioutput &gdi);
|
void generateSplits(int cardId, gdioutput &gdi);
|
||||||
|
|
||||||
static int analyzePunch(SIPunch &p, int &start, int &accTime, int &days);
|
static int analyzePunch(SIPunch &p, int &start, int &accTime, int &days);
|
||||||
@ -224,6 +224,10 @@ private:
|
|||||||
protected:
|
protected:
|
||||||
void clearCompetitionData();
|
void clearCompetitionData();
|
||||||
|
|
||||||
|
static wstring getPlace(const oRunner *r);
|
||||||
|
static wstring getTimeString(const oRunner *r);
|
||||||
|
static wstring getTimeAfterString(const oRunner *r);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
bool showDatabase() const;
|
bool showDatabase() const;
|
||||||
@ -283,6 +287,12 @@ public:
|
|||||||
void refillComPorts(gdioutput &gdi);
|
void refillComPorts(gdioutput &gdi);
|
||||||
|
|
||||||
bool loadPage(gdioutput &gdi);
|
bool loadPage(gdioutput &gdi);
|
||||||
|
void showReadoutMode(gdioutput & gdi);
|
||||||
|
|
||||||
|
void showReadoutStatus(gdioutput &gdi, const oRunner *r,
|
||||||
|
const oCard *crd, SICard *card,
|
||||||
|
const wstring &missingPunchList);
|
||||||
|
|
||||||
TabSI(oEvent *oe);
|
TabSI(oEvent *oe);
|
||||||
~TabSI(void);
|
~TabSI(void);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -2294,8 +2294,8 @@ help:31661 = Restart (úseku) je určen časem uzavření předávky a časem sa
|
|||||||
help:33940 = Importuj přihlášky ve volném textovém formátu. Uveď jméno, oddíl, kategorii a číslo čipu (případně ještě čas startu), nejlépe odděleny čárkou, jedna osoba (tým) na řádku. Také je možné uvést více závodníků ze stejného klubu / kategorie částečným vynecháním těchto položek. Také je možno importovat data formátovaná jinými způsoby.
|
help:33940 = Importuj přihlášky ve volném textovém formátu. Uveď jméno, oddíl, kategorii a číslo čipu (případně ještě čas startu), nejlépe odděleny čárkou, jedna osoba (tým) na řádku. Také je možné uvést více závodníků ze stejného klubu / kategorie částečným vynecháním těchto položek. Také je možno importovat data formátovaná jinými způsoby.
|
||||||
help:41072 = Ke změně či odstranění ražení vyber patřičnou položku v seznamu. Můžeš doplnit chybějící ražení podle předlohy tratě. Pokud chybí cílový čas, závodník dostane status <DNF>. Pokud chybí kontrola, status je <MP>. Není možné přiřadit status odporující ražení. Pokud je naražen cíl, musíš jej změnit pro vlastní cílový čas. Podobně pro ražení startu.
|
help:41072 = Ke změně či odstranění ražení vyber patřičnou položku v seznamu. Můžeš doplnit chybějící ražení podle předlohy tratě. Pokud chybí cílový čas, závodník dostane status <DNF>. Pokud chybí kontrola, status je <MP>. Není možné přiřadit status odporující ražení. Pokud je naražen cíl, musíš jej změnit pro vlastní cílový čas. Podobně pro ražení startu.
|
||||||
help:41641 = Vlož čas prvního startu a interval. Náhodné losování dává bezpodmínečně náhodné pořadí startu. ˇvédská metoda používá zvláštní pravidla k rozdělení závodníků ze stejného oddílu. Skupinový start znamená že celá kategorie startuje v malých skupinách v průběhu uvedeného intervalu (rozšířený hromadný start). V poli úsek můžeš uvést který úsek má být losován, pokud jich má kategorie vícero.
|
help:41641 = Vlož čas prvního startu a interval. Náhodné losování dává bezpodmínečně náhodné pořadí startu. ˇvédská metoda používá zvláštní pravidla k rozdělení závodníků ze stejného oddílu. Skupinový start znamená že celá kategorie startuje v malých skupinách v průběhu uvedeného intervalu (rozšířený hromadný start). V poli úsek můžeš uvést který úsek má být losován, pokud jich má kategorie vícero.
|
||||||
help:425188 = Závodníky kteří neodstartovali můžeš automaticky pořešit vyčtením SI stanic (nulování/check/start) v SIConfigu. Ulož vyčtené jako středníkem oddělovaný textový soubor a naimportuj tento soubor do MeOSu. Závodníci z tohoto importu budou zapamatováni. Pak můžeš dát DNS status všem ostatním. Když později znova naimportuješ závodníky, můžeš u právě importovaných závodníků resetovat status (z DNS na Neznámý).
|
help:425188 = Závodníky kteří neodstartovali můžeš automaticky pořešit vyčtením SI stanic (nulování/check/start) v SportIdent Config+. Ulož vyčtené jako středníkem oddělovaný textový soubor a naimportuj tento soubor do MeOSu. Závodníci z tohoto importu budou zapamatováni. Pak můžeš dát DNS status všem ostatním. Když později znova naimportuješ závodníky, můžeš u právě importovaných závodníků resetovat status (z DNS na Neznámý).
|
||||||
help:471101 = Aktivuj jednotku SI zvolením odpovídajícího COM-portu nebo hledáním připojených SI jednotek. Zvol Informace pro status zvoleného portu.\n\nInteraktivní vyčtení umožňuje přímé řešení problémů, jako třeba chybné číslo čipu. Nepoužívej tuto možnost, pokud jsou závodníci s potížemi obsluhováni zvlášť.\n\nKdyž chceš automaticky přidat nové závodníky, je použita databáze závodníků. Ražení je použito k nalezení (odhadnutí) správné kategorie.
|
info:readoutbase = Aktivuj jednotku SI zvolením odpovídajícího COM-portu nebo hledáním připojených SI jednotek. Zvol Informace pro status zvoleného portu.\n\nInteraktivní vyčtení umožňuje přímé řešení problémů, jako třeba chybné číslo čipu. Nepoužívej tuto možnost, pokud jsou závodníci s potížemi obsluhováni zvlášť.\n\nKdyž chceš automaticky přidat nové závodníky, je použita databáze závodníků. Ražení je použito k nalezení (odhadnutí) správné kategorie.
|
||||||
help:50431 = Nyní jsi připojen k serveru. K otevření závodu na serveru - vyber jej v seznamu a klikni otevřít. K přidání závodu na server - otevři jej lokálně a zvol "pošli". Pokud jsi otevřel závod na serveru, uvidíš ostatní MeOS klienty.
|
help:50431 = Nyní jsi připojen k serveru. K otevření závodu na serveru - vyber jej v seznamu a klikni otevřít. K přidání závodu na server - otevři jej lokálně a zvol "pošli". Pokud jsi otevřel závod na serveru, uvidíš ostatní MeOS klienty.
|
||||||
help:52726 = Připoj se k serveru níže.\n\nInstalace\nStáhni a nainstaluj MySQL 5 (Community Edition) z www.mysql.com. Můžeš použít výchozí nastavení. MySQL je nezbytné nainstalovat pouze na počítači hrajícím roli serveru. Když je MySQL nainstalována, spusť MySQL Command Line Client a založ uživatelský účet pro MeOS. Příkaz vypadá jako:\n\n> CREATE USER meos;\nGRANT ALL ON *.* TO meos;\n\nNyní jsi založil uživatele meos bez hesla. Níže zadej jméno serveru (možná bude nutné nakonfigurovat firewally).\n\nJako alternativu můžeš použít výchozí root účet MySQL - uživatelské jméno je 'root' a heslo je to, které bylo zadáno při instalaci MySQL.
|
help:52726 = Připoj se k serveru níže.\n\nInstalace\nStáhni a nainstaluj MySQL 5 (Community Edition) z www.mysql.com. Můžeš použít výchozí nastavení. MySQL je nezbytné nainstalovat pouze na počítači hrajícím roli serveru. Když je MySQL nainstalována, spusť MySQL Command Line Client a založ uživatelský účet pro MeOS. Příkaz vypadá jako:\n\n> CREATE USER meos;\nGRANT ALL ON *.* TO meos;\n\nNyní jsi založil uživatele meos bez hesla. Níže zadej jméno serveru (možná bude nutné nakonfigurovat firewally).\n\nJako alternativu můžeš použít výchozí root účet MySQL - uživatelské jméno je 'root' a heslo je to, které bylo zadáno při instalaci MySQL.
|
||||||
help:5422 = SI jednotka nenalezena. Je připojená a spuštěná?
|
help:5422 = SI jednotka nenalezena. Je připojená a spuštěná?
|
||||||
|
|||||||
2280
code/danish.lng
2280
code/danish.lng
File diff suppressed because it is too large
Load Diff
@ -1317,8 +1317,9 @@ help:31661 = A restart is defined by a rope time and a restart time. At the rope
|
|||||||
help:33940 = Import entries in free text format. Specify name, club, class, and card number (possibly also start time), preferably separated by comma, one person (team) per row. It is also possible to specify many competitors in the same club / class by partly leaving out these fields. It is also possible to import data formatted in other ways.
|
help:33940 = Import entries in free text format. Specify name, club, class, and card number (possibly also start time), preferably separated by comma, one person (team) per row. It is also possible to specify many competitors in the same club / class by partly leaving out these fields. It is also possible to import data formatted in other ways.
|
||||||
help:41072 = Select a punch from the list to change or remove it. You can add missing punches from the course template. If the finish time is missing, the runner gets status <Did Not Finish>. If a punch is missing, the status is <Missing Punch>. It is not possible to assign a status incompatible with the punches. If there is a finish punch, you must modify it to set a manual finish time. The same principle applies for the start punch.
|
help:41072 = Select a punch from the list to change or remove it. You can add missing punches from the course template. If the finish time is missing, the runner gets status <Did Not Finish>. If a punch is missing, the status is <Missing Punch>. It is not possible to assign a status incompatible with the punches. If there is a finish punch, you must modify it to set a manual finish time. The same principle applies for the start punch.
|
||||||
help:41641 = Enter a first start time and start interval. Draw random gives an unconditionally random start order. Swedish draw method uses special rules to distribute runners from the same club. Clumped start means the whole class starts in small groups during the specified interval (extended mass start). In the field leg, you can specify which leg is to be drawn, if the class has several.
|
help:41641 = Enter a first start time and start interval. Draw random gives an unconditionally random start order. Swedish draw method uses special rules to distribute runners from the same club. Clumped start means the whole class starts in small groups during the specified interval (extended mass start). In the field leg, you can specify which leg is to be drawn, if the class has several.
|
||||||
help:425188 = You can handle runners that didn't start automatically by reading out SI stations (clear/check/start/controls) in SIConfig. Save the readout as a semi colon separated text file and import this file into MeOS. Runners in this import get a registration. Then you can give DNS status to all runners without registration. If you later import more runners, you can reset the status (from DNS to Unknown) on the runners now imported.
|
help:425188 = You can handle runners that didn't start automatically by reading out SI stations (clear/check/start/controls) in SportIdent Config+. Save the readout as a semi colon separated text file and import this file into MeOS. Runners in this import get a registration. Then you can give DNS status to all runners without registration. If you later import more runners, you can reset the status (from DNS to Unknown) on the runners now imported.
|
||||||
help:471101 = Activate the SI unit by selecting its COM-port, or by searching for installed SI units. Press Information to get status for the selected port.\n\nInteractive readout lets you directly handle problems, such as wrong card number. Do not use this option when runners with problems are handled separately.\n\nThe runner database is used if you want to automatically add new runners. The punches are used to find (guess) the right class.
|
info:readoutbase = Activate the SI unit by selecting its COM-port, or by searching for installed SI units. Press Information to get status for the selected port.\n\nInteractive readout lets you directly handle problems, such as wrong card number. Do not use this option when runners with problems are handled separately.\n\nThe runner database is used if you want to automatically add new runners. The punches are used to find (guess) the right class.
|
||||||
|
info:readoutmore = Sound selection lets you enable sound signals to be played back on reading out a card.\n\nShow readout in window opens a new window designed to be shown on a screen turned towards the competitor.\n\nIf you have connected a punching unit (for example finish punch) you can decide if you want to accept start, radio, or finish punches. This is a filter to prevent (for example) unexpected start punches from being recieved by mistake, which could overwrite the drawn starting time.
|
||||||
help:50431 = You are now connected to a server. To open a competition on the server, select it in the list and click open. Do add a competition to the server, open the competition locally and select upload. When you have opened a competition on the server, you will see all other connected MeOS clients.
|
help:50431 = You are now connected to a server. To open a competition on the server, select it in the list and click open. Do add a competition to the server, open the competition locally and select upload. When you have opened a competition on the server, you will see all other connected MeOS clients.
|
||||||
help:52726 = Connect to a server below.\n\nInstallation\nDownload and install MySQL 5 (Community Edition) from www.mysql.com. You can use default settings. It is only necessary to install MySQL on the computer acting server. When MySQL is installed, start MySQL Command Line Client and create a user account for MeOS. You write like this:\n\n> CREATE USER meos;\nGRANT ALL ON *.* TO meos;\n\nYou have now created a user meos with no password. Enter the name of the server below (you may have to configure firewalls to let through the traffic).\n\nAs an alternative you can use the built-in root account of MySQL. User name is 'root' and password is the one you provided when installing MySQL.
|
help:52726 = Connect to a server below.\n\nInstallation\nDownload and install MySQL 5 (Community Edition) from www.mysql.com. You can use default settings. It is only necessary to install MySQL on the computer acting server. When MySQL is installed, start MySQL Command Line Client and create a user account for MeOS. You write like this:\n\n> CREATE USER meos;\nGRANT ALL ON *.* TO meos;\n\nYou have now created a user meos with no password. Enter the name of the server below (you may have to configure firewalls to let through the traffic).\n\nAs an alternative you can use the built-in root account of MySQL. User name is 'root' and password is the one you provided when installing MySQL.
|
||||||
help:5422 = Found no SI unit. Are they connected and started?
|
help:5422 = Found no SI unit. Are they connected and started?
|
||||||
@ -1604,7 +1605,7 @@ Skriver sträcktider när tävlingsdata ändras = Writing file when competition
|
|||||||
Bana med slingor = Course with loops
|
Bana med slingor = Course with loops
|
||||||
En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning = A course with loops allows the competitor to take the loops in any order
|
En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning = A course with loops allows the competitor to take the loops in any order
|
||||||
Varvningskontroll = Common control
|
Varvningskontroll = Common control
|
||||||
warn:notextended = INFO: Program the unit with extended protocol in SIConfig to speed up card reading.
|
warn:notextended = INFO: Program the unit with extended protocol in SportIdent Config+ to speed up card reading.
|
||||||
help:DirectResult = - If there is no course, the status is set to OK on finish punch.\n\n- If there is a course, radio punches are used as controls. No card readout is necessary.
|
help:DirectResult = - If there is no course, the status is set to OK on finish punch.\n\n- If there is a course, radio punches are used as controls. No card readout is necessary.
|
||||||
Resultat vid målstämpling = Result on finish punch
|
Resultat vid målstämpling = Result on finish punch
|
||||||
Stämpling = Punch
|
Stämpling = Punch
|
||||||
@ -1709,7 +1710,6 @@ Leg X: Use Y = Leg X: Use Y
|
|||||||
Created X distinct forkings using Y courses = Created X distinct forks using Y courses
|
Created X distinct forkings using Y courses = Created X distinct forks using Y courses
|
||||||
Clear Memory = Clear Memory
|
Clear Memory = Clear Memory
|
||||||
Create Competition = Create Competition
|
Create Competition = Create Competition
|
||||||
Print Card Data = Print Card Data
|
|
||||||
Print card data = Print card data
|
Print card data = Print card data
|
||||||
help:analyzecard = This function allows you to print out card data without using any competition, much like a standalone printing unit. Select Print Splits to select and configure the printer.\n\nThe cards are also saved in memory (but not in the competition). You can edit name and club for a card by clicking the name (Or 'Unknown'). You can also save the cards to file (Save) or create a new competition from card data. Note that if a competition is currently open, you must close it to make this option available.
|
help:analyzecard = This function allows you to print out card data without using any competition, much like a standalone printing unit. Select Print Splits to select and configure the printer.\n\nThe cards are also saved in memory (but not in the competition). You can edit name and club for a card by clicking the name (Or 'Unknown'). You can also save the cards to file (Save) or create a new competition from card data. Note that if a competition is currently open, you must close it to make this option available.
|
||||||
Använd endast en bana i klassen = Use only one course in the class
|
Använd endast en bana i klassen = Use only one course in the class
|
||||||
@ -2590,3 +2590,9 @@ Automatnamn = Service name
|
|||||||
Använd = Use
|
Använd = Use
|
||||||
Om du vill kan du namnge automaten = You may give the service a name
|
Om du vill kan du namnge automaten = You may give the service a name
|
||||||
Spara inställningar = Save settings
|
Spara inställningar = Save settings
|
||||||
|
Anmälningstid = Entry time
|
||||||
|
Varningar i X = Warnings for X
|
||||||
|
Duplicerad nummerlapp: X, Y = Duplicated bib: X, Y
|
||||||
|
Saknat lag mellan X och Y = Missing team between X and Y
|
||||||
|
Lag utan nummerlapp: X = Team with no bib: X
|
||||||
|
Brickavläsning = Card Readout
|
||||||
|
|||||||
@ -2289,7 +2289,7 @@ help:33940 = Importer les inscriptions en format texte libre. Spécifier le nom,
|
|||||||
help:41072 = Sélectionner un poinçon dans la liste pour le modifier ou le supprimer. Vous pouvez ajouter des poinçons manquants à partir du modèle de course. Si l'heure d'arrivée est manquante, le coureur obtient le statut <Aband.>. Si un poinçon est manquant, le statut est <PM>. Il est impossible d'affecter un statut incompatible avec les poinçons. S'il y a un poinçon d'arrivée, vous devez le modifier pour pouvoir définir manuellement l'heure d'arrivée. Le même principe s'applique au poinçon de départ.
|
help:41072 = Sélectionner un poinçon dans la liste pour le modifier ou le supprimer. Vous pouvez ajouter des poinçons manquants à partir du modèle de course. Si l'heure d'arrivée est manquante, le coureur obtient le statut <Aband.>. Si un poinçon est manquant, le statut est <PM>. Il est impossible d'affecter un statut incompatible avec les poinçons. S'il y a un poinçon d'arrivée, vous devez le modifier pour pouvoir définir manuellement l'heure d'arrivée. Le même principe s'applique au poinçon de départ.
|
||||||
help:41641 = Entrez un premier horaire de départ et un intervalle. Tirage Aléatoire affecte un ordre de départ totalement aléatoire. La Méthode de Tirage Suédoise utilise des règles spéciales pour répartir les coureurs d'un même club. Départ groupé signifie que la catégorie complète part par petits groupes pendant la durée spécifiée (Départ en masse étendu). Dans le champ Branches vous pouvez spécifier quelle branche doit être tirée au hasard si la catégorie en a plusieurs.
|
help:41641 = Entrez un premier horaire de départ et un intervalle. Tirage Aléatoire affecte un ordre de départ totalement aléatoire. La Méthode de Tirage Suédoise utilise des règles spéciales pour répartir les coureurs d'un même club. Départ groupé signifie que la catégorie complète part par petits groupes pendant la durée spécifiée (Départ en masse étendu). Dans le champ Branches vous pouvez spécifier quelle branche doit être tirée au hasard si la catégorie en a plusieurs.
|
||||||
help:425188 = Vous pouvez gérer automatiquement les coureurs qui ne sont pas partis en lisant les boîtiers SI (clear/check/start/control) dans SI Config. Sauvegarder les données lues en tant que fichier texte dont les colonnes sont séparées par des points-virgules, et importez ce fichier dans MeOS. Les coureurs figurant dans cet import reçoivent un enregistrement. Vous pouvez alors donner le statut Non partant à tous les coureurs n'ayant pas d'enregistrement. Si ultérieurement vous importez d'autres coureurs, vous pouvez réinitialiser le statut (de Non partant à Inconnu) sur les coureurs alors importés.
|
help:425188 = Vous pouvez gérer automatiquement les coureurs qui ne sont pas partis en lisant les boîtiers SI (clear/check/start/control) dans SI Config. Sauvegarder les données lues en tant que fichier texte dont les colonnes sont séparées par des points-virgules, et importez ce fichier dans MeOS. Les coureurs figurant dans cet import reçoivent un enregistrement. Vous pouvez alors donner le statut Non partant à tous les coureurs n'ayant pas d'enregistrement. Si ultérieurement vous importez d'autres coureurs, vous pouvez réinitialiser le statut (de Non partant à Inconnu) sur les coureurs alors importés.
|
||||||
help:471101 = Activez le boîtier SI en sélectionnant son port COM ou en recherchant les boîtiers SI installés. Appuyez sur Information pour obtenir le statut du port sélectionné.\n\nLecture Interactive vous permet de gérer directement les problèmes tels qu'un numéro de puce erroné. N'utilisez pas cette possibilité quand les coureurs ayant des problèmes sont pris en charge séparément.\n\nLa base de données des coureurs est utilisée si vous voulez ajouter automatiquement de nouveaux coureurs. Les poinçons sont utilisés pour trouver (détecter) la bonne catégorie.
|
info:readoutbase = Activez le boîtier SI en sélectionnant son port COM ou en recherchant les boîtiers SI installés. Appuyez sur Information pour obtenir le statut du port sélectionné.\n\nLecture Interactive vous permet de gérer directement les problèmes tels qu'un numéro de puce erroné. N'utilisez pas cette possibilité quand les coureurs ayant des problèmes sont pris en charge séparément.\n\nLa base de données des coureurs est utilisée si vous voulez ajouter automatiquement de nouveaux coureurs. Les poinçons sont utilisés pour trouver (détecter) la bonne catégorie.
|
||||||
help:50431 = Vous êtes désormais connecté à un serveur. Pour ouvrir une compétition sur le serveur, sélectionnez le dans la liste et cliquer Ouvrir. Ajoutez une compétition au serveur, ouvrez la compétition en local et sélectionnez Télécharger. Quand vous aurez ouvert une compétition sur le serveur, vous pourrez voir tous les autres clients MeOS connectés.
|
help:50431 = Vous êtes désormais connecté à un serveur. Pour ouvrir une compétition sur le serveur, sélectionnez le dans la liste et cliquer Ouvrir. Ajoutez une compétition au serveur, ouvrez la compétition en local et sélectionnez Télécharger. Quand vous aurez ouvert une compétition sur le serveur, vous pourrez voir tous les autres clients MeOS connectés.
|
||||||
help:52726 = Connectez vous à un serveur ci-dessous.\n\nInstallation\nTélécharger et installer MySQL 5 (Community Edition) depuis www.mysql.com. Vous pouvez utiliser la configuration par défaut. Il est uniquement nécessaire d'installer MySQL sur l'ordinateur servant de serveur. Quand MySQL est installé, démarrer MySQL Command Line Client et créez un compte utilisateur pour MeOS. Ecrire quelque chose du genre :\n\n> CREATE USER MeOS;\nGRANT ALL ON *.* TO MeOS;\n\nVous avez maintenant un utilisateur MeOS sans mot de passe. Entrez le nom du serveur ci-dessous (vous pouvez avoir à configurer les pare-feu pour laisser passer le traffic).\n\nComme alternative vous pouvez utiliser le compte root d'origine de MySQL. Le nom d'utilisateur est 'root' et le mot de passe est celui donné lors de l'installation de MySQL.
|
help:52726 = Connectez vous à un serveur ci-dessous.\n\nInstallation\nTélécharger et installer MySQL 5 (Community Edition) depuis www.mysql.com. Vous pouvez utiliser la configuration par défaut. Il est uniquement nécessaire d'installer MySQL sur l'ordinateur servant de serveur. Quand MySQL est installé, démarrer MySQL Command Line Client et créez un compte utilisateur pour MeOS. Ecrire quelque chose du genre :\n\n> CREATE USER MeOS;\nGRANT ALL ON *.* TO MeOS;\n\nVous avez maintenant un utilisateur MeOS sans mot de passe. Entrez le nom du serveur ci-dessous (vous pouvez avoir à configurer les pare-feu pour laisser passer le traffic).\n\nComme alternative vous pouvez utiliser le compte root d'origine de MySQL. Le nom d'utilisateur est 'root' et le mot de passe est celui donné lors de l'installation de MySQL.
|
||||||
help:5422 = Pas de boîtier SI trouvé. Sont-ils connectés et démarrés ?
|
help:5422 = Pas de boîtier SI trouvé. Sont-ils connectés et démarrés ?
|
||||||
|
|||||||
@ -71,14 +71,18 @@ enum GDICOLOR {
|
|||||||
colorGreyBlue = RGB(92, 92, 128),
|
colorGreyBlue = RGB(92, 92, 128),
|
||||||
colorDarkBlue = RGB(0, 0, 92),
|
colorDarkBlue = RGB(0, 0, 92),
|
||||||
colorDarkGreen = RGB(0, 64, 0),
|
colorDarkGreen = RGB(0, 64, 0),
|
||||||
colorYellow = RGB(255, 230, 0),
|
colorYellow = RGB(249, 196, 72),
|
||||||
colorLightBlue = RGB(235, 238, 254),
|
colorLightBlue = RGB(235, 238, 254),
|
||||||
colorLightRed = RGB(255, 230, 230),
|
colorLightRed = RGB(253, 219, 235),
|
||||||
colorLightGreen = RGB(219, 247, 209),
|
colorLightGreen = RGB(219, 247, 209),
|
||||||
colorLightYellow = RGB(248, 248, 216),
|
colorLightYellow = RGB(248, 248, 216),
|
||||||
colorLightCyan = RGB(220, 249, 245),//RGB(200, 255, 255),
|
colorLightCyan = RGB(220, 249, 245),//RGB(200, 255, 255),
|
||||||
colorLightMagenta = RGB(240, 207, 244),//RGB(255, 200, 255),
|
colorLightMagenta = RGB(240, 207, 244),//RGB(255, 200, 255),
|
||||||
colorMediumRed = RGB(255, 200, 200),
|
|
||||||
|
colorMediumRed = RGB(251, 187, 218),
|
||||||
|
colorMediumGreen = RGB(189, 240, 170),
|
||||||
|
colorMediumYellow = RGB(240, 223, 153),
|
||||||
|
|
||||||
colorMediumDarkRed = RGB(240, 120, 120),
|
colorMediumDarkRed = RGB(240, 120, 120),
|
||||||
colorWindowBar = -2,
|
colorWindowBar = -2,
|
||||||
colorDefault = -1,
|
colorDefault = -1,
|
||||||
|
|||||||
@ -81,6 +81,8 @@ extern Image image;
|
|||||||
extern int defaultCodePage;
|
extern int defaultCodePage;
|
||||||
|
|
||||||
GuiHandler &BaseInfo::getHandler() const {
|
GuiHandler &BaseInfo::getHandler() const {
|
||||||
|
if (managedHandler)
|
||||||
|
return *managedHandler;
|
||||||
if (handler == 0)
|
if (handler == 0)
|
||||||
throw meosException("Handler not definied.");
|
throw meosException("Handler not definied.");
|
||||||
return *handler;
|
return *handler;
|
||||||
@ -790,6 +792,8 @@ void gdioutput::timerProc(TimerInfo &timer, DWORD timeout) {
|
|||||||
int timerId = timer.timerId;
|
int timerId = timer.timerId;
|
||||||
if (timer.handler)
|
if (timer.handler)
|
||||||
timer.handler->handle(*this, timer, GUI_TIMER);
|
timer.handler->handle(*this, timer, GUI_TIMER);
|
||||||
|
if (timer.managedHandler)
|
||||||
|
timer.managedHandler->handle(*this, timer, GUI_TIMER);
|
||||||
else if (timer.callBack)
|
else if (timer.callBack)
|
||||||
timer.callBack(this, GUI_TIMER, &timer);
|
timer.callBack(this, GUI_TIMER, &timer);
|
||||||
|
|
||||||
@ -1706,6 +1710,7 @@ bool gdioutput::addItem(const string& id, const vector< pair<wstring, size_t> >&
|
|||||||
if (it->IsCombo) {
|
if (it->IsCombo) {
|
||||||
SendMessage(it->hWnd, CB_RESETCONTENT, 0, 0);
|
SendMessage(it->hWnd, CB_RESETCONTENT, 0, 0);
|
||||||
SendMessage(it->hWnd, CB_INITSTORAGE, items.size(), 48);
|
SendMessage(it->hWnd, CB_INITSTORAGE, items.size(), 48);
|
||||||
|
SendMessage(it->hWnd, WM_SETREDRAW, FALSE, 0);
|
||||||
it->data2Index.clear();
|
it->data2Index.clear();
|
||||||
|
|
||||||
for (size_t k = 0; k < items.size(); k++) {
|
for (size_t k = 0; k < items.size(); k++) {
|
||||||
@ -1713,16 +1718,23 @@ bool gdioutput::addItem(const string& id, const vector< pair<wstring, size_t> >&
|
|||||||
SendMessage(it->hWnd, CB_SETITEMDATA, index, items[k].second);
|
SendMessage(it->hWnd, CB_SETITEMDATA, index, items[k].second);
|
||||||
it->data2Index[items[k].second] = int(index);
|
it->data2Index[items[k].second] = int(index);
|
||||||
}
|
}
|
||||||
|
SendMessage(it->hWnd, WM_SETREDRAW, TRUE, 0);
|
||||||
|
RedrawWindow(it->hWnd, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SendMessage(it->hWnd, LB_RESETCONTENT, 0, 0);
|
SendMessage(it->hWnd, LB_RESETCONTENT, 0, 0);
|
||||||
SendMessage(it->hWnd, LB_INITSTORAGE, items.size(), 48);
|
SendMessage(it->hWnd, LB_INITSTORAGE, items.size(), 48);
|
||||||
|
SendMessage(it->hWnd, WM_SETREDRAW, FALSE, 0);
|
||||||
|
|
||||||
it->data2Index.clear();
|
it->data2Index.clear();
|
||||||
for (size_t k = 0; k < items.size(); k++) {
|
for (size_t k = 0; k < items.size(); k++) {
|
||||||
LRESULT index = SendMessage(it->hWnd, LB_INSERTSTRING, -1, LPARAM(items[k].first.c_str()));
|
LRESULT index = SendMessage(it->hWnd, LB_INSERTSTRING, -1, LPARAM(items[k].first.c_str()));
|
||||||
SendMessage(it->hWnd, LB_SETITEMDATA, index, items[k].second);
|
SendMessage(it->hWnd, LB_SETITEMDATA, index, items[k].second);
|
||||||
it->data2Index[items[k].second] = int(index);
|
it->data2Index[items[k].second] = int(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SendMessage(it->hWnd, WM_SETREDRAW, TRUE, 0);
|
||||||
|
RedrawWindow(it->hWnd, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,6 +32,7 @@ class BaseInfo
|
|||||||
protected:
|
protected:
|
||||||
void *extra;
|
void *extra;
|
||||||
GuiHandler *handler;
|
GuiHandler *handler;
|
||||||
|
shared_ptr<GuiHandler> managedHandler;
|
||||||
bool dataString;
|
bool dataString;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -40,7 +41,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool hasEventHandler() const {
|
bool hasEventHandler() const {
|
||||||
return handler != 0;
|
return handler != 0 || managedHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool handleEvent(gdioutput &gdi, GuiEventType type) {
|
bool handleEvent(gdioutput &gdi, GuiEventType type) {
|
||||||
@ -48,6 +49,10 @@ public:
|
|||||||
handler->handle(gdi, *this, type);
|
handler->handle(gdi, *this, type);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (managedHandler) {
|
||||||
|
managedHandler->handle(gdi, *this, type);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,7 +81,7 @@ public:
|
|||||||
|
|
||||||
GuiHandler &getHandler() const;
|
GuiHandler &getHandler() const;
|
||||||
BaseInfo &setHandler(const GuiHandler *h) {handler = const_cast<GuiHandler *>(h); return *this;}
|
BaseInfo &setHandler(const GuiHandler *h) {handler = const_cast<GuiHandler *>(h); return *this;}
|
||||||
|
BaseInfo &setHandler(const shared_ptr<GuiHandler> &h) { managedHandler = h; return *this; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class RestoreInfo : public BaseInfo
|
class RestoreInfo : public BaseInfo
|
||||||
|
|||||||
@ -918,7 +918,7 @@ help:33940 = Nennungen in Freitext importieren. Nennungen können in dieser Form
|
|||||||
help:41072 = Zum Ändern oder Löschen eines Stempels, Stempel aus der Liste wählen. Fehlende Stempel können über die Bahnvorlage hinzugefügt werden. Fehlt die Zielzeit eines Läufers bekommt dieser den Status Aufgegeben. Fehlt ein Stempel erhält der Läufer den Status Fehlstempel. Es ist nicht möglich einen Status zu setzen der mit den vorhandenen Stempeln nicht übereinstimmt. Ist eine Zielzeit vorhanden, muss diese geändert werden um die Zielzeit zu ändern; das gleiche gilt für die Startzeit bei Startstempel.
|
help:41072 = Zum Ändern oder Löschen eines Stempels, Stempel aus der Liste wählen. Fehlende Stempel können über die Bahnvorlage hinzugefügt werden. Fehlt die Zielzeit eines Läufers bekommt dieser den Status Aufgegeben. Fehlt ein Stempel erhält der Läufer den Status Fehlstempel. Es ist nicht möglich einen Status zu setzen der mit den vorhandenen Stempeln nicht übereinstimmt. Ist eine Zielzeit vorhanden, muss diese geändert werden um die Zielzeit zu ändern; das gleiche gilt für die Startzeit bei Startstempel.
|
||||||
help:41641 = Erste Startzeit und Startintervall angeben. Auslosung ergibt zufällige Losung. Schwedische Losung verteilt Läufer des selben Vereins. Gruppierter Start bedeutet, dass die ganze Kategorie in Kleingruppen laut vorgegebenem Intervall startet (verteilter Massenstart).\n\nIntervall 0 wird für Massenstart angeben.\n\nStartnummern: Erste Nummer angeben oder leer lassen wenn keine Startnummern verwendet werden. Im Feld Strecke wird angegeben welche Strecke gelost werden soll (wenn die Kategorie mehrere Strecken hat).
|
help:41641 = Erste Startzeit und Startintervall angeben. Auslosung ergibt zufällige Losung. Schwedische Losung verteilt Läufer des selben Vereins. Gruppierter Start bedeutet, dass die ganze Kategorie in Kleingruppen laut vorgegebenem Intervall startet (verteilter Massenstart).\n\nIntervall 0 wird für Massenstart angeben.\n\nStartnummern: Erste Nummer angeben oder leer lassen wenn keine Startnummern verwendet werden. Im Feld Strecke wird angegeben welche Strecke gelost werden soll (wenn die Kategorie mehrere Strecken hat).
|
||||||
help:425188 = Nicht angetretene Läufer können verwaltet werden, indem SI-Einheiten (Löschen/Prüfen/Start/Posten) im SI-Manager eingelesen werden, der Import als Semikolon-getrennte Textdatei gespeichert wird und in MeOS importiert wird. Die Läufer, die im Import vorhanden sind erhalten eine Registrierung. Läufer ohne Registrierung können anschließend als <Nicht Angetreten> gesetzt werden.Werden später weitere Läufer importiert, können Läufer, die den Status <Nicht Angetreten> erhalten haben, auf Status <Unbekannt> geändert werden.
|
help:425188 = Nicht angetretene Läufer können verwaltet werden, indem SI-Einheiten (Löschen/Prüfen/Start/Posten) im SI-Manager eingelesen werden, der Import als Semikolon-getrennte Textdatei gespeichert wird und in MeOS importiert wird. Die Läufer, die im Import vorhanden sind erhalten eine Registrierung. Läufer ohne Registrierung können anschließend als <Nicht Angetreten> gesetzt werden.Werden später weitere Läufer importiert, können Läufer, die den Status <Nicht Angetreten> erhalten haben, auf Status <Unbekannt> geändert werden.
|
||||||
help:471101 = SI-Einheit aktivieren, indem die COM-Schnittstelle ausgewählt oder nach angeschlossenen SI-Einheiten gesucht wird. Information wählen um den Status für die ausgewählte Schnittstelle zu erhalten.\n\nInteraktives Einlesen lässt die direkte Bearbeitung von Problemen, wie z.B. falscher SI-Nummer zu. Diese Option nur verwenden, wenn die Läufer mit Problemen nicht besonders behandelt werden.\n\nDie Läuferdatenbank wird verwendet wenn neue Teilnehmer automatisch hinzugefügt werden sollen. Die Stempel auf der SI-Card werden verwendet um die richtige Kategorie zu finden (erraten).
|
info:readoutbase = SI-Einheit aktivieren, indem die COM-Schnittstelle ausgewählt oder nach angeschlossenen SI-Einheiten gesucht wird. Information wählen um den Status für die ausgewählte Schnittstelle zu erhalten.\n\nInteraktives Einlesen lässt die direkte Bearbeitung von Problemen, wie z.B. falscher SI-Nummer zu. Diese Option nur verwenden, wenn die Läufer mit Problemen nicht besonders behandelt werden.\n\nDie Läuferdatenbank wird verwendet wenn neue Teilnehmer automatisch hinzugefügt werden sollen. Die Stempel auf der SI-Card werden verwendet um die richtige Kategorie zu finden (erraten).
|
||||||
help:50431 = Mit keinem Server verbunden. Um einen Wettkampf am Server zu öffnen, aus der Liste auswählen und auf öffnen klicken. Um einen Wettkampf auf den Server hochzuladen, Wettkampf lokal öffnen und hochladen wählen. Wenn ein Wettkampf am Server geöffnet ist, sind alle verbundenen MeOS Klienten sichtbar.
|
help:50431 = Mit keinem Server verbunden. Um einen Wettkampf am Server zu öffnen, aus der Liste auswählen und auf öffnen klicken. Um einen Wettkampf auf den Server hochzuladen, Wettkampf lokal öffnen und hochladen wählen. Wenn ein Wettkampf am Server geöffnet ist, sind alle verbundenen MeOS Klienten sichtbar.
|
||||||
help:52726 = Verbindung mit einem Server.\n\nInstallation\nMySQL 5 (Community Edition) von www.mysql.com herunterladen und installieren. Es können die Standardeinstellungen verwendet werden. Es ist nur notwendig MySQL auf dem Computer, der die Funktion des Servers übernimmt zu installieren. Sobald MySQL installiert ist, MySQL Command Line Client starten und und ein Benutzerkonto für MeOS erstellen. So kann die Kommandozeile lauten:\n\n> CREATE USER meos;\nGRANT ALL ON *.* TO meos;\n\nEin Benutzer meos ohne Passwort wurde erstellt. Namen des Servers angeben (Firewalls müssen eventuell konfiguriert werden um den Datenverkehr zu erlauben).\n\n Alternativ kann der MySQL Root-Account verwendet werden. Der Benutzername ist 'root' und das Passwort ist das bei der Installation von MySQL angegebene.
|
help:52726 = Verbindung mit einem Server.\n\nInstallation\nMySQL 5 (Community Edition) von www.mysql.com herunterladen und installieren. Es können die Standardeinstellungen verwendet werden. Es ist nur notwendig MySQL auf dem Computer, der die Funktion des Servers übernimmt zu installieren. Sobald MySQL installiert ist, MySQL Command Line Client starten und und ein Benutzerkonto für MeOS erstellen. So kann die Kommandozeile lauten:\n\n> CREATE USER meos;\nGRANT ALL ON *.* TO meos;\n\nEin Benutzer meos ohne Passwort wurde erstellt. Namen des Servers angeben (Firewalls müssen eventuell konfiguriert werden um den Datenverkehr zu erlauben).\n\n Alternativ kann der MySQL Root-Account verwendet werden. Der Benutzername ist 'root' und das Passwort ist das bei der Installation von MySQL angegebene.
|
||||||
help:5422 = Keine SI-Einheiten gefunden. Sind sie verbunden und aktiviert?
|
help:5422 = Keine SI-Einheiten gefunden. Sind sie verbunden und aktiviert?
|
||||||
|
|||||||
@ -63,6 +63,7 @@ IOF30Interface::IOF30Interface(oEvent *oe, bool forceSplitFee) : oe(*oe), useGMT
|
|||||||
|
|
||||||
void IOF30Interface::readCourseData(gdioutput &gdi, const xmlobject &xo, bool updateClass,
|
void IOF30Interface::readCourseData(gdioutput &gdi, const xmlobject &xo, bool updateClass,
|
||||||
int &courseCount, int &failed) {
|
int &courseCount, int &failed) {
|
||||||
|
gdi.fillDown();
|
||||||
string ver;
|
string ver;
|
||||||
xo.getObjectString("iofVersion", ver);
|
xo.getObjectString("iofVersion", ver);
|
||||||
if (!ver.empty() && ver > "3.0")
|
if (!ver.empty() && ver > "3.0")
|
||||||
@ -173,7 +174,7 @@ void IOF30Interface::readCourseData(gdioutput &gdi, const xmlobject &xo, bool up
|
|||||||
|
|
||||||
vector<pCourse> presentCrs;
|
vector<pCourse> presentCrs;
|
||||||
pc->getCourses(-1, presentCrs);
|
pc->getCourses(-1, presentCrs);
|
||||||
|
/*
|
||||||
// Check if we have the same set of courses
|
// Check if we have the same set of courses
|
||||||
bool sameSet = presentCrs.size() == classCourses.size();
|
bool sameSet = presentCrs.size() == classCourses.size();
|
||||||
for (pCourse crs : presentCrs) {
|
for (pCourse crs : presentCrs) {
|
||||||
@ -185,7 +186,7 @@ void IOF30Interface::readCourseData(gdioutput &gdi, const xmlobject &xo, bool up
|
|||||||
|
|
||||||
if (sameSet)
|
if (sameSet)
|
||||||
continue; // Do not touch forking if same set
|
continue; // Do not touch forking if same set
|
||||||
|
*/
|
||||||
int fallBackCrs = *classCourses.begin();
|
int fallBackCrs = *classCourses.begin();
|
||||||
map<int, vector<pair<int, int>>> bibToLegCourseId;
|
map<int, vector<pair<int, int>>> bibToLegCourseId;
|
||||||
for (auto &blc : bibLegCourse.second) {
|
for (auto &blc : bibLegCourse.second) {
|
||||||
@ -218,7 +219,7 @@ void IOF30Interface::readCourseData(gdioutput &gdi, const xmlobject &xo, bool up
|
|||||||
// Check if pattern is OK
|
// Check if pattern is OK
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
for (int off = 0; off < period; off++) {
|
for (int off = 0; off < period; off++) {
|
||||||
for (int c = off + period; c < coursePattern.size(); c++) {
|
for (int c = off + period; c < coursePattern.size(); c += period) {
|
||||||
if (!matchCoursePattern(coursePattern[off], coursePattern[c])) {
|
if (!matchCoursePattern(coursePattern[off], coursePattern[c])) {
|
||||||
ok = false;
|
ok = false;
|
||||||
break;
|
break;
|
||||||
@ -259,7 +260,62 @@ void IOF30Interface::readCourseData(gdioutput &gdi, const xmlobject &xo, bool up
|
|||||||
for (unsigned leg = 0; leg < pc->getNumStages() && leg < coursePattern[0].size(); leg++) {
|
for (unsigned leg = 0; leg < pc->getNumStages() && leg < coursePattern[0].size(); leg++) {
|
||||||
pc->clearStageCourses(leg);
|
pc->clearStageCourses(leg);
|
||||||
for (int m = 0; m < period; m++)
|
for (int m = 0; m < period; m++)
|
||||||
pc->addStageCourse(leg, coursePattern[(patternStart + m)%period][leg], -1);
|
pc->addStageCourse(leg, coursePattern[(period - patternStart + m)%period][leg], -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool classHeader = false;
|
||||||
|
auto showClassHeader = [&gdi, pc, &classHeader]() {
|
||||||
|
if (!classHeader) {
|
||||||
|
gdi.dropLine();
|
||||||
|
gdi.addString("", boldText, L"Varningar i X#" + pc->getName()).setColor(colorDarkRed);
|
||||||
|
classHeader = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
oAbstractRunner *missingBib = nullptr;
|
||||||
|
vector<pair<int, pTeam>> teamBibs;
|
||||||
|
vector<pTeam> clsTeam;
|
||||||
|
oe.getTeams(pc->getId(), clsTeam, false);
|
||||||
|
for (pTeam t : clsTeam) {
|
||||||
|
const wstring &b = t->getBib();
|
||||||
|
wstring pre, post;
|
||||||
|
int iBib = extractAnyNumber(b, pre, post);
|
||||||
|
if (iBib > 0) {
|
||||||
|
teamBibs.emplace_back(iBib, t);
|
||||||
|
t->setStartNo(iBib, oBase::ChangeType::Update);
|
||||||
|
t->synchronize(true);
|
||||||
|
for (int leg = 0; leg < t->getNumRunners(); leg++) {
|
||||||
|
pRunner tr = t->getRunner(leg);
|
||||||
|
if (tr) {
|
||||||
|
tr->setStartNo(iBib, oBase::ChangeType::Update);
|
||||||
|
tr->synchronize(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
showClassHeader();
|
||||||
|
gdi.addString("", 0, L"Lag utan nummerlapp: X#" + t->getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort(teamBibs.begin(), teamBibs.end());
|
||||||
|
|
||||||
|
auto getNameAndBib = [](pTeam t) {
|
||||||
|
return t->getName() + L"/" + t->getBib();
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int j = 1; j < teamBibs.size(); j++) {
|
||||||
|
if (teamBibs[j - 1].first < teamBibs[j].first - 1) {
|
||||||
|
showClassHeader();
|
||||||
|
gdi.addString("", 0, L"Saknat lag mellan X och Y#" +
|
||||||
|
getNameAndBib(teamBibs[j - 1].second) + L"#" +
|
||||||
|
getNameAndBib(teamBibs[j].second));
|
||||||
|
}
|
||||||
|
else if (teamBibs[j - 1].first == teamBibs[j].first) {
|
||||||
|
showClassHeader();
|
||||||
|
gdi.addString("", 0, L"Duplicerad nummerlapp: X, Y#" +
|
||||||
|
getNameAndBib(teamBibs[j - 1].second) + L"#" +
|
||||||
|
getNameAndBib(teamBibs[j].second));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,17 +25,17 @@
|
|||||||
|
|
||||||
//ABCDEFGHIJKLMNO
|
//ABCDEFGHIJKLMNO
|
||||||
int getMeosBuild() {
|
int getMeosBuild() {
|
||||||
string revision("$Rev: 1132 $");
|
string revision("$Rev: 1152 $");
|
||||||
return 174 + atoi(revision.substr(5, string::npos).c_str());
|
return 174 + atoi(revision.substr(5, string::npos).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
wstring getMeosDate() {
|
wstring getMeosDate() {
|
||||||
wstring date(L"$Date: 2022-03-23 22:25:26 +0100 (ons, 23 mar 2022) $");
|
wstring date(L"$Date: 2022-05-04 14:47:48 +0200 (ons, 04 maj 2022) $");
|
||||||
return date.substr(7,10);
|
return date.substr(7,10);
|
||||||
}
|
}
|
||||||
|
|
||||||
wstring getBuildType() {
|
wstring getBuildType() {
|
||||||
return L""; // No parantheses (...)
|
return L"U1"; // No parantheses (...)
|
||||||
}
|
}
|
||||||
|
|
||||||
wstring getMajorVersion() {
|
wstring getMajorVersion() {
|
||||||
@ -137,5 +137,13 @@ void getSupporters(vector<wstring> &supp, vector<wstring> &developSupp)
|
|||||||
supp.emplace_back(L"Hans Carlstedt, Sävedalens AIK");
|
supp.emplace_back(L"Hans Carlstedt, Sävedalens AIK");
|
||||||
supp.emplace_back(L"O-Liceo, Spain");
|
supp.emplace_back(L"O-Liceo, Spain");
|
||||||
developSupp.emplace_back(L"Västerviks OK");
|
developSupp.emplace_back(L"Västerviks OK");
|
||||||
|
supp.emplace_back(L"Ljusne Ala OK");
|
||||||
|
supp.emplace_back(L"Sävedalens AIK");
|
||||||
|
supp.emplace_back(L"Foothills Wanderers Orienteering Club");
|
||||||
|
supp.emplace_back(L"OK Gripen");
|
||||||
|
supp.emplace_back(L"Per Ågren, OK Enen");
|
||||||
|
supp.emplace_back(L"OK Roslagen");
|
||||||
|
supp.emplace_back(L"OK Kolmården");
|
||||||
|
|
||||||
reverse(supp.begin(), supp.end());
|
reverse(supp.begin(), supp.end());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -394,6 +394,10 @@ void oListParam::getCustomTitle(wchar_t *t) const
|
|||||||
wcscpy_s(t, 256, makeDash(title).c_str());
|
wcscpy_s(t, 256, makeDash(title).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool oListParam::filterInclude(int count, const oAbstractRunner *r) const {
|
||||||
|
return filterMaxPer == 0 || count <= filterMaxPer || (r != nullptr && r == alwaysInclude);
|
||||||
|
}
|
||||||
|
|
||||||
const wstring &oListParam::getCustomTitle(const wstring &t) const
|
const wstring &oListParam::getCustomTitle(const wstring &t) const
|
||||||
{
|
{
|
||||||
if (!title.empty())
|
if (!title.empty())
|
||||||
|
|||||||
@ -788,6 +788,10 @@ void oCard::adaptTimes(int startTime) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
wstring oCard::getCardVoltage() const {
|
wstring oCard::getCardVoltage() const {
|
||||||
|
return getCardVoltage(miliVolt);
|
||||||
|
}
|
||||||
|
|
||||||
|
wstring oCard::getCardVoltage(int miliVolt) {
|
||||||
if (miliVolt == 0)
|
if (miliVolt == 0)
|
||||||
return L"";
|
return L"";
|
||||||
int vi = miliVolt / 1000;
|
int vi = miliVolt / 1000;
|
||||||
@ -799,6 +803,10 @@ wstring oCard::getCardVoltage() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
oCard::BatteryStatus oCard::isCriticalCardVoltage() const {
|
oCard::BatteryStatus oCard::isCriticalCardVoltage() const {
|
||||||
|
return isCriticalCardVoltage(miliVolt);
|
||||||
|
}
|
||||||
|
|
||||||
|
oCard::BatteryStatus oCard::isCriticalCardVoltage(int miliVolt) {
|
||||||
if (miliVolt > 0 && miliVolt < 2445)
|
if (miliVolt > 0 && miliVolt < 2445)
|
||||||
return BatteryStatus::Bad;
|
return BatteryStatus::Bad;
|
||||||
else if (miliVolt > 0 && miliVolt <= 2710)
|
else if (miliVolt > 0 && miliVolt <= 2710)
|
||||||
|
|||||||
@ -75,12 +75,15 @@ public:
|
|||||||
|
|
||||||
void setMeasuredVoltage(int miliVolt) { this->miliVolt = miliVolt; }
|
void setMeasuredVoltage(int miliVolt) { this->miliVolt = miliVolt; }
|
||||||
wstring getCardVoltage() const;
|
wstring getCardVoltage() const;
|
||||||
|
static wstring getCardVoltage(int miliVolt);
|
||||||
|
|
||||||
enum class BatteryStatus {
|
enum class BatteryStatus {
|
||||||
OK,
|
OK,
|
||||||
Warning,
|
Warning,
|
||||||
Bad
|
Bad
|
||||||
};
|
};
|
||||||
BatteryStatus isCriticalCardVoltage() const;
|
BatteryStatus isCriticalCardVoltage() const;
|
||||||
|
static BatteryStatus isCriticalCardVoltage(int miliVolt);
|
||||||
|
|
||||||
static const shared_ptr<Table> &getTable(oEvent *oe);
|
static const shared_ptr<Table> &getTable(oEvent *oe);
|
||||||
|
|
||||||
|
|||||||
@ -181,6 +181,7 @@ static void generateNBestHead(const oListParam &par, oListInfo &li, int ypos) {
|
|||||||
if (par.filterMaxPer > 0)
|
if (par.filterMaxPer > 0)
|
||||||
li.addHead(oPrintPost(lString, lang.tl(L"Visar de X bästa#" + itow(par.filterMaxPer)), normalText, 0, ypos));
|
li.addHead(oPrintPost(lString, lang.tl(L"Visar de X bästa#" + itow(par.filterMaxPer)), normalText, 0, ypos));
|
||||||
}
|
}
|
||||||
|
|
||||||
extern gdioutput *gdi_main;
|
extern gdioutput *gdi_main;
|
||||||
|
|
||||||
static pair<wstring, bool> getControlName(const oEvent &oe, int courseContolId) {
|
static pair<wstring, bool> getControlName(const oEvent &oe, int courseContolId) {
|
||||||
@ -2874,7 +2875,7 @@ GeneralResult *oListInfo::applyResultModule(oEvent &oe, vector<pRunner> &rlist)
|
|||||||
void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool formatHead) {
|
void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool formatHead) {
|
||||||
li.setupLinks();
|
li.setupLinks();
|
||||||
pClass sampleClass = 0;
|
pClass sampleClass = 0;
|
||||||
|
bool calculatedSplitResults = false;
|
||||||
if (!li.lp.selection.empty())
|
if (!li.lp.selection.empty())
|
||||||
sampleClass = getClass(*li.lp.selection.begin());
|
sampleClass = getClass(*li.lp.selection.begin());
|
||||||
if (!sampleClass && !Classes.empty())
|
if (!sampleClass && !Classes.empty())
|
||||||
@ -2896,8 +2897,10 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (li.calcResults) {
|
if (li.calcResults) {
|
||||||
if (li.lp.useControlIdResultTo > 0 || li.lp.useControlIdResultFrom > 0)
|
if (li.lp.useControlIdResultTo > 0 || li.lp.useControlIdResultFrom > 0) {
|
||||||
calculateSplitResults(li.lp.useControlIdResultFrom, li.lp.useControlIdResultTo);
|
calculateSplitResults(li.lp.useControlIdResultFrom, li.lp.useControlIdResultTo);
|
||||||
|
calculatedSplitResults = true;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
calculateTeamResults(li.lp.selection, ResultType::ClassResult);
|
calculateTeamResults(li.lp.selection, ResultType::ClassResult);
|
||||||
calculateResults(li.lp.selection, ResultType::ClassResult);
|
calculateResults(li.lp.selection, ResultType::ClassResult);
|
||||||
@ -2925,11 +2928,11 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
|
|||||||
if (li.calcCourseResults)
|
if (li.calcCourseResults)
|
||||||
calculateResults(li.lp.selection, ResultType::CourseResult);
|
calculateResults(li.lp.selection, ResultType::CourseResult);
|
||||||
|
|
||||||
//pair<int, bool> info = li.lp.getLegInfo(sampleClass);
|
|
||||||
//sortTeams(li.sortOrder, info.first, info.second);
|
|
||||||
if (li.calcResults) {
|
if (li.calcResults) {
|
||||||
if (li.lp.useControlIdResultTo > 0 || li.lp.useControlIdResultFrom > 0)
|
if (li.lp.useControlIdResultTo > 0 || li.lp.useControlIdResultFrom > 0) {
|
||||||
calculateSplitResults(li.lp.useControlIdResultFrom, li.lp.useControlIdResultTo);
|
calculateSplitResults(li.lp.useControlIdResultFrom, li.lp.useControlIdResultTo);
|
||||||
|
calculatedSplitResults = true;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
calculateResults(li.lp.selection, ResultType::ClassResult);
|
calculateResults(li.lp.selection, ResultType::ClassResult);
|
||||||
}
|
}
|
||||||
@ -2994,7 +2997,7 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
|
|||||||
rlist.push_back(r);
|
rlist.push_back(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (li.sortOrder != Custom)
|
if (li.sortOrder != Custom && !calculatedSplitResults)
|
||||||
sortRunners(li.sortOrder, rlist);
|
sortRunners(li.sortOrder, rlist);
|
||||||
|
|
||||||
GeneralResult *gResult = li.applyResultModule(*this, rlist);
|
GeneralResult *gResult = li.applyResultModule(*this, rlist);
|
||||||
@ -3022,7 +3025,7 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
|
|||||||
formatPrintPost(li.subHead, printPostInfo, it->tInTeam, &*it, it->Club, it->getClassRef(true),
|
formatPrintPost(li.subHead, printPostInfo, it->tInTeam, &*it, it->Club, it->getClassRef(true),
|
||||||
nullptr, nullptr, nullptr, -1);
|
nullptr, nullptr, nullptr, -1);
|
||||||
}
|
}
|
||||||
if (li.lp.filterMaxPer == 0 || printPostInfo.counter.level2 < li.lp.filterMaxPer) {
|
if (li.lp.filterInclude(printPostInfo.counter.level2 + 1, rlist[k])) {
|
||||||
printPostInfo.reset();
|
printPostInfo.reset();
|
||||||
printPostInfo.par.relayLegIndex = it->tLeg;
|
printPostInfo.par.relayLegIndex = it->tLeg;
|
||||||
formatPrintPost(li.listPost, printPostInfo, it->tInTeam, &*it, it->Club, it->getClassRef(true),
|
formatPrintPost(li.listPost, printPostInfo, it->tInTeam, &*it, it->Club, it->getClassRef(true),
|
||||||
@ -3142,11 +3145,11 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
|
|||||||
nullptr, nullptr, nullptr, -1);
|
nullptr, nullptr, nullptr, -1);
|
||||||
}
|
}
|
||||||
++printPostInfo.counter;
|
++printPostInfo.counter;
|
||||||
if (li.lp.filterMaxPer == 0 || printPostInfo.counter.level2 <= li.lp.filterMaxPer) {
|
if (li.lp.filterInclude(printPostInfo.counter.level2, it)) {
|
||||||
printPostInfo.counter.level3 = 0;
|
printPostInfo.counter.level3 = 0;
|
||||||
printPostInfo.reset();
|
printPostInfo.reset();
|
||||||
printPostInfo.par.relayLegIndex = linearLegSpec;
|
printPostInfo.par.relayLegIndex = linearLegSpec;
|
||||||
formatPrintPost(li.listPost, printPostInfo, &*it, 0, it->Club, it->Class,
|
formatPrintPost(li.listPost, printPostInfo, it, 0, it->Club, it->Class,
|
||||||
nullptr, nullptr, nullptr, -1);
|
nullptr, nullptr, nullptr, -1);
|
||||||
|
|
||||||
if (li.subListPost.empty())
|
if (li.subListPost.empty())
|
||||||
@ -3322,11 +3325,11 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
|
|||||||
startClub = true;
|
startClub = true;
|
||||||
}
|
}
|
||||||
++printPostInfo.counter;
|
++printPostInfo.counter;
|
||||||
if (li.lp.filterMaxPer == 0 || printPostInfo.counter.level2 <= li.lp.filterMaxPer) {
|
if (li.lp.filterInclude(printPostInfo.counter.level2, rit)) {
|
||||||
printPostInfo.counter.level3 = 0;
|
printPostInfo.counter.level3 = 0;
|
||||||
printPostInfo.reset();
|
printPostInfo.reset();
|
||||||
printPostInfo.par.relayLegIndex = rit->tLeg;
|
printPostInfo.par.relayLegIndex = rit->tLeg;
|
||||||
formatPrintPost(li.listPost, printPostInfo, nullptr, &*rit, &*it, rit->getClassRef(true),
|
formatPrintPost(li.listPost, printPostInfo, nullptr, rit, &*it, rit->getClassRef(true),
|
||||||
nullptr, nullptr, nullptr, -1);
|
nullptr, nullptr, nullptr, -1);
|
||||||
|
|
||||||
if (li.listSubType == li.EBaseTypeCoursePunches ||
|
if (li.listSubType == li.EBaseTypeCoursePunches ||
|
||||||
@ -3371,7 +3374,7 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
|
|||||||
formatPrintPost(li.subHead, printPostInfo, nullptr,
|
formatPrintPost(li.subHead, printPostInfo, nullptr,
|
||||||
nullptr, nullptr, nullptr, &*it, nullptr, nullptr, 0);
|
nullptr, nullptr, nullptr, &*it, nullptr, nullptr, 0);
|
||||||
}
|
}
|
||||||
if (li.lp.filterMaxPer == 0 || printPostInfo.counter.level2 < li.lp.filterMaxPer) {
|
if (li.lp.filterInclude(printPostInfo.counter.level2 + 1, nullptr)) {
|
||||||
printPostInfo.reset();
|
printPostInfo.reset();
|
||||||
formatPrintPost(li.listPost, printPostInfo, nullptr, nullptr, nullptr,
|
formatPrintPost(li.listPost, printPostInfo, nullptr, nullptr, nullptr,
|
||||||
nullptr, &*it, nullptr, nullptr, 0);
|
nullptr, &*it, nullptr, nullptr, 0);
|
||||||
@ -3404,7 +3407,7 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
|
|||||||
formatPrintPost(li.subHead, printPostInfo, nullptr, nullptr, nullptr,
|
formatPrintPost(li.subHead, printPostInfo, nullptr, nullptr, nullptr,
|
||||||
nullptr, nullptr, &*it, nullptr, 0);
|
nullptr, nullptr, &*it, nullptr, 0);
|
||||||
}
|
}
|
||||||
if (li.lp.filterMaxPer == 0 || printPostInfo.counter.level2 < li.lp.filterMaxPer) {
|
if (li.lp.filterInclude(printPostInfo.counter.level2 + 1, nullptr)) {
|
||||||
printPostInfo.reset();
|
printPostInfo.reset();
|
||||||
formatPrintPost(li.listPost, printPostInfo, nullptr, nullptr, nullptr,
|
formatPrintPost(li.listPost, printPostInfo, nullptr, nullptr, nullptr,
|
||||||
nullptr, nullptr, &*it, nullptr, 0);
|
nullptr, nullptr, &*it, nullptr, 0);
|
||||||
|
|||||||
@ -339,6 +339,7 @@ struct oListParam {
|
|||||||
a.useControlIdResultFrom == useControlIdResultFrom &&
|
a.useControlIdResultFrom == useControlIdResultFrom &&
|
||||||
a.useControlIdResultTo == useControlIdResultTo &&
|
a.useControlIdResultTo == useControlIdResultTo &&
|
||||||
a.filterMaxPer == filterMaxPer &&
|
a.filterMaxPer == filterMaxPer &&
|
||||||
|
a.alwaysInclude == alwaysInclude &&
|
||||||
a.pageBreak == pageBreak &&
|
a.pageBreak == pageBreak &&
|
||||||
a.showHeader == showHeader &&
|
a.showHeader == showHeader &&
|
||||||
a.showInterTimes == showInterTimes &&
|
a.showInterTimes == showInterTimes &&
|
||||||
@ -369,7 +370,12 @@ struct oListParam {
|
|||||||
|
|
||||||
int useControlIdResultTo;
|
int useControlIdResultTo;
|
||||||
int useControlIdResultFrom;
|
int useControlIdResultFrom;
|
||||||
|
|
||||||
|
// Max number shown per class/class etc
|
||||||
int filterMaxPer;
|
int filterMaxPer;
|
||||||
|
const oAbstractRunner *alwaysInclude = nullptr;
|
||||||
|
bool filterInclude(int count, const oAbstractRunner *r) const;
|
||||||
|
|
||||||
bool pageBreak;
|
bool pageBreak;
|
||||||
bool showHeader = true;
|
bool showHeader = true;
|
||||||
bool showInterTimes;
|
bool showInterTimes;
|
||||||
|
|||||||
@ -5078,7 +5078,7 @@ void oRunner::printSplits(gdioutput& gdi) const {
|
|||||||
auto stat = getCard()->isCriticalCardVoltage();
|
auto stat = getCard()->isCriticalCardVoltage();
|
||||||
wstring warning;
|
wstring warning;
|
||||||
if (stat == oCard::BatteryStatus::Bad)
|
if (stat == oCard::BatteryStatus::Bad)
|
||||||
warning = lang.tl("Replace");
|
warning = lang.tl("Replace[battery]");
|
||||||
else if (stat == oCard::BatteryStatus::Warning)
|
else if (stat == oCard::BatteryStatus::Warning)
|
||||||
warning = lang.tl("Low");
|
warning = lang.tl("Low");
|
||||||
else
|
else
|
||||||
@ -5718,15 +5718,18 @@ int oRunner::getMissedTime(int ctrlNo) const {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
wstring oRunner::getMissedTimeS() const
|
int oRunner::getMissedTime() const {
|
||||||
{
|
|
||||||
setupRunnerStatistics();
|
setupRunnerStatistics();
|
||||||
int t = 0;
|
int t = 0;
|
||||||
for (size_t k = 0; k<tMissedTime.size(); k++)
|
for (size_t k = 0; k < tMissedTime.size(); k++) {
|
||||||
if (tMissedTime[k] > 0)
|
if (tMissedTime[k] > 0)
|
||||||
t += tMissedTime[k];
|
t += tMissedTime[k];
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
return getTimeMS(t);
|
wstring oRunner::getMissedTimeS() const {
|
||||||
|
return getTimeMS(getMissedTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
wstring oRunner::getMissedTimeS(int ctrlNo) const
|
wstring oRunner::getMissedTimeS(int ctrlNo) const
|
||||||
@ -6889,3 +6892,25 @@ int oRunner::getStartGroup(bool useTmpStartGroup) const {
|
|||||||
void oRunner::setStartGroup(int sg) {
|
void oRunner::setStartGroup(int sg) {
|
||||||
getDI().setInt("StartGroup", sg);
|
getDI().setInt("StartGroup", sg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool oAbstractRunner::isStatusOK(bool computed) const {
|
||||||
|
RunnerStatus st = computed ? getStatusComputed() : getStatus();
|
||||||
|
if (st == StatusOK)
|
||||||
|
return true;
|
||||||
|
else if (st == StatusOutOfCompetition || st == StatusNoTiming) {
|
||||||
|
int rt = getRunningTime(computed);
|
||||||
|
return rt > 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool oAbstractRunner::isStatusUnknown(bool computed) const {
|
||||||
|
RunnerStatus st = computed ? getStatusComputed() : getStatus();
|
||||||
|
if (st == StatusUnknown)
|
||||||
|
return true;
|
||||||
|
else if (st == StatusOutOfCompetition || st == StatusNoTiming) {
|
||||||
|
int rt = getRunningTime(computed);
|
||||||
|
return rt == 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@ -396,6 +396,13 @@ public:
|
|||||||
|
|
||||||
RunnerStatus getStatusComputed() const { return tComputedStatus != StatusUnknown ? tComputedStatus : tStatus; }
|
RunnerStatus getStatusComputed() const { return tComputedStatus != StatusUnknown ? tComputedStatus : tStatus; }
|
||||||
virtual RunnerStatus getStatus() const { return tStatus;}
|
virtual RunnerStatus getStatus() const { return tStatus;}
|
||||||
|
|
||||||
|
/** Status OK, including NoTiming/OutOfCompetition*/
|
||||||
|
bool isStatusOK(bool computed) const;
|
||||||
|
|
||||||
|
/** Status unknown, including NoTiming/OutOfCompetition*/
|
||||||
|
bool isStatusUnknown(bool computed) const;
|
||||||
|
|
||||||
inline bool statusOK(bool computed) const {return (computed ? getStatusComputed() : tStatus) == StatusOK;}
|
inline bool statusOK(bool computed) const {return (computed ? getStatusComputed() : tStatus) == StatusOK;}
|
||||||
inline bool prelStatusOK(bool computed, bool includeOutsideCompetition) const {
|
inline bool prelStatusOK(bool computed, bool includeOutsideCompetition) const {
|
||||||
bool ok = statusOK(computed) || (tStatus == StatusUnknown && getRunningTime(false) > 0);
|
bool ok = statusOK(computed) || (tStatus == StatusUnknown && getRunningTime(false) > 0);
|
||||||
@ -786,6 +793,7 @@ public:
|
|||||||
wstring getMissedTimeS() const;
|
wstring getMissedTimeS() const;
|
||||||
wstring getMissedTimeS(int ctrlNo) const;
|
wstring getMissedTimeS(int ctrlNo) const;
|
||||||
|
|
||||||
|
int getMissedTime() const;
|
||||||
int getMissedTime(int ctrlNo) const;
|
int getMissedTime(int ctrlNo) const;
|
||||||
int getLegPlace(int ctrlNo) const;
|
int getLegPlace(int ctrlNo) const;
|
||||||
int getLegTimeAfter(int ctrlNo) const;
|
int getLegTimeAfter(int ctrlNo) const;
|
||||||
|
|||||||
@ -2053,9 +2053,21 @@ pair<int, bool> oTeam::inputData(int id, const wstring &input,
|
|||||||
synchronize(false);
|
synchronize(false);
|
||||||
|
|
||||||
if (id>1000) {
|
if (id>1000) {
|
||||||
|
const wstring &preBib = getDCI().getString("Bib");
|
||||||
auto res = oe->oTeamData->inputData(this, id, input,
|
auto res = oe->oTeamData->inputData(this, id, input,
|
||||||
inputId, output, noUpdate);
|
inputId, output, noUpdate);
|
||||||
|
|
||||||
|
const wstring &postBib = getDCI().getString("Bib");
|
||||||
|
|
||||||
|
if (preBib != postBib) {
|
||||||
|
wchar_t pat[32];
|
||||||
|
int no = oClass::extractBibPattern(postBib, pat);
|
||||||
|
if (no > 0)
|
||||||
|
setStartNo(no, ChangeType::Update);
|
||||||
|
|
||||||
applyBibs();
|
applyBibs();
|
||||||
|
}
|
||||||
|
|
||||||
evaluate(oBase::ChangeType::Update);
|
evaluate(oBase::ChangeType::Update);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1723,8 +1723,8 @@ help:31661 = Установите время закрытия старта. По
|
|||||||
help:33940 = Импорт заявок в свободной форме. Укажите имя, клуб, группу и чип (так же можно указать стартовое время), разделённые запятыми. Один участник должен занимать одну строку.
|
help:33940 = Импорт заявок в свободной форме. Укажите имя, клуб, группу и чип (так же можно указать стартовое время), разделённые запятыми. Один участник должен занимать одну строку.
|
||||||
help:41072 = Выберите из списка, чтобы изменить или удалить отметку. Вы можете добавить недостающие отметки из шаблона дистанции. Если время отсутствует, участник получает статус <DNF>. Если отметки не хватает, статус – <DSQ>. Невозможно присвоить статус неправильная отметка. Если есть отметка, необходимо изменить его установить время вручную. Тот же принцип применяется для стартовой отметки
|
help:41072 = Выберите из списка, чтобы изменить или удалить отметку. Вы можете добавить недостающие отметки из шаблона дистанции. Если время отсутствует, участник получает статус <DNF>. Если отметки не хватает, статус – <DSQ>. Невозможно присвоить статус неправильная отметка. Если есть отметка, необходимо изменить его установить время вручную. Тот же принцип применяется для стартовой отметки
|
||||||
help:41641 = Введите время старта первого участника и стартовый интервал. Случайная жеребьёвка позволяет перемешать стартовый протокол в случайном порядке. Шведский алгоритм использует специальные правила для распределение участников из одной команды по всему протоколу. Групповой старт позволяет запускать по несколько участников на одной минуте (расширенный масс-старт). В поле этап вы можете указать какой этап должен быть прожеребьёван, в случае если в группе несколько этапов.
|
help:41641 = Введите время старта первого участника и стартовый интервал. Случайная жеребьёвка позволяет перемешать стартовый протокол в случайном порядке. Шведский алгоритм использует специальные правила для распределение участников из одной команды по всему протоколу. Групповой старт позволяет запускать по несколько участников на одной минуте (расширенный масс-старт). В поле этап вы можете указать какой этап должен быть прожеребьёван, в случае если в группе несколько этапов.
|
||||||
help:425188 = Вы можете автоматически указать не стартовавших участников считав память из станций (очистка/проверка/старт/КП) в SI-Config'e. Сохраните считанный файл как CSV-файл и укажите его нажав импорт отметок. В результате найденные участники пройдут регистрацию. Затем вы можете присвоить статус DNS участникам без регистрации. Также вы можете сбросить статус у стартовавших участник нажав кнопку сброс.
|
help:425188 = Вы можете автоматически указать не стартовавших участников считав память из станций (очистка/проверка/старт/КП) в SportIdent Config+'e. Сохраните считанный файл как CSV-файл и укажите его нажав импорт отметок. В результате найденные участники пройдут регистрацию. Затем вы можете присвоить статус DNS участникам без регистрации. Также вы можете сбросить статус у стартовавших участник нажав кнопку сброс.
|
||||||
help:471101 = Активируйте SI станцию выбрав необходимый COM-порт или нажав Автопоиск и запуск. Для получения статус выбранного порта нажмите Информация.\n\nИнтерактивное считывание позволяет оперативно решать проблемы с неверными номерами чипов. Не используйте эту опцию в случаях, когда подобные проблемы решаются отдельно.\n\nБаза участников используется в случае если вы хотите автоматически добавлять новых участников в протокол. По считанным отметкам программа автоматически определяет группу участника
|
info:readoutbase = Активируйте SI станцию выбрав необходимый COM-порт или нажав Автопоиск и запуск. Для получения статус выбранного порта нажмите Информация.\n\nИнтерактивное считывание позволяет оперативно решать проблемы с неверными номерами чипов. Не используйте эту опцию в случаях, когда подобные проблемы решаются отдельно.\n\nБаза участников используется в случае если вы хотите автоматически добавлять новых участников в протокол. По считанным отметкам программа автоматически определяет группу участника
|
||||||
help:50431 = "Вы подключены к серверу. Для открытия протокола на сервере выберите его в списке и нажмите ""Открыть"". Для добавление соревнований на сервер откройте его локально и нажмите ""Загрузить на сервер"". После открытия соревнований на сервере вы можете увидеть всех подключенных MeOS клиентов."
|
help:50431 = "Вы подключены к серверу. Для открытия протокола на сервере выберите его в списке и нажмите ""Открыть"". Для добавление соревнований на сервер откройте его локально и нажмите ""Загрузить на сервер"". После открытия соревнований на сервере вы можете увидеть всех подключенных MeOS клиентов."
|
||||||
help:52726 = "Перед подключением к серверу.\n\nУстановка\nСкачайте и установите MySQL 5 (Community Edition) с сайта www.mysql.com. Можно использовать настройки ""по-умолчанию"". MySQL необходимо устанавливать только на компьютер используемый в качестве сервера. После того как MySQL установится, запустите MySQL Command Line Client и выполните следующие команды:\n\n> CREATE USER meos;\nGRANT ALL ON *.* TO meos;\n\nТаким образом вы создали пользователя meos без пароля. Введите адрес сервера в поле ниже.\n\nКак альтернатива, вы можете использовать root доступ к MySQL. Имя пользоватлея 'root' и пароль указанный при установке MySQL."
|
help:52726 = "Перед подключением к серверу.\n\nУстановка\nСкачайте и установите MySQL 5 (Community Edition) с сайта www.mysql.com. Можно использовать настройки ""по-умолчанию"". MySQL необходимо устанавливать только на компьютер используемый в качестве сервера. После того как MySQL установится, запустите MySQL Command Line Client и выполните следующие команды:\n\n> CREATE USER meos;\nGRANT ALL ON *.* TO meos;\n\nТаким образом вы создали пользователя meos без пароля. Введите адрес сервера в поле ниже.\n\nКак альтернатива, вы можете использовать root доступ к MySQL. Имя пользоватлея 'root' и пароль указанный при установке MySQL."
|
||||||
help:5422 = Ни одна SI станция не найдена.
|
help:5422 = Ни одна SI станция не найдена.
|
||||||
|
|||||||
@ -1317,8 +1317,8 @@ help:31661 = Un reinicio se define por un tiempo de sorteo y un tiempo de reini
|
|||||||
help:33940 = Importar Inscripciones en formato de texto libre. Especifique el nombre, el club, la Categoria y el número de tarjeta (posiblemente también la hora de inicio), preferiblemente separados por comas, una persona (equipo) por fila. También es posible especificar muchos competidores en el mismo club / Categoria omitiendo en parte estos campos. También es posible importar datos formateados de otras maneras.
|
help:33940 = Importar Inscripciones en formato de texto libre. Especifique el nombre, el club, la Categoria y el número de tarjeta (posiblemente también la hora de inicio), preferiblemente separados por comas, una persona (equipo) por fila. También es posible especificar muchos competidores en el mismo club / Categoria omitiendo en parte estos campos. También es posible importar datos formateados de otras maneras.
|
||||||
help:41072 = Seleccione un Ticada de la lista para cambiarlo o eliminarlo. Puede agregar Ticadas perdidos desde la plantilla del recorrido. Si falta el tiempo de finalización, el corredor obtiene el estado <No finalizó>. Si falta un Ticada, el estado es <Ticadas perdida>. No es posible asignar un estado incompatible con los Ticadas. Si hay un Ticada de finalización, debe modificarlo para establecer un tiempo de finalización manual. El mismo principio se aplica para el ticada inicial.
|
help:41072 = Seleccione un Ticada de la lista para cambiarlo o eliminarlo. Puede agregar Ticadas perdidos desde la plantilla del recorrido. Si falta el tiempo de finalización, el corredor obtiene el estado <No finalizó>. Si falta un Ticada, el estado es <Ticadas perdida>. No es posible asignar un estado incompatible con los Ticadas. Si hay un Ticada de finalización, debe modificarlo para establecer un tiempo de finalización manual. El mismo principio se aplica para el ticada inicial.
|
||||||
help:41641 = Ingrese una primera hora de inicio y un intervalo de inicio. Draw random da un orden de inicio incondicionalmente aleatorio. El método de sorteo sueco utiliza reglas especiales para distribuir corredores del mismo club. Inicio agrupado significa que toda la Categoria comienza en pequeños grupos durante el intervalo especificado (inicio masivo extendido). En el tramo de campo, puede especificar qué tramo se Configurará, si la Categoria tiene varios.
|
help:41641 = Ingrese una primera hora de inicio y un intervalo de inicio. Draw random da un orden de inicio incondicionalmente aleatorio. El método de sorteo sueco utiliza reglas especiales para distribuir corredores del mismo club. Inicio agrupado significa que toda la Categoria comienza en pequeños grupos durante el intervalo especificado (inicio masivo extendido). En el tramo de campo, puede especificar qué tramo se Configurará, si la Categoria tiene varios.
|
||||||
help:425188 = Puede manejar corredores que no se iniciaron automáticamente al leer las estaciones SI (borrar / verificar / iniciar / controles) en SIConfig. Guarde la lectura como un archivo de texto separado por punto y coma e importe este archivo a MeOS. Los corredores en esta importación obtienen un registro. Luego puede dar el estado DNS a todos los corredores sin registrarse. Si luego importa más corredores, puede restablecer el estado (de DNS a Desconocido) en los corredores ahora importados.
|
help:425188 = Puede manejar corredores que no se iniciaron automáticamente al leer las estaciones SI (borrar / verificar / iniciar / controles) en SportIdent Config+. Guarde la lectura como un archivo de texto separado por punto y coma e importe este archivo a MeOS. Los corredores en esta importación obtienen un registro. Luego puede dar el estado DNS a todos los corredores sin registrarse. Si luego importa más corredores, puede restablecer el estado (de DNS a Desconocido) en los corredores ahora importados.
|
||||||
help:471101 = Active la unidad SI seleccionando su puerto COM o buscando unidades SI instaladas. Presione Información para obtener el estado del puerto seleccionado. La lectura interactiva le permite manejar problemas directamente, como un número de tarjeta incorrecto. No use esta opción cuando los corredores con problemas se manejan por separado. La base de datos de corredores se usa si desea agregar automáticamente nuevos corredores. Las Ticadas se utilizan para encontrar (adivinar) la Categoria correcta.
|
info:readoutbase = Active la unidad SI seleccionando su puerto COM o buscando unidades SI instaladas. Presione Información para obtener el estado del puerto seleccionado. La lectura interactiva le permite manejar problemas directamente, como un número de tarjeta incorrecto. No use esta opción cuando los corredores con problemas se manejan por separado. La base de datos de corredores se usa si desea agregar automáticamente nuevos corredores. Las Ticadas se utilizan para encontrar (adivinar) la Categoria correcta.
|
||||||
help:50431 =Ahora estás conectado a un servidor. Para abrir una competicion en el servidor, selecciónela en la lista y haga clic en abrir. Agregue una competicion al servidor, abra la competicion localmente y seleccione cargar. Cuando haya abierto una competicion en el servidor, verá todos los demás clientes MeOS conectados.
|
help:50431 =Ahora estás conectado a un servidor. Para abrir una competicion en el servidor, selecciónela en la lista y haga clic en abrir. Agregue una competicion al servidor, abra la competicion localmente y seleccione cargar. Cuando haya abierto una competicion en el servidor, verá todos los demás clientes MeOS conectados.
|
||||||
help:52726 = Conéctese a un servidor a continuación. Instalación Descargue e instale MySQL 5 (Community Edition) desde www.mysql.com. Puede usar la configuración predeterminada. Solo es necesario instalar MySQL en el servidor de computadora. Cuando MySQL esté instalado, inicie MySQL Command Line Client y cree una cuenta de usuario para MeOS. Escribe así: > CREAR meos de USUARIO; GANTAR TODO EN *. * TO meos; Ahora ha creado un meos de usuario sin contraseña. Ingrese el nombre del servidor a continuación (es posible que deba configurar firewalls para permitir el paso del tráfico). Como alternativa, puede usar la cuenta raíz incorporada de MySQL. El nombre de usuario es 'root' y la contraseña es la que proporcionó al instalar MySQL.
|
help:52726 = Conéctese a un servidor a continuación. Instalación Descargue e instale MySQL 5 (Community Edition) desde www.mysql.com. Puede usar la configuración predeterminada. Solo es necesario instalar MySQL en el servidor de computadora. Cuando MySQL esté instalado, inicie MySQL Command Line Client y cree una cuenta de usuario para MeOS. Escribe así: > CREAR meos de USUARIO; GANTAR TODO EN *. * TO meos; Ahora ha creado un meos de usuario sin contraseña. Ingrese el nombre del servidor a continuación (es posible que deba configurar firewalls para permitir el paso del tráfico). Como alternativa, puede usar la cuenta raíz incorporada de MySQL. El nombre de usuario es 'root' y la contraseña es la que proporcionó al instalar MySQL.
|
||||||
help:5422 = No se ha encontrado ninguna unidad SI. ¿Están conectados y activados?
|
help:5422 = No se ha encontrado ninguna unidad SI. ¿Están conectados y activados?
|
||||||
|
|||||||
@ -1312,8 +1312,9 @@ help:31661 = En omstart definieras av en repdragningstid och en omstartstid. Vid
|
|||||||
help:33940 = Importera anmälningsdata i fritextformat. Ange Namn, Klubb, Klass, och SI (och eventuell starttid) gärna separerade med komma, en person (ett lag) per rad. Det går också att anmäla flera personer i samma klubb/klass genom att (delvis) utelämna fälten klubb/klass. Det är också möjligt att importera anmälningar formaterade på andra sätt.\n\nKlasser skapas automatiskt, men om du importerar lag för stafett eller patrull bör du lägga upp klasserna själv innan du importerar anmälningarna. Annars finns risk att sträcktilldelningen blir fel.
|
help:33940 = Importera anmälningsdata i fritextformat. Ange Namn, Klubb, Klass, och SI (och eventuell starttid) gärna separerade med komma, en person (ett lag) per rad. Det går också att anmäla flera personer i samma klubb/klass genom att (delvis) utelämna fälten klubb/klass. Det är också möjligt att importera anmälningar formaterade på andra sätt.\n\nKlasser skapas automatiskt, men om du importerar lag för stafett eller patrull bör du lägga upp klasserna själv innan du importerar anmälningarna. Annars finns risk att sträcktilldelningen blir fel.
|
||||||
help:41072 = Markera en stämpling i stämplingslistan för att ta bort den eller ändra tiden. Från banmallen kan saknade stämplingar läggas till. Saknas måltid får löparen status utgått. Saknas stämpling får löparen status felstämplat. Det går inte att sätta en status på löparen som inte överensstämmer med stämplingsdata. Finns målstämpling måste tiden för denna ändras för att ändra måltiden; samma princip gäller för startstämpling.
|
help:41072 = Markera en stämpling i stämplingslistan för att ta bort den eller ändra tiden. Från banmallen kan saknade stämplingar läggas till. Saknas måltid får löparen status utgått. Saknas stämpling får löparen status felstämplat. Det går inte att sätta en status på löparen som inte överensstämmer med stämplingsdata. Finns målstämpling måste tiden för denna ändras för att ändra måltiden; samma princip gäller för startstämpling.
|
||||||
help:41641 = Välj metod för lottning. <Lottning> är helt slumpmässig. <Lottning (MeOS)> och <SOFT-lottning> ser till löpare från samma klubb inte startar på närliggande tider.\n\n<Klungstart> innebär att hela klassen startar i småklungor under det intervall du anger ("utdragen" masstart). \n\nNummerlappar: Ange första nummer som ska användas i klassen. I fältet sträcka (Str.) anger du vilken sträcka som ska lottas (om klassen har flera sträckor).
|
help:41641 = Välj metod för lottning. <Lottning> är helt slumpmässig. <Lottning (MeOS)> och <SOFT-lottning> ser till löpare från samma klubb inte startar på närliggande tider.\n\n<Klungstart> innebär att hela klassen startar i småklungor under det intervall du anger ("utdragen" masstart). \n\nNummerlappar: Ange första nummer som ska användas i klassen. I fältet sträcka (Str.) anger du vilken sträcka som ska lottas (om klassen har flera sträckor).
|
||||||
help:425188 = Du kan automatiskt hantera <Ej Start> genom att läsa in SI-stationer (töm/check/start/kontroller) i SI-Config, spara inläsningen som en semikolonseparerad textfil och importera denna i MeOS. De löpare som förekommer i denna import får en registrering. Därefter kan du sätta <Ej Start> på löpare utan registrering. Läser du senare in fler löpare kan du återställa de löpare som tidigare fått Ej Start men nu fått en registrering.
|
help:425188 = Du kan automatiskt hantera <Ej Start> genom att läsa in SI-stationer (töm/check/start/kontroller) i SportIdent Config+, spara inläsningen som en semikolonseparerad textfil och importera denna i MeOS. De löpare som förekommer i denna import får en registrering. Därefter kan du sätta <Ej Start> på löpare utan registrering. Läser du senare in fler löpare kan du återställa de löpare som tidigare fått Ej Start men nu fått en registrering.
|
||||||
help:471101 = Aktivera SI-enheten genom att välja rätt COM-port, eller genom att söka efter installerade SI-enheter. Info ger dig information om den valda enheten/porten. För att läsa in brickor ska enheten vara programmerad utan autosänd (men för radiokontroller används autosänd). Utökat protokoll rekommenderas, då det ger en stabilare uppkoppling. Enheten programmeras med SportIdents programvara SI-Config.\n\nInteraktiv inläsning används om du direkt vill ta hand om eventuella problem som felaktigt bricknummer; avmarkera om arrangemanget använder 'röd utgång'.\n\nLöpardatabasen används om du automatiskt vill lägga till inkommande löpare med hjälp av löpardatabasen. Löparens stämplingar används för att välja rätt klass.
|
info:readoutbase = Aktivera SI-enheten genom att välja rätt COM-port, eller genom att söka efter installerade SI-enheter. Info ger dig information om den valda enheten/porten. För att läsa in brickor ska enheten vara programmerad utan autosänd (men för radiokontroller används autosänd). Utökat protokoll rekommenderas, då det ger en stabilare uppkoppling. Enheten programmeras med SportIdents programvara SportIdent Config+.\n\nInteraktiv inläsning används om du direkt vill ta hand om eventuella problem som felaktigt bricknummer; avmarkera om arrangemanget använder 'röd utgång'.\n\nLöpardatabasen används om du automatiskt vill lägga till inkommande deltagare med hjälp av löpardatabasen. Deltagarens stämplingar används för att välja rätt klass.
|
||||||
|
info:readoutmore = Ljudval låter dig ställa in om ljudsignaler spelas upp vid avläsning.\n\nEget fönster öppnar ett separat fönster är avsedd att visas på en skärm vänd mot deltagarna.\n\nOm du kopplat in en stämplingsenhet (t.ex. målstämpling) kan du välja om du vill ta emot startstämplingar, radio, eller målstämplingar. Det är en spärr för att förhindra att t.ex. felaktiga startstämplingar kommer in av misstag och skriver över den lottade starttiden.
|
||||||
help:50431 = Du är nu ansluten mot en server. För att öppna en tävling från servern, markera den i listan och välj öppna. För att lägga upp en tävling på servern, öppna först tävlingen lokalt, och använd därefter knappen ladda upp tävling. När du öppnat en tävling på servern ser du vilka andra MeOS-klienter som är anslutna mot den.\n\nOm det står (på server) efter tävlingen är den öppnad på en server och kan delas av andra MeOS-klienter. Står det (lokalt) kan man bara komma åt tävlingen från den aktuella datorn.
|
help:50431 = Du är nu ansluten mot en server. För att öppna en tävling från servern, markera den i listan och välj öppna. För att lägga upp en tävling på servern, öppna först tävlingen lokalt, och använd därefter knappen ladda upp tävling. När du öppnat en tävling på servern ser du vilka andra MeOS-klienter som är anslutna mot den.\n\nOm det står (på server) efter tävlingen är den öppnad på en server och kan delas av andra MeOS-klienter. Står det (lokalt) kan man bara komma åt tävlingen från den aktuella datorn.
|
||||||
help:52726 = Anslut mot en server nedan. \n\nInstallation\nLadda ner och installera MySQL 5 (Community Edition) från www.mysql.com, förslagsvis med standardinställningar. MySQL behöver bara installeras på den dator som ska vara server. Starta sedan MySQL Command Line Client och skapa ett användarkonto för MeOS. Man skriver så här:\n\n> CREATE USER meos;\n> GRANT ALL ON *.* TO meos;\n\nDu har nu skapat en användare meos (med blankt lösenord). Ange serverns namn nedan (om du inte kan ansluta måste du kontrollera eventuella brandväggar).\n\nEtt alternativ är att använda MySQL:s inbyggda rotkonto, det vill säga, användarnamn 'root' och det lösenord du angav vid installationen av MySQL.
|
help:52726 = Anslut mot en server nedan. \n\nInstallation\nLadda ner och installera MySQL 5 (Community Edition) från www.mysql.com, förslagsvis med standardinställningar. MySQL behöver bara installeras på den dator som ska vara server. Starta sedan MySQL Command Line Client och skapa ett användarkonto för MeOS. Man skriver så här:\n\n> CREATE USER meos;\n> GRANT ALL ON *.* TO meos;\n\nDu har nu skapat en användare meos (med blankt lösenord). Ange serverns namn nedan (om du inte kan ansluta måste du kontrollera eventuella brandväggar).\n\nEtt alternativ är att använda MySQL:s inbyggda rotkonto, det vill säga, användarnamn 'root' och det lösenord du angav vid installationen av MySQL.
|
||||||
help:5422 = Hittade ingen SI-enhet. Är de inkopplade och startade?
|
help:5422 = Hittade ingen SI-enhet. Är de inkopplade och startade?
|
||||||
@ -1599,7 +1600,7 @@ Skriver sträcktider när tävlingsdata ändras = Skriver sträcktider när täv
|
|||||||
Bana med slingor = Bana med slingor
|
Bana med slingor = Bana med slingor
|
||||||
En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning = En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning
|
En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning = En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning
|
||||||
Varvningskontroll = Varvningskontroll
|
Varvningskontroll = Varvningskontroll
|
||||||
warn:notextended = INFO: Programmera enheten med utökat protokoll i SIConfig för snabbare brickinläsning.
|
warn:notextended = INFO: Programmera enheten med utökat protokoll i SportIdent Config+ för snabbare brickinläsning.
|
||||||
help:DirectResult = - Om bana ej tilldelats godkänns deltagaren vid målstämpling.\n\n- Om en bana finns används radiostämplingar som kontroller. Ingen brickavläsning ska göras.
|
help:DirectResult = - Om bana ej tilldelats godkänns deltagaren vid målstämpling.\n\n- Om en bana finns används radiostämplingar som kontroller. Ingen brickavläsning ska göras.
|
||||||
Resultat vid målstämpling = Resultat vid målstämpling
|
Resultat vid målstämpling = Resultat vid målstämpling
|
||||||
Stämpling = Stämpling
|
Stämpling = Stämpling
|
||||||
@ -2597,3 +2598,9 @@ Automatnamn = Automatnamn
|
|||||||
Använd = Använd
|
Använd = Använd
|
||||||
Om du vill kan du namnge automaten = Om du vill kan du namnge automaten
|
Om du vill kan du namnge automaten = Om du vill kan du namnge automaten
|
||||||
Spara inställningar = Spara inställningar
|
Spara inställningar = Spara inställningar
|
||||||
|
Anmälningstid = Anmälningstid
|
||||||
|
Varningar i X = Varningar i X
|
||||||
|
Duplicerad nummerlapp: X, Y = Duplicerad nummerlapp: X, Y
|
||||||
|
Saknat lag mellan X och Y = Saknat lag mellan X och Y
|
||||||
|
Lag utan nummerlapp: X = Lag utan nummerlapp: X
|
||||||
|
Brickavläsning = Brickavläsning
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user