# Real-Time Robotics Framework

### Sidebar

eeros_architecture:hal:feature_functions

# Feature Functions

All inputs and outputs of the HAL have a common set of properties and functions for reading or writing them. Some hardware channels have specific properties not common to other channels, e.g. a pulse width modulated output needs to be assigned its base frequency. Another example would be a digital to analog converter which has a calibration function which needs to be called upon request.
Feature functions are functions which are specific to a HAL object. They can be called by a user with

  void callOutputFeature(OutputInterface *obj, std::string featureName, ArgTypesOut... args);
void callInputFeature(InputInterface *obj, std::string featureName, ArgTypesIn... args);

The parameter are as follows:

1. OutputInterface / InputInterface: the HAL object
2. featureName: name of the function as defined in the appropriate hardware wrapper library, see Hardware Libraries.
3. args: arguments to this function

The following example shows how to set the frequency of a pulse width modulated output. This is usually done just once. After this you can release the object.

  HAL& hal = HAL::instance();
eeros::hal::Output<double>* pwm = hal.getScalableOutput("pwm1");
hal.callOutputFeature(pwm, "setPwmFrequency", 100.0);
hal.releaseOutput("pwm1");

## Accessing Feature Functions from the Control System

The control system defines a peripheral output objects which is connected to our HAL object. The control system will usually periodically write to this output and set the duty cycle. However, if you wish to change the frequency of the signal you must again use the feature function as follows:

  PeripheralOutput<double> motorSpeed("pwm1");
motorSpeed.callOutputFeature("setPwmFrequency", 200.0);