This is the final version of Mini Gateway for Automation and Security desgined for Renesas GR Peach Design Contest

Dependencies:   GR-PEACH_video GraphicsFramework HTTPServer R_BSP mbed-rpc mbed-rtos Socket lwip-eth lwip-sys lwip FATFileSystem

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
vipinranka
Date:
Wed Jan 11 11:41:30 2017 +0000
Revision:
12:9a20164dcc47
This is the final version MGAS Project for Renesas GR Peach Design Contest

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vipinranka 12:9a20164dcc47 1 /* mbed Microcontroller Library
vipinranka 12:9a20164dcc47 2 * Copyright (c) 2015 ARM Limited
vipinranka 12:9a20164dcc47 3 *
vipinranka 12:9a20164dcc47 4 * Licensed under the Apache License, Version 2.0 (the "License");
vipinranka 12:9a20164dcc47 5 * you may not use this file except in compliance with the License.
vipinranka 12:9a20164dcc47 6 * You may obtain a copy of the License at
vipinranka 12:9a20164dcc47 7 *
vipinranka 12:9a20164dcc47 8 * http://www.apache.org/licenses/LICENSE-2.0
vipinranka 12:9a20164dcc47 9 *
vipinranka 12:9a20164dcc47 10 * Unless required by applicable law or agreed to in writing, software
vipinranka 12:9a20164dcc47 11 * distributed under the License is distributed on an "AS IS" BASIS,
vipinranka 12:9a20164dcc47 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vipinranka 12:9a20164dcc47 13 * See the License for the specific language governing permissions and
vipinranka 12:9a20164dcc47 14 * limitations under the License.
vipinranka 12:9a20164dcc47 15 */
vipinranka 12:9a20164dcc47 16 #include <stddef.h>
vipinranka 12:9a20164dcc47 17 #include "hal/ticker_api.h"
vipinranka 12:9a20164dcc47 18 #include "platform/critical.h"
vipinranka 12:9a20164dcc47 19
vipinranka 12:9a20164dcc47 20 void ticker_set_handler(const ticker_data_t *const data, ticker_event_handler handler) {
vipinranka 12:9a20164dcc47 21 data->interface->init();
vipinranka 12:9a20164dcc47 22
vipinranka 12:9a20164dcc47 23 data->queue->event_handler = handler;
vipinranka 12:9a20164dcc47 24 }
vipinranka 12:9a20164dcc47 25
vipinranka 12:9a20164dcc47 26 void ticker_irq_handler(const ticker_data_t *const data) {
vipinranka 12:9a20164dcc47 27 data->interface->clear_interrupt();
vipinranka 12:9a20164dcc47 28
vipinranka 12:9a20164dcc47 29 /* Go through all the pending TimerEvents */
vipinranka 12:9a20164dcc47 30 while (1) {
vipinranka 12:9a20164dcc47 31 if (data->queue->head == NULL) {
vipinranka 12:9a20164dcc47 32 // There are no more TimerEvents left, so disable matches.
vipinranka 12:9a20164dcc47 33 data->interface->disable_interrupt();
vipinranka 12:9a20164dcc47 34 return;
vipinranka 12:9a20164dcc47 35 }
vipinranka 12:9a20164dcc47 36
vipinranka 12:9a20164dcc47 37 if ((int)(data->queue->head->timestamp - data->interface->read()) <= 0) {
vipinranka 12:9a20164dcc47 38 // This event was in the past:
vipinranka 12:9a20164dcc47 39 // point to the following one and execute its handler
vipinranka 12:9a20164dcc47 40 ticker_event_t *p = data->queue->head;
vipinranka 12:9a20164dcc47 41 data->queue->head = data->queue->head->next;
vipinranka 12:9a20164dcc47 42 if (data->queue->event_handler != NULL) {
vipinranka 12:9a20164dcc47 43 (*data->queue->event_handler)(p->id); // NOTE: the handler can set new events
vipinranka 12:9a20164dcc47 44 }
vipinranka 12:9a20164dcc47 45 /* Note: We continue back to examining the head because calling the
vipinranka 12:9a20164dcc47 46 * event handler may have altered the chain of pending events. */
vipinranka 12:9a20164dcc47 47 } else {
vipinranka 12:9a20164dcc47 48 // This event and the following ones in the list are in the future:
vipinranka 12:9a20164dcc47 49 // set it as next interrupt and return
vipinranka 12:9a20164dcc47 50 data->interface->set_interrupt(data->queue->head->timestamp);
vipinranka 12:9a20164dcc47 51 return;
vipinranka 12:9a20164dcc47 52 }
vipinranka 12:9a20164dcc47 53 }
vipinranka 12:9a20164dcc47 54 }
vipinranka 12:9a20164dcc47 55
vipinranka 12:9a20164dcc47 56 void ticker_insert_event(const ticker_data_t *const data, ticker_event_t *obj, timestamp_t timestamp, uint32_t id) {
vipinranka 12:9a20164dcc47 57 /* disable interrupts for the duration of the function */
vipinranka 12:9a20164dcc47 58 core_util_critical_section_enter();
vipinranka 12:9a20164dcc47 59
vipinranka 12:9a20164dcc47 60 // initialise our data
vipinranka 12:9a20164dcc47 61 obj->timestamp = timestamp;
vipinranka 12:9a20164dcc47 62 obj->id = id;
vipinranka 12:9a20164dcc47 63
vipinranka 12:9a20164dcc47 64 /* Go through the list until we either reach the end, or find
vipinranka 12:9a20164dcc47 65 an element this should come before (which is possibly the
vipinranka 12:9a20164dcc47 66 head). */
vipinranka 12:9a20164dcc47 67 ticker_event_t *prev = NULL, *p = data->queue->head;
vipinranka 12:9a20164dcc47 68 while (p != NULL) {
vipinranka 12:9a20164dcc47 69 /* check if we come before p */
vipinranka 12:9a20164dcc47 70 if ((int)(timestamp - p->timestamp) < 0) {
vipinranka 12:9a20164dcc47 71 break;
vipinranka 12:9a20164dcc47 72 }
vipinranka 12:9a20164dcc47 73 /* go to the next element */
vipinranka 12:9a20164dcc47 74 prev = p;
vipinranka 12:9a20164dcc47 75 p = p->next;
vipinranka 12:9a20164dcc47 76 }
vipinranka 12:9a20164dcc47 77 /* if prev is NULL we're at the head */
vipinranka 12:9a20164dcc47 78 if (prev == NULL) {
vipinranka 12:9a20164dcc47 79 data->queue->head = obj;
vipinranka 12:9a20164dcc47 80 data->interface->set_interrupt(timestamp);
vipinranka 12:9a20164dcc47 81 } else {
vipinranka 12:9a20164dcc47 82 prev->next = obj;
vipinranka 12:9a20164dcc47 83 }
vipinranka 12:9a20164dcc47 84 /* if we're at the end p will be NULL, which is correct */
vipinranka 12:9a20164dcc47 85 obj->next = p;
vipinranka 12:9a20164dcc47 86
vipinranka 12:9a20164dcc47 87 core_util_critical_section_exit();
vipinranka 12:9a20164dcc47 88 }
vipinranka 12:9a20164dcc47 89
vipinranka 12:9a20164dcc47 90 void ticker_remove_event(const ticker_data_t *const data, ticker_event_t *obj) {
vipinranka 12:9a20164dcc47 91 core_util_critical_section_enter();
vipinranka 12:9a20164dcc47 92
vipinranka 12:9a20164dcc47 93 // remove this object from the list
vipinranka 12:9a20164dcc47 94 if (data->queue->head == obj) {
vipinranka 12:9a20164dcc47 95 // first in the list, so just drop me
vipinranka 12:9a20164dcc47 96 data->queue->head = obj->next;
vipinranka 12:9a20164dcc47 97 if (data->queue->head == NULL) {
vipinranka 12:9a20164dcc47 98 data->interface->disable_interrupt();
vipinranka 12:9a20164dcc47 99 } else {
vipinranka 12:9a20164dcc47 100 data->interface->set_interrupt(data->queue->head->timestamp);
vipinranka 12:9a20164dcc47 101 }
vipinranka 12:9a20164dcc47 102 } else {
vipinranka 12:9a20164dcc47 103 // find the object before me, then drop me
vipinranka 12:9a20164dcc47 104 ticker_event_t* p = data->queue->head;
vipinranka 12:9a20164dcc47 105 while (p != NULL) {
vipinranka 12:9a20164dcc47 106 if (p->next == obj) {
vipinranka 12:9a20164dcc47 107 p->next = obj->next;
vipinranka 12:9a20164dcc47 108 break;
vipinranka 12:9a20164dcc47 109 }
vipinranka 12:9a20164dcc47 110 p = p->next;
vipinranka 12:9a20164dcc47 111 }
vipinranka 12:9a20164dcc47 112 }
vipinranka 12:9a20164dcc47 113
vipinranka 12:9a20164dcc47 114 core_util_critical_section_exit();
vipinranka 12:9a20164dcc47 115 }
vipinranka 12:9a20164dcc47 116
vipinranka 12:9a20164dcc47 117 timestamp_t ticker_read(const ticker_data_t *const data)
vipinranka 12:9a20164dcc47 118 {
vipinranka 12:9a20164dcc47 119 return data->interface->read();
vipinranka 12:9a20164dcc47 120 }
vipinranka 12:9a20164dcc47 121
vipinranka 12:9a20164dcc47 122 int ticker_get_next_timestamp(const ticker_data_t *const data, timestamp_t *timestamp)
vipinranka 12:9a20164dcc47 123 {
vipinranka 12:9a20164dcc47 124 int ret = 0;
vipinranka 12:9a20164dcc47 125
vipinranka 12:9a20164dcc47 126 /* if head is NULL, there are no pending events */
vipinranka 12:9a20164dcc47 127 core_util_critical_section_enter();
vipinranka 12:9a20164dcc47 128 if (data->queue->head != NULL) {
vipinranka 12:9a20164dcc47 129 *timestamp = data->queue->head->timestamp;
vipinranka 12:9a20164dcc47 130 ret = 1;
vipinranka 12:9a20164dcc47 131 }
vipinranka 12:9a20164dcc47 132 core_util_critical_section_exit();
vipinranka 12:9a20164dcc47 133
vipinranka 12:9a20164dcc47 134 return ret;
vipinranka 12:9a20164dcc47 135 }