Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ticker_api.h Source File

ticker_api.h

00001 
00002 /** \addtogroup hal */
00003 /** @{*/
00004 /* mbed Microcontroller Library
00005  * Copyright (c) 2015 ARM Limited
00006  * SPDX-License-Identifier: Apache-2.0
00007  *
00008  * Licensed under the Apache License, Version 2.0 (the "License");
00009  * you may not use this file except in compliance with the License.
00010  * You may obtain a copy of the License at
00011  *
00012  *     http://www.apache.org/licenses/LICENSE-2.0
00013  *
00014  * Unless required by applicable law or agreed to in writing, software
00015  * distributed under the License is distributed on an "AS IS" BASIS,
00016  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00017  * See the License for the specific language governing permissions and
00018  * limitations under the License.
00019  */
00020 #ifndef MBED_TICKER_API_H
00021 #define MBED_TICKER_API_H
00022 
00023 #include <stdint.h>
00024 #include <stdbool.h>
00025 #include "device.h"
00026 
00027 /**
00028  * Legacy format representing a timestamp in us.
00029  * Given it is modeled as a 32 bit integer, this type can represent timestamp
00030  * up to 4294 seconds (71 minutes).
00031  * Prefer using us_timestamp_t which store timestamp as 64 bits integer.
00032  */
00033 typedef uint32_t timestamp_t;
00034 
00035 /**
00036  * A us timestamp stored in a 64 bit integer.
00037  * Can store timestamp up to 584810 years.
00038  */
00039 typedef uint64_t us_timestamp_t;
00040 
00041 /** Ticker's event structure
00042  */
00043 typedef struct ticker_event_s {
00044     us_timestamp_t         timestamp; /**< Event's timestamp */
00045     uint32_t               id;        /**< TimerEvent object */
00046     struct ticker_event_s *next;      /**< Next event in the queue */
00047 } ticker_event_t;
00048 
00049 typedef void (*ticker_event_handler)(uint32_t id);
00050 
00051 /** Information about the ticker implementation
00052  */
00053 typedef struct {
00054     uint32_t frequency;                           /**< Frequency in Hz this ticker runs at */
00055     uint32_t bits;                                /**< Number of bits this ticker supports */
00056 } ticker_info_t;
00057 
00058 
00059 /** Ticker's interface structure - required API for a ticker
00060  */
00061 typedef struct {
00062     void (*init)(void);                           /**< Init function */
00063     uint32_t (*read)(void);                       /**< Read function */
00064     void (*disable_interrupt)(void);              /**< Disable interrupt function */
00065     void (*clear_interrupt)(void);                /**< Clear interrupt function */
00066     void (*set_interrupt)(timestamp_t timestamp); /**< Set interrupt function */
00067     void (*fire_interrupt)(void);                 /**< Fire interrupt right-away */
00068     void (*free)(void);                           /**< Disable function */
00069     const ticker_info_t *(*get_info)(void);       /**< Return info about this ticker's implementation */
00070     bool runs_in_deep_sleep;                      /**< Whether ticker operates in deep sleep */
00071 } ticker_interface_t;
00072 
00073 /** Ticker's event queue structure
00074  */
00075 typedef struct {
00076     ticker_event_handler event_handler; /**< Event handler */
00077     ticker_event_t *head;               /**< A pointer to head */
00078     uint32_t frequency;                 /**< Frequency of the timer in Hz */
00079     uint32_t bitmask;                   /**< Mask to be applied to time values read */
00080     uint32_t max_delta;                 /**< Largest delta in ticks that can be used when scheduling */
00081     uint64_t max_delta_us;              /**< Largest delta in us that can be used when scheduling */
00082     uint32_t tick_last_read;            /**< Last tick read */
00083     uint64_t tick_remainder;            /**< Ticks that have not been added to base_time */
00084     us_timestamp_t present_time;        /**< Store the timestamp used for present time */
00085     bool initialized;                   /**< Indicate if the instance is initialized */
00086     bool dispatching;                   /**< The function ticker_irq_handler is dispatching */
00087     bool suspended;                     /**< Indicate if the instance is suspended */
00088     uint8_t frequency_shifts;           /**< If frequency is a value of 2^n, this is n, otherwise 0 */
00089 } ticker_event_queue_t;
00090 
00091 /** Ticker's data structure
00092  */
00093 typedef struct {
00094     const ticker_interface_t *interface; /**< Ticker's interface */
00095     ticker_event_queue_t *queue;         /**< Ticker's event queue */
00096 } ticker_data_t;
00097 
00098 #ifdef __cplusplus
00099 extern "C" {
00100 #endif
00101 
00102 /**
00103  * \defgroup hal_ticker Ticker HAL functions
00104  * @{
00105  */
00106 
00107 /** Initialize a ticker and set the event handler
00108  *
00109  * @param ticker The ticker object.
00110  * @param handler A handler to be set
00111  */
00112 void ticker_set_handler(const ticker_data_t *const ticker, ticker_event_handler handler);
00113 
00114 /** IRQ handler that goes through the events to trigger overdue events.
00115  *
00116  * @param ticker The ticker object.
00117  */
00118 void ticker_irq_handler(const ticker_data_t *const ticker);
00119 
00120 /** Remove an event from the queue
00121  *
00122  * @param ticker The ticker object.
00123  * @param obj  The event object to be removed from the queue
00124  */
00125 void ticker_remove_event(const ticker_data_t *const ticker, ticker_event_t *obj);
00126 
00127 /** Insert an event to the queue
00128  *
00129  * The event will be executed in timestamp - ticker_read().
00130  *
00131  * @warning This function does not consider timestamp in the past. If an event
00132  * is inserted with a timestamp less than the current timestamp then the event
00133  * will be executed in timestamp - ticker_read() us.
00134  * The internal counter wrap very quickly it is hard to decide weither an
00135  * event is in the past or in 1 hour.
00136  *
00137  * @note prefer the use of ticker_insert_event_us which allows registration of
00138  * absolute timestamp.
00139  *
00140  * @param ticker    The ticker object.
00141  * @param obj       The event object to be inserted to the queue
00142  * @param timestamp The event's timestamp
00143  * @param id        The event object
00144  */
00145 void ticker_insert_event(const ticker_data_t *const ticker, ticker_event_t *obj, timestamp_t timestamp, uint32_t id);
00146 
00147 /** Insert an event to the queue
00148  *
00149  * The event will be executed in timestamp - ticker_read_us() us.
00150  *
00151  * @note If an event is inserted with a timestamp less than the current
00152  * timestamp then the event will be scheduled immediately resulting in
00153  * an instant call to event handler.
00154  *
00155  * @param ticker    The ticker object.
00156  * @param obj       The event object to be inserted to the queue
00157  * @param timestamp The event's timestamp
00158  * @param id        The event object
00159  */
00160 void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *obj, us_timestamp_t timestamp, uint32_t id);
00161 
00162 /** Read the current (relative) ticker's timestamp
00163  *
00164  * @warning Return a relative timestamp because the counter wrap every 4294
00165  * seconds.
00166  *
00167  * @param ticker The ticker object.
00168  * @return The current timestamp
00169  */
00170 timestamp_t ticker_read(const ticker_data_t *const ticker);
00171 
00172 /** Read the current (absolute) ticker's timestamp
00173  *
00174  * @warning Return an absolute timestamp counting from the initialization of the
00175  * ticker.
00176  *
00177  * @param ticker The ticker object.
00178  * @return The current timestamp
00179  */
00180 us_timestamp_t ticker_read_us(const ticker_data_t *const ticker);
00181 
00182 /** Read the next event's timestamp
00183  *
00184  * @param ticker        The ticker object.
00185  * @param timestamp     The timestamp object.
00186  * @return 1 if timestamp is pending event, 0 if there's no event pending
00187  */
00188 int ticker_get_next_timestamp(const ticker_data_t *const ticker, timestamp_t *timestamp);
00189 
00190 /** Suspend this ticker
00191  *
00192  * When suspended reads will always return the same time and no
00193  * events will be dispatched. When suspended the common layer
00194  * will only ever call the interface function clear_interrupt()
00195  * and that is only if ticker_irq_handler is called.
00196  *
00197  *
00198  * @param ticker        The ticker object.
00199  */
00200 void ticker_suspend(const ticker_data_t *const ticker);
00201 
00202 /** Resume this ticker
00203  *
00204  * When resumed the ticker will ignore any time that has passed
00205  * and continue counting up where it left off.
00206  *
00207  * @param ticker        The ticker object.
00208  */
00209 void ticker_resume(const ticker_data_t *const ticker);
00210 
00211 /* Private functions
00212  *
00213  * @cond PRIVATE
00214  *
00215  */
00216 
00217 int _ticker_match_interval_passed(timestamp_t prev_tick, timestamp_t cur_tick, timestamp_t match_tick);
00218 
00219 /*
00220  * @endcond PRIVATE
00221  *
00222  */
00223 
00224 /**@}*/
00225 
00226 #ifdef __cplusplus
00227 }
00228 #endif
00229 
00230 #endif
00231 
00232 /** @}*/