MeOS version 3.8.1306

This commit is contained in:
Erik Melin 2022-03-27 13:18:18 +02:00
parent 207af5f771
commit efa06c00c8
32 changed files with 1501 additions and 1194 deletions

View File

@ -1436,6 +1436,8 @@ void SportIdent::getSI9DataExt(HANDLE hComm)
double voltage = 1.9 + (battVoltageRow * 0.09);
miliVolt = int(1000 * voltage);
if (miliVolt > 5000)
miliVolt = 900; // Not allowed
/*char xx[30];
sprintf_s(xx, "V = %f\n\n", voltage);
OutputDebugStringA(xx);*/

View File

@ -586,7 +586,7 @@ bool TabAuto::loadPage(gdioutput &gdi, bool showSettingsLast)
if (sm.size() > 0) {
gdi.dropLine();
gdi.addString("", fontMediumPlus, "Sparade automater").setColor(colorDarkBlue);
gdi.addStringUT(fontMediumPlus, lang.tl(L"Sparade automater", true)).setColor(colorDarkBlue);
gdi.dropLine(0.3);
gdi.fillRight();
@ -610,7 +610,7 @@ bool TabAuto::loadPage(gdioutput &gdi, bool showSettingsLast)
}
gdi.dropLine();
gdi.addString("", fontMediumPlus, "Tillgängliga automater").setColor(colorDarkBlue);
gdi.addStringUT(fontMediumPlus, lang.tl(L"Tillgängliga automater", true)).setColor(colorDarkBlue);
gdi.dropLine(0.3);
gdi.fillRight();
gdi.addButton("Result", AutoMachine::getDescription(Machines::mPrintResultsMachine), AutomaticCB, "tooltip:resultprint");
@ -631,7 +631,7 @@ bool TabAuto::loadPage(gdioutput &gdi, bool showSettingsLast)
gdi.popX();
if (!machines.empty()) {
gdi.addString("", fontMediumPlus, "Startade automater").setColor(colorDarkBlue);
gdi.addStringUT(fontMediumPlus, lang.tl(L"Startade automater", true)).setColor(colorDarkBlue);
list<AutoMachine *>::iterator it;
int baseX = gdi.getCX();

View File

@ -1762,11 +1762,14 @@ int TabCompetition::competitionCB(gdioutput &gdi, int type, void *data)
if (save.empty())
throw meosException("Filnamn kan inte vara tomt");
oe->setProperty("ExpStaFilename", save);
bool individual = !gdi.hasWidget("ExportTeam") || gdi.isChecked("ExportTeam");
bool includeStage = true;
if (gdi.hasWidget("IncludeRaceNumber"))
if (gdi.hasWidget("IncludeRaceNumber")) {
includeStage = gdi.isChecked("IncludeRaceNumber");
oe->setProperty("ExpWithRaceNo", includeStage);
}
gdi.getSelection("ClassNewEntries", allTransfer);
ImportFormats::ExportFormats filterIndex = ImportFormats::setExportFormat(*oe, gdi.getSelectedItem("Type").first);
@ -1806,7 +1809,7 @@ int TabCompetition::competitionCB(gdioutput &gdi, int type, void *data)
if (save.empty())
throw meosException("Filnamn kan inte vara tomt");
//bool individual = !gdi.hasWidget("ExportTeam") || gdi.isChecked("ExportTeam");
oe->setProperty("ExpResFilename", save);
gdi.getSelection("ClassNewEntries", allTransfer);
checkReadyForResultExport(gdi, allTransfer);
@ -1816,9 +1819,15 @@ int TabCompetition::competitionCB(gdioutput &gdi, int type, void *data)
bool includeSplits = gdi.isChecked("ExportSplitTimes");
bool unroll = gdi.isChecked("UnrollLoops"); // If not applicable, field does not exist.
if (gdi.hasWidget("UnrollLoops")) {
oe->setProperty("ExpUnroll", unroll);
}
bool includeStage = true;
if (gdi.hasWidget("IncludeRaceNumber"))
if (gdi.hasWidget("IncludeRaceNumber")) {
includeStage = gdi.isChecked("IncludeRaceNumber");
oe->setProperty("ExpWithRaceNo", includeStage);
}
gdi.setWaitCursor(true);
if (filterIndex == ImportFormats::IOF30 || filterIndex == ImportFormats::IOF203) {
@ -1827,13 +1836,14 @@ int TabCompetition::competitionCB(gdioutput &gdi, int type, void *data)
oe->getClassConfigurationInfo(cnf);
bool useUTC = oe->getDCI().getInt("UTC") != 0;
if (!cnf.hasTeamClass()) {
if (!gdi.hasWidget("LegType")) {
oe->exportIOFSplits(ver, save.c_str(), true, useUTC,
allTransfer, -1, false, unroll, includeStage, false);
}
else {
ListBoxInfo leglbi;
gdi.getSelectedItem("LegType", leglbi);
oe->setProperty("ExpTypeIOF", leglbi.data);
wstring file = save;
if (leglbi.data == 2) {
wstring fileBase;
@ -3791,18 +3801,22 @@ void TabCompetition::selectStartlistOptions(gdioutput &gdi) {
if (oe->hasTeam()) {
gdi.addCheckbox("ExportTeam", "Exportera individuella lopp istället för lag", 0, false);
}
if (oe->hasMultiRunner() || oe->getStageNumber() > 0)
gdi.addCheckbox("IncludeRaceNumber", "Inkludera information om flera lopp per löpare", 0, true);
if (oe->hasMultiRunner() || oe->getStageNumber() > 0)
gdi.addCheckbox("IncludeRaceNumber", "Inkludera information om flera lopp per löpare", nullptr,
oe->getPropertyInt("ExpWithRaceNo", true) != 0);
wstring fn = oe->getPropertyString("ExpStaFilename", L"");
gdi.addInput("Filename", fn,
48, CompetitionCB, L"Filnamn:").setExtra(L"DoSaveStartlist");
setExportOptionsStatus(gdi, format);
gdi.addInput("Filename", L"", 48, CompetitionCB, L"Filnamn:").setExtra(L"DoSaveStartlist");
gdi.fillRight();
gdi.dropLine();
gdi.addButton("BrowseExport", "Bläddra...", CompetitionCB);
gdi.addButton("DoSaveStartlist", "Exportera", CompetitionCB).setDefault();
gdi.addButton("Cancel", "Avbryt", CompetitionCB).setCancel();
gdi.disableInput("DoSaveStartlist");
gdi.setInputStatus("DoSaveStartlist", !fn.empty());
gdi.refresh();
}
@ -3826,14 +3840,14 @@ void TabCompetition::selectExportSplitOptions(gdioutput &gdi) {
gdi.pushX();
gdi.addSelection("Type", 250, 200, CompetitionCB, L"Exporttyp:");
vector< pair<wstring, size_t> > types;
vector<pair<wstring, size_t>> types;
ImportFormats::getExportFormats(types, true);
gdi.addItem("Type", types);
ImportFormats::ExportFormats format = ImportFormats::getDefaultExportFormat(*oe);
gdi.selectItemByData("Type", format);
vector< pair<wstring, size_t> > typeLanguages;
vector<pair<wstring, size_t>> typeLanguages;
ImportFormats::getOECSVLanguage(typeLanguages);
gdi.addSelection("LanguageType", 250, 200, CompetitionCB, L"Export language:");
@ -3846,16 +3860,19 @@ void TabCompetition::selectExportSplitOptions(gdioutput &gdi) {
ClassConfigInfo cnf;
oe->getClassConfigurationInfo(cnf);
if (oe->hasTeam()) {
if (cnf.hasTeamClass() || cnf.hasQualificationFinal()) {
gdi.addSelection("LegType", 300, 100, 0, L"Exportval, IOF-XML");
gdi.addItem("LegType", lang.tl("Totalresultat"), 1);
gdi.addItem("LegType", lang.tl("Alla lopp som individuella"), 3);
gdi.addItem("LegType", lang.tl("Alla sträckor/lopp i separata filer"), 2);
int legMax = cnf.getNumLegsTotal();
for (int k = 0; k<legMax; k++) {
gdi.addItem("LegType", lang.tl("Sträcka X#" + itos(k+1)), k+10);
if (cnf.hasTeamClass()) {
gdi.addItem("LegType", lang.tl("Alla sträckor/lopp i separata filer"), 2);
int legMax = cnf.getNumLegsTotal();
for (int k = 0; k < legMax; k++) {
gdi.addItem("LegType", lang.tl("Sträcka X#" + itos(k + 1)), k + 10);
}
}
gdi.selectFirstItem("LegType");
if (!gdi.selectItemByData("LegType", oe->getPropertyInt("ExpTypeIOF", 1)))
gdi.selectFirstItem("LegType");
}
bool hasLoops = false;
@ -3866,20 +3883,23 @@ void TabCompetition::selectExportSplitOptions(gdioutput &gdi) {
hasLoops = true;
}
if (hasLoops)
gdi.addCheckbox("UnrollLoops", "Unroll split times for loop courses", 0, true);
gdi.addCheckbox("UnrollLoops", "Unroll split times for loop courses", 0, oe->getPropertyInt("ExpUnroll", true) != 0);
if (oe->hasMultiRunner() || oe->getStageNumber() > 0)
gdi.addCheckbox("IncludeRaceNumber", "Inkludera information om flera lopp per löpare", 0, true);
gdi.addCheckbox("IncludeRaceNumber", "Inkludera information om flera lopp per löpare", 0,
oe->getPropertyInt("ExpWithRaceNo", true) != 0);
wstring fn = oe->getPropertyString("ExpResFilename", L"");
gdi.addInput("Filename", fn, 48, CompetitionCB, L"Filnamn:").setExtra(L"DoSaveSplits");
setExportOptionsStatus(gdi, format);
gdi.addInput("Filename", L"", 48, CompetitionCB, L"Filnamn:").setExtra(L"DoSaveSplits");
gdi.fillRight();
gdi.dropLine();
gdi.addButton("BrowseExportResult", "Bläddra...", CompetitionCB);
gdi.addButton("DoSaveSplits", "Exportera", CompetitionCB).setDefault();
gdi.addButton("Cancel", "Avbryt", CompetitionCB).setCancel();
gdi.disableInput("DoSaveSplits");
gdi.setInputStatus("DoSaveSplits", !fn.empty());
gdi.refresh();
}
@ -3902,6 +3922,18 @@ void TabCompetition::setExportOptionsStatus(gdioutput &gdi, int format) const {
}
gdi.setInputStatus("LanguageType", format == ImportFormats::OE);
if (gdi.hasWidget("Filename")) {
wstring fn = gdi.getText("Filename");
if (!fn.empty()) {
size_t ldot = fn.find_last_of(L".");
if (ldot != wstring::npos && ldot > fn.length() - 8 && ldot < fn.length() - 2) {
fn = fn.substr(0, ldot+1);
fn += ImportFormats::getExtension(ImportFormats::ExportFormats(format));
gdi.setText("Filename", fn);
}
}
}
}
void TabCompetition::clearCompetitionData() {

View File

@ -213,7 +213,7 @@ void TabCourse::selectCourse(gdioutput &gdi, pCourse pc)
gdi.enableEditControls(false);
}
gdi.refreshFast();
gdi.setInputStatus("DrawCourse", pc != 0);
gdi.setInputStatus("DrawCourse", pc != 0, true);
}
int CourseCB(gdioutput *gdi, int type, void *data) {
@ -764,8 +764,11 @@ bool TabCourse::loadPage(gdioutput &gdi) {
gdi.addButton("ExportCourses", "Exportera...", CourseCB);
gdi.popX();
gdi.dropLine(2.5);
gdi.addButton("DrawCourse", "Lotta starttider..", CourseCB);
gdi.disableInput("DrawCourse");
if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::DrawStartList)) {
gdi.addButton("DrawCourse", "Lotta starttider..", CourseCB);
gdi.disableInput("DrawCourse");
}
gdi.newColumn();
gdi.fillDown();

View File

@ -75,6 +75,10 @@ bool ClassConfigInfo::hasTeamClass() const {
return !relay.empty() || !patrol.empty() || !raceNRes.empty();
}
bool ClassConfigInfo::hasQualificationFinal() const {
return !knockout.empty();
}
void ClassConfigInfo::getPatrol(set<int> &sel) const {
sel.insert(patrol.begin(), patrol.end());
}
@ -141,7 +145,7 @@ void oEvent::getClassConfigurationInfo(ClassConfigInfo &cnf) const
if (Courses.empty() || (it->getCourse(false) == nullptr && it->getCourse(0,0, false) == nullptr) ||
(it->getCourse(false) && it->getCourse(false)->getNumControls() == 0)) {
if (!it->isQualificationFinalBaseClass()) {
if (!it->isQualificationFinalBaseClass() && !it->isQualificationFinalClass()) {
// No course.
if (runnerPerClass.empty()) {
for (auto &r : Runners) {

View File

@ -80,6 +80,7 @@ public:
void getRogainingTeam(set<int> &sel) const;
bool hasTeamClass() const;
bool hasQualificationFinal() const;
void getRaceNStart(int race, set<int> &sel) const;
void getLegNStart(int leg, set<int> &sel) const;

File diff suppressed because it is too large Load Diff

View File

@ -433,7 +433,7 @@ Ingen bana = No course
Ingen deltagare matchar sökkriteriet = No competitor match the search criteria
Ingen klass = No class
Ingen klass vald = No class selected
Ingen löpare saknar bricka = All runners has a card
Ingen löpare saknar bricka = All runners have a card
Ingen matchar 'X' = No match for 'X'
Ingen rogaining = No rogaining
Inkommande = Incoming
@ -680,7 +680,7 @@ Nästa etapp = Next stage
Nästa försök = Next try
OE Semikolonseparerad (csv) = OE Semicolon separated (csv)
OK = OK
Ogiltig banfil. Kontroll förväntad på position X, men hittade 'Y' = Invalid course file. Expected a control number at position X, but found 'Y'
Ogiltig banfil. Kontroll förväntad på position X, men hittade 'Y' = Invalid course file. Expected a control number at position X, but found 'Y'
Ogiltig föregående/efterföljande etapp = Invalid previous/next stage
Ogiltig första starttid. Måste vara efter nolltid = Invalid first start time. Must be after zero time
Ogiltig omstartstid = Invalid restart time
@ -881,7 +881,7 @@ Skippar lottning = Skip drawing start order
Skript = Script
Skript att köra efter export = Script to run after export
Skriv endast ut ändade sidor = Only print modified pages
Skriv första bokstaven i klubbens namn och tryck pil-ner för att leta efter klubben = Type the first letters of the club name and press down arrow to find the club.
Skriv första bokstaven i klubbens namn och tryck pil-ner för att leta efter klubben = Type the first letters of the club's name and press down arrow to find the club.
Skriv första starttid på formen HH:MM:SS = Write the first start time as HH:MM:SS
Skriv ut = Print
Skriv ut alla = Print all
@ -1001,7 +1001,7 @@ Stämpelkoder = Punching codes
Stämplar om = Punching in
Stämplingar = Punches
Stämplingar saknas: X = Missing punches: X
Stämplingsautomat = Punch machine
Stämplingsautomat = Control punch service
Stämplingsintervall (MM:SS) = Punch interval (MM:SS)
Stämplingstest = Punching Test
Stämplingstest [!] = Punch Test [!]
@ -1298,7 +1298,7 @@ går upp i delad ledning med tiden X = takes a shared lead with the time X
handskakning = hand shaking
har startat = has started
help:10000 = A service in MeOS is a small program that automatically does something every now and then or when the competition data is changed.
help:12138 = Select a class to merge with the this class. If start times are drawn you might want to draw again, since the runners keep their start times.
help:12138 = Select a class to merge with this class. If start times are drawn you might want to draw again, since the runners keep their start times.
help:12290 = The competition is created by another version of MeOS and cannot be opened from a server. You can however import the competition from file.
help:12352 = This operation removes the club you have chosen (%s, id=%d) and moves all runners of that club to the new club you choose below. The operation cannot be undone.
help:12662 = Add controls by adding a sequence of control numbers (control id numbers). You need not specify the finish. Example: 31, 50, 36, 50, 37, 100.
@ -1306,10 +1306,10 @@ help:14070 = The TCP port is used for receiving punches over TCP from other syst
help:14343 = A list with read card is shown. To tie a runner to another card, double click the card or runner you wish to move.
help:146122 = You can extend MeOS knowledge of runners, clubs and classes by searching databases in MeOS format or the IOF (xml) format.\n\nDo you wish to proceed?
help:14692 = Input control number, runner (start number or card number) and clock time (HH:MM:SS). You may leave the time field blank; then the computer clock is used. Press <Enter> to save.
help:15491 = You can export settings, club and runner databases to a specified folder. This settings and databases can be imported to another computer.
help:15491 = You can export settings, club and runner databases to a specified folder. These settings and databases can be imported to another computer.
help:21576 = If you make a mistake, click the runners name to change the entry. Use the page runners to remove entries. To see a class in the list below, it must be marked for quick entry on the page classes.
help:25041 = Here you define your courses. A course is then tied to one or more classes (or runners). It is also possible to import courses from OCAD, Condes, or other course software. If you specify the number of maps, MeOS will keep track of available maps in the quick entry form.
help:26963 = A course pool is used for defining a pool of courses for a leg. The course is tied to the runner on finish by control matching. Define courses in the pool by adding them under Several Courses / Relay. An [S] after the class means that all its competitors has a start time.
help:26963 = A course pool is used for defining a pool of courses for a leg. The course is tied to the runner on finish by control matching. Define courses in the pool by adding them under Several Courses / Relay. An [S] after the class means that all its competitors have a start time.
help:29191 = You can install settings, clubs and runner database from a specified source folder. Your local settings are overwritten. MeOS might be restarted after the installation.\n\nThe button <Export> takes you to a page where instead you can export your current settings.
help:29758 = Here you manage clubs and print invoices. You can assign competition fees based on class type and entry date. Duplicated (misspelled) clubs can be merged with the corresponding correct club. You can also update club addresses from the registry.
help:30750 = You can create many different sorts of lists and reports. These can be shown on screen, printed, or saved in web format. The list is automatically updated when competition data is changed. Automatic result printing is done on the page Services. To export competition data, for example split times, go to the page Competition.
@ -1323,23 +1323,23 @@ help:50431 = You are now connected to a server. To open a competition on the ser
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:59395 = In this form, you can quickly make basic settings for many classes in one step.\n\nStart is the name of the start as it is printed in the start list.\n\nBlock is a number between 0 and 100 which can provide an even finer distribution of runners. Classes in the same block will be printed on the same minute start list. \n\nIndex is a sorting key. The classes are sorted by this key in all lists.\n\nThe course can be specified for classes which have exactly one course; if there are several possible courses you need to use the standard class form.\n\nQuick entry determines if the class supports quick entry mode, i.e., is a possible choice in the quick entry class list.
help:59395_more = The class fees, which shows if you have activated Economy features, are used for new entries. If you change a fee, MeOS will ask if you wish to apply the change to existing competitors.\n\nFor bibs you have the options None, Consecutive and Manual. You can also type the first bib in the class, for example A100, or 50. Consecutive means that the last number of the preceeding class is used to define the first number in this class. Reserved bib numbers gives a gap (of the specified width) in the numbering between classes.\n\nMeOS updates bibs when you draw start times or change the settings. Manual means that MeOS will never automatically update bibs.\n\nFor classes with teams the setting Team member controls the relation between the team number and the bibs. It can be the same, increasing (100, 101, 102), leg dependent (100-1, 100-2, etc.) or completely independent.
help:59395_more = The class fees, which shows if you have activated Economy features, are used for new entries. If you change a fee, MeOS will ask if you wish to apply the change to existing competitors.\n\nFor bibs you have the options None, Consecutive and Manual. You can also type the first bib in the class, for example A100, or 50. Consecutive means that the last number of the preceding class is used to define the first number in this class. Reserved bib numbers give a gap (of the specified width) in the numbering between classes.\n\nMeOS updates bibs when you draw start times or change the settings. Manual means that MeOS will never automatically update bibs.\n\nFor classes with teams the setting Team member controls the relation between the team number and the bibs. It can be the same, increasing (100, 101, 102), leg dependent (100-1, 100-2, etc.) or completely independent.
help:7618 = The number of runners in a team is specified on the page Classes.
help:7620 = Interval (seconds). Leave the field blank to update when the competition is changed.
help:89064 = For every control, you specify one or more code number (SI codes). In a course, you refer to the control by its ID number. Usually, you do not need to add controls manually, since MeOS automatically adds all controls needed.\n\nMore than one SI code is useful for replacing malfunctioning controls or to create simple forks. For an ordinary control, it is required that the runner visit on of the specified controls. If the control status is <Multiple>, all specified controls must be visited (in any order). If the status is <Bad>, the control is ignored.\n\nThe status <Lost> works like <Bad>, but in addition the running time to the next control is ignored; it does not matter for the final time how much time was spent looking for the lost control.\n\nIf you specify a control name, it is possible to print result lists with intermediate times at named controls.\n\nTime adjustment can be used if it turns out that a control has wrong time. Time format is +/-MM:SS or +/-HH:MM:SS.\n\nShortest leg time defines the shortest possible time on that leg. No runner will get a shorter time to this control, no matter how fast he/she is. This can be used, for example, if a dangerous road must be crossed.\n\nStatus <No timing> means that the time to the control is ignored; the total time will be the same no matter what the actual time to this control is.
help:9373 = Provide one or more control numbers (SI codes) used by this control.\nExample: 31, 250.
help:9615 = Received no answer. Do you want to open the port in passive mode; should MeOS listen to incoming punches?
help:assignfee = MeOS will take care of entry fees for you automatically in many cases. The competitors are assigned fees based on age and entry date (you define the limits under Competition Settings). Every class defines its fees. You provide default values for different class types under Competition Settings, but you can also manually change class settings using Quick Settings for the class.\n\nThis page lets you manually use different ages and time limits for different fees. On the page competitor, you can manually adjust the fee for individual competitors, if needed.
help:baudrate = Transmission speed/Baudrate: use 4800 or 38400.
help:baudrate = Transmission speed/Baud rate: use 4800 or 38400.
help:computer_voice = An incoming punch is matched against a start number and plays the file <N.wav>, where N is the start number. The files are located in the folder below. If the runner/team belongs has nationality NAT, MeOS first tries to play the file <NAT/N.wav>, which should contain the number in an appropriate language version.
help:dbage = The runner database is older than two months. Do you wish to download a new database from Eventor?
help:duplicate = Make a local copy of this competition.
help:eventorkey = Type your club's Eventor (Sweden) API key. You get the key from your club's Eventor administrator.
help:fullscreen = You can adjust the scroll speed using Ctrl+M (increase) and Ctrl+N (decrease) on your keyboard. To escape full screen mode, press Esc.
help:import_entry_data = You can import runners, classes, clubs and entries from a number of different text and XML formats. It is not necessary to provide all files below. For example, an OE-CSV file with entries contains clubs and classes, so in that case these fields should be left empty.\n\nIf the same runner is imported several times you will not get several copies of the runner. Instead the entry is updated. This means that it is harmless to re-import or import an extended file with entries.
help:import_entry_data = You can import runners, classes, clubs and entries from a number of different text and XML formats. It is not necessary to provide all files below. For example, an OE-CSV file with entries contains clubs and classes, so in that case these fields should be left empty.\n\nIf the same runner is imported several times, you will not get several copies of the runner. Instead, the entry is updated. This means that it is harmless to re-import or import an extended file with entries.
help:importcourse = You can import courses and classes from (for example) an OCAD or Condes export.
help:ocad13091 = If you have access to the courses (for example, from OCAD or Condes) you can provide the name of the course file here. Otherwise, you may add courses later.
help:relaysetup = Use the guide below to choose between a number of predefined competition forms. After you apply the settings, it is possible to manually adapt the settings for each leg and setup courses.\n\nSome explanations:\n- Relay is used for different kinds of relays.\n- Two-runner relay means that two runners make a team and take turns running.\n- Co-runner relay is sometimes used in youth classes and allow for more than one runner on some legs. (the first runner changes over).\n- A patrol race can be run with one or two punching cards.\n- Prologue + pursuit is individual, but with two races.\n- Course pool means there are several course variants, but that it is not decided in advance who runs which course; it is decided automatically when the runner finishes.
help:relaysetup = Use the guide below to choose between a number of predefined competition forms. After you apply the settings, it is possible to manually adapt the settings for each leg and setup courses.\n\nSome explanations:\n- Relay is used for different kinds of relays.\n- Two-runner relay means that two runners make a team and take turns running.\n- Co-runner relay is sometimes used in youth classes and allow for more than one runner on some legs. (The first runner changes over).\n- A patrol race can be run with one or two punching cards.\n- Prologue + pursuit is individual, but with two races.\n- Course pool means there are several course variants, but that it is not decided in advance who runs which course; it is decided automatically when the runner finishes.
help:restore_backup = Choose a backup to restore by clicking the time when the backup was created.
help:runnerdatabase = By importing a runner and club database, MeOS will automatically recognize unknown runners (by card number), and you will get addresses and phone numbers to clubs.
help:save = MeOS automatically saves all settings when needed.
@ -1355,7 +1355,7 @@ help_draw = You draw the start list in a two-step process. First you choose whic
info:multieventnetwork = To handle more than one stage you must work locally. Save a copy of the competition, open it locally and transfer results to the next stage. Then upload the next stage to the server.
info:readout_action = X: Card no. Y was read out.\nManual actions needed.
info:readout_queue = X: Card no. Y was read out.\nThe card has been queued.
inforestwarning = No runners seems to be in the forest. Since the data behind this conclusion might be incorrect, you should verify that no runner is left in the forest by other means.
inforestwarning = No competitors seem to be in the forest. Since the data behind this conclusion might be incorrect, you should verify that no runner is left in the forest by other means.
kartor = maps
klar = settled
kontroll = control
@ -1449,7 +1449,7 @@ xml-data = xml data
Öppna tävling = Open Competition
Öppna vald tävling = Open selected competition
Öppnad tävling = Opened competition
Överför anmälda = Transfer entires
Överför anmälda = Transfer entries
Överför nya deltagare i ej valda klasser med status "deltar ej" = Transfer new competitors in remaining classes with status <Not taking part>
Överför resultat = Transfer results
Överför resultat till X = Transferring results to X
@ -1602,9 +1602,9 @@ Hantera egna listor = Manage Custom Lists
Redigera = Edit
Skriver sträcktider när tävlingsdata ändras = Writing file when competition data is changed
Bana med slingor = Course with loops
En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning = A course with loops allow 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
warn:notextended = INFO: Program the unit with extended protocol in SI.Config to speed up card reading.
warn:notextended = INFO: Program the unit with extended protocol in SIConfig 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
@ -1688,7 +1688,7 @@ Klassval = Class selection
The forking is not fair = The forking is not fair
Unfair control legs = Unfair control legs
Växel = Changeover
help:teamlineup = Here you can import team line-ups from a structured text based format, which is easy to produce manually from a spreadsheet program. The file must have the following format:\n\nClass;Team name;[Club]\nCompetitor 1;[Card No];[Club];[Course];[Competitor's class]\nCompetitor 2;[Card No];[Club];[Course];[Competitor's class]\n...\nClass;Team name;[Club]\n...\n\nFields marked with [] may be excluded. Note that referred classes and courses must exist, and that the number of legs in the class must match the number of competitor rows following the class. Empty rows can be used if there is no competitor. The option <Use competitors already in competition> means that only competitors already in the competition are moved to the team; other competitors specified are ignored.
help:teamlineup = Here you can import team line-ups from a structured text-based format, which is easy to produce manually from a spreadsheet program. The file must have the following format:\n\nClass;Team name;[Club]\nCompetitor 1;[Card No];[Club];[Course];[Competitor's class]\nCompetitor 2;[Card No];[Club];[Course];[Competitor's class]\n...\nClass;Team name;[Club]\n...\n\nFields marked with [] may be excluded. Note that referred classes and courses must exist, and that the number of legs in the class must match the number of competitor rows following the class. Empty rows can be used if there is no competitor. The option <Use competitors already in competition> means that only competitors already in the competition are moved to the team; other competitors specified are ignored.
Poängjustering = Point adjustment
Use initials in names = Use initials in names
Exportera klubbar (IOF-XML) = Export Clubs (IOF-XML)
@ -1845,8 +1845,8 @@ Debug X for Y = Debug X for Y
Do you want to clear the card memory? = Do you want to clear the card memory?
Portable Document Format (PDF) = Portable Document Format (PDF)
Poängavdrag = Point reduction
RunnerPointAdjustment = Competitors's point adjustment
RunnerTimeAdjustment = Competitors's time adjustment
RunnerPointAdjustment = Competitor's point adjustment
RunnerTimeAdjustment = Competitor's time adjustment
Save changes in rule code? = Save changes in rule code?
Symboler = Symbols
TeamPointAdjustment = Team's point adjustment
@ -1896,8 +1896,8 @@ OL-Skytte med tidstillägg = Orienteering/Shooting with Time Punishment
OL-Skytte utan tidstillägg = Orienteering/Shooting without Time Punishment
OL-Skytte stafettresultat = Orienteering/Shooting Relay
Sluttid = Final time
olshooting:timepunishment = Result list Orienteering/Shooting with Time Punichment.\n\nActivate support for Rogaining and manual point adjustments. The use the field Point reduction on the page Competitors to specify misses on the form PPPLLSS, where PPP is the point orienteering error in millimetres, LL misses lying and SS is misses standing. Example 30201 means 3 mm error, 2 lying and 1 standing miss.
olshooting:notimepunishment = Result list Orienteering/Shooting without Time Punichment.\n\nActivate support for Rogaining and manual point adjustments. The use the field Point reduction on the page Competitors to specify misses on the form LLSS, where LL means misses lying and SS means misses standing. Example: 0201 means 2 lying and 1 standing miss.
olshooting:timepunishment = Result list Orienteering/Shooting with Time Punishment.\n\nActivate support for Rogaining and manual point adjustments. The use the field Point reduction on the page Competitors to specify misses on the form PPPLLSS, where PPP is the point orienteering error in millimeters, LL misses lying and SS is misses standing. Example 30201 means 3 mm error, 2 lying and 1 standing miss.
olshooting:notimepunishment = Result list Orienteering/Shooting without Time Punishment.\n\nActivate support for Rogaining and manual point adjustments. The use the field Point reduction on the page Competitors to specify misses on the form LLSS, where LL means misses lying and SS means misses standing. Example: 0201 means 2 lying and 1 standing miss.
Namnet kan inte vara tomt = The name cannot be empty
Ingen / okänd = None / unknown
Inget nummer = No number
@ -1936,7 +1936,7 @@ Avkortad banvariant = Shortened course
Avkortning = Shortening
Hantera laget = Manage team
Med avkortning = With shortening
info_shortening = Select an existing course that shortens the current course. Several levels of shortening is possible.
info_shortening = Select an existing course that shortens the current course. Several levels of shortening are possible.
Tilldela starttider = Assign start times
Avkortar: X = Shortens: X
Vill du nollställa alla manuellt tilldelade banor? = Do you wish to clear all manually assigned courses?
@ -2030,7 +2030,7 @@ Vill du att X och Y byter sträcka? = Do you want X and Y to switch leg?
Vill du att X tar sträckan istället för Y? = Do you want X to run the leg instead of Y?
Ändra lagets gaffling = Change Team Forking
Deltagarens klass styrs av laget = The class is defined by the team
För att delta i en lagklass måste deltagaren ingå i ett lag = To participate in a team class you need to assign a team to the competitor
För att delta i en lagklass måste deltagaren ingå i ett lag = To participate in a team class, you need to assign a team to the competitor
Dela upp = Split
Alla sträckor = All legs
Liveresultat, deltagare = Live Results, individual
@ -2067,13 +2067,13 @@ StartTimeForClassRange = Class start time range
TeamStartCond = Team's start time (if individual)
Liveresultat = Live Results
Visa rullande tider mellan kontroller i helskärmsläge = Show rolling times between controls in full screen mode
help:liveresultat = This method starts a timer in full screen mode (large-screen) when a competitor in a selected class punches the <From> control, and measures the time until the <To> control is reached. Otherwise a top list with the best results is shown. Both controls need of course be online controls and if you use a network, make sure to activate <fast advance information on control punches> to get a responsive timer.
help:liveresultat = This method starts a timer in full screen mode (large-screen) when a competitor in a selected class punches the <From> control, and measures the time until the <To> control is reached. Otherwise, a top list with the best results is shown. Both controls need of course be online controls and if you use a network, make sure to activate <fast advance information on control punches> to get a responsive timer.
Result at a control = Result at a control
Total/team result at a control = Total/team result at a control
prefsAccount = Default account number
prefsAddress = Default address
prefsAdvancedClassSettings = Show advanced class settings
prefsAutoSaveTimeOut = Automatic backup intervall (ms)
prefsAutoSaveTimeOut = Automatic backup interval (ms)
prefsCardFee = Default card fee
prefsClient = Name of client in a network
Vissa inställningar kräver omstart av MeOS för att ha effekt = Some settings require a restart of MeOS to have effect
@ -2168,7 +2168,7 @@ Inget filter = No filter
Inlästa stämplar = Read punches
Löpare saknas = No competitor
Klasserna X och Y har samma externa id. Använd tabelläget för att ändra id = The classes X and Y have the same external id. Use the table mode to correct the id
Vill du koppla isär X från inläst bricka Y? = Would you like to disconnect X from the read out card Y?
Vill du koppla isär X från inläst bricka Y? = Would you like to disconnect X from the read-out card Y?
RunnerRogainingPointGross = Rogaining points before reduction
Samlade poäng = Collected points
Tidsavdrag = Reduction
@ -2278,7 +2278,7 @@ Markera för att förhindra oavsiktlig ändring av gafflingsnycklar = Check to p
Tillåt gafflingsändringar = Allow forking modification
ask:updatetimes = Do you wish to keep all currently assigned start times, if possible? Answer no to move the competition in time.
X har en tid (Y) som inte är kompatibel med förändringen = X has a time (Y) that is incompatible with this change
warn:latestarttime = Using start times more than X hours after the zero time is not recommended, since older SI cards only has a 12 hour clock.\n\nDo you wish to proceed anyway?
warn:latestarttime = Using start times more than X hours after the zero time is not recommended, since older SI cards only has a 12-hour clock.\n\nDo you wish to proceed anyway?
Anm. tid = Entry time
RunnerEntryDate = Competitor's entry date
RunnerEntryTime = Competitor's entry time
@ -2296,7 +2296,7 @@ Testa servern = Test the server
help:rest = MeOS REST API lets you access competition data via a web connection. You can show result lists directly in a web browser, but you can also request competition data and results in an XML format, suitable for further processing in third party programs and apps.
Server startad på X = Server running on port X
Inconsistent qualification rule, X = Inconsistent qualification rule, X
help:LockStartList = MeOS will not update assignement to a locked class even if qualification results are altered.
help:LockStartList = MeOS will not update assignment to a locked class even if qualification results are altered.
Kval/final-schema = Qualification/final scheme
Lås startlista = Lock start list
FilterNoCancel = Not cancelled
@ -2309,7 +2309,7 @@ Rogaining results for a patrol = Rogaining results for a patrol of two or more c
Exportera ett kalkylblad med lottningsinställningar som du kan redigera och sedan läsa in igen = Export a spreadsheet with draw settings that you can edit and then import again
Kalkylblad/csv = Spreadsheet/csv
Importerar lottningsinställningar = Importing draw settings
help:exportdraw = You can export a spreadsheet in csv format, containing classes, number of comptitors, and draw settings for each class. It is then possible to edit the start data and then import it back into MeOS to draw the classes accordingly.
help:exportdraw = You can export a spreadsheet in csv format, containing classes, number of competitors, and draw settings for each class. It is then possible to edit the start data and then import it back into MeOS to draw the classes accordingly.
prefsDrawInterlace = Interlace class/course when drawing start lists
prefsServicePort = Default service port
Ingen nummerlapp = No bib
@ -2367,7 +2367,7 @@ Endast tidtagning (utan banor), stafett = Only timekeeping (no courses), relay
Individuellt = Individual
Lag och stafett = Team and relay
Övrigt = Miscellaneous
htmlhelp = HTML can be exported as a structured table or as a freely formatted document (more similar to the MeOS lists). You can also use export templates for custom formatting: columns, JavaScript base page flips, automatic scrolling, etc. It is possible to add custom templates by adding '.template' files in MeOS data folder. If you use a template there is a number of parameters to set below. The exact interpretation depends on the template..\n\nIf you select <Store Settings> the list and its settings is stored permanently in the competition. You can then access the list by using MeOS as a web server (The service 'Information Server') or export the list automatically at regular intervals.
htmlhelp = HTML can be exported as a structured table or as a freely formatted document (more similar to the MeOS lists). You can also use export templates for custom formatting: columns, JavaScript base page flips, automatic scrolling, etc. It is possible to add custom templates by adding '.template' files in MeOS data folder. If you use a template there is a number of parameters to set below. The exact interpretation depends on the template.\n\nIf you select <Store Settings> the list and its settings is stored permanently in the competition. You can then access the list by using MeOS as a web server (The service 'Information Server') or export the list automatically at regular intervals.
HTML Export = HTML Export
HTML Export för 'X' = HTML Export of 'X'
Lagra inställningar = Store settings
@ -2378,7 +2378,7 @@ Begränsa antal rader per sida = Limit rows per page
Färre slingor = Fewer loops
RunnerGrossTime = Competitor's time before adjustment
TeamGrossTime = Team's time before adjustment
Visa detaljerad rapport för viss deltagare = Show a detailed report for a specific competor
Visa detaljerad rapport för viss deltagare = Show a detailed report for a specific competitor
Förhindra att laget deltar i någon omstart = Prevent that the team takes part in a restart
Förhindra omstart = Prevent restart
Ej omstart = No restart
@ -2408,7 +2408,7 @@ info:pageswithcolumns = Show the list one page at the time, with the specified n
Pages with columns = Pages with columns
Pages with columns, no header = Pages with columns, no header
Externa adresser = External links
info:advanceinfo = Starting the service for instant result transfer failed. Results will be recieved with a few seconds delay. This is expected behaviour if more than one MeOS process is started on this computer.
info:advanceinfo = Starting the service for instant result transfer failed. Results will be received with a few second's delay. This is expected behavior if more than one MeOS process is started on this computer.
Klassen är full = The class is full
Flytta upp = Move up
Flytta ner = Move down
@ -2492,7 +2492,7 @@ Vakansplacering = Vacancy placement
Först = First
Lottat = Drawn
Sist = Last
Fakturadatum = Fakturadatum
Fakturadatum = Invoice date
Youth Cup X = Youth Cup X
Ny startgrupp = New starting group
Slut = End
@ -2509,7 +2509,7 @@ Infoga version: X = Merge version: X
Samma bastävling = Same base competition
Sammanslagning fungerar om samma uppsättning banor/kontroller används = The merge will work if the same set of courses and controls are used
Varning: Olika bastävlingar = Warning: Different base competitions
Borttagna: X = Borttagna: X
Borttagna: X = Removed: X
Fel: En tävling kan inte slås ihop med sig själv = Error: Cannot merge a competition with itself
Sammanfattning, uppdateradet poster = Summary, updated data entities
Sammanslagning klar = Merge complete
@ -2522,7 +2522,7 @@ Flytta deltagare från överfulla grupper = Move competitors from full groups
Lotta med startgrupper = Draw with Starting Groups
Startgrupp med id X tilldelad Y finns inte = Starting group with ID X defined for Y does not exist
Använd om möjligt samma dator som användes vid senaste importen = If possible, use the same computer that was used to import the last time
Tillåt borttagning av löpare (med mera) som raderats i den importerade tävlingen = Allow removal of competitors (etc) that has was deleted in the imported version.
Tillåt borttagning av löpare (med mera) som raderats i den importerade tävlingen = Allow removal of competitors (etc) that were deleted in the imported version.
Varning: Kunde inte hitta föregående version av tävlingen (X) = Warning: Could not find the previous version of the competition (X)
ClassDefaultResult = Class, Default result
RunnerCoursePlace = Competitor's place on course
@ -2532,16 +2532,16 @@ RunnerStageTime = Competitor's time (on stage)
RunnerStageStatus = Competitor's status (on stage)
RunnerStageTimeStatus = Competitor's time or status (on stage)
EFilterIncludeNotParticipating = Include not participating
RunnerStageNumber = Stage number earlier stage
RunnerStageNumber = Stage number (for result of previous stage)
Begränsa bredd (klipp text) = Limit width (crop text)
Håll ihop med = Keep columns close
Justering i sidled = Line adjustment
Justering i sidled = Horizontal adjustment
Minsta blockbredd = Least width
Relation till föregående = Relation to previous
Bantilldelning hänvisar till en löpare (X) som saknas i laget (Y) = Course assignment specifies a competitor (X) that is missing in the team (Y)
warn:mysqlbinlog = Performance warning: Could not disable binary logging. Uploading can be slow.\n\nX
Server version: X = Server version: X
prefsDatabaseEngine = Typ av databastabell för nya tävlingar (MySQL)
prefsDatabaseEngine = Type of database table for new competitions (MySQL)
Startgrupperna X och Y överlappar = Start groups X and Y are overlapping
Batteristatus = Battery status
Low = Low
@ -2563,7 +2563,7 @@ Ljudval = Sound selection
Markera allt (X) = Select all (X)
Markera inget (X) = Select none (X)
Ny ledare i klassen = New class leader
Sparade automater = Saved machines
Sparade automater = Saved services
Spela upp ett ljud för att indikera resultatet av brickavläsningen = Play a sound to indicate the result of the card readout.
Status inte OK (röd utgång) = Status not OK (red exit)
help:selectsound = Select sounds to play. By default MeOS builtin sounds are played.
@ -2584,7 +2584,7 @@ Sortera stigande = Sort increasing
Sök symbol = Search for symbol
Testa = Test
Fel: Använd X i texten där värdet (Y) ska sättas in = Error: Use X in the text where the value (Y) should be used
info:teamcourseassignment = The imported file contains forking data for teams. To import this data you must prepare the competition to match the imported file: \n\n1. Ensure all classes are setup with the correct number of legs.\n2. Provide bib numbers in each class. Use Quick Settings on the page Classes and enter the first bib number in each class (meaning automatic bib setting). You can also import the teams first and assign bibs as usual.\n3. Import the courses. You can import this file several times if needed to update the forking.
info:teamcourseassignment = The imported file contains forking data for teams. To import this data, you must prepare the competition to match the imported file: \n\n1. Ensure all classes are setup with the correct number of legs.\n2. Provide bib numbers in each class. Use Quick Settings on the page Classes and enter the first bib number in each class (meaning automatic bib setting). You can also import the teams first and assign bibs as usual.\n3. Import the courses. You can import this file several times if needed to update the forking.
Försvunnen = Missing
Automatnamn = Service name
Använd = Use

View File

@ -1473,6 +1473,7 @@ void GeneralResult::calculateIndividualResults(vector<pRunner> &runners,
const pair<int, int> & controlId,
bool totalResults,
bool inclForestRunners,
bool inclPreliminary,
const string &resTag,
oListInfo::ResultType resType,
int inputNumber,
@ -1491,7 +1492,7 @@ void GeneralResult::calculateIndividualResults(vector<pRunner> &runners,
for (pRunner r : runners) {
clsId.insert(r->getClassId(true));
}
oe.calculateResults(clsId, oEvent::ResultType::ClassResult, true);
oe.calculateResults(clsId, oEvent::ResultType::ClassResult, inclPreliminary);
for (pRunner r : runners) {
ri.status = r->getStatus();
if (ri.status == StatusUnknown) {
@ -1520,7 +1521,7 @@ void GeneralResult::calculateIndividualResults(vector<pRunner> &runners,
}
}
else {
oe.calculateResults(set<int>(), oEvent::ResultType::TotalResult, true);
oe.calculateResults(set<int>(), oEvent::ResultType::TotalResult, inclPreliminary);
for (pRunner r : runners) {
ri.status = r->getTotalStatus();
if (ri.status == StatusUnknown && r->getInputStatus() == StatusOK) {

View File

@ -128,6 +128,7 @@ public:
const pair<int, int> &controlId,
bool totalResults,
bool inclForestRunners,
bool inclPreliminary,
const string &resTag,
oListInfo::ResultType resType,
int inputNumber,

View File

@ -187,6 +187,7 @@
<h2>Results</h2>
<b>Syntax:</b>
<pre><a href="/meos?get=result">/meos?get=result</a></pre>
<pre><a href="/meos?get=result">/meos?get=result#preliminary=false</a></pre>
<pre>/meos?get=result#class=*c1>,*c2>,...</pre>
<pre>/meos?get=result#to=*c1></pre>
<pre>/meos?get=result#from=*c1></pre>
@ -200,6 +201,7 @@
<b>Arguments:</b>
<ul>
<li><i>class</i> A list of one or more class id:s, separated by comma. The default is all classes.</li>
<li><i>preliminary</i> Control if preliminary results are returned. Preliminary results include competitors that have finished but not yet read out the card. The default is true.</li>
<li>
<i>from</i> Returns the result measuring time from a specific control. If a specified class
does not visit the control, an empty result set is returned; no error is given.

View File

@ -89,6 +89,20 @@ void ImportFormats::getOECSVLanguage(vector< pair<wstring, size_t> > &typeLangua
typeLanguages.push_back(make_pair(L"Russian", 6));
}
wstring ImportFormats::getExtension(ExportFormats fm) {
switch (fm) {
case IOF30:
case IOF203:
return L"xml";
case OE:
return L"csv";
case HTML:
return L"html";
}
throw exception();
}
int ImportFormats::getDefaultCSVLanguage(oEvent &oe) {
string currentLanguage = oe.getPropertyString("Language", "English");
int defaultLanguageType = 1;

View File

@ -59,6 +59,8 @@ public:
static int getDefaultCSVLanguage(oEvent &oe);
static wstring getExtension(ExportFormats fm);
private:
ImportFormatOptions option;
};

View File

@ -3362,7 +3362,7 @@ void IOF30Interface::writePersonResult(xmlparser &xml, const oRunner &r,
if (r.getNumMulti() > 0) {
for (int k = 0; k <= r.getNumMulti(); k++) {
const pRunner tr = r.getMultiRunner(k);
if (tr)
if (tr && tr->getClassRef(true) == r.getClassRef(true))
writeResult(xml, *tr, *tr, includeCourse, includeStageRaceInfo, teamMember, hasInputTime);
}
}
@ -3394,6 +3394,7 @@ void IOF30Interface::writeResult(xmlparser &xml, const oRunner &rPerson, const o
writeLegOrder(xml, rPerson.getClassRef(false), rPerson.getLegNumber());
bool patrolResult = r.getTeam() && r.getClassRef(false)->getClassType() == oClassPatrol && !teamsAsIndividual;
bool qualFinal = r.getTeam() && r.getTeam()->getClassRef(false) != r.getClassRef(true);
wstring bib = rPerson.getBib();
if (!bib.empty())
@ -3474,7 +3475,7 @@ void IOF30Interface::writeResult(xmlparser &xml, const oRunner &rPerson, const o
xml.write("Score", "type", L"Score", itow(rg));
xml.write("Score", "type", L"Penalty", itow(r.getRogainingReduction(true)));
}
if ( (r.getTeam() && r.getClassRef(false)->getClassType() != oClassPatrol && !teamsAsIndividual) || hasInputTime) {
if ( (r.getTeam() && r.getClassRef(false)->getClassType() != oClassPatrol && !teamsAsIndividual && !qualFinal) || hasInputTime) {
xml.startTag("OverallResult");
int rt = r.getTotalRunningTime();
@ -3677,9 +3678,10 @@ void IOF30Interface::writeEvent(xmlparser &xml) {
void IOF30Interface::writePerson(xmlparser &xml, const oRunner &r) {
xml.startTag("Person");
__int64 id = r.getExtIdentifier();
if (id != 0)
if (r.getExtIdentifier() != 0)
xml.write("Id", r.getExtIdentifierString());
else if (r.getMainRunner()->getExtIdentifier() != 0)
xml.write("Id", r.getMainRunner()->getExtIdentifierString());
xml.startTag("Name");
xml.write("Family", r.getFamilyName());
@ -3818,7 +3820,7 @@ void IOF30Interface::getRunnersToUse(const pClass cls, vector<pRunner> &rToUse,
if (leg == -1 && indRel && r[j]->getLegNumber() != 0)
continue; // Skip all but leg 0 for individual relay
if (leg == -1 && !indRel && r[j]->getTeam())
if (leg == -1 && !indRel && (r[j]->getTeam() && r[j]->getTeam()->getClassRef(true) == cls))
continue; // For teams, skip presonal results, unless individual relay
if (!includeUnknown && !r[j]->hasResult())

View File

@ -288,7 +288,18 @@ ButtonInfo &ListEditor::addButton(gdioutput &gdi, const MetaListPost &mlp, int x
if (text[0] == '@') {
vector<wstring> part;
split(text.substr(1), L";", part);
unsplit(part, L"|", cap);
for (int j = 0; j < part.size(); j++) {
if (part[j].empty())
continue;
else if (part[j][0] == '@')
part[j] = part[j].substr(1);
if (!cap.empty())
cap += L"|";
else
cap += L"#";
cap += lang.tl(part[j] + L"#" + itow(j));
}
}
else
cap = text + L"#" + lang.tl(mlp.getType());
@ -1201,11 +1212,19 @@ void ListEditor::showExample(gdioutput &gdi, const MetaListPost &mlp) {
RECT rrInner;
rrInner.left = x1 + margin;
rrInner.top = gdi.getCY();
bool hasSymbol;
bool hasSymbol, hasStringMap = false;
lastShownExampleText = mlp.getText();
GDICOLOR color = GDICOLOR::colorLightGreen;
wstring text = MetaList::encode(mlp.getTypeRaw(), lastShownExampleText, hasSymbol);
if (!hasSymbol) {
if (mlp.getTypeRaw() == lResultModuleNumber || mlp.getTypeRaw() == lResultModuleNumberTeam) {
if (text.length() > 0 && text[0]=='@') {
hasStringMap = true;
text = text.substr(1);
}
}
if (!hasSymbol && !hasStringMap) {
text = lang.tl("Fel: Använd X i texten där värdet (Y) ska sättas in.#X#%s");
color = GDICOLOR::colorLightRed;
}
@ -1224,10 +1243,15 @@ void ListEditor::showExample(gdioutput &gdi, const MetaListPost &mlp) {
set<wstring> used;
for (size_t i = 0; i < rr.size(); i++) {
int ix = (997 * i) % rr.size();
wstring s = oe->formatListString(mlp.getTypeRaw(), rr[i]);
wstring s;
if (!hasStringMap)
s = oe->formatListString(mlp.getTypeRaw(), rr[i]);
else
MetaList::fromResultModuleNumber(text, i, s);
if (used.insert(s).second) {
int xb = gdi.getCX();
if (!text.empty()) {
if (!text.empty() && !hasStringMap) {
wchar_t st[300];
swprintf_s(st, text.c_str(), s.c_str());
s = st;

View File

@ -64,6 +64,8 @@ public:
void saveUnknown(const wstring &file);
void saveTable(const wstring &file);
void saveTranslation(const wstring &file);
void loadTable(const wstring &file, const wstring &language);
void loadTable(int resource, const wstring &language);
@ -258,10 +260,11 @@ const wstring &LocalizerImpl::translate(const wstring &str, bool &found)
value[i] = str;
return value[i];
}
const wstring newline = L"\n";
void LocalizerImpl::saveUnknown(const wstring &file)
{
const wstring newline = L"\n";
if (!unknown.empty()) {
ofstream fout(file.c_str(), ios::trunc|ios::out);
for (map<wstring, wstring>::iterator it = unknown.begin(); it!=unknown.end(); ++it) {
@ -281,6 +284,13 @@ void LocalizerImpl::saveUnknown(const wstring &file)
key = L"help:" + itow(value.length()) + itow(value.find_first_of('.'));
}
}
else {
int nl = value.find(newline);
while (nl != string::npos) {
value.replace(nl, newline.length(), L"\\n");
nl = value.find(newline);
}
}
fout << toUTF8(key) << " = " << toUTF8(value) << endl;
}
}
@ -329,6 +339,7 @@ void Localizer::LocalizerInternal::debugDump(const wstring &untranslated, const
}
impl->saveUnknown(untranslated);
impl->saveTable(translated);
impl->saveTranslation(L"spellcheck.txt");
}
void LocalizerImpl::translateAll(const LocalizerImpl &all) {
@ -342,8 +353,8 @@ void LocalizerImpl::translateAll(const LocalizerImpl &all) {
}
}
void LocalizerImpl::saveTable(const wstring &file)
{
void LocalizerImpl::saveTable(const wstring &file) {
const wstring newline = L"\n";
ofstream fout(language+L"_"+file, ios::trunc|ios::out);
for (map<wstring, wstring>::iterator it = table.begin(); it!=table.end(); ++it) {
wstring value = it->second;
@ -356,6 +367,13 @@ void LocalizerImpl::saveTable(const wstring &file)
}
}
void LocalizerImpl::saveTranslation(const wstring &file) {
ofstream fout(language + L"_" + file, ios::trunc | ios::out);
for (map<wstring, wstring>::iterator it = table.begin(); it != table.end(); ++it) {
fout << toUTF8(it->second) << endl;
}
}
void LocalizerImpl::loadTable(int id, const wstring &language)
{
wstring sname = L"#"+itow(id);

View File

@ -25,17 +25,17 @@
//ABCDEFGHIJKLMNO
int getMeosBuild() {
string revision("$Rev: 1116 $");
string revision("$Rev: 1132 $");
return 174 + atoi(revision.substr(5, string::npos).c_str());
}
wstring getMeosDate() {
wstring date(L"$Date: 2022-02-18 14:51:32 +0100 (fre, 18 feb 2022) $");
wstring date(L"$Date: 2022-03-23 22:25:26 +0100 (ons, 23 mar 2022) $");
return date.substr(7,10);
}
wstring getBuildType() {
return L"RC2"; // No parantheses (...)
return L""; // No parantheses (...)
}
wstring getMajorVersion() {
@ -135,6 +135,7 @@ void getSupporters(vector<wstring> &supp, vector<wstring> &developSupp)
supp.emplace_back(L"Miroslav Kollar, KOB Kysak");
supp.emplace_back(L"Zdenko Rohac, KOB ATU Košice");
supp.emplace_back(L"Hans Carlstedt, Sävedalens AIK");
supp.emplace_back(L"Javier Arufe Varela, O-Liceo");
supp.emplace_back(L"O-Liceo, Spain");
developSupp.emplace_back(L"Västerviks OK");
reverse(supp.begin(), supp.end());
}

View File

@ -504,12 +504,17 @@ wstring MetaList::encode(EPostType type, const wstring &inputS, bool &foundSymbo
int sCount = 0;
if (type == EPostType::lString)
sCount = 1; // No symbols expected in string
bool outputNumberType = (type == EPostType::lResultModuleNumber || type == EPostType::lResultModuleNumberTeam) &&
input.length() > 0 && input[0] == '@';
for (size_t k = 0; k<input.length(); k++) {
int c = input[k];
int p = k > 0 ? input[k-1] : ' ';
int n = k+1 < input.length() ? input[k+1] : ' ';
if (outputNumberType && c == ';')
sCount = 0;
if (c == '%') {
out.push_back('%');
out.push_back('%');
@ -527,6 +532,34 @@ wstring MetaList::encode(EPostType type, const wstring &inputS, bool &foundSymbo
return out;
}
const wstring &MetaList::fromResultModuleNumber(const wstring &in, int nr, wstring &res) {
vector<wstring> out;
split(in, L";", out);
size_t ix = nr;
if (!out.empty() && ix + 1 >= out.size()) {
if (out.back().size() > 1 && out.back()[0] == '@') {
ix = out.size() - 1;
out[ix] = out[ix].substr(1);
}
if (out.back().find_first_of('%') != wstring::npos) {
ix = out.size() - 1;
}
}
if (ix < out.size()) {
res.swap(out[ix]);
if (res.find_first_of('%') != wstring::npos) {
wchar_t bf2[256];
swprintf_s(bf2, res.c_str(), itow(nr).c_str());
res = bf2;
}
}
else
res = L"";
return res;
}
MetaListPost &MetaList::add(ListIndex ix, const MetaListPost &post) {
if (data[ix].empty())
addRow(ix);

View File

@ -239,6 +239,7 @@ private:
public:
static wstring encode(EPostType type, const wstring &input, bool &foundSymbol);
static const wstring &fromResultModuleNumber(const wstring &in, int nr, wstring &out);
static void getAutoComplete(const wstring &w, vector<AutoCompleteRecord> &records);

View File

@ -546,8 +546,8 @@ pCard oEvent::getCardByNumber(int cno) const
oCardList::const_reverse_iterator it;
pCard second = 0;
for (it=Cards.rbegin(); it != Cards.rend(); ++it){
if (it->cardNo==cno) {
if (it->getOwner() == 0)
if (!it->isRemoved() && it->cardNo==cno) {
if (it->getOwner() == nullptr)
return const_cast<pCard>(&*it);
else if (second == 0)
second = const_cast<pCard>(&*it);

View File

@ -2362,7 +2362,7 @@ wstring oEvent::getZeroTime() const
void oEvent::setZeroTime(wstring m, bool manualSet)
{
unsigned nZeroTime = convertAbsoluteTime(m);
const unsigned nZeroTime = convertAbsoluteTime(m);
if (nZeroTime!=ZeroTime && nZeroTime != -1) {
if (manualSet)
setFlag(TransferFlags::FlagManualDateTime, true);
@ -2370,6 +2370,9 @@ void oEvent::setZeroTime(wstring m, bool manualSet)
updateChanged();
ZeroTime=nZeroTime;
}
else if (manualSet && !hasFlag(oEvent::TransferFlags::FlagManualDateTime)) {
setFlag(TransferFlags::FlagManualDateTime, true);
}
}
void oEvent::setName(const wstring &m, bool manualSet)
@ -4341,15 +4344,28 @@ void oEvent::convertTimes(pRunner runner, SICard &sic) const
if (sic.convertedTime == ConvertedTimeStatus::Hour12) {
int startTime = ZeroTime + 3600; //Add one hour. Subtracted below
int startTime = ZeroTime + 2*3600; //Add two hours. Subtracted below
if (useLongTimes())
startTime = 5 * 3600; // Avoid midnight as default. Prefer morning
startTime = 7 * 3600; // Avoid midnight as default. Prefer morning
int st = -1;
if (runner) {
st = runner->getStartTime();
if (st > 0) {
startTime = (ZeroTime + st) % (3600 * 24);
if (sic.StartPunch.Code == -1)
startTime = (ZeroTime + st) % (3600 * 24); // No start punch
else {
// Got start punch. If this is close to specified start time,
// use specified start time
const int stPunch = sic.StartPunch.Time; // 12 hour
const int stStart = startTime = (ZeroTime + st) % (3600 * 12); // 12 hour
if (std::abs(stPunch - stStart) < 1800) {
startTime = (ZeroTime + st) % (3600 * 24); // Use specified start time (for conversion)
}
else {
st = -1; // Ignore start time
}
}
}
else {
st = -1;
@ -4370,7 +4386,7 @@ void oEvent::convertTimes(pRunner runner, SICard &sic) const
startTime = (ZeroTime + relT12) % (3600 * 24);
}
}
int zt = (startTime + 23 * 3600) % (24 * 3600); // Subtract one hour
int zt = (startTime + 22 * 3600) % (24 * 3600); // Subtract two hours from start time
sic.analyseHour12Time(zt);
}
sic.convertedTime = ConvertedTimeStatus::Done;

View File

@ -895,6 +895,8 @@ protected:
void calculateModuleTeamResults(const set<int> &cls, vector<oTeam *> &teams);
unsigned int lastTimeConsistencyCheck = 0;
mutable bool lastResultCalcPrelState = false;
public:
void updateStartTimes(int delta);

View File

@ -223,7 +223,9 @@ void oEvent::calculateResults(const set<int> &classes, ResultType resultType, bo
getRunners(classes, runnersCls);
runners.reserve(runnersCls.size());
bool resOK = true;
bool resOK = lastResultCalcPrelState == includePreliminary;
lastResultCalcPrelState = includePreliminary;
for (auto it : runnersCls) {
oRunner &r = *it;

View File

@ -348,7 +348,7 @@ void renderRowSpeakerList(const oSpeakerObject &r, const oSpeakerObject *next_r,
row.push_back(SpeakerString(normalText, r.club));
if (r.status == StatusOK) {
if (r.status == StatusOK || (r.status == StatusUnknown && r.runningTime.time > 0)) {
row.push_back(SpeakerString(textRight, formatTime(r.runningTime.preliminary)));
if (r.runningTime.time != r.runningTimeLeg.time)
@ -599,7 +599,7 @@ void oEvent::speakerList(gdioutput &gdi, int ClassId, int leg, int ControlId,
list<oSpeakerObject>::iterator sit;
for (sit=speakerList.begin(); sit != speakerList.end(); ++sit) {
if (sit->status==StatusOK && sit->priority>=0)
if (sit->hasResult() && sit->priority>=0)
sit->priority=1;
else if (sit->status > StatusOK && sit->priority<=0)
sit->priority=-1;
@ -653,7 +653,7 @@ void oEvent::speakerList(gdioutput &gdi, int ClassId, int leg, int ControlId,
//Calculate leader-time
for(sit=speakerList.begin(); sit != speakerList.end(); ++sit) {
int rt = sit->runningTime.time;
if (sit->status==StatusOK && rt>0)
if ((sit->status==StatusOK || sit->status == StatusUnknown) && rt>0)
LeaderTime=min(LeaderTime, rt);
}
@ -670,7 +670,7 @@ void oEvent::speakerList(gdioutput &gdi, int ClassId, int leg, int ControlId,
++sit;
oSpeakerObject *next = sit != speakerList.end() ? &*sit : 0;
int type = 3;
if (so->priority > 0 || (so->status==StatusOK && so->priority>=0))
if (so->priority > 0 || (so->hasResult() && so->priority>=0))
type = 1;
else if (so->status == StatusUnknown && so->priority==0)
type = 2;
@ -720,7 +720,7 @@ void oEvent::speakerList(gdioutput &gdi, int ClassId, int leg, int ControlId,
rendered = false;
for (size_t k = 0; k < toRender.size(); k++) {
oSpeakerObject *so = toRender[k].first;
if (so && (so->priority > 0 || (so->status==StatusOK && so->priority>=0))) {
if (so && (so->priority > 0 || (so->hasResult() && so->priority>=0))) {
if (rendered == false) {
gdi.addString("", y, x, boldSmall, "Resultat");
y+=lh+5, rendered=true;
@ -734,7 +734,7 @@ void oEvent::speakerList(gdioutput &gdi, int ClassId, int leg, int ControlId,
rendered = false;
for (size_t k = 0; k < toRender.size(); k++) {
oSpeakerObject *so = toRender[k].first;
if (so && so->status == StatusUnknown && so->priority==0) {
if (so && so->isIncomming() && so->priority==0) {
if (rendered == false) {
gdi.addString("", y+4, x, boldSmall, "Inkommande");
y+=lh+5, rendered=true;
@ -1721,10 +1721,14 @@ void oEvent::getResultEvents(const set<int> &classFilter, const set<int> &punchF
const oRunner &r = *it;
if (r.isRemoved() || !classFilter.count(r.getClassId(true)))
continue;
if (r.getStatusComputed() != StatusOutOfCompetition &&
r.getStatusComputed() != StatusNoTiming &&
(r.prelStatusOK(true, false) || r.getStatusComputed() != StatusUnknown)) {
if (r.getStatusComputed() == StatusOutOfCompetition || r.getStatusComputed() == StatusNoTiming)
continue;
bool wroteResult = false;
if (r.prelStatusOK(true, false) || r.getStatusComputed() != StatusUnknown) {
RunnerStatus stat = r.prelStatusOK(true, false) ? StatusOK : r.getStatusComputed();
wroteResult = true;
results.push_back(ResultEvent(pRunner(&r), r.getFinishTime(), oPunch::PunchFinish, stat));
}
pCard card = r.getCard();
@ -1735,7 +1739,8 @@ void oEvent::getResultEvents(const set<int> &classFilter, const set<int> &punchF
if (res != teamStatusPos.end()) {
RunnerStatus prevStat = teamLegStatusOK[res->second + r.tLeg - 1];
if (prevStat != StatusOK && prevStat != StatusUnknown) {
results.back().status = StatusNotCompetiting;
if (wroteResult)
results.back().status = StatusNotCompetiting;
punchStatus = StatusNotCompetiting;
}
}

View File

@ -315,6 +315,22 @@ int oListInfo::getMaxCharWidth(const oEvent *oe,
for (size_t k = 0; k < pps.size(); k++) {
wstring extra;
switch (pps[k].type) {
case lResultModuleNumber:
case lResultModuleNumberTeam:
if (pps[k].text.length() > 1 && pps[k].text[0] == '@') {
wstring tmp;
int miLen = 0;
for (int j = 0; j < 10; j++) {
tmp = MetaList::fromResultModuleNumber(pps[k].text.substr(1), j, tmp);
if (tmp.length() > miLen / 2) {
miLen = tmp.length();
extras[k].add(tmp);
}
}
}
else
extra = L"999";
break;
case lRunnerCardVoltage:
extra = L"3.00 V";
break;
@ -404,8 +420,6 @@ int oListInfo::getMaxCharWidth(const oEvent *oe,
case lTeamTotalPlace:
case lPunchControlPlace:
case lPunchControlPlaceAcc:
case lResultModuleNumber:
case lResultModuleNumberTeam:
case lRunnerStagePlace:
extra = L"99.";
break;
@ -2330,24 +2344,8 @@ const wstring &oEvent::formatListStringAux(const oPrintPost &pp, const oListPara
if (pp.text.empty() || pp.text[0]!='@')
wsptr = &itow(nr);
else {
vector<wstring> out;
split(pp.text.substr(1), L";", out);//WCS
wstring &res = StringCache::getInstance().wget();
size_t ix = nr;
if (!out.empty() && ix >= out.size() && out.back().find_first_of('%') != out.back().npos) {
ix = out.size() - 1;
}
if (ix < out.size()) {
res.swap(out[ix]);
if (res.find_first_of('%') != res.npos) {
wchar_t bf2[256];
swprintf_s(bf2, res.c_str(), itow(nr).c_str());
res = bf2;
}
}
else
res = L"";
MetaList::fromResultModuleNumber(pp.text.substr(1), nr, res);
return res;
}
}

View File

@ -272,11 +272,11 @@ oRunner::oRunner(oEvent *poe) :oAbstractRunner(poe, false)
{
isTemporaryObject = false;
Id = oe->getFreeRunnerId();
Course = 0;
Course = nullptr;
StartNo = 0;
cardNumber = 0;
tInTeam = 0;
tInTeam = nullptr;
tLeg = 0;
tLegEquClass = 0;
tNeedNoCard = false;
@ -285,9 +285,9 @@ oRunner::oRunner(oEvent *poe) :oAbstractRunner(poe, false)
correctionNeeded = false;
tDuplicateLeg = 0;
tParentRunner = 0;
tParentRunner = nullptr;
Card = 0;
Card = nullptr;
cPriority = 0;
tCachedRunningTime = 0;
@ -309,11 +309,11 @@ oRunner::oRunner(oEvent *poe, int id) :oAbstractRunner(poe, true)
isTemporaryObject = false;
Id = id;
oe->qFreeRunnerId = max(id, oe->qFreeRunnerId);
Course = 0;
Course = nullptr;
StartNo = 0;
cardNumber = 0;
tInTeam = 0;
tInTeam = nullptr;
tLeg = 0;
tLegEquClass = 0;
tNeedNoCard = false;
@ -322,9 +322,9 @@ oRunner::oRunner(oEvent *poe, int id) :oAbstractRunner(poe, true)
correctionNeeded = false;
tDuplicateLeg = 0;
tParentRunner = 0;
tParentRunner = nullptr;
Card = 0;
Card = nullptr;
cPriority = 0;
tCachedRunningTime = 0;
tSplitRevision = -1;
@ -359,7 +359,7 @@ oRunner::~oRunner()
}
delete tAdaptedCourse;
tAdaptedCourse = 0;
tAdaptedCourse = nullptr;
}
bool oRunner::Write(xmlparser &xml)

View File

@ -1,13 +1,4 @@
// oRunner.h: interface for the oRunner class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ORUNNER_H__D3B8D6C8_C90A_4F86_B776_7D77E5C76F42__INCLUDED_)
#define AFX_ORUNNER_H__D3B8D6C8_C90A_4F86_B776_7D77E5C76F42__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#pragma once
/************************************************************************
MeOS - Orienteering Software
@ -675,6 +666,9 @@ protected:
public:
static const shared_ptr<Table> &getTable(oEvent *oe);
oRunner *getMainRunner() { return tParentRunner != nullptr ? tParentRunner : this; }
const oRunner* getMainRunner() const { return tParentRunner != nullptr ? tParentRunner : this; }
int getStartGroup(bool useTmpStartGroup) const;
void setStartGroup(int sg);
@ -977,5 +971,3 @@ public:
static bool sortSplit(const oRunner &a, const oRunner &b);
};
#endif // !defined(AFX_ORUNNER_H__D3B8D6C8_C90A_4F86_B776_7D77E5C76F42__INCLUDED_)

View File

@ -1402,6 +1402,7 @@ void oTeam::speakerLegInfo(int leg, int specifiedLeg, int courseControlId,
RunnerStatus &status, int &runningTime) const {
missingLeg = 0;
totalLeg = 0;
bool prelRes = false;
bool extra = false, firstExtra = true;
for (int i = leg; i <= specifiedLeg; i++) {
LegTypes lt=Class->getLegType(i);
@ -1433,25 +1434,29 @@ void oTeam::speakerLegInfo(int leg, int specifiedLeg, int courseControlId,
runningTime = lrt;
status = lst; // Take status/time from best runner
}
if (Runners[i] && lst == StatusUnknown)
missingLeg++;
if (Runners[i] && lst == StatusUnknown) {
if (lrt == 0)
missingLeg++;
}
}
else {
if (lst > StatusOK) {
status = lst;
break;
}
else if (lst == StatusUnknown) {
else if (lst == StatusUnknown && lrt == 0) {
missingLeg++;
}
else {
runningTime = max(lrt, runningTime);
if (lst == StatusUnknown)
prelRes = true;
}
}
}
}
if (missingLeg == 0 && status == StatusUnknown)
if (missingLeg == 0 && status == StatusUnknown && !prelRes)
status = StatusOK;
}
@ -1626,9 +1631,15 @@ void oTeam::fillSpeakerObject(int leg, int courseControlId, int previousControlC
spk.runningTimeLeg.preliminary = spk.runningTimeLeg.time;
}
else if (spk.status==StatusUnknown && spk.finishStatus==StatusUnknown) {
spk.runningTime.time = spk.runningTimeLeg.preliminary + timeOffset;
spk.runningTime.time = 0;// spk.runningTimeLeg.preliminary + timeOffset;
spk.runningTime.preliminary = spk.runningTimeLeg.preliminary + timeOffset;
spk.runningTimeLeg.time = spk.runningTimeLeg.preliminary;
if (spk.runningTimeLeg.time > 0) {
spk.runningTime.time = spk.runningTimeLeg.time + timeOffset;
}
else {
spk.runningTime.time = 0;
// spk.runningTimeLeg.time = 0;// spk.runningTimeLeg.preliminary;
}
}
else if (spk.status==StatusUnknown)
spk.status=StatusMP;

View File

@ -460,14 +460,14 @@ void OnlineResults::process(gdioutput &gdi, oEvent *oe, AutoSyncType ast) {
key.push_back(mk1);
pair<wstring, wstring> mk2(L"pwd", passwd);
key.push_back(mk2);
if (zipFile) {
pair<wstring, wstring> mk3(L"Content-Type", L"application/zip");
key.push_back(mk3);
} else {
pair<wstring, wstring> mk3(L"Content-Type", L"application/xml");
key.push_back(mk3);
}
if (zipFile) {
pair<wstring, wstring> mk3(L"Content-Type", L"application/zip");
key.push_back(mk3);
}
else {
pair<wstring, wstring> mk3(L"Content-Type", L"application/xml");
key.push_back(mk3);
}
bool moreToWrite = true;
string tmp;

View File

@ -85,6 +85,9 @@ public:
RunnerStatus status;
RunnerStatus finishStatus;
bool hasResult() const { return status == StatusOK || status == StatusUnknown && runningTime.time > 0; }
bool isIncomming() const { return status == StatusUnknown && runningTime.time <= 0; }
RunningTime runningTime;
RunningTime runningTimeLeg;
RunningTime runningTimeSinceLast;

View File

@ -673,6 +673,12 @@ void RestServer::getData(oEvent &oe, const string &what, const multimap<string,
sampleClass = tt[0];
}
bool includePreliminary = true;
if (param.count("preliminary")) {
const string& prl = param.find("preliminary")->second;
includePreliminary = atoi(prl.c_str()) > 0 || _stricmp(prl.c_str(), "true") == 0;
}
string resTag;
if (param.count("module") > 0)
resTag = param.find("module")->second;
@ -831,7 +837,8 @@ void RestServer::getData(oEvent &oe, const string &what, const multimap<string,
r.swap(r2);
}
GeneralResult::calculateIndividualResults(r, controlId, totalResult, inclRunnersInForest, resTag, resType, inputNumber, oe, results);
GeneralResult::calculateIndividualResults(r, controlId, totalResult, inclRunnersInForest, includePreliminary,
resTag, resType, inputNumber, oe, results);
if (resType == oListInfo::Classwise)
@ -854,7 +861,7 @@ void RestServer::getData(oEvent &oe, const string &what, const multimap<string,
int place = -1;
int cClass = -1;
int counter = 0;
for (const auto &res : results) {
for (auto &res : results) {
if (res.src->getClassId(true) != cClass) {
counter = 0;
place = 1;
@ -863,6 +870,10 @@ void RestServer::getData(oEvent &oe, const string &what, const multimap<string,
if (++counter > limit && (place != res.place || res.status != StatusOK))
continue;
place = res.place;
if (!includePreliminary && res.src->getStatus() == StatusUnknown)
res.status = StatusUnknown;
writePerson(res, reslist, true, resType == oListInfo::Coursewise, rProp);
}
reslist.endTag();

View File

@ -791,7 +791,7 @@ Resultatutskrift = Resultatutskrift
Resultatutskrift / export = Resultatutskrift/export
Rogaining = Rogaining
Rogaining, individuell = Rogaining, individuell
Rogaining-poäng = Rogaining-poäng
Rogaining-poäng = Rogainingpoäng
RogainingPunch = Stämpling, rogaining
Rubrik = Rubrik
Rulla upp och ner automatiskt = Rulla upp och ner automatiskt
@ -1571,7 +1571,7 @@ Organisatör = Organisatör
Tilldela nya fakturanummer till alla klubbar? = Tilldela nya fakturanummer till alla klubbar?
Exportera alla till PDF = Exportera alla till PDF
help:onlineresult = Automaten används för att skicka resultat och startlistor för direkt visning på webben eller i appar. Du måste göra inställningar som är anpassade för den tjänst du vill utnyttja: tjänsteleverantören kan ge dig detaljer.\n\nOm du vill utveckla egna tjänster finns dokumentation och exempel på MeOS hemsida: www.melin.nu/meos.
help:onlineinput = Automaten används för att ta emot radiostämplingar från internet, t.ex. radiokontroller anslutna via mobiltelefon. Det är också möjligt att ha ett enkelt webbformulär där personer vid en bemannad radiokontroll fyller i nummerlappasnummer på dem som passerar.\n\nAutomatens protokoll stöder också andra typer av inmatningar, såsom laguppställningar, direktanmälningar, brickändringar m.m. Om du vill utveckla egna tjänster finns dokumentation och exempel på MeOS hemsida: www.melin.nu/meos.
help:onlineinput = Automaten används för att ta emot radiostämplingar från internet, t.ex. radiokontroller anslutna via mobiltelefon. Det är också möjligt att ha ett enkelt webbformulär där personer vid en bemannad radiokontroll fyller i nummerlappsnummer på dem som passerar.\n\nAutomatens protokoll stöder också andra typer av inmatningar, såsom laguppställningar, direktanmälningar, brickändringar m.m. Om du vill utveckla egna tjänster finns dokumentation och exempel på MeOS hemsida: www.melin.nu/meos.
Egna textrader = Egna textrader
Inga bommar registrerade = Inga bommar registrerade
Inställningar sträcktidsutskrift = Inställningar sträcktidsutskrift
@ -1801,7 +1801,7 @@ Runner/team input running time = Deltagares/lags ingångstid
Runner/team input status = Deltagares/lags ingångsstatus
Runner/team place = Deltagares/lags placering
Runner/team rogaining overtime = Deltagares/lags rogaining-övertid
Runner/team rogaining points = Deltagares/lags rogaining-poäng
Runner/team rogaining points = Deltagares/lags rogainingpoäng
Runner/team rogaining points adjustment = Deltagares/lags manuella poängjustering
Runner/team running time = Deltagares/lags tid
Runner/team start time = Deltagares/lags starttid
@ -2063,7 +2063,7 @@ StartTimeForClassRange = Klassens starttidsområde
TeamStartCond = Lags starttid (om individuell)
Liveresultat = Liveresultat
Visa rullande tider mellan kontroller i helskärmsläge = Visa rullande tider mellan kontroller i helskärmsläge
help:liveresultat = Den här funktionen startar en timer i helskärmsläge (storbildskärm) när en deltagare i vald klass stämplar kontrollen från, och tar tid tills slutkontrollen nås. Däremellen visas en topplista med de bästa resultaten. Gör de inställningar som krävs, dra fönstret till den skärm som ska användas och tryck på <Starta>. Vid använding av nätverk bör <snabb förhandsinformation om stämplingar> vara aktiverat för att undvika fördröjningar.
help:liveresultat = Den här funktionen startar en timer i helskärmsläge (storbildsskärm) när en deltagare i vald klass stämplar kontrollen från, och tar tid tills slutkontrollen nås. Däremellan visas en topplista med de bästa resultaten. Gör de inställningar som krävs, dra fönstret till den skärm som ska användas och tryck på <Starta>. Vid användning av nätverk bör <snabb förhandsinformation om stämplingar> vara aktiverat för att undvika fördröjningar.
Result at a control = Resultat vid kontroll
Total/team result at a control = Lag- och totalresultat vid kontroll
Vissa inställningar kräver omstart av MeOS för att ha effekt = Vissa inställningar kräver omstart av MeOS för att ha effekt
@ -2082,7 +2082,7 @@ prefsCurrencyPreSymbol = Placera valutasymbol först
prefsCurrencySeparator = Decimalseparator för valuta
prefsCurrencySymbol = Valutasymbol
prefsDatabase = Använd löpardatabasen
prefsDatabaseUpdate = Senaste löparbasuppdatering
prefsDatabaseUpdate = Senaste löpardatabasuppdatering
prefsDefaultDrawMethod = Förvald lottningsmetod
prefsDirectPort = Nätverksport för förhandsinformation om stämplingar
prefsEMail = Arrangörs e-post
@ -2093,8 +2093,8 @@ prefsFirstInvoice = Nästa fakturanummer
prefsFirstTime = Första start av MeOS
prefsHomepage = Organisatörs hemsida
prefsInteractive = Interaktiv brickhantering
prefsLateEntryFactor = Faktor för efteranmälningsvgift
prefsLiveResultFont = Typesnitt för liveresultat
prefsLateEntryFactor = Faktor för efteranmälningsavgift
prefsLiveResultFont = Typsnitt för liveresultat
prefsMIPURL = URL till MIP-server
prefsMOPFolderName = Lokal MOP mapp
prefsMOPURL = URL till MOP-server
@ -2405,7 +2405,7 @@ Klassen X är listad flera gånger = Klassen X är listad flera gånger
Ogiltig starttid X = Ogiltig starttid X
Ogiltigt startintervall X = Ogiltigt startintervall X
Hittar inte klass X = Hittar inte klass X
MeOS utvecklinsstöd = MeOS utvecklinsstöd
MeOS utvecklinsstöd = MeOS utvecklingsstöd
info:pageswithcolumns = Visa listan en sida i taget med angivet antal kolumner. Ladda om data automatiskt efter varje varv.
Pages with columns = Sidor med kolumner
Pages with columns, no header = Sidor med kolumner utan rubrik
@ -2427,7 +2427,7 @@ help:registerhiredcards = Förregistrera hyrbrickor för att få automatisk hyrb
prefsLastExportTarget = Senaste exportmål
prefsServiceRootMap = Standardfunktion för webbserverns root
prefsshowheader = Visa sidrubriker i listor
Lagändringblankett = Lagändringblankett
Lagändringblankett = Lagändringsblankett
Mappa rootadressen (http:///localhost:port/) till funktion = Mappa rootadressen (http:///localhost:port/) till funktion
ClassAvailableMaps = Klassens lediga kartor
ClassTotalMaps = Klassens antal kartor
@ -2482,7 +2482,7 @@ Status code for cancelled entry = Statuskod för återbud
Age (on last day of current year) = Ålder vid årets slut
Age above or equal implies senior/pensioner = Åldersgräns äldre/pensionär
Age below or equal implies youth = Åldersgräns ungdom
Det finns multiplia Id-nummer för personer = Det finns multiplia Id-nummer för personer
Det finns multiplia Id-nummer för personer = Det finns multipla Id-nummer för personer
Välj vilken typ du vill importera = Välj vilken typ du vill importera
Status code for no timing = Statuskod för utan tidtagning
prefsVacantPercent = Andel vakanser
@ -2509,7 +2509,7 @@ Tips: ställ in rätt tid innan du lägger till fler grupper = Tips: ställ in r
Familj = Familj
Startgrupp = Startgrupp
Slå ihop tävlingar = Slå ihop tävlingar
help:merge = Det är möjligt att slå ihop tävlingar och resultat, givet att de är grundade på samma uppsättning banor och kontroller. Olika grupper deltagare kan genomföra tävlingen vid olika tillfällen och sedan kan de olika tävlingarna slås ihop till en tävling med gemensam resultatlista. En annan möjlighet är att ha olika TC för olika klasser. Om det inte är möjliget att att sätt upp ett gemensamt nätverk, kan man med jämna mellanrum utbyta tävlingsfiler för att införliva ändringar.\n\n1. Förbered hela tävlingen.\n2. Spara en kopia och importera den på de utlokaliserade datorerna (eller lokala nätverken).\n3. För att överföra ändringar, exportera tävlingen från den utlokaliserade datorn (eller datorerna) och slå ihop den med denna funktion. Exportera sedan en kopia från huvuddatorn och gör motsvarande import på de utlokaliserade datorerna.\n4 Proceduren kan upprepas flera gånger för att kontinuerligt överföra resultaten. \n\n Observera: Om du gör ändringar i (t.ex.) samma deltagare på flera ställen, blir vissa av ändringarna överskrivna utan varning. Se till att varje utlokaliserat ställe endast ändrar i sin del av tävlingen.\n\nTips: Gör en överföring så snart de utlokaliserade tävlingarna är startade innan någon ändring utförts, för att testa att allt blivit rätt uppsatt.
help:merge = Det är möjligt att slå ihop tävlingar och resultat, givet att de är grundade på samma uppsättning banor och kontroller. Olika grupper deltagare kan genomföra tävlingen vid olika tillfällen och sedan kan de olika tävlingarna slås ihop till en tävling med gemensam resultatlista. En annan möjlighet är att ha olika TC för olika klasser. Om det inte är möjligt att att sätt upp ett gemensamt nätverk, kan man med jämna mellanrum utbyta tävlingsfiler för att införliva ändringar.\n\n1. Förbered hela tävlingen.\n2. Spara en kopia och importera den på de utlokaliserade datorerna (eller lokala nätverken).\n3. För att överföra ändringar, exportera tävlingen från den utlokaliserade datorn (eller datorerna) och slå ihop den med denna funktion. Exportera sedan en kopia från huvuddatorn och gör motsvarande import på de utlokaliserade datorerna.\n4 Proceduren kan upprepas flera gånger för att kontinuerligt överföra resultaten. \n\n Observera: Om du gör ändringar i (t.ex.) samma deltagare på flera ställen, blir vissa av ändringarna överskrivna utan varning. Se till att varje utlokaliserat ställe endast ändrar i sin del av tävlingen.\n\nTips: Gör en överföring så snart de utlokaliserade tävlingarna är startade innan någon ändring utförts, för att testa att allt blivit rätt uppsatt.
Denna datakälla är aldrig tidigare infogad = Denna datakälla är aldrig tidigare infogad
Fel: Denna tävlingsversion är redan infogad = Fel: Denna tävlingsversion är redan infogad
Infoga version: X = Infoga version: X
@ -2518,7 +2518,7 @@ Sammanslagning fungerar om samma uppsättning banor/kontroller används = Samman
Varning: Olika bastävlingar = Varning: Olika bastävlingar
Borttagna: X = Borttagna: X
Fel: En tävling kan inte slås ihop med sig själv = Fel: En tävling kan inte slås ihop med sig själv
Sammanfattning, uppdateradet poster = Sammanfattning, uppdateradet poster
Sammanfattning, uppdateradet poster = Sammanfattning, uppdaterade poster
Sammanslagning klar = Sammanslagning klar
Skapade lokal säkerhetskopia (X) innan sammanslagning = Skapade lokal säkerhetskopia (X) innan sammanslagning
Tillagda: X = Tillagda: X