Esempio n. 1
0
/*!
 * @brief Run on the main thread to handle new accelerometer data.
 */
void HandleNewAccelData()
{
	if (Accel_GetMode() == ACCEL_INT)
	{
		Packet_Put(0x10, AccReadData[0], AccReadData[1], AccReadData[2]);
		return;
	}

	//Shift history
	ShiftArray(AccelXHistory, 3, AccReadData[0]);
	ShiftArray(AccelYHistory, 3, AccReadData[1]);
	ShiftArray(AccelZHistory, 3, AccReadData[2]);

	uint8_t xMed = Median_Filter3(AccelXHistory[0], AccelXHistory[1], AccelXHistory[2]);
	uint8_t yMed = Median_Filter3(AccelYHistory[0], AccelYHistory[1], AccelYHistory[2]);
	uint8_t zMed = Median_Filter3(AccelZHistory[0], AccelZHistory[1], AccelZHistory[2]);

	if ((xMed != AccelSendHistory[0]) | (yMed != AccelSendHistory[1]) | (zMed != AccelSendHistory[2]))
	{
		AccelSendHistory[0] = xMed;
		AccelSendHistory[1] = yMed;
		AccelSendHistory[2] = zMed;
		(void) CMD_SendAccelerometerValues(AccelSendHistory);
	}
}
Esempio n. 2
0
/**
 * \fn BOOL HandleModConUptime(void)
 * \brief Sends out system uptime in minutes and seconds 
 * \return TRUE if the packet has queued successfully.
 */
BOOL HandleModConUptime(void)
{
  if (!Packet_Put(MODCON_COMMAND_TIME, MODCON_TIME_INITIAL, Clock_Seconds, Clock_Minutes)) 
  {
#ifndef NO_DEBUG
    DEBUG(__LINE__, ERR_PACKET_PUT);
#endif
    return bFALSE;
  }
  return bTRUE;
}
Esempio n. 3
0
/**
 * \fn BOOL HandleModConProtocolModeGet(void)
 * \brief Builds a packet that contains ModCon protocol mode and places it into transmit buffer.
 * \return TRUE if the packet was queued for transmission successfully.
 */
BOOL HandleModConProtocolModeGet(void)
{
  if (!Packet_Put(MODCON_COMMAND_PROTOCOL_MODE, MODCON_PROTOCOL_MODE_GET, (UINT8)ModConProtocolMode ,0))
  {
#ifndef NO_DEBUG
    DEBUG(__LINE__, ERR_PACKET_PUT);
#endif
    return bFALSE;
  }
  return bTRUE;
}
Esempio n. 4
0
/**
 * \fn BOOL HandleModConSpecialVersion(void)
 * \brief Builds a packet that contains ModCon version details and places it into transmit buffer. 
 * \return TRUE if the packet was queued for transmission successfully.
 */
BOOL HandleModConSpecialVersion(void) 
{
  if (!Packet_Put(MODCON_COMMAND_SPECIAL, MODCON_VERSION_INITIAL, MODCON_VERSION_MAJOR, MODCON_VERSION_MINOR))
  {
#ifndef NO_DEBUG
    DEBUG(__LINE__, ERR_PACKET_PUT);
#endif
    return bFALSE;
  }
  return bTRUE;
}
Esempio n. 5
0
/**
 * \fn BOOL HandleModConModeGet(void)
 * \brief Builds a packet that contains ModCon mode and places it into transmit buffer. 
 * \return TRUE if the packet was queued for transmission successfully.
 */
BOOL HandleModConModeGet(void)
{
  TUINT16 mode;
  
  mode.l = ModConMode;
  if (!Packet_Put(MODCON_COMMAND_MODE, MODCON_MODE_GET, mode.s.Lo, mode.s.Hi))
  {
#ifndef NO_DEBUG
    DEBUG(__LINE__, ERR_PACKET_PUT);
#endif
    return bFALSE;
  }
  return bTRUE;
}
Esempio n. 6
0
/**
 * \fn BOOL HandleModConNumberGet(void)
 * \brief Builds a packet that contains ModCon number and places it into transmit buffer. 
 * \return TRUE if the packet was queued for transmission successfully.
 */
BOOL HandleModConNumberGet(void)
{
  TUINT16 number;  

  number.l = ModConNumber;
  if (!Packet_Put(MODCON_COMMAND_NUMBER, MODCON_NUMBER_GET, number.s.Lo, number.s.Hi))
  {
#ifndef NO_DEBUG
    DEBUG(__LINE__, ERR_PACKET_PUT);
#endif
    return bFALSE;
  }
  return bTRUE;
}
Esempio n. 7
0
/*!
 * @brief Handle incoming packets
 */
void HandlePacket()
{
	BOOL error = bTRUE;
	uint8_t data;
	//mask out the ack, otherwise it goes to default
	switch (Packet_Command & ~PACKET_ACK_MASK)
	{
	case CMD_RX_SPECIAL_GET_STARTUP_VALUES:
		error = !CMD_SpecialGetStartupValues();
		break;
	case CMD_RX_FLASH_PROGRAM_BYTE:
		error = !CMD_FlashProgramByte(Packet_Parameter1, Packet_Parameter3);
		break;
	case CMD_RX_FLASH_READ_BYTE:
		error = !CMD_FlashReadByte(Packet_Parameter1);
		break;
	case CMD_RX_SPECIAL_GET_VERSION:
		error = !CMD_SpecialTowerVersion();
		break;
	case CMD_RX_TOWER_NUMBER:
		error = !CMD_TowerNumber(Packet_Parameter1, Packet_Parameter2, Packet_Parameter3);
		break;
	case CMD_RX_TOWER_MODE:
		error = !CMD_TowerMode(Packet_Parameter1, Packet_Parameter2, Packet_Parameter3);
		break;
	case CMD_RX_SET_TIME:
		error = !CMD_SetTime(Packet_Parameter1, Packet_Parameter2, Packet_Parameter3);
		break;
	case CMD_RX_PROTOCOL_MODE:
		error = !CMD_ProtocolMode(Packet_Parameter1, Packet_Parameter2, Packet_Parameter3);
		break;
	default:
		break;
	}

	if (Packet_Command & PACKET_ACK_MASK)
	{
		uint8_t maskedPacket = 0;
		if (error)
		{
			maskedPacket = Packet_Command & ~PACKET_ACK_MASK;
		}
		else
		{
			maskedPacket = Packet_Command | PACKET_ACK_MASK;
		}
		Packet_Put(maskedPacket, Packet_Parameter1, Packet_Parameter2, Packet_Parameter3);
	}
}
Esempio n. 8
0
/**
 * \fn BOOL HandleModConAnalogInputValue(const TAnalogChannel channelNb)
 * \brief Builds a packet that contains current ModCon analog input value of selected channel and places it into transmit buffer. 
 * \return TRUE if the command has been executed successfully.
 */
BOOL HandleModConAnalogInputValue(const TAnalogChannel channelNb)
{
  UINT8 index = 0xFF;
  
  /* NOTE: channel enums might not be in numberic order */
  switch(channelNb)
  {
    case ANALOG_INPUT_Ch1:
      index = 0;
      break;
    case ANALOG_INPUT_Ch2:
      index = 1;
      break;
    case ANALOG_INPUT_Ch3:
      index = 2;
      break;
    case ANALOG_INPUT_Ch4:
      index = 3;
      break;
    case ANALOG_INPUT_Ch5:
      index = 4;
      break;
    case ANALOG_INPUT_Ch6:
      index = 5;
      break;
    case ANALOG_INPUT_Ch7:
      index = 6;
      break;
    case ANALOG_INPUT_Ch8:
      index = 7;
      break;
    default:
#ifndef NO_DEBUG
      DEBUG(__LINE__, ERR_INVALID_ARGUMENT);
#endif
      return bFALSE;
      break;
  }
  
  if (!Packet_Put(MODCON_COMMAND_ANALOG_INPUT_VALUE, index, Analog_Input[index].Value.s.Lo, Analog_Input[index].Value.s.Hi))
  {
#ifndef NO_DEBUG
    DEBUG(__LINE__, ERR_PACKET_PUT);
#endif
    return bFALSE;
  }
  return bTRUE;
}
Esempio n. 9
0
/**
 * \fn BOOL HandleModConEEPROMGet(void)
 * \brief Return byte value of given EEPROM address.
 * \return TRUE if address is validated and the packet was queued for transmission successfully.
 */
BOOL HandleModConEEPROMGet(void)
{
  UINT8 volatile * const address = (UINT8 volatile *)Packet_Parameter12;
  
  if (!Packet_Parameter3 && EEPROM_ValidateAddress((void * const)address))
  { 
    if (!Packet_Put(MODCON_COMMAND_EEPROM_GET, Packet_Parameter1, Packet_Parameter2, *address))
    {
#ifndef NO_DEBUG
      DEBUG(__LINE__, ERR_PACKET_PUT);
#endif
      return bFALSE;
    }
    return bTRUE;
  }
  return bFALSE;
}
Esempio n. 10
0
/**
 * \fn BOOL HandleModConStartup(void)
 * \brief Builds packets that are necessary for startup information and places them into transmit buffer. 
 * \return TRUE if packets were queued for transmission successfully.
 */  
BOOL HandleModConStartup(void) 
{
  /* it should contain zeros */
  if (!Packet_Parameter1 && !Packet_Parameter23)
  {    
    /* push packets of ModCon startup figures */                    
    if (!Packet_Put(MODCON_COMMAND_STARTUP, 0, 0, 0))
    {
#ifndef NO_DEBUG
      DEBUG(__LINE__, ERR_PACKET_PUT);
#endif
      return bFALSE;    
    }
    return HandleModConSpecialVersion() &&
           HandleModConProtocolModeGet() &&
           HandleModConNumberGet() &&
           HandleModConModeGet();
  }
  return bFALSE;    
}
Esempio n. 11
0
/**
 * \fn void Routine(void)
 * \brief Retrieves ModCon packets and sends back packets if it is necessary.
 */
void Routine(void)
{
  UINT8 ack = 0;
  BOOL bad = bFALSE;
  
  if (Clock_Update())
  {
    bad = !HandleModConUptime();
  }
    
  if (Packet_Get())
  { 
    ack = Packet_Command & MODCON_COMMAND_ACK_MASK; /* detect ACK mask from command */
    Packet_Command &= ~MODCON_COMMAND_ACK_MASK;     /* clear ACK mask from command */
        
    switch(Packet_Command)
    {     
      case MODCON_COMMAND_STARTUP:
        bad = !HandleModConStartup(); 
        break;			
			case MODCON_COMMNAD_EEPROM_PROGRAM:
        bad = !HandleModConEEPROMProgram();
				break;			
			case MODCON_COMMAND_EEPROM_GET:
			  bad = !HandleModConEEPROMGet();
				break;      
      case MODCON_COMMAND_SPECIAL:
        bad = !HandleModConSpecial();
        break;
      case MODCON_COMMAND_PROTOCOL_MODE:
        bad = !HandleModConProtocolMode();
        break;
      case MODCON_COMMAND_NUMBER:
        bad = !HandleModConNumber();
        break;		  
		  case MODCON_COMMAND_MODE:
		    bad = !HandleModConMode();
				break;      
      default:
        bad = bTRUE;
        break;
    }
        
    if (ack)
    {
      if (!bad)
      {                
        if (!Packet_Put(Packet_Command | MODCON_COMMAND_ACK_MASK, Packet_Parameter1, Packet_Parameter2, Packet_Parameter3))
        {
#ifndef NO_DEBUG
          DEBUG(__LINE__, ERR_PACKET_PUT);
#endif
        }
      }
      else
      { /* NOTE: ACK mask has been cleared already */
        if (!Packet_Put(Packet_Command, Packet_Parameter1, Packet_Parameter2, Packet_Parameter3))
        {
#ifndef NO_DEBUG
          DEBUG(__LINE__, ERR_PACKET_PUT);
#endif
        }                
      }
    }
  }
}