Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
/*
* Copyright (c) 2018 ARM Limited. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
* 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
*
* http://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.
*/
#include "ns_types.h"
#include "fhss_api.h"
#include "fhss_config.h"
#include "mbed.h"
#include "mbed_trace.h"
#include "platform/arm_hal_interrupt.h"
#include <Timer.h>

#define TRACE_GROUP "fhdr"
#ifndef NUMBER_OF_SIMULTANEOUS_TIMEOUTS
#define NUMBER_OF_SIMULTANEOUS_TIMEOUTS 2
#endif //NUMBER_OF_SIMULTANEOUS_TIMEOUTS

static Timer timer;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Follow-up job, as I failed to review earlier:

I would expect that timer and fhss_timeout would need to use SingletonPtr to avoid increasing static RAM size for people not using Nanostack. Otherwise they'll always be pulled in just to run the constructors.

Although SingletonPtr can't really handle an array :( Might end up having to just new fhss_timeout.

(Is there a CI job monitoring size increases for blinky or something?)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think so. I think the other @kegilbert, @studavekar, or @SenRamakri should know tho.

static bool timer_initialized = false;
static const fhss_api_t *fhss_active_handle = NULL;
#if !MBED_CONF_NANOSTACK_HAL_CRITICAL_SECTION_USABLE_FROM_INTERRUPT
static EventQueue *equeue;
#endif

struct fhss_timeout_s
{
void (*fhss_timer_callback)(const fhss_api_t *fhss_api, uint16_t);
uint32_t start_time;
uint32_t stop_time;
bool active;
Timeout timeout;
};

fhss_timeout_s fhss_timeout[NUMBER_OF_SIMULTANEOUS_TIMEOUTS];

static uint32_t read_current_time(void)
{
return timer.read_us();
}

static fhss_timeout_s *find_timeout(void (*callback)(const fhss_api_t *api, uint16_t))
{
for (int i = 0; i < NUMBER_OF_SIMULTANEOUS_TIMEOUTS; i++) {
if (fhss_timeout[i].fhss_timer_callback == callback) {
return &fhss_timeout[i];
}
}
return NULL;
}

static fhss_timeout_s *allocate_timeout(void)
{
for (int i = 0; i < NUMBER_OF_SIMULTANEOUS_TIMEOUTS; i++) {
if (fhss_timeout[i].fhss_timer_callback == NULL) {
memset(&fhss_timeout[i], sizeof(fhss_timeout_s), 0);
return &fhss_timeout[i];
}
}
return NULL;
}

static void fhss_timeout_handler(void)
{
for (int i = 0; i < NUMBER_OF_SIMULTANEOUS_TIMEOUTS; i++) {
if (fhss_timeout[i].active && ((fhss_timeout[i].stop_time - fhss_timeout[i].start_time) <= (read_current_time() - fhss_timeout[i].start_time))) {
fhss_timeout[i].active = false;
fhss_timeout[i].fhss_timer_callback(fhss_active_handle, read_current_time() - fhss_timeout[i].stop_time);
}
}
}

static void timer_callback(void)
{
#if MBED_CONF_NANOSTACK_HAL_CRITICAL_SECTION_USABLE_FROM_INTERRUPT
fhss_timeout_handler();
#else
equeue->call(fhss_timeout_handler);
#endif
}

static int platform_fhss_timer_start(uint32_t slots, void (*callback)(const fhss_api_t *api, uint16_t), const fhss_api_t *callback_param)
{
int ret_val = -1;
platform_enter_critical();
if (timer_initialized == false) {
#if !MBED_CONF_NANOSTACK_HAL_CRITICAL_SECTION_USABLE_FROM_INTERRUPT
equeue = mbed_highprio_event_queue();
MBED_ASSERT(equeue != NULL);
#endif
timer.start();
timer_initialized = true;
}
fhss_timeout_s *fhss_tim = find_timeout(callback);
if (!fhss_tim) {
fhss_tim = allocate_timeout();
}
if (!fhss_tim) {
platform_exit_critical();
tr_error("Failed to allocate timeout");
return ret_val;
}
fhss_tim->fhss_timer_callback = callback;
fhss_tim->start_time = read_current_time();
fhss_tim->stop_time = fhss_tim->start_time + slots;
fhss_tim->active = true;
fhss_tim->timeout.attach_us(timer_callback, slots);
fhss_active_handle = callback_param;
ret_val = 0;
platform_exit_critical();
return ret_val;
}

static int platform_fhss_timer_stop(void (*callback)(const fhss_api_t *api, uint16_t), const fhss_api_t *api)
{
(void)api;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this only to prevent compiler warnings?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes.

platform_enter_critical();
fhss_timeout_s *fhss_tim = find_timeout(callback);
if (!fhss_tim) {
platform_exit_critical();
return -1;
}
fhss_tim->timeout.detach();
fhss_tim->active = false;
platform_exit_critical();
return 0;
}

static uint32_t platform_fhss_get_remaining_slots(void (*callback)(const fhss_api_t *api, uint16_t), const fhss_api_t *api)
{
(void)api;
platform_enter_critical();
fhss_timeout_s *fhss_tim = find_timeout(callback);
if (!fhss_tim) {
platform_exit_critical();
return 0;
}
uint32_t remaining_slots = fhss_tim->stop_time - read_current_time();
platform_exit_critical();
return remaining_slots;
}

static uint32_t platform_fhss_timestamp_read(const fhss_api_t *api)
{
(void)api;
return read_current_time();
}

fhss_timer_t fhss_functions = {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be const to save RAM. But not seeing where this is declared, so where else you'd need to change.

.fhss_timer_start = platform_fhss_timer_start,
.fhss_timer_stop = platform_fhss_timer_stop,
.fhss_get_remaining_slots = platform_fhss_get_remaining_slots,
.fhss_get_timestamp = platform_fhss_timestamp_read,
.fhss_resolution_divider = 1
};
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ define symbol __ICFEDIT_region_NVIC_end__ = 0x100000E7;
define symbol __ICFEDIT_region_RAM_start__ = 0x100000E8;
define symbol __ICFEDIT_region_RAM_end__ = 0x1000FFDF;
/*-Sizes-*/
/*Heap 1/4 of ram and stack 1/8*/
define symbol __ICFEDIT_size_cstack__ = 0x2000;
/*Heap 1/4 of ram and stack 1/64*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__ = 0x4000;
/**** End of ICF editor section. ###ICF###*/

Expand Down