2 * Copyright (C) 2022 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "MovingSpeed.h"
11 #include "utils/MathUtils.h"
12 #include "utils/TimeUtils.h"
13 #include "utils/log.h"
15 void UTILS::MOVING_SPEED::CMovingSpeed::AddEventConfig(uint32_t eventId
,
18 uint32_t resetTimeout
)
20 EventCfg eventCfg
{acceleration
, maxVelocity
, resetTimeout
};
21 m_eventsData
.emplace(eventId
, EventData
{eventCfg
});
24 void UTILS::MOVING_SPEED::CMovingSpeed::AddEventConfig(uint32_t eventId
, EventCfg event
)
26 m_eventsData
.emplace(eventId
, EventData
{event
});
29 void UTILS::MOVING_SPEED::CMovingSpeed::AddEventMapConfig(MapEventConfig
& configs
)
31 for (auto& cfg
: configs
)
33 AddEventConfig(static_cast<uint32_t>(cfg
.first
), cfg
.second
);
37 void UTILS::MOVING_SPEED::CMovingSpeed::Reset()
40 for (auto& eventPair
: m_eventsData
)
42 Reset(eventPair
.first
);
46 void UTILS::MOVING_SPEED::CMovingSpeed::Reset(uint32_t eventId
)
48 auto mapIt
= m_eventsData
.find(eventId
);
49 if (mapIt
== m_eventsData
.end())
51 CLog::LogF(LOGWARNING
, "Cannot reset Event ID {} configuration", eventId
);
55 EventData
& event
= mapIt
->second
;
56 event
.m_currentVelocity
= 1.0f
;
57 event
.m_lastFrameTime
= 0;
61 float UTILS::MOVING_SPEED::CMovingSpeed::GetUpdatedDistance(uint32_t eventId
)
63 auto mapEventIt
= m_eventsData
.find(eventId
);
65 if (mapEventIt
== m_eventsData
.end())
67 CLog::LogF(LOGDEBUG
, "No event set for event ID {}", eventId
);
71 EventData
& eventData
= mapEventIt
->second
;
72 EventCfg
& eventCfg
= eventData
.m_config
;
74 uint32_t currentFrameTime
{CTimeUtils::GetFrameTime()};
75 uint32_t deltaFrameTime
{currentFrameTime
- eventData
.m_lastFrameTime
};
76 float distance
= (eventCfg
.m_delta
== 0.0f
) ? 1.0f
: eventCfg
.m_delta
;
78 if (eventData
.m_lastFrameTime
!= 0 && deltaFrameTime
> eventCfg
.m_resetTimeout
)
80 // If the delta time exceed the timeout then reset values
83 else if (m_currentEventId
!= eventId
)
85 // If the event id is changed then reset values
88 else if (eventData
.m_lastFrameTime
!= 0)
90 // Calculate the new speed based on time so as not to depend on the frame rate
91 eventData
.m_currentVelocity
+=
92 eventCfg
.m_acceleration
* (static_cast<float>(deltaFrameTime
) / 1000);
94 if (eventCfg
.m_maxVelocity
> 0 && eventData
.m_currentVelocity
> eventCfg
.m_maxVelocity
)
95 eventData
.m_currentVelocity
= eventCfg
.m_maxVelocity
;
97 distance
= eventData
.m_currentVelocity
* (static_cast<float>(deltaFrameTime
) / 1000);
98 if (eventCfg
.m_delta
> 0.0f
)
99 distance
= MathUtils::RoundF(distance
, eventCfg
.m_delta
);
102 m_currentEventId
= eventId
;
103 eventData
.m_lastFrameTime
= currentFrameTime
;
107 UTILS::MOVING_SPEED::EventType
UTILS::MOVING_SPEED::ParseEventType(std::string_view eventType
)
109 if (eventType
== "up")
110 return EventType::UP
;
111 else if (eventType
== "down")
112 return EventType::DOWN
;
113 else if (eventType
== "left")
114 return EventType::LEFT
;
115 else if (eventType
== "right")
116 return EventType::RIGHT
;
119 CLog::LogF(LOGERROR
, "Unsupported event type \"{}\"", eventType
);
120 return EventType::NONE
;