long Binomial(long n, double p) /* ================================================================ * Returns a binomial distributed integer between 0 and n inclusive. * NOTE: use n > 0 and 0.0 < p < 1.0 * ================================================================ */ { long i, x = 0; for (i = 0; i < n; i++) x += Bernoulli(p); return (x); }
short RandomSign(){ return Bernoulli(0.5)?-1:1; }
/* This function runs before the OS start. */ void NetworkConnecting() { int i, p, test, test1; int sendcounter = 0; u32 *pu32 = NULL; test1 = Timer2Counter; test = Timer2Counter; sPacketbuf[DES_NUM] = SELFADDRESS; sPacketbuf[SRC_NUM] = SELFADDRESS; CC2500_SeleChannel(0); CC2500_SetRecvAddr(SELFADDRESS); CC2500_SetRxd(); CC2500_SendPacket(sPacketbuf,PACKET_LEN); CC2500_SetRxd(); sPacketbuf[DES_NUM]=0x00; NbrList[0]=NbrCount; // while(RESET==RNG_GetFlagStatus(RNG_FLAG_DRDY)); // Delay_100us(RNG_GetRandomNumber() & 0x000000f); pu32 = (u32*) &sPacketbuf[1]; while (0 == NodeFlag[SELFADDRESS]) { if (ISIDLE) { NbrList[0] = NbrCount; sPacketbuf[PRC_NUM] = DISCOVERY_MESSAGE; arm_copy_q7(NbrList, sPacketbuf+LEN_NUM, NbrList[0]+1); pu32[CRC_LENGTH - 2] = Timer2Counter;//Add the timestamp. CRC_ResetDR(); pu32[CRC_LENGTH - 1] = CRC_CalcBlockCRC(pu32, CRC_LENGTH - 1); p = Bernoulli(1.0/(MAXNUM-NbrCount+1)); //Delay_100us(1); if (ISIDLE) { if (0 == DelayFlag) { if (p/*Bernoulli(1.0/(MAXNUM-NbrCount+1))*/) { CC2500_SendPacket(sPacketbuf, PACKET_LEN); CC2500_SetRxd(); DelayFlag=1; } } else { Preemptive_Delay_100us(25, &DelayFlag); DelayFlag=0; } } } } test1 = Timer2Counter - test1; while(MAXNUM > NbrCount) { if (0 != DiscoveryHelp) { if (ISIDLE) { Delay_100us(1); if (ISIDLE) { if (Bernoulli(1.0/(MAXNUM-NbrCount+1))) { NbrList[0] = NbrCount; sPacketbuf[PRC_NUM] = DISCOVERY_MESSAGE; arm_copy_q7(NbrList, sPacketbuf+LEN_NUM, NbrList[0]+1); pu32[CRC_LENGTH - 2] = Timer2Counter;//Add the timestamp. CRC_ResetDR(); pu32[CRC_LENGTH - 1] = CRC_CalcBlockCRC(pu32, CRC_LENGTH - 1); CC2500_SendPacket(sPacketbuf, PACKET_LEN); CC2500_SetRxd(); } } } DiscoveryHelp = 0; } } test = Timer2Counter - test; while(RESET==RNG_GetFlagStatus(RNG_FLAG_DRDY)); Delay_100us(RNG_GetRandomNumber() & 0x000000f); pu32[CRC_LENGTH - 2] = Timer2Counter;//Add the timestamp. sendcounter = 3; while (0 != sendcounter) { if (ISIDLE) { Delay_100us(1); if (ISIDLE) { NbrList[0] = NbrCount; sPacketbuf[PRC_NUM] = DISCOVERY_ACCOMPLISHED; arm_copy_q7(NbrList, sPacketbuf+LEN_NUM, NbrList[0]+1); CRC_ResetDR(); pu32[CRC_LENGTH - 1] = CRC_CalcBlockCRC(pu32, CRC_LENGTH - 1); CC2500_SendPacket(sPacketbuf, PACKET_LEN); CC2500_SetRxd(); sendcounter--; } } Delay_100us(10); } printf("NeighbourList:\r\n"); for (i=0;i<MAXNUM;i++) { printf("%#x\r\n",NbrList[1+i]); } printf("t1 = %d\r\n", test1); printf("t = %d\r\n", test); }