[PVR][Estuary] Timer settings dialog: Show client name in timer type selection dialog...
[xbmc.git] / xbmc / utils / MovingSpeed.cpp
blob1e4269eed515f1d5575363a26b4ccb6c9f3ed5c6
1 /*
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.
7 */
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,
16 float acceleration,
17 float maxVelocity,
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()
39 m_currentEventId = 0;
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);
53 else
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);
68 return 0;
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
81 Reset(eventId);
83 else if (m_currentEventId != eventId)
85 // If the event id is changed then reset values
86 Reset(eventId);
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;
104 return distance;
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;
117 else
119 CLog::LogF(LOGERROR, "Unsupported event type \"{}\"", eventType);
120 return EventType::NONE;