/** ******************************************************************************* @file /common/Msg.h @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 ******************************************************************************/ #ifndef MSG_H #define MSG_H #include /// Stavove konstanty //@{ #define MSG_STATE_PROCESED 0 #define MSG_STATE_UNDEFINED 1 // #define BROADCAST 0 #define ANNONYMOUS 0 #define GENERATE_TRANSCEIVER_ID -2 #define REGISTRATION_ERROR -3 #define TRANSCEIVER_EXISTS -4 #define TRANSCEIVER_NOTEXISTS -5 #define RESERVED_TRANSCEIVER_ID_BORDER 1024 //@} /// Parametry zprav. //@{ typedef int TRANSCEIVERID; typedef int MESSAGE_ID; typedef void* RVAL; typedef void* PARAM; typedef TRANSCEIVERID SENDER; typedef TRANSCEIVERID RECEIVER; //@} /// msg handler typedef RVAL(*HANDLER)(MESSAGE_ID,SENDER,PARAM); /** Transceiver. pro prijem/odesilani zprav = postovni adresa vsechno k cemu lze pristupovat zvenku by melo byt volatelne pres fnc transceiveru parametry se zdavaji pomoci globalnich protokolu(struct-ur) v Interface.h */ struct TMessageTransceiver{ TRANSCEIVERID PrimaryID; int iActived; int iPriority; HANDLER fnc; }; /** Fronta transceiveru. fronta nebo spis registr na zpravy = postovni schranka je to vlastne univerzalni rozhrani pro volani metod mezi nezavislymi moduly. */ struct TTransceiverQueue{ //pro statistiku int iMsgProcessed; // std::vector transceivers; }; /** Obecna odesilaci funkce msgsystemu. @param pq fronta transceiveru @param mid cislo zpravy(Interface.h) @param from odesilatel @param to prijemce @param param parameter, cokoliv 32-bitoveho */ extern RVAL KSendMessage(TTransceiverQueue* pq,MESSAGE_ID mid,SENDER from,RECEIVER to,PARAM param); /** Registrator transceiveru. @attention {NEVOLAT UVNITR ODPOVEDI NA ZPRAVU. Pouzivat jen na zacatku programu.} @param pq fronta, do ktere se ma registrovat @param mt zaznam transceiveru @see TMessageTransceiver @param id id transceiveru identicke s id v mt */ extern TRANSCEIVERID KRegisterTransceiver(TTransceiverQueue* pq,TMessageTransceiver* mt,TRANSCEIVERID id); /** Odregistrator transceiveru. @param pq fronta @param id id transceiveru */ extern TMessageTransceiver* KUnregisterTransceiver(TTransceiverQueue* pq,TRANSCEIVERID id); /** Inicializace fronty. @param mq fronta */ extern void KInitTransceiverQueue(TTransceiverQueue* mq); /** Uvolneni fronty. @param mq fronta */ extern void KFreeTransceiverQueue(TTransceiverQueue* mq); ///zkratky pro KSendMessage //@{ #define KSendMsg KSendMessage #define KSndMsg KSendMessage #define KSendGlobalMsg(msgid, from, to, param) KSendMessage(RQUEUE,msgid, from, to, param) #define KSendGlobalMessage(msgid, from, to, param) KSendMessage(RQUEUE, msgid, from, to, param) #define KSendBcMsg(msg,from,par) KSendMessage(RQUEUE,msg,from,BROADCAST,par) #define KSendBcAnMsg(msg,par) KSendMessage(RQUEUE,msg,ANNONYMOUS,BROADCAST,par) #define KSend KSendBcAnMsg //@} /// GLOBALNI FRONTA extern TTransceiverQueue* RQUEUE; /** Registrace do GLOBALNI FRONTY. @param transceiver transceiver @see TMessageTransceiver @param id id transceiveru */ #define KRegisterGlobalTransceiver(transceiver,id) KRegisterTransceiver(RQUEUE,transceiver,id) /** Odregistrace do GLOBALNI FRONTY. @param id id transceiveru */ #define KUnregisterGlobalTransceiver(id) KUnregisterTransceiver(RQUEUE,id) /** Inicializace GLOBALNI FRONTY. Vola se uplne na zacatku programu. */ #define KInitGlobalTransceiverQueue() KInitTransceiverQueue(RQUEUE) /** Uvolneni GLOBALNI FRONTY. Vola se na konci programu */ #define KFreeGlobalTransceiverQueue() KFreeTransceiverQueue(RQUEUE) #endif /*****************************************************************************/