Esempio n. 1
0
int8_t module(void *state, Message *msg)
#endif
{
  app_state *s = (app_state*) state;
  
  switch (msg->type){
  case MSG_INIT:
	{
	  s->pid = msg->did;
	  if (ker_hipri_int_register(s->pid)==-EINVAL) 
		{
		  post_short(RAGOBOT_CB2BUS_PID, s->pid, MSG_DECKLIGHT6, ON, 0, 0);
		  post_short(RAGOBOT_CB2BUS_PID, s->pid, MSG_LOAD, 0, 0, 0);
		}
	  break;
	}
	
  case MSG_HIPRI_INT:
	{
	  post_short(RAGOBOT_CB2BUS_PID, s->pid, MSG_DECKLIGHT1, TOGGLE, 0, 0);
	  post_short(RAGOBOT_CB2BUS_PID, s->pid, MSG_LOAD, 0, 0, 0);
	  break;
	}
  case MSG_FINAL:
	{
	  ker_timer_stop(s->pid, 0);
	  ker_hipri_int_deregister(s->pid);
	  break;
	}
  }
  
  return SOS_OK;
}
Esempio n. 2
0
static void load_script( uint8_t *script, uint8_t size )
{
    codemem_t cm = ker_codemem_alloc(size, CODEMEM_TYPE_EXECUTABLE);
    ker_codemem_write( cm, THIS_MODULE_ID, script, size, 0);
    ker_codemem_flush( cm, THIS_MODULE_ID);
    post_short(script[0], THIS_MODULE_ID, MSG_LOADER_DATA_AVAILABLE, script[1], cm, 0);
    return;
}
Esempio n. 3
0
void pushbutton_broadcast()
{
  uint8_t i;
  for (i = 0; i < numRegMod; i++) 
	{
	  post_short(registered_modules[i], registered_modules[i], MSG_PUSHBUTTON_PRESSED, 0, 0, SOS_MSG_HIGH_PRIORITY);
	}
}
Esempio n. 4
0
static int8_t module(void *state, Message *msg)
{
	app_state_t *s = (app_state_t*) state;

	switch (msg->type)
	  {
	  case MSG_INIT:
		{
		  s->pid = msg->did;
		  s->count = 0;
		  s->state[0] = MOTOR_FULL_SPEED;
		  s->state[1] = RGT_REV_NORMAL;
		  s->state[2] = LFT_REV_NORMAL;
		  s->state[3] = LFT_STOP;
		  s->state[4] = RGT_STOP;
		  
		  ker_timer_init(s->pid, MCONTROL_TEST_TIMER, TIMER_REPEAT);
		  ker_timer_start(s->pid, MCONTROL_TEST_TIMER, TIMER_INTERVAL);
		  
		  break;
		}
	
	  case MSG_TIMER_TIMEOUT:
		{
		  post_short(RAGOBOT_CB2BUS_PID, s->pid, MSG_BARBINARY, 0, s->state[s->count], 0);
		  post_short(RAGOBOT_CB2BUS_PID, s->pid, MSG_LOAD, 0, 0, 0);
		  post_short(RAGOBOT_MCONTROL_PID, s->pid, MSG_CHANGE_SPEED, s->state[s->count], 0, 0);
		  
		  s->count = (s->count+1) % 5;
		  break;
		}
		case MSG_FINAL:
		  {
			ker_timer_stop(s->pid, 0);
			break;
		  }
	  }
  
	return SOS_OK;
}
Esempio n. 5
0
/**
 * Send MSG_I2C_SEND_DONE
 */
void i2c_send_done(uint8_t status) {

	// figure out if we have someone to send this message to
	if ((i2c_sys.calling_mod_id != NULL_PID) &&
			(((i2c_sys.state == I2C_SYS_MASTER_TX) && (status & I2C_SYS_MASTER_FLAG)) || ((i2c_sys.state == I2C_SYS_SLAVE_TX)))) {
		/* bus was reserved by someone AND
		 * bus reserved as master and a send was requested, packet transmited as a master
		 * OR bus reserved as slave and a send was requested */
		
		if (status & I2C_SYS_ERROR_FLAG) {
			post_short(i2c_sys.calling_mod_id, I2C_PID, MSG_I2C_SEND_DONE, 0, 0, SOS_MSG_SEND_FAIL|SOS_MSG_HIGH_PRIORITY);
		} else if(status & I2C_SYS_RX_PEND_FLAG) {
			// This is the result of a read request done sending the destination
			// address and now waiting for the read done
			i2c_sys.state = (i2c_sys.flags & I2C_SYS_MASTER_FLAG)?I2C_SYS_MASTER_RX:I2C_SYS_SLAVE_RX;
			return;
		} else {
			post_short(i2c_sys.calling_mod_id, I2C_PID, MSG_I2C_SEND_DONE, 0, 0, SOS_MSG_HIGH_PRIORITY);
		}
		i2c_sys.state = (i2c_sys.flags & I2C_SYS_MASTER_FLAG)?I2C_SYS_MASTER_WAIT:I2C_SYS_SLAVE_WAIT;
	}
}
Esempio n. 6
0
SOS_MODULE
int8_t module(void *state, Message *msg)
#endif
{
	app_state *s = (app_state*) state;
	MsgParam *p = (MsgParam*)(msg->data);

	switch (msg->type)
	{
		case MSG_INIT:
		{
			s->pid = msg->did;
			s->count = 0;
			s->state[0] = MOTOR_FULL_SPEED;
			s->state[1] = RGT_REV_NORMAL;
			s->state[2] = LFT_REV_NORMAL;
			s->state[3] = LFT_STOP;
			s->state[4] = RGT_STOP;
	  
			ker_timer_start(s->pid, MCONTROL_TEST_TIMER, TIMER_REPEAT, TIMER_INTERVAL);
	  
	  		break;
		}
	
		case MSG_TIMER_TIMEOUT:
		{
			post_short(RAGOBOT_MCONTROL_PID, s->pid, MSG_CHANGE_SPEED, s->state[s->count], 0, 0);
		
			s->count = (s->count+1) % 5;
			break;
		}
		case MSG_FINAL:
		{
			ker_timer_stop(s->pid, 0);
			break;
		}
	}
  
	return SOS_OK;
}
Esempio n. 7
0
/**
 * Send MSG_SPI_SEND_DONE
 */
void spi_send_done(uint8_t length, uint8_t status) {

	// always un chip select 
	if (s.flags & SPI_SYS_CS_HIGH_FLAG) {
		spi_cs_release_high(s.addr);
	} else {
		spi_cs_release_low(s.addr);
	}

	// read will be initiated async. by driver or in callback
	if (s.flags & SPI_SYS_READ_PENDING_FLAG) {
		s.state = SPI_SYS_RX_WAIT;
		if (s.flags & SPI_SYS_SEND_DONE_CB_FLAG) {
			s.send_done_cb(length, s.cnt, status);
		}
	} else {
		if (s.flags & SPI_SYS_SEND_DONE_CB_FLAG) {
			s.send_done_cb(length, s.cnt, status);
		} else {
			post_short(s.calling_mod_id, SPI_PID, MSG_SPI_SEND_DONE, 0, 0,  SOS_MSG_HIGH_PRIORITY);
		}
		ker_spi_release_bus(SPI_PID);
	}
}
Esempio n. 8
0
static int8_t module(void *state, Message *msg)
{
  inertialsensor_state_t *s = (inertialsensor_state_t*)state;
  uint8_t *data;
  switch (msg->type){

  case MSG_INIT:
	{  	 
	  s->state = SEND_SETUP; 
	  ACCSENSOR_ENABLE();
	  MAGSENSOR_ENABLE();
	  s->write_data[0] = INTREF_AIN_AUTOSHTDWN;
	  ker_timer_init(RAGOBOT_INERTIALSENSOR_PID, 0, TIMER_ONE_SHOT);
	  MAGSENSOR_RESET();
	  if (ker_i2c_send_data(I2C_EXT_ADC_ADDR, s->write_data, 1, RAGOBOT_INERTIALSENSOR_PID) != SOS_OK) 
			{ 
			  //if i2c bus busy, retry later.
			  s->state = RETRY_SEND_SETUP;
			  ker_timer_start(RAGOBOT_INERTIALSENSOR_PID, 0, RETRY_TIMEOUT);
			}
	  return SOS_OK;
	}

	//-------------------------------------------------------------------------
	// Restart timer timeout called from timer to rehandle exception
	// Arguments: none
	//-------------------------------------------------------------------------

  case MSG_TIMER_TIMEOUT:
	{ 
	  if (s->state == RETRY_SEND_SETUP)
	  	{
		  s->state = SEND_SETUP;
		  if (ker_i2c_send_data(I2C_EXT_ADC_ADDR, s->write_data, 1, RAGOBOT_INERTIALSENSOR_PID) != SOS_OK) 
			{ 
			  //if i2c bus busy, retry later.
			  s->state = RETRY_SEND_SETUP;
			  ker_timer_start(RAGOBOT_INERTIALSENSOR_PID, 0, RETRY_TIMEOUT);
			}
		}
	  else if (s->state == RETRY_SCAN) 
		{
		  s->state = SCANNING;
		  if (ker_i2c_send_data(I2C_EXT_ADC_ADDR, s->write_data, 1, RAGOBOT_INERTIALSENSOR_PID) != SOS_OK) 
			{ 
			  //if i2c bus busy, retry later.
			  s->state = RETRY_SCAN;
			  ker_timer_start(RAGOBOT_INERTIALSENSOR_PID, 0, RETRY_TIMEOUT);
			}
		}
	  else if (s->state == RETRY_READ) 
		{
		  s->state = READING;
		  if ((ker_i2c_read_data(I2C_EXT_ADC_ADDR, 6, RAGOBOT_INERTIALSENSOR_PID)) != SOS_OK) // read 6 bytes
			{
			  //if i2c bus is busy, then wait until it is free.
			  s->state = RETRY_READ;
			  ker_timer_start(RAGOBOT_INERTIALSENSOR_PID, 0, RETRY_TIMEOUT);
			}
		}
	  return SOS_OK;
	}
  case MSG_GET_ACC_READINGS:
	{
	  if (s->state != IDLE)
		{ 
		  return -EBUSY;
		}
	  s->state = SCANNING;
	  s->mode = MSG_GET_ACC_READINGS;
	  s->callingpid = msg->sid;
	  s->write_data[0] = SCAN_UP_ZERO_TO_SGL | CHANNEL5;
	  if (ker_i2c_send_data(I2C_EXT_ADC_ADDR, s->write_data, 1, RAGOBOT_INERTIALSENSOR_PID) != SOS_OK) 
		{ 
		  //if i2c bus busy, retry later.
		  s->state = RETRY_SCAN;
		  ker_timer_start(RAGOBOT_INERTIALSENSOR_PID, 0, RETRY_TIMEOUT);
		}
	  return SOS_OK;
	}
  case MSG_GET_MAG_READINGS:
	  {
		if (s->state != IDLE)
		  { 
			return -EBUSY;
		  }
		s->state = SCANNING;
		s->mode = MSG_GET_MAG_READINGS;
		s->callingpid = msg->sid;
		s->write_data[0] = SCAN_UP_ZERO_TO_SGL | CHANNEL5;
		if (ker_i2c_send_data(I2C_EXT_ADC_ADDR, s->write_data, 1, RAGOBOT_INERTIALSENSOR_PID) != SOS_OK) 
		  { 
			//if i2c bus busy, retry later.
			s->state = RETRY_SCAN;
			ker_timer_start(RAGOBOT_INERTIALSENSOR_PID, 0, RETRY_TIMEOUT);
		  }
		return SOS_OK;
	  }
  case MSG_GET_INERTIAL_READINGS:
	{
	  if (s->state != IDLE)
		{ 
		  return -EBUSY;
		}
	  s->state = SCANNING;
	  s->mode = MSG_GET_INERTIAL_READINGS;
	  s->callingpid = msg->sid;
	  s->write_data[0] = SCAN_UP_ZERO_TO_SGL | CHANNEL5;
	  if (ker_i2c_send_data(I2C_EXT_ADC_ADDR, s->write_data, 1, RAGOBOT_INERTIALSENSOR_PID) != SOS_OK) 
		{ 
		  //if i2c bus busy, retry later.
		  s->state = RETRY_SCAN;
		  ker_timer_start(RAGOBOT_INERTIALSENSOR_PID, 0, RETRY_TIMEOUT);
		}
	  return SOS_OK;
	}
	//-------------------------------------------------------------------------
	// called from lower level after sending is done
	// we send command to read data back
	// Arguments: none
	//-------------------------------------------------------------------------
  case MSG_I2C_SEND_DONE:
	{
	  if (s->state == SEND_SETUP)
		{
		  s->state = IDLE;
		}
	  else if (s->state == SCANNING) 
		{
		  s->state = READING;
		  if ((ker_i2c_read_data(I2C_EXT_ADC_ADDR, 12, RAGOBOT_INERTIALSENSOR_PID)) != SOS_OK) // read 12 bytes
			{
			  //if i2c bus is busy, then wait until it is free.
			  s->state = RETRY_READ;
			  ker_timer_start(RAGOBOT_INERTIALSENSOR_PID, 0, RETRY_TIMEOUT);
			}	  
		}
	  return SOS_OK;			
	}
	//-------------------------------------------------------------------------
	// post_long function, data is back from lower level
	// we store the data and signal up
	// Arguments: data, the second and third byte is the first adc value
	//-------------------------------------------------------------------------

  case MSG_I2C_READ_DONE:
	{
	  s->state = IDLE;
	  data = (uint8_t*) msg->data; //(((uint8_t*)(msg->data)) + 1); // the first byte is something else
	  if (msg->len != 12)
		{
		  if (s->mode == MSG_GET_ACC_READINGS)
			{
			  post_short(s->callingpid, RAGOBOT_INERTIALSENSOR_PID, MSG_GET_ACC_READINGS_FAIL, 0, 0, 0);
			}
		  else if (s->mode == MSG_GET_MAG_READINGS)
			{
			  post_short(s->callingpid, RAGOBOT_INERTIALSENSOR_PID, MSG_GET_MAG_READINGS_FAIL, 0, 0, 0);
			}
		  else if (s->mode == MSG_GET_INERTIAL_READINGS)
			{
			  post_long(s->callingpid, RAGOBOT_INERTIALSENSOR_PID, MSG_GET_INERTIAL_READINGS_DONE, sizeof(s->readings), s->readings, 0);
			}
		  
		  return SOS_OK;
		}

	  s->readings[0] = (((uint16_t)(data[0] & 0x03)) << 8) | (uint16_t) (data[1]);
	  s->readings[1] = (((uint16_t)(data[2] & 0x03)) << 8) | (uint16_t) (data[3]);
	  s->readings[2] = (((uint16_t)(data[4] & 0x03)) << 8) | (uint16_t) (data[5]);
	  s->readings[3] = (((uint16_t)(data[6] & 0x03)) << 8) | (uint16_t) (data[7] & 0xFC);
	  s->readings[4] = (((uint16_t)(data[8] & 0x03)) << 8) | (uint16_t) (data[9] & 0xFC);
	  s->readings[5] = (((uint16_t)(data[10] & 0x03)) << 8) | (uint16_t) (data[11] & 0xFC);
		
	  if (s->mode == MSG_GET_ACC_READINGS)
		{
		  post_long(s->callingpid, RAGOBOT_INERTIALSENSOR_PID, MSG_GET_ACC_READINGS_DONE, 6, (s->readings)+3, 0);
		}
	  else if (s->mode == MSG_GET_MAG_READINGS)
		{
		  post_long(s->callingpid, RAGOBOT_INERTIALSENSOR_PID, MSG_GET_MAG_READINGS_DONE, 6, s->readings, 0);
		}
	  else if (s->mode == MSG_GET_INERTIAL_READINGS)
		{
		  post_long(s->callingpid, RAGOBOT_INERTIALSENSOR_PID, MSG_GET_INERTIAL_READINGS_DONE, sizeof(s->readings), s->readings, 0);
		}
	  return SOS_OK;
	}

  case MSG_FINAL:
  default:
	{
	  return SOS_OK;
	}
  }
}
Esempio n. 9
0
/**
 * Send MSG_SPI_READ_DONE
 */
void spi_read_done(uint8_t *buff, uint8_t length, uint8_t status) {
	
	if (s.flags & SPI_SYS_CS_HIGH_FLAG) {
		spi_cs_release_high(s.addr);
	} else {
		spi_cs_release_low(s.addr);
	}

	if((NULL == buff) && (NULL_PID != s.calling_mod_id)) {
		post_short(
				s.calling_mod_id,
				SPI_PID,
				MSG_ERROR,
				SPI_READ_ERROR,
				0,
				SOS_MSG_HIGH_PRIORITY);
		return;
	}

	if (NULL == buff) {
		return;
	}

	if (s.len == length) {
		s.cnt--;
		if (s.cnt > 0) {
			s.bufPtr += s.len;
			s.state = SPI_SYS_DMA_WAIT;
		} else {
			// read done send response
			if (s.flags & SPI_SYS_READ_DONE_CB_FLAG) {
				s.read_done_cb(s.usrBuf, length, s.cnt, status);
			} else {

				if (s.flags & SPI_SYS_SHARED_MEM_FLAG) {
					post_long(
							s.calling_mod_id,
							SPI_PID,
							MSG_SPI_READ_DONE,
							length, // read length
							s.usrBuf, // return the buffer pointer
							SOS_MSG_HIGH_PRIORITY);

				} else {
					// dont trust the user to free the memory to message only if not shared
					post_long(
							s.calling_mod_id,
							SPI_PID,
							MSG_SPI_READ_DONE,
							length, // byte length
							s.usrBuf,
							SOS_MSG_RELEASE|SOS_MSG_HIGH_PRIORITY);
				}
			}
			/*if (s.flags & SPI_SYS_SHARED_MEM_FLAG) {
				ker_free(s.usrBuf);
			}*/
			s.usrBuf = NULL;
			s.bufPtr = NULL;
		}
		s.state = SPI_SYS_WAIT;
	} else { // short message
		post_short(
				s.calling_mod_id,
				SPI_PID,
				MSG_ERROR,
				SPI_READ_ERROR,
				0,
				SOS_MSG_HIGH_PRIORITY);

		if (!(s.flags & SPI_SYS_SHARED_MEM_FLAG)) {
			ker_free(s.usrBuf);
		}
		spi_system_init();
	}

	if (!(s.flags & SPI_SYS_LOCK_BUS_FLAG)) {
		ker_spi_release_bus(s.calling_mod_id);
	}
}
Esempio n. 10
0
int8_t module(void *state, Message *msg)
#endif
{
  compass_state *s = (compass_state*)state;
  
  switch (msg->type)
  {
  	case MSG_INIT:
	{
		s->pid = msg->did;
		return SOS_OK;
	}
	case MSG_GET_HEADING:
	{
		post_short(RAGOBOT_MAG_SENSOR_PID, RAGOBOT_COMPASS_PID, TSK_READ_COMPASS, 0, 0, 0);
		return SOS_OK;		
	}
	case MSG_HEADING_READY:
	{
	    uint16_t heading = 0;
	    //  float xsf = 1.0, ysf = 1.1202873, xoff=14.0, yoff=16.8;
	    float xsf=1.0, ysf=1.274, xoff=34.0, yoff=-50.96;
	    float xh = 0, yh = 0;
	    
	    readings * dir = (readings *) msg->data;
	    
	    s->x = dir->x;
	    s->y = dir->y;
	    s->z = dir->z;
	
		//Do the computation for the direction
		xh = ((float)dir->x-650)*xsf + xoff;
		yh = ((float)dir->y-650)*ysf + yoff;
		if(xh >0 )
		{
	  		if(yh < 0)
	  		{
	    		heading = (uint16_t) ( (int16_t) -((atan(yh / xh) * 180.0) / PI));
	  		}
	  		else
	  		{
	    		heading = (uint16_t)(360 - (int16_t) ( (atan(yh / xh) * 180.0) / PI));
	  		}
	  	}
	  	else if(xh == 0)
	  	{
	  	if(yh < 0)
			heading = 90;
		else
	    	heading = 270;
		}
		else //xh < 0
		{ 
	  		heading = (uint16_t)(180 - (int16_t) ( (atan(yh / xh) * 180.0) / PI));
		}
		
		DEBUG("CALCULATED: x=%d y=%d z=%d => heading = %d\n", s->x, s->y, s->z, heading);
		
		return SOS_OK;
    }
    default: return SOS_OK;
  }
} 
Esempio n. 11
0
static int8_t
adcm1700_patch_handler (void *state, Message * msg)
{
  // i2c_msg_state_t *s = (i2c_msg_state_t*)state;
  switch (msg->type)
    {
    case MSG_INIT:
      {
	return SOS_OK;
      }
    case MSG_FINAL:
      {
	patchNumber = 0;
	patchdata_index = 0;
	return SOS_OK;
      }
    case SET_PATCH_DONE:
      {
	return SOS_OK;
      }
			
      //******************* Timer (allows enough time for module to exit run mode) ******
    case MSG_TIMER_TIMEOUT:
      {
	writeBlock (ADCM1700_PATCH_PID, ADCM_REG_PADR1,
		    &patch1700data[patchdata_index],
		    (uint8_t) patch1700len[patchNumber]);
	return SOS_OK;
      }
			
      //***********************Writing and Reading individual Bytes*********************/
    case READ_REGISTER_DONE:
      {
	register_result_t *m = (register_result_t *) (msg->data);
	uint16_t addr = m->reg;
	uint16_t data = m->data;
	uint8_t result = m->status;
			
	//mhr:note that it is ok if the status fails when the device is stll configuring itself since we can not communicate with it in the meantime, we retry
	if ((controlState != CONTROL_STATE_PENDING_CONFIGURATION)
	    && (result != SOS_OK))
	  {
	    post_short (ADCM1700_CONTROL_PID, ADCM1700_PATCH_PID,
			SET_PATCH_DONE, -EINVAL, 0, 0);
	    return -EINVAL;
	  }
	switch (addr)
	  {
	    HAS_CRITICAL_SECTION;
	  case ADCM_REG_STATUS:	//mhr:checking if the device is configured and now ready to be set.
	    if (controlState == CONTROL_STATE_PENDING_CONFIGURATION)
	      {			// part of startup
		if (result == SOS_OK)
		  {
		    if (data & ADCM_STATUS_CONFIG_MASK)	// still configuring, check again.  Should probably add a delay
		      readRegister (ADCM1700_PATCH_PID, ADCM_REG_STATUS);
		    else	// it is now configured, we officialy go the mode to set different registers of the device.
		      {
			ENTER_CRITICAL_SECTION ();
			{
			  controlState = CONTROL_STATE_SETTING_DEVICE;
			}
			LEAVE_CRITICAL_SECTION ();
			//atomic controlState = CONTROL_STATE_SETTING_DEVICE;
			readRegister (ADCM1700_PATCH_PID, ADCM_REG_ID);
		      }
		  }
		else
		  readRegister (ADCM1700_PATCH_PID, ADCM_REG_STATUS);
	      }
	    break;
	  case ADCM_REG_ID:	//checking if we have the right imager
	    if (controlState == CONTROL_STATE_SETTING_DEVICE)
	      {
		// continue with startup intialization, stop the imager to re-configure it. CONTROL register is read first and the RUN bit is turned off
		if ((ADCM_ID_MASK & data) == (ADCM_ID_MASK & ADCM_ID_1700))
		  readRegister (ADCM1700_PATCH_PID, ADCM_REG_CONTROL);
		// had a failure (incorrect module ID)
		else
		  {
		    post_short (ADCM1700_CONTROL_PID, ADCM1700_PATCH_PID,
				SET_PATCH_DONE, -EINVAL, 0, 0);
		    return -EINVAL;
		  }
	      }
	    break;
	  case ADCM_REG_CONTROL:
	    switch (controlState)
	      {
	      case CONTROL_STATE_SETTING_DEVICE:	// clear the RUN bit and write it out
		writeRegister (ADCM1700_PATCH_PID, ADCM_REG_CONTROL,
			       (data & ~ADCM_CONTROL_RUN_MASK));
		break;
	      case CONTROL_STATE_END:	// Bring the new configuration online by setting the CONFIG bit in the CONTROL register                         
		ENTER_CRITICAL_SECTION ();
		{
		  controlState = CONTROL_STATE_START_CFG;
		}
		LEAVE_CRITICAL_SECTION ();
		//atomic controlState = CONTROL_STATE_START_CFG;
		// was ADCM_CONTROL_CONFIG_MASK:   RLB 3/18/05
		writeRegister (ADCM1700_PATCH_PID, ADCM_REG_CONTROL,
			       (data | ADCM_CONTROL_RUN_MASK));
		break;
	      case CONTROL_STATE_START_CFG:	// initializing the imager, and now bringing the configuration online. check if still configuring. 
		if ((data & ADCM_CONTROL_CONFIG_MASK) == 0)	// CONFIG bit has cleared, we are done 
		  {
		    ENTER_CRITICAL_SECTION ();
		    {
		      controlState = CONTROL_STATE_READY;
		    }
		    LEAVE_CRITICAL_SECTION ();
		    //atomic controlState = CONTROL_STATE_READY;
		    post_short (ADCM1700_CONTROL_PID, ADCM1700_PATCH_PID,
				SET_PATCH_DONE, SOS_OK, 0, 0);
		  }
		else		// re-read and check bit again                                
		  readRegister (ADCM1700_PATCH_PID, ADCM_REG_CONTROL);
	      default:
		break;
	      }
	    break;
	  case ADCM_REG_OUTPUT_CTRL_V:
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_OUTPUT_CTRL_V,
			   (data | ADCM_OUTPUT_CTRL_FRVCLK_MASK |
			    ADCM_OUTPUT_CTRL_FR_OUT_MASK |
			    ADCM_OUTPUT_CTRL_JUST_MASK |
			    ADCM_OUTPUT_FORMAT_Y));
	    break;
	  case ADCM_REG_PROC_CTRL_V:
	    if (controlState == CONTROL_STATE_SETTING_DEVICE)
	      writeRegister (ADCM1700_PATCH_PID, ADCM_REG_PROC_CTRL_V,
			     (data & ~ADCM_PROC_CTRL_NOSIZER));
	    break;
	  default:
	    post_short (ADCM1700_CONTROL_PID, ADCM1700_PATCH_PID,
			SET_PATCH_DONE, -EINVAL, 0, 0);
	    return -EINVAL;
	  }
	return SOS_OK;
      }
			
    case WRITE_REGISTER_DONE:
      {
	register_result_t *m = (register_result_t *) (msg->data);
	uint16_t addr = m->reg;
	//uint16_t data = m->data;
	uint8_t result = m->status;
			
	if (result != SOS_OK)
	  {
	    post_short (ADCM1700_CONTROL_PID, ADCM1700_PATCH_PID,
			SET_PATCH_DONE, -EINVAL, 0, 0);
	    return -EINVAL;
	  }
	switch (addr)
	  {
	    HAS_CRITICAL_SECTION;
	  case ADCM_REG_CONTROL:
	    switch (controlState)
	      {
	      case CONTROL_STATE_SETTING_DEVICE:	// start patching code                                             
		ker_timer_init (ADCM1700_PATCH_PID, PATCH_TID,
				TIMER_ONE_SHOT);
		ker_timer_start (ADCM1700_PATCH_PID, PATCH_TID, 500);
		break;
	      case CONTROL_STATE_END:	// read the register to check for the config bit 
		readRegister (ADCM1700_PATCH_PID, ADCM_REG_CONTROL);
		break;
	      case CONTROL_STATE_START_CFG:
		// just set CONFIG bit, read the register to see if it has been cleared, indicating it is done. callback for this read will check the CONFIG bit
		readRegister (ADCM1700_PATCH_PID, ADCM_REG_CONTROL);
		break;
	      default:
		break;
	      }
	    break;
	  case ADCM_REG_OUTPUT_CTRL_V:
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_CLK_PER, 0x0FA0);	// 4 MHz (4,000 kHz)
	    break;
	  case ADCM_REG_CLK_PER:
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_AE2_ETIME_MIN, 0x0001);	// 10 microseconds
	    break;
	  case ADCM_REG_AE2_ETIME_MIN:
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_AE2_ETIME_MAX, 0xC350);	// 0.5 seconds
	    break;
	  case ADCM_REG_AE2_ETIME_MAX:
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_AE_GAIN_MAX, 0x0F00);	// analog gain = 15
	    break;
	  case ADCM_REG_AE_GAIN_MAX:
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_AF_CTRL1, 0x0013);	// auto functions activated
	    break;
	  case ADCM_REG_AF_CTRL1:
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_AF_CTRL2, 0x0002);	// no overexposure, 60 Hz
	    break;
	  case ADCM_REG_AF_CTRL2:
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_SZR_IN_WID_V,
			   ADCM_SIZE_1700DEFAULT_W);
	    break;
	  case ADCM_REG_SZR_IN_WID_V:	//step sizer:1:9
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_SZR_IN_HGT_V,
			   ADCM_SIZE_1700DEFAULT_H);
	    break;
	  case ADCM_REG_SZR_IN_HGT_V:	//step sizer:2:9
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_SZR_OUT_WID_V,
			   ADCM_SIZE_API_DEFAULT_W);
	    break;
	  case ADCM_REG_SZR_OUT_WID_V:	//step sizer:5:9
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_SZR_OUT_HGT_V,
			   ADCM_SIZE_API_DEFAULT_H);
	    break;
	  case ADCM_REG_SZR_OUT_HGT_V:	//step sizer:6:9
	    readRegister (ADCM1700_PATCH_PID, ADCM_REG_PROC_CTRL_V);
	    break;
	  case ADCM_REG_PROC_CTRL_V:	// set window size: step 8 of 9
	    writeRegister (ADCM1700_PATCH_PID, ADCM_REG_VBLANK_V,
			   ADCM_VBLANK_DEFAULT);
	    break;
	  case ADCM_REG_VBLANK_V:	// set vblank interval: step 9 of 9
					
	    ENTER_CRITICAL_SECTION ();
	    {
	      controlState = CONTROL_STATE_READY;
	    }
	    LEAVE_CRITICAL_SECTION ();
	    //atomic controlState = CONTROL_STATE_READY;
	    post_short (ADCM1700_CONTROL_PID, ADCM1700_PATCH_PID,
			SET_PATCH_DONE, SOS_OK, 0, 0);
	    return SOS_OK;
					
	    break;
	  }
	return SOS_OK;
      }
			
      //***********************Writing and Reading Blocks*********************/
    case WRITE_BLOCK_DONE:
      {
	block_result_t *m = (block_result_t *) (msg->data);
	uint16_t startReg = m->startReg;
	//char *data = m->data;
	//uint8_t length = m->length;
	uint8_t result = m->result;
			
	if (result != SOS_OK)
	  post_short (ADCM1700_CONTROL_PID, ADCM1700_PATCH_PID,
		      SET_PATCH_DONE, -EINVAL, 0, 0);
	switch (startReg)
	  {
	  case ADCM_REG_PADR1:	// write the next patch block 
	    patchdata_index = patchdata_index + patch1700len[patchNumber];
	    ++patchNumber;
	    writeBlock (ADCM1700_PATCH_PID, ADCM_REG_PADR2,
			&patch1700data[patchdata_index],
			(uint8_t) patch1700len[patchNumber]);
	    break;
	  case ADCM_REG_PADR2:	// write the next patch block 
	    patchdata_index = patchdata_index + patch1700len[patchNumber];
	    ++patchNumber;
	    writeBlock (ADCM1700_PATCH_PID, ADCM_REG_PADR3,
			&patch1700data[patchdata_index],
			(uint8_t) patch1700len[patchNumber]);
	    break;
	  case ADCM_REG_PADR3:	// write the next patch block 
	    patchdata_index = patchdata_index + patch1700len[patchNumber];
	    ++patchNumber;
	    writeBlock (ADCM1700_PATCH_PID, ADCM_REG_PADR4,
			&patch1700data[patchdata_index],
			(uint8_t) patch1700len[patchNumber]);
	    break;
	  case ADCM_REG_PADR4:	// write the next patch block 
	    patchdata_index = patchdata_index + patch1700len[patchNumber];
	    ++patchNumber;
	    writeBlock (ADCM1700_PATCH_PID, ADCM_REG_PADR5,
			&patch1700data[patchdata_index],
			(uint8_t) patch1700len[patchNumber]);
	    break;
	  case ADCM_REG_PADR5:	// write the next patch block 
	    patchdata_index = patchdata_index + patch1700len[patchNumber];
	    ++patchNumber;
	    writeBlock (ADCM1700_PATCH_PID, ADCM_REG_PADR6, &patch1700data[patchdata_index], (uint8_t) patch1700len[patchNumber]);	// *** diagnostic ***
	    break;
	  case ADCM_REG_PADR6:	// Patching dine, set data protocol that the CPLD expects,first read the register value and set the new data in the callback
	    readRegister (ADCM1700_PATCH_PID, ADCM_REG_OUTPUT_CTRL_V);
	    break;
	  default:
	    post_short (ADCM1700_CONTROL_PID, ADCM1700_PATCH_PID,
			SET_PATCH_DONE, -EINVAL, 0, 0);
	    break;
	  }
	return SOS_OK;
      }
			
    case READ_BLOCK_DONE:
      {
	return SOS_OK;
      }
			
    default:
      return -EINVAL;
    }
  return SOS_OK;
}
Esempio n. 12
0
static int8_t module(void *state, Message *msg) {
  lightshow_state *s = (lightshow_state*) state;
  MsgParam *p = (MsgParam*)(msg->data);
  uint8_t decklights_count;
  uint8_t bargraph_count; 
  uint8_t headlights_count;
  uint16_t color = BLACK;
  switch (msg->type){
  case MSG_INIT:
	{
	  s->decklights_state = DISABLE; 
	  s->bargraph_state = DISABLE;
	  s->headlights_state = DISABLE;
	  s->light_state = DISABLE;
	  s->count = 0;
	  ker_timer_init(RAGOBOT_LIGHTSHOW_PID, 0, TIMER_REPEAT);
	  break;
	}
  case MSG_LIGHTSHOW_START: 
	{
	  if (s->light_state == DISABLE) 
		{
		  s->light_state = ENABLE;
		  ker_timer_start(RAGOBOT_LIGHTSHOW_PID, 0, 80);
		}
	  break;
	}
  case MSG_TIMER_TIMEOUT:
	{
	  if (s->decklights_state == ENABLE) 
		{
		  decklights_count = s->count % 10;
		  if (decklights_count == 0)
			{
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT3, OFF, 0, 0);  
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT2, ON, 0, 0);
			}
		  else if (decklights_count == 1 || decklights_count == 9)
			{
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT2, OFF, 0, 0);  
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT3, ON, 0, 0);
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT4, OFF, 0, 0);  
			}
		  else if (decklights_count == 2 || decklights_count == 8)
			{
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT3, OFF, 0, 0);  
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT4, ON, 0, 0);
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT5, OFF, 0, 0); 
			}
		  else if (decklights_count == 3 || decklights_count == 7)
			{
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT4, OFF, 0, 0);  
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT5, ON, 0, 0);
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT6, OFF, 0, 0); 
			}
		  else if (decklights_count == 4 || decklights_count == 6)
			{
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT5, OFF, 0, 0);  
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT6, ON, 0, 0);
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT1, OFF, 0, 0); 
			}
		  else if (decklights_count == 5)
			{
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT6, OFF, 0, 0);  
			  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_DECKLIGHT1, ON, 0, 0);
			}
		}
	  if (s->bargraph_state == ENABLE) 
		{
		  bargraph_count = s->count % 18;
		  if (bargraph_count < 10)
			post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_BARPOSITION, bargraph_count, 0, 0);
		  else 
			post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_BARPOSITION, 18-bargraph_count, 0, 0);
		}
	  
	  if (s->headlights_state == ENABLE)
		{
		  headlights_count = s->count % 8;
		  if (headlights_count == 0)
			color = BLACK;
		  else if  (headlights_count == 2)
			color = GREEN;
		  else if (headlights_count == 4)
			color = ORANGE;
		  else if (headlights_count == 6)
			color = RED;
		  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_HEADLIGHT, FRONT_LEFT, color, 0);
		  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_HEADLIGHT, FRONT_RIGHT, color, 0);
		  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_HEADLIGHT, BACK_LEFT, color, 0);
		  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_HEADLIGHT, BACK_RIGHT, color, 0); 
		}
	  post_short(RAGOBOT_CB2BUS_PID, RAGOBOT_LIGHTSHOW_PID, MSG_LOAD, 0, 0, 0);
	  s->count += 1;
	  break;
	}
  case MSG_LIGHTSHOW_DECKLIGHTS:
	{
	  if (p->byte != ENABLE && p->byte != DISABLE)
		return -EINVAL;
	  s->decklights_state = p->byte;
	  break;
	}
  case MSG_LIGHTSHOW_HEADLIGHTS:
	{
	  if (p->byte != ENABLE && p->byte != DISABLE)
		return -EINVAL;
	  s->headlights_state = p->byte;
	  break;
	}
  case MSG_LIGHTSHOW_BARGRAPH:
	{
	  if (p->byte != ENABLE && p->byte != DISABLE)
		return -EINVAL;
	  s->bargraph_state = p->byte;
	  break;
	}
  case MSG_LIGHTSHOW_STOP: 
  case MSG_FINAL:
	{
	  if (s->light_state == ENABLE) 
		{
		  s->light_state = DISABLE;
		  ker_timer_stop(RAGOBOT_LIGHTSHOW_PID, 0);
		}
	}
  default:
	break;
  }
  
  return SOS_OK;
}
Esempio n. 13
0
/**
 * Send MSG_I2C_READ_DONE
 */
void i2c_read_done(uint8_t *buff, uint8_t len, uint8_t status) {

	uint8_t *bufPtr = NULL;
	Message *msgPtr = NULL;

	// this is a problem that should be handled
	if (buff == NULL) {
		return;
	}

	if ((i2c_sys.calling_mod_id != NULL_PID) && (status & I2C_SYS_ERROR_FLAG)) {
		goto post_error_msg;
	}

	// the bus was reserved the read was of the length we requested
	if ((i2c_sys.calling_mod_id != NULL_PID) && (len == i2c_sys.rxLen) && 
			// the data was recieved in the correct mode
			(((i2c_sys.state == I2C_SYS_MASTER_RX) && (I2C_SYS_MASTER_FLAG & status)) ||
			 ((i2c_sys.state == I2C_SYS_SLAVE_RX) && !(I2C_SYS_MASTER_FLAG & status)))) {

		// reserved read done will only be raw reads, wrap in message and send
		post_long(
				i2c_sys.calling_mod_id,
				I2C_PID,
				MSG_I2C_READ_DONE,
				len,
				buff,
				SOS_MSG_RELEASE|SOS_MSG_HIGH_PRIORITY);
		i2c_sys.state = (i2c_sys.flags & I2C_SYS_MASTER_FLAG)?I2C_SYS_MASTER_WAIT:I2C_SYS_SLAVE_WAIT;
		return;
	}

	// there appers to be a bug in avr-gcc this a work around to make sure
	// the cast to message works correctly
	// the following code seems to cat the value 0x800008 independent of what
	// buff actually ii2c_sys.  this has no correlation to the data in buff or the 
	// value of the pointer the cast (along with many others that should) works
	// in gdb but fail to execute correctly when compilied
	/* bufPtr = &buff[HDLC_PROTOCOL_SIZE]; */

	// DO NOT CHANGE THIS SECTION OF CODE
	// start of section
	bufPtr = buff+1;
	// end of DO NOT CHANGE SECTION
		
	// if it passes sanity checks give it to the scheduler
	if (!(I2C_SYS_MASTER_FLAG & status) && (len >= SOS_MSG_HEADER_SIZE) && (buff[0] == HDLC_SOS_MSG)) {

		if ((len >= (HDLC_PROTOCOL_SIZE + SOS_MSG_HEADER_SIZE + ((Message*)bufPtr)->len + SOS_MSG_CRC_SIZE)) &&
				(len <= I2C_MAX_MSG_LEN)) {

			// please do not edit the next line
			bufPtr = buff;
			// we have enough bytes for it to be a message, lets start the copy out
			// XXX msgPtr = (Message*)ker_malloc(sizeof(Message), I2C_PID);
			msgPtr = msg_create();
			if (msgPtr !=NULL) {
				uint8_t i=0;
				uint16_t runningCRC=0, crc_in=0;

				// extract the protocol field
				for (i=0; i<HDLC_PROTOCOL_SIZE; i++) {
					runningCRC = crcByte(runningCRC, bufPtr[i]);
				}

				// extract the header
				bufPtr = &buff[HDLC_PROTOCOL_SIZE];
				for (i=0; i<SOS_MSG_HEADER_SIZE; i++) {
					((uint8_t*)msgPtr)[i] = bufPtr[i];
					runningCRC = crcByte(runningCRC, bufPtr[i]);
				}

				// extract the data if it exists
				if (msgPtr->len != 0) {
					uint8_t *dataPtr;
					dataPtr = ker_malloc(((Message*)msgPtr)->len, I2C_PID);

					if (dataPtr != NULL) {

						msgPtr->data = dataPtr;

						bufPtr = &buff[HDLC_PROTOCOL_SIZE+SOS_MSG_HEADER_SIZE];
						for (i=0; i<msgPtr->len; i++) {
							msgPtr->data[i] = bufPtr[i];
							runningCRC = crcByte(runningCRC, bufPtr[i]);
						}
					} else { // -ENOMEM
						ker_free(msgPtr);
						goto post_error_msg;
					}
				} else {
					msgPtr->data = NULL;
				}

				// get the CRC and check it
				bufPtr = &buff[HDLC_PROTOCOL_SIZE+SOS_MSG_HEADER_SIZE+msgPtr->len];
				crc_in = bufPtr[0] | (bufPtr[1]<<8);

				if (crc_in == runningCRC) {
					// message passed all sanity checks including crc
					LED_DBG(LED_YELLOW_TOGGLE);
					if(msgPtr->data != NULL ) {
						msgPtr->flag = SOS_MSG_RELEASE;
					}
					handle_incoming_msg(msgPtr, SOS_MSG_I2C_IO);
					return;
				} else { // clean up
					ker_free(msgPtr->data);
					ker_free(msgPtr);
				}
			}
		}
	}

	// if we make it to here return error message
post_error_msg:
	post_short(
			i2c_sys.calling_mod_id,
			I2C_PID,
			MSG_ERROR,
			READ_ERROR,
			0,
			SOS_MSG_HIGH_PRIORITY);
}
Esempio n. 14
0
static int8_t handle_fetcher_done( Message *msg ) 
{
	fetcher_state_t *f = (fetcher_state_t*) msg->data;
	if( is_fetcher_succeed( f ) == true ) {
		//mod_header_ptr p;
		loader_cam_t *cam;
		fetcher_commit(f, true);

		st.blocked = 0;
		restartInterval( 0 );

		cam = ker_cam_lookup( f->map.key );
		if( cam->fetcher.fetchtype == FETCHTYPE_DATA) {
			uint8_t buf[2];
			ker_codemem_read( cam->fetcher.cm, KER_DFT_LOADER_PID, buf, 2, 0);
			post_short(buf[0], KER_DFT_LOADER_PID, MSG_LOADER_DATA_AVAILABLE,
					buf[1], cam->fetcher.cm, 0);
			DEBUG_PID(KER_DFT_LOADER_PID, "Data Ready\n" );
#ifdef LOADER_NET_EXPERIMENT
			ker_led(LED_GREEN_TOGGLE);
#endif
		} else {
		  uint8_t mcu_type;
#ifndef SOS_SIM
		  uint8_t plat_type;
#endif
		  mod_header_ptr p;
#ifdef MINIELF_LOADER
		  // Link and load the module here
		  melf_load_module(cam->fetcher.cm);
#endif//MINIELF_LOADER		  
		  // Get the address of the module header
		  p = ker_codemem_get_header_address( cam->fetcher.cm ); 

		  // get processor type and platform type
		  mcu_type = sos_read_header_byte(p, 
										  offsetof( mod_header_t, processor_type )); 
#ifdef SOS_SIM
		  if( (mcu_type == MCU_TYPE) )
			// In simulation, we don't check for platform
#else
			plat_type = sos_read_header_byte(p, 
											 offsetof( mod_header_t, platform_type )); 
		  if( (mcu_type == MCU_TYPE) && 
			  ( plat_type == HW_TYPE || plat_type == PLATFORM_ANY) )
#endif
			{
			  
			  /*
			   * If MCU is matched, this means we are using the same 
			   * instruction set.
			   * And if this module is for this *specific* platform or 
			   * simply for all platform with the same MCU
			   */
			  // mark module executable
			  ker_codemem_mark_executable( cam->fetcher.cm );
			  if (cam->version & 0x80) {
#ifdef SOS_SFI
#ifdef MINIELF_LOADER
				sfi_modtable_register(cam->fetcher.cm);
				if (SOS_OK == ker_verify_module(cam->fetcher.cm)){
				  sfi_modtable_flash(p);
				  ker_register_module(p);
				}
				else
				  sfi_exception(KER_VERIFY_FAIL_EXCEPTION);
#else				
				uint16_t init_offset, code_size, handler_addr;
				uint32_t handler_byte_addr, module_start_byte_addr;
				uint16_t handler_sfi_addr;
				handler_sfi_addr = sos_read_header_ptr(p, offsetof(mod_header_t, module_handler));
				handler_addr = sfi_modtable_get_real_addr(handler_sfi_addr);				
				handler_byte_addr = (handler_addr * 2);
				module_start_byte_addr = (p * 2);
				init_offset = (uint16_t)(handler_byte_addr - module_start_byte_addr);
				code_size = cam->code_size * LOADER_SIZE_MULTIPLIER;
				if (SOS_OK == ker_verify_module(cam->fetcher.cm, init_offset, code_size)){
				  sfi_modtable_flash(p);				  
				  ker_register_module(p);
				}
				else
				  sfi_exception(KER_VERIFY_FAIL_EXCEPTION);
#endif //MINIELF_LOADER
#else
				ker_register_module(p);
#endif //SOS_SFI
			  }
			}

		}
		process_version_data( st.version_data, st.recent_neighbor);
	} else {
	  DEBUG_PID( KER_DFT_LOADER_PID, "Fetch failed!, request %d\n", st.recent_neighbor);
	  f = (fetcher_state_t*) ker_msg_take_data(KER_DFT_LOADER_PID, msg);
	  fetcher_restart( f, st.recent_neighbor );
	}
	return SOS_OK;
}