1 /*
2  * Copyright (c) 2019 Kevin Townsend (KTOWN)
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <math.h>
8 #include <errno.h>
9 #include <zsl/zsl.h>
10 #include <zsl/physics/rotation.h>
11 
12 int
zsl_phy_rot_angle(zsl_real_t oi,zsl_real_t time,zsl_real_t a,zsl_real_t * phi)13 zsl_phy_rot_angle(zsl_real_t oi, zsl_real_t time, zsl_real_t a, zsl_real_t *phi)
14 {
15 	if (time < 0) {
16 		*phi = NAN;
17 		return -EINVAL;
18 	}
19 
20 	*phi = oi * time + 0.5 * a * time * time;
21 
22 	return 0;
23 }
24 
25 int
zsl_phy_rot_dist(zsl_real_t phi,zsl_real_t r,zsl_real_t * dist)26 zsl_phy_rot_dist(zsl_real_t phi, zsl_real_t r, zsl_real_t *dist)
27 {
28 	if (r < 0) {
29 		*dist = NAN;
30 		return -EINVAL;
31 	}
32 
33 	*dist = phi * r;
34 
35 	return 0;
36 }
37 
38 int
zsl_phy_rot_turn(zsl_real_t phi,zsl_real_t * turn)39 zsl_phy_rot_turn(zsl_real_t phi, zsl_real_t *turn)
40 {
41 	*turn = phi / (2.0 * ZSL_PI);
42 
43 	return 0;
44 }
45 
46 int
zsl_phy_rot_time(zsl_real_t oi,zsl_real_t of,zsl_real_t a,zsl_real_t * time)47 zsl_phy_rot_time(zsl_real_t oi, zsl_real_t of, zsl_real_t a, zsl_real_t *time)
48 {
49 	*time = (of - oi) / a;
50 
51 	if (*time < 0 || a == 0) {
52 		*time = NAN;
53 		return -EINVAL;
54 	}
55 
56 	return 0;
57 }
58 
59 int
zsl_phy_rot_omega(zsl_real_t oi,zsl_real_t time,zsl_real_t a,zsl_real_t * of)60 zsl_phy_rot_omega(zsl_real_t oi, zsl_real_t time, zsl_real_t a, zsl_real_t *of)
61 {
62 	*of = oi + time * a;
63 
64 	if (time < 0) {
65 		*of = NAN;
66 		return -EINVAL;
67 	}
68 
69 	return 0;
70 }
71 
72 int
zsl_phy_rot_omega2(zsl_real_t oi,zsl_real_t phi,zsl_real_t a,zsl_real_t * of)73 zsl_phy_rot_omega2(zsl_real_t oi, zsl_real_t phi, zsl_real_t a, zsl_real_t *of)
74 {
75 	zsl_real_t of2 = oi * oi + 2.0 * a * phi;
76 
77 	if (of2 < 0) {
78 		*of = NAN;
79 		return -EINVAL;
80 	}
81 
82 	*of = ZSL_SQRT(of2);
83 
84 	return 0;
85 }
86 
87 int
zsl_phy_rot_av_omega(zsl_real_t phi,zsl_real_t time,zsl_real_t * omega)88 zsl_phy_rot_av_omega(zsl_real_t phi, zsl_real_t time, zsl_real_t *omega)
89 {
90 	if (time <= 0) {
91 		*omega = NAN;
92 		return -EINVAL;
93 	}
94 
95 	*omega = phi / time;
96 
97 	return 0;
98 }
99 
100 int
zsl_phy_rot_vel(zsl_real_t omega,zsl_real_t r,zsl_real_t * vel)101 zsl_phy_rot_vel(zsl_real_t omega, zsl_real_t r, zsl_real_t *vel)
102 {
103 	if (r < 0) {
104 		*vel = NAN;
105 		return -EINVAL;
106 	}
107 
108 	*vel = omega * r;
109 
110 	return 0;
111 }
112 
113 int
zsl_phy_rot_ang_accel(zsl_real_t oi,zsl_real_t of,zsl_real_t time,zsl_real_t * a)114 zsl_phy_rot_ang_accel(zsl_real_t oi, zsl_real_t of, zsl_real_t time,
115 		      zsl_real_t *a)
116 {
117 	if (time <= 0) {
118 		*a = NAN;
119 		return -EINVAL;
120 	}
121 
122 	*a = (of - oi) / time;
123 
124 	return 0;
125 }
126 
127 int
zsl_phy_rot_accel(zsl_real_t a,zsl_real_t r,zsl_real_t * accel)128 zsl_phy_rot_accel(zsl_real_t a, zsl_real_t r, zsl_real_t *accel)
129 {
130 	if (r < 0) {
131 		*accel = NAN;
132 		return -EINVAL;
133 	}
134 
135 	*accel = a * r;
136 
137 	return 0;
138 }
139 
140 int
zsl_phy_rot_ener(zsl_real_t omega,zsl_real_t i,zsl_real_t * rke)141 zsl_phy_rot_ener(zsl_real_t omega, zsl_real_t i, zsl_real_t *rke)
142 {
143 	if (i < 0) {
144 		*rke = NAN;
145 		return -EINVAL;
146 	}
147 
148 	*rke = 0.5 * i * omega * omega;
149 
150 	return 0;
151 }
152 
153 int
zsl_phy_rot_period(zsl_real_t omega,zsl_real_t * t)154 zsl_phy_rot_period(zsl_real_t omega, zsl_real_t *t)
155 {
156 	if (omega <= 0) {
157 		*t = NAN;
158 		return -EINVAL;
159 	}
160 
161 	*t = (2.0 * ZSL_PI) / omega;
162 
163 	return 0;
164 }
165 
166 int
zsl_phy_rot_frequency(zsl_real_t omega,zsl_real_t * f)167 zsl_phy_rot_frequency(zsl_real_t omega, zsl_real_t *f)
168 {
169 	if (omega < 0) {
170 		*f = NAN;
171 		return -EINVAL;
172 	}
173 
174 	*f = omega / (2.0 * ZSL_PI);
175 
176 	return 0;
177 }
178 
179 int
zsl_phy_rot_cent_accel(zsl_real_t vel,zsl_real_t r,zsl_real_t * ca)180 zsl_phy_rot_cent_accel(zsl_real_t vel, zsl_real_t r, zsl_real_t *ca)
181 {
182 	if (r <= 0) {
183 		*ca = NAN;
184 		return -EINVAL;
185 	}
186 
187 	*ca = (vel * vel) / r;
188 
189 	return 0;
190 }
191 
192 int
zsl_phy_rot_cent_accel2(zsl_real_t t,zsl_real_t r,zsl_real_t * ca)193 zsl_phy_rot_cent_accel2(zsl_real_t t, zsl_real_t r, zsl_real_t *ca)
194 {
195 	if (r < 0 || t <= 0) {
196 		*ca = NAN;
197 		return -EINVAL;
198 	}
199 
200 	*ca = (4.0 * ZSL_PI * ZSL_PI * r) / (t * t);
201 
202 	return 0;
203 }
204 
205 int
zsl_phy_rot_total_accel(zsl_real_t accel,zsl_real_t ca,zsl_real_t * at)206 zsl_phy_rot_total_accel(zsl_real_t accel, zsl_real_t ca, zsl_real_t *at)
207 {
208 	*at = ZSL_SQRT(accel * accel + ca * ca);
209 
210 	return 0;
211 }
212 
213 int
zsl_phy_rot_power(zsl_real_t torque,zsl_real_t omega,zsl_real_t * power)214 zsl_phy_rot_power(zsl_real_t torque, zsl_real_t omega, zsl_real_t *power)
215 {
216 	*power = torque * omega;
217 
218 	return 0;
219 }
220