Giter VIP home page Giter VIP logo

callback's Introduction

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.

callback's People

Contributors

gitmodu avatar per1234 avatar tomstewart89 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

callback's Issues

Licencing

I'd like to make use of this library in some Arduino software that will be shipped as part of an ESP8266 based product, but you've not included a LICENCE.md file. Do you plan to add a licence?

Wrong maximum number of slots which can be attached!

in method Signal::attach

if (_nextSlot < (Slots - 1)) {
        // Connect it up and away we go
        _connections[_nextSlot++] = slot.clone();
}

I think it must be

if (_nextSlot < Slots) {
        // Connect it up and away we go
        _connections[_nextSlot++] = slot.clone();
}

It maximizes the number of slots that Slots set

Not updated on Arduino Library Manager

Arduino Library Manager downloads versión 1.0 which uses Connect and Emit instead of Attach and Fire.

Should I use version 1.0 from the Library Manager or the GitHub's 1.1 version?

template specialization with no parameters in callback

It would be great to have a specialization of the Signal template when ParameterType is void. Work-arounds such as using a dummy integer would force legacy slots to change their interfaces. I'm okay with limiting the slot parameter count to one. But I would also like to propose supporting a slot with no parameters.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.