/** ******************************************************************************* @file /common/Msg.cpp @brief Message subsystem Message API problemy: muze mit 1 transceiver vic IDcek? kdy se pouziva priorita transceiveru? pouziti: na zacatku programu se musi inicializovat globalni fronta pripadne je mozny mit vc front, ale snad nehrozi @author Vajicek @version 0.1 ******************************************************************************/ #include "common/Msg.h" #include "common/mm.h" using namespace std; //tricky TTransceiverQueue QUEUE; TTransceiverQueue* RQUEUE=&QUEUE; //TODO:efektivni implementace, napr hashmapa TMessageTransceiver* KGetTransceiver(TTransceiverQueue* pq,TRANSCEIVERID id){ for(vector::iterator it= pq->transceivers.begin(); it!=pq->transceivers.end(); it++) { if((*it)->PrimaryID==id) return *it; } return NULL; } //----------------------------------------------------------------------------- RVAL KSendMessage(TTransceiverQueue* pq,MESSAGE_ID mid,SENDER from,RECEIVER to,PARAM param){ TMessageTransceiver* mt; if(to == BROADCAST) { RVAL ret=NULL; pq->iMsgProcessed++; for(vector::iterator it= pq->transceivers.begin(); it!=pq->transceivers.end(); it++) { mt = (*it); if(mt->iActived) { ret=mt->fnc(mid,from,param); if (ret!=NULL) return ret; } } } else { mt = KGetTransceiver(pq,(TRANSCEIVERID)to); if(mt){ pq -> iMsgProcessed++; if(mt -> iActived) return mt->fnc(mid,from,param); } } return NULL; } TRANSCEIVERID KRegisterTransceiver(TTransceiverQueue* pq,TMessageTransceiver* mt,TRANSCEIVERID id){ if(id==GENERATE_TRANSCEIVER_ID){ id=RESERVED_TRANSCEIVER_ID_BORDER; // for(vector::iterator it= pq->transceivers.begin(); it!=pq->transceivers.end(); it++) { if((*it)->PrimaryID>=id) id=(*it)->PrimaryID+1; } mt->PrimaryID=id; mt->iActived=1; } else{ if(KGetTransceiver(pq,id)) return TRANSCEIVER_EXISTS; mt->PrimaryID = id; } pq->transceivers.push_back(mt); // return id; } TMessageTransceiver* KUnregisterTransceiver(TTransceiverQueue* pq,TRANSCEIVERID id){ TMessageTransceiver* mt=NULL; // for(vector::iterator it= pq->transceivers.begin(); it!=pq->transceivers.end(); it++) { mt = (*it); if(mt->PrimaryID==id) { pq->transceivers.erase(it); return mt; } } return (TMessageTransceiver*)TRANSCEIVER_NOTEXISTS; } void KInitTransceiverQueue(TTransceiverQueue* mq){ mq->iMsgProcessed=0; mq->transceivers.clear(); } void KFreeTransceiverQueue(TTransceiverQueue* mq){ mq->transceivers.clear(); } /*****************************************************************************/