diff --git a/documentation/documentation_figs/fstimer_fig12.png b/documentation/documentation_figs/fstimer_fig12.png index 7f60443..053daff 100644 Binary files a/documentation/documentation_figs/fstimer_fig12.png and b/documentation/documentation_figs/fstimer_fig12.png differ diff --git a/documentation/documentation_figs/fstimer_fig19.png b/documentation/documentation_figs/fstimer_fig19.png index 9ccd039..07453f0 100644 Binary files a/documentation/documentation_figs/fstimer_fig19.png and b/documentation/documentation_figs/fstimer_fig19.png differ diff --git a/documentation/documentation_figs/fstimer_fig21.png b/documentation/documentation_figs/fstimer_fig21.png index ce07fe5..752e4b0 100644 Binary files a/documentation/documentation_figs/fstimer_fig21.png and b/documentation/documentation_figs/fstimer_fig21.png differ diff --git a/documentation/documentation_figs/fstimer_fig3.png b/documentation/documentation_figs/fstimer_fig3.png index 4c72773..f86bb92 100644 Binary files a/documentation/documentation_figs/fstimer_fig3.png and b/documentation/documentation_figs/fstimer_fig3.png differ diff --git a/documentation/documentation_figs/fstimer_fig30.png b/documentation/documentation_figs/fstimer_fig30.png index 858ca9d..bb9bc06 100644 Binary files a/documentation/documentation_figs/fstimer_fig30.png and b/documentation/documentation_figs/fstimer_fig30.png differ diff --git a/documentation/documentation_figs/fstimer_fig31.png b/documentation/documentation_figs/fstimer_fig31.png index e5c84ca..06e576f 100644 Binary files a/documentation/documentation_figs/fstimer_fig31.png and b/documentation/documentation_figs/fstimer_fig31.png differ diff --git a/documentation/documentation_figs/fstimer_fig33.png b/documentation/documentation_figs/fstimer_fig33.png index 5d5dc24..980e0f9 100644 Binary files a/documentation/documentation_figs/fstimer_fig33.png and b/documentation/documentation_figs/fstimer_fig33.png differ diff --git a/documentation/documentation_figs/fstimer_fig34.png b/documentation/documentation_figs/fstimer_fig34.png index 30af9e8..40cdda9 100644 Binary files a/documentation/documentation_figs/fstimer_fig34.png and b/documentation/documentation_figs/fstimer_fig34.png differ diff --git a/documentation/documentation_figs/fstimer_fig41.png b/documentation/documentation_figs/fstimer_fig41.png index 712d18b..91e1d8a 100644 Binary files a/documentation/documentation_figs/fstimer_fig41.png and b/documentation/documentation_figs/fstimer_fig41.png differ diff --git a/documentation/documentation_figs/fstimer_fig5.png b/documentation/documentation_figs/fstimer_fig5.png index 8e98e04..58dde5c 100644 Binary files a/documentation/documentation_figs/fstimer_fig5.png and b/documentation/documentation_figs/fstimer_fig5.png differ diff --git a/documentation/documentation_figs/fstimer_fig61.png b/documentation/documentation_figs/fstimer_fig61.png index f5cce60..3796901 100644 Binary files a/documentation/documentation_figs/fstimer_fig61.png and b/documentation/documentation_figs/fstimer_fig61.png differ diff --git a/documentation/documentation_figs/fstimer_fig63.png b/documentation/documentation_figs/fstimer_fig63.png index b3fad7d..e9d68e1 100644 Binary files a/documentation/documentation_figs/fstimer_fig63.png and b/documentation/documentation_figs/fstimer_fig63.png differ diff --git a/documentation/documentation_figs/fstimer_fig68.png b/documentation/documentation_figs/fstimer_fig68.png index c54c810..541045b 100644 Binary files a/documentation/documentation_figs/fstimer_fig68.png and b/documentation/documentation_figs/fstimer_fig68.png differ diff --git a/documentation/documentation_figs/fstimer_fig69.png b/documentation/documentation_figs/fstimer_fig69.png index 2f048b6..15c4879 100644 Binary files a/documentation/documentation_figs/fstimer_fig69.png and b/documentation/documentation_figs/fstimer_fig69.png differ diff --git a/documentation/documentation_figs/fstimer_fig79.png b/documentation/documentation_figs/fstimer_fig79.png new file mode 100644 index 0000000..f6a5c34 Binary files /dev/null and b/documentation/documentation_figs/fstimer_fig79.png differ diff --git a/documentation/documentation_sec2_2.htm b/documentation/documentation_sec2_2.htm index d132119..c6b7f7a 100644 --- a/documentation/documentation_sec2_2.htm +++ b/documentation/documentation_sec2_2.htm @@ -56,13 +56,12 @@

Section 2.2 - Importing preregistration


The text field in the preregister window shows that the preregistration csv was successfully imported and the imported registration file was saved as ``fstimer_demo_registration_prereg.json." The other lines of text show which csv fields (that is, spreadsheet columns) were detected and some other details that are described in Section 4.2.

+IMPORTANT: If you have non-latin characters in your spreadsheet like é or ö, the CSV must be in UTF-8 encoding. By default, Microsoft Excel will not produce a UTF-8 CSV. Check this site for instructions on how to produce a UTF-8 CSV from an Excel spreadsheet: +
https://help.surveygizmo.com/help/encode-an-excel-file-to-utf-8-or-utf-16.
+The Google Drive solution described towards the bottom of the page is probably the easiest.

+ Continue on to Section 2.3 Registration. - - \ No newline at end of file + diff --git a/documentation/documentation_sec2_4.htm b/documentation/documentation_sec2_4.htm index 8b0d80a..73a33c5 100644 --- a/documentation/documentation_sec2_4.htm +++ b/documentation/documentation_sec2_4.htm @@ -42,17 +42,12 @@

Section 2.4 - Compiling registrations


We must press "Add" to choose all of the registration databases that we wish to compile together. For now we only have one registration database (fstimer_demo_registration_1.json), so we press "Add" and select it. The names of the registration files that we add show up in the field in the center of the window, and can be removed by selecting them and pressing "Remove." After we have added all of the registration databases to be compiled, we press "Merge."

-

+

This will check for a certain type of database error (more details on that in Section 4.4), and will write two files: the compiled registration, and the timing dictionary. The compiled registration is an fsTimer registration database that can be opened using the Register window just as any other fsTimer registration database, except it now contains the information merged across all of the input databases. The timing dictionary is a special file that is required for race timing.

Continue on to Section 2.5 Race timing. - - \ No newline at end of file + diff --git a/documentation/documentation_sec2_5.htm b/documentation/documentation_sec2_5.htm index 10d163a..3fe707f 100644 --- a/documentation/documentation_sec2_5.htm +++ b/documentation/documentation_sec2_5.htm @@ -66,7 +66,7 @@

Section 2.5 - Race timing




-"Print" will automatically generate two html files in fact: Overall results that include everyone, and divisional results. Note that if you enter the pass ID (0) as the bib number for a time, then that time will not show up in the results at all. Basically the pass ID "skips" times, and leaves them out of the results.

+"Printouts" will automatically generate two html files in fact: Overall results that include everyone, and divisional results. Note that if you enter the pass ID (0) as the bib number for a time, then that time will not show up in the results at all. Basically the pass ID "skips" times, and leaves them out of the results.

The other buttons (Options, Drop ID, Drop time, and Edit) will be described in Section 4.5.

@@ -75,10 +75,5 @@

Section 2.5 - Race timing


Continue on to Section 2.6 Creating a new project. - diff --git a/documentation/documentation_sec2_6.htm b/documentation/documentation_sec2_6.htm index 7f60842..366db18 100644 --- a/documentation/documentation_sec2_6.htm +++ b/documentation/documentation_sec2_6.htm @@ -45,17 +45,17 @@

Section 2.6 - Creating a new project


First you will choose a name for the project. As it says, only letters, numbers, and underscore may be used in the project name. This will create a subdirectory in the fsTimer directory using the project name. That is, if the project name is project_name, it will create the directory fsTimer/project_name. All of the files generated by fsTimer will be saved in that project directory.

-

+

Next the project type is specified. As it says on the window, there are two project types: standard and handicap. A standard race is one where all racers have the same start time. In a handicap race each racer specifies a handicap, which is an amount of time that they will start later than the start time. Thus different racers can have different start times, but fsTimer will automatically subtract out their handicap when computing finishing times. For either race type, it is possible to have a race with multiple timed laps.

-

+

-The next thing to be specified are the registration fields. These are exactly the fields that will show up in the "Registration" window. ID is a required field and must be filled out for runners to show up in results, but otherwise the fields can be customized to those which you want to use. New fields can be added as either an entrybox, meaning a box into which any information can be typed (like for name), or a combobox where one of a few options must be selected (like for gender).

+The next thing to be specified are the registration fields. These are exactly the fields that will show up in the "Registration" window. ID is a required field and must be filled out for runners to show up in results, but otherwise the fields can be customized to those which you want to use. New fields can be added as either an text or number entry, meaning a box into which any information can be typed (like for name or age), or a selection box where one of a few options must be selected (like for gender).



-When you press the "Printouts" button from the Timing window, fsTimer will automatically generate two nicely formatted sets of results: overall results listing everyone, and automatically generated divisional results. This is the window where you can specify what the divisions should be for generating the divisional results. You specify the division name, and what the parameters for the division should be. The parameters can be a range of ages, and/or a collection of combobox values.

+When you press the "Printouts" button from the Timing window, fsTimer will automatically generate two nicely formatted sets of results: overall results listing everyone, and automatically generated divisional results. This is the window where you can specify what the divisions should be for generating the divisional results. You specify the division name, and what the parameters for the division should be. The parameters can be a collection of combobox values and/or a range of number entry values.



@@ -71,10 +71,5 @@

Section 2.6 - Creating a new project


Continue on to Section 3 Checklist for timing with fsTimer. - - \ No newline at end of file + diff --git a/documentation/documentation_sec4_1.htm b/documentation/documentation_sec4_1.htm index a6415f0..ddfb07f 100644 --- a/documentation/documentation_sec4_1.htm +++ b/documentation/documentation_sec4_1.htm @@ -48,7 +48,7 @@

Section 4.1 - Setting up for a new race


The next window allows you to choose the type of the race:

-

+

A standard race is one where all racers have the same start time. In a handicap race, a "Handicap" time must be specified for all racers. Their final time is then calculated as the marked time minus the handicap. This allows racers to start at different times - a racer could start five minutes late, and by specifying a handicap of "0:05:00" for that racer, his or her time in the results would be corrected. Usually this is done for a race where all runners provide their handicap relative to a base time, and runners start at different times with the hope of all crossing the finish line around the same time.

@@ -56,19 +56,21 @@

Section 4.1 - Setting up for a new race


The next window allows you to specify the fields that will show up in the registration database.

-

+

The "Up" and "Down" buttons allow you to change the order of the fields. This is the order in which they will appear in the registration database: The top entry in this window will be the furthest left column in the registration window, and the bottom entry in this window will be the furthest right column in the registration window. This is also the order that they will show up in the results printouts, should you choose to have them in the results printouts.

-The "Remove" button removes a field. ID and Age, however, are hard-coded fields and cannot be removed. ID is critical for the timing itself. If you don't want to use Age, you can simply leave that field blank. If it is a "handicap" race, then the field "Handicap" is also required. The "New.." buttons allow you to create a new entrybox or combobox. A combobox means in the registration database the entry will have to take one of a set collection of values. In the window for creating a new registration entry below, "Gender" is a combobox with options "male" and "female" (and blank). An entrybox is a box for freely entering text, like "Last name" and "First name" in the registration entry below.

+The "Remove" button removes a field. ID, however, cannot be removed inasmuch as it is critical for the timing itself. If it is a "handicap" race, then the field "Handicap" is also required. The "New.." buttons allow you to create a new "text entry," "number entry," or "selection box." A "selection box" means in the registration database the entry will have to take one of a set collection of values. In the window for creating a new registration entry below, "Gender" is a selection box with options "male" and "female" (and blank). An entry is a box for freely entering text, like "Last name" and "First name" in the registration entry below. If it is specified as a "Number entry", then whatever is entered will be required to be a number, or else it will not be printed in the results. Number entries are used for creating divisions, such as age ranges - the process of creating divisions is detailed further down.



-When creating a new entrybox, you will specify the name of the field (e.g., Last name) and the maximum number of characters to allow in the entrybox. The appropriate maximum number of characters will depend on the field (ID will probably require fewer than Address).

+When creating a new text entry, you will specify the name of the field (e.g., Last name) and the maximum number of characters to allow in the entrybox. The appropriate maximum number of characters will depend on the field (ID will probably require fewer than Address).



-When creating a new combobox, you will specify the name of the field (e.g., Gender) as well as what the options in the combobox should be, separated by commas. For example, "male,female" would indicate that the options should be male and female. A blank option will automatically be added to any combobox, you don't need to worry about adding it yourself.

+Number entries are created in the same way. The value in a number entry should always be an integer (i.e., not a decimal number). Number entries will allow you to enter text or decimal numbers, but invalid values like these will not be shown in the results.

+ +When creating a new selection box, you will specify the name of the field (e.g., Gender) as well as what the options in the selection box should be, separated by commas. For example, "male,female" would indicate that the options should be male and female. A blank option will automatically be added to any selection box, you don't need to worry about adding it yourself.



@@ -78,7 +80,7 @@

Section 4.1 - Setting up for a new race




-"New" allows you to add a division. Divisions may be defined using a combination of age and any of the comboboxes that were defined as registration fields. For example, if "League" was specified as a combobox in when creating the registration fields, then you could define divisionals using "League." The name of the division that you specify will be used in the divisional results. Then, use the checkboxes to specify which fields you want to use to define the division. In the example below, "Gender" and "League" have been checked, so only those two fields will be used to define the division.

+"New" allows you to add a division. Divisions may be defined using a combination of number entries and selection boxes that were defined as registration fields. For example, if "League" was specified as a combobox in when creating the registration fields, then you could define divisionals using "League." If "Age" was specified as a number entry, then any range of values can be used in defining the division. The name of the division that you specify will be used in the divisional results. Then, use the checkboxes to specify which fields you want to use to define the division. In the example below, "Gender" and "League" have been checked, so only those two fields will be used to define the division.



@@ -92,7 +94,7 @@

Section 4.1 - Setting up for a new race


From the top group of checkboxes, you can select which registration fields to include on the results printouts. Next you can select to include Time and/or Pace. If the check box next to Pace is marked, then Pace will be included in the results, computed as Time / distance using the distance that you specify in the Distance entry box. If you enter "5" and your race is a 5k, then the Pace that is calculated will be min/km. If you enter "3.107" for your 5k, then the pace that is calculated will be min/mile.

-The last section on the window allows you to create custom computed fields, which can be calculated using any of the registration fields, plus Time. You refer to a field by putting the field name (case sensitive!) in curly brackets, as in the screenshot above. So, in the computed results {First name} refers to field {First name}. You can then use any Python operations that you could use on those fields. {Age} and {Time} are numbers (floats), all other registration fields will be treated as text (strings). {Time} will be the time in seconds.

+The last section on the window allows you to create custom computed fields, which can be calculated using any of the registration fields, plus Time. You refer to a field by putting the field name (case sensitive!) in curly brackets, as in the screenshot above. So, in the computed results {First name} refers to field {First name}. You can then use any Python operations that you could use on those fields. {Time} is a float number, any "number entry" fields are integers, and all other registration fields will be treated as text (strings). {Time} will be the time in seconds.

For example, the expression:
{First name} + ' ' + {Last name}
@@ -118,4 +120,4 @@

Section 4.1 - Setting up for a new race


Continue on to Section 4.2 Importing preregistration - details. - \ No newline at end of file + diff --git a/documentation/documentation_sec4_2.htm b/documentation/documentation_sec4_2.htm index b8e85f1..e7da6ab 100644 --- a/documentation/documentation_sec4_2.htm +++ b/documentation/documentation_sec4_2.htm @@ -40,6 +40,10 @@

Section 4.2 - Importing preregistration - details




+If you have accented or non-Latin characters, however, the csv must be in UTF-8. Microsoft Excel will not produce a UTF-8 CSV file, so see these directions on how to get from an Excel spreadsheet to a UTF-8 CSV:
+https://help.surveygizmo.com/help/encode-an-excel-file-to-utf-8-or-utf-16.
+The Google Drive solution described towards the bottom of the page is probably the easiest, or the LibreOffice solution is great if you need to do this frequently.

+ See the fstimer_demo_online_registration.csv file that comes in the fstimer_demo project preloaded in fsTimer for an example of how the spreadsheet should be formatted. The first row is a header row, giving the name of each column.

After pressing "Open" and selecting a csv file, the field mapping window will open:

@@ -62,10 +66,10 @@

Section 4.2 - Importing preregistration - details




-The error tells you what the invalid value is ("Male" instead of "male", "female", or blank), and where in the csv the error is (row 25). Correct any errors until the csv imports directly. When the csv is successfully imported, it will write the corresponding registration database file to a file named project_name_registration_prereg.json, in the directory fstimer/project_name. The file name is printed in the text field on the pre-registration window. Note that if a file project_name_registration_prereg.json already exists (for instance, because you already imported another csv in this same project), it will be overwritten.

+The error tells you what the invalid value is ("M" instead of "male", "female", or blank), and where in the csv the error is (row 25). Correct any errors until the csv imports directly. When the csv is successfully imported, it will write the corresponding registration database file to a file named project_name_registration_prereg.json, in the directory fstimer/project_name. The file name is printed in the text field on the pre-registration window. Note that if a file project_name_registration_prereg.json already exists (for instance, because you already imported another csv in this same project), it will be overwritten.

Continue on to Section 4.3 Registration - details. - \ No newline at end of file + diff --git a/documentation/documentation_sec4_4.htm b/documentation/documentation_sec4_4.htm index 6f08fe2..2aa69ec 100644 --- a/documentation/documentation_sec4_4.htm +++ b/documentation/documentation_sec4_4.htm @@ -66,9 +66,13 @@

Section 4.4 - Compiling registrations - details


In addition to the timing dictionary and the compiled registration database in fsTimer format, fsTimer will also save a csv spreadhseet containing the merged registration information to the file project_name_registration.csv. This is useful for having a portable spreadsheet with all of the registration information collected day-of.

+As mentioned at the bottom of the screenshot above, the compilation process also generates start sheets. These are nicely formatted printouts that list all of the registered racers ordered by ID. There are two startsheets generated, both stored as HTML files in the project directory: one file with all registered racers in one list, and a second file that has the registered racers broken down by division:

+ +

+ As a final note, as was mentioned in Section 2.4, even if there is only one registration database to be used for timing (i.e., there is nothing to merge), you must still compile that one registration database so as to create the timing dictionary.

Continue on to Race timing - details. - \ No newline at end of file + diff --git a/documentation/documentation_sec4_6.htm b/documentation/documentation_sec4_6.htm index 5db4ee8..a5085b8 100644 --- a/documentation/documentation_sec4_6.htm +++ b/documentation/documentation_sec4_6.htm @@ -31,7 +31,11 @@

Section 4.6 - Timing multiple laps


To time a race with multiple laps, you must specify the number of laps when creating the project (see Section 4.1 to recall):

-

+

+ +By default, if racers do not complete the specified number of laps, they will show up in the final results, but ranked at the bottom (since, for instance, they may not have completed the race). The final checkbox in the window above allows for indicating that racers can complete variable number of laps. If checked, then racers will be ranked regardless of how many laps they complete.

+ + There are two new additions to the timing window:

@@ -53,7 +57,7 @@

Section 4.6 - Timing multiple laps




-Racers that did not complete the correct number of laps will not have a total time and so will be placed at the end of the results. Divisional times are similar, and contain automatically calculated lap times.

+Again, unless the "Racers complete variable number of laps" box is checked, racers that did not complete the correct number of laps will not have a total time and so will be placed at the end of the results. Divisional times are similar, and contain automatically calculated lap times.

All of the same tools for editing times from Section 4.5 apply for lap timing.

diff --git a/documentation/documentation_sec4_7.htm b/documentation/documentation_sec4_7.htm index 01a192a..da7af01 100644 --- a/documentation/documentation_sec4_7.htm +++ b/documentation/documentation_sec4_7.htm @@ -31,11 +31,11 @@

Section 4.7 - Handicap races


To time a handicap race, you must specify the race type as "handicap" when creating the project (see Section 4.1 to recall):

-

+

For handicap races, "Handicap" will be added to the list of registration fields and is not optional:

-

+

All racers must be given a handicap or they will not show up in the results printout. The handicap must be specified as hh:mm:ss. When inputting a handicap in the registration window, it will verify that the handicap is in the right format and will not allow the entry to be created/edited if handicap is in the wrong format:

: diff --git a/documentation/documentation_sec5.htm b/documentation/documentation_sec5.htm index cf71e04..87d1bef 100644 --- a/documentation/documentation_sec5.htm +++ b/documentation/documentation_sec5.htm @@ -28,8 +28,19 @@

Section 5 - Additional details for developers


Contributions of code are always welcome!

+Changelog for fsTimer 0.7

+fsTimer 0.7 was released on January 10, 2017 and is the sixth major release. The major changes since version 0.6 are: +

+ Changelog for fsTimer 0.6

-fsTimer 0.5 was released on April 9, 2016 and is the fifth major release. The major changes since version 0.5 are: +fsTimer 0.6 was released on April 9, 2016 and is the fifth major release. The major changes since version 0.5 are: