示例#1
0
void
DeviceDescriptor::OnSysTicker()
{
  assert(InMainThread());

  if (port != nullptr && port->GetState() == PortState::FAILED && !IsOccupied())
    Close();

  if (device == nullptr)
    return;

  const bool now_alive = IsAlive();
  if (!now_alive && was_alive && !IsOccupied()) {
    /* connection was just lost */
    device->LinkTimeout();

    NullOperationEnvironment env;
    EnableNMEA(env);
  }

  was_alive = now_alive;

  if (now_alive || IsBorrowed()) {
    ticker = !ticker;
    if (ticker)
      // write settings to vario every second
      device->OnSysTicker();
  }
}
	void VehicleExit() override
	{
		if (IsOccupied())
		{
			exitCount += 1;
			state = Empty;
			vehicle.reset();
		}
	}
示例#3
0
void
DeviceDescriptor::Return()
{
  assert(InMainThread());
  assert(IsBorrowed());

  borrowed = false;
  assert(!IsOccupied());

  /* if the caller has disabled the NMEA while the device was
     borrowed, we may not have received new values for some time, but
     that doesn't mean the device has failed; give it some time to
     recover, and don't reopen right away */
  reopen_clock.Update();
}
示例#4
0
void ScoreManager::CheckForFullColls()
{
	std::vector<int> filledRows;
	int bottomRow = -1;

	for(int y = m_blockGrid.size() - 1; y > -1; y--)
	{
		int squaresFilled = 0;
		for(unsigned int x = 0; x < m_blockGrid[0].size(); x++)
		{ 
			if(IsOccupied(x, y))
			{ squaresFilled++; }
		}

		if(squaresFilled == m_blockGrid[0].size())
		{ 
			filledRows.push_back(y); 
			if(bottomRow == -1)
			{ bottomRow = y; }
		}
	}

	if(filledRows.size() == 0)
	{ return; }

	for(unsigned int i = 0; i < filledRows.size(); i++)
	{
		int row = filledRows[i];
		for(unsigned int x = 0; x < m_blockGrid[0].size(); x++)
		{
			m_blockGrid[row][x]->Destroy();
			m_blockGrid[row][x] = NULL;
		}
	}

	RepositionSquares(bottomRow, filledRows.size());

	if(filledRows.size() < 4)
	{ m_currentScore += filledRows.size() * 100; }
	else
	{
		m_currentScore += 800;
		m_currentScore += (filledRows.size() - 4) * 100;
	}

	SoundManager::Instance->PlayClip(SoundManager::Sounds::RowCleared, false);
}
示例#5
0
文件: vehicle.cpp 项目: jovazxc/samp
void CVehicle::CheckForIdleRespawn()
{	
	// can't respawn an idle train or train part
	if(IsATrainPart()) return;

	if( (GetTickCount() - m_dwLastRespawnedTick) < 10000 ) {
		// We should wait at least 10 seconds after the last
		// respawn before checking. Come back later.
		return;
	}

	if(!IsOccupied()) {
		if( m_bHasBeenOccupied &&
			(GetTickCount() - m_dwLastSeenOccupiedTick) >= (DWORD)m_SpawnInfo.iRespawnDelay ) {
			//printf("Respawning idle vehicle %u\n",m_VehicleID);
			Respawn();
		}
	}
}
示例#6
0
void
DeviceDescriptor::AutoReopen(OperationEnvironment &env)
{
  assert(InMainThread());

  if (/* don't reopen a device that is occupied */
      IsOccupied() ||
      !config.IsAvailable() ||
      !ShouldReopen() ||
      /* attempt to reopen a failed device every 30 seconds */
      !reopen_clock.CheckUpdate(30000))
    return;

  TCHAR buffer[64];
  LogStartUp(_T("Reconnecting to device %s"), config.GetPortName(buffer, 64));

  InputEvents::processGlideComputer(GCE_COMMPORT_RESTART);
  Reopen(env);
}
HRESULT CVisualTree::AddVisual(CVisualObject * pVisual, bool fEnsureOpenSpace)
{
    assert(pVisual != NULL);

    m_Objects.Add(pVisual);

    if(fEnsureOpenSpace)
    {
        while(IsOccupied(pVisual))
        {
            pVisual->AddPosition(120, 0);

            if(pVisual->Rect().x() > 600)
            {
                pVisual->Move(20, pVisual->Rect().y() + 120);
            }
        }
    }
    
    return S_OK;
}
示例#8
0
void
DeviceDescriptor::AutoReopen(OperationEnvironment &env)
{
  assert(InMainThread());

  if (/* don't reopen a device that is occupied */
      IsOccupied() ||
      !config.IsAvailable() ||
      !ShouldReopen() ||
      /* attempt to reopen a failed device every 30 seconds */
      !reopen_clock.CheckUpdate(30000))
    return;

#ifdef ANDROID
  if (config.port_type == DeviceConfig::PortType::RFCOMM &&
      android_api_level < 11 && n_failures >= 2) {
    /* on Android < 3.0, system_server's "BT EventLoop" thread
       eventually crashes with JNI reference table overflow due to a
       memory leak after too many Bluetooth failures
       (https://code.google.com/p/android/issues/detail?id=8676);
       don't attempt to reconnect on this Android version over and
       over to keep the chance of this bug occurring low enough */

    if (n_failures == 2) {
      LogFormat(_T("Giving up on Bluetooth device %s to avoid Android crash bug"),
                config.bluetooth_mac.c_str());
      ++n_failures;
    }

    return;
  }
#endif

  TCHAR buffer[64];
  LogFormat(_T("Reconnecting to device %s"), config.GetPortName(buffer, 64));

  InputEvents::processGlideComputer(GCE_COMMPORT_RESTART);
  Reopen(env);
}
示例#9
0
void
DeviceDescriptor::Open(OperationEnvironment &env)
{
  assert(InMainThread());
  assert(port == nullptr);
  assert(device == nullptr);
  assert(!ticker);
  assert(!IsBorrowed());

  if (is_simulator() || !config.IsAvailable())
    return;

  CancelAsync();

  assert(!IsOccupied());
  assert(open_job == nullptr);

  TCHAR buffer[64];
  LogFormat(_T("Opening device %s"), config.GetPortName(buffer, 64));

  open_job = new OpenDeviceJob(*this);
  async.Start(open_job, env, this);
}
示例#10
0
void ScoreManager::RepositionSquares(int bottomRow, int rowCount)
{
	for(int y = bottomRow; y > -1; y--)
	{
		for(unsigned int x = 0; x < m_blockGrid[0].size(); x++)
		{
			SmartPtr<Square> square = m_blockGrid[y][x];
			if(square == NULL)
			{ continue; }

			bool foundCollision = false;
			int coll = square->GetColl();
			int row = square->GetRow();
			int newY = row;

			while(!foundCollision)
			{
				if(newY == Settings::NoOfRows || (IsOccupied(coll, newY) && newY != row) || (newY - row) == rowCount + 1)
				{ 
					foundCollision = true;
					newY--;
					break;
				}

				newY++;
			}

			if(newY != row)
			{
				square->SetPosition(coll, newY);
				m_blockGrid[y][x] = NULL;
				m_blockGrid[newY][x] = square;
			}
		}
	}
}
示例#11
0
void Taxi::Update(float time, float seconds)
{
	//m_position.y = sinf(time * (((m_speed + 1) / 13.0f) * 1.0f)) * 0.5f + 0.5f;
	//m_position.y *= 0.5f;

	sm::Vec3 oldPos = m_position;

	if (IsOccupied())
	{
		m_timeLeft -= seconds;
		if (m_timeLeft < 0.0f)
			m_timeLeft = 0.0f;
	}

	sm::Vec3 turnPivot;
	sm::Matrix turnMatrix;
	float pivotDistance = 0.0f;

	m_speed += m_acc * 5.0f * seconds;

	static float maxSpeed = 14.0f;

	if (m_acc == 0.0f)
	{
		m_speed -= MathUtils::Min(MathUtils::Abs(m_speed), 8.0f * seconds) * MathUtils::Sign(m_speed);
	}

	if (m_speed > 0.0f && m_acc == -1.0f)
	{
		m_speed -= MathUtils::Min(MathUtils::Abs(m_speed), 12.0f * seconds) * MathUtils::Sign(m_speed);
	}

	m_speed = MathUtils::Clamp(m_speed, -maxSpeed / 4, maxSpeed);

	SoundManager::GetInstance()->SetEnginePitch((MathUtils::Abs(m_speed) / maxSpeed) * 1.0f + 1.0f);

	m_wheelsAngle += 2.0f * m_turnValue * seconds;

	m_wheelsAngle = MathUtils::Clamp(m_wheelsAngle, -MathUtils::PI4, MathUtils::PI4);

	if (m_wheelsAngle != 0.0f)
	{
		if (m_wheelsAngle < 0.0)
		{
			pivotDistance = m_backFrontWheelsDistance / tanf(fabs(m_wheelsAngle));
			turnPivot = sm::Vec3(m_baseBackRightWheelPosition.x + pivotDistance, 0, m_baseBackRightWheelPosition.z);
		}
		else
		{
			pivotDistance = m_backFrontWheelsDistance / tanf(fabs(m_wheelsAngle));
			turnPivot = sm::Vec3(m_baseBackLeftWheelPosition.x - pivotDistance, 0, m_baseBackLeftWheelPosition.z);
		}

		float angleSpeed = m_speed / (2.0f * MathUtils::PI * MathUtils::Abs(turnPivot.x));

		sm::Matrix turnMatrixNormal =
			sm::Matrix::RotateAxisMatrix(
				angleSpeed * (MathUtils::PI * 2.0f) * seconds * MathUtils::Sign(m_wheelsAngle),
				0, 1, 0);

		turnPivot = m_worldMatrix * turnPivot;
		turnPivot.y = 0.0f;

		turnMatrix =
			sm::Matrix::TranslateMatrix(turnPivot) *
			turnMatrixNormal *
			sm::Matrix::TranslateMatrix(turnPivot.GetReversed());

		sm::Vec3 prevCarDirection = m_carDirection;
		m_carDirection = turnMatrixNormal * m_carDirection;
		m_carDirection.Normalize();

	
		float angleDiff = sm::Vec3::GetAngle(prevCarDirection, m_carDirection);
		m_wheelsAngle -= angleDiff * MathUtils::Sign(m_wheelsAngle);

		m_position = turnMatrix * m_position;
	}
	else
		m_position += m_carDirection * m_speed * seconds;

	sm::Matrix newWorldMatrix =
		sm::Matrix::TranslateMatrix(m_position) *
		sm::Matrix::CreateLookAt(m_carDirection.GetReversed(), sm::Vec3(0, 1, 0));

	sm::Vec3 boundsTopLeftWorldOld = m_worldMatrix * m_boundsTopLeft;
	sm::Vec3 boundsBottomLeftWorldOld = m_worldMatrix * m_boundsBottomLeft;
	sm::Vec3 boundsTopRightWorldOld = m_worldMatrix * m_boundsTopRight;
	sm::Vec3 boundsBottomRightWorldOld = m_worldMatrix * m_boundsBottomRight;

	sm::Vec3 boundsTopLeftWorldNew = newWorldMatrix * m_boundsTopLeft;
	sm::Vec3 boundsBottomLeftWorldNew = newWorldMatrix * m_boundsBottomLeft;
	sm::Vec3 boundsTopRightWorldNew = newWorldMatrix * m_boundsTopRight;
	sm::Vec3 boundsBottomRightWorldNew = newWorldMatrix * m_boundsBottomRight;

	sm::Vec3 collisionNormal;
	sm::Vec3 collisionPoint;

	if (Street::Instance->GetCollistion(boundsTopLeftWorldOld, boundsTopLeftWorldNew, collisionPoint, collisionNormal))
	{
		if (m_speed > 4.0f)
		{
			static Randomizer random;

			SoundManager::GetInstance()->PlaySound((SoundManager::Sound)random.GetInt(0, 2));
		}

		float dot = sm::Vec3::Dot(collisionNormal, m_carDirection.GetReversed());
		if (dot > 0.8 && m_speed > 3.0f)
			m_speed = -3.0f;
		else
			m_speed *= 1.0f - sm::Vec3::Dot(collisionNormal, m_carDirection.GetReversed());

		collisionPoint += collisionNormal * 0.01f;

		sm::Vec3 toCollisionTarget = collisionPoint - boundsTopLeftWorldOld;
		sm::Vec3 fromCollisionTarget = sm::Vec3::Reflect(collisionNormal, toCollisionTarget);
		sm::Vec3 correntPosition = boundsTopLeftWorldOld + toCollisionTarget + fromCollisionTarget;
		sm::Vec3 deltaMove = collisionPoint - boundsTopLeftWorldOld;

		m_carDirection = (collisionPoint - boundsBottomLeftWorldOld).GetNormalized();

		m_position = oldPos + deltaMove;

		m_worldMatrix =
			sm::Matrix::TranslateMatrix(m_position) *
			sm::Matrix::CreateLookAt(m_carDirection.GetReversed(), sm::Vec3(0, 1, 0));
	}
	else if (Street::Instance->GetCollistion(boundsTopRightWorldOld, boundsTopRightWorldNew, collisionPoint, collisionNormal))
	{
		if (m_speed > 4.0f)
		{
			static Randomizer random;

			SoundManager::GetInstance()->PlaySound((SoundManager::Sound)random.GetInt(0, 2));
		}

		float dot = sm::Vec3::Dot(collisionNormal, m_carDirection.GetReversed());
		if (dot > 0.8 && m_speed > 3.0f)
			m_speed = -3.0f;
		else
			m_speed *= 1.0f - sm::Vec3::Dot(collisionNormal, m_carDirection.GetReversed());

		collisionPoint += collisionNormal * 0.01f;

		sm::Vec3 toCollisionTarget = collisionPoint - boundsTopRightWorldOld;
		sm::Vec3 fromCollisionTarget = sm::Vec3::Reflect(collisionNormal, toCollisionTarget);
		sm::Vec3 correntPosition = boundsTopRightWorldOld + toCollisionTarget + fromCollisionTarget;
		sm::Vec3 deltaMove = collisionPoint - boundsTopRightWorldOld;

		m_carDirection = (collisionPoint - boundsBottomRightWorldOld).GetNormalized();

		m_position = oldPos + deltaMove;

		m_worldMatrix =
			sm::Matrix::TranslateMatrix(m_position) *
			sm::Matrix::CreateLookAt(m_carDirection.GetReversed(), sm::Vec3(0, 1, 0));
	}
	/*else if (Street::Instance->GetCollistion(boundsBottomRightWorldOld, boundsBottomRightWorldNew, collisionPoint, collisionNormal))
	{
		if (m_speed > 4.0f)
		{
			static Randomizer random;

			SoundManager::GetInstance()->PlaySound((SoundManager::Sound)random.GetInt(0, 2));
		}

		float dot = sm::Vec3::Dot(collisionNormal, m_carDirection.GetReversed());
		if (dot > 0.8 && m_speed > 3.0f)
			m_speed = -3.0f;
		else
			m_speed *= 1.0f - sm::Vec3::Dot(collisionNormal, m_carDirection.GetReversed());

		collisionPoint += collisionNormal * 0.01f;

		sm::Vec3 toCollisionTarget = collisionPoint - boundsBottomRightWorldOld;
		sm::Vec3 fromCollisionTarget = sm::Vec3::Reflect(collisionNormal, toCollisionTarget);
		sm::Vec3 correntPosition = boundsBottomRightWorldOld + toCollisionTarget + fromCollisionTarget;
		sm::Vec3 deltaMove = collisionPoint - boundsBottomRightWorldOld;

		m_carDirection = (boundsTopRightWorldOld - collisionPoint).GetNormalized();

		m_position = oldPos + deltaMove;

		m_worldMatrix =
			sm::Matrix::TranslateMatrix(m_position) *
			sm::Matrix::CreateLookAt(m_carDirection.GetReversed(), sm::Vec3(0, 1, 0));
	}*/
	else if (Street::Instance->GetCollistion(boundsBottomRightWorldOld, boundsBottomRightWorldNew, collisionPoint, collisionNormal))
	{
		if (m_speed > 4.0f)
		{
			static Randomizer random;

			SoundManager::GetInstance()->PlaySound((SoundManager::Sound)random.GetInt(0, 2));
		}

		m_position = oldPos + collisionNormal * 0.1f;
		m_speed = 0.0f;

		m_worldMatrix =
			sm::Matrix::TranslateMatrix(m_position) *
			sm::Matrix::CreateLookAt(m_carDirection.GetReversed(), sm::Vec3(0, 1, 0));
	}
	else if (Street::Instance->GetCollistion(boundsBottomLeftWorldOld, boundsBottomLeftWorldNew, collisionPoint, collisionNormal))
	{
		if (m_speed > 4.0f)
		{
			static Randomizer random;

			SoundManager::GetInstance()->PlaySound((SoundManager::Sound)random.GetInt(0, 2));
		}

		m_position = oldPos + collisionNormal * 0.1f;
		m_speed = 0.0f;

		m_worldMatrix =
			sm::Matrix::TranslateMatrix(m_position) *
			sm::Matrix::CreateLookAt(m_carDirection.GetReversed(), sm::Vec3(0, 1, 0));
	}
	else
		m_worldMatrix = newWorldMatrix;

	m_frontRightWheel->Transform() =
		m_frontRightWheel->m_worldMatrix *
		sm::Matrix::RotateAxisMatrix(m_wheelsAngle, 0, 1, 0) *
		m_frontRightWheel->m_worldInverseMatrix;

	m_frontLeftWheel->Transform() =
		m_frontLeftWheel->m_worldMatrix *
		sm::Matrix::RotateAxisMatrix(m_wheelsAngle, 0, 1, 0) *
		m_frontLeftWheel->m_worldInverseMatrix;
}
示例#12
0
  /**
   * Can this device be borrowed?
   *
   * May only be called from the main thread.
   *
   * @see Borrow()
   */
  bool CanBorrow() const {
    assert(InMainThread());

    return device != nullptr && GetState() == PortState::READY &&
      !IsOccupied();
  }
示例#13
0
 ~DeviceDescriptor() {
   assert(!IsOccupied());
 }
示例#14
0
inline bool StoneBoard::IsEmpty(HexPoint cell) const
{
    BenzeneAssert(Const().IsLocation(cell));
    return !IsOccupied(cell);
}
示例#15
0
 /**
  * Can this device be borrowed?
  *
  * May only be called from the main thread.
  *
  * @see Borrow()
  */
 bool CanBorrow() const {
   return device != NULL && port != NULL && !IsOccupied();
 }