BMLite_Nordic/HAL_Driver/src/platform_timebase.c
Andrey Perminov 4be3f43031 More accurate calculation of the time button pressed
Change-Id: Idebf6bbf43fcf8ec06f12f20092451f96f541d7b
2020-04-17 13:12:57 -07:00

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;
}