Doug Anson / mbedConnectorInterface

Dependents:   IoT_LED_demo ServoTest uWater_Project hackathon ... more

Committer:
ansond
Date:
Wed Apr 08 15:49:56 2015 +0000
Revision:
31:bacc63106754
Parent:
30:113c2a1d8db2
Child:
32:bc40b11c3915
updates for tasklet observing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ansond 30:113c2a1d8db2 1 /**
ansond 30:113c2a1d8db2 2 * @file TaskletResourceObserver.cpp
ansond 30:113c2a1d8db2 3 * @brief mbed CoAP DynamicResource Tasklet-based observer (implementation)
ansond 30:113c2a1d8db2 4 * @author Doug Anson/Chris Paola
ansond 30:113c2a1d8db2 5 * @version 1.0
ansond 30:113c2a1d8db2 6 * @see
ansond 30:113c2a1d8db2 7 *
ansond 30:113c2a1d8db2 8 * Copyright (c) 2014
ansond 30:113c2a1d8db2 9 *
ansond 30:113c2a1d8db2 10 * Licensed under the Apache License, Version 2.0 (the "License");
ansond 30:113c2a1d8db2 11 * you may not use this file except in compliance with the License.
ansond 30:113c2a1d8db2 12 * You may obtain a copy of the License at
ansond 30:113c2a1d8db2 13 *
ansond 30:113c2a1d8db2 14 * http://www.apache.org/licenses/LICENSE-2.0
ansond 30:113c2a1d8db2 15 *
ansond 30:113c2a1d8db2 16 * Unless required by applicable law or agreed to in writing, software
ansond 30:113c2a1d8db2 17 * distributed under the License is distributed on an "AS IS" BASIS,
ansond 30:113c2a1d8db2 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ansond 30:113c2a1d8db2 19 * See the License for the specific language governing permissions and
ansond 30:113c2a1d8db2 20 * limitations under the License.
ansond 30:113c2a1d8db2 21 */
ansond 30:113c2a1d8db2 22
ansond 30:113c2a1d8db2 23 #include "TaskletResourceObserver.h"
ansond 31:bacc63106754 24
ansond 31:bacc63106754 25 void *m_instance = NULL;
ansond 30:113c2a1d8db2 26
ansond 30:113c2a1d8db2 27 // constructor
ansond 31:bacc63106754 28 TaskletResourceObserver::TaskletResourceObserver(DynamicResource *resource,uint8_t timer_id,int sleep_time) :
ansond 31:bacc63106754 29 ResourceObserver(resource,sleep_time),
ansond 31:bacc63106754 30 m_tasklet_id(-1),
ansond 31:bacc63106754 31 m_timer_id(timer_id) {
ansond 31:bacc63106754 32 this->m_event = NULL;
ansond 31:bacc63106754 33 }
ansond 31:bacc63106754 34
ansond 31:bacc63106754 35 // destructor
ansond 31:bacc63106754 36 TaskletResourceObserver::~TaskletResourceObserver() {
ansond 31:bacc63106754 37 this->stopObservation();
ansond 30:113c2a1d8db2 38 }
ansond 30:113c2a1d8db2 39
ansond 31:bacc63106754 40 #ifdef CONNECTOR_USING_TASKLETS
ansond 31:bacc63106754 41 // set the current event
ansond 31:bacc63106754 42 void TaskletResourceObserver::setEvent(arm_event_s *event) {
ansond 31:bacc63106754 43 this->m_event = event;
ansond 30:113c2a1d8db2 44 }
ansond 31:bacc63106754 45 #endif
ansond 30:113c2a1d8db2 46
ansond 31:bacc63106754 47 // notifier
ansond 31:bacc63106754 48 void TaskletResourceObserver::_observation_notifier(arm_event_s *event) {
ansond 31:bacc63106754 49 #ifdef CONNECTOR_USING_TASKLETS
ansond 31:bacc63106754 50 if (event != NULL) {
ansond 31:bacc63106754 51 TaskletResourceObserver *me = (TaskletResourceObserver *)m_instance;
ansond 31:bacc63106754 52 if (event->event_id == me->getTimerID()) {
ansond 31:bacc63106754 53 timer_sys_event_cancel(event->event_id);
ansond 31:bacc63106754 54 me->setEvent(event);
ansond 31:bacc63106754 55 std::printf("Calling notify()...\r\n");
ansond 31:bacc63106754 56 if (me->isObserving() == true && me->getResource() != NULL) {
ansond 31:bacc63106754 57 std::printf("Calling observe()...\r\n");
ansond 31:bacc63106754 58 me->getResource()->observe();
ansond 31:bacc63106754 59 }
ansond 31:bacc63106754 60 me->startTimer();
ansond 31:bacc63106754 61 }
ansond 31:bacc63106754 62 else {
ansond 31:bacc63106754 63 std::printf("TaskletResourceObserver::observation_notifier(): ignoring event_id=%d timer_id=%d\r\n",event->event_id,me->getTimerID());
ansond 31:bacc63106754 64 }
ansond 31:bacc63106754 65 }
ansond 31:bacc63106754 66 #endif
ansond 30:113c2a1d8db2 67 }
ansond 30:113c2a1d8db2 68
ansond 30:113c2a1d8db2 69 // begin observing...
ansond 30:113c2a1d8db2 70 void TaskletResourceObserver::beginObservation() {
ansond 31:bacc63106754 71 #ifdef CONNECTOR_USING_TASKLETS
ansond 31:bacc63106754 72 // create the tasklet and begin the observationing
ansond 31:bacc63106754 73 if (this->m_tasklet_id < 0) {
ansond 31:bacc63106754 74 this->m_tasklet_id = arm_ns_tasklet_create(&TaskletResourceObserver::_observation_notifier);
ansond 31:bacc63106754 75 }
ansond 31:bacc63106754 76
ansond 31:bacc63106754 77 // back pointer
ansond 31:bacc63106754 78 if (m_instance == NULL) {
ansond 31:bacc63106754 79 m_instance = (void *)this;
ansond 31:bacc63106754 80 }
ansond 31:bacc63106754 81
ansond 31:bacc63106754 82 // start a timer if we have created a tasklet...
ansond 31:bacc63106754 83 if (this->m_tasklet_id >= 0) {
ansond 31:bacc63106754 84 // start the timer...
ansond 31:bacc63106754 85 std::printf("TaskletResourceObserver::beginObservation(): starting tasklet timer timer_id=%d sleep=%d...\r\n",this->m_timer_id,this->getSleepTime());
ansond 31:bacc63106754 86 this->startTimer();
ansond 31:bacc63106754 87 }
ansond 31:bacc63106754 88 #endif
ansond 31:bacc63106754 89 }
ansond 31:bacc63106754 90
ansond 31:bacc63106754 91 // begin observing...
ansond 31:bacc63106754 92 void TaskletResourceObserver::stopObservation() {
ansond 31:bacc63106754 93 #ifdef CONNECTOR_USING_TASKLETS
ansond 31:bacc63106754 94 if (this->m_event != NULL) {
ansond 31:bacc63106754 95 timer_sys_event_cancel(this->m_event->event_id);
ansond 31:bacc63106754 96 this->m_timer_active = false;
ansond 31:bacc63106754 97 }
ansond 31:bacc63106754 98 #endif
ansond 31:bacc63106754 99 }
ansond 31:bacc63106754 100
ansond 31:bacc63106754 101 // reset the timer
ansond 31:bacc63106754 102 void TaskletResourceObserver::startTimer() {
ansond 31:bacc63106754 103 #ifdef CONNECTOR_USING_TASKLETS
ansond 31:bacc63106754 104 if (this->m_timer_active == false) {
ansond 31:bacc63106754 105 timer_sys_event(this->m_timer_id,(uint32_t)this->getSleepTime());
ansond 31:bacc63106754 106 this->m_timer_active = true;
ansond 31:bacc63106754 107 }
ansond 31:bacc63106754 108 #endif
ansond 31:bacc63106754 109 }
ansond 31:bacc63106754 110
ansond 31:bacc63106754 111 // get the timer ID
ansond 31:bacc63106754 112 uint8_t TaskletResourceObserver::getTimerID() {
ansond 31:bacc63106754 113 return this->m_timer_id;
ansond 31:bacc63106754 114 }