Remote-controlled shooting targets
My first encounter with remote-controlled and automatically falling (when hit) targets was when I was serving as a conscript in the Finnish Defence forces (FDF). The target FDF used was called “Jaster” or “Jantteri” and I believe it was a domestic product developed exclusively for FDF, since there’s very little information publicly available about them.
Later in life (in 2021), a similar remote-controllable and automatically falling shooting target was introduced to me. The introducers were my friends from the reservist association I belong to (Tapiolan Reserviupseerit). The product in question was Eli Hardy which I thought was Estonians’ version of the Finnish Jaster system. While introducing Hardy to me, my friends expressed their missatisfaction to Hardy’s user experience: the targets were controlled by a mil-spec radio transmitter, which one can spot from Eli’s promotional images on Hardy’s product page. The user interface of the radio is so abysmal that they requested me to create a computer program with a GUI that would have all the functionality that Eli’s transmitters have. I agreed to do the task!
Controlling Eli Hardys
Since Eli Hardys are controlled via a radio, the first step was to reverse engineer how it is being done. We found out that the radio used in Eli’s controller was a basic radio modem which eats RS232 and outputs the serial data to the readio network. The binary data command structure itself was pretty simple, and Hannu Valkonen reverse engineered it for our use. Unfortunately I don’t have the documentation of the reverse engineering process or clear documentation of the command structure with me anymore, but the final implementation and reconstruction of Hardy commands can be found from the HardyExecutor.cs file from the project’s Github page. With the help of this source file anyone can reimplement the command protocol in their programming language of choice.
The implementation
I decided to use Micro$oft’s C# and .net framework to create the program, since it offers a very easy way to create GUI applications for computers running Windows as their main OS. If this was a personal project I would’ve surely chosen something different… C# was also an interesting choice, since I think it was some 2013 or so when I last programmed anything with C# / .net. So it was a nice refresher and learning opportunity, since I don’t consider myself any good in the C# language. Therefore I will issue a warning here: the code in the repository might be absolutely disgusting to read if you are proficient in C#. Now that I’ve warned you, here’s a link to the project and its sources: TaRu_Hardy on Github.
User interface
The program is divided into three different tabs: General, Program executor/editor, and Options.
General tab
Inside general tab the user can command or setup basic configuration for either all or a selected subset of targets. By default, i.e. if no targets are selected, the program assumes that the commands/configuration should be set to all Hardys it can connect to. From the quick program box the user can setup a repeating simple program for the Hardys and start/stop it.
Scripts tab
The scripts tab works as an editor for TaRu Hardy controller script (.thcs)
files. In this tab, one can create simple programs by using a simple
interpreted “Hardy BASIC” programming language! This BASIC-based language was
a really fun project to implemet. I used
BasicSharp as a starting point and
expanded the set of commands (added sleep
command and some target-specific
commands such as reset
, down
, up
) to make the Hardy Basic usable for
target controlling. As an example, a part of the FDF’s RK11 shooting test is
implemented in the script in above picture. The script output and possible
interpreter errors i.e. syntax errors :-) are printed out to the log window.
Options tab
From the options tab the user can setup a preferred lowest log level to print out to the log window and the COM port to be used with the radio. The options tab also shows the current status (battery level and settings) and the timestamp when any of the aforementioned data was last fetched successfully to the TaRu Hardy Controller program.