Added hack for letting nodes signal that they are 'done'. The simulator exits when all nodes are done. Fixed random initialization so that it is different for all nodes.
This commit is contained in:
parent
0ed1d401d5
commit
c67ce1c1b0
9 changed files with 89 additions and 21 deletions
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: contiki-main.c,v 1.3 2006/10/06 08:25:30 adamdunkels Exp $
|
* $Id: contiki-main.c,v 1.4 2006/10/23 09:01:06 adamdunkels Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "contiki.h"
|
#include "contiki.h"
|
||||||
|
@ -147,7 +147,7 @@ idle(void)
|
||||||
void
|
void
|
||||||
contiki_main(int flag)
|
contiki_main(int flag)
|
||||||
{
|
{
|
||||||
random_init(0);
|
random_init(getpid());
|
||||||
|
|
||||||
leds_init();
|
leds_init();
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
* OF SUCH DAMAGE.
|
* OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: display.c,v 1.3 2006/10/06 08:25:30 adamdunkels Exp $
|
* $Id: display.c,v 1.4 2006/10/23 09:01:06 adamdunkels Exp $
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
|
@ -251,8 +251,8 @@ display_tick(void)
|
||||||
} else {
|
} else {
|
||||||
e = NULL;
|
e = NULL;
|
||||||
}
|
}
|
||||||
if(d->size > 40) {
|
if(d->size > 20) {
|
||||||
d->size -= 8;
|
d->size /= 2;
|
||||||
} else {
|
} else {
|
||||||
d->size -= 4;
|
d->size -= 4;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: ether.c,v 1.3 2006/10/06 08:25:30 adamdunkels Exp $
|
* $Id: ether.c,v 1.4 2006/10/23 09:01:06 adamdunkels Exp $
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* \file
|
* \file
|
||||||
|
@ -88,6 +88,7 @@ static int s, sc;
|
||||||
#define PTYPE_SENSOR 3
|
#define PTYPE_SENSOR 3
|
||||||
#define PTYPE_LEDS 4
|
#define PTYPE_LEDS 4
|
||||||
#define PTYPE_TEXT 5
|
#define PTYPE_TEXT 5
|
||||||
|
#define PTYPE_DONE 6
|
||||||
|
|
||||||
struct ether_hdr {
|
struct ether_hdr {
|
||||||
int type;
|
int type;
|
||||||
|
@ -106,7 +107,23 @@ static int strength;
|
||||||
|
|
||||||
static int collisions = 1;
|
static int collisions = 1;
|
||||||
static int num_collisions = 0;
|
static int num_collisions = 0;
|
||||||
|
static int num_packets = 0;
|
||||||
|
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
static struct timeval t1;
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ether_print_stats(void)
|
||||||
|
{
|
||||||
|
unsigned long time;
|
||||||
|
struct timeval t2;
|
||||||
|
gettimeofday(&t2, NULL);
|
||||||
|
|
||||||
|
time = (t2.tv_sec * 1000 + t2.tv_usec / 1000) -
|
||||||
|
(t1.tv_sec * 1000 + t1.tv_usec / 1000);
|
||||||
|
printf("%d, %d, %f\n", num_packets, num_collisions, time/1000.0);
|
||||||
|
}
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
ether_set_collisions(int c)
|
ether_set_collisions(int c)
|
||||||
|
@ -131,6 +148,8 @@ ether_server_init(void)
|
||||||
{
|
{
|
||||||
struct sockaddr_in sa;
|
struct sockaddr_in sa;
|
||||||
|
|
||||||
|
gettimeofday(&t1, NULL);
|
||||||
|
|
||||||
memb_init(&packets);
|
memb_init(&packets);
|
||||||
list_init(active_packets);
|
list_init(active_packets);
|
||||||
|
|
||||||
|
@ -273,6 +292,9 @@ ether_server_poll(void)
|
||||||
case PTYPE_TEXT:
|
case PTYPE_TEXT:
|
||||||
nodes_set_text(hdr->srcx, hdr->srcy, hdr->text);
|
nodes_set_text(hdr->srcx, hdr->srcy, hdr->text);
|
||||||
break;
|
break;
|
||||||
|
case PTYPE_DONE:
|
||||||
|
nodes_done(hdr->srcid);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* tv.tv_sec = 0;
|
/* tv.tv_sec = 0;
|
||||||
|
@ -343,6 +365,8 @@ ether_tick(void)
|
||||||
range of this node. */
|
range of this node. */
|
||||||
for(p = list_head(active_packets); p != NULL; p = p->next) {
|
for(p = list_head(active_packets); p != NULL; p = p->next) {
|
||||||
|
|
||||||
|
num_packets++;
|
||||||
|
|
||||||
/* Update the node type. */
|
/* Update the node type. */
|
||||||
hdr = (struct ether_hdr *)p->data;
|
hdr = (struct ether_hdr *)p->data;
|
||||||
/* nodes_node(hdr->srcid)->type = hdr->srcnodetype;*/
|
/* nodes_node(hdr->srcid)->type = hdr->srcnodetype;*/
|
||||||
|
@ -511,3 +535,17 @@ ether_send_sensor_data(struct sensor_data *d, int srcx, int srcy, int strength)
|
||||||
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ether_send_done(void)
|
||||||
|
{
|
||||||
|
struct ether_hdr hdr;
|
||||||
|
|
||||||
|
hdr.srcx = node.x;
|
||||||
|
hdr.srcy = node.y;
|
||||||
|
hdr.type = PTYPE_DONE;
|
||||||
|
hdr.srcid = node.id;
|
||||||
|
|
||||||
|
node_send_packet((char *)&hdr, sizeof(struct ether_hdr));
|
||||||
|
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: ether.h,v 1.2 2006/09/26 22:10:12 adamdunkels Exp $
|
* $Id: ether.h,v 1.3 2006/10/23 09:01:06 adamdunkels Exp $
|
||||||
*/
|
*/
|
||||||
#ifndef __ETHER_H__
|
#ifndef __ETHER_H__
|
||||||
#define __ETHER_H__
|
#define __ETHER_H__
|
||||||
|
@ -46,6 +46,8 @@ struct ether_packet {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void ether_send_done(void);
|
||||||
|
|
||||||
u8_t ether_send(char *data, int len);
|
u8_t ether_send(char *data, int len);
|
||||||
void ether_set_leds(int leds);
|
void ether_set_leds(int leds);
|
||||||
void ether_set_text(char *text);
|
void ether_set_text(char *text);
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: main.c,v 1.3 2006/10/06 08:25:30 adamdunkels Exp $
|
* $Id: main.c,v 1.4 2006/10/23 09:01:06 adamdunkels Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -123,7 +123,7 @@ start_node(int x, int y, int b)
|
||||||
|
|
||||||
usleep(1000 * ((random() & 0x0f) << 6) );
|
usleep(1000 * ((random() & 0x0f) << 6) );
|
||||||
|
|
||||||
node_init(port - NODES_PORTBASE + 1, x, y, b);
|
node_init(port - NODES_PORTBASE + 2, x, y, b);
|
||||||
ethernode_init(port);
|
ethernode_init(port);
|
||||||
|
|
||||||
|
|
||||||
|
@ -134,11 +134,11 @@ start_node(int x, int y, int b)
|
||||||
}
|
}
|
||||||
/* printf("Adding sensor %d at (%d,%d)\n", pid, x, y);*/
|
/* printf("Adding sensor %d at (%d,%d)\n", pid, x, y);*/
|
||||||
main_process = 1;
|
main_process = 1;
|
||||||
nodes_add(pid, x, y, port);
|
nodes_add(pid, x, y, port, port - NODES_PORTBASE + 2);
|
||||||
|
|
||||||
|
|
||||||
++port;
|
++port;
|
||||||
return port - NODES_PORTBASE;
|
return port - NODES_PORTBASE + 1;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: ethernode.c,v 1.2 2006/10/06 08:25:31 adamdunkels Exp $
|
* $Id: ethernode.c,v 1.3 2006/10/23 09:01:06 adamdunkels Exp $
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* \file
|
* \file
|
||||||
|
@ -181,7 +181,7 @@ ethernode_send(void)
|
||||||
|
|
||||||
dest = ID_BROADCAST;
|
dest = ID_BROADCAST;
|
||||||
|
|
||||||
/* usleep(800 * (random_rand() % 1000));*/
|
usleep(100 * (random_rand() % 1000));
|
||||||
|
|
||||||
do_send(TYPE_DATA, dest, hdr, len);
|
do_send(TYPE_DATA, dest, hdr, len);
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: node.h,v 1.2 2006/09/26 22:10:12 adamdunkels Exp $
|
* $Id: node.h,v 1.3 2006/10/23 09:01:06 adamdunkels Exp $
|
||||||
*/
|
*/
|
||||||
#ifndef __NODE_H__
|
#ifndef __NODE_H__
|
||||||
#define __NODE_H__
|
#define __NODE_H__
|
||||||
|
@ -54,4 +54,5 @@ int node_y(void);
|
||||||
|
|
||||||
void node_log(const char *fmt, ...);
|
void node_log(const char *fmt, ...);
|
||||||
|
|
||||||
|
|
||||||
#endif /* __NODE_H__ */
|
#endif /* __NODE_H__ */
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: nodes.c,v 1.2 2006/09/26 22:10:12 adamdunkels Exp $
|
* $Id: nodes.c,v 1.3 2006/10/23 09:01:06 adamdunkels Exp $
|
||||||
*/
|
*/
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -51,13 +51,15 @@ nodes_init(void)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
nodes_add(int pid, int x, int y, int port)
|
nodes_add(int pid, int x, int y, int port, int id)
|
||||||
{
|
{
|
||||||
nodes[numnodes].pid = pid;
|
nodes[numnodes].pid = pid;
|
||||||
nodes[numnodes].x = x;
|
nodes[numnodes].x = x;
|
||||||
nodes[numnodes].y = y;
|
nodes[numnodes].y = y;
|
||||||
nodes[numnodes].port = port;
|
nodes[numnodes].port = port;
|
||||||
nodes[numnodes].leds = 0;
|
nodes[numnodes].leds = 0;
|
||||||
|
nodes[numnodes].done = 0;
|
||||||
|
nodes[numnodes].id = id;
|
||||||
++numnodes;
|
++numnodes;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -126,3 +128,24 @@ nodes_find_pid(pid_t pid)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
nodes_done(int id)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int num_done = 0;
|
||||||
|
|
||||||
|
for(i = numnodes; i >= 0; --i) {
|
||||||
|
if(nodes[i].id == id) {
|
||||||
|
nodes[i].done = 1;
|
||||||
|
}
|
||||||
|
if(nodes[i].done != 0) {
|
||||||
|
num_done++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(num_done == numnodes) {
|
||||||
|
ether_print_stats();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -30,30 +30,34 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: nodes.h,v 1.2 2006/09/26 22:10:12 adamdunkels Exp $
|
* $Id: nodes.h,v 1.3 2006/10/23 09:01:06 adamdunkels Exp $
|
||||||
*/
|
*/
|
||||||
#ifndef __NODES_H__
|
#ifndef __NODES_H__
|
||||||
#define __NODES_H__
|
#define __NODES_H__
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#define NODES_TEXTLEN 4
|
#define NODES_TEXTLEN 10
|
||||||
|
|
||||||
void nodes_init(void);
|
void nodes_init(void);
|
||||||
void nodes_add(int pid, int x, int y, int port);
|
void nodes_add(int pid, int x, int y, int port, int id);
|
||||||
void nodes_kill(void);
|
void nodes_kill(void);
|
||||||
void nodes_set_leds(int x, int y, int leds);
|
void nodes_set_leds(int x, int y, int leds);
|
||||||
void nodes_set_text(int x, int y, char *text);
|
void nodes_set_text(int x, int y, char *text);
|
||||||
|
|
||||||
|
void nodes_done(int id);
|
||||||
|
|
||||||
int nodes_num(void);
|
int nodes_num(void);
|
||||||
struct nodes_node *nodes_node(int num);
|
struct nodes_node *nodes_node(int num);
|
||||||
struct nodes_node *nodes_find_pid(pid_t pid);
|
struct nodes_node *nodes_find_pid(pid_t pid);
|
||||||
|
|
||||||
struct nodes_node {
|
struct nodes_node {
|
||||||
int pid;
|
int pid;
|
||||||
|
int id;
|
||||||
int x, y;
|
int x, y;
|
||||||
int port;
|
int port;
|
||||||
int leds;
|
int leds;
|
||||||
|
int done;
|
||||||
char text[NODES_TEXTLEN];
|
char text[NODES_TEXTLEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue