annotate LossyCom.c @ 0:29d8b41926f0

Initial commit - compiles but has still the wrong name
author Merten Sach <msach@mailbox.tu-berlin.de>
date Wed, 07 Mar 2012 19:46:37 +0100
parents
children 826448e34e80
rev   line source
msach@0 1
msach@0 2 /*
msach@0 3 * For a detailed description see header file.
msach@0 4 */
msach@0 5
msach@0 6 #include "LossyCom.h"
msach@0 7
msach@0 8 #include "VMS_Implementations/VMS_impl/vmalloc.h"
msach@0 9
msach@0 10 /*
msach@0 11 * Initializes the central exchange structure.
msach@0 12 * Allocates memory to fit the number of endpoints.
msach@0 13 * Returns NULL if an error occurs.
msach@0 14 */
msach@0 15 lossyCom__exchange_t* lossyCom__initialize(uint16_t numEndpoints)
msach@0 16 {
msach@0 17 lossyCom__exchange_t* exchange;
msach@0 18
msach@0 19 exchange = VMS_WL__malloc(sizeof(lossyCom__exchange_t));
msach@0 20 if(exchange == NULL)
msach@0 21 return NULL;
msach@0 22
msach@0 23 exchange->triggerCounter = 0;
msach@0 24 exchange->numEndpoints = numEndpoints;
msach@0 25 exchange->outboxArray = VMS_WL__malloc(sizeof(lossyCom__msg_t)*numEndpoints);
msach@0 26 if(exchange->outboxArray == NULL){
msach@0 27 VMS_WL__free(exchange);
msach@0 28 return NULL;
msach@0 29 }
msach@0 30
msach@0 31 return exchange;
msach@0 32 }
msach@0 33
msach@0 34 void lossyCom__initialize_endpoint(lossyCom__endpoint_t* localEndpoint,
msach@0 35 lossyCom__exchange_t* centralExchange,
msach@0 36 lossyCom__endpointID_t endpointID,
msach@0 37 lossyCom__msgHandler* msgHandler)
msach@0 38 {
msach@0 39 localEndpoint->localTriggerCopy = 0;
msach@0 40 localEndpoint->endpointID = endpointID;
msach@0 41 localEndpoint->centralExchangePtr = centralExchange;
msach@0 42 localEndpoint->msgHandler = msgHandler;
msach@0 43 }
msach@0 44
msach@0 45 void inline lossyCom__broadcastMsg(lossyCom__endpoint_t* localEndpoint,
msach@0 46 lossyCom__msgBody_t msg)
msach@0 47 {
msach@0 48 lossyCom__sendMsg(localEndpoint,
msach@0 49 BROADCAST_ID,
msach@0 50 msg);
msach@0 51 }
msach@0 52
msach@0 53 void inline lossyCom__sendMsg(lossyCom__endpoint_t* localEndpoint,
msach@0 54 lossyCom__endpointID_t receiverEndpointID,
msach@0 55 lossyCom__msgBody_t msg)
msach@0 56 {
msach@0 57 lossyCom__msg_t msgDraft;
msach@0 58 uint16_t triggerCopy;
msach@0 59
msach@0 60 msgDraft = (0 | msg);
msach@0 61 msgDraft |= ((lossyCom__msg_t)receiverEndpointID << ENDPOINT_ID_SHIFT);
msach@0 62
msach@0 63 triggerCopy = localEndpoint->centralExchangePtr->triggerCounter +1;
msach@0 64 msgDraft |= ((lossyCom__msg_t)triggerCopy << TRIGGER_SHIFT);
msach@0 65
msach@0 66 //write msg to central exchange
msach@0 67 localEndpoint->centralExchangePtr->outboxArray[localEndpoint->endpointID] =
msach@0 68 msgDraft;
msach@0 69
msach@0 70 localEndpoint->centralExchangePtr->triggerCounter = triggerCopy;
msach@0 71 }
msach@0 72
msach@0 73 void inline lossyCom__receiveMsg(lossyCom__endpoint_t* localEndpoint)
msach@0 74 {
msach@0 75 uint16_t remoteTriggerCopy;
msach@0 76 lossyCom__endpointID_t senderEndpointID;
msach@0 77 lossyCom__msg_t msgCopy;
msach@0 78 uint16_t msgTrigger;
msach@0 79 lossyCom__msgBody_t msgBody;
msach@0 80
msach@0 81 senderEndpointID = 0;
msach@0 82 remoteTriggerCopy = localEndpoint->centralExchangePtr->triggerCounter;
msach@0 83 //new message arrived if trigger counter is higher than the last time read
msach@0 84 while(senderEndpointID < localEndpoint->centralExchangePtr->numEndpoints)
msach@0 85 {
msach@0 86 if(senderEndpointID != localEndpoint->endpointID)
msach@0 87 {
msach@0 88 msgCopy = localEndpoint->centralExchangePtr->outboxArray[senderEndpointID];
msach@0 89 msgTrigger = 0xFFFF & (msgCopy >> TRIGGER_SHIFT);
msach@0 90 if(msgTrigger > localEndpoint->localTriggerCopy &&
msach@0 91 msgTrigger <= remoteTriggerCopy)
msach@0 92 {
msach@0 93 msgBody = 0xFFFFFFFF & msgCopy;
msach@0 94 (*(localEndpoint->msgHandler))(senderEndpointID, msgBody);
msach@0 95 }
msach@0 96 }
msach@0 97 senderEndpointID++;
msach@0 98 }
msach@0 99 //save last parsed msg
msach@0 100 localEndpoint->localTriggerCopy = remoteTriggerCopy;
msach@0 101 }