/* ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. This file is part of ChibiOS/RT. ChibiOS/RT is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. ChibiOS/RT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** * @addtogroup CPlusPlusLibrary * @{ */ #include #ifndef _CH_HPP_ #define _CH_HPP_ namespace chibios_rt { /** * Class encapsulating the base system functionalities. */ class System { public: /** * ChibiOS/RT initialization. */ static void Init(void); /** * Disables interrupts. * @note On some ports it is faster to invoke chSysLock() directly because * inlining. */ static void Lock(void); /** * Enables interrupts. * @note On some ports it is faster to invoke chSysUnlock() directly * because inlining. */ static void Unlock(void); #ifdef CH_USE_SYSTEMTIME /** * Returns the system time as system ticks. */ static systime_t GetTime(void); #endif /* CH_USE_SYSTEMTIME */ }; #ifdef CH_USE_VIRTUAL_TIMERS /** * Timer class. */ class Timer { public: ::VirtualTimer timer; /** * Starts the timer. * @note It must be called with the interrupts disabled. * @note The associated function is invoked by an interrupt handler. */ void Set(systime_t time, vtfunc_t vtfunc, void *par); /** * Resets the timer. * @note It must be called with the interrupts disabled. * @note The timer MUST be active when this function is invoked. */ void Reset(); /** * Returns true if the timer is armed. */ bool IsArmed(void); }; #endif /* CH_USE_VIRTUAL_TIMER */ /** * Base class for a ChibiOS/RT thread, the thread body is the virtual * function \p Main(). */ class BaseThread { public: ::Thread *thread_ref; /** * Thread constructor. */ BaseThread(tprio_t prio, tmode_t mode, void *workspace, size_t wsize); /** * Thread exit. */ static void Exit(msg_t msg); #ifdef CH_USE_WAITEXIT /** * Synchronization on Thread exit. */ msg_t Wait(void); #endif /* CH_USE_WAITEXIT */ #ifdef CH_USE_RESUME /** * Resumes thread. */ void Resume(void); #endif /* CH_USE_RESUME */ /** * Change thread priority. */ static void SetPriority(tprio_t newprio); #ifdef CH_USE_TERMINATE /** * Requests thread termination. */ void Terminate(void); #endif /* CH_USE_TERMINATE */ #ifdef CH_USE_SLEEP /** * Suspends the thread execution for the specified number of system ticks. */ static void Sleep(systime_t n); #ifdef CH_USE_SYSTEMTIME /** * Suspends the thread execution until the specified time arrives. */ static void SleepUntil(systime_t time); #endif /* CH_USE_SYSTEMTIME */ #endif /* CH_USE_SLEEP */ #ifdef CH_USE_MESSAGES /** * Sends a message to the thread and returns the answer. */ static msg_t SendMessage(::Thread *tp, msg_t msg); /** * Sends a message to the thread and returns the answer. */ msg_t SendMessage(msg_t msg); /** * Waits for a message and returns it. */ static msg_t WaitMessage(void); /** * Returns an enqueued message or \p NULL. */ static msg_t GetMessage(void); /** * Releases the next message in queue with a reply. */ static void ReleaseMessage(msg_t msg); /** * Returns true if there is at least one message in queue. */ static bool IsPendingMessage(void); #endif /* CH_USE_MESSAGES */ /** * Thread body function. */ virtual msg_t Main(void); }; /** * Enhanced threads template class. This class introduces thread names * and static working area allocation. */ template class EnhancedThread : public BaseThread { protected: WorkingArea(wa, N); // Thread working area. public: const char *name; /** * Full constructor. It allows to set a priority level for the new thread * and specify the special option flags. */ EnhancedThread(const char *tname, tprio_t prio, tmode_t mode) : BaseThread(prio, mode, wa, sizeof wa) { name = tname; } /** * Simplified constructor, it allows to create a thread by simply * specifying a name. In is assumed \p NORMALPRIO as initial priority * and no special option flags. */ EnhancedThread(const char *tname) : BaseThread(NORMALPRIO, 0, wa, sizeof wa) { name = tname; } }; #ifdef CH_USE_SEMAPHORES /** * Class encapsulating a \p Semaphore. */ class Semaphore { public: ::Semaphore sem; /** * Semaphore constructor. */ Semaphore(cnt_t n); /** * Resets a semaphore to a given positive value. */ void Reset(cnt_t n); /** * Wait operation on the semaphore. */ msg_t Wait(void); #ifdef CH_USE_SEMAPHORES_TIMEOUT /** * Wait operation on the semaphore with timeout. */ msg_t WaitTimeout(systime_t time); #endif /* CH_USE_SEMAPHORES_TIMEOUT */ /** * Signal operation on the semaphore. */ void Signal(void); #ifdef CH_USE_SEMSW /** * Atomic signal and wait operations. */ msg_t SignalWait(Semaphore *ssem, Semaphore *wsem); #endif /* CH_USE_SEMSW */ }; #endif /* CH_USE_SEMAPHORES */ #ifdef CH_USE_MUTEXES /** * Class encapsulating a \p Mutex. */ class Mutex { public: ::Mutex mutex; /** * Mutex constructor. */ Mutex(void); /** * Tries a lock operation on the mutex. */ bool TryLock(void); /** * Lock operation on the mutex. */ void Lock(void); /** * Unlock operation on the most recently locked mutex. */ static void Unlock(void); /** * Unlocks all the mutexes owned by the invoking thread. */ static void UnlockAll(void); }; #endif /* CH_USE_MUTEXES */ #ifdef CH_USE_EVENTS /** * Class encapsulating an \p EventSource. */ class Event { public: EventSource event; /** * Event constructor. */ Event(void); /** * Registers a listener on the event source. */ void Register(EventListener *elp, eventid_t eid); /** * Unregisters a listener from the event source. */ void Unregister(EventListener *elp); /** * Sends an event. */ void Send(void); /** * Clears specified events from the pending events mask. */ static void Clear(eventmask_t mask); /** * Waits and dispatchs events. */ static eventid_t Wait(eventmask_t ewmask, const evhandler_t handlers[]); #ifdef CH_USE_EVENTS_TIMEOUT /** * Waits and dispatchs events with timeout specification. */ static eventid_t WaitTimeout(eventmask_t ewmask, const evhandler_t handlers[], systime_t time); #endif /* CH_USE_EVENTS_TIMEOUT */ }; #endif /* CH_USE_EVENTS */ } #endif /* _CH_HPP_ */ /** @} */