Beispiel #1
0
static int32_t
af_inet_bind_to_port_lt_ceiling(int fd, struct sockaddr *sockaddr,
                                socklen_t sockaddr_len, uint32_t ceiling)
{
#if GF_DISABLE_PRIVPORT_TRACKING
    _assign_port(sockaddr, 0);
    return bind(fd, sockaddr, sockaddr_len);
#else
    int32_t ret = -1;
    uint16_t port = ceiling - 1;
    unsigned char ports[GF_PORT_ARRAY_SIZE] = {
        0,
    };
    int i = 0;

loop:
    ret = gf_process_reserved_ports(ports, ceiling);

    while (port) {
        if (port == GF_CLIENT_PORT_CEILING) {
            ret = -1;
            break;
        }

        /* ignore the reserved ports */
        if (BIT_VALUE(ports, port)) {
            port--;
            continue;
        }

        _assign_port(sockaddr, port);

        ret = bind(fd, sockaddr, sockaddr_len);

        if (ret == 0)
            break;

        if (ret == -1 && errno == EACCES)
            break;

        port--;
    }

    /* In case if all the secure ports are exhausted, we are no more
     * binding to secure ports, hence instead of getting a random
     * port, lets define the range to restrict it from getting from
     * ports reserved for bricks i.e from range of 49152 - 65535
     * which further may lead to port clash */
    if (!port) {
        ceiling = port = GF_CLNT_INSECURE_PORT_CEILING;
        for (i = 0; i <= ceiling; i++)
            BIT_CLEAR(ports, i);
        goto loop;
    }

    return ret;
#endif /* GF_DISABLE_PRIVPORT_TRACKING */
}
Beispiel #2
0
void vmcs_write_nmi_window_bit(struct _VMCS_OBJECT *vmcs, BOOLEAN value)
{
    vmcs_update(vmcs, VMCS_CONTROL_VECTOR_PROCESSOR_EVENTS,
                FALSE == value ? 0 : (UINT64) -1, BIT_VALUE(NMI_WINDOW_BIT));
    if (value)
        nmi_window_set();
    else
        nmi_window_clear();
}
Beispiel #3
0
static int bitmap_is_set(struct vbfs_bitmap *bitmap, size_t bit)
{
	uint32_t *bm = NULL;
	uint32_t value = 0;

	bm = bitmap->bitmap;
	bm += UNIT_OFFSET(bit);

	value = le32_to_cpu(*bm);

	return !!(value & BIT_VALUE(bit));
}
Beispiel #4
0
int bitmap_set_bit(struct vbfs_bitmap *bitmap, size_t bit)
{
	uint32_t *bm = NULL;
	uint32_t value = 0;

	if (bitmap->max_bit <= bit)
		return -1;

	bm = bitmap->bitmap;
	bm += UNIT_OFFSET(bit);

	value = le32_to_cpu(*bm);
	value |= BIT_VALUE(bit);
	*bm = le32_to_cpu(value);

	return 0;
}
/**@brief Function for decoding a ITU Sensor Service Configuration.
 *
 * @param[in]   p_iss			         ITU Sensor Service structure
 * @param[out]  p_encoded_buffer   Buffer where the encoded data will be written.
 *
 * @return      Size of encoded data.
 */
static void its_conf_decode(iss_t * p_iss,uint16_t data_length, uint8_t * data)
{
		if(data_length > 0){		
			//p_iss->gatt_db_needs_cleaning = true;
			uint8_t data_bits = data[0];
			//if(BIT_VALUE(data_bits,ITS_MEAS_FLAG_OVERRIDE_BIT_PLACEMENT)){
					//OVERRIDE.. Client wants to set new values
					if(data_length > 1){
						
						uint8_t i = 1;
						
						//Check if Seq. nr. is set	
						if(BIT_VALUE(data_bits,ITS_MEAS_FLAG_SPACE_TIME_BIT_PLACEMENT)){
							p_iss->coord = data[i];	
							i++;
							p_iss->curr_seq_nr = uint16_decode(&data[i]);	
							i += 2;
						}
					
						//Check if Unit is set	
						if(BIT_VALUE(data_bits,ITS_MEAS_FLAG_UNIT_BIT_PLACEMENT)){
								p_iss->unit = uint16_decode(&data[i]);
								i += 2;
						}
						
						//Check if Type is set	
						if(BIT_VALUE(data_bits,ITS_MEAS_FLAG_TYPE_MAKE_BIT_PLACEMENT)){
								p_iss->type = data[i];
								i++;
								p_iss->make = data[i];
								i++;
						}
											
						//Check if ID is set	
						if(BIT_VALUE(data_bits,ITS_MEAS_FLAG_ID_BIT_PLACEMENT)){
								p_iss->ID = uint16_decode(&data[i]);
								i += 2;
						}
						
						//Check if Sampling freq. is set	
						if(BIT_VALUE(data_bits,ITS_MEAS_FLAG_SAMP_FREQ_BIT_PLACEMENT)){
								p_iss->samp_freq_in_m_sec = uint32_decode(&data[i]);
								p_iss->p_update_samp_freq();
						}
					}					
			/*}else{
				//set presentation			
				
				// SET Space + Time
				p_iss->space_time_present = BIT_VALUE(data_bits,ITS_MEAS_FLAG_SPACE_TIME_BIT_PLACEMENT);
				
				//SET Unit	
				p_iss->unit_present = BIT_VALUE(data_bits,ITS_MEAS_FLAG_UNIT_BIT_PLACEMENT);
				
				//SET Type	
				p_iss->type_make_present = BIT_VALUE(data_bits,ITS_MEAS_FLAG_TYPE_MAKE_BIT_PLACEMENT);
				
				//SET ID	
				p_iss->ID_present = BIT_VALUE(data_bits,ITS_MEAS_FLAG_ID_BIT_PLACEMENT);
				
				//SET Sampling freq.	
				p_iss->samp_freq_present = BIT_VALUE(data_bits,ITS_MEAS_FLAG_SAMP_FREQ_BIT_PLACEMENT);
			}
			
			uint16_t data_len = MAX_HTM_LEN;
			uint8_t data_buf[MAX_HTM_LEN];
			memset(data_buf, 0, sizeof(data_buf));
			data_len = its_conf_encode(p_iss, data_buf);
			sd_ble_gatts_value_set(p_iss->meas_conf_handles.value_handle,
																			0,
																			&data_len,
																			data_buf);*/
		}
}
Beispiel #6
0
//------------------------------------------------------------------------------
// Process all messages for this driver.
int MotorDriver::ProcessMessage( QueuePointer& respQueue,
                                player_msghdr* pHeader, void* pData )
{   
    // New motor command - velocity
    if( Message::MatchMessage( pHeader, PLAYER_MSGTYPE_CMD, 
                           PLAYER_POSITION3D_CMD_SET_VEL, 
                           this->device_addr ) )
    {
        player_position3d_cmd_vel_t* pCmd = (player_position3d_cmd_vel_t*)pData;
        
       
        F32 depthSpeed = MOTOR_PER*MAX( -1.0f, MIN( (F32)pCmd->vel.pz, 1.0f ) );
        F32 normalisedFrontPWM = (depthSpeed + 1.0f)/2.0f;

        S32 frontDuty = MIN_DUTY_CYCLE_US 
            + (U32)((MAX_DUTY_CYCLE_US-MIN_DUTY_CYCLE_US)*normalisedFrontPWM);
        
        F32 PITCH_MOTER_PER = 0.5;
        F32 pitchSpeed = PITCH_MOTER_PER*MAX( -1.0f, MIN( (F32)pCmd->vel.ppitch, 1.0f ) );
        F32 normalisedBackPWM = (pitchSpeed + 1.0f)/2.0f;
        S32 backDuty = MIN_DUTY_CYCLE_US 
            + (U32)((MAX_DUTY_CYCLE_US-MIN_DUTY_CYCLE_US)*normalisedBackPWM);
            
        F32 linearSpeed = MAX( -1.0f, MIN( (F32)pCmd->vel.px, 1.0f ) );
        F32 yawSpeed = MAX( -1.0f, MIN( (F32)pCmd->vel.pyaw, 1.0f ) );
        F32 leftSpeed = MOTOR_PER*MAX( -1.0f, MIN( linearSpeed + yawSpeed, 1.0f ) );
        F32 rightSpeed = MOTOR_PER*MAX( -1.0f, MIN( linearSpeed - yawSpeed, 1.0f ) );
        
//         if ( yawSpeed > 0 )
//         {
//             F32 leftSpeed = MOTOR_PER*MAX( -1.0f, MIN( linearSpeed + yawSpeed, 1.0f ) );
//             F32 rightSpeed = MOTOR_PER*MAX( -1.0f, MIN( linearSpeed, 1.0f ) );       
//         }
//         else
//         {
//             F32 leftSpeed = MOTOR_PER*MAX( -1.0f, MIN( linearSpeed, 1.0f ) );
//             F32 rightSpeed = MOTOR_PER*MAX( -1.0f, MIN( linearSpeed - yawSpeed , 1.0f ) );
//         }   

        F32 normalisedLeftPWM = (leftSpeed + 1.0f)/2.0f;
        F32 normalisedRightPWM = (rightSpeed + 1.0f)/2.0f;
        S32 leftDuty = MIN_DUTY_CYCLE_US 
            + (U32)((MAX_DUTY_CYCLE_US-MIN_DUTY_CYCLE_US)*normalisedLeftPWM);
        S32 rightDuty = MIN_DUTY_CYCLE_US 
            + (U32)((MAX_DUTY_CYCLE_US-MIN_DUTY_CYCLE_US)*normalisedRightPWM);
        
        // Offset duty cycles to account for dodgy motor controllers
        leftDuty = MAX( MIN_DUTY_CYCLE_US, MIN( leftDuty + LEFT_PWM_OFFSET, MAX_DUTY_CYCLE_US ) );
        rightDuty = MAX( MIN_DUTY_CYCLE_US, MIN( rightDuty + RIGHT_PWM_OFFSET, MAX_DUTY_CYCLE_US ) );
        frontDuty = MAX( MIN_DUTY_CYCLE_US, MIN( frontDuty + FRONT_PWM_OFFSET, MAX_DUTY_CYCLE_US ) );
        backDuty = MAX( MIN_DUTY_CYCLE_US, MIN( backDuty + BACK_PWM_OFFSET, MAX_DUTY_CYCLE_US ) );
        
        //printf( "Depth speed: %2.3f, Pitch speed: %2.3f, yawSpeed %2.3f\n",
        //        depthSpeed, pitchSpeed, yawSpeed );
        
        //printf( "Seting PWMS %i, %i, %i, %i\n",
        //    leftDuty, rightDuty, frontDuty, backDuty );
        
        if ( mbInitialisedPWM )
        {
            U8 motorControlFlags = (S32)pCmd->state;
            
            if ( BIT_VALUE( motorControlFlags, 3 ) == MOTOR_CONTROLLED )
            {
                //printf( "Send L: %i ", leftDuty );
                pwm_SetPulse( LEFT_MOTOR_CHANNEL, PWM_FREQUENCY_US, leftDuty );
            }
            if ( BIT_VALUE( motorControlFlags, 2 ) == MOTOR_CONTROLLED )
            {
                //printf( "Send R: %i ", rightDuty );
                pwm_SetPulse( RIGHT_MOTOR_CHANNEL, PWM_FREQUENCY_US, rightDuty );
            }
            if ( BIT_VALUE( motorControlFlags, 1 ) == MOTOR_CONTROLLED )
            {
                //printf( "Send F: %i ", frontDuty );
                pwm_SetPulse( FRONT_MOTOR_CHANNEL, PWM_FREQUENCY_US, frontDuty );
            }
            if ( BIT_VALUE( motorControlFlags, 0 ) == MOTOR_CONTROLLED )
            {
                //printf( "Send B: %i ", backDuty );
                pwm_SetPulse( BACK_MOTOR_CHANNEL, PWM_FREQUENCY_US, backDuty );
            }
            
            if ( 15 != motorControlFlags )
            {
                //printf( "\n" );
            }
        }
        
        return 0;
    }
    // Request to enable motor power
    else if( Message::MatchMessage( pHeader, PLAYER_MSGTYPE_REQ, 
                                PLAYER_POSITION3D_REQ_MOTOR_POWER, 
                                this->device_addr ) )
    {
        printf( "Ignoring motor request" );
        Publish( this->device_addr, respQueue, 
            PLAYER_MSGTYPE_RESP_NACK, 
            PLAYER_POSITION3D_REQ_MOTOR_POWER );
        return 0;
    }
    else if ( Message::MatchMessage(
        pHeader, PLAYER_MSGTYPE_DATA, PLAYER_IMU_DATA_STATE, mCompassID ) )
    {
        player_imu_data_state_t* pCompassData = (player_imu_data_state_t*)pData;
        
        mYawCompassAngle = pCompassData->pose.pyaw;
        mPitchCompassAngle = pCompassData->pose.ppitch;
        mRollCompassAngle = pCompassData->pose.proll;
        
        mbCompassAngleValid = true;
        mCompassAngleTimestamp = pHeader->timestamp;
        
        return 0;
    }
    else if ( Message::MatchMessage( pHeader, PLAYER_MSGTYPE_CMD, 
        PLAYER_POSITION3D_CMD_SET_POS, this->device_addr ) )
    {
        // AB: This is a complete abuse of the interface but basically
        // we use this message to set the motor powers directly. 
        // So, motor powers are place in the 'vel' component and are 
        // 'normalised' so -1.0 is full reverse and 1.0 is full forward.
        // Motors are
        // x = left
        // y = right
        // roll = forward
        // pitch = back
        // yaw = Motor control bits (0 == controlled, 1 == uncontrolled)
        
        player_position3d_cmd_pos_t* pCmd = (player_position3d_cmd_pos_t*)pData;

        F32 normalisedLeftPWM = -MOTOR_PER*MAX( -1.0f, MIN( (F32)pCmd->vel.px, 1.0f ) );
        F32 normalisedRightPWM = -MOTOR_PER*MAX( -1.0f, MIN( (F32)pCmd->vel.py, 1.0f ) );
        F32 normalisedFrontPWM = -MOTOR_PER*MAX( -1.0f, MIN( (F32)pCmd->vel.proll, 1.0f ) );
        F32 normalisedBackPWM = -MOTOR_PER*MAX( -1.0f, MIN( (F32)pCmd->vel.ppitch, 1.0f ) );
        
        normalisedLeftPWM = (normalisedLeftPWM + 1.0f)/2.0f;
        normalisedRightPWM = (normalisedRightPWM + 1.0f)/2.0f;
        normalisedFrontPWM = (normalisedFrontPWM + 1.0f)/2.0f;
        normalisedBackPWM = (normalisedBackPWM + 1.0f)/2.0f;
        
        S32 leftDuty = MIN_DUTY_CYCLE_US + (U32)((MAX_DUTY_CYCLE_US-MIN_DUTY_CYCLE_US)*normalisedLeftPWM);
        S32 rightDuty = MIN_DUTY_CYCLE_US + (U32)((MAX_DUTY_CYCLE_US-MIN_DUTY_CYCLE_US)*normalisedRightPWM);
        S32 frontDuty = MIN_DUTY_CYCLE_US + (U32)((MAX_DUTY_CYCLE_US-MIN_DUTY_CYCLE_US)*normalisedFrontPWM);
        S32 backDuty = MIN_DUTY_CYCLE_US + (U32)((MAX_DUTY_CYCLE_US-MIN_DUTY_CYCLE_US)*normalisedBackPWM);

        // Offset duty cycles to account for dodgy motor controllers
        leftDuty = MAX( MIN_DUTY_CYCLE_US, MIN( leftDuty + LEFT_PWM_OFFSET, MAX_DUTY_CYCLE_US ) );
        rightDuty = MAX( MIN_DUTY_CYCLE_US, MIN( rightDuty + RIGHT_PWM_OFFSET, MAX_DUTY_CYCLE_US ) );
        frontDuty = MAX( MIN_DUTY_CYCLE_US, MIN( frontDuty + FRONT_PWM_OFFSET, MAX_DUTY_CYCLE_US ) );
        backDuty = MAX( MIN_DUTY_CYCLE_US, MIN( backDuty + BACK_PWM_OFFSET, MAX_DUTY_CYCLE_US ) );
 
        printf( "Seting PWMS %i, %i, %i, %i\n",
            leftDuty, rightDuty, frontDuty, backDuty );
        
        if ( mbInitialisedPWM )
        {
            S32 motorControlFlags = (S32)pCmd->vel.pyaw;
            
            if ( BIT_VALUE( motorControlFlags, 3 ) == MOTOR_CONTROLLED )
            {
                pwm_SetPulse( LEFT_MOTOR_CHANNEL, PWM_FREQUENCY_US, leftDuty );
            }
            if ( BIT_VALUE( motorControlFlags, 2 ) == MOTOR_CONTROLLED )
            {
                pwm_SetPulse( RIGHT_MOTOR_CHANNEL, PWM_FREQUENCY_US, rightDuty );
            }
            if ( BIT_VALUE( motorControlFlags, 1 ) == MOTOR_CONTROLLED )
            {
                pwm_SetPulse( FRONT_MOTOR_CHANNEL, PWM_FREQUENCY_US, frontDuty );
            }
            if ( BIT_VALUE( motorControlFlags, 0 ) == MOTOR_CONTROLLED )
            {
                pwm_SetPulse( BACK_MOTOR_CHANNEL, PWM_FREQUENCY_US, backDuty );
            }
        }
        return 0;
    }
    else if ( Message::MatchMessage(
        pHeader, PLAYER_MSGTYPE_DATA, PLAYER_POSITION1D_DATA_STATE, mDepthSensorID ) )
    {
        player_position1d_data* pDepthSensorData = (player_position1d_data*)pData;
        mDepthSensorDepth = pDepthSensorData->pos;
           
        mbDepthSensorDepthValid = true;
        mDepthSensorDepthTimestamp = pHeader->timestamp;
        
        return 0;
    }
    
    printf( "Unhandled message\n" );
    return -1;
}
void GTrieNode::readFromFile(FILE *f) {
  int nchilds, i, j, pos, bits, ncond;
  iPair p;
  char aux, buf[MAX_BUF];
  GTrieNode *c;

  if (fgets(buf, MAX_BUF, f)) {
    aux = buf[0]-BASE_FIRST;
    if (BIT_VALUE(aux, 0)) is_graph=true;
    else                   is_graph=false;
    int nbytes = aux>>1;

    pos = 1;

    for (i=0, j=1, nchilds=0; i<nbytes; i++, j*=BASE_FORMAT) {
      aux = buf[pos++]-BASE_FIRST;
      nchilds += int(aux)*j;
    }

    // Connections: outgoing
    aux = buf[pos++]-BASE_FIRST;
    for (i=0, bits=0; i<depth; i++, bits++) {
      if (bits==BASE_BITS) {
	aux = buf[pos++]-BASE_FIRST;
	bits=0;
      }
      if (BIT_VALUE(aux, bits)) out[i] = true;
      else                      out[i] = false;
    }

    // Connections: ingoing
    aux = buf[pos++]-BASE_FIRST;
    for (i=0, bits=0; i<depth; i++, bits++) {
      if (bits==BASE_BITS) {
	aux = buf[pos++]-BASE_FIRST;
	bits=0;
      }
      if (BIT_VALUE(aux, bits)) in[i] = true;
      else                      in[i] = false;
    }

    // Previous Conditions
    aux = buf[pos++]-BASE_FIRST;
    if (aux==0) cond_ok = true;
    else        cond_ok = false;

    if (aux>0) {
      ncond = aux;
      for (i=0; i<ncond; i++) {
	list<iPair> newcond;
	while(1) {
	  aux = buf[pos++]-BASE_FIRST-1;
	  if (aux<0) break;
	  p.first = aux;
	  aux = buf[pos++]-BASE_FIRST-1;
	  p.second = aux;
	  newcond.push_back(p);
	}
	cond.push_back(newcond);
      }
    }
    
    if (buf[pos]!='\n') {
      fprintf(stderr, "ERROR: [%s] !%d!%c!\n", buf, pos, buf[pos]);
      fprintf(stderr,"[%d](%s) |", depth, is_graph?"X":" ");
      for (i=0, bits=0; i<depth; i++, bits++)
	fprintf(stderr,"%s", out[i]?"1":"0");
      fprintf(stderr,"|\n");
    }

    // Conn and nconn variables (was missing)
    for (i=0; i<depth; i++)
      if (out[i] || in[i]) 
      conn[(nconn)++] = i;
    
    
    for (i=0; i<nchilds; i++) {
      c = new GTrieNode(depth+1);
      c->readFromFile(f);
      child.push_back(c);
    }

  }

}