finish test 1 (succesfully)
This commit is contained in:
		@@ -6,11 +6,13 @@
 | 
			
		||||
// TODO done: Implement code for XFBehavior class
 | 
			
		||||
 | 
			
		||||
XFBehavior::XFBehavior() {
 | 
			
		||||
 | 
			
		||||
    this->deleteOnTerminate_ = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
XFBehavior::~XFBehavior() {
 | 
			
		||||
 | 
			
		||||
    if (this->deleteOnTerminate()) {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFBehavior::startBehavior() {
 | 
			
		||||
@@ -18,20 +20,22 @@ void XFBehavior::startBehavior() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFBehavior::pushEvent(XFEvent *pEvent) {
 | 
			
		||||
    pEvent->setBehavior(this);
 | 
			
		||||
    if(pEvent->getBehavior()==nullptr) {
 | 
			
		||||
        pEvent->setBehavior(this);
 | 
			
		||||
    }
 | 
			
		||||
    this->getDispatcher()->pushEvent(pEvent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool XFBehavior::deleteOnTerminate() const {
 | 
			
		||||
    return deleteOnTerminate_;
 | 
			
		||||
    return this->deleteOnTerminate_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFBehavior::setDeleteOnTerminate(bool deleteBehaviour) {
 | 
			
		||||
    deleteOnTerminate_ = deleteBehaviour;
 | 
			
		||||
    this->deleteOnTerminate_ = deleteBehaviour;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const XFEvent *XFBehavior::getCurrentEvent() const {
 | 
			
		||||
    return pCurrentEvent_;
 | 
			
		||||
    return this->pCurrentEvent_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface::XFDispatcher *XFBehavior::getDispatcher() {
 | 
			
		||||
@@ -40,23 +44,26 @@ interface::XFDispatcher *XFBehavior::getDispatcher() {
 | 
			
		||||
 | 
			
		||||
const XFTimeout *XFBehavior::getCurrentTimeout() {
 | 
			
		||||
    if(pCurrentEvent_->getEventType() == XFEvent::Timeout) {
 | 
			
		||||
        return (XFTimeout*) pCurrentEvent_;
 | 
			
		||||
        return (XFTimeout*) this->pCurrentEvent_;
 | 
			
		||||
    } else {
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFBehavior::setCurrentEvent(const XFEvent *pEvent) {
 | 
			
		||||
    pCurrentEvent_ = pEvent;
 | 
			
		||||
    this->pCurrentEvent_ = pEvent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
XFBehavior::TerminateBehavior XFBehavior::process(const XFEvent *pEvent) {
 | 
			
		||||
    setCurrentEvent(pEvent);
 | 
			
		||||
    this->setCurrentEvent(pEvent);
 | 
			
		||||
    XFEventStatus status = XFEventStatus::Unknown;
 | 
			
		||||
    status = processEvent();
 | 
			
		||||
    if(status == XFEventStatus::Consumed) {
 | 
			
		||||
        return deleteOnTerminate_;
 | 
			
		||||
    } else {
 | 
			
		||||
        return false;
 | 
			
		||||
    status = this->processEvent();
 | 
			
		||||
    if(status == XFEventStatus::Consumed && pEvent->deleteAfterConsume()) {
 | 
			
		||||
        delete pEvent;
 | 
			
		||||
    }
 | 
			
		||||
    XFBehavior::TerminateBehavior terminateBehavior = false;
 | 
			
		||||
    if(status == XFEventStatus::Terminate) {
 | 
			
		||||
        terminateBehavior = true;
 | 
			
		||||
    }
 | 
			
		||||
    return terminateBehavior;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
 | 
			
		||||
XFTimeout::XFTimeout(int id, int interval, interface::XFBehavior *pBehavior):
 | 
			
		||||
    XFEvent(XFEventType::Timeout, id), interval_(interval) {
 | 
			
		||||
    this->setRelTicks(this->getInterval());
 | 
			
		||||
    setBehavior(pBehavior);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,10 +24,9 @@ interface::XFDispatcher * interface::XFDispatcher::getInstance() {
 | 
			
		||||
    return &dispatcher;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO: Implement code for XFDispatcher class
 | 
			
		||||
// TODO done: Implement code for XFDispatcher class
 | 
			
		||||
 | 
			
		||||
XFDispatcher::XFDispatcher() {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
XFDispatcher::~XFDispatcher() {
 | 
			
		||||
@@ -35,14 +34,20 @@ XFDispatcher::~XFDispatcher() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFDispatcher::dispatchEvent(const XFEvent *pEvent) const {
 | 
			
		||||
    if(pEvent->getBehavior()->process(pEvent)) { // TODO look weird
 | 
			
		||||
        //events_.pop();
 | 
			
		||||
        delete pEvent;
 | 
			
		||||
    //Trace::out("[DEBUG] - Dispatch Event");
 | 
			
		||||
    XFBehavior::TerminateBehavior terminateBehavior;
 | 
			
		||||
    terminateBehavior = pEvent->getBehavior()->process(pEvent);
 | 
			
		||||
    if(terminateBehavior) {
 | 
			
		||||
        delete pEvent->getBehavior();
 | 
			
		||||
        if(pEvent->deleteAfterConsume()) {
 | 
			
		||||
            delete pEvent;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFDispatcher::pushEvent(XFEvent *pEvent) {
 | 
			
		||||
    events_.push(pEvent);
 | 
			
		||||
    //Trace::out("[DEBUG] - Push Event");
 | 
			
		||||
    events_.push(pEvent, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFDispatcher::scheduleTimeout(int timeoutId, int interval, interface::XFBehavior *pBehavior) {
 | 
			
		||||
@@ -54,15 +59,16 @@ void XFDispatcher::unscheduleTimeout(int timeoutId, interface::XFBehavior *pBeha
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFDispatcher::executeOnce() {
 | 
			
		||||
    //XFEvent* event;
 | 
			
		||||
    dispatchEvent(events_.front());
 | 
			
		||||
    events_.pop();
 | 
			
		||||
    if(!this->events_.empty()) {
 | 
			
		||||
        dispatchEvent(this->events_.front());
 | 
			
		||||
        this->events_.pop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int XFDispatcher::execute(const void *param) {
 | 
			
		||||
    while(true){
 | 
			
		||||
        executeOnce();
 | 
			
		||||
        this->executeOnce();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,9 @@
 | 
			
		||||
#include "xf/interface/behavior.h"
 | 
			
		||||
#include "xf/interface/mutex.h"
 | 
			
		||||
#include "timeoutmanager.h"
 | 
			
		||||
#if defined(XF_TRACE_EVENT_PUSH_POP) && (XF_TRACE_EVENT_PUSH_POP != 0)
 | 
			
		||||
    #include "trace/trace.h"
 | 
			
		||||
#endif // XF_TRACE_EVENT_PUSH_POP
 | 
			
		||||
 | 
			
		||||
using Mutex = interface::XFMutex;       // Rename XFMutex interface class to Mutex for easier use.
 | 
			
		||||
 | 
			
		||||
@@ -24,6 +27,7 @@ interface::XFTimeoutManager * interface::XFTimeoutManager::getInstance() {
 | 
			
		||||
// TODO done: Implement code for XFTimeoutManager class
 | 
			
		||||
 | 
			
		||||
XFTimeoutManager::XFTimeoutManager() {
 | 
			
		||||
    this->pMutex_ = interface::XFMutex::create();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
XFTimeoutManager::~XFTimeoutManager() {
 | 
			
		||||
@@ -31,41 +35,63 @@ XFTimeoutManager::~XFTimeoutManager() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFTimeoutManager::addTimeout(XFTimeout *pNewTimeout) {
 | 
			
		||||
    pMutex_->lock();
 | 
			
		||||
    timeouts_.push_front(pNewTimeout);
 | 
			
		||||
    pMutex_->unlock();
 | 
			
		||||
    this->pMutex_->lock();
 | 
			
		||||
    this->timeouts_.push_front(pNewTimeout);
 | 
			
		||||
    this->pMutex_->unlock();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFTimeoutManager::returnTimeout(XFTimeout *pTimeout) {
 | 
			
		||||
    pMutex_->lock();
 | 
			
		||||
    this->pMutex_->lock();
 | 
			
		||||
    XFDispatcher::getInstance()->pushEvent(pTimeout);
 | 
			
		||||
    timeouts_.remove(pTimeout);
 | 
			
		||||
    pMutex_->unlock();
 | 
			
		||||
    this->timeouts_.remove(pTimeout);
 | 
			
		||||
    this->pMutex_->unlock();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFTimeoutManager::start(std::function<void (uint32_t)> startTimeoutManagerTimer) {
 | 
			
		||||
    startTimeoutManagerTimer(tickInterval_);
 | 
			
		||||
    startTimeoutManagerTimer(this->tickInterval_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFTimeoutManager::scheduleTimeout(int32_t timeoutId, int32_t interval, interface::XFBehavior *pBehavior) {
 | 
			
		||||
    string str = "[DEBUG] - Schedule Timeout: ";
 | 
			
		||||
    str += to_string(timeoutId);
 | 
			
		||||
    //Trace::out(str);
 | 
			
		||||
    ::XFTimeout* timeout = new XFTimeout(timeoutId, interval, pBehavior);
 | 
			
		||||
    addTimeout(timeout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFTimeoutManager::unscheduleTimeout(int32_t timeoutId, interface::XFBehavior *pBehavior) {
 | 
			
		||||
    for(XFTimeout* timeout : timeouts_) {
 | 
			
		||||
        bool id = ( timeout->getId() == timeoutId );
 | 
			
		||||
        bool behavior = ( timeout->getBehavior() == pBehavior);
 | 
			
		||||
        if( id && behavior ) {
 | 
			
		||||
            timeouts_.remove(timeout);
 | 
			
		||||
    string str = "[DEBUG] - Unschedule Timeout: ";
 | 
			
		||||
    str += to_string(timeoutId);
 | 
			
		||||
    //Trace::out(str);
 | 
			
		||||
    this->pMutex_->lock();
 | 
			
		||||
    TimeoutList::iterator it;
 | 
			
		||||
    for(it = this->timeouts_.begin(); it != this->timeouts_.end(); it++){
 | 
			
		||||
 | 
			
		||||
        if((*it)->getId()==timeoutId && (*it)->getBehavior() == pBehavior) {
 | 
			
		||||
            it = this->timeouts_.erase(it);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    this->pMutex_->unlock();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XFTimeoutManager::tick() {
 | 
			
		||||
    for(XFTimeout* timeout : timeouts_) {
 | 
			
		||||
        timeout->substractFromRelTicks(tickInterval_);
 | 
			
		||||
    //Trace::out("[DEBUG] - Tick");
 | 
			
		||||
    if(!this->timeouts_.empty()) {
 | 
			
		||||
        TimeoutList::iterator it;
 | 
			
		||||
 | 
			
		||||
        this->pMutex_->lock();
 | 
			
		||||
        for(it=this->timeouts_.begin(); it != this->timeouts_.end(); it++) {
 | 
			
		||||
            if((*it)->getRelTicks() > 0) {
 | 
			
		||||
                (*it)->substractFromRelTicks(this->tickInterval_);
 | 
			
		||||
            } else {
 | 
			
		||||
                XFEvent* ev = *(it);
 | 
			
		||||
                XFDispatcher::getInstance()->pushEvent(ev);
 | 
			
		||||
                it = this->timeouts_.erase(it);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this->pMutex_->unlock();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user