# HG changeset patch # User Merten Sach # Date 1331659332 -3600 # Node ID 7ba5a3a6102d9f199ca77de3ccf9528a616f4559 # Parent 5c0fb7c519d74074a96e4edffb1765c48190497e System with multiple point 2 point trigger working diff -r 5c0fb7c519d7 -r 7ba5a3a6102d LossyCom.c --- a/LossyCom.c Tue Mar 13 15:21:36 2012 +0100 +++ b/LossyCom.c Tue Mar 13 18:22:12 2012 +0100 @@ -3,8 +3,9 @@ * For a detailed description see header file. */ +#include + #include "LossyCom.h" - #include "VMS_Implementations/VMS_impl/vmalloc.h" /* @@ -20,7 +21,7 @@ if(exchange == NULL) return NULL; - exchange->triggerCounter = 0; + exchange->BroadcastTriggerCounter = 0; exchange->numEndpoints = numEndpoints; exchange->outboxArray = VMS_WL__malloc(sizeof(lossyCom__msg_t)*numEndpoints); if(exchange->outboxArray == NULL){ @@ -28,6 +29,16 @@ return NULL; } + exchange->p2pTriggerCounter = VMS_WL__malloc(sizeof(uint16_t)*numEndpoints); + if(exchange->p2pTriggerCounter == NULL){ + VMS_WL__free(exchange->outboxArray); + VMS_WL__free(exchange); + return NULL; + } + + //reset all point 2 point trigger counter + memset((void*)exchange->p2pTriggerCounter, 0, sizeof(uint16_t)*numEndpoints); + return exchange; } @@ -43,100 +54,157 @@ lossyCom__msgHandler msgHandler, void* msgHandlerData) { - localEndpoint->localTriggerCopy = 0; + localEndpoint->lastReceivedBroadcastTrigger = 0; localEndpoint->endpointID = endpointID; localEndpoint->centralExchange = centralExchange; localEndpoint->msgHandler = msgHandler; localEndpoint->msgHandlerData = msgHandlerData; } +inline lossyCom__msg_t prepareMsg(uint16_t triggerValue, + lossyCom__endpointID_t receiverEndpointID, + lossyCom__msgBody_t msg) +{ + lossyCom__msg_t msgDraft; + + msgDraft = (0 | msg); + msgDraft |= ((lossyCom__msg_t)receiverEndpointID << ENDPOINT_ID_SHIFT); + msgDraft |= ((lossyCom__msg_t)triggerValue << TRIGGER_SHIFT); + + return msgDraft; +} + /* * This broadcasts a message to all connected receivers */ -void inline lossyCom__broadcastMsg(lossyCom__endpoint_t* localEndpoint, - lossyCom__msgBody_t msg) +void lossyCom__broadcastMsg(lossyCom__endpoint_t* localEndpoint, + lossyCom__msgBody_t msgBody) { - lossyCom__sendMsg(localEndpoint, - BROADCAST_ID, - msg); + lossyCom__exchange_t* centralExchange = localEndpoint->centralExchange; + uint16_t increasedTrigger; + lossyCom__msg_t msg; + + increasedTrigger = centralExchange->BroadcastTriggerCounter +1; + + //build message + msg = prepareMsg(increasedTrigger, BROADCAST_ID, msgBody); + + //write msg to central exchange + centralExchange->outboxArray[localEndpoint->endpointID] = msg; + + //update broadcast trigger counter + centralExchange->BroadcastTriggerCounter = increasedTrigger; } /* * This sends a message another endpoint. Again it is not guaranteed that the * message is received. But in most cases it will. */ -void inline lossyCom__sendMsg(lossyCom__endpoint_t* localEndpoint, +void lossyCom__sendMsg(lossyCom__endpoint_t* localEndpoint, lossyCom__endpointID_t receiverEndpointID, - lossyCom__msgBody_t msg) + lossyCom__msgBody_t msgBody) { - lossyCom__msg_t msgDraft; - uint16_t triggerCopy; + lossyCom__exchange_t* centralExchange = localEndpoint->centralExchange; + lossyCom__msg_t msg; + uint16_t increasedTrigger; - //build message - msgDraft = (0 | msg); - msgDraft |= ((lossyCom__msg_t)receiverEndpointID << ENDPOINT_ID_SHIFT); + increasedTrigger = + centralExchange->p2pTriggerCounter[receiverEndpointID] +1; - triggerCopy = localEndpoint->centralExchange->triggerCounter +1; - msgDraft |= ((lossyCom__msg_t)triggerCopy << TRIGGER_SHIFT); + //build message + msg = prepareMsg(increasedTrigger, receiverEndpointID, msgBody); //write msg to central exchange - localEndpoint->centralExchange->outboxArray[localEndpoint->endpointID] = - msgDraft; + centralExchange->outboxArray[localEndpoint->endpointID] = msg; - localEndpoint->centralExchange->triggerCounter = triggerCopy; - //printf("send updated trigger to %d\n", triggerCopy); + //write back increased trigger counter + centralExchange->p2pTriggerCounter[receiverEndpointID] = increasedTrigger; } -void inline lossyCom__receiveMsg(lossyCom__endpoint_t* localEndpoint) +int inline isUnreceivedMsg(uint16_t msgTrigger, + uint16_t lastReceivedTrigger, + uint16_t triggerSnapshot) { - uint16_t currentTriggerCopy; + if(msgTrigger > lastReceivedTrigger || + msgTrigger <= triggerSnapshot) + { + // check if the message is new (msg trigger > archived trigger) + // and already valid (msgTrigger <= currentTriggerCopy) + if((msgTrigger > lastReceivedTrigger && + msgTrigger <= triggerSnapshot) || + ((int64_t) triggerSnapshot- // check for triggerCounterOverflow + (int64_t)lastReceivedTrigger < -MAX_TRIGGER/2)) + { + return TRUE; + } + } + return FALSE; +} + +void lossyCom__receiveMsg(lossyCom__endpoint_t* localEndpoint) +{ + uint16_t broadcastTriggerSnapshot, p2pTriggerSnapshot; + lossyCom__exchange_t* centralExchange; lossyCom__endpointID_t senderEndpointID; - lossyCom__endpointID_t receiverID; + lossyCom__endpointID_t receiverEndpointID; lossyCom__msg_t msgCopy; uint16_t msgTrigger; lossyCom__msgBody_t msgBody; - senderEndpointID = 0; - currentTriggerCopy = localEndpoint->centralExchange->triggerCounter; + centralExchange = localEndpoint->centralExchange; + //save trigger counter to know find valid messages + broadcastTriggerSnapshot = centralExchange->BroadcastTriggerCounter; + p2pTriggerSnapshot = + centralExchange->p2pTriggerCounter[localEndpoint->endpointID]; //new message arrived if trigger counter is higher than the last time read - if(currentTriggerCopy > localEndpoint->localTriggerCopy) + if( broadcastTriggerSnapshot > localEndpoint->lastReceivedBroadcastTrigger || + p2pTriggerSnapshot > localEndpoint->lastReceivedp2pTrigger) { - while(senderEndpointID < localEndpoint->centralExchange->numEndpoints) + senderEndpointID = 0; + //search outboxes for new messages + while(senderEndpointID < centralExchange->numEndpoints) { + //ignore own outbox if(senderEndpointID != localEndpoint->endpointID) { - msgCopy = localEndpoint->centralExchange->outboxArray[senderEndpointID]; + msgCopy = centralExchange->outboxArray[senderEndpointID]; msgTrigger = 0xFFFF & (msgCopy >> TRIGGER_SHIFT); + receiverEndpointID = 0xFFFF & (msgCopy >> ENDPOINT_ID_SHIFT); - - if(msgTrigger > localEndpoint->localTriggerCopy || - msgTrigger <= currentTriggerCopy) - { - // check if the message is new (msg trigger > archived trigger) - // and already valid (msgTrigger <= currentTriggerCopy) - if((msgTrigger > localEndpoint->localTriggerCopy && - msgTrigger <= currentTriggerCopy) || - ((int64_t)currentTriggerCopy- // check for triggerCounterOverflow - (int64_t)localEndpoint->localTriggerCopy < -MAX_TRIGGER/2)) + if(receiverEndpointID == BROADCAST_ID){//receive broadcast message + if(isUnreceivedMsg(msgTrigger, + localEndpoint->lastReceivedBroadcastTrigger, + broadcastTriggerSnapshot)) { //let the message handler parse the message - msgBody = 0xFFFFFFFF & msgCopy; - receiverID = 0xFFFF & (msgCopy >> ENDPOINT_ID_SHIFT); + msgBody = 0xFFFFFFFF & msgCopy; //only receive broadcast and p2p for own receiverID - if(receiverID == BROADCAST_ID || - receiverID == localEndpoint->endpointID) - { - (*(localEndpoint->msgHandler))(senderEndpointID, - msgBody, - localEndpoint->msgHandlerData); - } - } + + (*(localEndpoint->msgHandler))(senderEndpointID, + msgBody, + localEndpoint->msgHandlerData); + } + }else{//point 2 point message + if(receiverEndpointID == localEndpoint->endpointID && + isUnreceivedMsg(msgTrigger, + localEndpoint->lastReceivedp2pTrigger, + p2pTriggerSnapshot)) + { + //let the message handler parse the message + msgBody = 0xFFFFFFFF & msgCopy; + //only receive broadcast and p2p for own receiverID + + (*(localEndpoint->msgHandler))(senderEndpointID, + msgBody, + localEndpoint->msgHandlerData); + } } } senderEndpointID++; - } + }//search outbox loop } //save last TriggerCounter of last parsed Msg - localEndpoint->localTriggerCopy = currentTriggerCopy; + localEndpoint->lastReceivedBroadcastTrigger = broadcastTriggerSnapshot; + localEndpoint->lastReceivedp2pTrigger = p2pTriggerSnapshot; } \ No newline at end of file diff -r 5c0fb7c519d7 -r 7ba5a3a6102d LossyCom.h --- a/LossyCom.h Tue Mar 13 15:21:36 2012 +0100 +++ b/LossyCom.h Tue Mar 13 18:22:12 2012 +0100 @@ -58,20 +58,22 @@ * Central communication structure. */ typedef struct{ - volatile uint16_t triggerCounter; - uint16_t numEndpoints; - lossyCom__msg_t* outboxArray; + volatile uint16_t BroadcastTriggerCounter; + volatile uint16_t* p2pTriggerCounter; + uint16_t numEndpoints; + lossyCom__msg_t* outboxArray; }lossyCom__exchange_t; /* * Endpoint data structure. */ typedef struct { - uint16_t localTriggerCopy; + uint16_t lastReceivedBroadcastTrigger; + uint16_t lastReceivedp2pTrigger; lossyCom__endpointID_t endpointID; - lossyCom__exchange_t* centralExchange; - lossyCom__msgHandler msgHandler; - void* msgHandlerData; + lossyCom__exchange_t* centralExchange; + lossyCom__msgHandler msgHandler; + void* msgHandlerData; } lossyCom__endpoint_t; /***********************************