test test test

Dependencies:   mbed

Committer:
mohamedmoawya
Date:
Mon May 25 19:06:11 2020 +0000
Revision:
0:e4c5e6ec922e
snake game tteest

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mohamedmoawya 0:e4c5e6ec922e 1
mohamedmoawya 0:e4c5e6ec922e 2 /** \addtogroup hal */
mohamedmoawya 0:e4c5e6ec922e 3 /** @{*/
mohamedmoawya 0:e4c5e6ec922e 4 /* mbed Microcontroller Library
mohamedmoawya 0:e4c5e6ec922e 5 * Copyright (c) 2018 ARM Limited
mohamedmoawya 0:e4c5e6ec922e 6 *
mohamedmoawya 0:e4c5e6ec922e 7 * Licensed under the Apache License, Version 2.0 (the "License");
mohamedmoawya 0:e4c5e6ec922e 8 * you may not use this file except in compliance with the License.
mohamedmoawya 0:e4c5e6ec922e 9 * You may obtain a copy of the License at
mohamedmoawya 0:e4c5e6ec922e 10 *
mohamedmoawya 0:e4c5e6ec922e 11 * http://www.apache.org/licenses/LICENSE-2.0
mohamedmoawya 0:e4c5e6ec922e 12 *
mohamedmoawya 0:e4c5e6ec922e 13 * Unless required by applicable law or agreed to in writing, software
mohamedmoawya 0:e4c5e6ec922e 14 * distributed under the License is distributed on an "AS IS" BASIS,
mohamedmoawya 0:e4c5e6ec922e 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mohamedmoawya 0:e4c5e6ec922e 16 * See the License for the specific language governing permissions and
mohamedmoawya 0:e4c5e6ec922e 17 * limitations under the License.
mohamedmoawya 0:e4c5e6ec922e 18 */
mohamedmoawya 0:e4c5e6ec922e 19 #ifndef MBED_LOW_POWER_TICKER_WRAPPER_H
mohamedmoawya 0:e4c5e6ec922e 20 #define MBED_LOW_POWER_TICKER_WRAPPER_H
mohamedmoawya 0:e4c5e6ec922e 21
mohamedmoawya 0:e4c5e6ec922e 22 #include "device.h"
mohamedmoawya 0:e4c5e6ec922e 23
mohamedmoawya 0:e4c5e6ec922e 24 #include "hal/ticker_api.h"
mohamedmoawya 0:e4c5e6ec922e 25 #include "hal/us_ticker_api.h"
mohamedmoawya 0:e4c5e6ec922e 26 #include "drivers/Timeout.h"
mohamedmoawya 0:e4c5e6ec922e 27
mohamedmoawya 0:e4c5e6ec922e 28
mohamedmoawya 0:e4c5e6ec922e 29 class LowPowerTickerWrapper {
mohamedmoawya 0:e4c5e6ec922e 30 public:
mohamedmoawya 0:e4c5e6ec922e 31
mohamedmoawya 0:e4c5e6ec922e 32
mohamedmoawya 0:e4c5e6ec922e 33 /**
mohamedmoawya 0:e4c5e6ec922e 34 * Create a new wrapped low power ticker object
mohamedmoawya 0:e4c5e6ec922e 35 *
mohamedmoawya 0:e4c5e6ec922e 36 * @param data Low power ticker data to wrap
mohamedmoawya 0:e4c5e6ec922e 37 * @param interface new ticker interface functions
mohamedmoawya 0:e4c5e6ec922e 38 * @param min_cycles_between_writes The number of whole low power clock periods
mohamedmoawya 0:e4c5e6ec922e 39 * which must complete before subsequent calls to set_interrupt
mohamedmoawya 0:e4c5e6ec922e 40 * @param min_cycles_until_match The minimum number of whole low power clock periods
mohamedmoawya 0:e4c5e6ec922e 41 * from the current time for which the match timestamp passed to set_interrupt is
mohamedmoawya 0:e4c5e6ec922e 42 * guaranteed to fire.
mohamedmoawya 0:e4c5e6ec922e 43 *
mohamedmoawya 0:e4c5e6ec922e 44 * N = min_cycles_between_writes
mohamedmoawya 0:e4c5e6ec922e 45 *
mohamedmoawya 0:e4c5e6ec922e 46 * 0 1 N - 1 N N + 1 N + 2 N + 3
mohamedmoawya 0:e4c5e6ec922e 47 * |-------|------...------|-------|-------|-------|-------|
mohamedmoawya 0:e4c5e6ec922e 48 * ^ ^
mohamedmoawya 0:e4c5e6ec922e 49 * | |
mohamedmoawya 0:e4c5e6ec922e 50 * set_interrupt Next set_interrupt allowed
mohamedmoawya 0:e4c5e6ec922e 51 *
mohamedmoawya 0:e4c5e6ec922e 52 * N = min_cycles_until_match
mohamedmoawya 0:e4c5e6ec922e 53 *
mohamedmoawya 0:e4c5e6ec922e 54 * 0 1 N - 1 N N + 1 N + 2 N + 3
mohamedmoawya 0:e4c5e6ec922e 55 * |-------|------...------|-------|-------|-------|-------|
mohamedmoawya 0:e4c5e6ec922e 56 * ^ ^
mohamedmoawya 0:e4c5e6ec922e 57 * | |
mohamedmoawya 0:e4c5e6ec922e 58 * set_interrupt Earliest match timestamp allowed
mohamedmoawya 0:e4c5e6ec922e 59 *
mohamedmoawya 0:e4c5e6ec922e 60 *
mohamedmoawya 0:e4c5e6ec922e 61 */
mohamedmoawya 0:e4c5e6ec922e 62
mohamedmoawya 0:e4c5e6ec922e 63 LowPowerTickerWrapper(const ticker_data_t *data, const ticker_interface_t *interface, uint32_t min_cycles_between_writes, uint32_t min_cycles_until_match);
mohamedmoawya 0:e4c5e6ec922e 64
mohamedmoawya 0:e4c5e6ec922e 65 /**
mohamedmoawya 0:e4c5e6ec922e 66 * Interrupt handler called by the underlying driver/hardware
mohamedmoawya 0:e4c5e6ec922e 67 *
mohamedmoawya 0:e4c5e6ec922e 68 * @param handler The callback which would normally be called by the underlying driver/hardware
mohamedmoawya 0:e4c5e6ec922e 69 */
mohamedmoawya 0:e4c5e6ec922e 70 void irq_handler(ticker_irq_handler_type handler);
mohamedmoawya 0:e4c5e6ec922e 71
mohamedmoawya 0:e4c5e6ec922e 72 /**
mohamedmoawya 0:e4c5e6ec922e 73 * Suspend wrapper operation and pass through interrupts.
mohamedmoawya 0:e4c5e6ec922e 74 *
mohamedmoawya 0:e4c5e6ec922e 75 * This stops to wrapper layer from using the microsecond ticker.
mohamedmoawya 0:e4c5e6ec922e 76 * This should be called before using the low power ticker APIs directly.
mohamedmoawya 0:e4c5e6ec922e 77 *
mohamedmoawya 0:e4c5e6ec922e 78 * @warning: Make sure to suspend the LP ticker first (call ticker_suspend()),
mohamedmoawya 0:e4c5e6ec922e 79 * otherwise the behavior is undefined.
mohamedmoawya 0:e4c5e6ec922e 80 */
mohamedmoawya 0:e4c5e6ec922e 81 void suspend();
mohamedmoawya 0:e4c5e6ec922e 82
mohamedmoawya 0:e4c5e6ec922e 83 /**
mohamedmoawya 0:e4c5e6ec922e 84 * Resume wrapper operation and filter interrupts normally
mohamedmoawya 0:e4c5e6ec922e 85 */
mohamedmoawya 0:e4c5e6ec922e 86 void resume();
mohamedmoawya 0:e4c5e6ec922e 87
mohamedmoawya 0:e4c5e6ec922e 88 /**
mohamedmoawya 0:e4c5e6ec922e 89 * Check if a Timeout object is being used
mohamedmoawya 0:e4c5e6ec922e 90 *
mohamedmoawya 0:e4c5e6ec922e 91 * @return true if Timeout is used for scheduling false otherwise
mohamedmoawya 0:e4c5e6ec922e 92 */
mohamedmoawya 0:e4c5e6ec922e 93 bool timeout_pending();
mohamedmoawya 0:e4c5e6ec922e 94
mohamedmoawya 0:e4c5e6ec922e 95 /*
mohamedmoawya 0:e4c5e6ec922e 96 * Implementation of ticker_init
mohamedmoawya 0:e4c5e6ec922e 97 */
mohamedmoawya 0:e4c5e6ec922e 98 void init();
mohamedmoawya 0:e4c5e6ec922e 99
mohamedmoawya 0:e4c5e6ec922e 100 /*
mohamedmoawya 0:e4c5e6ec922e 101 * Implementation of free
mohamedmoawya 0:e4c5e6ec922e 102 */
mohamedmoawya 0:e4c5e6ec922e 103 void free();
mohamedmoawya 0:e4c5e6ec922e 104
mohamedmoawya 0:e4c5e6ec922e 105 /*
mohamedmoawya 0:e4c5e6ec922e 106 * Implementation of read
mohamedmoawya 0:e4c5e6ec922e 107 */
mohamedmoawya 0:e4c5e6ec922e 108 uint32_t read();
mohamedmoawya 0:e4c5e6ec922e 109
mohamedmoawya 0:e4c5e6ec922e 110 /*
mohamedmoawya 0:e4c5e6ec922e 111 * Implementation of set_interrupt
mohamedmoawya 0:e4c5e6ec922e 112 */
mohamedmoawya 0:e4c5e6ec922e 113 void set_interrupt(timestamp_t timestamp);
mohamedmoawya 0:e4c5e6ec922e 114
mohamedmoawya 0:e4c5e6ec922e 115 /*
mohamedmoawya 0:e4c5e6ec922e 116 * Implementation of disable_interrupt
mohamedmoawya 0:e4c5e6ec922e 117 */
mohamedmoawya 0:e4c5e6ec922e 118 void disable_interrupt();
mohamedmoawya 0:e4c5e6ec922e 119
mohamedmoawya 0:e4c5e6ec922e 120 /*
mohamedmoawya 0:e4c5e6ec922e 121 * Implementation of clear_interrupt
mohamedmoawya 0:e4c5e6ec922e 122 */
mohamedmoawya 0:e4c5e6ec922e 123 void clear_interrupt();
mohamedmoawya 0:e4c5e6ec922e 124
mohamedmoawya 0:e4c5e6ec922e 125 /*
mohamedmoawya 0:e4c5e6ec922e 126 * Implementation of fire_interrupt
mohamedmoawya 0:e4c5e6ec922e 127 */
mohamedmoawya 0:e4c5e6ec922e 128 void fire_interrupt();
mohamedmoawya 0:e4c5e6ec922e 129
mohamedmoawya 0:e4c5e6ec922e 130 /*
mohamedmoawya 0:e4c5e6ec922e 131 * Implementation of get_info
mohamedmoawya 0:e4c5e6ec922e 132 */
mohamedmoawya 0:e4c5e6ec922e 133 const ticker_info_t *get_info();
mohamedmoawya 0:e4c5e6ec922e 134
mohamedmoawya 0:e4c5e6ec922e 135 ticker_data_t data;
mohamedmoawya 0:e4c5e6ec922e 136
mohamedmoawya 0:e4c5e6ec922e 137 private:
mohamedmoawya 0:e4c5e6ec922e 138 mbed::Timeout _timeout;
mohamedmoawya 0:e4c5e6ec922e 139 const ticker_interface_t *const _intf;
mohamedmoawya 0:e4c5e6ec922e 140
mohamedmoawya 0:e4c5e6ec922e 141 /*
mohamedmoawya 0:e4c5e6ec922e 142 * The number of low power clock cycles which must pass between subsequent
mohamedmoawya 0:e4c5e6ec922e 143 * calls to intf->set_interrupt
mohamedmoawya 0:e4c5e6ec922e 144 */
mohamedmoawya 0:e4c5e6ec922e 145 const uint32_t _min_count_between_writes;
mohamedmoawya 0:e4c5e6ec922e 146
mohamedmoawya 0:e4c5e6ec922e 147 /*
mohamedmoawya 0:e4c5e6ec922e 148 * The minimum number of low power clock cycles in the future that
mohamedmoawya 0:e4c5e6ec922e 149 * a match value can be set to and still fire
mohamedmoawya 0:e4c5e6ec922e 150 */
mohamedmoawya 0:e4c5e6ec922e 151 const uint32_t _min_count_until_match;
mohamedmoawya 0:e4c5e6ec922e 152
mohamedmoawya 0:e4c5e6ec922e 153 /*
mohamedmoawya 0:e4c5e6ec922e 154 * Flag to indicate if the timer is suspended
mohamedmoawya 0:e4c5e6ec922e 155 */
mohamedmoawya 0:e4c5e6ec922e 156 bool _suspended;
mohamedmoawya 0:e4c5e6ec922e 157
mohamedmoawya 0:e4c5e6ec922e 158 /*
mohamedmoawya 0:e4c5e6ec922e 159 * _cur_match_time is valid and Timeout is scheduled to fire
mohamedmoawya 0:e4c5e6ec922e 160 */
mohamedmoawya 0:e4c5e6ec922e 161 bool _pending_timeout;
mohamedmoawya 0:e4c5e6ec922e 162
mohamedmoawya 0:e4c5e6ec922e 163 /*
mohamedmoawya 0:e4c5e6ec922e 164 * set_interrupt has been called and _cur_match_time is valid
mohamedmoawya 0:e4c5e6ec922e 165 */
mohamedmoawya 0:e4c5e6ec922e 166 bool _pending_match;
mohamedmoawya 0:e4c5e6ec922e 167
mohamedmoawya 0:e4c5e6ec922e 168 /*
mohamedmoawya 0:e4c5e6ec922e 169 * The function LowPowerTickerWrapper::fire_interrupt has been called
mohamedmoawya 0:e4c5e6ec922e 170 * and an interrupt is expected.
mohamedmoawya 0:e4c5e6ec922e 171 */
mohamedmoawya 0:e4c5e6ec922e 172 bool _pending_fire_now;
mohamedmoawya 0:e4c5e6ec922e 173
mohamedmoawya 0:e4c5e6ec922e 174 /*
mohamedmoawya 0:e4c5e6ec922e 175 * It is safe to call intf->set_interrupt
mohamedmoawya 0:e4c5e6ec922e 176 */
mohamedmoawya 0:e4c5e6ec922e 177 bool _set_interrupt_allowed;
mohamedmoawya 0:e4c5e6ec922e 178
mohamedmoawya 0:e4c5e6ec922e 179 /*
mohamedmoawya 0:e4c5e6ec922e 180 * Last value written by LowPowerTickerWrapper::set_interrupt
mohamedmoawya 0:e4c5e6ec922e 181 */
mohamedmoawya 0:e4c5e6ec922e 182 timestamp_t _cur_match_time;
mohamedmoawya 0:e4c5e6ec922e 183
mohamedmoawya 0:e4c5e6ec922e 184 /*
mohamedmoawya 0:e4c5e6ec922e 185 * Time of last call to LowPowerTickerWrapper::set_interrupt
mohamedmoawya 0:e4c5e6ec922e 186 */
mohamedmoawya 0:e4c5e6ec922e 187 uint32_t _last_set_interrupt;
mohamedmoawya 0:e4c5e6ec922e 188
mohamedmoawya 0:e4c5e6ec922e 189 /*
mohamedmoawya 0:e4c5e6ec922e 190 * Time of last call to intf->set_interrupt
mohamedmoawya 0:e4c5e6ec922e 191 */
mohamedmoawya 0:e4c5e6ec922e 192 uint32_t _last_actual_set_interrupt;
mohamedmoawya 0:e4c5e6ec922e 193
mohamedmoawya 0:e4c5e6ec922e 194 /*
mohamedmoawya 0:e4c5e6ec922e 195 * Mask of valid bits from intf->read()
mohamedmoawya 0:e4c5e6ec922e 196 */
mohamedmoawya 0:e4c5e6ec922e 197 uint32_t _mask;
mohamedmoawya 0:e4c5e6ec922e 198
mohamedmoawya 0:e4c5e6ec922e 199 /*
mohamedmoawya 0:e4c5e6ec922e 200 * Microsecond per low power tick (rounded up)
mohamedmoawya 0:e4c5e6ec922e 201 */
mohamedmoawya 0:e4c5e6ec922e 202 uint32_t _us_per_tick;
mohamedmoawya 0:e4c5e6ec922e 203
mohamedmoawya 0:e4c5e6ec922e 204
mohamedmoawya 0:e4c5e6ec922e 205 void _reset();
mohamedmoawya 0:e4c5e6ec922e 206
mohamedmoawya 0:e4c5e6ec922e 207 /**
mohamedmoawya 0:e4c5e6ec922e 208 * Set the low power ticker match time when hardware is ready
mohamedmoawya 0:e4c5e6ec922e 209 *
mohamedmoawya 0:e4c5e6ec922e 210 * This event is scheduled to set the lp timer after the previous write
mohamedmoawya 0:e4c5e6ec922e 211 * has taken effect and it is safe to write a new value without blocking.
mohamedmoawya 0:e4c5e6ec922e 212 * If the time has already passed then this function fires and interrupt
mohamedmoawya 0:e4c5e6ec922e 213 * immediately.
mohamedmoawya 0:e4c5e6ec922e 214 */
mohamedmoawya 0:e4c5e6ec922e 215 void _timeout_handler();
mohamedmoawya 0:e4c5e6ec922e 216
mohamedmoawya 0:e4c5e6ec922e 217 /*
mohamedmoawya 0:e4c5e6ec922e 218 * Check match time has passed
mohamedmoawya 0:e4c5e6ec922e 219 */
mohamedmoawya 0:e4c5e6ec922e 220 bool _match_check(timestamp_t current);
mohamedmoawya 0:e4c5e6ec922e 221
mohamedmoawya 0:e4c5e6ec922e 222 /*
mohamedmoawya 0:e4c5e6ec922e 223 * Convert low power ticks to approximate microseconds
mohamedmoawya 0:e4c5e6ec922e 224 *
mohamedmoawya 0:e4c5e6ec922e 225 * This value is always larger or equal to exact value.
mohamedmoawya 0:e4c5e6ec922e 226 */
mohamedmoawya 0:e4c5e6ec922e 227 uint32_t _lp_ticks_to_us(uint32_t);
mohamedmoawya 0:e4c5e6ec922e 228
mohamedmoawya 0:e4c5e6ec922e 229 /*
mohamedmoawya 0:e4c5e6ec922e 230 * Schedule a match interrupt to fire at the correct time
mohamedmoawya 0:e4c5e6ec922e 231 *
mohamedmoawya 0:e4c5e6ec922e 232 * @param current The current low power ticker time
mohamedmoawya 0:e4c5e6ec922e 233 */
mohamedmoawya 0:e4c5e6ec922e 234 void _schedule_match(timestamp_t current);
mohamedmoawya 0:e4c5e6ec922e 235
mohamedmoawya 0:e4c5e6ec922e 236 };
mohamedmoawya 0:e4c5e6ec922e 237
mohamedmoawya 0:e4c5e6ec922e 238 #endif
mohamedmoawya 0:e4c5e6ec922e 239
mohamedmoawya 0:e4c5e6ec922e 240 /** @}*/
mohamedmoawya 0:e4c5e6ec922e 241
mohamedmoawya 0:e4c5e6ec922e 242