Doug Anson / mbedConnectorInterface

Dependents:   IoT_LED_demo ServoTest uWater_Project hackathon ... more

Committer:
ansond
Date:
Wed Apr 08 19:45:06 2015 +0000
Revision:
33:bb7d8c64880f
Parent:
32:bc40b11c3915
Child:
36:1c6c45584c13
updates

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 32:bc40b11c3915 32 #ifdef CONNECTOR_USING_TASKLETS
ansond 31:bacc63106754 33 this->m_event = NULL;
ansond 32:bc40b11c3915 34 #endif
ansond 31:bacc63106754 35 }
ansond 31:bacc63106754 36
ansond 31:bacc63106754 37 // destructor
ansond 31:bacc63106754 38 TaskletResourceObserver::~TaskletResourceObserver() {
ansond 31:bacc63106754 39 this->stopObservation();
ansond 30:113c2a1d8db2 40 }
ansond 30:113c2a1d8db2 41
ansond 31:bacc63106754 42 #ifdef CONNECTOR_USING_TASKLETS
ansond 31:bacc63106754 43 // set the current event
ansond 31:bacc63106754 44 void TaskletResourceObserver::setEvent(arm_event_s *event) {
ansond 31:bacc63106754 45 this->m_event = event;
ansond 30:113c2a1d8db2 46 }
ansond 31:bacc63106754 47 #endif
ansond 30:113c2a1d8db2 48
ansond 33:bb7d8c64880f 49 #ifdef CONNECTOR_USING_TASKLETS
ansond 31:bacc63106754 50 // notifier
ansond 31:bacc63106754 51 void TaskletResourceObserver::_observation_notifier(arm_event_s *event) {
ansond 31:bacc63106754 52 if (event != NULL) {
ansond 31:bacc63106754 53 TaskletResourceObserver *me = (TaskletResourceObserver *)m_instance;
ansond 31:bacc63106754 54 if (event->event_id == me->getTimerID()) {
ansond 31:bacc63106754 55 timer_sys_event_cancel(event->event_id);
ansond 31:bacc63106754 56 me->setEvent(event);
ansond 31:bacc63106754 57 std::printf("Calling notify()...\r\n");
ansond 31:bacc63106754 58 if (me->isObserving() == true && me->getResource() != NULL) {
ansond 31:bacc63106754 59 std::printf("Calling observe()...\r\n");
ansond 31:bacc63106754 60 me->getResource()->observe();
ansond 31:bacc63106754 61 }
ansond 31:bacc63106754 62 me->startTimer();
ansond 31:bacc63106754 63 }
ansond 31:bacc63106754 64 else {
ansond 31:bacc63106754 65 std::printf("TaskletResourceObserver::observation_notifier(): ignoring event_id=%d timer_id=%d\r\n",event->event_id,me->getTimerID());
ansond 31:bacc63106754 66 }
ansond 31:bacc63106754 67 }
ansond 33:bb7d8c64880f 68 }
ansond 31:bacc63106754 69 #endif
ansond 30:113c2a1d8db2 70
ansond 30:113c2a1d8db2 71 // begin observing...
ansond 30:113c2a1d8db2 72 void TaskletResourceObserver::beginObservation() {
ansond 31:bacc63106754 73 #ifdef CONNECTOR_USING_TASKLETS
ansond 31:bacc63106754 74 // create the tasklet and begin the observationing
ansond 31:bacc63106754 75 if (this->m_tasklet_id < 0) {
ansond 31:bacc63106754 76 this->m_tasklet_id = arm_ns_tasklet_create(&TaskletResourceObserver::_observation_notifier);
ansond 31:bacc63106754 77 }
ansond 31:bacc63106754 78
ansond 31:bacc63106754 79 // back pointer
ansond 31:bacc63106754 80 if (m_instance == NULL) {
ansond 31:bacc63106754 81 m_instance = (void *)this;
ansond 31:bacc63106754 82 }
ansond 31:bacc63106754 83
ansond 31:bacc63106754 84 // start a timer if we have created a tasklet...
ansond 31:bacc63106754 85 if (this->m_tasklet_id >= 0) {
ansond 31:bacc63106754 86 // start the timer...
ansond 31:bacc63106754 87 std::printf("TaskletResourceObserver::beginObservation(): starting tasklet timer timer_id=%d sleep=%d...\r\n",this->m_timer_id,this->getSleepTime());
ansond 31:bacc63106754 88 this->startTimer();
ansond 31:bacc63106754 89 }
ansond 31:bacc63106754 90 #endif
ansond 31:bacc63106754 91 }
ansond 31:bacc63106754 92
ansond 31:bacc63106754 93 // begin observing...
ansond 31:bacc63106754 94 void TaskletResourceObserver::stopObservation() {
ansond 31:bacc63106754 95 #ifdef CONNECTOR_USING_TASKLETS
ansond 31:bacc63106754 96 if (this->m_event != NULL) {
ansond 31:bacc63106754 97 timer_sys_event_cancel(this->m_event->event_id);
ansond 31:bacc63106754 98 this->m_timer_active = false;
ansond 31:bacc63106754 99 }
ansond 31:bacc63106754 100 #endif
ansond 31:bacc63106754 101 }
ansond 31:bacc63106754 102
ansond 31:bacc63106754 103 // reset the timer
ansond 31:bacc63106754 104 void TaskletResourceObserver::startTimer() {
ansond 31:bacc63106754 105 #ifdef CONNECTOR_USING_TASKLETS
ansond 31:bacc63106754 106 if (this->m_timer_active == false) {
ansond 31:bacc63106754 107 timer_sys_event(this->m_timer_id,(uint32_t)this->getSleepTime());
ansond 31:bacc63106754 108 this->m_timer_active = true;
ansond 31:bacc63106754 109 }
ansond 31:bacc63106754 110 #endif
ansond 31:bacc63106754 111 }
ansond 31:bacc63106754 112
ansond 31:bacc63106754 113 // get the timer ID
ansond 31:bacc63106754 114 uint8_t TaskletResourceObserver::getTimerID() {
ansond 31:bacc63106754 115 return this->m_timer_id;
ansond 31:bacc63106754 116 }