Pfp Cybersecurity (Aka Power Fingerprinting, Inc.) / Mbed OS pfp-emon-nxp

Dependencies:   FXAS21002 FXOS8700Q

Committer:
vithyat
Date:
Wed Aug 28 19:24:56 2019 +0000
Revision:
0:977e87915078
init

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vithyat 0:977e87915078 1 /*
vithyat 0:977e87915078 2 * Copyright (c) 2014-2015 ARM Limited. All rights reserved.
vithyat 0:977e87915078 3 * SPDX-License-Identifier: Apache-2.0
vithyat 0:977e87915078 4 * Licensed under the Apache License, Version 2.0 (the License); you may
vithyat 0:977e87915078 5 * not use this file except in compliance with the License.
vithyat 0:977e87915078 6 * You may obtain a copy of the License at
vithyat 0:977e87915078 7 *
vithyat 0:977e87915078 8 * http://www.apache.org/licenses/LICENSE-2.0
vithyat 0:977e87915078 9 *
vithyat 0:977e87915078 10 * Unless required by applicable law or agreed to in writing, software
vithyat 0:977e87915078 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
vithyat 0:977e87915078 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vithyat 0:977e87915078 13 * See the License for the specific language governing permissions and
vithyat 0:977e87915078 14 * limitations under the License.
vithyat 0:977e87915078 15 */
vithyat 0:977e87915078 16 #include "eventOS_event.h"
vithyat 0:977e87915078 17 #include "eventOS_event_timer.h"
vithyat 0:977e87915078 18 #include "nsdynmemLIB.h"
vithyat 0:977e87915078 19 #include "ns_list.h"
vithyat 0:977e87915078 20 #include "timer_sys.h"
vithyat 0:977e87915078 21
vithyat 0:977e87915078 22 #define STARTUP_EVENT 0
vithyat 0:977e87915078 23 #define TIMER_EVENT 1
vithyat 0:977e87915078 24
vithyat 0:977e87915078 25 // Timeout structure, already typedefed to timeout_t
vithyat 0:977e87915078 26 struct timeout_entry_t {
vithyat 0:977e87915078 27 void (*callback)(void *);
vithyat 0:977e87915078 28 void *arg;
vithyat 0:977e87915078 29 arm_event_storage_t *event;
vithyat 0:977e87915078 30 };
vithyat 0:977e87915078 31
vithyat 0:977e87915078 32 static int8_t timeout_tasklet_id = -1;
vithyat 0:977e87915078 33
vithyat 0:977e87915078 34 static void timeout_tasklet(arm_event_s *event)
vithyat 0:977e87915078 35 {
vithyat 0:977e87915078 36 if (TIMER_EVENT != event->event_type) {
vithyat 0:977e87915078 37 return;
vithyat 0:977e87915078 38 }
vithyat 0:977e87915078 39
vithyat 0:977e87915078 40 timeout_t *t = event->data_ptr;
vithyat 0:977e87915078 41 arm_event_storage_t *storage = t->event;
vithyat 0:977e87915078 42 sys_timer_struct_s *timer = NS_CONTAINER_OF(storage, sys_timer_struct_s, event);
vithyat 0:977e87915078 43
vithyat 0:977e87915078 44 t->callback(t->arg);
vithyat 0:977e87915078 45
vithyat 0:977e87915078 46
vithyat 0:977e87915078 47 // Check if this was periodic timer
vithyat 0:977e87915078 48 if (timer->period == 0) {
vithyat 0:977e87915078 49 ns_dyn_mem_free(event->data_ptr);
vithyat 0:977e87915078 50 }
vithyat 0:977e87915078 51 }
vithyat 0:977e87915078 52
vithyat 0:977e87915078 53 static timeout_t *eventOS_timeout_at_(void (*callback)(void *), void *arg, uint32_t at, uint32_t period)
vithyat 0:977e87915078 54 {
vithyat 0:977e87915078 55 arm_event_storage_t *storage;
vithyat 0:977e87915078 56
vithyat 0:977e87915078 57 timeout_t *timeout = ns_dyn_mem_alloc(sizeof(timeout_t));
vithyat 0:977e87915078 58 if (!timeout) {
vithyat 0:977e87915078 59 return NULL;
vithyat 0:977e87915078 60 }
vithyat 0:977e87915078 61 timeout->callback = callback;
vithyat 0:977e87915078 62 timeout->arg = arg;
vithyat 0:977e87915078 63
vithyat 0:977e87915078 64 // Start timeout taskled if it is not running
vithyat 0:977e87915078 65 if (-1 == timeout_tasklet_id) {
vithyat 0:977e87915078 66 timeout_tasklet_id = eventOS_event_handler_create(timeout_tasklet, STARTUP_EVENT);
vithyat 0:977e87915078 67 if (timeout_tasklet_id < 0) {
vithyat 0:977e87915078 68 timeout_tasklet_id = -1;
vithyat 0:977e87915078 69 goto FAIL;
vithyat 0:977e87915078 70 }
vithyat 0:977e87915078 71 }
vithyat 0:977e87915078 72
vithyat 0:977e87915078 73 arm_event_t event = {
vithyat 0:977e87915078 74 .receiver = timeout_tasklet_id,
vithyat 0:977e87915078 75 .sender = timeout_tasklet_id,
vithyat 0:977e87915078 76 .event_type = TIMER_EVENT,
vithyat 0:977e87915078 77 .event_id = TIMER_EVENT,
vithyat 0:977e87915078 78 .data_ptr = timeout
vithyat 0:977e87915078 79 };
vithyat 0:977e87915078 80
vithyat 0:977e87915078 81 if (period)
vithyat 0:977e87915078 82 storage = eventOS_event_timer_request_every(&event, period);
vithyat 0:977e87915078 83 else
vithyat 0:977e87915078 84 storage = eventOS_event_timer_request_at(&event, at);
vithyat 0:977e87915078 85
vithyat 0:977e87915078 86 timeout->event = storage;
vithyat 0:977e87915078 87 if (storage)
vithyat 0:977e87915078 88 return timeout;
vithyat 0:977e87915078 89 FAIL:
vithyat 0:977e87915078 90 ns_dyn_mem_free(timeout);
vithyat 0:977e87915078 91 return NULL;
vithyat 0:977e87915078 92 }
vithyat 0:977e87915078 93
vithyat 0:977e87915078 94 timeout_t *eventOS_timeout_ms(void (*callback)(void *), uint32_t ms, void *arg)
vithyat 0:977e87915078 95 {
vithyat 0:977e87915078 96 return eventOS_timeout_at_(callback, arg, eventOS_event_timer_ms_to_ticks(ms)+eventOS_event_timer_ticks(), 0);
vithyat 0:977e87915078 97 }
vithyat 0:977e87915078 98
vithyat 0:977e87915078 99 timeout_t *eventOS_timeout_every_ms(void (*callback)(void *), uint32_t every, void *arg)
vithyat 0:977e87915078 100 {
vithyat 0:977e87915078 101 return eventOS_timeout_at_(callback, arg, 0, eventOS_event_timer_ms_to_ticks(every));
vithyat 0:977e87915078 102 }
vithyat 0:977e87915078 103
vithyat 0:977e87915078 104 void eventOS_timeout_cancel(timeout_t *t)
vithyat 0:977e87915078 105 {
vithyat 0:977e87915078 106 if (!t)
vithyat 0:977e87915078 107 return;
vithyat 0:977e87915078 108
vithyat 0:977e87915078 109 eventOS_cancel(t->event);
vithyat 0:977e87915078 110
vithyat 0:977e87915078 111 // Defer the freeing until returning from the callback
vithyat 0:977e87915078 112 if (t->event->state != ARM_LIB_EVENT_RUNNING) {
vithyat 0:977e87915078 113 ns_dyn_mem_free(t);
vithyat 0:977e87915078 114 }
vithyat 0:977e87915078 115 }