static void * ThreadFunc(void * pv) //Thread for Signal Hound setup and sweeping
{
       sched_param param;
       param.sched_priority = 51;
       pthread_attr_setschedparam(&tattr,&param);
       pthread_setschedparam(pthread_self(),SCHED_RR,&param);
	usleep(10000);
     if(g_bSettingsChanged) //If settings have cahnged since last sweep...
    {
       pMyHound->m_settings.m_refLevel = gRefLevel;
       pMyHound->SetCenterAndSpan(gCenterFreq,gSpanFreq);
       pMyHound->SetupForSweep();
       g_bSettingsChanged = false;
    }
    usleep(10000);
    int errorcode = pMyHound->DoSweep();  //Do the sweep
    usleep(10000);
 
    int peakidx=0;
    for(int i=1; i<pMyHound->m_traceSize; i++)
    {
        if(pMyHound->pDataMax[i] > pMyHound->pDataMax[peakidx]) peakidx = i;//Find peak
    }
    sprintf(debugstr,"pk %d, %.1f dBm",peakidx,mW2dBm(pMyHound->pDataMax[peakidx])); //Display peak index and amplitude
    if(errorcode)
        sprintf(debugstr,"error %d",errorcode);

    g_bHasTrace = true; //Indicate that there is valid data to display
    g_bDirty = true;    //Indicate the disply needs to be updated
    return NULL;
 }
/* ************************************************** */
double compute_tworayground(struct entitydata *entitydata, nodeid_t src, nodeid_t dst, double rxdBm) {
    /*
     * Cross over distance:
     *
     *        4 * pi * ht * hr
     *  dc = ------------------
     *             lambda
     *                               Pt * Gt * Gr * (ht * hr)^2
     *  Case 1: d >= dc  => Pr(d) = -----------------------------
     *                                        d^4 * L
     *
     *                               Pt * Gt * Gr * lambda^2
     *  Case 2: d < dc   => Pr(d) = -------------------------
     *                                 (4 * pi * d)^2 * L
     *
     *  Note: rxmW = Pt * Gt * Gr, and L = 1
     *  
     *  cf p89 ref "Wireless Communications: Principles and Practice", Theodore Rappaport, 1996.
     *
     */
    double dist;

    dist = distance(get_node_position(src), get_node_position(dst));

    if (dist == 0) {
      return rxdBm;
    } 
    else if (dist < entitydata->crossover_distance) {
        /* uses friis formula for distance < crossover distance or if (ht == hr == 0) */
        return (rxdBm + 2 * mW2dBm(entitydata->factor / dist));
    } 
    else {
        /* else two-ray ground model is more accurate for distance > crossover distance */
        return (rxdBm + mW2dBm(entitydata->ht * entitydata->ht * 
                               entitydata->hr * entitydata->hr / pow(dist, 4.0)));
    }
}
Exemple #3
0
/* ************************************************** */
int init(call_t *c, void *params) {
    struct entitydata *entitydata = malloc(sizeof(struct entitydata));
    param_t *param;
    double frequency = 868;

    /* default values */
    entitydata->pathloss   = 2.0;

    /* get parameters */
    das_init_traverse(params);
    while ((param = (param_t *) das_traverse(params)) != NULL) {
        if (!strcmp(param->key, "frequency_MHz")) {
            if (get_param_double(param->value, &(frequency))) {
                goto error;
            }
        }
        if (!strcmp(param->key, "pathloss")) {
            if (get_param_double(param->value, &(entitydata->pathloss))) {
                goto error;
            }
        }
    }
    
    /*
     * Compute attenuation at reference distance d=1 with reference power Pt=1 :
     *
     *           Pt * Gt * Gr * lambda^2
     *  Pr(d) = -------------------------
     *             (4 * pi * d)^2 * L
     *
     *  Note: rxmW = Pt * Gt * Gr, and L = 1
     *
     *  cf p71 ref "Wireless Communications: Principles and Practice", Theodore Rappaport, 1996.
     *
     */
    entitydata->Pr0 = mW2dBm((300 / (4 * M_PI * frequency)) * (300 / (4 * M_PI * frequency)));
    
    set_entity_private_data(c, entitydata);
    return 0;

 error:
    free(entitydata);
    return -1;
}
/* ************************************************** */
double compute_freespace(struct entitydata *entitydata, nodeid_t src, nodeid_t dst, double rxdBm) {
    /*
     *           Pt * Gt * Gr * lambda^2
     *  Pr(d) = -------------------------
     *             (4 * pi * d)^2 * L
     *
     *  Note: rxdBm = [Pt + Gt + Gr]_dBm, and L = 1
     *
     *  cf p71 ref "Wireless Communications: Principles and Practice", Theodore Rappaport, 1996.
     *
     */
    double dist = distance(get_node_position(src), get_node_position(dst));

    if (dist == 0) {
      return (rxdBm);
    } else {
      return (rxdBm + 2 * mW2dBm(entitydata->factor / dist));
    }
}
/* ************************************************** */
double compute_logdistance_pathloss(struct entitydata *entitydata, nodeid_t src, nodeid_t dst, double rxdBm) {
    /*
     *  Pr_dBm(d) = Pr_dBm(d0) - 10 * beta * log10(d/d0)
     *
     *  Note: rxdBm = [Pt + Gt + Gr]_dBm, and L = 1
     *
     *  cf p102-104 ref "Wireless Communications: Principles and Practice", Theodore Rappaport, 1996.
     *
     */
    double dist;

    if (rxdBm != entitydata->last_rxdBm) {
        entitydata->Pr0  = freespace(entitydata, entitydata->dist0, dBm2mW(rxdBm));
        entitydata->last_rxdBm = rxdBm;
    }

    dist = distance(get_node_position(src), get_node_position(dst));

    return mW2dBm(entitydata->Pr0) - 10.0 * entitydata->pathloss * log10(dist/entitydata->dist0);
}
Exemple #6
0
/* ************************************************** */
double propagation(call_t *c, packet_t *packet, nodeid_t src, nodeid_t dst, double rxdBm) {
    struct entitydata *entitydata = get_entity_private_data(c);
    double dist, powerloss_dbm;
    /*
     *  Pr_dBm(d) = Pr_dBm(d0) - 10 * beta * log10(d/d0) + X
     *
     *  Note: rxdBm = [Pt + Gt + Gr]_dBm, L = 1, and X a normal distributed RV (in dBm)
     *
     *  cf p104-105 ref "Wireless Communications: Principles and Practice", Theodore Rappaport, 1996.
     *
     */
    if (rxdBm != entitydata->last_rxdBm) {
        entitydata->Pr0  = freespace(c, packet, entitydata->dist0, dBm2mW(rxdBm));
        entitydata->last_rxdBm = rxdBm;
    }

    dist = distance(get_node_position(src), get_node_position(dst));

    powerloss_dbm = -10.0 * entitydata->pathloss * log10(dist/entitydata->dist0) + normal(0.0, entitydata->deviation);
    
    return mW2dBm(entitydata->Pr0) + powerloss_dbm;
}
/**
 * Retransmit data to nodes
 **/
int worldsens_nodes_rx(call_t *c, packet_t *packet){

    ws_rdv_t *next_rdv   = worldsens_rdv_see_next();

    if(next_rdv->clock  == get_time()){ /* just send data (no rdv)*/
        union _worldsens_pkt pkt_rx;
	
	/* compute sinr */
	double sinr = packet->rxdBm - mW2dBm(*(packet->noise_mW));

	/* put doubles into uint64_t variables for swap */
	uint64_t *prxdBm          = (uint64_t *) &(packet->rxdBm);
	uint64_t *pworldsens_freq = (uint64_t *) &(packet->worldsens_freq);
	uint64_t *psinr           = (uint64_t *) &(sinr);

	/* forge msg */
	pkt_rx.byte_rx.type        =  WORLDSENS_S_BYTE_RX;
	pkt_rx.byte_rx.seq         =  ws_seq++;
	pkt_rx.byte_rx.antenna_id  =  packet->antenna;
	pkt_rx.byte_rx.wsim_mod_id =  packet->worldsens_mod;
	pkt_rx.byte_rx.freq        = *pworldsens_freq;
	pkt_rx.byte_rx.data        = *(packet->data);
	pkt_rx.byte_rx.node_id     =  worldsens_get_wsim_node_id(c->node);
	pkt_rx.byte_rx.power_dbm   = *prxdBm;
	pkt_rx.byte_rx.sinr        = *psinr;

	/* send data */
	worldsens_packet_display(&pkt_rx);
	worldsens_packet_hton   (&pkt_rx);
	if(wsens_srv_msend((char *) &pkt_rx, sizeof(struct _worldsens_s_byte_rx))){
	    return -1;  
	}

	WSNET_S_DBG_DBG("WSNET2:: --> RX (dest ip:%d, data:0x%02x, freq:%ghz, wsim modul:%d, power:%gdbm)\n", worldsens_get_wsim_node_id(c->node), (*(packet->data)) & 0xff, packet->worldsens_freq, packet->worldsens_mod, packet->rxdBm);

	packet_dealloc(packet);

    }

    else { /* program new rdv and send data */
        union _worldsens_pkt pkt_sr_rx;

	/* compute sinr */
	double sinr = packet->rxdBm - mW2dBm(*(packet->noise_mW));

	/* put doubles into uint64_t variables for swap */
	uint64_t *prxdBm          = (uint64_t *) &(packet->rxdBm);
	uint64_t *pworldsens_freq = (uint64_t *) &(packet->worldsens_freq);
	uint64_t *psinr           = (uint64_t *) &(sinr);

	/* update next rdv */    
	ws_nsync = next_rdv->clock;
	ws_nsyncseq++;
	ws_synched = 0;
	ws_rp_updated = 1;

	/* forge msg */
	pkt_sr_rx.byte_sr_rx.type        =  WORLDSENS_S_BYTE_SR_RX;
	pkt_sr_rx.byte_sr_rx.seq         =  ws_seq++;
	pkt_sr_rx.byte_sr_rx.rp_next     =  ws_nsyncseq;
	pkt_sr_rx.byte_sr_rx.rp_duration =  ws_nsync - ws_csync;
	pkt_sr_rx.byte_sr_rx.antenna_id  =  packet->antenna;
	pkt_sr_rx.byte_sr_rx.wsim_mod_id =  packet->worldsens_mod;
	pkt_sr_rx.byte_sr_rx.freq        = *pworldsens_freq;
	pkt_sr_rx.byte_sr_rx.data        = *(packet->data);
	pkt_sr_rx.byte_sr_rx.node_id     =  worldsens_get_wsim_node_id(c->node);
	pkt_sr_rx.byte_sr_rx.power_dbm   = *prxdBm;
	pkt_sr_rx.byte_sr_rx.sinr        = *psinr;

	/* send data */
	worldsens_packet_display(&pkt_sr_rx);
	worldsens_packet_hton   (&pkt_sr_rx);
	if(wsens_srv_msend((char *) &pkt_sr_rx, sizeof(struct _worldsens_s_byte_sr_rx))){
	    return -1;  
	}

	WSNET_S_DBG_DBG("WSNET2:: --> RX (dest ip:%d, data:0x%02x, freq:%ghz, wsim modul:%d, power:%gdbm)\n", worldsens_get_wsim_node_id(c->node), (*(packet->data)) & 0xff, packet->worldsens_freq, packet->worldsens_mod, packet->rxdBm);
	WSNET_S_DBG_DBG("WSNET2:: --> RP (seq: %"PRId64") (rp seq: %"PRId64", period: %"PRId64", rp:%"PRId64")\n", ws_seq - 1, ws_nsyncseq, ws_nsync - ws_csync, ws_nsync);

	packet_dealloc(packet);

    }
    
    return 0;
}