- }
- }
- return sendResult;
- }
-
-
- event void VBitReceive.receive(void* payload, uint8_t len){
- dhv_vbit_msg_t * rcv_dvbmsg;
- uint8_t bindex, vindex;
- int i,j;
- dhv_version_t version;
- dhv_version_t mask;
- uint8_t diffIndex;
- dhv_key_t diffKey;
- bool isDiff;
- uint8_t vbit_size;
- uint8_t* vbit;
- uint32_t salt, myHash;
- uint8_t maxDataLength;
- uint8_t msg_size;
- uint8_t numMsg;
- uint32_t bitIndexValue;
-
- isDiff = FALSE;
- commRate = 1;
-
- maxDataLength = TOSH_DATA_LENGTH - 11;
- if(UQCOUNT_DHV != 0)
- {
- vbit_size = ((uint8_t)(UQCOUNT_DHV-1)/VBIT_LENGTH) + 1;
- numMsg = (vbit_size -1)/maxDataLength + 1;
-
- }else
- {
- vbit_size = 0;
- numMsg = 0;
- }
-
- rcv_dvbmsg = (dhv_vbit_msg_t*) payload;
- bindex = rcv_dvbmsg->bindex;
- vindex = rcv_dvbmsg->vindex;
-
- dbg("DhvVBitP", "Receive vbit of index %d numMsg %d vbit_size %d \n", bindex, numMsg, vbit_size );
-
- //compare the hash first
- salt = rcv_dvbmsg->salt;
- myHash = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt);
-
- if(myHash == rcv_dvbmsg->info){
- //some duplicates
- dbg("DhvVBitP", "same summary\n");
- call VBitLogic.setSameSummary();
-
- }else{
- vbit = call DhvHelp.getVBits(bindex);
- if(vindex == numMsg-1){
- msg_size = vbit_size - vindex*maxDataLength;
- //dbg("DhvVBitP", "Last message vindex %d numMsg %d msg_size %d \n", vindex, numMsg, msg_size );
- }else{
- msg_size = maxDataLength;
- //dbg("DhvVBitP", "Not last message %d\n", msg_size);
- }
-
- //compare with the rcv vbits
- for(i = 0; i < msg_size; i++){
- dbg("DhvVBitP", "numMsg %d bindex %d vbit %d vindex %d: msg_size %d local 0x%02x - rcv 0x%02x \n",numMsg, bindex, i, vindex, msg_size ,vbit[vindex*maxDataLength+i],rcv_dvbmsg->vbit[i]);
- if(vbit[vindex*maxDataLength + i] != rcv_dvbmsg->vbit[i]){
- version = rcv_dvbmsg->vbit[i]^vbit[vindex*maxDataLength + i];
- mask = 1;
- if(version != 0){
- dbg("DhvVBitP", "There is a difference \n");
- isDiff = TRUE;
- for(j = 0; j < VBIT_LENGTH; j++){
- if((version & mask) != 0){
- diffIndex = (VBIT_LENGTH -j) + VBIT_LENGTH*i + vindex*maxDataLength - 1 ;
- dbg("DhvVBitP", "Detect difference at %d, %d %d %d %d \n", diffIndex, i, j, vindex, maxDataLength);
-
- diffKey = call DhvHelp.indexToKey(diffIndex);
- call VectorLogic.setItem(diffKey);
- }
- mask = mask << 1;
- }
- }
- }
- }
-
- //reset this bit
- call VBitLogic.unsetVBitIndex(bindex);
-
- if((isDiff == FALSE)){
- bitIndexValue = call VBitLogic.getVBitState();
- if(bitIndexValue == 0){
- //tell DhvLogic to send the next bindex
- bindex++;
- dbg("DhvVBitP", "No Difference detected, move to bindex %d \n", bindex );
- call VBitLogic.setVBitIndex(bindex);
- }
- }else{
- dbg("DhvVBitP","difference detected, reset to 0 \n");
- }
- }
- }
+ }
+ }
+ return sendResult;
+ }
+
+
+ event void VBitReceive.receive(void* payload, uint8_t len){
+ dhv_vbit_msg_t * rcv_dvbmsg;
+ uint8_t bindex, vindex;
+ int i,j;
+ dhv_version_t version;
+ dhv_version_t mask;
+ uint8_t diffIndex;
+ dhv_key_t diffKey;
+ bool isDiff;
+ uint8_t vbit_size;
+ uint8_t* vbit;
+ uint32_t salt, myHash;
+ uint8_t maxDataLength;
+ uint8_t msg_size;
+ uint8_t numMsg;
+ uint32_t bitIndexValue;
+
+ isDiff = FALSE;
+ commRate = 1;
+
+ maxDataLength = TOSH_DATA_LENGTH - sizeof(dhv_msg_t) - sizeof(dhv_vbit_msg_t);
+ if(UQCOUNT_DHV != 0)
+ {
+ vbit_size = ((uint8_t)(UQCOUNT_DHV-1)/VBIT_LENGTH) + 1;
+ numMsg = (vbit_size -1)/maxDataLength + 1;
+
+ }else
+ {
+ vbit_size = 0;
+ numMsg = 0;
+ }
+
+ rcv_dvbmsg = (dhv_vbit_msg_t*) payload;
+ bindex = rcv_dvbmsg->bindex;
+ vindex = rcv_dvbmsg->vindex;
+
+ dbg("DhvVBitP", "Receive vbit of index %d numMsg %d vbit_size %d \n", bindex, numMsg, vbit_size );
+
+ //compare the hash first
+ salt = rcv_dvbmsg->salt;
+ myHash = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt);
+
+ if(myHash == rcv_dvbmsg->info){
+ //some duplicates
+ dbg("DhvVBitP", "same summary\n");
+ call VBitLogic.setSameSummary();
+
+ }else{
+ vbit = call DhvHelp.getVBits(bindex);
+ if(vindex == numMsg-1){
+ msg_size = vbit_size - vindex*maxDataLength;
+ //dbg("DhvVBitP", "Last message vindex %d numMsg %d msg_size %d \n", vindex, numMsg, msg_size );
+ }else{
+ msg_size = maxDataLength;
+ //dbg("DhvVBitP", "Not last message %d\n", msg_size);
+ }
+
+ //compare with the rcv vbits
+ for(i = 0; i < msg_size; i++){
+ dbg("DhvVBitP", "numMsg %d bindex %d vbit %d vindex %d: msg_size %d local 0x%02x - rcv 0x%02x \n",numMsg, bindex, i, vindex, msg_size ,vbit[vindex*maxDataLength+i],rcv_dvbmsg->vbit[i]);
+ if(vbit[vindex*maxDataLength + i] != rcv_dvbmsg->vbit[i]){
+ version = rcv_dvbmsg->vbit[i]^vbit[vindex*maxDataLength + i];
+ mask = 1;
+ if(version != 0){
+ dbg("DhvVBitP", "There is a difference \n");
+ isDiff = TRUE;
+ for(j = 0; j < VBIT_LENGTH; j++){
+ if((version & mask) != 0){
+ diffIndex = (VBIT_LENGTH -j) + VBIT_LENGTH*i + vindex*maxDataLength - 1 ;
+ dbg("DhvVBitP", "Detect difference at %d, %d %d %d %d \n", diffIndex, i, j, vindex, maxDataLength);
+
+ diffKey = call DhvHelp.indexToKey(diffIndex);
+ call VectorLogic.setItem(diffKey);
+ }
+ mask = mask << 1;
+ }
+ }
+ }
+ }
+
+ //reset this bit
+ call VBitLogic.unsetVBitIndex(bindex);
+
+ if((isDiff == FALSE)){
+ bitIndexValue = call VBitLogic.getVBitState();
+ if(bitIndexValue == 0){
+ //tell DhvLogic to send the next bindex
+ bindex++;
+ dbg("DhvVBitP", "No Difference detected, move to bindex %d \n", bindex );
+ call VBitLogic.setVBitIndex(bindex);
+ }
+ }else{
+ dbg("DhvVBitP","difference detected, reset to 0 \n");
+ }
+ }
+ }