1a46c0ec8Sopenharmony_ci/*
2a46c0ec8Sopenharmony_ci * Copyright © 2013-2019 Red Hat, Inc.
3a46c0ec8Sopenharmony_ci *
4a46c0ec8Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
5a46c0ec8Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
6a46c0ec8Sopenharmony_ci * to deal in the Software without restriction, including without limitation
7a46c0ec8Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a46c0ec8Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
9a46c0ec8Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
10a46c0ec8Sopenharmony_ci *
11a46c0ec8Sopenharmony_ci * The above copyright notice and this permission notice (including the next
12a46c0ec8Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the
13a46c0ec8Sopenharmony_ci * Software.
14a46c0ec8Sopenharmony_ci *
15a46c0ec8Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a46c0ec8Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17a46c0ec8Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18a46c0ec8Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19a46c0ec8Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20a46c0ec8Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21a46c0ec8Sopenharmony_ci * DEALINGS IN THE SOFTWARE.
22a46c0ec8Sopenharmony_ci */
23a46c0ec8Sopenharmony_ci
24a46c0ec8Sopenharmony_ci#pragma once
25a46c0ec8Sopenharmony_ci
26a46c0ec8Sopenharmony_ci#include "config.h"
27a46c0ec8Sopenharmony_ci
28a46c0ec8Sopenharmony_ci#include <assert.h>
29a46c0ec8Sopenharmony_ci#include <time.h>
30a46c0ec8Sopenharmony_ci#include <stdint.h>
31a46c0ec8Sopenharmony_ci#include <unistd.h>
32a46c0ec8Sopenharmony_ci#include <linux/input.h>
33a46c0ec8Sopenharmony_ci
34a46c0ec8Sopenharmony_ci#include "util-macros.h"
35a46c0ec8Sopenharmony_ci
36a46c0ec8Sopenharmony_cistatic inline void
37a46c0ec8Sopenharmony_cimsleep(unsigned int ms)
38a46c0ec8Sopenharmony_ci{
39a46c0ec8Sopenharmony_ci	usleep(ms * 1000);
40a46c0ec8Sopenharmony_ci}
41a46c0ec8Sopenharmony_ci
42a46c0ec8Sopenharmony_cistatic inline uint64_t
43a46c0ec8Sopenharmony_cius(uint64_t us)
44a46c0ec8Sopenharmony_ci{
45a46c0ec8Sopenharmony_ci	return us;
46a46c0ec8Sopenharmony_ci}
47a46c0ec8Sopenharmony_ci
48a46c0ec8Sopenharmony_cistatic inline uint64_t
49a46c0ec8Sopenharmony_cins2us(uint64_t ns)
50a46c0ec8Sopenharmony_ci{
51a46c0ec8Sopenharmony_ci	return us(ns / 1000);
52a46c0ec8Sopenharmony_ci}
53a46c0ec8Sopenharmony_ci
54a46c0ec8Sopenharmony_cistatic inline uint64_t
55a46c0ec8Sopenharmony_cims2us(uint64_t ms)
56a46c0ec8Sopenharmony_ci{
57a46c0ec8Sopenharmony_ci	return us(ms * 1000);
58a46c0ec8Sopenharmony_ci}
59a46c0ec8Sopenharmony_ci
60a46c0ec8Sopenharmony_cistatic inline uint64_t
61a46c0ec8Sopenharmony_cis2us(uint64_t s)
62a46c0ec8Sopenharmony_ci{
63a46c0ec8Sopenharmony_ci	return ms2us(s * 1000);
64a46c0ec8Sopenharmony_ci}
65a46c0ec8Sopenharmony_ci
66a46c0ec8Sopenharmony_cistatic inline uint64_t
67a46c0ec8Sopenharmony_cih2us(uint64_t h)
68a46c0ec8Sopenharmony_ci{
69a46c0ec8Sopenharmony_ci	return s2us(h * 3600);
70a46c0ec8Sopenharmony_ci}
71a46c0ec8Sopenharmony_ci
72a46c0ec8Sopenharmony_cistatic inline uint32_t
73a46c0ec8Sopenharmony_cius2ms(uint64_t us)
74a46c0ec8Sopenharmony_ci{
75a46c0ec8Sopenharmony_ci	return (uint32_t)(us / 1000);
76a46c0ec8Sopenharmony_ci}
77a46c0ec8Sopenharmony_ci
78a46c0ec8Sopenharmony_cistatic inline double
79a46c0ec8Sopenharmony_cius2ms_f(uint64_t us)
80a46c0ec8Sopenharmony_ci{
81a46c0ec8Sopenharmony_ci	return (double)us / 1000.0;
82a46c0ec8Sopenharmony_ci}
83a46c0ec8Sopenharmony_ci
84a46c0ec8Sopenharmony_cistatic inline uint64_t
85a46c0ec8Sopenharmony_citv2us(const struct timeval *tv)
86a46c0ec8Sopenharmony_ci{
87a46c0ec8Sopenharmony_ci	return s2us(tv->tv_sec) + tv->tv_usec;
88a46c0ec8Sopenharmony_ci}
89a46c0ec8Sopenharmony_ci
90a46c0ec8Sopenharmony_cistatic inline struct timeval
91a46c0ec8Sopenharmony_cius2tv(uint64_t time)
92a46c0ec8Sopenharmony_ci{
93a46c0ec8Sopenharmony_ci	struct timeval tv;
94a46c0ec8Sopenharmony_ci
95a46c0ec8Sopenharmony_ci	tv.tv_sec = time / ms2us(1000);
96a46c0ec8Sopenharmony_ci	tv.tv_usec = time % ms2us(1000);
97a46c0ec8Sopenharmony_ci
98a46c0ec8Sopenharmony_ci	return tv;
99a46c0ec8Sopenharmony_ci}
100a46c0ec8Sopenharmony_ci
101a46c0ec8Sopenharmony_cistruct human_time {
102a46c0ec8Sopenharmony_ci	unsigned int value;
103a46c0ec8Sopenharmony_ci	const char *unit;
104a46c0ec8Sopenharmony_ci};
105a46c0ec8Sopenharmony_ci
106a46c0ec8Sopenharmony_ci/**
107a46c0ec8Sopenharmony_ci * Converts a time delta in µs to a human-readable time like "2h" or "4d"
108a46c0ec8Sopenharmony_ci */
109a46c0ec8Sopenharmony_cistatic inline struct human_time
110a46c0ec8Sopenharmony_cito_human_time(uint64_t us)
111a46c0ec8Sopenharmony_ci{
112a46c0ec8Sopenharmony_ci	struct human_time t;
113a46c0ec8Sopenharmony_ci	struct c {
114a46c0ec8Sopenharmony_ci		const char *unit;
115a46c0ec8Sopenharmony_ci		unsigned int change_from_previous;
116a46c0ec8Sopenharmony_ci		uint64_t limit;
117a46c0ec8Sopenharmony_ci	} conversion[] = {
118a46c0ec8Sopenharmony_ci		{"us", 1, 5000},
119a46c0ec8Sopenharmony_ci		{"ms", 1000, 5000},
120a46c0ec8Sopenharmony_ci		{"s", 1000, 120},
121a46c0ec8Sopenharmony_ci		{"min", 60, 120},
122a46c0ec8Sopenharmony_ci		{"h", 60, 48},
123a46c0ec8Sopenharmony_ci		{"d", 24, ~0},
124a46c0ec8Sopenharmony_ci	};
125a46c0ec8Sopenharmony_ci	uint64_t value = us;
126a46c0ec8Sopenharmony_ci
127a46c0ec8Sopenharmony_ci	ARRAY_FOR_EACH(conversion, c) {
128a46c0ec8Sopenharmony_ci		value = value/c->change_from_previous;
129a46c0ec8Sopenharmony_ci		if (value < c->limit) {
130a46c0ec8Sopenharmony_ci			t.unit = c->unit;
131a46c0ec8Sopenharmony_ci			t.value = value;
132a46c0ec8Sopenharmony_ci			return t;
133a46c0ec8Sopenharmony_ci		}
134a46c0ec8Sopenharmony_ci	}
135a46c0ec8Sopenharmony_ci
136a46c0ec8Sopenharmony_ci	assert(!"We should never get here");
137a46c0ec8Sopenharmony_ci}
138