/**************************************************************************** * * Copyright (c) 2017, Michael Becker (michael.f.becker@gmail.com) * * This file is part of the FreeRTOS Add-ons project. * * Source Code: * https://github.com/michaelbecker/freertos-addons * * Project Page: * http://michaelbecker.github.io/freertos-addons/ * * On-line Documentation: * http://michaelbecker.github.io/freertos-addons/docs/html/index.html * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so,subject to the * following conditions: * * + The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * + Credit is appreciated, but not required, if you find this project * useful enough to include in your application, product, device, etc. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ***************************************************************************/ #ifndef TICK_HOOK_HPP_ #define TICK_HOOK_HPP_ #include "FreeRTOS.h" #include "task.h" #include #if ( configUSE_TICK_HOOK == 1 ) /** * FreeRTOS expects this function to exist and requires it to be * named as such with the following signature. */ extern "C" void vApplicationTickHook(void); namespace cpp_freertos { /** * Wrapper class for Tick hooks, functions you want to run within * the tick ISR. * * This is an abstract base class. * To use this, you need to subclass it. All of your tick functions * should be derived from this class. Then implement the virtual Run * function. * * You can register multiple hooks with this class. The order of * execution should not be assumed. All tick hooks will execute * every tick. */ class TickHook { ///////////////////////////////////////////////////////////////////////// // // Public API // Available from anywhere. // ///////////////////////////////////////////////////////////////////////// public: /** * Constructor. */ TickHook(); /** * Destructor */ virtual ~TickHook(); /** * After this is called your Run routine will execute in the * Tick ISR. This registration cannot be done in the base class * constructor. Once your object is fully constructed, you "may" * call this in your derived class's constructor. * @note Immedately after you call this function, your TickHook * Run() method will run, perhaps before you even return from this * call. You "must" be ready to run before you call Register(). */ void Register(); /** * Disable the tick hook from running, without removing it * from the tick hook list. */ void Disable(); /** * Enable this Idle Hook to run. This call is not necessary * if you haven't called Disable. */ void Enable(); ///////////////////////////////////////////////////////////////////////// // // Protected API // ///////////////////////////////////////////////////////////////////////// protected: /** * Implementation of your actual Tick Hook code. * You must override this function. */ virtual void Run() = 0; ///////////////////////////////////////////////////////////////////////// // // Private API // The internals of this wrapper class. // ///////////////////////////////////////////////////////////////////////// private: /** * List of Tick Hook callbacks that are executed in the * Tick ISR. */ static std::listCallbacks; /** * Should the tick hook run? */ bool Enabled; /** * Allow the global vApplicationTickHook() function access * to the internals of this class. This simplifies the overall * design. */ friend void ::vApplicationTickHook(); }; } #endif #endif