qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

timer.h (2510B)


      1 /*
      2 Copyright 2011 Jun Wako <wakojun@gmail.com>
      3 Copyright 2021 Simon Arlott
      4 
      5 This program is free software: you can redistribute it and/or modify
      6 it under the terms of the GNU General Public License as published by
      7 the Free Software Foundation, either version 2 of the License, or
      8 (at your option) any later version.
      9 
     10 This program is distributed in the hope that it will be useful,
     11 but WITHOUT ANY WARRANTY; without even the implied warranty of
     12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13 GNU General Public License for more details.
     14 
     15 You should have received a copy of the GNU General Public License
     16 along with this program.  If not, see <http://www.gnu.org/licenses/>.
     17 */
     18 
     19 #pragma once
     20 
     21 #if __has_include_next("_timer.h")
     22 #    include_next "_timer.h" /* Include the platform's _timer.h */
     23 #endif
     24 
     25 #include <stdint.h>
     26 
     27 #define TIMER_DIFF_8(a, b) (uint8_t)((a) - (b))
     28 #define TIMER_DIFF_16(a, b) (uint16_t)((a) - (b))
     29 #define TIMER_DIFF_32(a, b) (uint32_t)((a) - (b))
     30 #define TIMER_DIFF_RAW(a, b) TIMER_DIFF_8(a, b)
     31 
     32 #ifdef __cplusplus
     33 extern "C" {
     34 #endif
     35 
     36 extern volatile uint32_t timer_count;
     37 
     38 void     timer_init(void);
     39 void     timer_clear(void);
     40 void     timer_save(void);
     41 void     timer_restore(void);
     42 uint16_t timer_read(void);
     43 uint32_t timer_read32(void);
     44 uint16_t timer_elapsed(uint16_t last);
     45 uint32_t timer_elapsed32(uint32_t last);
     46 
     47 // Utility functions to check if a future time has expired & autmatically handle time wrapping if checked / reset frequently (half of max value)
     48 #define timer_expired(current, future) ((uint16_t)(current - future) < UINT16_MAX / 2)
     49 #define timer_expired32(current, future) ((uint32_t)(current - future) < UINT32_MAX / 2)
     50 
     51 // Use an appropriate timer integer size based on architecture (16-bit will overflow sooner)
     52 #if FAST_TIMER_T_SIZE < 32
     53 #    define TIMER_DIFF_FAST(a, b) TIMER_DIFF_16(a, b)
     54 #    define timer_expired_fast(current, future) timer_expired(current, future)
     55 typedef uint16_t fast_timer_t;
     56 fast_timer_t inline timer_read_fast(void) {
     57     return timer_read();
     58 }
     59 fast_timer_t inline timer_elapsed_fast(fast_timer_t last) {
     60     return timer_elapsed(last);
     61 }
     62 #else
     63 #    define TIMER_DIFF_FAST(a, b) TIMER_DIFF_32(a, b)
     64 #    define timer_expired_fast(current, future) timer_expired32(current, future)
     65 typedef uint32_t fast_timer_t;
     66 fast_timer_t inline timer_read_fast(void) {
     67     return timer_read32();
     68 }
     69 fast_timer_t inline timer_elapsed_fast(fast_timer_t last) {
     70     return timer_elapsed32(last);
     71 }
     72 #endif
     73 
     74 #ifdef __cplusplus
     75 }
     76 #endif