MeOS version 3.8.1326 Update 1

This commit is contained in:
Erik Melin 2022-05-05 17:23:31 +02:00
parent efa06c00c8
commit 0adbb266e9
25 changed files with 1842 additions and 1196 deletions

View File

@ -2145,11 +2145,12 @@ void TabRunner::listRunners(gdioutput &gdi, const vector<pRunner> &r, bool filte
int yp = gdi.getCY();
int xp = gdi.getCX();
vector<pRunner> out;
int counter = 0;
for (size_t k=0; k<r.size(); k++) {
if (filterVacant && r[k]->isVacant())
continue;
out.clear();
sprintf_s(bf, "%d.", int(k+1));
sprintf_s(bf, "%d.", ++counter);
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(200), 0, r[k]->getClass(true), gdi.scaleLength(140));

View File

@ -57,7 +57,6 @@ private:
void listRunners(gdioutput &gdi, const vector<pRunner> &r, bool filterVacant) const;
void fillRunnerList(gdioutput &gdi);
int cardModeStartY;
int lastRace;
wstring lastFee;

View File

@ -205,23 +205,6 @@ int TabSI::siCB(gdioutput &gdi, int type, void *data)
gdi.dropLine(3);
gdi.scrollToBottom();
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") {
vector< pair<wstring, wstring> > ext;
@ -531,6 +514,15 @@ int TabSI::siCB(gdioutput &gdi, int type, void *data)
if (manualInput)
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") {
int origin = bi.getExtraInt();
@ -663,11 +655,16 @@ int TabSI::siCB(gdioutput &gdi, int type, void *data)
double t = 0.1;
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);
t += ((1.0 - t) * (sic.nPunch + 1) / 10.0) * ((rand() % 100) + 400.0) / 500.0;
if ((sic.nPunch % 11) == 1 || 5 == (sic.nPunch % 8))
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");
@ -1373,11 +1370,7 @@ int TabSI::siCB(gdioutput &gdi, int type, void *data)
gdi.enableInput("Database", true);
gdi.enableInput("PrintSplits");
gdi.enableInput("UseManualInput");
gdi.fillDown();
gdi.addButton("Import", "Importera från fil...", SportIdentCB);
if (gdi.isChecked("UseManualInput"))
showManualInput(gdi);
showReadoutMode(gdi);
}
else if (mode == ModeCardData) {
numSavedCardsOnCmpOpen = savedCards.size();
@ -1976,13 +1969,7 @@ bool TabSI::loadPage(gdioutput &gdi) {
gdi.setRestorePoint("SIPageLoaded");
if (mode == ModeReadOut) {
gdi.addButton("Import", "Importera från fil...", SportIdentCB);
gdi.setRestorePoint("Help");
gdi.addString("", 10, "help:471101");
if (gdi.isChecked("UseManualInput"))
showManualInput(gdi);
showReadoutMode(gdi);
gdi.dropLine();
}
@ -2015,6 +2002,30 @@ bool TabSI::loadPage(gdioutput &gdi) {
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) {
bool hide = mode != SIMode::ModeReadOut;
gdi.hideWidget("Allow", hide);
@ -2176,6 +2187,12 @@ void TabSI::insertSICardAux(gdioutput &gdi, SICard &sic)
if (printSplits) {
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) {
RECT rc = {30, gdi.getCY(), gdi.scaleLength(250), gdi.getCY() + 3};
gdi.addRectangle(rc);
@ -2183,7 +2200,7 @@ void TabSI::insertSICardAux(gdioutput &gdi, SICard &sic)
if (pageLoaded) {
gdi.enableInput("CreateCompetition", true);
printCard(gdi, savedCards.back().first, nullptr, false);
printCard(gdi, 0, savedCards.back().first, nullptr, false);
gdi.dropLine();
gdi.refreshFast();
gdi.scrollToBottom();
@ -2243,7 +2260,6 @@ void TabSI::insertSICardAux(gdioutput &gdi, SICard &sic)
processCard(gdi, r, sic, true);
else {
processUnmatched(gdi, sic, true);
playReadoutSound(SND::ActionNeeded);
}
}
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);
pCard card=gEvent->allocateCard(0);
@ -2547,6 +2562,11 @@ bool TabSI::processUnmatched(gdioutput &gdi, const SICard &csic, bool silent)
//Update to SQL-source
card->synchronize();
gdioutput *gdi_settings = getExtraWindow("readout_view", true);
if (gdi_settings) {
showReadoutStatus(*gdi_settings, nullptr, card, nullptr, L"");
}
RECT rc;
rc.left=15;
rc.right=gdi.getWidth()-10;
@ -2753,6 +2773,8 @@ bool TabSI::processCard(gdioutput &gdi, pRunner runner, const SICard &csic, bool
rc.bottom+=gdi.getLineHeight();
set<int> clsSet;
wstring mpList;
if (runner->getClassId(false))
clsSet.insert(runner->getClassId(true));
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);
if (runner->getStatusComputed()==StatusOK || isPossibleResultStatus(runner->getStatusComputed())) {
bool qfClass = runner->getClassId(false) != runner->getClassId(true);
wstring placeS = (runner->getTeam() && !qfClass) ?
runner->getTeam()->getLegPlaceS(runner->getLegNumber(), false) :
runner->getPlaceS();
wstring placeS = getPlace(runner);
if (placeS == L"1")
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);
wstring statusline = lang.tl(L"Status OK, ") +
lang.tl(L"Tid: ") + runner->getRunningTimeS(true);
lang.tl(L"Tid: ") + getTimeString(runner);
if (!placeS.empty())
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);
playReadoutSound(SND::NotOK);
if (!MP.empty()) {
msg=msg + L", (";
vector<int>::iterator it;
for (int c : MP) {
if (!mpList.empty())
mpList += L", ";
mpList = mpList + itow(c);
}
mpList += lang.tl(" saknas.");
}
for(it=MP.begin(); it!=MP.end(); ++it) {
msg = msg + itow(*it)+ L" ";
}
msg += lang.tl(L" saknas") + L".)";
}
if (!mpList.empty())
msg += L", (" + mpList + + L")";
if (!silent) {
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);
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;
}
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)
{
SICard sic = csic;
@ -3448,12 +3520,11 @@ void TabSI::showModeCardData(gdioutput &gdi) {
gdi.disableInput("StartInfo", true);
gdi.disableInput("UseManualInput", true);
gdi.dropLine();
gdi.dropLine(0.5);
gdi.fillDown();
gdi.pushX();
gdi.addString("", boldLarge, "Print Card Data");
gdi.addString("", 10, "help:analyzecard");
gdi.dropLine();
gdi.addStringUT(boldLarge, lang.tl(L"Print card data", true));
gdi.dropLine(0.2);
gdi.fillRight();
gdi.addButton("ClearMemory", "Clear Memory", SportIdentCB);
gdi.addButton("SaveMemory", "Spara...", SportIdentCB);
@ -3466,6 +3537,13 @@ void TabSI::showModeCardData(gdioutput &gdi) {
gdi.addButton("Import", "Importera från fil...", SportIdentCB);
#endif
}
gdi.fillDown();
gdi.addButton("ReadoutWindow", "Eget fönster", SportIdentCB);
gdi.dropLine();
gdi.popX();
gdi.addString("", 10, "help:analyzecard");
gdi.dropLine(3);
gdi.popX();
bool first = true;
@ -3477,7 +3555,7 @@ void TabSI::showModeCardData(gdioutput &gdi) {
}
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)
crdRef = &getCard(cardId);
@ -3589,13 +3667,35 @@ void TabSI::printCard(gdioutput &gdi, int cardId, SICard *crdRef, bool forPrinte
if (!clubName.empty())
name += L", " + clubName;
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.fillDown();
gdi.addStringUT(0, c.readOutTime);
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;
if (c.CheckPunch.Code != -1)
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 xp4 = xp3 + gdi.scaleLength(60);
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 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++) {
int cy = gdi.getCY();
gdi.addStringUT(cy, xp, 0, itos(k+1) + ".");
@ -3627,6 +3737,23 @@ void TabSI::printCard(gdioutput &gdi, int cardId, SICard *crdRef, bool forPrinte
else {
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) {
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));
}
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));
}
maxCY = max(maxCY, gdi.getCY());
if (breakLines > 0) {
gdi.setCY(maxCY);
gdi.dropLine(2);
gdi.setCX(baseCX);
}
if (forPrinter) {
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) {
gdioutput gdiprint(2.0, gdi.getHWNDTarget(), splitPrinter);
printCard(gdiprint, cardId, nullptr, true);
printCard(gdiprint, 0, cardId, nullptr, true);
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.TabFocus(1);
@ -4415,8 +4568,9 @@ void TabSI::handleAutoComplete(gdioutput &gdi, AutoCompleteInfo &info) {
bool TabSI::showDatabase() const {
return useDatabase && oe->useRunnerDb();
}
void TabSI::playReadoutSound(SND type) {
if (!oe->getPropertyInt("PlaySound", 0))
if (!oe->getPropertyInt("PlaySound", 1))
return;
int res = -1;
wstring fn;
@ -4473,3 +4627,212 @@ void TabSI::playSoundFile(const wstring& file) const {
PlaySound(file.c_str(), nullptr, SND_FILENAME | SND_ASYNC);
//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();
}

View File

@ -177,7 +177,7 @@ private:
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);
static int analyzePunch(SIPunch &p, int &start, int &accTime, int &days);
@ -224,6 +224,10 @@ private:
protected:
void clearCompetitionData();
static wstring getPlace(const oRunner *r);
static wstring getTimeString(const oRunner *r);
static wstring getTimeAfterString(const oRunner *r);
public:
bool showDatabase() const;
@ -283,6 +287,12 @@ public:
void refillComPorts(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(void);
};

View File

@ -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: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: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: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.
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ý).
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: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á?

File diff suppressed because it is too large Load Diff

View File

@ -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: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: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: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.
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.
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: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?
@ -1604,7 +1605,7 @@ Skriver sträcktider när tävlingsdata ändras = Writing file when competition
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
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.
Resultat vid målstämpling = Result on finish 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
Clear Memory = Clear Memory
Create Competition = Create Competition
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.
Använd endast en bana i klassen = Use only one course in the class
@ -2590,3 +2590,9 @@ Automatnamn = Service name
Använd = Use
Om du vill kan du namnge automaten = You may give the service a name
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

View File

@ -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: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: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: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 ?

View File

@ -71,14 +71,18 @@ enum GDICOLOR {
colorGreyBlue = RGB(92, 92, 128),
colorDarkBlue = RGB(0, 0, 92),
colorDarkGreen = RGB(0, 64, 0),
colorYellow = RGB(255, 230, 0),
colorYellow = RGB(249, 196, 72),
colorLightBlue = RGB(235, 238, 254),
colorLightRed = RGB(255, 230, 230),
colorLightRed = RGB(253, 219, 235),
colorLightGreen = RGB(219, 247, 209),
colorLightYellow = RGB(248, 248, 216),
colorLightCyan = RGB(220, 249, 245),//RGB(200, 255, 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),
colorWindowBar = -2,
colorDefault = -1,

View File

@ -81,6 +81,8 @@ extern Image image;
extern int defaultCodePage;
GuiHandler &BaseInfo::getHandler() const {
if (managedHandler)
return *managedHandler;
if (handler == 0)
throw meosException("Handler not definied.");
return *handler;
@ -790,6 +792,8 @@ void gdioutput::timerProc(TimerInfo &timer, DWORD timeout) {
int timerId = timer.timerId;
if (timer.handler)
timer.handler->handle(*this, timer, GUI_TIMER);
if (timer.managedHandler)
timer.managedHandler->handle(*this, timer, GUI_TIMER);
else if (timer.callBack)
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) {
SendMessage(it->hWnd, CB_RESETCONTENT, 0, 0);
SendMessage(it->hWnd, CB_INITSTORAGE, items.size(), 48);
SendMessage(it->hWnd, WM_SETREDRAW, FALSE, 0);
it->data2Index.clear();
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);
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 {
SendMessage(it->hWnd, LB_RESETCONTENT, 0, 0);
SendMessage(it->hWnd, LB_INITSTORAGE, items.size(), 48);
SendMessage(it->hWnd, WM_SETREDRAW, FALSE, 0);
it->data2Index.clear();
for (size_t k = 0; k < items.size(); k++) {
LRESULT index = SendMessage(it->hWnd, LB_INSERTSTRING, -1, LPARAM(items[k].first.c_str()));
SendMessage(it->hWnd, LB_SETITEMDATA, index, items[k].second);
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;
}

View File

@ -32,6 +32,7 @@ class BaseInfo
protected:
void *extra;
GuiHandler *handler;
shared_ptr<GuiHandler> managedHandler;
bool dataString;
public:
@ -40,7 +41,7 @@ public:
}
bool hasEventHandler() const {
return handler != 0;
return handler != 0 || managedHandler;
}
bool handleEvent(gdioutput &gdi, GuiEventType type) {
@ -48,6 +49,10 @@ public:
handler->handle(gdi, *this, type);
return true;
}
else if (managedHandler) {
managedHandler->handle(gdi, *this, type);
return true;
}
return false;
}
@ -76,7 +81,7 @@ public:
GuiHandler &getHandler() const;
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

View File

@ -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: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: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: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?

View File

@ -63,6 +63,7 @@ IOF30Interface::IOF30Interface(oEvent *oe, bool forceSplitFee) : oe(*oe), useGMT
void IOF30Interface::readCourseData(gdioutput &gdi, const xmlobject &xo, bool updateClass,
int &courseCount, int &failed) {
gdi.fillDown();
string ver;
xo.getObjectString("iofVersion", ver);
if (!ver.empty() && ver > "3.0")
@ -173,7 +174,7 @@ void IOF30Interface::readCourseData(gdioutput &gdi, const xmlobject &xo, bool up
vector<pCourse> presentCrs;
pc->getCourses(-1, presentCrs);
/*
// Check if we have the same set of courses
bool sameSet = presentCrs.size() == classCourses.size();
for (pCourse crs : presentCrs) {
@ -185,7 +186,7 @@ void IOF30Interface::readCourseData(gdioutput &gdi, const xmlobject &xo, bool up
if (sameSet)
continue; // Do not touch forking if same set
*/
int fallBackCrs = *classCourses.begin();
map<int, vector<pair<int, int>>> bibToLegCourseId;
for (auto &blc : bibLegCourse.second) {
@ -218,7 +219,7 @@ void IOF30Interface::readCourseData(gdioutput &gdi, const xmlobject &xo, bool up
// Check if pattern is OK
bool ok = true;
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])) {
ok = false;
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++) {
pc->clearStageCourses(leg);
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));
}
}
}
}

View File

@ -25,17 +25,17 @@
//ABCDEFGHIJKLMNO
int getMeosBuild() {
string revision("$Rev: 1132 $");
string revision("$Rev: 1152 $");
return 174 + atoi(revision.substr(5, string::npos).c_str());
}
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);
}
wstring getBuildType() {
return L""; // No parantheses (...)
return L"U1"; // No parantheses (...)
}
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"O-Liceo, Spain");
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());
}

View File

@ -394,6 +394,10 @@ void oListParam::getCustomTitle(wchar_t *t) const
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
{
if (!title.empty())

View File

@ -788,10 +788,14 @@ void oCard::adaptTimes(int startTime) {
}
wstring oCard::getCardVoltage() const {
return getCardVoltage(miliVolt);
}
wstring oCard::getCardVoltage(int miliVolt) {
if (miliVolt == 0)
return L"";
int vi = miliVolt / 1000;
int vd = (miliVolt % 1000)/10;
int vd = (miliVolt % 1000) / 10;
wchar_t bf[64];
swprintf_s(bf, L"%d.%02d V", vi, vd);
@ -799,6 +803,10 @@ wstring oCard::getCardVoltage() const {
}
oCard::BatteryStatus oCard::isCriticalCardVoltage() const {
return isCriticalCardVoltage(miliVolt);
}
oCard::BatteryStatus oCard::isCriticalCardVoltage(int miliVolt) {
if (miliVolt > 0 && miliVolt < 2445)
return BatteryStatus::Bad;
else if (miliVolt > 0 && miliVolt <= 2710)

View File

@ -75,12 +75,15 @@ public:
void setMeasuredVoltage(int miliVolt) { this->miliVolt = miliVolt; }
wstring getCardVoltage() const;
static wstring getCardVoltage(int miliVolt);
enum class BatteryStatus {
OK,
Warning,
Bad
};
BatteryStatus isCriticalCardVoltage() const;
static BatteryStatus isCriticalCardVoltage(int miliVolt);
static const shared_ptr<Table> &getTable(oEvent *oe);

View File

@ -181,6 +181,7 @@ static void generateNBestHead(const oListParam &par, oListInfo &li, int ypos) {
if (par.filterMaxPer > 0)
li.addHead(oPrintPost(lString, lang.tl(L"Visar de X bästa#" + itow(par.filterMaxPer)), normalText, 0, ypos));
}
extern gdioutput *gdi_main;
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) {
li.setupLinks();
pClass sampleClass = 0;
bool calculatedSplitResults = false;
if (!li.lp.selection.empty())
sampleClass = getClass(*li.lp.selection.begin());
if (!sampleClass && !Classes.empty())
@ -2896,8 +2897,10 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
}
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);
calculatedSplitResults = true;
}
else {
calculateTeamResults(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)
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.lp.useControlIdResultTo > 0 || li.lp.useControlIdResultFrom > 0)
if (li.lp.useControlIdResultTo > 0 || li.lp.useControlIdResultFrom > 0) {
calculateSplitResults(li.lp.useControlIdResultFrom, li.lp.useControlIdResultTo);
calculatedSplitResults = true;
}
else {
calculateResults(li.lp.selection, ResultType::ClassResult);
}
@ -2994,7 +2997,7 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
rlist.push_back(r);
}
if (li.sortOrder != Custom)
if (li.sortOrder != Custom && !calculatedSplitResults)
sortRunners(li.sortOrder, 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),
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.par.relayLegIndex = it->tLeg;
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);
}
++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.reset();
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);
if (li.subListPost.empty())
@ -3322,11 +3325,11 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
startClub = true;
}
++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.reset();
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);
if (li.listSubType == li.EBaseTypeCoursePunches ||
@ -3371,7 +3374,7 @@ void oEvent::generateListInternal(gdioutput &gdi, const oListInfo &li, bool form
formatPrintPost(li.subHead, printPostInfo, nullptr,
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();
formatPrintPost(li.listPost, printPostInfo, nullptr, nullptr, nullptr,
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,
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();
formatPrintPost(li.listPost, printPostInfo, nullptr, nullptr, nullptr,
nullptr, nullptr, &*it, nullptr, 0);

View File

@ -339,6 +339,7 @@ struct oListParam {
a.useControlIdResultFrom == useControlIdResultFrom &&
a.useControlIdResultTo == useControlIdResultTo &&
a.filterMaxPer == filterMaxPer &&
a.alwaysInclude == alwaysInclude &&
a.pageBreak == pageBreak &&
a.showHeader == showHeader &&
a.showInterTimes == showInterTimes &&
@ -369,7 +370,12 @@ struct oListParam {
int useControlIdResultTo;
int useControlIdResultFrom;
// Max number shown per class/class etc
int filterMaxPer;
const oAbstractRunner *alwaysInclude = nullptr;
bool filterInclude(int count, const oAbstractRunner *r) const;
bool pageBreak;
bool showHeader = true;
bool showInterTimes;

View File

@ -5078,7 +5078,7 @@ void oRunner::printSplits(gdioutput& gdi) const {
auto stat = getCard()->isCriticalCardVoltage();
wstring warning;
if (stat == oCard::BatteryStatus::Bad)
warning = lang.tl("Replace");
warning = lang.tl("Replace[battery]");
else if (stat == oCard::BatteryStatus::Warning)
warning = lang.tl("Low");
else
@ -5718,15 +5718,18 @@ int oRunner::getMissedTime(int ctrlNo) const {
return -1;
}
wstring oRunner::getMissedTimeS() const
{
int oRunner::getMissedTime() const {
setupRunnerStatistics();
int t = 0;
for (size_t k = 0; k<tMissedTime.size(); k++)
if (tMissedTime[k]>0)
for (size_t k = 0; k < tMissedTime.size(); k++) {
if (tMissedTime[k] > 0)
t += tMissedTime[k];
}
return t;
}
return getTimeMS(t);
wstring oRunner::getMissedTimeS() const {
return getTimeMS(getMissedTime());
}
wstring oRunner::getMissedTimeS(int ctrlNo) const
@ -6889,3 +6892,25 @@ int oRunner::getStartGroup(bool useTmpStartGroup) const {
void oRunner::setStartGroup(int 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;
}

View File

@ -396,6 +396,13 @@ public:
RunnerStatus getStatusComputed() const { return tComputedStatus != StatusUnknown ? tComputedStatus : 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 prelStatusOK(bool computed, bool includeOutsideCompetition) const {
bool ok = statusOK(computed) || (tStatus == StatusUnknown && getRunningTime(false) > 0);
@ -786,6 +793,7 @@ public:
wstring getMissedTimeS() const;
wstring getMissedTimeS(int ctrlNo) const;
int getMissedTime() const;
int getMissedTime(int ctrlNo) const;
int getLegPlace(int ctrlNo) const;
int getLegTimeAfter(int ctrlNo) const;

View File

@ -2053,9 +2053,21 @@ pair<int, bool> oTeam::inputData(int id, const wstring &input,
synchronize(false);
if (id>1000) {
const wstring &preBib = getDCI().getString("Bib");
auto res = oe->oTeamData->inputData(this, id, input,
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();
}
evaluate(oBase::ChangeType::Update);
return res;
}

View File

@ -1723,8 +1723,8 @@ help:31661 = Установите время закрытия старта. По
help:33940 = Импорт заявок в свободной форме. Укажите имя, клуб, группу и чип (так же можно указать стартовое время), разделённые запятыми. Один участник должен занимать одну строку.
help:41072 = Выберите из списка, чтобы изменить или удалить отметку. Вы можете добавить недостающие отметки из шаблона дистанции. Если время отсутствует, участник получает статус <DNF>. Если отметки не хватает, статус <DSQ>. Невозможно присвоить статус неправильная отметка. Если есть отметка, необходимо изменить его установить время вручную. Тот же принцип применяется для стартовой отметки
help:41641 = Введите время старта первого участника и стартовый интервал. Случайная жеребьёвка позволяет перемешать стартовый протокол в случайном порядке. Шведский алгоритм использует специальные правила для распределение участников из одной команды по всему протоколу. Групповой старт позволяет запускать по несколько участников на одной минуте (расширенный масс-старт). В поле этап вы можете указать какой этап должен быть прожеребьёван, в случае если в группе несколько этапов.
help:425188 = Вы можете автоматически указать не стартовавших участников считав память из станций (очистка/проверка/старт/КП) в SI-Config'e. Сохраните считанный файл как CSV-файл и укажите его нажав импорт отметок. В результате найденные участники пройдут регистрацию. Затем вы можете присвоить статус DNS участникам без регистрации. Также вы можете сбросить статус у стартовавших участник нажав кнопку сброс.
help:471101 = Активируйте SI станцию выбрав необходимый COM-порт или нажав Автопоиск и запуск. Для получения статус выбранного порта нажмите Информация.\n\nИнтерактивное считывание позволяет оперативно решать проблемы с неверными номерами чипов. Не используйте эту опцию в случаях, когда подобные проблемы решаются отдельно.\n\nБаза участников используется в случае если вы хотите автоматически добавлять новых участников в протокол. По считанным отметкам программа автоматически определяет группу участника
help:425188 = Вы можете автоматически указать не стартовавших участников считав память из станций (очистка/проверка/старт/КП) в SportIdent Config+'e. Сохраните считанный файл как CSV-файл и укажите его нажав импорт отметок. В результате найденные участники пройдут регистрацию. Затем вы можете присвоить статус DNS участникам без регистрации. Также вы можете сбросить статус у стартовавших участник нажав кнопку сброс.
info:readoutbase = Активируйте SI станцию выбрав необходимый COM-порт или нажав Автопоиск и запуск. Для получения статус выбранного порта нажмите Информация.\n\nИнтерактивное считывание позволяет оперативно решать проблемы с неверными номерами чипов. Не используйте эту опцию в случаях, когда подобные проблемы решаются отдельно.\n\nБаза участников используется в случае если вы хотите автоматически добавлять новых участников в протокол. По считанным отметкам программа автоматически определяет группу участника
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:5422 = Ни одна SI станция не найдена.

View File

@ -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: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: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: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.
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.
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: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?

View File

@ -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: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: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: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.
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.
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: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?
@ -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
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
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.
Resultat vid målstämpling = Resultat vid målstämpling
Stämpling = Stämpling
@ -2597,3 +2598,9 @@ Automatnamn = Automatnamn
Använd = Använd
Om du vill kan du namnge automaten = Om du vill kan du namnge automaten
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