124 lines
3.0 KiB
C
Executable File
124 lines
3.0 KiB
C
Executable File
/*
|
|
* Copyright (c) 2020 Fingerprint Cards AB
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
/**
|
|
* @file platform_timebase.c
|
|
* @brief timebase interface functions
|
|
*/
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "nrf_drv_systick.h"
|
|
#include "nrf.h"
|
|
#include "nrf_drv_timer.h"
|
|
#include "nrfx_config.h"
|
|
#include "boards.h"
|
|
|
|
const nrf_drv_timer_t TIMER_LED = NRF_DRV_TIMER_INSTANCE(0);
|
|
|
|
static volatile uint32_t systick;
|
|
volatile uint32_t button_pressed_time = 0;
|
|
|
|
static uint32_t btn_press_start;
|
|
static uint32_t btn_pressed = 0;
|
|
|
|
#define BMLITE_BUTTON 3
|
|
|
|
static void check_buttons();
|
|
|
|
/**
|
|
* @brief Handler for timer events.
|
|
*/
|
|
static void timer_event_handler(nrf_timer_event_t event_type, void* p_context)
|
|
{
|
|
|
|
switch (event_type)
|
|
{
|
|
case NRF_TIMER_EVENT_COMPARE0:
|
|
systick++;
|
|
check_buttons();
|
|
break;
|
|
|
|
default:
|
|
//Do nothing.
|
|
break;
|
|
}
|
|
}
|
|
|
|
void platform_timebase_init(void)
|
|
{
|
|
uint32_t time_ms = 1; //Time (in miliseconds) between consecutive compare events.
|
|
uint32_t time_ticks;
|
|
uint32_t err_code = NRF_SUCCESS;
|
|
|
|
nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG;
|
|
err_code = nrf_drv_timer_init(&TIMER_LED, &timer_cfg, timer_event_handler);
|
|
APP_ERROR_CHECK(err_code);
|
|
|
|
time_ticks = nrf_drv_timer_ms_to_ticks(&TIMER_LED, time_ms);
|
|
|
|
nrf_drv_timer_extended_compare(
|
|
&TIMER_LED, NRF_TIMER_CC_CHANNEL0, time_ticks, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true);
|
|
|
|
nrf_drv_timer_enable(&TIMER_LED);
|
|
}
|
|
|
|
void platform_timebase_busy_wait(uint32_t delay)
|
|
{
|
|
uint32_t start;
|
|
uint32_t delay_internal = 0;
|
|
|
|
/* Ensure minimum delay or skip if delay is zero*/
|
|
if (delay) {
|
|
delay_internal = delay + 1;
|
|
start = systick;
|
|
while ((systick - start) < delay_internal) {
|
|
}
|
|
}
|
|
}
|
|
|
|
uint32_t platform_timebase_get_tick(void)
|
|
{
|
|
return systick;
|
|
}
|
|
|
|
static void check_buttons()
|
|
{
|
|
if (bsp_board_button_state_get(BMLITE_BUTTON)) {
|
|
if (btn_pressed == 0) {
|
|
btn_press_start = systick;
|
|
btn_pressed = 1;
|
|
}
|
|
} else { // Btn released
|
|
if (btn_pressed) {
|
|
if (systick > btn_press_start) {
|
|
button_pressed_time = systick - btn_press_start;
|
|
} else {
|
|
button_pressed_time = systick + ~btn_press_start + 1;
|
|
}
|
|
btn_pressed = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
uint32_t platform_get_button_press_time()
|
|
{
|
|
uint32_t time = button_pressed_time;
|
|
button_pressed_time = 0;
|
|
return time;
|
|
}
|