• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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