Code Monkey home page Code Monkey logo

crossmgr's People

Contributors

esitarski avatar kimble4 avatar mbuckaway avatar rkantos avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

crossmgr's Issues

Remove pyinstaller dependancy

Is your feature request related to a problem? Please describe.
pyinstaller has limitations, and currently, only supports Python 3.7 with Python 3.9 currently in the works. In alot of ways, this is old technology.

Describe the solution you'd like
Discovered that using with using a virtual environment, one can deploy an application without having to "compile" python and related code into a binary. So far, I've tested this situation on Linux and I have been able to package ALL of the dependancies into the AppImage including the C libs. For Linux, this means we can use the latest python version and it should run on the oldest Linux versions because it has no external depandancies. This should mean targeting ARM platforms should be a matter of selecting ARM as a build system and not have to rely on pyinstaller's support. On other platforms, it means that we are distributing python and the scripts in a package, again, without having to use pyinstaller.

One of the benefits of this change would be the current python binary can be shipped with the package, whatever that happens to be.

CrossMgr does not seem to be able to import Impinj data file saved from CrossMgrImpinj

Describe the bug
A rider decided to jump into a race without registering on advise of the race organizer, and I found out while the race was running. Bla, bla, bla, shoot the race organizer, etc.. Turns on the rider placed in the top five. Ug. Didn't think to add her into the Excel sheet while the race was running. Attempting to fix the race after the fact and generate an updated set of results. However, got an error about time format importing the Impinj Data file.The message does not indicate if the error is in the dialog box entry field for time or in the data itself, and I dont have time at the moment to search the code.

To Reproduce
Steps to reproduce the behavior:

  1. Create a new race.
  2. Link the Excel file generated by RaceDB from the race to the newly created race.
  3. Confirm the race filename will change.
  4. Click on Chip Reader->Import Impinj file
  5. Fill in the dialog as per the attached image.
  6. Click ok, get the attached error.
  7. Import say it work, but no data appears in the race.

Expected behavior
Race would be populated with race data, passing, etc..

Screenshots
Screen Shot 2020-02-02 at 9 49 56 PM
Screen Shot 2020-02-02 at 9 50 04 PM
Screen Shot 2020-02-02 at 9 50 10 PM

Desktop (please complete the following information):

  • OS: CrossMgrImpinj on Linux was used to collect the data, but CrossMgr on Mac was use to attempt to redo the race
  • Version : Current dev release (3.0.46-beta)

Additional context
grepping the code base did not find the error or any related text. Probably in a language file. Not sure if this is a problem between the keyboard and the chair or an actually bug. Files are attached. The question is, is this an issue of the dialog box reporting an invalid time in the dialog, or the ImpinjData file?

Impinj-2020-02-01-14-11-26.txt
DummyRace.xlsx

ImportImpinjFile time fields formatting

Please see the gif below... When typing in colon to the Race Start Time field the input can no longer be put in properly without opening the window again. Also mistyping something to Import Data Time Adjustment will also make it impossible to use it without opening the window again.

CrossMgr Impinj import bug

[ETSI/non US-FCC reader only] CrossMgrImpinj Transmit Power & Receiver Sensitivity not being applied

I'm opening this here as well, as there didn't seem to be any traction on google groups. I have also not been able to get it working even after further attemps after writing the original topic.

Having previously used my FX9500 with CrossMgrImpinj, I now noticed that when using my Impinj R220 that I am unable to have an effect when trying to change both the transmit power & receiver sensitivity settings. When using the Motorola FX9500, the settings based on this page seem to work normally: https://www.ptsmobile.com/FX7400/fx7400_integrator.pdf

Changing RF Power Level Using Profiles

To control power levels, primarily use the LLRP interface or the RFID API3. Alternatively, use the Showcase II
demo tool to control the RF power level. To control RF power at the reader, create a profile specifying the LLRP
parameters that control RF power. For example, the following profile excerpt shows a power level of 24 dBm for all
antennas. This excerpt is based on the Large Tag Population template and shows the pertinent changes in bold.
The TransmitPower parameter is an index to a power table exposed through LLRP capabilities. Divide this index by
10 and add 14 to get the RF power level at the port. So, to achieve a power level of 30 dBm, set TransmitPower to
160. To achieve a power level of 24 dBm, set TransmitPower to 100 as in the following example.

Here is also a nice table of LLRP transmit power settings for different readers: http://stratumglobal.kayako.com/knowledgebase/article/View/19/0/llrp-reader-tx-rx-index-settings

However when I try to apply Transmit Power settings by this documentation on the R220, I get no change in the reader performance: https://support.impinj.com/hc/en-us/articles/202756358-Setting-Receive-Sensitivity-and-Transmit-Power-on-Revolution-Reader-using-LLRP

I've tried setting transmit power to both the index and power values, e.g. 1 or 1000 for example.

I have verified this by using Impinj ItemTest, where the transmit power & receiver sensitivity settings affect performance as expected.

Basically I cannot get CrossMgrImpinj to run the R220 at full power and sensitivity.

Looking up the reader rospec via ssh when Using CrossMgrImpinj:

 > show rfid llrp rospec 0
Status='0,Success'
LLRPROSpec='
<?xml version="1.0"?>
<GET_ROSPECS_RESPONSE
 xmlns="http://www.llrp.org/ltk/schema/core/encoding/xml/1.0"
 xmlns:Impinj="http://developer.impinj.com/ltk/schema/encoding/xml/1.30"
 MessageID="0">
  <LLRPStatus>
    <StatusCode>M_Success</StatusCode>
    <ErrorDescription></ErrorDescription>
  </LLRPStatus>
  <ROSpec>
    <ROSpecID>123</ROSpecID>
    <Priority>0</Priority>
    <CurrentState>Active</CurrentState>
    <ROBoundarySpec>
      <ROSpecStartTrigger>
        <ROSpecStartTriggerType>Immediate</ROSpecStartTriggerType>
      </ROSpecStartTrigger>
      <ROSpecStopTrigger>
        <ROSpecStopTriggerType>Null</ROSpecStopTriggerType>
        <DurationTriggerValue>0</DurationTriggerValue>
      </ROSpecStopTrigger>
    </ROBoundarySpec>
    <AISpec>
      <AntennaIDs>1</AntennaIDs>
      <AISpecStopTrigger>
        <AISpecStopTriggerType>Tag_Observation</AISpecStopTriggerType>
        <DurationTrigger>0</DurationTrigger>
        <TagObservationTrigger>
          <TriggerType>Upon_Seeing_N_Tags_Or_Timeout</TriggerType>
          <NumberOfTags>500</NumberOfTags>
          <NumberOfAttempts>1</NumberOfAttempts>
          <T>0</T>
          <Timeout>500</Timeout>
        </TagObservationTrigger>
      </AISpecStopTrigger>
      <InventoryParameterSpec>
        <InventoryParameterSpecID>1234</InventoryParameterSpecID>
        <ProtocolID>EPCGlobalClass1Gen2</ProtocolID>
      </InventoryParameterSpec>
    </AISpec>
    <ROReportSpec>
      <ROReportTrigger>Upon_N_Tags_Or_End_Of_ROSpec</ROReportTrigger>
      <N>0</N>
      <TagReportContentSelector>
        <EnableROSpecID>0</EnableROSpecID>
        <EnableSpecIndex>0</EnableSpecIndex>
        <EnableInventoryParameterSpecID>0</EnableInventoryParameterSpecID>
        <EnableAntennaID>1</EnableAntennaID>
        <EnableChannelIndex>0</EnableChannelIndex>
        <EnablePeakRSSI>0</EnablePeakRSSI>
        <EnableFirstSeenTimestamp>1</EnableFirstSeenTimestamp>
        <EnableLastSeenTimestamp>0</EnableLastSeenTimestamp>
        <EnableTagSeenCount>0</EnableTagSeenCount>
        <EnableAccessSpecID>0</EnableAccessSpecID>
      </TagReportContentSelector>
    </ROReportSpec>
  </ROSpec>
</GET_ROSPECS_RESPONSE>

Using Impinj ItemTest:

 > show rfid llrp rospec 0
Status='0,Success'
LLRPROSpec='
<?xml version="1.0"?>
<GET_ROSPECS_RESPONSE
 xmlns="http://www.llrp.org/ltk/schema/core/encoding/xml/1.0"
 xmlns:Impinj="http://developer.impinj.com/ltk/schema/encoding/xml/1.30"
 MessageID="0">
  <LLRPStatus>
    <StatusCode>M_Success</StatusCode>
    <ErrorDescription></ErrorDescription>
  </LLRPStatus>
  <ROSpec>
    <ROSpecID>14150</ROSpecID>
    <Priority>0</Priority>
    <CurrentState>Active</CurrentState>
    <ROBoundarySpec>
      <ROSpecStartTrigger>
        <ROSpecStartTriggerType>Null</ROSpecStartTriggerType>
      </ROSpecStartTrigger>
      <ROSpecStopTrigger>
        <ROSpecStopTriggerType>Null</ROSpecStopTriggerType>
        <DurationTriggerValue>0</DurationTriggerValue>
      </ROSpecStopTrigger>
    </ROBoundarySpec>
    <AISpec>
      <AntennaIDs>1</AntennaIDs>
      <AISpecStopTrigger>
        <AISpecStopTriggerType>Null</AISpecStopTriggerType>
        <DurationTrigger>0</DurationTrigger>
      </AISpecStopTrigger>
      <InventoryParameterSpec>
        <InventoryParameterSpecID>123</InventoryParameterSpecID>
        <ProtocolID>EPCGlobalClass1Gen2</ProtocolID>
        <AntennaConfiguration>
          <AntennaID>1</AntennaID>
          <RFReceiver>
            <ReceiverSensitivity>2</ReceiverSensitivity>
          </RFReceiver>
          <RFTransmitter>
            <HopTableID>1</HopTableID>
            <ChannelIndex>1</ChannelIndex>
            <TransmitPower>1</TransmitPower>
          </RFTransmitter>
          <C1G2InventoryCommand>
            <TagInventoryStateAware>0</TagInventoryStateAware>
            <C1G2RFControl>
              <ModeIndex>1000</ModeIndex>
              <Tari>0</Tari>
            </C1G2RFControl>
            <C1G2SingulationControl>
              <Session>0</Session>
              <TagPopulation>32</TagPopulation>
              <TagTransitTime>0</TagTransitTime>
            </C1G2SingulationControl>
            <Impinj:ImpinjInventorySearchMode>
              <Impinj:InventorySearchMode>Single_Target</Impinj:InventorySearchMode>
            </Impinj:ImpinjInventorySearchMode>
          </C1G2InventoryCommand>
        </AntennaConfiguration>
      </InventoryParameterSpec>
    </AISpec>
    <ROReportSpec>
      <ROReportTrigger>Upon_N_Tags_Or_End_Of_ROSpec</ROReportTrigger>
      <N>1</N>
      <TagReportContentSelector>
        <EnableROSpecID>0</EnableROSpecID>
        <EnableSpecIndex>0</EnableSpecIndex>
        <EnableInventoryParameterSpecID>0</EnableInventoryParameterSpecID>
        <EnableAntennaID>1</EnableAntennaID>
        <EnableChannelIndex>1</EnableChannelIndex>
        <EnablePeakRSSI>0</EnablePeakRSSI>
        <EnableFirstSeenTimestamp>1</EnableFirstSeenTimestamp>
        <EnableLastSeenTimestamp>0</EnableLastSeenTimestamp>
        <EnableTagSeenCount>0</EnableTagSeenCount>
        <EnableAccessSpecID>1</EnableAccessSpecID>
      </TagReportContentSelector>
      <Impinj:ImpinjTagReportContentSelector>
        <Impinj:ImpinjEnablePeakRSSI>
          <Impinj:PeakRSSIMode>Enabled</Impinj:PeakRSSIMode>
        </Impinj:ImpinjEnablePeakRSSI>
      </Impinj:ImpinjTagReportContentSelector>
    </ROReportSpec>
  </ROSpec>
</GET_ROSPECS_RESPONSE>

So when I am using CrossMgrImpinj, these fields are not shown by the config on the reader's console:

        <AntennaID>1</AntennaID>
         <RFReceiver>
           <ReceiverSensitivity>2</ReceiverSensitivity>
         </RFReceiver>
         <RFTransmitter>
           <HopTableID>1</HopTableID>
           <ChannelIndex>1</ChannelIndex>
           <TransmitPower>1</TransmitPower>
         </RFTransmitter>

CrossMgrVideo zoom and ctrl+scrolling with Trackpoint

First, I'm not able to use Thinkpad Trackpoint to zoom by using ctrl and scrolling.. Also, would it be possible to zoom the main stretched/listed images as an alternative (alt+scroll for example) and not have the whole picture zoomable?

CrossMgr arbitrary limits max laps to 200

crossmgrerror

Describe the bug
CrossMgr ignores laps setup in the category tab if set higher than 200 and seems to have a hard coded limit of 200 laps.

To Reproduce
Steps to reproduce the behavior:

  1. Setup a race to 450 laps (or anything more than 200)
  2. Run the race. Lap counter will start at the pre-programmed amount.
  3. After about two laps when chips start reading, the lap counter will drop to 200 or 198. There is nothing one can do about it. As the race runs, the record screen reports laps to go counting down from 200.
  4. When the record screen gets to zero, it keep counting the laps....this time counting up until the race is over. the lap counter reads zero and stays at zero. The race appears to score correctly.

Expected behavior
Laps should count down from the number of laps set in category settings. It should never change the number laps.

Desktop (please complete the following information):

  • LInux Ubuntu 18.04
  • Version CrossMgr-3.0.46-beta-43ae29f

Additional context
Add any other context about the problem here.

[Request] Please make manual sort function for lapped rider result

UCI race has various lapped riders in a result, by 80% rule.
'PUL' command of CrossMgr is the function for these riders, but result is always sorted by final chip reading time in previous lap. There are bit a difference from actual rank at 80% pulling point.
So we should re-sort riders in result file (in Excel!!), it's too ugly task....

please make re-sort function for pulled rider or something like that. thanks.
(or already has?)

Rider Detail shows wrong rider (from LapTime or RaceTime string)

Environment

  • Same as #4

How to reproduce

  • In 'Passing' tab with showing 'Race Time' and/or 'Lap Time'
  • Double click any item to show Rider Detail screen
  • Show the different bib number instead of clicked item. May be shown from second value from time string... (SS from MM:SS)

Double Click No.508 item (Red marked), Rider Detail shows No.28 from LapTime string "07:28"
2

MacOSX and Linux Builds updated; testers wanted

I have updated the code to better work on MacOSX and Linux. The code changes are small, but the biggest change is now the builds for Linux and MacOSX are automated and can be downloaded from the github releases tab.

For details on how to use the Mac and Linux builds, see the README.md.

I am looking for testers. The Linux build was built on Ubuntu 18.04, but should work on any Linux as all the dependancies are packaged into the AppImage. The MacOSX build was done on 10.15 CataLina, but should work on Mac OSX 10.14 and 10.13. If you have issues with the build, please post them below.

The changes are as follows:

  • merges the linux/mac build script into one master shell script: compile.sh. This script will setup the environment, build the code, and package it for MacOSX or Linux depending on which it is run. It now is a two step process on MacOSX and a three step process on Linux to build code and package it. The build process is foolproof because github workflow uses it to build the code

  • Linux appimage support added. All Linux apps now are download and run without requiring python be installed, etc.

  • MacOSX apps packaged as DMG files. Download, drag program into Applications folder, and run

  • requirements.txt added to the project the encompasses ALL the python modules to build the code from a clean source tree and clean python install.

  • CrossMgr, CrossMgrImpinj, CrossMgrAlien, SeriesMgr, and TagReadWrite now all packaged for MacOSX and Linux.

  • added github workflow to build the Linux and MacOSX apps on github. One need only create a Tag to get a release and all the programs built.

  • added menus to CrossMgrImpinj, CrossMgrAlien, and TagReadWrite as MacOSX doesn't like uses clicking the X button on an app

  • fixed a huge issue in socket handling on CrossMgrImpinj that would require the user to hit the reset button to get it to find CrossMgr when a race starts

  • all applications were build on Github and tested by downloading the build and running each application. CrossMgr and CrossMgrImping were further tested with a RFID read and run a race simulation to make sure chip reads work

  • removed pyllrp from the repo and moved it to a separate repo (because it is shared with RaceDB)

  • added CHANGES.md with gren release note manager

  • added a proper README.md

The next thing I will be tackling is the Windows build. In a week or so, ALL builds will appear on the Release tag.

Install/Launch Issue: CrossMgr_Setup_x64_v3_0_46-20200115141349

I've downloaded the Windows version of the latest release and install on my pc, but when I tried to run the application, it does not want to launch. I then re-installed an earlier version (CrossMgr_Setup_v3_0_41) and it launch without trouble?

I am new to GitHub and might be doing something wrong with the download and installation.

Track/Crit Races need the ability to pause and roll back a race

Is your feature request related to a problem? Please describe.
The race situation: There has just been a big crash. The course/track is no longer safe for riders to continue. Race is neutralized and riders leave the course/track. Currently, there is no way to pause a race. If CrossMgr is permitted to run, there could be extra chip reads while the race is neutralized and then there could be a 15 min lap in with the other <2min laps. The only solution currently is to stop CrossMgr, and create a new race from the point where the crash happened.

Describe the solution you'd like
Along with start/stop, Crossmgr needs a way to pause a race. The clock would stop as would data collection. Additionally, it would need some way to wind back a race possibly removing a lap (or 2 or 3 in case of track racing) to get back to a clear set of data before the crash happened.

Describe alternatives you've considered
There isn't really a good solution presently other than stopping CrossMgr and starting up a new race from the lap the race was neutralized, which messes up the results page.

[Py3 upgrade] Automatic start with CrossMgr 3.0.22

Was there something that was changed on how the automatic start works with CrossMgr 3? Compared to CrossMgr 2.4.1, so far it seems that the clock only resets on the second time a tag passes the reader? This seems to happen at least with one tag, when testing with CrossMgr 3. With CrossMgr 2, when using the automatic start, the clock is reset from the first read.

FTP upload bugs

Apart from my feature request for allowing encrypted SFTP or FTPS connections, there are a couple bugs that I've noticed.

  • URL encoding doesn't work properly with urls that have special characters. The folders are created correctly, but the at least with Nginx & Chrome, the URL doesn't go to the correct page when a folder such as ää is used. The correct URL to launch should be %E4%E4 (properly URL encoded at least when using Chrome and Nginx in ISO-8859-15). Come to think of it, I have not tested this yet on Linux, where Chrome/Chromium could be using UTF-8 in the urls?
  • Related to the above, even when I access the folders from the browser with correct URL, the Javascript on the page is broken. Example: https://live.stemmi.fi/live/Hyvink%E4%E4%20XCO/2019-07-21-Hyvinkaa%20XCO-Lahto%201-r1-.html
  • When using FTP-server that doesn't have the correct configuration for file permissions on uploaded files (such as vsftpd), then the file permissions need to be set manually to 755. I think CrossMgr could also check and set the file permissions.

Deploy as docker container

Is your feature request related to a problem? Please describe.
Not sure on feasibility, but would it be possible to deploy using docker?

Describe the solution you'd like
Docker deployment.

Describe alternatives you've considered
I'm deploying using IoTEdge in Azure as part of a bigger solution and can deploy RaceDB in this way. Would be fantastic if could also distribute CrossMgr similarly.

Additional context
Anything that makes setup easier increases my chances of actually being able to race!

CrossMgrVideo feature requests

Instead of adding these to the longer thread I’m requesting a few features here, which should be faster and easier to implement, at least before support gor GenICam / GigE Vision.

I will look into adding a custom framesize. That is probably easy.
However, it would also be easy to add the frame sizes that are missing, and
perhaps, allow the frame to be rotated.
That frame sizes do you need?

I don’t know if it is possible to use totally custom resolutions, but this is what I would prefer, since cameras can do whatever ‘AOI’ you need. So if it would be possible, either a slider or a number box for setting totally custom resolutions for the cameras should be added.

This could be similar to what Kinovea has for Basler / IDS cameras and also for common UVC cameras:
image

I know it is in C# and totally different to CrossMgrVideo, but Kinovea’s part of the source is here: https://bitbucket.org/kinovea/kinovea/src/9d17cde05ddcebbd6a3e8859df54f26c1c423dce/Kinovea.Camera/CameraManager.cs?at=CaptureUncompressed&fileviewer=file-view-default

Also related to the first is the need for accessing all the features of the drivers of the camera used. For example, there needs to be access to the control panel you get from UVC cameras, and with Logitech cameras, the Logitech control panel. This allows for setting manual exposure and focus, which are vital for a well functioning camera timing system. With the Basler Camera that I have been testing, I can set the focus manually (manual lens) and exposure from Pylon Viewer, before I run CrossMgrVideo.

For logitech I mean these settings:

SFTP support

Please add SFTP support for CrossMgr. Should be possible with pysftp. I don't care for FTP with TLS, but it could be implemented as well.

RaceDB Containerize; Testers wanted

While this repo is not RaceDB, I don't know how many people subscribe to RaceDB.

I don't know about you, I hate having to get RaceDB setup. So, I containerized the application into a Docker container, and created Windows/Linux/Mac controller script to manage it. No command line hacking on WIndows. It's all done in a GUI. This also means, that the container can be deployed anywhere. Currently, I have a test version running in Google Cloud. Updated as a snap by pulling the current version of the container. Additionally, the container uses MySQL ...and because MySQL is also in a container, it does not require the user to install it.

I hope to get Ed to move it into his repo, but for the time being you can find that at RACEDB CONTAINER.

Please make comments there.

Export Excel/PDF in Team Results not working in MacOS Catalina

Describe the bug
On the Team Results Tab in CrossMgr (tab 18) the export excel/pdf button creates 2 blank files

To Reproduce
Steps to reproduce the behavior:

  1. Go to tab 18
  2. Click on Export Excel/PDF
  3. Go to race folder
  4. Files are created but empty

Expected behavior
Files should contain results for team rankings as they appear in the window

Screenshots
To show race with results page
image

Desktop (please complete the following information):

  • OS: MacOS Catalina 10.15.2
  • Hardware: Late 2015 iMac 27 inch - Intel i7, 16GB ram
  • CrossMgr 3.0.46

Additional context
Tested also on windows 10 - button 'feel' is the same (in the sense that it feels like it doesn't work in either Windows or MacOS), similarly seeing empty files. Version on Windows 3.0.41 running Windows 10 1909

Start a race in the past

Is your feature request related to a problem? Please describe.
The situation: a road and gravel race. Everyone lines up at the start. The finish line is not at the same location. In fact, it could be 50kms away. The "start line" may not even be a line. The race is started and riders are sent on their way. At the same, everyone has signed in on a sign in sheet, so we know exactly who is supposed to be in the race. Their could have been multiple start waves. We don't want to pull out the entire timing rig to be able record who rode over the start line as we can just assume the sign in sheet is the start list. We can update the excel spreadsheet with who actually DNS'd. We record the start times of the start ways before we head over to the finish line. However, we will setup the timing rig at the finish line to record the riders either manually or via timing chips.

Describe the solution you'd like
We want to be able to start the race in the past from the finish line. The idea is, we would like to be able to set the start time in CrossMgr for each start way. We would have the race time start from that point when the start button is pushed. We have to be able to program in the start time for each way because we cannot guarantee that each way is spaced exactly 15 mins or whatever.

The fun part of this, is that the race would appear to be only one lap....and the first time the rider crosses the line is the only time they would.

This is the kind of thing that happens at P2A and the Hell of the North. HOTN could have timing at the start, but it's Ed Veal's race and it never goes as planned. I would imagine this is what would happen at alot of point to point races.

An alternative, have some way to capture the start remotely (way more effort).

Describe alternatives you've considered
Use RaceTiming's software which does the above and the remote start capture.

Error in TT Fix Result

Traceback (most recent call last):
  File "CrossMgr\ForecastHistory.py", line 287, in OnPopupHistoryCorrect
  File "CrossMgr\ForecastHistory.py", line 281, in fixTTEntry
AttributeError: 'Rider' object has no attribute 'getattr'
Traceback (most recent call last):
  File "CrossMgr\ForecastHistory.py", line 287, in OnPopupHistoryCorrect
  File "CrossMgr\ForecastHistory.py", line 281, in fixTTEntry
AttributeError: 'Rider' object has no attribute 'getattr'
Traceback (most recent call last):
  File "CrossMgr\ForecastHistory.py", line 299, in OnPopupHistoryInsert
  File "CrossMgr\ForecastHistory.py", line 281, in fixTTEntry
AttributeError: 'Rider' object has no attribute 'getattr'

(Stacktrace repeated a lot since I slightly panicked)

I can take a shot this weekend, mostly wanted to write it down before I forgot

OpenNext does not work with proper filename

Environment

  • Windows 8.1
  • CrossMgr 2.20.6

How to reproduce

  • Make cmn files with "NewNext" menu
  • After making cmn files, start from r1 race
  • finish r1 race, usually use OpenNext menu, but it does not work. (Nothing happens)

Change transmit power in TagReadWrite

It would be useful if TagReadWrite had an option to select the transmit power for read/write. TagReadWrite defaults to maximum signal power, which can make it hard to program a single tag when other tags are present. Selecting a lower transmit power would allow programming a single tag when other tags are nearby.

Graphical view of QR in CrossMgrImpinj

Stuart Lynne did some excellent work with graphing the chip times collected by CrossMgrImpinj when using quadratic regression. It would be useful if CrossMgrImpinj allowed the operator to click on the chip time and display a graph showing all of the times that were accumulated to produce the QR regression curve. This view would help explain how the time in front of the antenna was calculated, and would reveal how closely the chip times fit the predicted curve.
QuadraticBestFit

Need a way to enter laps in/out for riders in the pit

Is your feature request related to a problem? Please describe.
When running a race, if a rider comes out of the race (ie. track or crit), there is no way to enter the lap rider went out and on what lap rider goes back in. Rider appears down X number of laps and autocorrect does not fix it.

Describe the solution you'd like
CrossMgr should be able to deal with pit situations easily. Sure, one can go back in and fix the data, but that isn't convenient, and could be error prone. There should be some Pit screen to enter the rider numbers and lap or race time the riders left the race and re-entererd.

Describe alternatives you've considered
Keep track of the riders manually, and go back and fix the race data afterwards.

Additional context
None.

Support for high speed area and linear scan industrial cameras

I haven't got such a camera at hand (yet), so I do not know whether they would already work out of the box with CrossMgrVideo, since at least Basler drivers/SDK have a video output for software called "Basler GenICam source". I see that at least the area scan cameras could work out of the box, at least at lower framerates. There is a comprehensive list of at least Basler area scan cameras here:

https://www.baslerweb.com/en/products/product-highlights/ace-u-and-ace-l/

For example you could get a 800x600 USB3 Vision color camera capable of 510FPS for only ~400$. Also full HD is possible for similar cost. All of these cameras are also global shutter, so can be used for very accurate timing. Furthermore the 510 FPS camera as all others can also be configured for even faster read rates, by decreasing the AOI (area of interest) height. The 1920x1080 camera at 1920x64 can reach a nice equal 1000FPS in color mode. Respectively the 800x600 camera can go much higher.

https://www.baslerweb.com/en/products/tools/frame-rate-calculator/

I understand the current CrossMgrVideo software does lay the pictures in order by frame time, and thus should also be compatible with any camera resolution, but maybe someone (or even me) could get confirmation that it functions well with frame rates exceeding hundreds per second.

Crossmgr with Ubuntu

Hello,

I tried CrossMgr 1.77 on Ubuntu 11.10, but I get the following error....

ImportError: /lib/i386-linux-gnu/libc.so.6: version `GLIBC_2.15' not found

I guess it has been built for a different version of Linux. I also tried it with a beta version (virtual machine) of 12.10 and get the following error...

ImportError: cannot import name urandom

Do you have any ideas how to solve either issue?

Thanks
Stephen

There are no 'Memo' suffix on each autosaved filename

Environment

  • Windows 8.1/10
  • CrossMgr 2.10.52 / 2.20.0

How to reproduce

  • To make each .cmn file with New File wizard, each file is autosaved and filename is completely pre-defined.
  • In version 2.8.*, It's saved as like that YYYY-MM-DD-EventName-rN-Memo.cmn (N is race number)
  • But after 2.10.*, saved as YYYY-MM-DD-EventName-rN-.cmn
  • There are no 'Memo' field, so too hard to recognize what is this file's category.

"Random Start" TT mode

Is your feature request related to a problem? Please describe.
Give 'normal' TT's aren't happening, I have to wonder if it is possible or how CrossMgr could be changed to handle TT starts at "random". Basically, riders should show up to the line whenever, and be given the start signal. Timing chips could be used to capture the finish or someone could capture the finish time (click a button?). The idea is that riders just start when they like, that there is never more than 1-4 riders in a group at the start any one time and it doesn't matter when they start. We could say the TT happens from say 6pm-8pm, which small groups or riders set to ride in 10 min intervals (or whatever). The clock would be switched on at 6pm and off at 8pm, with times recorded with whoever did the ride.

Describe alternatives you've considered
Manually timing could be used, but the idea is one person could setup the computer equipment, and send the riders off. If chip timing is used, then the finish does not need to be monitored. Another alternative, is to setup X number of riders in a start group going off on minute intervals, with Y number of minutes buffer between them. Riders could be booked say on 10 or 15 min start intervals for the 2 hr TT time slot.

CrossMgrImpinj remember report method

I’ve started experimenting with Motorola FX7400 and FX9500 RFID-readers, and as it is, they only support “First Red Time” Report method with CrossMgrImpinj. Could we get CrossMgrImpinj to remember this feature as now I have to change it everytime I use a Motorola reader.

FinishLynx Lap-time & chip support

Could we also get support for FinishLynx's laptime plugin? This way the results could be done mainly with FinishLynx software, but CrossMgr could feed the chip reads for the FinishLynx laptime plugin for approximate timing. RaceDB could then also be used for creating the Mapfiles: https://youtu.be/hV-lmeReKQQ?t=2m43s

As I understand FinishLynx should be able to provide their protocol manual for implementation, and also this might be helpful: https://groups.google.com/forum/#!topic/agee-race-timing/Ryk6Klud1HM

CrossMgr Help does not work

Describe the bug
Help->Help returns and error page:

    <h1>Error response</h1>
    <p>Error code: 404</p>
    <p>Message: File Not Found: /Actions.html [Errno 2] No such file or directory: '/Applications/CrossMgr.app/Contents/Resources/CrossMgrHtmlDoc/Actions.html'

To Reproduce
Steps to reproduce the behavior:

  1. Go to Help menu
  2. Click on Help

Desktop (please complete the following information):

  • happens on Linux and Mac versions (probably windows too)

Additional context
Would appear the build is broken and not building help. Happens on the current beta release. Additionally, the current beta release also does not display the icon in the DMG image for crossmgr, but it does work correctly.

[Request] live results by start # & wave # & gender

I know it is possible to sort results in CrossMgr by whichever column. I'd like to have this or feature akin to it by way of being able to list results by start (including all riders whichever the gender), by wave and by gender in the live results page. In some starts prizes can be awarded among the start and/or gender and thus I would like to able to report this to people checking out the live results. Currently It seems the only way to achieve this would be to put everybody in the same category.

[v3.0.3] CrossMgrImpinj not reconnecting if network adapter is unplugged or disabled (Windows 10)

I am planning to use a compute stick with a USB-Ethernet adapter to run CrossMgrImpinj. However, while testing with the USB-adapter, I notice that if the USB-adapter is removed from the device, CrossMgrImpinj doesn't recognize it and does not try to reconnect to the reader anymore. A manual reset is needed. As the compute stick doesn't have a monitor, this is of course non-optimal. The same behaviour is apparrent when disabling the ethernet adapter manually from Control Panel\Network and Internet\Network Connections. Reconnecting to the reader works as expected when just disconnecting the Ethernet-cable from the USB adapter.

SeriesMgr ModuleNotFoundError

When trying to run SeriesMgr with Python 3.6 on Ubuntu 16.04.6 I get the following error:

Traceback (most recent call last):
  File "SeriesMgr/MainWin.py", line 36, in <module>
    import Dependencies
ModuleNotFoundError: No module named 'Dependencies'

What module is being referred here? I have ran the dependencies.py file without success in running SeriesMgr. CrossMgr itself works fine.

What license of CrossMgr

I'm lap timing app developer, and interested in this package.
Let me know about license of CrossMgr.

CrossMgr Lap Counter incorrect when fastest group has less laps

Describe the bug
In a multi category race with different start times and number of laps, when the second start group passed the first start group, the lap counter was not correctly shown for the first group.

The first group was supposed to do six laps, the second group five laps. The second group passed the first on the first lap. They were shown on the record screen and lap counter with the correct number of laps to go (four).

When the first group came through the finish, they were also shown with four laps to go (should have been five) in the record screen and lap counter. The results and chart screen showned auto-correct laps correctly as a total of six.

Changing the number of laps for the first group (e.g. to seven) in Categories did not change anything.

Changing the number of laps for the second group (first group on road) to six "fixed" the issue WRT to the first group. It then showed the correct number of laps everywhere (but with the second group showing an incorrect number of laps!)

That allowed the race to work (with some fudging of the lap board display). I reset the laps for the first group after and all results were correctly published.

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Cat 1/2 is 6, Master 1/2/3 is 5 laps.
image

Record screen shows Cat 12 as 5 laps (should be 6)
image

Results and charts correctly show 6 laps.
image

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context
Add any other context about the problem here.

[Py3 update] [Impinj readers] CrossMgrImpinj First Read Time not working

While testing and troubleshooting the transmit power issue with CrossMgrImpinj and my Impinj R220 readers, I thought of testing them with CrossMgrImpinj v2.0.14 (latest version I have which works on my Windows 7 machine). There was no change to the power setting issue with ETSI readers. However I noticed that when trying different reader modes, the First Read Time mode was working with v2.0.14 but isn't working with CrossMgrImpinj 3.0.5 or 3.0.6

The First Read Time mode is working normally with my Motorola FX9500 reader.

I've attached the log with the relevant section

CrossMgrImpinj 3.0.5
Configuration: CrossMgrImpinj
    RunningTime:   00:00:19
    Time:          16:59:01
    BackupFile:    C:\Users\crossmgr\ImpinjData\Impinj-2020-01-23-16-58-47.txt

Configuration: Impinj:
    Use Host Name: False
    HostName:      SpeedwayR-11-1c-8d.local
    ImpinjHost:    192.168.1.128
    ImpinjPort:    5084
    ReportMethod:  First Read Time
    AntennaChoice: Max Signal dB
    RemoveOutliers:3

    ConnectionTimeoutSeconds: 3
    KeepaliveSeconds:         2
    RepeatSeconds:            3

Configuration: CrossMgr
    CrossMgrHost:  127.0.0.1
    CrossMgrPort:  53135

Log: Impinj
    *****************************************
    Reader Server Started: (192.168.1.128:5084)
    
    Trying to Connect to Reader: (192.168.1.128:5084)...
    ConnectionTimeout=3.00 seconds
    Connected to: (192.168.1.128:5084)
    Waiting for READER_EVENT_NOTIFICATION...
    
    Received Response:
    READER_EVENT_NOTIFICATION(
      MessageID=719673943,
      Parameters=[
        ReaderEventNotificationData(
          Parameters=[
            UTCTimestamp( Microseconds=1579792335415079 ),
            ConnectionAttemptEvent( Status=ConnectionAttemptStatusType.Success ),
          ]
        ),
      ]
    )
    
    
    
    Reader time is 6392.252591 seconds different from computer time
    
    -----------------------------------------------------
    Sending Message:
    SET_READER_CONFIG(
      MessageID=10,
      ResetToFactoryDefault=True,
    )
    
    
    Received Response:
    SET_READER_CONFIG_RESPONSE(
      MessageID=10,
      Parameters=[
        LLRPStatus(
          StatusCode=StatusCode.M_Success,
          ErrorDescription='',
        ),
      ]
    )
    
    
    -----------------------------------------------------
    Sending Message:
    GET_READER_CONFIG(
      MessageID=11,
      AntennaID=0,
      RequestedData=GetReaderConfigRequestedData.AntennaProperties,
      GPIPortNum=0,
      GPOPortNum=0,
    )
    
    
    Received Response:
    GET_READER_CONFIG_RESPONSE(
      MessageID=11,
      Parameters=[
        LLRPStatus(
          StatusCode=StatusCode.M_Success,
          ErrorDescription='',
        ),
        AntennaProperties(
          AntennaConnected=True,
          AntennaID=1,
          AntennaGain=0,
        ),
        AntennaProperties(
          AntennaConnected=False,
          AntennaID=2,
          AntennaGain=0,
        ),
      ]
    )
    
    
    -----------------------------------------------------
    Sending Message:
    SET_READER_CONFIG(
      MessageID=12,
      ResetToFactoryDefault=False,
      Parameters=[
        AntennaConfiguration(
          AntennaID=0,
          Parameters=[
            RFReceiver( ReceiverSensitivity=1 ),
            RFTransmitter(
              HopTableID=1,
              ChannelIndex=0,
              TransmitPower=100,
            ),
            C1G2InventoryCommand(
              TagInventoryStateAware=False,
              Parameters=[
                C1G2SingulationControl(
                  Session=2,
                  TagPopulation=4,
                  TagTransitTime=3000,
                ),
              ]
            ),
          ]
        ),
        KeepaliveSpec(
          KeepaliveTriggerType=KeepaliveTriggerType.Periodic,
          PeriodicTriggerValue=2000,
        ),
      ]
    )
    
    
    Received Response:
    SET_READER_CONFIG_RESPONSE(
      MessageID=12,
      Parameters=[
        LLRPStatus(
          StatusCode=StatusCode.M_FieldError,
          ErrorDescription='LLRP [420] : //RFTransmitter/ChannelIndex : out-of-range',
          Parameters=[
            ParameterError(
              ParameterType=222,
              ErrorCode=StatusCode.P_ParameterError,
              Parameters=[
                ParameterError(
                  ParameterType=224,
                  ErrorCode=StatusCode.P_FieldError,
                  Parameters=[
                    FieldError(
                      FieldNum=2,
                      ErrorCode=StatusCode.A_OutOfRange,
                    ),
                  ]
                ),
              ]
            ),
          ]
        ),
      ]
    )
    
    
    -----------------------------------------------------
    Sending Message:
    DISABLE_ROSPEC(
      MessageID=13,
      ROSpecID=0,
    )
    
    
    Received Response:
    DISABLE_ROSPEC_RESPONSE(
      MessageID=13,
      Parameters=[
        LLRPStatus(
          StatusCode=StatusCode.M_FieldError,
          ErrorDescription='LLRP [1370] : No ROSpecs have been configured',
          Parameters=[
            FieldError(
              FieldNum=1,
              ErrorCode=StatusCode.A_Invalid,
            ),
          ]
        ),
      ]
    )
    
    
    -----------------------------------------------------
    Sending Message:
    DELETE_ROSPEC(
      MessageID=14,
      ROSpecID=123,
    )
    
    
    Received Response:
    DELETE_ROSPEC_RESPONSE(
      MessageID=14,
      Parameters=[
        LLRPStatus(
          StatusCode=StatusCode.M_FieldError,
          ErrorDescription='LLRP [409] : //ROSpecID : invalid',
          Parameters=[
            FieldError(
              FieldNum=1,
              ErrorCode=StatusCode.A_Invalid,
            ),
          ]
        ),
      ]
    )
    
    
    -----------------------------------------------------
    Sending Message:
    GET_READER_CAPABILITIES(
      MessageID=15,
      RequestedData=GetReaderCapabilitiesRequestedData.All,
    )
    
    
    Received Response:
    GET_READER_CAPABILITIES_RESPONSE(
      MessageID=15,
      Parameters=[
        LLRPStatus(
          StatusCode=StatusCode.M_Success,
          ErrorDescription='',
        ),
        GeneralDeviceCapabilities(
          MaxNumberOfAntennaSupported=2,
          CanSetAntennaProperties=False,
          HasUTCClockCapability=True,
          DeviceManufacturerName=25882,
          ModelName=2001001,
          ReaderFirmwareVersion='6.2.1.240',
          Parameters=[
            ReceiveSensitivityTableEntry(
              Index=1,
              ReceiveSensitivityValue=0,
            ),
            ReceiveSensitivityTableEntry(
              Index=2,
              ReceiveSensitivityValue=10,
            ),
            ReceiveSensitivityTableEntry(
              Index=3,
              ReceiveSensitivityValue=11,
            ),
            ReceiveSensitivityTableEntry(
              Index=4,
              ReceiveSensitivityValue=12,
            ),
            ReceiveSensitivityTableEntry(
              Index=5,
              ReceiveSensitivityValue=13,
            ),
            ReceiveSensitivityTableEntry(
              Index=6,
              ReceiveSensitivityValue=14,
            ),
            ReceiveSensitivityTableEntry(
              Index=7,
              ReceiveSensitivityValue=15,
            ),
            ReceiveSensitivityTableEntry(
              Index=8,
              ReceiveSensitivityValue=16,
            ),
            ReceiveSensitivityTableEntry(
              Index=9,
              ReceiveSensitivityValue=17,
            ),
            ReceiveSensitivityTableEntry(
              Index=10,
              ReceiveSensitivityValue=18,
            ),
            ReceiveSensitivityTableEntry(
              Index=11,
              ReceiveSensitivityValue=19,
            ),
            ReceiveSensitivityTableEntry(
              Index=12,
              ReceiveSensitivityValue=20,
            ),
            ReceiveSensitivityTableEntry(
              Index=13,
              ReceiveSensitivityValue=21,
            ),
            ReceiveSensitivityTableEntry(
              Index=14,
              ReceiveSensitivityValue=22,
            ),
            ReceiveSensitivityTableEntry(
              Index=15,
              ReceiveSensitivityValue=23,
            ),
            ReceiveSensitivityTableEntry(
              Index=16,
              ReceiveSensitivityValue=24,
            ),
            ReceiveSensitivityTableEntry(
              Index=17,
              ReceiveSensitivityValue=25,
            ),
            ReceiveSensitivityTableEntry(
              Index=18,
              ReceiveSensitivityValue=26,
            ),
            ReceiveSensitivityTableEntry(
              Index=19,
              ReceiveSensitivityValue=27,
            ),
            ReceiveSensitivityTableEntry(
              Index=20,
              ReceiveSensitivityValue=28,
            ),
            ReceiveSensitivityTableEntry(
              Index=21,
              ReceiveSensitivityValue=29,
            ),
            ReceiveSensitivityTableEntry(
              Index=22,
              ReceiveSensitivityValue=30,
            ),
            ReceiveSensitivityTableEntry(
              Index=23,
              ReceiveSensitivityValue=31,
            ),
            ReceiveSensitivityTableEntry(
              Index=24,
              ReceiveSensitivityValue=32,
            ),
            ReceiveSensitivityTableEntry(
              Index=25,
              ReceiveSensitivityValue=33,
            ),
            ReceiveSensitivityTableEntry(
              Index=26,
              ReceiveSensitivityValue=34,
            ),
            ReceiveSensitivityTableEntry(
              Index=27,
              ReceiveSensitivityValue=35,
            ),
            ReceiveSensitivityTableEntry(
              Index=28,
              ReceiveSensitivityValue=36,
            ),
            ReceiveSensitivityTableEntry(
              Index=29,
              ReceiveSensitivityValue=37,
            ),
            ReceiveSensitivityTableEntry(
              Index=30,
              ReceiveSensitivityValue=38,
            ),
            ReceiveSensitivityTableEntry(
              Index=31,
              ReceiveSensitivityValue=39,
            ),
            ReceiveSensitivityTableEntry(
              Index=32,
              ReceiveSensitivityValue=40,
            ),
            ReceiveSensitivityTableEntry(
              Index=33,
              ReceiveSensitivityValue=41,
            ),
            ReceiveSensitivityTableEntry(
              Index=34,
              ReceiveSensitivityValue=42,
            ),
            ReceiveSensitivityTableEntry(
              Index=35,
              ReceiveSensitivityValue=43,
            ),
            ReceiveSensitivityTableEntry(
              Index=36,
              ReceiveSensitivityValue=44,
            ),
            ReceiveSensitivityTableEntry(
              Index=37,
              ReceiveSensitivityValue=45,
            ),
            ReceiveSensitivityTableEntry(
              Index=38,
              ReceiveSensitivityValue=46,
            ),
            ReceiveSensitivityTableEntry(
              Index=39,
              ReceiveSensitivityValue=47,
            ),
            ReceiveSensitivityTableEntry(
              Index=40,
              ReceiveSensitivityValue=48,
            ),
            ReceiveSensitivityTableEntry(
              Index=41,
              ReceiveSensitivityValue=49,
            ),
            ReceiveSensitivityTableEntry(
              Index=42,
              ReceiveSensitivityValue=50,
            ),
            GPIOCapabilities(
              NumGPIs=4,
              NumGPOs=4,
            ),
            PerAntennaAirProtocol(
              AntennaID=1,
              ProtocolID=AirProtocols.[EPCGlobalClass1Gen2],
            ),
            PerAntennaAirProtocol(
              AntennaID=2,
              ProtocolID=AirProtocols.[EPCGlobalClass1Gen2],
            ),
          ]
        ),
        LLRPCapabilities(
          CanDoRFSurvey=False,
          CanReportBufferFillWarning=True,
          SupportsClientRequestOpSpec=False,
          CanDoTagInventoryStateAwareSingulation=False,
          SupportsEventAndReportHolding=True,
          MaxNumPriorityLevelsSupported=1,
          ClientRequestOpSpecTimeout=0,
          MaxNumROSpecs=1,
          MaxNumSpecsPerROSpec=32,
          MaxNumInventoryParameterSpecsPerAISpec=1,
          MaxNumAccessSpecs=1508,
          MaxNumOpSpecsPerAccessSpec=8,
        ),
        RegulatoryCapabilities(
          CountryCode=0,
          CommunicationsStandard=CommunicationsStandard.ETSI_302_208,
          Parameters=[
            UHFBandCapabilities(
              Parameters=[
                TransmitPowerLevelTableEntry(
                  Index=1,
                  TransmitPowerValue=1000,
                ),
                TransmitPowerLevelTableEntry(
                  Index=2,
                  TransmitPowerValue=1025,
                ),
                TransmitPowerLevelTableEntry(
                  Index=3,
                  TransmitPowerValue=1050,
                ),
                TransmitPowerLevelTableEntry(
                  Index=4,
                  TransmitPowerValue=1075,
                ),
                TransmitPowerLevelTableEntry(
                  Index=5,
                  TransmitPowerValue=1100,
                ),
                TransmitPowerLevelTableEntry(
                  Index=6,
                  TransmitPowerValue=1125,
                ),
                TransmitPowerLevelTableEntry(
                  Index=7,
                  TransmitPowerValue=1150,
                ),
                TransmitPowerLevelTableEntry(
                  Index=8,
                  TransmitPowerValue=1175,
                ),
                TransmitPowerLevelTableEntry(
                  Index=9,
                  TransmitPowerValue=1200,
                ),
                TransmitPowerLevelTableEntry(
                  Index=10,
                  TransmitPowerValue=1225,
                ),
                TransmitPowerLevelTableEntry(
                  Index=11,
                  TransmitPowerValue=1250,
                ),
                TransmitPowerLevelTableEntry(
                  Index=12,
                  TransmitPowerValue=1275,
                ),
                TransmitPowerLevelTableEntry(
                  Index=13,
                  TransmitPowerValue=1300,
                ),
                TransmitPowerLevelTableEntry(
                  Index=14,
                  TransmitPowerValue=1325,
                ),
                TransmitPowerLevelTableEntry(
                  Index=15,
                  TransmitPowerValue=1350,
                ),
                TransmitPowerLevelTableEntry(
                  Index=16,
                  TransmitPowerValue=1375,
                ),
                TransmitPowerLevelTableEntry(
                  Index=17,
                  TransmitPowerValue=1400,
                ),
                TransmitPowerLevelTableEntry(
                  Index=18,
                  TransmitPowerValue=1425,
                ),
                TransmitPowerLevelTableEntry(
                  Index=19,
                  TransmitPowerValue=1450,
                ),
                TransmitPowerLevelTableEntry(
                  Index=20,
                  TransmitPowerValue=1475,
                ),
                TransmitPowerLevelTableEntry(
                  Index=21,
                  TransmitPowerValue=1500,
                ),
                TransmitPowerLevelTableEntry(
                  Index=22,
                  TransmitPowerValue=1525,
                ),
                TransmitPowerLevelTableEntry(
                  Index=23,
                  TransmitPowerValue=1550,
                ),
                TransmitPowerLevelTableEntry(
                  Index=24,
                  TransmitPowerValue=1575,
                ),
                TransmitPowerLevelTableEntry(
                  Index=25,
                  TransmitPowerValue=1600,
                ),
                TransmitPowerLevelTableEntry(
                  Index=26,
                  TransmitPowerValue=1625,
                ),
                TransmitPowerLevelTableEntry(
                  Index=27,
                  TransmitPowerValue=1650,
                ),
                TransmitPowerLevelTableEntry(
                  Index=28,
                  TransmitPowerValue=1675,
                ),
                TransmitPowerLevelTableEntry(
                  Index=29,
                  TransmitPowerValue=1700,
                ),
                TransmitPowerLevelTableEntry(
                  Index=30,
                  TransmitPowerValue=1725,
                ),
                TransmitPowerLevelTableEntry(
                  Index=31,
                  TransmitPowerValue=1750,
                ),
                TransmitPowerLevelTableEntry(
                  Index=32,
                  TransmitPowerValue=1775,
                ),
                TransmitPowerLevelTableEntry(
                  Index=33,
                  TransmitPowerValue=1800,
                ),
                TransmitPowerLevelTableEntry(
                  Index=34,
                  TransmitPowerValue=1825,
                ),
                TransmitPowerLevelTableEntry(
                  Index=35,
                  TransmitPowerValue=1850,
                ),
                TransmitPowerLevelTableEntry(
                  Index=36,
                  TransmitPowerValue=1875,
                ),
                TransmitPowerLevelTableEntry(
                  Index=37,
                  TransmitPowerValue=1900,
                ),
                TransmitPowerLevelTableEntry(
                  Index=38,
                  TransmitPowerValue=1925,
                ),
                TransmitPowerLevelTableEntry(
                  Index=39,
                  TransmitPowerValue=1950,
                ),
                TransmitPowerLevelTableEntry(
                  Index=40,
                  TransmitPowerValue=1975,
                ),
                TransmitPowerLevelTableEntry(
                  Index=41,
                  TransmitPowerValue=2000,
                ),
                TransmitPowerLevelTableEntry(
                  Index=42,
                  TransmitPowerValue=2025,
                ),
                TransmitPowerLevelTableEntry(
                  Index=43,
                  TransmitPowerValue=2050,
                ),
                TransmitPowerLevelTableEntry(
                  Index=44,
                  TransmitPowerValue=2075,
                ),
                TransmitPowerLevelTableEntry(
                  Index=45,
                  TransmitPowerValue=2100,
                ),
                TransmitPowerLevelTableEntry(
                  Index=46,
                  TransmitPowerValue=2125,
                ),
                TransmitPowerLevelTableEntry(
                  Index=47,
                  TransmitPowerValue=2150,
                ),
                TransmitPowerLevelTableEntry(
                  Index=48,
                  TransmitPowerValue=2175,
                ),
                TransmitPowerLevelTableEntry(
                  Index=49,
                  TransmitPowerValue=2200,
                ),
                TransmitPowerLevelTableEntry(
                  Index=50,
                  TransmitPowerValue=2225,
                ),
                TransmitPowerLevelTableEntry(
                  Index=51,
                  TransmitPowerValue=2250,
                ),
                TransmitPowerLevelTableEntry(
                  Index=52,
                  TransmitPowerValue=2275,
                ),
                TransmitPowerLevelTableEntry(
                  Index=53,
                  TransmitPowerValue=2300,
                ),
                TransmitPowerLevelTableEntry(
                  Index=54,
                  TransmitPowerValue=2325,
                ),
                TransmitPowerLevelTableEntry(
                  Index=55,
                  TransmitPowerValue=2350,
                ),
                TransmitPowerLevelTableEntry(
                  Index=56,
                  TransmitPowerValue=2375,
                ),
                TransmitPowerLevelTableEntry(
                  Index=57,
                  TransmitPowerValue=2400,
                ),
                TransmitPowerLevelTableEntry(
                  Index=58,
                  TransmitPowerValue=2425,
                ),
                TransmitPowerLevelTableEntry(
                  Index=59,
                  TransmitPowerValue=2450,
                ),
                TransmitPowerLevelTableEntry(
                  Index=60,
                  TransmitPowerValue=2475,
                ),
                TransmitPowerLevelTableEntry(
                  Index=61,
                  TransmitPowerValue=2500,
                ),
                TransmitPowerLevelTableEntry(
                  Index=62,
                  TransmitPowerValue=2525,
                ),
                TransmitPowerLevelTableEntry(
                  Index=63,
                  TransmitPowerValue=2550,
                ),
                TransmitPowerLevelTableEntry(
                  Index=64,
                  TransmitPowerValue=2575,
                ),
                TransmitPowerLevelTableEntry(
                  Index=65,
                  TransmitPowerValue=2600,
                ),
                TransmitPowerLevelTableEntry(
                  Index=66,
                  TransmitPowerValue=2625,
                ),
                TransmitPowerLevelTableEntry(
                  Index=67,
                  TransmitPowerValue=2650,
                ),
                TransmitPowerLevelTableEntry(
                  Index=68,
                  TransmitPowerValue=2675,
                ),
                TransmitPowerLevelTableEntry(
                  Index=69,
                  TransmitPowerValue=2700,
                ),
                TransmitPowerLevelTableEntry(
                  Index=70,
                  TransmitPowerValue=2725,
                ),
                TransmitPowerLevelTableEntry(
                  Index=71,
                  TransmitPowerValue=2750,
                ),
                TransmitPowerLevelTableEntry(
                  Index=72,
                  TransmitPowerValue=2775,
                ),
                TransmitPowerLevelTableEntry(
                  Index=73,
                  TransmitPowerValue=2800,
                ),
                TransmitPowerLevelTableEntry(
                  Index=74,
                  TransmitPowerValue=2825,
                ),
                TransmitPowerLevelTableEntry(
                  Index=75,
                  TransmitPowerValue=2850,
                ),
                TransmitPowerLevelTableEntry(
                  Index=76,
                  TransmitPowerValue=2875,
                ),
                TransmitPowerLevelTableEntry(
                  Index=77,
                  TransmitPowerValue=2900,
                ),
                TransmitPowerLevelTableEntry(
                  Index=78,
                  TransmitPowerValue=2925,
                ),
                TransmitPowerLevelTableEntry(
                  Index=79,
                  TransmitPowerValue=2950,
                ),
                TransmitPowerLevelTableEntry(
                  Index=80,
                  TransmitPowerValue=2975,
                ),
                TransmitPowerLevelTableEntry(
                  Index=81,
                  TransmitPowerValue=3000,
                ),
                TransmitPowerLevelTableEntry(
                  Index=82,
                  TransmitPowerValue=3025,
                ),
                TransmitPowerLevelTableEntry(
                  Index=83,
                  TransmitPowerValue=3050,
                ),
                TransmitPowerLevelTableEntry(
                  Index=84,
                  TransmitPowerValue=3075,
                ),
                TransmitPowerLevelTableEntry(
                  Index=85,
                  TransmitPowerValue=3100,
                ),
                TransmitPowerLevelTableEntry(
                  Index=86,
                  TransmitPowerValue=3125,
                ),
                TransmitPowerLevelTableEntry(
                  Index=87,
                  TransmitPowerValue=3150,
                ),
                FrequencyInformation(
                  Hopping=False,
                  Parameters=[
                    FixedFrequencyTable( Frequency=[865700, 866300, 866900, 867500] ),
                  ]
                ),
                C1G2UHFRFModeTable(
                  Parameters=[
                    C1G2UHFRFModeTableEntry(
                      ModeIdentifier=2,
                      DRValue=C1G2DRValue.DRV_64_3,
                      EPCHAGTCConformance=False,
                      MValue=C1G2MValue.MV_4,
                      ForwardLinkModulation=C1G2ForwardLinkModulation.PR_ASK,
                      SpectralMaskIndicator=C1G2SpectralMaskIndicator.DI,
                      BDRValue=320000,
                      PIEValue=2000,
                      MinTariValue=20000,
                      MaxTariValue=20000,
                      StepTariValue=0,
                    ),
                    C1G2UHFRFModeTableEntry(
                      ModeIdentifier=3,
                      DRValue=C1G2DRValue.DRV_64_3,
                      EPCHAGTCConformance=False,
                      MValue=C1G2MValue.MV_8,
                      ForwardLinkModulation=C1G2ForwardLinkModulation.PR_ASK,
                      SpectralMaskIndicator=C1G2SpectralMaskIndicator.DI,
                      BDRValue=320000,
                      PIEValue=2000,
                      MinTariValue=20000,
                      MaxTariValue=20000,
                      StepTariValue=0,
                    ),
                    C1G2UHFRFModeTableEntry(
                      ModeIdentifier=5,
                      DRValue=C1G2DRValue.DRV_64_3,
                      EPCHAGTCConformance=False,
                      MValue=C1G2MValue.MV_4,
                      ForwardLinkModulation=C1G2ForwardLinkModulation.PR_ASK,
                      SpectralMaskIndicator=C1G2SpectralMaskIndicator.MI,
                      BDRValue=320000,
                      PIEValue=2000,
                      MinTariValue=14290,
                      MaxTariValue=14290,
                      StepTariValue=0,
                    ),
                    C1G2UHFRFModeTableEntry(
                      ModeIdentifier=1000,
                      DRValue=C1G2DRValue.DRV_8,
                      EPCHAGTCConformance=False,
                      MValue=C1G2MValue.MV_FM0,
                      ForwardLinkModulation=C1G2ForwardLinkModulation.PR_ASK,
                      SpectralMaskIndicator=C1G2SpectralMaskIndicator.Unknown,
                      BDRValue=40000,
                      PIEValue=1500,
                      MinTariValue=6250,
                      MaxTariValue=6250,
                      StepTariValue=0,
                    ),
                    C1G2UHFRFModeTableEntry(
                      ModeIdentifier=1002,
                      DRValue=C1G2DRValue.DRV_8,
                      EPCHAGTCConformance=False,
                      MValue=C1G2MValue.MV_FM0,
                      ForwardLinkModulation=C1G2ForwardLinkModulation.PR_ASK,
                      SpectralMaskIndicator=C1G2SpectralMaskIndicator.Unknown,
                      BDRValue=40000,
                      PIEValue=1500,
                      MinTariValue=6250,
                      MaxTariValue=6250,
                      StepTariValue=0,
                    ),
                  ]
                ),
              ]
            ),
          ]
        ),
        C1G2LLRPCapabilities(
          CanSupportBlockErase=False,
          CanSupportBlockWrite=True,
          MaxNumSelectFiltersPerQuery=5,
        ),
      ]
    )
    
    
    -----------------------------------------------------
    Sending Message:
    ADD_ROSPEC(
      MessageID=16,
      Parameters=[
        ROSpec(
          ROSpecID=123,
          Priority=0,
          CurrentState=ROSpecState.Disabled,
          Parameters=[
            ROBoundarySpec(
              Parameters=[
                ROSpecStartTrigger( ROSpecStartTriggerType=ROSpecStartTriggerType.Immediate ),
                ROSpecStopTrigger(
                  ROSpecStopTriggerType=ROSpecStopTriggerType.Null,
                  DurationTriggerValue=0,
                ),
              ]
            ),
            AISpec(
              AntennaIDs=[1, 2, 3, 4],
              Parameters=[
                AISpecStopTrigger(
                  AISpecStopTriggerType=AISpecStopTriggerType.Tag_Observation,
                  DurationTrigger=0,
                  Parameters=[
                    TagObservationTrigger(
                      TriggerType=TagObservationTriggerType.Upon_Seeing_N_Tags_Or_Timeout,
                      NumberOfTags=500,
                      NumberOfAttempts=1,
                      T=0,
                      Timeout=500,
                    ),
                  ]
                ),
                InventoryParameterSpec(
                  InventoryParameterSpecID=1234,
                  ProtocolID=AirProtocols.EPCGlobalClass1Gen2,
                ),
              ]
            ),
            ROReportSpec(
              ROReportTrigger=ROReportTriggerType.Upon_N_Tags_Or_End_Of_ROSpec,
              N=0,
              Parameters=[
                TagReportContentSelector(
                  EnableROSpecID=False,
                  EnableSpecIndex=False,
                  EnableInventoryParameterSpecID=False,
                  EnableAntennaID=True,
                  EnableChannelIndex=False,
                  EnablePeakRSSI=False,
                  EnableFirstSeenTimestamp=True,
                  EnableLastSeenTimestamp=False,
                  EnableTagSeenCount=False,
                  EnableAccessSpecID=False,
                ),
              ]
            ),
          ]
        ),
      ]
    )
    
    
    Received Response:
    ADD_ROSPEC_RESPONSE(
      MessageID=16,
      Parameters=[
        LLRPStatus(
          StatusCode=StatusCode.M_FieldError,
          ErrorDescription='LLRP [1875] : Invalid number of antennas (4) specified in the AntennaID set',
          Parameters=[
            ParameterError(
              ParameterType=177,
              ErrorCode=StatusCode.P_ParameterError,
              Parameters=[
                ParameterError(
                  ParameterType=183,
                  ErrorCode=StatusCode.P_FieldError,
                  Parameters=[
                    FieldError(
                      FieldNum=1,
                      ErrorCode=StatusCode.A_Invalid,
                    ),
                  ]
                ),
              ]
            ),
          ]
        ),
      ]
    )
    
    
    -----------------------------------------------------
    Sending Message:
    ENABLE_ROSPEC(
      MessageID=17,
      ROSpecID=123,
    )
    
    
    Received Response:
    ENABLE_ROSPEC_RESPONSE(
      MessageID=17,
      Parameters=[
        LLRPStatus(
          StatusCode=StatusCode.M_FieldError,
          ErrorDescription='LLRP [1192] : No ROSpecs have been configured',
          Parameters=[
            FieldError(
              FieldNum=1,
              ErrorCode=StatusCode.A_Invalid,
            ),
          ]
        ),
      ]
    )
    
    
    Reader Initialization Failed.
    Disconnecting Reader.
    Attempting Reconnect in 2 seconds...
    
    Trying to Connect to Reader: (192.168.1.128:5084)...
    ConnectionTimeout=3.00 seconds
    Connected to: (192.168.1.128:5084)
    Waiting for READER_EVENT_NOTIFICATION...
    
    Received Response:
    READER_EVENT_NOTIFICATION(
      MessageID=719673946,
      Parameters=[
        ReaderEventNotificationData(
          Parameters=[
            UTCTimestamp( Microseconds=1579792337532058 ),
            ConnectionAttemptEvent( Status=ConnectionAttemptStatusType.Success ),
          ]
        ),
      ]
    )

CrossMgr Impinj "splitter": One reader for timing and racedb

Is your feature request related to a problem? Please describe.
Alot of the Impinj readers are four port readers, and generally, only one or two ports are actually used for race timing antennas. The remaining ports are unused. It would be useful to be able, somehow, to assign ports in CrossMgrImpinj to use for race timing (crossmgr) and race registration (racedb).

Describe the solution you'd like
The typically situation for a small race is to have two ports for timing and two ports for registration. This, of course, assumes reg is close enough to the start/finish that this would work. For small races, it is easy enough to make that happen. In this way, only one reader would be required. CrossMgrImpinj would then a client and a server. It would connect to CrossMgr for timing and allow RaceDB to connect to it for reg. Some mapping might be required to fake an X port reader that Racedb can talk to. Alternatively, CrossMgrImpinj could just forward whatever chips appear on the port to RaceDB and only records the chip when the user presses the "read" button.

Describe alternatives you've considered
Spend more money on a second reader (which are expensive to buy new).

Batch FTP on Linux crashes on upload

Describe the bug
After the race has been run, go to Batch FTP menu item, select batch upload for Index and Html, and click process all. The first file (index?) uploads, and the second file causes a segfault. CrossMgr exits and must be restarted.

To Reproduce
Steps to reproduce the behavior:

  1. Batch FTP menu item, select batch upload for Index and Html
  2. Click on 'Process All"
  3. Crash

Expected behavior
All files would be uploaded and dialog disappears.

Desktop (please complete the following information):

  • OS: Linux Ubuntu 18.06LTS
  • Version: Current Development release: 3.0.46-beta

Additional context
Upload was at the FCV where the upload speed is 500kbps...slow. Not sure what happens on Mac or Windows. After the problem happened one race, I gave up. Could be race related....as the number of laps was 450.

TT CountDown CSS fix for mobile

Fixes a rendering issue on firefox mobile on Android.

This solution has a fallback to the current setting if 'vw' units are not supported by the browser.

#countdown-clock {
    font-size: 4500%;
    font-size: 45vw;
    font-weight: bold;
    display: inline-block;
    width: 100%;
    text-align: center;
    line-height: 85%;
}

Smaller text on a phone because it based on the viewport width. Desktop should appear almost as before. But it might be too small on a square screen and too big on a wide screen.

Maybe media query on device width might be a better solution.

screenshot_20170602-164809

screenshot_20170602-164815

'Bike' field for HPV racing

We (the British Human Power Club) are using CrossMgr for HPV racing, and are looking to move to using SeriesMgr instead of our fairly arcane Excel-based scoring system.

Obviously the type of bike isn't something that's tracked in normal cycling events, where they all conform to some standard, but HPV racing is as much about engineering as it is about athletic ability. Riding different/modified machines at different races within a season is normal and encouraged in the BHPC. We're successfully using the CustomCategory feature to represent our various overlapping classes (faired, unfaired, multi-track, road-legal, etc).

As CrossMgr lacks a 'Bike' field, we've been using the 'Team' field instead (we don't, at present, organise team events). This is mostly satisfactory, except that SeriesMgr only outputs the team from (I think) the rider's last race.

The ideal solution would be support for a 'Bike' field throughout the suite, with SeriesMgr able to display all variations present for a rider in a series, as a list alongside the rider's name, points, etc, and/or along with the position and points for each race. It would need an alias function like those for rider names and teams to allow for minor typographical differences between races.

Failing that, I'd be happy if SeriesMgr created a list of teams (after aliasing) a rider has ridden for during the series, rather than just using the value from a single race.

(I suspect this feature may also be useful for other exotica, eg. pedal-car racing.)

Team Time trial support

I'd like to be able to time team time trial races easily with CrossMgr, when there are 3-6 participants, with at least 3 or 4 crossing the finish line and the time taken from the last to cross. Is there currently a workaround for starting whole teams at two minute intervals other than doing manual waves for all and then manually compiling results with Excel?

CrossMgrAlien does not work well with multi AlienChip terminals

I have no enough test about this issue's reproducibility. Please check by your side.

Environment

  • Windows 10
  • CrossMgr 2.10.52 + CrossMgrAlien 0.15
  • 2 Alien Terminals + 8 Antenna (4 antenna for each terminal)
  • Terminal1: 192.168.1.100
  • Terminal2: 192.168.1.150
  • PC: 192.168.1.50
  • Router: 192.168.1.1

Issues (There are 2 issues)

  • Issue1: Run 2 CrossMgrAlien app on 1PC, and connect each terminal from each app, sometimes drop a packet from terminal
    • If terminal1 works well, terminal2 doesn't. terminal2 works, terminal1 doesn't.
    • There are no chance to work both app and terminal work perfectly...
    • I've checked the packet from each terminal by Wireshark app (Packet monitoring tool)
  • Issue2: CrossMgr can't ignore short interval multi packets from multi CrossMgrAlien app
    • To avoid issue1, setup other PC only for CrossMgrAlien. 2PC + 2 Alien Terminals + 2 CrossMgrAlien App are work well rather than 1PC+2CrossMgrAlien app
    • Although, when each CrossMgrAlien app detect a same tag at same time, 2 packets will send to CrossMgr at almost same time, CrossMgr put 2 Laps for this tag. (Expect only 1 lap for 2 packets with short interval)

Wrong bib number is shown on Rider Detail screen when double click

Environment

  • Windows 8.1 / 10
  • CorssMgr 2.10.51 / 2.10.52 / 2.20

How to reproduct

  • Double click to show Rider Detail
  • At first, it shows correct bib number from clicking item
  • Although, close Rider Detail window and select another athlete by double clicking again. There are wrong bib number shown.

Like this
default
from double click the athlete No.549, textbox is correct, but other information is No.540's.

[SEVERE] [Py3 update] ImpinjData is not being saved by CrossMgrImpinj 3.0.0

Just noticed this, when running CrossMgrImpinj 3.0.0. No backup data is saved to the path CrossMgrImpinj 3.0.0 shows and seemingly not in any other path either. Tested on Ubuntu 16.04.6 and Windows 7 on two different computers. With CrossMgrImpinj version 2.21.19 everything works ok.

I also tested with newer versions 3.0.1 and 3.0.2, and it seems the same issue is present, with the addition of my Motorola FX9500 reader not reading tags at all. With 2.xx and 3.0.0 tags are still read normally in "First Read Time" -mode.

LOG from 3.0.2 (with about 150 tags in front of the antenna...):

*****************************************
Reader Server Started: (192.168.1.232:5084)

Trying to Connect to Reader: (192.168.1.232:5084)...
ConnectionTimeout=3.00 seconds
Connected to: (192.168.1.232:5084)
Waiting for READER_EVENT_NOTIFICATION...

Received Response:
READER_EVENT_NOTIFICATION(
  MessageID=490,
  Parameters=[
    ReaderEventNotificationData(
      Parameters=[
        UTCTimestamp( Microseconds=1563819069429894 ),
        ConnectionAttemptEvent( Status=ConnectionAttemptStatusType.Success ),
      ]
    ),
  ]
)



Reader time is 10798.543661 seconds different from computer time

-----------------------------------------------------
Sending Message:
SET_READER_CONFIG(
  MessageID=17,
  ResetToFactoryDefault=True,
)


Received Response:
SET_READER_CONFIG_RESPONSE(
  MessageID=17,
  Parameters=[
    LLRPStatus(
      StatusCode=StatusCode.M_Success,
      ErrorDescription='',
    ),
  ]
)


-----------------------------------------------------
Sending Message:
GET_READER_CONFIG(
  MessageID=18,
  AntennaID=0,
  RequestedData=GetReaderConfigRequestedData.AntennaProperties,
  GPIPortNum=0,
  GPOPortNum=0,
)


Received Response:
GET_READER_CONFIG_RESPONSE(
  MessageID=18,
  Parameters=[
    LLRPStatus(
      StatusCode=StatusCode.M_Success,
      ErrorDescription='',
    ),
    AntennaProperties(
      AntennaConnected=True,
      AntennaID=1,
      AntennaGain=600,
    ),
    AntennaProperties(
      AntennaConnected=False,
      AntennaID=2,
      AntennaGain=600,
    ),
    AntennaProperties(
      AntennaConnected=False,
      AntennaID=3,
      AntennaGain=600,
    ),
    AntennaProperties(
      AntennaConnected=False,
      AntennaID=4,
      AntennaGain=600,
    ),
    AntennaProperties(
      AntennaConnected=False,
      AntennaID=5,
      AntennaGain=600,
    ),
    AntennaProperties(
      AntennaConnected=False,
      AntennaID=6,
      AntennaGain=600,
    ),
    AntennaProperties(
      AntennaConnected=False,
      AntennaID=7,
      AntennaGain=600,
    ),
    AntennaProperties(
      AntennaConnected=False,
      AntennaID=8,
      AntennaGain=600,
    ),
  ]
)


-----------------------------------------------------
Sending Message:
SET_READER_CONFIG(
  MessageID=19,
  ResetToFactoryDefault=False,
  Parameters=[
    AntennaConfiguration(
      AntennaID=0,
      Parameters=[
        C1G2InventoryCommand(
          TagInventoryStateAware=False,
          Parameters=[
            C1G2SingulationControl(
              Session=2,
              TagPopulation=4,
              TagTransitTime=3000,
            ),
          ]
        ),
      ]
    ),
    KeepaliveSpec(
      KeepaliveTriggerType=KeepaliveTriggerType.Periodic,
      PeriodicTriggerValue=2000,
    ),
  ]
)


Received Response:
SET_READER_CONFIG_RESPONSE(
  MessageID=19,
  Parameters=[
    LLRPStatus(
      StatusCode=StatusCode.M_Success,
      ErrorDescription='',
    ),
  ]
)


-----------------------------------------------------
Sending Message:
DISABLE_ROSPEC(
  MessageID=20,
  ROSpecID=0,
)


Received Response:
DISABLE_ROSPEC_RESPONSE(
  MessageID=20,
  Parameters=[
    LLRPStatus(
      StatusCode=StatusCode.M_Success,
      ErrorDescription='',
    ),
  ]
)


-----------------------------------------------------
Sending Message:
DELETE_ROSPEC(
  MessageID=21,
  ROSpecID=123,
)


Received Response:
DELETE_ROSPEC_RESPONSE(
  MessageID=21,
  Parameters=[
    LLRPStatus(
      StatusCode=StatusCode.M_Success,
      ErrorDescription='',
    ),
  ]
)


-----------------------------------------------------
Sending Message:
GET_READER_CAPABILITIES(
  MessageID=22,
  RequestedData=GetReaderCapabilitiesRequestedData.All,
)


Get response fails: (1023, 161, 1)
GET_READER_CAPABILITIES Exception: 'bool' object is not iterable:
Traceback (most recent call last):
  File "/home/k/Ajanotto/CrossMgr-fork/CrossMgrImpinj/Impinj.py", line 316, in sendCommands
    success, response = self.sendCommand(GET_READER_CAPABILITIES_Message(RequestedData = GetReaderCapabilitiesRequestedData.All))
TypeError: 'bool' object is not iterable

-----------------------------------------------------
Sending Message:
ADD_ROSPEC(
  MessageID=23,
  Parameters=[
    ROSpec(
      ROSpecID=123,
      Priority=0,
      CurrentState=ROSpecState.Disabled,
      Parameters=[
        ROBoundarySpec(
          Parameters=[
            ROSpecStartTrigger( ROSpecStartTriggerType=ROSpecStartTriggerType.Immediate ),
            ROSpecStopTrigger(
              ROSpecStopTriggerType=ROSpecStopTriggerType.Null,
              DurationTriggerValue=0,
            ),
          ]
        ),
        AISpec(
          AntennaIDs=[1],
          Parameters=[
            AISpecStopTrigger(
              AISpecStopTriggerType=AISpecStopTriggerType.Tag_Observation,
              DurationTrigger=0,
              Parameters=[
                TagObservationTrigger(
                  TriggerType=TagObservationTriggerType.Upon_Seeing_N_Tags_Or_Timeout,
                  NumberOfTags=500,
                  NumberOfAttempts=1,
                  T=0,
                  Timeout=500,
                ),
              ]
            ),
            InventoryParameterSpec(
              InventoryParameterSpecID=1234,
              ProtocolID=AirProtocols.EPCGlobalClass1Gen2,
            ),
          ]
        ),
        ROReportSpec(
          ROReportTrigger=ROReportTriggerType.Upon_N_Tags_Or_End_Of_ROSpec,
          N=0,
          Parameters=[
            TagReportContentSelector(
              EnableROSpecID=False,
              EnableSpecIndex=False,
              EnableInventoryParameterSpecID=False,
              EnableAntennaID=True,
              EnableChannelIndex=False,
              EnablePeakRSSI=False,
              EnableFirstSeenTimestamp=True,
              EnableLastSeenTimestamp=False,
              EnableTagSeenCount=False,
              EnableAccessSpecID=False,
            ),
          ]
        ),
      ]
    ),
  ]
)


Received Response:
ADD_ROSPEC_RESPONSE(
  MessageID=23,
  Parameters=[
    LLRPStatus(
      StatusCode=StatusCode.M_Success,
      ErrorDescription='',
    ),
  ]
)


-----------------------------------------------------
Sending Message:
ENABLE_ROSPEC(
  MessageID=24,
  ROSpecID=123,
)


Received Response:
ENABLE_ROSPEC_RESPONSE(
  MessageID=24,
  Parameters=[
    LLRPStatus(
      StatusCode=StatusCode.M_Success,
      ErrorDescription='',
    ),
  ]
)

Exported UCI result is not compatible with dataride

Environment

CrossMgr 2.3.12
Windows 10

Issue

Exporting UCI result to upload to UCI dataride.
Although, exported excel file has no compatible with dataride format.
Lapped rider's result and IRM text are wrong, so we should edit this file manually...

Proper lapped rider format is:

  • '-N' in result column
  • 'LAP' in IRM column

Hotkey & auto capture support for CrossMgrVideo (without rfid)

It is quite simple to implement a photoelectric sensor that would trigger a joystick button press:
https://www.youtube.com/watch?v=4HW11sDh-5M

You can get a photoelectric sensor with a reflector for 20-30€ and a USB joystick encoder for less than 10€ from Aliexpress. This way one could use CrossMgrVideo without rfid-tags using the joystick button presses as a trigger for the capture.

Also what could be implemented is “auto capture” where CrossMgrVideo would check for movement in the image? Perhaps there would be a good ready-made function in OpenCV?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.