X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Flib%2Ftossim%2FCpmModelC.nc;h=f28895efb64df5e406e8aabaef6d9fb3eea03aaf;hb=b33b490271a59663a9363e47ef64f3ba0d39390f;hp=1fc5fb649735e0bd6a564f6ca940509a5ef94323;hpb=f52e2f4007645f744e36e88c16ad05690ad2e4d8;p=tinyos-2.x.git diff --git a/tos/lib/tossim/CpmModelC.nc b/tos/lib/tossim/CpmModelC.nc index 1fc5fb64..f28895ef 100644 --- a/tos/lib/tossim/CpmModelC.nc +++ b/tos/lib/tossim/CpmModelC.nc @@ -24,11 +24,10 @@ /** * * CPM (closest-pattern matching) is a wireless noise simulation model - * based on statistical extraction from empirical noise data. - * This model provides far more precise - * software simulation environment by exploiting time-correlated noise - * characteristic and shadowing effect as well as path-loss model. For - * details, please refer to the paper + * based on statistical extraction from empirical noise data. This + * model provides far more precise software simulation environment by + * exploiting time-correlated noise characteristics. For details, + * please refer to the paper * * "Improving Wireless Simulation through Noise Modeling." HyungJune * Lee and Philip Levis, IPSN 2007. You can find a copy at @@ -60,6 +59,7 @@ implementation { sim_time_t end; double power; double reversePower; + int8_t strength; bool lost; bool ack; message_t* msg; @@ -127,7 +127,7 @@ implementation { else { noise_val = (double)sim_noise_generate(node_id, quotient); } - dbg("CpmModelC", "OUT: noise_hash_generation()\n"); + dbg("CpmModelC,Tal", "%s: OUT: noise_hash_generation(): %lf\n", sim_time_string(), noise_val); return noise_val; } @@ -309,6 +309,12 @@ implementation { mine->lost = 1; } if (!mine->lost) { + // Copy this receiver's packet signal strength to the metadata region + // of the packet. Note that this packet is actually shared across all + // receivers: a higher layer performs the copy. + tossim_metadata_t* meta = (tossim_metadata_t*)(&mine->msg->metadata); + meta->strength = mine->strength; + dbg_clear("CpmModelC,SNRLoss", " -signaling reception\n"); signal Model.receive(mine->msg); if (mine->ack) { @@ -359,10 +365,14 @@ implementation { rcv->end = endTime; rcv->power = power; rcv->reversePower = reversePower; + // The strength of a packet is the sum of the signal and noise. In most cases, this means + // the signal. By sampling this here, it assumes that the packet RSSI is sampled at + // the beginning of the packet. This is true for the CC2420, but is not true for all + // radios. But generalizing seems like complexity for minimal gain at this point. + rcv->strength = (int8_t)(floor(10.0 * log(pow(10.0, power/10.0) + pow(10.0, noiseStr/10.0)) / log(10.0))); rcv->msg = msg; rcv->lost = 0; rcv->ack = receive; - // If I'm off, I never receive the packet, but I need to keep track of // it in case I turn on and someone else starts sending me a weaker // packet. So I don't set receiving to 1, but I keep track of @@ -416,7 +426,7 @@ implementation { while (neighborEntry != NULL) { int other = neighborEntry->mote; - sim_gain_put(other, msg, endTime, ack && (other == dest), power + sim_gain_value(sim_node(), other), reversePower + sim_gain_value(other, sim_node())); + sim_gain_put(other, msg, endTime, ack, power + sim_gain_value(sim_node(), other), reversePower + sim_gain_value(other, sim_node())); neighborEntry = sim_gain_next(neighborEntry); } }