Skip to content
A simple signals and slots library for arduino
C++
Branch: master
Clone or download
Latest commit d462993 Jul 3, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples/BasicUseage Improving library. Renaming some methods to more closely match other … Oct 9, 2017
Callback.h Fixes Signal.attach size check Jun 24, 2019
LICENSE Create LICENSE Aug 20, 2018
README.md
keywords.txt Use correct field separator in keywords.txt Jul 17, 2018
library.properties Update library.properties Feb 8, 2018

README.md

Callback:

A simple Signals and Slots implementation for Arduino

Signals and slots is a handy pattern for situations where one or more objects need to be informed of changes occuring elsewhere in the program much like a callback. Unlike callbacks, with this library it's possible to have multiple functions called on the occurence of an event. Additionally, those functions can be methods of an object as well as standard functions.

To make use of this, define a Signal for an event that might need monitoring like:

Signal<float> highTempMeasured;

Signal is a template class that expects the type of signals it'll later pass to its Slots. In this case it's a temperature so a float is appropriate. It has a second optional template parameter which is the number of slots it can support, the default is 8.

Now connect to the signal with Slots, recepticles and handlers for the events emitted by the signal. Slots can be made from free standing functions like so:

void RaiseHighTempAlert(float temperature)
{
	Serial.println("High temp measured!");
}

Or methods of objects like so:

class AlertsManager
{
	float highestTempRecorded;
public:
	OnHighTempMeasured(float temperature)
	{
		if(temperature > highestTempRecorded)
			highestTempRecorded = temperature;
	}
} alerter;

For free standing functions we define a slot like so:

FunctionSlot<float> funcSlot(RaiseHighTempAlert);

And for methods, like this:

MethodSlot<Foo, float> methSlot(&alerter, &AlertsManager::OnHighTempMeasured);

Both can be connected to the highTempMeasured signal if their function parameters match that of the signal (and the type supplied to the tempate during declaration). In this case they do so:

highTempMeasured.attach(funcSlot);
highTempMeasured.attach(methSlot);

Now calling fire and passing it say, 54.7 will call void RaiseHighTempAlert(54.7) and alerter.OnHighTempMeasured(54.7).

Slots can also be disconnected from signals using their detach method:

highTempMeasured.detach(funcSlot);
highTempMeasured.detach(methSlot);

Unlike some Signals and Slot libraries, this one does not support multiple parameters which simplifies the implementation significantly. If multiple parameters are necessary just define a struct containing everything that's needed and pass that through instead.

You can’t perform that action at this time.