/* * Copyright (c) 2025, Your Name. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the Institute nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * This file is an extension to the protothreads library. * * Author: Your Name */ #ifndef __PT_EXT_H__ #define __PT_EXT_H__ #include "pt.h" #include "limits.h" #define PT_WAIT_STAT_SUCC (0 ) #define PT_WAIT_STAT_TIMEOUT (-2) /** * \addtogroup pt * @{ */ /** * Increment the system tick counter. * * This macro increments the global tick counter. It should be called * from a system tick interrupt or similar context. */ void pt_ticks_inc(void); /** * Get the current system tick counter. * * \return The current tick count. */ unsigned int pt_ticks_get(void); /** * Delay for a specified number of milliseconds. * * This macro blocks the protothread for the specified number of * milliseconds. The delay is implemented using the global tick counter. * * \param pt A pointer to the protothread control structure. * \param ms The number of milliseconds to delay. */ /** * Check if timeout has occurred, handling tick counter overflow. * * \param start The start tick count * \param end The end tick count * \param timeout The timeout value in ticks * \return 1 if timeout occurred, 0 otherwise */ int pt_is_timeout(unsigned int start, unsigned int end, unsigned int timeout); #define PT_DELAY_MS(pt, ms) \ do { \ static unsigned int _pt_delay_start=0; \ _pt_delay_start = pt_ticks_get(); \ PT_WAIT_UNTIL((pt), pt_is_timeout(_pt_delay_start, pt_ticks_get(), ms)); \ } while (0) #define PT_WAIT(pt, c, timeout, result) \ do { \ static unsigned int _pt_wait_start = 0;\ _pt_wait_start = pt_ticks_get(); \ *result = -1; \ PT_WAIT_UNTIL((pt), (c) || pt_is_timeout(_pt_wait_start, pt_ticks_get(), timeout)); \ if (c) { *result = 0; };\ if (pt_is_timeout(_pt_wait_start, pt_ticks_get(), timeout)) { *result = -2;};\ }while (0) /** @} */ /** @} */ #endif /* __PT_EXT_H__ */