1 /* sane - Scanner Access Now Easy.
2
3 Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
4
5 This file is part of the SANE package.
6
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of the
10 License, or (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
21 #define DEBUG_DECLARE_ONLY
22
23 #include "tests.h"
24 #include "tests_printers.h"
25 #include "minigtest.h"
26
27 #include "../../../backend/genesys/low.h"
28 #include "../../../backend/genesys/enums.h"
29
30 namespace genesys {
31
test_create_slope_table_small_full_step()32 void test_create_slope_table_small_full_step()
33 {
34 unsigned max_table_size = 1024;
35
36 // created approximately from LIDE 110 slow table: { 62464, 7896, 2632, 0 }
37 MotorSlope slope;
38 slope.initial_speed_w = 62464;
39 slope.max_speed_w = 2632;
40 slope.acceleration = 1.2e-8;
41
42 auto table = create_slope_table_for_speed(slope, 5000, StepType::FULL, 4, 8, max_table_size);
43
44 std::vector<std::uint16_t> expected_table = {
45 62464, 62464, 6420, 5000, 5000, 5000, 5000, 5000
46 };
47 ASSERT_EQ(table.table, expected_table);
48 ASSERT_EQ(table.table.size(), 8u);
49 ASSERT_EQ(table.pixeltime_sum(), 156348u);
50
51
52 table = create_slope_table_for_speed(slope, 3000, StepType::FULL, 4, 8, max_table_size);
53
54 expected_table = {
55 62464, 62464, 6420, 4552, 3720, 3223, 3000, 3000
56 };
57 ASSERT_EQ(table.table, expected_table);
58 ASSERT_EQ(table.table.size(), 8u);
59 ASSERT_EQ(table.pixeltime_sum(), 148843u);
60 }
61
test_create_slope_table_small_full_step_target_speed_too_high()62 void test_create_slope_table_small_full_step_target_speed_too_high()
63 {
64 unsigned max_table_size = 1024;
65
66 // created approximately from LIDE 110 slow table: { 62464, 7896, 2632, 0 }
67 MotorSlope slope;
68 slope.initial_speed_w = 62464;
69 slope.max_speed_w = 2632;
70 slope.acceleration = 1.2e-8;
71
72 auto table = create_slope_table_for_speed(slope, 2000, StepType::FULL, 4, 8, max_table_size);
73
74 std::vector<std::uint16_t> expected_table = {
75 62464, 62464, 6420, 4552, 3720, 3223, 2883, 2632
76 };
77 ASSERT_EQ(table.table, expected_table);
78 ASSERT_EQ(table.table.size(), 8u);
79 ASSERT_EQ(table.pixeltime_sum(), 148358u);
80 }
81
test_create_slope_table_small_half_step()82 void test_create_slope_table_small_half_step()
83 {
84 unsigned max_table_size = 1024;
85
86 // created approximately from LIDE 110 slow table: { 62464, 7896, 2632, 0 }
87 MotorSlope slope;
88 slope.initial_speed_w = 62464;
89 slope.max_speed_w = 2632;
90 slope.acceleration = 1.2e-8;
91
92 auto table = create_slope_table_for_speed(slope, 5000, StepType::HALF, 4, 8, max_table_size);
93
94 std::vector<std::uint16_t> expected_table = {
95 31232, 31232, 3210, 2500, 2500, 2500, 2500, 2500
96 };
97 ASSERT_EQ(table.table, expected_table);
98 ASSERT_EQ(table.table.size(), 8u);
99 ASSERT_EQ(table.pixeltime_sum(), 78174u);
100
101
102 table = create_slope_table_for_speed(slope, 3000, StepType::HALF, 4, 8, max_table_size);
103
104 expected_table = {
105 31232, 31232, 3210, 2276, 1860, 1611, 1500, 1500
106 };
107 ASSERT_EQ(table.table, expected_table);
108 ASSERT_EQ(table.table.size(), 8u);
109 ASSERT_EQ(table.pixeltime_sum(), 74421u);
110 }
111
test_create_slope_table_large_full_step()112 void test_create_slope_table_large_full_step()
113 {
114 unsigned max_table_size = 1024;
115
116 /* created approximately from Canon 8600F table:
117 54612, 54612, 34604, 26280, 21708, 18688, 16564, 14936, 13652, 12616,
118 11768, 11024, 10400, 9872, 9392, 8960, 8584, 8240, 7940, 7648,
119 7404, 7160, 6948, 6732, 6544, 6376, 6208, 6056, 5912, 5776,
120 5644, 5520, 5408, 5292, 5192, 5092, 5000, 4908, 4820, 4736,
121 4660, 4580, 4508, 4440, 4368, 4304, 4240, 4184, 4124, 4068,
122 4012, 3960, 3908, 3860, 3808, 3764, 3720, 3676, 3636, 3592,
123 3552, 3516, 3476, 3440, 3400, 3368, 3332, 3300, 3268, 3236,
124 3204, 3176, 3148, 3116, 3088, 3060, 3036, 3008, 2984, 2956,
125 2932, 2908, 2884, 2860, 2836, 2816, 2796, 2772, 2752, 2732,
126 2708, 2692, 2672, 2652, 2632, 2616, 2596, 2576, 2560, 2544,
127 2528, 2508, 2492, 2476, 2460, 2444, 2432, 2416, 2400, 2384,
128 2372, 2356, 2344, 2328, 2316, 2304, 2288, 2276, 2260, 2252,
129 2236, 2224, 2212, 2200, 2188, 2176, 2164, 2156, 2144, 2132,
130 2120, 2108, 2100, 2088, 2080, 2068, 2056, 2048, 2036, 2028,
131 2020, 2008, 2000, 1988, 1980, 1972, 1964, 1952, 1944, 1936,
132 1928, 1920, 1912, 1900, 1892, 1884, 1876, 1868, 1860, 1856,
133 1848, 1840, 1832, 1824, 1816, 1808, 1800, 1796, 1788, 1780,
134 1772, 1764, 1760, 1752, 1744, 1740, 1732, 1724, 1720, 1712,
135 1708, 1700, 1692, 1688, 1680, 1676, 1668, 1664, 1656, 1652,
136 1644, 1640, 1636, 1628, 1624, 1616, 1612, 1608, 1600, 1596,
137 1592, 1584, 1580, 1576, 1568, 1564, 1560, 1556, 1548, 1544,
138 1540, 1536, 1528, 1524, 1520, 1516, 1512, 1508, 1500,
139 */
140 MotorSlope slope;
141 slope.initial_speed_w = 54612;
142 slope.max_speed_w = 1500;
143 slope.acceleration = 1.013948e-9;
144
145 auto table = create_slope_table_for_speed(slope, 3000, StepType::FULL, 4, 8, max_table_size);
146
147 std::vector<std::uint16_t> expected_table = {
148 54612, 54612, 20570, 15090, 12481, 10880, 9770, 8943, 8295, 7771,
149 7335, 6964, 6645, 6366, 6120, 5900, 5702, 5523, 5359, 5210,
150 5072, 4945, 4826, 4716, 4613, 4517, 4426, 4341, 4260, 4184,
151 4111, 4043, 3977, 3915, 3855, 3799, 3744, 3692, 3642, 3594,
152 3548, 3503, 3461, 3419, 3379, 3341, 3304, 3268, 3233, 3199,
153 3166, 3135, 3104, 3074, 3045, 3017, 3000, 3000, 3000, 3000,
154 };
155 ASSERT_EQ(table.table, expected_table);
156 ASSERT_EQ(table.table.size(), 60u);
157 ASSERT_EQ(table.pixeltime_sum(), 412616u);
158
159
160 table = create_slope_table_for_speed(slope, 1500, StepType::FULL, 4, 8, max_table_size);
161
162 expected_table = {
163 54612, 54612, 20570, 15090, 12481, 10880, 9770, 8943, 8295, 7771,
164 7335, 6964, 6645, 6366, 6120, 5900, 5702, 5523, 5359, 5210,
165 5072, 4945, 4826, 4716, 4613, 4517, 4426, 4341, 4260, 4184,
166 4111, 4043, 3977, 3915, 3855, 3799, 3744, 3692, 3642, 3594,
167 3548, 3503, 3461, 3419, 3379, 3341, 3304, 3268, 3233, 3199,
168 3166, 3135, 3104, 3074, 3045, 3017, 2989, 2963, 2937, 2911,
169 2886, 2862, 2839, 2816, 2794, 2772, 2750, 2729, 2709, 2689,
170 2670, 2651, 2632, 2614, 2596, 2578, 2561, 2544, 2527, 2511,
171 2495, 2480, 2464, 2449, 2435, 2420, 2406, 2392, 2378, 2364,
172 2351, 2338, 2325, 2313, 2300, 2288, 2276, 2264, 2252, 2241,
173 2229, 2218, 2207, 2196, 2186, 2175, 2165, 2155, 2145, 2135,
174 2125, 2115, 2106, 2096, 2087, 2078, 2069, 2060, 2051, 2042,
175 2034, 2025, 2017, 2009, 2000, 1992, 1984, 1977, 1969, 1961,
176 1953, 1946, 1938, 1931, 1924, 1917, 1910, 1903, 1896, 1889,
177 1882, 1875, 1869, 1862, 1855, 1849, 1843, 1836, 1830, 1824,
178 1818, 1812, 1806, 1800, 1794, 1788, 1782, 1776, 1771, 1765,
179 1760, 1754, 1749, 1743, 1738, 1733, 1727, 1722, 1717, 1712,
180 1707, 1702, 1697, 1692, 1687, 1682, 1677, 1673, 1668, 1663,
181 1659, 1654, 1649, 1645, 1640, 1636, 1631, 1627, 1623, 1618,
182 1614, 1610, 1606, 1601, 1597, 1593, 1589, 1585, 1581, 1577,
183 1573, 1569, 1565, 1561, 1557, 1554, 1550, 1546, 1542, 1539,
184 1535, 1531, 1528, 1524, 1520, 1517, 1513, 1510, 1506, 1503,
185 1500, 1500, 1500, 1500,
186 };
187 ASSERT_EQ(table.table, expected_table);
188 ASSERT_EQ(table.table.size(), 224u);
189 ASSERT_EQ(table.pixeltime_sum(), 734910u);
190 }
191
test_create_slope_table_large_half_step()192 void test_create_slope_table_large_half_step()
193 {
194 unsigned max_table_size = 1024;
195
196 // created approximately from Canon 8600F table, see the full step test for the data
197
198 MotorSlope slope;
199 slope.initial_speed_w = 54612;
200 slope.max_speed_w = 1500;
201 slope.acceleration = 1.013948e-9;
202
203 auto table = create_slope_table_for_speed(slope, 3000, StepType::HALF, 4, 8, max_table_size);
204
205 std::vector<std::uint16_t> expected_table = {
206 27306, 27306, 10285, 7545, 6240, 5440, 4885, 4471, 4147, 3885,
207 3667, 3482, 3322, 3183, 3060, 2950, 2851, 2761, 2679, 2605,
208 2536, 2472, 2413, 2358, 2306, 2258, 2213, 2170, 2130, 2092,
209 2055, 2021, 1988, 1957, 1927, 1899, 1872, 1846, 1821, 1797,
210 1774, 1751, 1730, 1709, 1689, 1670, 1652, 1634, 1616, 1599,
211 1583, 1567, 1552, 1537, 1522, 1508, 1500, 1500, 1500, 1500,
212 };
213 ASSERT_EQ(table.table, expected_table);
214 ASSERT_EQ(table.table.size(), 60u);
215 ASSERT_EQ(table.pixeltime_sum(), 206294u);
216
217
218 table = create_slope_table_for_speed(slope, 1500, StepType::HALF, 4, 8, max_table_size);
219
220 expected_table = {
221 27306, 27306, 10285, 7545, 6240, 5440, 4885, 4471, 4147, 3885,
222 3667, 3482, 3322, 3183, 3060, 2950, 2851, 2761, 2679, 2605,
223 2536, 2472, 2413, 2358, 2306, 2258, 2213, 2170, 2130, 2092,
224 2055, 2021, 1988, 1957, 1927, 1899, 1872, 1846, 1821, 1797,
225 1774, 1751, 1730, 1709, 1689, 1670, 1652, 1634, 1616, 1599,
226 1583, 1567, 1552, 1537, 1522, 1508, 1494, 1481, 1468, 1455,
227 1443, 1431, 1419, 1408, 1397, 1386, 1375, 1364, 1354, 1344,
228 1335, 1325, 1316, 1307, 1298, 1289, 1280, 1272, 1263, 1255,
229 1247, 1240, 1232, 1224, 1217, 1210, 1203, 1196, 1189, 1182,
230 1175, 1169, 1162, 1156, 1150, 1144, 1138, 1132, 1126, 1120,
231 1114, 1109, 1103, 1098, 1093, 1087, 1082, 1077, 1072, 1067,
232 1062, 1057, 1053, 1048, 1043, 1039, 1034, 1030, 1025, 1021,
233 1017, 1012, 1008, 1004, 1000, 996, 992, 988, 984, 980,
234 976, 973, 969, 965, 962, 958, 955, 951, 948, 944,
235 941, 937, 934, 931, 927, 924, 921, 918, 915, 912,
236 909, 906, 903, 900, 897, 894, 891, 888, 885, 882,
237 880, 877, 874, 871, 869, 866, 863, 861, 858, 856,
238 853, 851, 848, 846, 843, 841, 838, 836, 834, 831,
239 829, 827, 824, 822, 820, 818, 815, 813, 811, 809,
240 807, 805, 803, 800, 798, 796, 794, 792, 790, 788,
241 786, 784, 782, 780, 778, 777, 775, 773, 771, 769,
242 767, 765, 764, 762, 760, 758, 756, 755, 753, 751,
243 750, 750, 750, 750,
244 };
245 ASSERT_EQ(table.table, expected_table);
246 ASSERT_EQ(table.table.size(), 224u);
247 ASSERT_EQ(table.pixeltime_sum(), 367399u);
248 }
249
test_motor()250 void test_motor()
251 {
252 test_create_slope_table_small_full_step();
253 test_create_slope_table_small_full_step_target_speed_too_high();
254 test_create_slope_table_small_half_step();
255 test_create_slope_table_large_full_step();
256 test_create_slope_table_large_half_step();
257 }
258
259 } // namespace genesys
260