[Tinyos-help] C program for Listern

manjunath at ece.iisc.ernet.in manjunath at ece.iisc.ernet.in
Thu Oct 19 21:19:04 PDT 2006


Oh!!! Here I am re-attaching the 10KB program...


manjunath

-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.

-------------- next part --------------
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#include <sys/poll.h>
#include <sys/time.h>
#include <string.h>
#include <sys/timeb.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/signal.h>
#include <math.h>

#define PROBABILITY 0.01
#define THRESHOLD 0.5
#define NUM_OF_NODES 3


	



/* 
 * Random Number Generator
 */

/* Random number generator ran1 from Computers in Physics */
/* Volume 6 No. 5, 1992, 522-524, Press and Teukolsky */
/* To generate real random numbers 0.0-1.0 */
/* Should be seeded with a negative integer */
#define IA 16807
#define IM 2147483647
#define IQ 127773
#define IR 2836
#define NTAB 32
#define EPS (1.2E-07)
#define MAX(a,b) (a>b)?a:b
#define MIN(a,b) (a<b)?a:b

double randReal(idum)
int *idum;
{
        int j,k;
	static int iv[NTAB],iy=0;
	void nrerror();
        static double NDIV = 1.0/(1.0+(IM-1.0)/NTAB);
        static double RNMX = (1.0-EPS);
        static double AM = (1.0/IM);

	if ((*idum <= 0) || (iy == 0)) {
		*idum = MAX(-*idum,*idum);
                for(j=NTAB+7;j>=0;j--) {
			k = *idum/IQ;
			*idum = IA*(*idum-k*IQ)-IR*k;
			if(*idum < 0) *idum += IM;
			if(j < NTAB) iv[j] = *idum;
		}
		iy = iv[0];
	}
	k = *idum/IQ;
	*idum = IA*(*idum-k*IQ)-IR*k;
	if(*idum<0) *idum += IM;
	j = iy*NDIV;
	iy = iv[j];
	iv[j] = *idum;
	return MIN(AM*iy,RNMX);
}
#undef IA 
#undef IM 
#undef IQ
#undef IR
#undef NTAB
#undef EPS 
#undef MAX
#undef MIN


time_t syncsecs;
short syncmsecs;
void *playSound();
void *randomSound();
	
typedef struct TOS_Msg {
		uint16_t addr;
		uint8_t type;
      		uint8_t group;
    	  	uint8_t length;
     		uint8_t data[29];
      	}TOS_Msg;
typedef TOS_Msg * TOS_MsgPtr;
	
/* 
 * Time stamped pkt
 */
typedef struct localTOS_Msg {
		uint16_t addr;
		uint8_t type;
		uint8_t group;
		uint8_t length;
		uint8_t data[29];
	}localTOS_Msg;
	 
   typedef struct DemoMsg {
      uint16_t source;
      uint16_t number;
      char color;
      } DemoMsg;
 
   typedef DemoMsg * DemoMsgPtr;
 
  /**** Read Input Line **************/
  // this is some old code I copied from another program to 
  // read a line of input from the keyboard
  int getline( char s[], int lim ) {
     int c, i;
     for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) s[i] = c;
     if (c == '\n') { s[i]=c; ++i; };
    s[i] = '\0';
     return i;
     }

  /**** Write TOS_Msg to Socket *******/
  // this code is modified from another program to write all bytes
  // of a TOS_Msg to the TCP socket
  void putStream( int socket, TOS_MsgPtr p ) {
     int i, r;
     uint8_t n;
     char * s;
  extern int errno;
     n = p->length + sizeof(TOS_Msg) - 29;
     s = (char *) p;
      // SerialForwarder expects the first byte to be a count
      // of the number of bytes in the TOS_Msg.
      r = write(socket, &n, 1);
      // printf("sent %x\n",n);
      if (r < 0) { perror("putStream error"); exit(errno); }
 
     for (i = 0; i < n; i++) {
        r = write(socket, &s[i], 1);
        // printf("sent %x\n",*(s+i));
        if (r < 0) { perror("putStream error"); exit(errno); }
        }
  }

  /**** Read Stream from Socket ******/
  void getStream( int socket, TOS_MsgPtr p ) {
     int i, r;
     char * s;
     uint8_t n;
     extern int errno;
     s = (char *) p;

     // first byte read should be the count of the number
     // of bytes in the received TOS_Msg
     r = read(socket, &n, 1);
     if (r < 0) { perror("getStream error"); exit(errno); }
     if (r == 0) { printf("connection broken!\n"); exit(0); }
     // printf("got message for %d bytes\n",m); 

     // now read the data
     if ( n > sizeof(TOS_Msg) ) {
            printf("wierd message for %d bytes returned\n",n);
            exit(1);
            }
     for (i = 0; i < n; i++) {
        r = read(socket, &s[i], 1);
        if (r < 0) { perror("getStream error"); exit(errno); }
        if (r == 0) { printf("connection broken!\n"); exit(0); }
        }
     return;
  }

  /**** Exchange SF Protocol Number ******/
  // wierd protocol code needed by SerialForwarder -- totally
  // undocumented, I had to read the code of SFProtocol.java
  void exchange( int socket ) {
     int i, r;
     char s[2];
     extern int errno;
     for (i = 0; i < 2; i++) {
        r = read(socket, &s[i], 1);
        if (r < 0) { perror("getExchange error"); exit(errno); }
        if (r == 0) { printf("connection broken!\n"); exit(0); }
        }
     if ( !(s[0] == 'T' & s[1] == '!') ) {
        printf("SFProtocol exchange failed\n"); exit(0);
        }
     s[1] = ' ';
     for (i = 0; i < 2; i++) {
        r = write(socket, &s[i], 1);
        if (r < 0) { perror("putExchange error"); exit(errno); }
        }
     }

int firstTime=0;
int soundFlag=0;
int sampleIndex, samples[10], startSoundFlag, decisionFlag=0, randomFlag;
double globalTime;
double randomTime;
int seed=0;
double uniformDistVal=0.0;
double mu=0.0;
double LR[2000];
int seqNumOnBS=0;

/* 
 * Algorithm
 */

int algorithm()
{
	double partOne, partTwo, denominator;
 	
	partOne = ( (1.0-mu)*(1-PROBABILITY) ) / (mu + (PROBABILITY*(1-mu)) );
	partTwo = LR[samples[0]] * LR[samples[1]] * LR[samples[2]];
	denominator = 1 + (partOne*partTwo);
	mu = 1/denominator;
	//printf("MU = %e\n", mu);
	if(mu > THRESHOLD)
		return 1;
	else {
		return 0;
	}
}


void readLR()
{
	FILE *fp;
	float val;
	int i=0;

	fp = fopen("LR.txt", "r");
	while( (fscanf(fp, "%f", &val)) != EOF) {
		LR[i] = val;
		//printf("%e\n", LR[i]);
		i = i + 1;
	}	
	fclose(fp);
}

  
int main() {

     	int i,r;
     	int ret;
     	int sock;
     	extern int errno;
     	extern int h_errno;
     	struct sockaddr_in toServer;
     	struct hostent * h;
     	struct pollfd waitor;
     	TOS_Msg buffer;
    	DemoMsgPtr dp;
    	char message[256];
    	struct timeval tv;
	struct timezone tz;	
	struct timeb tb; 
	localTOS_Msg *samplePkt;
	int *systemTimePtr;
	short sample, *srcAddrPtr;
	pthread_t thread, randomThread;
	pthread_attr_t attr, randomAttr;
	
	readLR();
   
     // open socket for port 9001 on localhost
     bzero((char *) &toServer, sizeof(toServer));
     toServer.sin_family = AF_INET;
     toServer.sin_port = htons(9001);
     h = gethostbyname("localhost");
    if (h == NULL) { perror("gethostbyname error"); exit(h_errno); }
     bcopy(h->h_addr, (char *) &toServer.sin_addr, h->h_length);

     sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) { perror("unable to create socket"); exit(errno); }
     i = 1;
     r = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &i, sizeof (i));
     if (r < 0) { perror("setsockopt error");
                 close(sock); exit(errno); }
     r = connect(sock, (struct sockaddr *) &toServer, sizeof(toServer));
     if (r < 0) { perror("connect error"); exit(errno); }

    // use the "poll()" function so that we don't get stuck
    // trying to read from a socket that has no data
    // use "man poll" to read about this neat system function
     waitor.fd = sock;
     waitor.events =  POLLIN;

     // do the silly "version exchange" that SFProtocol.java needs
     exchange(sock);
 
       	while (1) {
       /***** Loop to read any response(s) ********************/
	for (;;) {
	// wait for 250 milliseconds for a message to return
        	poll(&waitor,1,250);
        	if (!(waitor.revents & POLLIN)) break;  // no message!
        	getStream(sock, &buffer);
		
		/*
		 * Beacon Message
		 */

		if(buffer.type == 100) {
			if(firstTime == 0) {
				printf("Synchronization Time\n");
				globalTime = 0.0;
				firstTime = 1;
				
				seed = rand();
				seed = -1 * seed;
				uniformDistVal = randReal(&seed);  
				
				randomTime = ceil( (log(1.0 - uniformDistVal))/
					(log(1-PROBABILITY)) );
				randomTime = (int)randomTime % 10;
				//printf("Random Time = %e\n", randomTime);
				randomTime = 2.0 * randomTime;
                                if(randomTime == 0.0) {
                                        randomTime = 2.0;
				}
				//printf("%e, %d, %d\n",
				//	globalTime, startSoundFlag, decisionFlag);
				pthread_attr_init(&randomAttr);
				pthread_create(&randomThread, &randomAttr, randomSound, NULL);
			}
		}
		else {
			if(buffer.type == 101) {
				samplePkt = (localTOS_Msg *)malloc(sizeof(localTOS_Msg));
				memcpy((void *)samplePkt, (void *)&buffer, sizeof(TOS_Msg));
				systemTimePtr = (int *)((char *)samplePkt->data + 2);
				srcAddrPtr = (short *)((char *)samplePkt->data + 6);
				sample =  (samplePkt->data[0] + (256 * samplePkt->data[1]));
				samples[sampleIndex] = sample;
				sampleIndex++;
				//printf("%d\n", sample);
				if(seqNumOnBS != *srcAddrPtr) {
                     			printf("Packet Loss...SeqAtBS = %d, Packet has %d\n",
                                 	seqNumOnBS, *srcAddrPtr);
					samples[0] = sample;
					sampleIndex = 1;
					seqNumOnBS++;
				}
				if(sampleIndex == NUM_OF_NODES) {
					//if(decisionFlag == 0)
					decisionFlag = algorithm();
					seqNumOnBS++;
					sampleIndex = 0;
					//printf("DECISION = %d\n", decisionFlag);
				}
				//printf("%d\n", *srcAddrPtr);
				//printf("sample = %d\n", sample);
				free(samplePkt);
			}
		} 
	}
     }
  }

void *playSound()
{
	void *ptr;

	ptr = (void *)malloc(4);	
	system("play sine.wav");
	pthread_exit(ptr);
}

void *randomSound()
{
	pthread_t LocalThread;
	pthread_attr_t LocalAttr;

	for(;;) {
		usleep(500000);
                globalTime = globalTime + 0.5;
		randomFlag = 0;
                if(startSoundFlag) {
			randomTime = randomTime - 1.0;
                        randomFlag = 1;
                        if(randomTime == 0.0) {
                        	system("killall -9 play");
				system("killall -9 sox");
                                
				seed = rand();
                                seed = -1 * seed;
                                uniformDistVal = randReal(&seed);
				randomTime = ceil( (log(1.0 - uniformDistVal))
					/(log(1-PROBABILITY)) );
				randomTime = (int)randomTime % 10;
				//printf("Random Time = %e\n", randomTime);
				randomTime = 2.0 * randomTime;
				if(randomTime == 0.0)
					randomTime = 2.0;
				startSoundFlag = 0;
				
				/* 
				 * Go back to Initial Status
				 */
				
				printf("REBOOT\n");
				system("java net.tinyos.tools.BcastInject led_on");
				decisionFlag = 0;
				mu = 0.0;
                        }
		}

		if(!startSoundFlag) {
			if(randomFlag != 1)
				randomTime = randomTime - 1.0;
			if(randomTime == 0.0) {
				startSoundFlag = 1;
				randomTime = 2.0 * 10.0;
				pthread_attr_init(&LocalAttr);
				pthread_create(&LocalThread, &LocalAttr, playSound, NULL);
			}
		}
		printf("%e, %d, %d\n",
			globalTime, startSoundFlag, decisionFlag);
	}
}


More information about the Tinyos-help mailing list