BHPC races are organised and scored with five different pieces of software:

  1. Sign-on. Riders are registered for an event and allocated to races using the original BHPC race organiser's spreadsheet
  2. Tag-writing. RFID timing tags are written with Impinj MultiReader using Impinj Speedway RFID hardware
  3. Race timing. Riders' times for individual races are collected and organised into results with CrossMgr, an open-source project hosted on Github. CrossMgr has different modes for mass-start races (criteriums) and time-trials..
  4. Race merging. 'Rounds' at an event are usually split into two or more fields of riders, e.g. 'faster' and 'slower' races. Results from individual races are combined into per-round results with Kim Wall's Merge-O-Matic spreadsheet
  5. Race points. Riders' points both for each event and for the season (the 'BHPC Championship') are compiled with SeriesMgr, from the same source as CrossMgr

Sign-on is done using the BHPC organisers' spreadsheet, outlined here.

Generating the sign-on spreadsheet for CrossMgr

Once riders have been signed on and allocated to races, click the "Generate CrossMgr racers sheet" button on the main page.

Generate CrossMgr racers

A new .xlsx file (with a filename consisting of "racers" and the name of the event) will be created in the current directory.  This contains the data that CrossMgr will need to identify and categorise racers.

Note that the workbook consists of a master CrossMgrRacers sheet containing everyone present at the event (this isn't strictly needed, but is potentially useful as a backup option), as well as additional sheets containing just those participating in each race.

CrossMgrRacers sheet


RFID timing tags can be written using the MultiReader application:

Start MultiReader.  It will ask if you would like to connect to the configured reader(s).  Click 'Yes'.

Click 'START Inventory Run'.  Any tags within range of the configured antenna (which should be the desktop antenna on port 3, see below) will appear in the panel on the left.

StMultireader inventory run

If you have problems reading/writing tags, check the settings for 'Reader 1'/'Modes, RF, Power':

Select Antenna port 3, and check that:

  • 'Reader Mode' is set to 'AutoSet Dense Reader'
  • 'Freq AutoSet' is set to 'Reader Selects Frequency'
  • Check that the box for 'Ant 1' is ticked
  • 'Tx Power' should be set to '20.00' - This is not the default! (Full power is too strong to write tags reliably.)
  • 'Rx Sensitivity' should be set to -50
Reader Settings

To write a timing tag, first perform an inventory run to confirm the desired tag is in range.  Stop the inventory run, then right-click on the tag's EPC value (this will be a long string of hex for new tags) and select 'Change EPC'.

Enter the desired tag number as 32-bit hexadecimal.  For example, rider number 136 in decimal is 88 in hex, so you would enter "0000-0088" in the 'New EPC' field.  Click 'Write Tag(s)' - any error will appear in the 'Log' box.

It is a good idea to perform another inventory run to confirm the tag has been written successfully.  Tags containing the same EPC will appear as a single line in the inventory.

Change EPC


3.1 Setting up a new race

CrossMgr races are stored in an individual .cmn file.  This is written to live as changes are made (eg. timings being recorded), in order to minimise the amount of data loss if the timing computer should crash or lose power.  There is, perhaps unintuitively, no way to 'reset' a race once it has been started - you have to create a new race in a separate file.

A template file should be available with most of these settings already in place, but in the interests of completeness, here are the things to check before starting a race.

The first thing you'll see is the '1. Actions' tab, with a Big Friendly Button™ to start the race.  Don't do this until the race is actually ready to start!

There's a 'Start Race Automatically at Future Time' tickbox.  Leave this unticked (unless you're reading this in the future and the BHPC have learned to run to time).

Chip Timing Options should be set to 'Manual Start'

CrossMgr actions

Under the '10. Properties' tab, there are several sub-tabs, where all the important settings are found.

The first sub-tab is 'General Info'.  The important fields are:

  • 'Event Name'. Use the format Venue-Rn-length-identifier where:
    • Venue is the race location
    • R is the Round number (comprising one or more races)
    • length in either mins or laps
    • identifier specifies the race within the round (faster, slower, etc)
  • Date should be the date of the event
  • 'Race #'. Should be incremented so that each race through the day has a different number. If you use
  • 'Date' and 'Scheduled Start' should be set correctly.  It does not matter if the race is manually started at a slightly different time.
  • 'Race Minutes' - this should initially be set to something significantly longer than the duration of a criterium race, in order to capture the slowest rider's final lap.  You will adjust it later.
  • 'Organizer' is the person who gets the credit/blame on the HTML output.

 CrossMgr will create a race file named Date-EventName-rn-Memo.cmn where n is 'Race #'. Using the Event Name format suggested above this expands to Date-Venue-Rn-length-identifier-rn-.cmn, for example


is the faster race of Round 2, a 45-min criterium, and the fourth race of the day (r4)

CrossMgr general info

 'Race Options': For a criterium race, these should be set to:

  • 'Time Trial' should be unticked.
  • 'All Categories Finish After Fastest Rider's Last Lap' should be ticked.
  • 'Set "Autocorrect Lap Data" option by Default' should be ticked.
  • 'Show Times to 100s of a Second' should be ticked.
  • 'Road Race Finish Times' should be unticked.
  • 'Estimate Laps Down Finish Time' should be unticked.
  • 'Consider Riders in Spreadsheet to be DNS if no race data' should be ticked.
  • 'Lap time for 80% rule' should be set to '2nd Lap Time'
  • 'Distance Units' should be 'miles'
  • 'Show Lap Notes, Edits and Projected Times in HTML Output' should be unticked.
  • 'Show Course Animation in Html' should be ticked.
  • 'Min Possible Lap Time' should be set to something reasonable for the course in use.  This is important for filtering out spurious RFID tag reads, but should not be so long that the fastest rider's laps are missed.  (If a rider is only getting every alternate lap recorded, you probably need to change this value.)
  • 'Win and Out' should be unticked.
CrossMgr race options

On the 'RFID' sub-tab:

  •  Tick 'Use RFID Reader'
  • Set 'Chip Timing Options' to 'Manual Start: Collect every chip.  Does NOT restart race clock on first read.' (The first read as racers cross the start line will already be ignored due to the setting of the 'Min Possible Lap Time' value on the 'Race Options' sub-tab.)
CrossMgr RFID
 On the 'Web' sub-tab, you can set a contact email address (use and a small BHPC logo image as the 'Page Header Graphic'. CrossMgr web

On the 'GPX' sub-tab you can import a .gpx or .kml file of the course being used for the race.  If the track is a recording with timestamps and elevation data, this will be used to improve the realism of the animation.

GPX files for most of the venuse we use are in the folder 'This PC> Documents> CrossMgr> GPX' on the BHPC timing laptop.

Tick 'Set Category Distances to GPX Lap Length'

Note the direction arrow on the image of the track, and use the 'Reverse Course Direction' button if necessary.

CrossMgr GPX


3.2 Linking the sign-on spreadsheet

CrossMgr gets its list of riders (including their RFID tag number and category data) from an Excel spreadsheet.  See Generating the sign-on spreadsheet for CrossMgr above.

In CrossMgr, under '10. Properties' there is a "Files/Excel" tab.

Click the "Link External Excel Sheet..." button. 

Link External Excel Sheet
You will be prompted for the location of a file containing the rider information.  (This is the one generated by the BHPC sign-on software, as described above.)  Browse to the relevant file, and click "Next >"
You will then be asked to specify the sheet containing the information for this race.  The drop-down will contain the names of all the available race sheets. Select the relevant sheet, and click "Next >" Specify sheet

You will be asked to specify the spreadsheet columns corresponding to CrossMgr's fields.  There should be nothing to do here, as the spreadsheet columns will already have the correct names.  (Note that we are currently using the 'Team' field in lieu of a 'Bike' field.)

Make sure the "Initialize CrossMgr Categories from Excel EventCategory/CustomCategory and Bib# columns" box is ticked, and click "Next >"

This causes CrossMgr to use the spreadsheet as its source of rider data.  If the sheet is subsequently edited (eg. to reflect HPV changes between rounds), changes are reflected in CrossMgr.

Specify columns

You should be presented with a summary of the process.

Somewhat confusingly, "Status: Success!" is followed by an "Errors: 'None'" textbox.

Click "Finish".

Errors: None

CrossMgr's '9. Categories' tab should now be populated with a list of riders in each category.

There should be a single 'Start Wave' for 'Open' containing the numbers of everyone in the race, and a list of 'Custom' categories for the various BHPC classes, populated with the numbers of the relevant riders.

(For some reason the Gender field is sometimes incorrectly populated: This should be set to "Women" for the women's classes, and "Open" for all the others.)

CrossMgr categories


3.3 Linking to the RFID timing system

Before linking to the timing system and starting the race, it's a good idea to check that the system clock on the timing laptop is set to something reasonable.  The clock can drift by a substantial amount if the laptop goes for long periods without power or access to an internet time server.

CrossMgr does not interface with the Impinj Speedway RFID hardware directly.  Instead, a separate program "CrossMgrImpinj" is responsible for communicating with the reader (using TCP/IP, over Ethernet), and passing the tag read data to CrossMgr.

With the reader connected to the laptop (the Toshiba Tecra A9 currently being used by the BHPC for timing purposes has poor Windows 10 support for its onboard Ethernet, so a USB dongle is used) and powered up, start CrossMgrImpinj.

The reader should be specified by IP address, on  'CrossMgr Address' should be set to (the laptop's own IP address).

If communications with the reader are successful, the left hand pane should turn green.  If communications with CrossMgr are successful (this only happens after you run the RFID test, see below), the right hand pane should turn green.

Note the tickboxes to enable/disable the antenna ports on the reader.  Normally ports 1 and 2 should be enabled for trackside operation.  Also note the 'ANT Reads' line giving a breakdown of the proportion of tag reads on each port - if tag reads are biased strongly towards one antenna, it may indicate a problem with a wiring.


The Advances Reader Options should be set as follows:

  • 'Report Method' should be set to 'Quad Regression', with sub-option 'Remove outliers' enabled.  'Antenna Choice' should be set to 'Max Signal dB'
  • 'Tag Population' should be set to 16
  • 'Transmit Power' and 'Receiver Sensitivity' can be left blank to use the default full power.
  • 'Connection Timeout Seconds' should be set to 3
  • 'Keepalive Seconds' should be set to 2
  • 'Repeat Seconds' should be set to 3
  • 'Beep on Read' can be ticked.  Note that this just plays the default system bell sound, as configured in the Windows sound settings.  Also note that QuadReg reads are only completed after the tag has passed the antenna, so several seconds lag is normal.
Advanced Settings

Leaving CrossMgrImpinj running, go back to CrossMgr, and the 'RFID' sub-tab under '10. Properties'.  Click on the 'Setup/Test Rfid Reader...' button.

  • 'Accept RFID Reader Data During Race' should be ticked
  • 'Reader Type' should be set to 'JChip/Impinj/Alien'
  • 'Remote IP Address' should be set to (the laptop's wired Ethernet address)
  • 'Remote Port' should be set to 53135

Click the 'Start RFID Test' button.  Communications should be established with CrossMgrImpinj, which will start forwarding tag reads as they happen.

If tags come up as "Bib=not found" this means CrossMgr does not have that tag number associated with a rider in the current race.  This may be normal if other racers are hanging around near the finish line, and occasionally spare tags or items with compatible RFID tags built-in for retail purposes (eg. cycle helmets) may be within range.

If everything appears to be working properly, stop the RFID test, and you should be ready to start the race.

RFID test



3.4 Starting and Finishing the race

When everything is ready for the race to start, go to the '1. Actions' tab, and click on the Big Friendly Button™ to start the race.  This does not start the race immediately - instead it pops up an OK/Cancel dialog box.  When you click 'OK', the race clock starts running.

Finishing the race is done in the same way.  Make sure that the last rider has finished their final lap before finishing the race.

CrossMgr Start race now?

Once the race has finished, you can go back and adjust the Race Minutes (on the 'General Info' sub-tab) and Minimum Possible Lap Time (on the 'Race Options' sub-tab) to suitable values for the race as it happened:  The duration should be the leader's last lap time, rounded up to the next whole minute.  The minimum possible lap time can be set to slightly lower than the fastest recorded lap.  These two changes will clear up most of the spurious data on the Results page.

Subsequent races can be created by selecting 'New Next...' from the 'File' menu.  You will be prompted to make changes to the configuration, and a new file will be created for the next race.


3.5 Manual input and dealing with dodgy timing data

Times can be entered manually as described for time trial mode during the race (eg. in the event of a rider's tags not working).

Corrections to lap times, adding/removing splits etc can be done from the RiderDetail page.  The usual problem is where a rider takes much longer to complete a lap for some reason (eg. they stop for a comfort break or to fix a dropped chain), and CrossMgr assumes that an RFID tag read (or manual time entry) has been missed.  CrossMgr will normally add additional splits to try to maintain the rider's average lap times, which isn't always desirable.

The best approach is to keep a note of which riders stop and when during the race, to make sense of these events and apply suitable corrections retrospectively.


3.6 Other common problems

Riders who do not finish

CrossMgr supports several rider statuses other than the default 'Finisher'.  For our purposes the most useful of these are:

  • DNS - For riders in the sign-on list but Did Not Start the race, for whatever reason.  If CrossMgr never sees their timing tag (or a manual time entry) riders are DNSed automatically.
  • DNF - For riders who Did Not Finish the race, eg. due to mechanical failure or injury.  If DNF riders are going to be allocated points (as is the BHPC way), it is essential to pass the results .xlsx file through the merge-o-matic tool, even if there is only one race in the round.  (This gives the DNF riders a correct average speed for the entire race, rather than just for when they were riding.)
  • NP - For riders whose race times are published but are Not Placed when points are allocated by SeriesMgr - useful for edge-cases where someone (or something) being timed in the race isn't participating in the BHPC championship.
Bike changes etc.

The 'racers' spreadsheet is a live document, and any changes made there are reflected in any CrossMgr races that link to it.  Therefore this is where changes to rider/bike names, race numbers and categories should be made.  (Note that you will have to manually duplicate any changes across the sheets for all races affected by them.)

Take particular care when adding/removing categories, as any typos will cause CrossMgr to create a new CustomCategory.


3.7 Publishing results

To get the race results out of CrossMgr, the 'Publish' feature is used.

Select 'Batch Publish Results' from the 'Publish' Menu.

The 'Html', 'Index Html' and 'Excel' formats should be selected, with the 'Ftp' boxes unticked for all options.  'BikeReg' should be set to 'None'.

Click 'Publish All'.

Batch publish results

An HTML file containing various visualisations of the race results should be written to the current directory.

There should also be an "index.html" file, containing links to the race.  As you publish results of additional races, they will be added to this index.

These can be uploaded to the appropriate area of the BHPC website.

The results should also be output to an Excel .xlsx file.  This is the format required for merging results of multiple races before input to SeriesMgr (see below), and for input into the results section of the BHPC organisers' spreadsheet.

(Note that the results for each category appear in their own sheet.)

CrossMgr Excel output


sheets. Select the  


Most of this is the same as described in Criterium Race Timing Using CrossMgr above.

 The important differences for a time trial are:

Tick 'Time Trial' on the 'Properties'/'Race Options' sub-tab. CrossMgr Time Trial
In the 'Categories' tab, enter the correct number of laps for all categories. Timetrial laps

Start the race.  The clock will begin ticking, but nothing happens.

We will be entering riders' start times manually, to avoid spurious tag reads near the start line:  Using the TimeTrial input box on the 'Record' tab, enter a rider's bib number and press <t> to record the moment they cross the start line.  Press <s> to save.

The RFID reader should record their finish time (and any intermediate lap times) automatically.

Subsequent riders can be dispatched at irregular intervals using the same method.

CrossMgr record tab

When the last rider has finished, click the 'Finish Race' button on the 'Actions' tab.

If a round consists of more than one race (typically a slower group and a faster group), the results need to be merged before they can be imported to SeriesMgr.  The merge-o-matic Excel sheet automates this:

This slightly hacky Excel macro will take mutilple .xlsx (as outputted by CrossMgr's 'publish' function) and combine them into a unified finish order.  Click the "Click to run" button, and select your input files.

The macro will take some time to run, then prompt you to save the combined results into a new .xlsx file. Merged results

5.1 Adding rounds to SeriesMgr

BHPC rounds are 'races' in SeriesMgr terms.

To add a race to the series, click on 'Add Races' on the SeriesMgr 'Races' tab.  You will be prompted for the file containing the race results.  This would normally be an .xlsx file output by the race-combining macro (see above), but could also be a raw CrossMgr .cmn file.

Select a points structure to give the desired weighting to the round (see BHPC Points in SeriesMgr below), and ensure that the rounds are listed in chronological order.

(Races should have short but sufficiently descriptive names in order to make sense on the series table.  You may need to rename the .xlsx files before adding them to the series.)

Inspect the results of your series.  You may see multiple instances of the same rider due to different spellings of their name at sign-on for different events.  The 'Name Aliases' tab allows you to tell SeriesMgr which names should be considered to be the same person.

The 'Team Aliases' tab allows you to do the same for teams.  Currently we are using CrossMgr 'Team' field to store HPV names, so you may find it useful to combine variations on the same name.

Team aliases


5.2 BHPC points in SeriesMgr

BHPC rounds are weighted by selecting the 'Points Structure' used for scoring a given 'Race'.  The template series should contain various points structures to reflect different weightings:  The 'Points for Position' field contains a list of values calculated by applying the "90% of previous number" algorithm.  The 'depth' field is set to the number of positions produced before the algorithm asymptotes at 5, and the 'Participation' field is set to "5" for all points structures.

"Score competitors and teams by" should be set to 'points'

"Consider Points or Time Bonuses from CrossMgr Primes" should be unticked.

"Consider Best n Results only" should be set to the number of BHPC rounds that should be considered for championship points.  Typically 2/3 of the total number of rounds in the completed season.

"Must have completed n or more Events" should be set to "0".

"If Riders are still Tied on Points" should be set to "Do not consider Place Finishes"

Scoring criteria


5.3 Publishing Tables for the Season

Once you are happy with the results of a series, click the "Publish to HTML" button.
The series points table should be written to an HTML file.  This can be uploaded to the relevant area of the BHPC website. SeriesMgr HTML output


5.4 Publishing Tables for the Day