fsTimer documentation

Section 1 Installing fsTimer
Section 2 Overview
Section 3 Checklist for timing with fsTimer
Section 4 Detailed descriptions of fsTimer components
4.1 Setting up for a new race
4.2 Importing preregistration - details
4.3 Registration - details
4.4 Compiling registrations - details
4.5 Race timing - details
4.6 Timing multiple laps
4.7 Handicap races
Section 5 Additional details for developers

Section 4.5 - Race timing - details


Finally we reach the details about the Timing window. When loading the Timing window, you will have to specify:



Once these have been specified, the timing window loads.

Entering times

The first thing you will do in a race will be to press "Start!" at the exact moment that the race begins. This starts the clock ticking and all marked times will be recorded as time elapsed since this moment.



At the bottom of the window in the screenshot above it says "19 registrants. Checked in: 0". The 19 registrants are the number of bib IDs in the timing dictionary. This will generally be the number of people registered for the race, but can differ from the actual number if, for instance, there were overloaded IDs that were de-assigned during compilation. It can also differ from the actual number of racers on the course if there are racers who register and pick up a bib (and thus are in the timing dictionary), but don't end up running the race. As you check in racers (by entering their bib numbers into the timing window), if the bib number is one of those in the timing dictionary, then the "Checked in" number will increment.

All of the tasks related to the timing process take place in the entrybox at the bottom of the window. Make sure that you have clicked in that entrybox, otherwise any input (like pressing spacebar to mark a time, or entering a bib ID) will not be recognized.

Pressing spacebar (or whichever key you chose for marking times when opening the Timing window) will record the current time (relative to the Start! time) as a blank time in the window. The time is listed as hr:min:sec, and the "ID" column will be blank. As multiple times are marked, they will be recorded in their proper order.



This is the stack of marked times, and their corresponding bib IDs must be entered (although there is no hurry; as long as the record of bib IDs stays synchronized with the list of marked times, you can enter them all in at your convenience). In our suggested finish line design in Section 3.1, Crew 2 is the individual entering the times. Bib IDs are entered by typing them into the entrybox (the same one that must be selected to mark times) and pressing Enter. Note that if you use a USB barcode scanner, then the default behavior of most (all?) USB barcode scanners is to type whatever is in the barcode followed by Enter, so the software will work very naturally with a barcode scanner. Entering "100" will assign that bib ID to the oldest time that has not yet been assigned an ID:



Thus as long as the bib IDs are entered in the same order that they crossed the finish line, they will be correlated with their correct marked times. Entering "101" and "103" fills in the IDs for the next two times:



If an ID is entered and there aren't any "blank" times available, it will just be added to the stack of bib IDs and the next marked time will be assigned to it. Here we have entered "104" without any un-assigned marked times, so the time is left blank but will be filled in with the next time that is marked:



Marked times can also always be filled with the pass ID (we usually choose 0) the same way it would be assigned to a bib ID:



As a note, if you just hit Enter without anything entered into the entrybox, then it will do a usual ID entry where the ID is a blank string ''. Blank IDs are not included in the results printouts (they behave in the same way as the pass ID).

Editing times

The "Edit" button on the right side of the window allows you to edit the ID and/or time of any of the marked times. For instance, suppose one of the pass IDs used in the above screenshot was a placeholder for a runner whose bib ID could not be obtained immediately (see Section 3.1 for some situations where you might want to do this). We can later go back and replace the pass ID (the 0) with his true ID by pressing "Edit", and replacing "0" with his true ID:



As the red warning states, you should exercise extreme caution when making these edits, as they cannot be undone if you forget the original values.

There are actually two editing modes in the timing window. The first is shown above, when a single entry is selected and "Edit" is pressed. Then, the ID and time of that entry can be modified as desired. Alternatively, an entire block of times can be modified together. This is accomplished by selecting the block of times (using shift) and pressing "Edit":



The block edit window allows for all of the selected times to be adjusted forward or backwards by a certain amount of time. In the screenshot above, pressing "OK" will add 25 seconds to all of the times:



The "Drop ID" and "Drop time" functionalities drop the ID (or, respectively, time) from the selected row, and shift all IDs (resp. times) downward to match. This is useful for keeping the ID stack and the times stack properly synced, for instance, if an ID was accidentally entered twice, or spacebar was accidentally hit twice. Consider the following example, where the ID "106" was erroneously entered twice, and so the stacks are out of sync:



Selecting the 2nd "106" and pressing "Drop ID" yields:



"Drop time" performs the same function, but on the stack of times. Exercise extreme caution when dropping IDs or times, as this cannot be automatically undone.

Saving and printing results

The "Save" button on the right saves the results (starting time, marked times, and bib IDs) to a file whose name will include the date and time that the Timing window was opened (this way, results will never be accidentally overwritten if you open the Timing window at another time). If the Timing window was opened on Jun 1, 2013 at 2:10pm and 30 seconds, then the results are saved to a file project_name_Sat_Jun_1_141030_2013_times.json.

It is a good idea to save periodically during timing in case something catastrophic happens (like the computer dies), however keep in mind that any time the entrybox in the timing window is not selected (for instance, because you have used the mouse to press the "Save" button), no times may be marked and no IDs may be entered, until the mouse has moved back to select the entrybox. In our suggested finish line setup (Section 3.1), Crew 1 is operating the computer while Crew 2 enters the bib IDs with the barcode scanner. Crew 1 would need to tell Crew 2 to stop scanning for the period of time it takes to save, and then to resume when the entrybox has been reselected.

The "Print" button automatically generates nicely formatted results printouts. As mentioned in Section 2.5, it does not physically print the results, rather it saves them (the overall results and the divisional results) as html files in the project directory. These html files can then be opened in any web browser and printed from there. The actual filenames will again incorporate the date and time at which the Timing window was opened, so as to not be automatically overwritten by a later session in which the Timing window is opened. With the same date and time as above, the filenames would be project_name_Sat_Jun_1_141030_2013_alltimes.html for the overall results and project_name_Sat_Jun_1_141030_2013_divtimes.html for the divisional results.

We will now describe the results for a standard, single-lap race. The overall results might look like this:



The results will automatically be sorted into places, and the name, age, and gender will be filled in from the timing dictionary. If some information is blank in the database, this is not a problem; it will simply be left blank in the results. For example, 5th place in the screenshot above (bib 128) had a blank name in the database, so the name is left blank in the results. 4th place (bib 101) had a blank gender in the database, so it is blank in the results. Notice also bibs 110 and 120. These were the overloaded IDs from Section 4.4 that were left unassigned to any particular racer. They still show up in the results, however they do not have any name/age/gender associated with them. The same will be true for any bib that is not in the registration database, for example, if someone shows up after registration has closed but is given a bib anyway and runs the race.

Notice also that the "pass" IDs (0) do not show up in the results. Any times with pass IDs will be ignored when creating the results.

The divisional times are automatically generated using the registration information in the timing dictionary, and the divisions specified when creating the new project. The printed results will look something like this:



Because the divisions are defined by age and gender, notice that any IDs that do not have both age and gender in the timing dictionary will be left out of the divisional results. From two screenshots up, bibs 109, 110, 101, 120, and 103 do not have complete gender and age information and so are left out of the divisional results. (In a normal race setting, there will usually not be very many entries missing age and gender information - this will usually only happen if there are errors from the people entering information at the registration table, or for individuals that showed up after registration had already closed and were just handed bibs without being entered into fsTimer).

If you create divisionals using fields other than age and gender, note that all of the fields used to create divisions will be shown as columns in the results.

In addition to writing out nicely formatted html files, you can write the results out to a csv spreadsheet by clicking on the "Options" button and then selecting "Save results to CSV." This will produce two csv spreadsheets, one for all times and the other for divisional results, with all of the same data that is found in the html files.

Loading and merging times

Times that have been saved using the "Save" button can be loaded by clicking on the "Options" button and selecting "Load saved timing session." A warning: This will replace any IDs or times that are currently in the timing window, and so if these data have not been saved they will be lost forever. Keep in mind that this will load the marked times, the bib IDs assigned to them, and the Start time. It will not reload the timing dictionary (this will still be whatever was selected when opening the Timing window), which allows you to make edits to the timing dictionary, and then re-load the times. We'll give some more details about this later below.

It is possible to mark times on one computer and enter bib IDs on a separate computer - that is, create these two stacks separately - and then merge them after timing is finished. This way, Crew 1 and Crew 2 do not have to synchronize, nor to be close to each other. The two stacks can then be merged using these steps: The merge will only succeed if your current data in the timing window are only times or only IDs, and the file that you select to merge in is (respectively) only IDs or only times.

Editing the start time

Pressing "Options" and selecting "Edit starting time" opens a dialog through which the starting time can be edited:



The long number in the entry box is the number of seconds since the start of the Unix epoch - but this isn't important. If you add or subtract seconds from that number, they will be correspondingly added or subtracted from the start time. For example, subtracting 300 from the number in the above screenshot yields 1415048032.83. If we were to replace the number currently there with 1415048032.83 then the start time will be pushed five minutes earlier.

If you change this time mid-race, it will not adjust any times that have already been recorded. Those times could be adjusted using the block edit functionality described above.

Making corrections to results

We will now briefly discuss making corrections to the results, which can typically only be done after the race has finished.

As mentioned above, times and their associated bib IDs can be edited using the "Edit" button in the timing window. You can edit times so that they are no longer in order in the window, like 100 in the screenshot below, and this is not a problem; fsTimer will correctly sort them when generating the results printouts:



When editing times, it is important to keep the leading 0 ("0:22:37" instead of "22:37") or the results will not sort correctly.

Making corrections to anything other than bib IDs and times will require a few more steps. Some examples of the types of corrections you might want to make are: Correcting all of these errors requires making edits to the registration database, which requires leaving the timing window. The following is the procedure you would follow: When all necessary corrections have been made, the whole timing process is finished!

This completes all of the details about using fsTimer for a standard, single-lap race - You are now ready to time the race! The next two sections describe additional details to know if you are timing a multi-lap race, or a handicap race.

Continue on to Timing multiple laps.