Exemple #1
0
int8_t ker_sys_timer_start(uint8_t tid, int32_t interval, uint8_t type)
{                                                             
	sos_pid_t my_id = ker_get_current_pid();                  

	if( (ker_timer_init(my_id, tid, type) != SOS_OK) ||       
			(ker_timer_start(my_id, tid, interval) != SOS_OK)) {  
		return ker_mod_panic(my_id);                                 
	}                                                         
	return SOS_OK;                                            
}                                                             
Exemple #2
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;
}
Exemple #3
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;
	}
  }
}
Exemple #4
0
static int8_t fetcher_handler(void *state, Message *msg)
{
    switch (msg->type) {
        case MSG_FETCHER_FRAGMENT:
        {
			fetcher_fragment_t *f;
			f = (fetcher_fragment_t*)msg->data;
			f->key = entohs( f->key );
			f->frag_id = entohs(f->frag_id);

			DEBUG_PID(KER_FETCHER_PID,"MSG_FETCHER_FRAGMENT:\n");
			handle_overheard_fragment(msg);
			if(fst == NULL) {
				DEBUG_PID(KER_FETCHER_PID, "NO Request!!!\n");
				return SOS_OK;  //!< no request
			}
			//DEBUG_PID(KER_FETCHER_PID,"calling restart_request_timer()\n");
			restart_request_timer();
			fst->retx = 0;
			//DEBUG_PID(KER_FETCHER_PID,"calling handle_data()\n");
			return handle_data(msg);
		}
		case MSG_FETCHER_REQUEST:
		{
			fetcher_bitmap_t *bmap =
				(fetcher_bitmap_t *) msg->data;
			bmap->key = entohs( bmap->key );

			//! received request from neighbors
			DEBUG("handling request to %d from %d\n", msg->daddr, msg->saddr);
			if(msg->daddr == ker_id()) {
				return handle_request(msg);
			}
			if(fst == NULL) return SOS_OK;  //!< no request
			restart_request_timer();
			fst->retx = 0;
			return SOS_OK;
		}
		case MSG_TIMER_TIMEOUT:
		{
			MsgParam *params = (MsgParam*)(msg->data);
			if(params->byte == FETCHER_REQUEST_TID) {
				//DEBUG("request timeout\n");
				if( no_mem_retry ) {
					send_fetcher_done();
					return SOS_OK;
				}
				handle_request_timeout();
			} else if(params->byte == FETCHER_TRANSMIT_TID) {
				//DEBUG("send fragment timeout\n");
				if( send_state.num_msg_in_queue < FETCHER_MAX_MSG_IN_QUEUE ) {
					send_fragment();
				}
			}
			return SOS_OK;
		}
		case MSG_PKT_SENDDONE:
		{
			if( send_state.num_msg_in_queue > 0 ) {
				send_state.num_msg_in_queue--;
			}
			return SOS_OK;
		}
#ifdef SOS_HAS_EXFLASH
		case MSG_EXFLASH_WRITEDONE:
		{
			ker_free(send_state.fragr);
			send_state.fragr = NULL;
			check_map_and_post();
			return SOS_OK;
		}
		case MSG_EXFLASH_READDONE:
		{

			post_auto(KER_FETCHER_PID,
					KER_FETCHER_PID,
					MSG_FETCHER_FRAGMENT,
					sizeof(fetcher_fragment_t),
					send_state.frag,
					SOS_MSG_RELEASE,
					send_state.dest);
			send_state.frag = NULL;
			return SOS_OK;
		}
#endif
		case MSG_INIT:
		{
			send_state.map = NULL;
			send_state.frag = NULL;
			send_state.fragr = NULL;
			send_state.num_msg_in_queue = 0;	
			ker_msg_change_rules(KER_FETCHER_PID, SOS_MSG_RULES_PROMISCUOUS);
			ker_permanent_timer_init(&(send_state.timer), KER_FETCHER_PID, FETCHER_TRANSMIT_TID, TIMER_REPEAT);
			ker_timer_init(KER_FETCHER_PID, FETCHER_REQUEST_TID, TIMER_ONE_SHOT);
			return SOS_OK;
		}

	}
	return -EINVAL;
}
Exemple #5
0
static int8_t simple_msg_handler(void *state, Message *msg)
{
    app_state_t *s = (app_state_t*)state;

    /** Switch to the correct message handler
     *
     * This module handles three types of messages:
     *
     * \li MSG_INIT to start a timer and allocated a buffer
     *
     * \li MSG_TIMER_TIMEOUT to periodicly write a value to the buffer.  Note
     * that we are expecting that the timer will have timer with ID equal to
     * SIMPLE_TID
     *
     * \li MSG_FINAL to stop the timer and deallocate the buffer
     *
     */
    switch (msg->type){

        case MSG_INIT:
            {
                // I'm alive!
                LED_DBG(LED_GREEN_TOGGLE);

                s->pid = msg->did;
                s->state = (uint8_t *) ker_malloc(sizeof(uint8_t), s->pid);
                *(s->state) = 0;
                
                ker_timer_init(s->pid, SIMPLE_TID, TIMER_REPEAT);
                ker_timer_start(s->pid, SIMPLE_TID, 1000);
                break;
            }


        case MSG_FINAL:
            {
                // Bye bye!
                ker_free(s->state);
                ker_timer_stop(s->pid, SIMPLE_TID);
                break;
            }


        case MSG_TIMER_TIMEOUT:
            {
                MsgParam* params = (MsgParam*)(msg->data);

                if (params->byte == SIMPLE_TID)
                {

                    // Blink the LED
                    if (*(s->state) == 1) {
                        LED_DBG(LED_YELLOW_OFF);
                    } else {
                        LED_DBG(LED_YELLOW_ON);
                    }
                    
                    // Update the state
                    *(s->state) += 1;
                    if (*(s->state) > 1) {
                        *(s->state) = 0;
                    }

                }

                break;
            }

        default:
            return -EINVAL;
    }

    return SOS_OK;
}
Exemple #6
0
static int8_t uart_mod_msg_handler(void *state, Message *msg)
{
    app_state_t *s = (app_state_t*)state;

    switch (msg->type){
        case MSG_INIT:
            {
                s->pid = msg->did;
                uart_mod_bufcnt = 0;
                uart_mod_bufoverflow = 0;
                uart_mod_buf = (uint8_t *)sys_malloc(BUFSIZE);
                DEBUG("Uart Start\n");
                uart_mod_init();
                ker_timer_init(KER_UART_PID, UART_TID, SLOW_TIMER_ONE_SHOT);
                sys_led(LED_YELLOW_ON);
                break;
            }

        case MSG_FINAL:
            {
                sys_timer_stop(UART_TID);
                DEBUG("Uart Stop\n");
                break;
            }


        case MSG_TIMER_TIMEOUT:
            {
              /* Timer fired, should sent out the message to the uart0 now
               * */
              HAS_CRITICAL_SECTION;
              uint8_t *tmpbuf;
              uint8_t tmpbufcnt;

              ENTER_CRITICAL_SECTION();
              tmpbufcnt = uart_mod_bufcnt;
              tmpbuf = (uint8_t *)sys_malloc(tmpbufcnt);
              memcpy(tmpbuf, uart_mod_buf, tmpbufcnt);
              sys_post(DFLT_APP_ID1, MSG_RFID_RESPONSE, tmpbufcnt, tmpbuf, SOS_MSG_RELEASE);
              uart_mod_bufcnt = 0;
              uart_mod_bufoverflow = 0;
              LEAVE_CRITICAL_SECTION();
              sys_led(LED_YELLOW_TOGGLE);
              break;
            }
        case MSG_RFID_COMMAND:
            {
              uint8_t i, msg_len;
              msg_len = msg->len;

              for (i = 0; i < msg_len; i++) {
                USART1_send(*((msg->data)+i));
              }
              break;
            }

            default:
            return -EINVAL;
    }

    return SOS_OK;
}
Exemple #7
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;
}
Exemple #8
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;
}