Exemplo n.º 1
0
void do_counter_measurement(void)
{
 extern u16 convert_acceleration_value_to_mgrav(u8 value);
 u8 i;
 u16 accel_data, sum1;
 // Get data from sensor
 bmp_as_get_data(sCounter.xyz);
 for ( i = 0, sum1 = 0; i < 3; i ++ ) {
  accel_data = convert_acceleration_value_to_mgrav(sCounter.xyz[i]);
  // Filter acceleration
#if 0
  accel_data = (u16)((accel_data * 0.2) + (sCounter.data[i] * 0.8));
#endif
  accel_data = (u16)((accel_data * 0.1) + (sCounter.data[i] * 0.9));
  sum1 += accel_data;
  // Store average acceleration
  sCounter.data[i] = accel_data;
 }
 if ( sCounter.sum == 0 ) {
     sCounter.low = sum1;
     sCounter.high = sum1;
 } else {
    switch ( sCounter.rise_state) { // init state
    case 0:
        if ( sum1 > sCounter.sum ) {
            sCounter.rise_state = 1;
            sCounter.low = sCounter.sum;
        } else {
            sCounter.rise_state = 2;
            sCounter.high = sCounter.sum;
        }
        break;
    case 1:
    if ( sum1 < sCounter.sum ) { // change direction
       sCounter.high = sCounter.sum;
       sCounter.rise_state = 2;
    }
    break;
    case 2:
        if ( sum1 > sCounter.sum ) {
           sCounter.low = sCounter.sum;
           sCounter.rise_state = 1;
              do_count();
        }
        break;
    }
    }
 sCounter.sum = sum1;
 // Set display update flag
// display.flag.update_counter = 1;
}
Exemplo n.º 2
0
// *************************************************************************************************
// @fn          agile_tick
// @brief       Called by 1Hz clock_tick function. 
// @param       none
// @return      none
// *************************************************************************************************
void agility_tick(void)
{
  // Make sure it is something running before we do anything else
  if (sAgil.state == AGIL_RUN)
  {
      u8 i;

      for(i = 0; i < 3; i++)
      {
          // Get data from sensor
          sAgil.xyz[i] = sAccel.xyz[i];  
          // Save previous data
          sAgil.PreviousData[i] = sAgil.CurrentData[i];
          // Calculate acceleration (result without sign information)
          sAgil.CurrentData[i] = convert_acceleration_value_to_mgrav(sAgil.xyz[i]) / 10;
          // If acceleraition is negative
          if (acceleration_value_is_positive(sAgil.xyz[i]) == 0) { sAgil.CurrentData[i] *= (-1); }
          // Accumulate (max. increment per sec is about 3 * 2000 / 10 / 10 = 60)
          sAgil.AgilityIndicator += ( abs(sAgil.PreviousData[i] - sAgil.CurrentData[i]) / 10);
      }
      
      // Decrease timeout counter
      if(sAgil.timeout > 1) 
      {
          sAgil.timeout--;
          // Check timeout of module acceleration.c
          if(sAccel.timeout < ACCEL_TIMEOUT_PREVENTION)
              { 
              // Set acceleration timeout counter to prevent an undesired stop
              sAccel.timeout = ACCEL_TIMEOUT_PREVENTION;
              }
      }
      // Timeout occured; Save current measurement to history; Stop measurement, if number of programmed cycles elapsed.
      else // sAgil.timeout == 1
      { 
          if(sAgil.cycles > 1)
          {
              sAgil.timeout = sAgil.TimeoutSetting;
              sAgil.cycles--;
          }
          else // sAgil.cycles == 1
          {
              sAgil.cycles = 0;
              stop_agility();
          }
      write_agility_history();
      sAgil.AgilityIndicator = 0;
      }
  }
}
Exemplo n.º 3
0
// *************************************************************************************************
// @fn          display_acceleration
// @brief       Display routine.
// @param       u8 line			LINE1
//				u8 update		DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR
// @return      none
// *************************************************************************************************
void display_acceleration(u8 line, u8 update)
{
	u8 * str;
	u8 raw_data;
	u16 accel_data;

	// Show warning if acceleration sensor was not initialised properly
	if (!as_ok)
	{
		display_chars(LCD_SEG_L1_2_0, (u8*)"ERR", SEG_ON);
	}
	else
	{
		// Redraw whole screen
		if (update == DISPLAY_LINE_UPDATE_FULL)	
		{
			{
				// Start acceleration sensor
				if (!is_acceleration_measurement()) 
				{
					// Clear previous acceleration value
					sAccel.data = 0;
					
					// Start sensor
					as_start();
					
					// Set timeout counter
					sAccel.timeout = ACCEL_MEASUREMENT_TIMEOUT;
					
					// Set mode
					sAccel.mode = ACCEL_MODE_ON;
					
					// Start with Y-axis values
					sAccel.view_style = DISPLAY_ACCEL_X;
				}
				
				// Display decimal point
				display_symbol(LCD_SEG_L1_DP1, SEG_ON);
			}
		}
		else if (update == DISPLAY_LINE_UPDATE_PARTIAL)
		{
			// Convert X/Y/Z values to mg
			switch (sAccel.view_style)
			{
				case DISPLAY_ACCEL_X: 	raw_data = sAccel.xyz[0];
										display_char(LCD_SEG_L1_3, 'X', SEG_ON);
										break;
				case DISPLAY_ACCEL_Y: 	raw_data = sAccel.xyz[1];
										display_char(LCD_SEG_L1_3, 'Y', SEG_ON);
										break;
				default: 				raw_data = sAccel.xyz[2];
										display_char(LCD_SEG_L1_3, 'Z', SEG_ON);
										break;
			}
			accel_data = convert_acceleration_value_to_mgrav(raw_data) / 10;
			
			// Filter acceleration
#ifdef FIXEDPOINT
			accel_data = (u16)(((accel_data * 2) + (sAccel.data * 8))/10);
#else
			accel_data = (u16)((accel_data * 0.2) + (sAccel.data * 0.8));
#endif
			
			// Store average acceleration
			sAccel.data = accel_data;	
	
			// Display acceleration in x.xx format
			str = itoa(accel_data, 3, 0);
			display_chars(LCD_SEG_L1_2_0, str, SEG_ON);
			
			// Display sign
			if (acceleration_value_is_positive(raw_data)) 
			{
				display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);
				display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);
			}
			else 
			{
				display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
				display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);
			}
		}
		else if (update == DISPLAY_LINE_CLEAR)
		{
			// Stop acceleration sensor
			as_stop();
	
			// Clear mode
			sAccel.mode = ACCEL_MODE_OFF;
			
			// Clean up display
			display_symbol(LCD_SEG_L1_DP1, SEG_OFF);
			display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);
			display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);	
		}
	}
}