t Programming¶
The Kvaser t programming language is event oriented and modeled after C. It can be used to customize the behavior of the Kvaser Memorator v2 and other Kvaser t capable devices.
A t program is invoked via hooks, which are entry points that are executed at the occurrence of certain events. These events can be, for example, the arrival of specific CAN messages, timer expiration, or external input.
Here we will describe how to interact with t programs on a Kvaser device (i.e. loading, starting, stopping) For a complete reference to the t language, see the Kvaser t Programming Language available from https://www.kvaser.com/downloads.
Load and Unload t Program¶
The first step is to compile your t program into a .txe file, see the Kvaser t
Programming Language. A
compiled .txe file may be examined using Txe
:
>>> t = canlib.Txe("HelloWorld.txe")
>>> t.description
'This is my hello world program.'
Before starting a t program you need to load it into an available “slot”. Some Kvaser devices have multiple slots, and are therefore capable of running multiple programs simultaneously.
To load a t program located on the host PC, use
Channel.scriptLoadFile()
. The canlib.Channel
used determines the default channel
for the loaded t program. If your channel was opened to a device’s second
channel, the default channel number will be set to 1 (the numbering of channel
on the card starts from 0). You can read this value using
Channel.channel_data.chan_no_on_card
To load a t program located on the device, use
Channel.scriptLoadFileOnDevice()
. To copy arbitrary files to and from the
the device, use Channel.fileCopyToDevice()
and
Channel.fileCopyFromDevice()
respectively.
To unload a stopped script, use Channel.scriptUnload()
.
You may use Channel.fileGetCount()
, and Channel.fileGetName()
to examine
files located on the Kvaser device, and Channel.fileDelete()
to delete a
specific file.
Note
Not all Kvaser devices support storing t programs and other files locally on the device (i.e. USBcan Pro 2xHS v2). Please refer to your device’s User Guide for more information. All User Guides may be downloaded from www.kvaser.com/downloads.
Start and Stop a t Program¶
To start a previously loaded t program, use Channel.scriptStart()
. You may
stop a running script using Channel.scriptStop()
. To examine the status of a
slot (i.e. if the slot is free or has a program loaded or running), use
Channel.scriptStatus()
.
Example¶
The following code fragment shows how to load the compiled t program “HelloWorld.txe” from the PC, and then start and stop the t program:
>>> from canlib import canlib
>>> ch = canlib.openChannel(0)
>>> ch.scriptLoadFile(slot=0, filePathOnPC="C:/dev/HelloWorld.txe")
>>> ch.scriptStatus(slot=0)
<ScriptStatus.LOADED: 1>
>>> ch.scriptStart(slot=0)
>>> ch.scriptStatus(slot=0)
<ScriptStatus.RUNNING|LOADED: 3>
>>> ch.scriptStop(slot=0)
>>> ch.close()
Environment Variables¶
To communicate between the PC and your t program, you can use t Environment
Variables (Envvar). When a t program has been loaded, the Envvar defined in the
t program can be accessed via Channel.envvar
, however the t program must be
running in order to be able to set the value of an Envvar.
There are three types of Envvar in t; int
, float
, and char*
. The first
two are accessed as the corresponding Python type, and the last is accessed
using canlib.envvar.DataEnvVar
which behaves as an array of bytes.
If we have a t program, envvar.txe
, that set up three Envvar as follows:
envvar
{
int IntVal;
float FloatVal;
char DataVal[512];
}
on start {
envvarSetValue(IntVal, 0);
envvarSetValue(FloatVal, 15.0);
envvarSetValue(DataVal, "Fear not this night\nYou will not go astray");
}
The following example starts the t program envvar.txe
and acesses it’s Envvar.
>>> from canlib import canlib
>>> ch = canlib.openChannel(0)
>>> ch.scriptLoadFile(slot=0, filePathOnPC="envvar.txe")
>>> ch.scriptStart(slot=0)
>>> ch.envvar.IntVal
0
>>> ch.envvar.IntVal = 3
>>> ch.envvar.IntVal
3
>>> ch.envvar.FloatVal
15.0
>>> ch.envvar.DataVal[9:20]
b'this night\n'
>>> ch.scriptStop(slot=0)
>>> ch.close()
Note that setting of the Envvars has also been done in the t program. For examples on how to use an Envvar in your t program, see the Kvaser t Programming Language.
Send Event¶
You may trigger the “on key” hook in your t program by sending a
kvEVENT_TYPE_KEY
to a running t program using
Channel.scriptSendEvent()
. The following will trigger an on key 'a'
{...}
hook:
>>> ch.scriptSendEvent(eventNo=ord('a'))