Python driver
Command decorator
The command decorator is available in the Koheron Python library.
Use the command decorator @command(classname='', funcname='') where classname is the C++ driver class name and funcname the C++ driver function name for the Python driver to work in line with the C++ driver.
Example
For the following C++ driver:
class LedBlinker {
#...
void set_led(uint32_t led_value) {
ctl.write<reg::led>(led_value);
}
#...
}
The matching Python driver is:
from koheron import command
class LedBlinker(object):
def __init__(self, client):
self.client = client
@command(classname='LedBlinker', funcname='set_led')
def my_set_led(self, value):
pass
If the Python driver class name matches the C++ driver class name and the Python driver function name matches the C++ driver function name, you can simply use @command().
Available functions
Receive a single value
recv(format)
Available format:
* 'I': unsigned 32-bit integer
* 'i': signed 32-bit integer
* 'f': 32-bit floating point
* 'd': 64-bit double precision
* '?': boolean
Example
C++ driver:
uint32_t get_forty_two() {
return sts.read<reg::forty_two>();
}
Python driver:
@command()
def get_forty_two(self):
return self.client.recv('I')
Receive a tuple of values
recv_tuple(format)
Available format:
* 'I': unsigned 32-bit integer
* 'i': signed 32-bit integer
* 'f': 32-bit floating point
* 'd': 64-bit double precision
* '?': boolean
Example
C++ driver:
auto get_adc() {
// Convert from two-complement to int32
int32_t adc0 = ((sts.read<reg::adc0>()-8192)%16384)-8192;
int32_t adc1 = ((sts.read<reg::adc1>()-8192)%16384)-8192;
return std::make_tuple(adc0, adc1);
}
Python driver:
@command()
def get_adc(self):
return self.client.recv_tuple('ii')
Receive arrays
C++ standard arrays and vectors are mapped with Python NumPy arrays.
recv_vector(dtype='')
Available dtype:
* 'uint32': unsigned 32-bit integer
* 'int32': signed 32-bit integer
* 'float32': 32-bit floating point
* 'float64': 64-bit double precision
* 'bool': boolean
Example
C++ driver:
std:vector<float>& get_vector() {
return my_vector;
}
};
Python driver:
import numpy
#...
@command()
def get_vector(self):
return self.client.recv_vector(dtype='float32')

