]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/tossim/sim_gain.c
Add functionality for CPM noise modeling.
[tinyos-2.x.git] / tos / lib / tossim / sim_gain.c
index 9e671841e9379d9b8a5558b60563a324344c181e..c9e4270fe36c0c361d61a38731b32fdf90592da6 100644 (file)
@@ -6,14 +6,17 @@ typedef struct sim_gain_noise {
 } sim_gain_noise_t;
 
 
-gain_entry_t* connectivity[TOSSIM_MAX_NODES];
-sim_gain_noise_t noise[TOSSIM_MAX_NODES];
+gain_entry_t* connectivity[TOSSIM_MAX_NODES + 1];
+sim_gain_noise_t localNoise[TOSSIM_MAX_NODES + 1];
 double sensitivity = 4.0;
 
 gain_entry_t* sim_gain_allocate_link(int mote);
 void sim_gain_deallocate_link(gain_entry_t* link);
 
 gain_entry_t* sim_gain_first(int src) __attribute__ ((C, spontaneous)) {
+  if (src > TOSSIM_MAX_NODES) {
+    return connectivity[TOSSIM_MAX_NODES];
+  } 
   return connectivity[src];
 }
 
@@ -24,9 +27,12 @@ gain_entry_t* sim_gain_next(gain_entry_t* link) __attribute__ ((C, spontaneous))
 void sim_gain_add(int src, int dest, double gain) __attribute__ ((C, spontaneous))  {
   gain_entry_t* current;
   int temp = sim_node();
+  if (src > TOSSIM_MAX_NODES) {
+    src = TOSSIM_MAX_NODES;
+  }
   sim_set_node(src);
 
-  current = connectivity[src];
+  current = sim_gain_first(src);
   while (current != NULL) {
     if (current->mote == dest) {
       sim_set_node(temp);
@@ -50,7 +56,7 @@ double sim_gain_value(int src, int dest) __attribute__ ((C, spontaneous))  {
   gain_entry_t* current;
   int temp = sim_node();
   sim_set_node(src);
-  current = connectivity[src];
+  current = sim_gain_first(src);
   while (current != NULL) {
     if (current->mote == dest) {
       sim_set_node(temp);
@@ -66,7 +72,7 @@ bool sim_gain_connected(int src, int dest) __attribute__ ((C, spontaneous)) {
   gain_entry_t* current;
   int temp = sim_node();
   sim_set_node(src);
-  current = connectivity[src];
+  current = sim_gain_first(src);
   while (current != NULL) {
     if (current->mote == dest) {
       sim_set_node(temp);
@@ -82,9 +88,14 @@ void sim_gain_remove(int src, int dest) __attribute__ ((C, spontaneous))  {
   gain_entry_t* current;
   gain_entry_t* prevLink;
   int temp = sim_node();
+  
+  if (src > TOSSIM_MAX_NODES) {
+    src = TOSSIM_MAX_NODES;
+  }
+
   sim_set_node(src);
     
-  current = connectivity[src];
+  current = sim_gain_first(src);
   prevLink = NULL;
     
   while (current != NULL) {
@@ -107,26 +118,39 @@ void sim_gain_remove(int src, int dest) __attribute__ ((C, spontaneous))  {
 }
 
 void sim_gain_set_noise_floor(int node, double mean, double range) __attribute__ ((C, spontaneous))  {
-  noise[node].mean = mean;
-  noise[node].range = range;
+  if (node > TOSSIM_MAX_NODES) {
+    node = TOSSIM_MAX_NODES;
+  }
+  localNoise[node].mean = mean;
+  localNoise[node].range = range;
 }
 
 double sim_gain_noise_mean(int node) {
-  return noise[node].mean;
+  if (node > TOSSIM_MAX_NODES) {
+    node = TOSSIM_MAX_NODES;
+  }
+  return localNoise[node].mean;
 }
 
 double sim_gain_noise_range(int node) {
-  return noise[node].range;
+  if (node > TOSSIM_MAX_NODES) {
+    node = TOSSIM_MAX_NODES;
+  }
+  return localNoise[node].range;
 }
 
 // Pick a number a number from the uniform distribution of
 // [mean-range, mean+range].
 double sim_gain_sample_noise(int node)  __attribute__ ((C, spontaneous)) {
-  double val = noise[node].mean;
-  double adjust = (sim_random() % 2000000);
+  double val, adjust;
+  if (node > TOSSIM_MAX_NODES) {
+    node = TOSSIM_MAX_NODES;
+  } 
+  val = localNoise[node].mean;
+  adjust = (sim_random() % 2000000);
   adjust /= 1000000.0;
   adjust -= 1.0;
-  adjust *= noise[node].range;
+  adjust *= localNoise[node].range;
   return val + adjust;
 }