301 - Permanently moved to the eagletrt's organization
From a CAN and/or GPS log, simulates the contained messages into the local environment @eagletrt.
This project is an npm package made for the telemetry of eagletrt. The telemetry consists in a c program located in a Raspberry Pi and attached to the canbus of the car and to a rover-gps. Its job is reading all the sensors messages, forwarding them via mqtt and saving them in a local mongodb database. Some can and gps raw logs are also saved by the telemetry. The purpose of this project is having a tool that given those raw logs, reproduces them in the local environment, especially for testing purposes.
This project was made with typescript and consists in an npm module that can be used also globally, as a terminal command. It is linted with eslint, bundled with webpack, documented with typedoc and checked by some github actions.
The library gets as inputs a can and/or gps raw log. It is very highly conigurable, but roughly what it does is reading those files and reproducing the events it reads, by emitting events in the CANbus (virtual or real) and USB virtual serial ports.
This module can be actually used both as a local and as a global npm module.
Install the module executing:
$ npm install --save @eagletrt/telemetria-simulator
Virtualize a can interface
const telemetriaSimulator = require('@eagletrt/telemetria-simulator');
async function main() {
await telemetriaSimulator.virtualizeCan('vcan0', { silent: true });
}
main();
Simulate from a CAN log
const telemetriaSimulator = require('@eagletrt/telemetria-simulator');
async function main() {
const canSimulatorInstance = await simulateCan('./can.log', {
iterations: 100,
silent: true,
canInterface: 'vcan0'
});
await canSimulatorInstance.waitUntilFinished();
}
main();
Simulate from a GPS log
const telemetriaSimulator = require('@eagletrt/telemetria-simulator');
async function main() {
const gpsSimulatorInstance = await simulateGps('./gps.ubx', {
iterations: 100,
silent: true,
simulateTime: true,
delay: 230
});
console.log(await gpsSimulatorInstance.getGpsInterface());
await gpsSimulatorInstance.waitUntilFinished();
}
main();
To see all the options, refer to the api.
Install the module with:
$ npm install -g @eagletrt/telemetria-simulator
Executing:
$ eagletrt-simulator virtualize can
$ eagletrt-simulator simulate can
$ eagletrt-simulator simulate gps
$ eagletrt-simulator simulate all
Will have the same results as the examples with the local module.
The options are almost the same as in the api of the local module. To see all the cli options, run:
$ eagletrt-simulator --help
Syntax:
virtualizeCan(canInterface, options)
Description:
Virtualizes a canbus interface.
Parameters:
- canInterface: The name of the interface that is to be virtualized. It is a
string
and the default value iscan0
. - options: The VirtualizeCanOptions passed to customize the behaviour.
Returns:
It returns a promise to the string virtualized
if it is succesfully virtualized or already_virtualized
if it were already virtualized.
Options:
- silent: Default value
false
. If true, the log will not be shown.
Syntax:
simulateCan(src, options)
Description:
Simulates some data sent via a virtualized canbus interface. The data comes from a can log, that can be obtained through tools such as candump.
Parameters:
- src: The path to the can log file containing the messages that will be sent over the virtualized canbus. The default value is a can log file already stored in this npm package. If some options are wanted to be specified, but also using the default src file, use null as this value.
- options: The SimulateCanOptions passed to customize the behaviour.
Returns:
It returns a promise to a CanSimulatorInstance that can be used to wait until the simulation is finished.
Options:
- canInterface: The name of the interface that is to be virtualized. It is a
string
and the default value iscan0
. - iterations: The number of times that the can log file will be sent over the can. It is a
number
and the default value isInfinity
. - silent: If true, the log will not be shown. It is a
boolean
and the default value istrue
. - simulateTime: If the delta timestamps specified for each message in the can log file will be taken in consideration and simulated. It is a
boolean
and the default value istrue
.
Methods of the returned instance
- stop(): Stops the process if it has not already finished. It returns a promise to
void
. - waitUntilFinished(timeout?: null | number): Waits until the can simulator has finished or an optional-specified timeout (in milliseconds) has expired. It returns a promise to a
boolean
which is true if the simulator has finished and false otherwise.
Syntax:
simulateGps(src, options)
Description:
Simulates some data sent via a virtualized gps serial port. The data comes from a gps ubx log.
Parameters:
- src: The path to the gps log file containing the messages that will be sent over the virtualized serial port. The default value is a gps log file already stored in this npm package. If some options are wanted to be specified, but also using the default src file, use null as this value.
- options: The SimulateGpsOptions passed to customize the behaviour.
Returns:
It returns a promise to a GpsSimulatorInstance that can be used to wait until the simulation is finished.
Options:
- delay: The number of milliseconds that the gps simulator will wait after opening the gps pseudoterminal port interface and before sending the messages over that interface. It is a
number
and the default value is0
. - iterations: The number of times that the gps ubx log file will be sent over the serial port. It is a
number
and the default value isInfinity
. - keepAlive: If true, the process will be kept alive after having sent all the simulated gps data. It is a
boolean
and the default value isfalse
. - silent: If true, the log will not be shown. It is a
boolean
and the default value istrue
. - simulateTime: If the delta timestamps specified for each message in the gps ubx log file will be taken in consideration and simulated. It is a
boolean
and the default value istrue
.
Methods of the returned instance
- getGpsInterface(): Returns the gps interface if it is already defined, or waits for the gps simulator output to print it and returns it after detecting that output. It returns a promise to a
string
. - stop(): Stops the process if it has not already finished. It returns a promise to
void
. - waitUntilFinished(timeout?: null | number): Waits until the gps simulator has finished or an optional-specified timeout (in milliseconds) has expired. It returns a promise to a
boolean
which is true if the simulator has finished and false otherwise.
This module was used in the telemetry sender repo of eagletrt. It is also included in the eagle-cli.
Note that this module uses yargs for the cli and the yargs commands and options are modular: this means that they can be imported and used by other modules that consists in a cli and wrap this library, such as the eagle-cli.
The GPS simulator is written in C and compiled during installation. If this does not happen, there is a script in the package.json
exactly to do it. The C program is valid only on Linux.
A default can log and a default gps log are already included in this package.
To build for production, using webpack:
npm run bundle