Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ns_fnet_events.c Source File

ns_fnet_events.c

00001 /*
00002  * Copyright (c) 2017, Arm Limited and affiliates.
00003  * SPDX-License-Identifier: Apache-2.0
00004  *
00005  * Licensed under the Apache License, Version 2.0 (the "License");
00006  * you may not use this file except in compliance with the License.
00007  * You may obtain a copy of the License at
00008  *
00009  *     http://www.apache.org/licenses/LICENSE-2.0
00010  *
00011  * Unless required by applicable law or agreed to in writing, software
00012  * distributed under the License is distributed on an "AS IS" BASIS,
00013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  * See the License for the specific language governing permissions and
00015  * limitations under the License.
00016  */
00017 
00018 /*
00019  * Nanostack tasklet to handle FNET services.
00020  * Module will start tasklet that will drive FNET poll service
00021  *
00022  * */
00023 
00024 #include "fnet.h"
00025 
00026 #include "ns_types.h"
00027 #include "ns_list.h"
00028 #include "eventOS_event.h"
00029 #include "eventOS_scheduler.h"
00030 #include "eventOS_event_timer.h"
00031 #include "net_interface.h"
00032 
00033 #define NS_FNET_TIMER               0x01
00034 #define NS_FNET_TIMER_INTERVAL_MS   100
00035 
00036 typedef struct ns_fnet_events {
00037     arm_event_storage_t *ns_fnet_timer_storage;
00038     uint32_t current_time_in_ms;
00039     int8_t ns_fnet_tasklet_id;
00040     int8_t receiver_id;
00041 } ns_fnet_events_t;
00042 
00043 static ns_fnet_events_t ns_fnet_events = {
00044         .ns_fnet_tasklet_id = -1,
00045         .ns_fnet_timer_storage = NULL,
00046         .receiver_id = -1,
00047         .current_time_in_ms = 0,
00048 };
00049 
00050 ns_fnet_events_t *ns_fnet_events_ptr = &ns_fnet_events;
00051 
00052 static void ns_fnet_events_interval_timer_start(int8_t receiver)
00053 {
00054     struct arm_event_s event = {
00055         .receiver = receiver,
00056         .sender = receiver,
00057         .event_type = ARM_LIB_SYSTEM_TIMER_EVENT,
00058         .event_id = NS_FNET_TIMER,
00059         .priority = ARM_LIB_LOW_PRIORITY_EVENT,
00060     };
00061 
00062     ns_fnet_events_ptr->ns_fnet_timer_storage = eventOS_event_timer_request_every(&event, eventOS_event_timer_ms_to_ticks(NS_FNET_TIMER_INTERVAL_MS));
00063 }
00064 
00065 static void ns_fnet_event_handler(arm_event_s *event)
00066 {
00067     if (event->event_type == ARM_LIB_TASKLET_INIT_EVENT) {
00068         FNET_DEBUG("NS FNET tasklet initialised");
00069         ns_fnet_events_ptr->receiver_id = event->receiver;
00070         ns_fnet_events_interval_timer_start(ns_fnet_events_ptr->receiver_id);
00071     }
00072     else if (event->event_type == ARM_LIB_SYSTEM_TIMER_EVENT) {
00073         if (event->event_id == NS_FNET_TIMER) {
00074             ns_fnet_events_ptr->current_time_in_ms += NS_FNET_TIMER_INTERVAL_MS;
00075             fnet_poll_service();
00076         }
00077     }
00078 }
00079 
00080 void ns_fnet_events_start(void)
00081 {
00082     if (ns_fnet_events_ptr->ns_fnet_tasklet_id < 0) {
00083         ns_fnet_events_ptr->ns_fnet_tasklet_id = eventOS_event_handler_create(&ns_fnet_event_handler, ARM_LIB_TASKLET_INIT_EVENT);
00084     } else {
00085         if (ns_fnet_events_ptr->ns_fnet_timer_storage == NULL) {
00086             ns_fnet_events_interval_timer_start(ns_fnet_events_ptr->receiver_id);
00087         }
00088     }
00089 }
00090 
00091 void ns_fnet_events_stop(void)
00092 {
00093     if (ns_fnet_events_ptr->ns_fnet_tasklet_id < 0) {
00094         return;
00095     }
00096 
00097     if (ns_fnet_events_ptr->ns_fnet_timer_storage) {
00098         eventOS_cancel(ns_fnet_events_ptr->ns_fnet_timer_storage);
00099         ns_fnet_events_ptr->ns_fnet_timer_storage = NULL;
00100     }
00101 }
00102 
00103 void ns_fnet_events_fast_poll(void)
00104 {
00105     if (ns_fnet_events_ptr->ns_fnet_tasklet_id < 0) {
00106         return;
00107     }
00108 
00109     if (ns_fnet_events_ptr->ns_fnet_timer_storage) {
00110         // scheduler is up and running, poll immediately
00111         fnet_poll_service();
00112     }
00113 }
00114 
00115 
00116 uint32_t ns_fnet_time_in_ms_get(void)
00117 {
00118     return ns_fnet_events_ptr->current_time_in_ms;
00119 }