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 "low.h"
24 
25 namespace genesys {
26 
27 StaticInit<std::vector<Genesys_Motor>> s_motors;
28 
genesys_init_motor_tables()29 void genesys_init_motor_tables()
30 {
31     s_motors.init();
32 
33     MotorProfile profile;
34 
35     Genesys_Motor motor;
36     motor.id = MotorId::UMAX;
37     motor.base_ydpi = 2400;
38     motor.profiles.push_back({MotorSlope::create_from_steps(11000, 3000, 128), StepType::FULL, 0});
39     motor.profiles.push_back({MotorSlope::create_from_steps(11000, 3000, 128), StepType::HALF, 0});
40     s_motors->push_back(std::move(motor));
41 
42 
43     motor = Genesys_Motor();
44     motor.id = MotorId::MD_5345; // MD5345/6228/6471
45     motor.base_ydpi = 2400;
46     motor.profiles.push_back({MotorSlope::create_from_steps(2000, 1375, 128), StepType::FULL, 0});
47     motor.profiles.push_back({MotorSlope::create_from_steps(2000, 1375, 128), StepType::HALF, 0});
48     s_motors->push_back(std::move(motor));
49 
50 
51     motor = Genesys_Motor();
52     motor.id = MotorId::ST24;
53     motor.base_ydpi = 2400;
54     motor.profiles.push_back({MotorSlope::create_from_steps(2289, 2100, 128), StepType::FULL, 0});
55     motor.profiles.push_back({MotorSlope::create_from_steps(2289, 2100, 128), StepType::HALF, 0});
56     s_motors->push_back(std::move(motor));
57 
58 
59     motor = Genesys_Motor();
60     motor.id = MotorId::HP3670;
61     motor.base_ydpi = 1200;
62     motor.profiles.push_back({MotorSlope::create_from_steps(11000, 3000, 128), StepType::FULL, 0});
63     motor.profiles.push_back({MotorSlope::create_from_steps(11000, 3000, 128), StepType::HALF, 0});
64     s_motors->push_back(std::move(motor));
65 
66 
67     motor = Genesys_Motor();
68     motor.id = MotorId::HP2400;
69     motor.base_ydpi = 1200;
70     motor.profiles.push_back({MotorSlope::create_from_steps(11000, 3000, 128), StepType::FULL, 0});
71     motor.profiles.push_back({MotorSlope::create_from_steps(11000, 3000, 128), StepType::HALF, 0});
72     s_motors->push_back(std::move(motor));
73 
74 
75     motor = Genesys_Motor();
76     motor.id = MotorId::HP2300;
77     motor.base_ydpi = 1200;
78     motor.profiles.push_back({MotorSlope::create_from_steps(3200, 1200, 128), StepType::FULL, 0});
79     motor.profiles.push_back({MotorSlope::create_from_steps(3200, 1200, 128), StepType::HALF, 0});
80     s_motors->push_back(std::move(motor));
81 
82 
83     motor = Genesys_Motor();
84     motor.id = MotorId::CANON_LIDE_35;
85     motor.base_ydpi = 1200;
86 
87     profile = MotorProfile{MotorSlope::create_from_steps(3500, 1300, 150), StepType::HALF, 0};
88     profile.resolutions = { 75, 150, 200, 300, 600 };
89     motor.profiles.push_back(profile);
90 
91     profile = MotorProfile{MotorSlope::create_from_steps(3500, 1300, 150), StepType::QUARTER, 0};
92     profile.resolutions = { 1200, 2400 };
93     motor.profiles.push_back(profile);
94 
95     profile = MotorProfile{MotorSlope::create_from_steps(3500, 1400, 150), StepType::FULL, 0};
96     profile.resolutions = { 75, 150, 200, 300 };
97     motor.fast_profiles.push_back(profile);
98 
99     profile = MotorProfile{MotorSlope::create_from_steps(6000, 3000, 100), StepType::FULL, 0};
100     profile.resolutions = { 600, 1200, 2400 };
101     motor.fast_profiles.push_back(profile);
102 
103     s_motors->push_back(std::move(motor));
104 
105 
106     motor = Genesys_Motor();
107     motor.id = MotorId::CANON_LIDE_60;
108     motor.base_ydpi = 1200;
109 
110     profile = MotorProfile{MotorSlope::create_from_steps(3500, 1400, 150), StepType::HALF, 0};
111     motor.profiles.push_back(profile);
112 
113     profile = MotorProfile{MotorSlope::create_from_steps(3500, 1400, 150), StepType::FULL, 0};
114     profile.resolutions = { 75, 150, 300 };
115     motor.fast_profiles.push_back(profile);
116 
117     profile = MotorProfile{MotorSlope::create_from_steps(6000, 3000, 100), StepType::FULL, 0};
118     profile.resolutions = { 600, 1200, 2400 };
119     motor.fast_profiles.push_back(profile);
120 
121     s_motors->push_back(std::move(motor));
122 
123 
124     motor = Genesys_Motor();
125     motor.id = MotorId::CANON_LIDE_90;
126     motor.base_ydpi = 1200;
127     profile = {MotorSlope::create_from_steps(8000, 3000, 200), StepType::FULL, 0};
128     profile.resolutions = { 150, 300 };
129     motor.profiles.push_back(profile);
130 
131     profile = {MotorSlope::create_from_steps(7000, 3000, 200), StepType::HALF, 0};
132     profile.resolutions = { 600, 1200 };
133     motor.profiles.push_back(profile);
134 
135     profile = {MotorSlope::create_from_steps(7000, 3000, 200), StepType::QUARTER, 0};
136     profile.resolutions = { 2400 };
137     motor.profiles.push_back(profile);
138     s_motors->push_back(std::move(motor));
139 
140 
141     motor = Genesys_Motor();
142     motor.id = MotorId::XP200;
143     motor.base_ydpi = 600;
144     motor.profiles.push_back({MotorSlope::create_from_steps(3500, 1300, 60), StepType::FULL, 0});
145     motor.profiles.push_back({MotorSlope::create_from_steps(3500, 1300, 60), StepType::HALF, 0});
146     motor.fast_profiles.push_back({MotorSlope::create_from_steps(3500, 1300, 60), StepType::FULL, 0});
147     s_motors->push_back(std::move(motor));
148 
149 
150     motor = Genesys_Motor();
151     motor.id = MotorId::XP300;
152     motor.base_ydpi = 300;
153     // works best with GPIO10, GPIO14 off
154     profile = MotorProfile{MotorSlope::create_from_steps(3700, 3700, 2), StepType::FULL, 0};
155     profile.resolutions = {}; // used during fast moves
156     motor.profiles.push_back(profile);
157 
158     // FIXME: this motor profile is useless
159     profile = MotorProfile{MotorSlope::create_from_steps(11000, 11000, 2), StepType::HALF, 0};
160     profile.resolutions = {75, 150, 300, 600};
161     motor.profiles.push_back(profile);
162 
163     profile = MotorProfile{MotorSlope::create_from_steps(3700, 3700, 2), StepType::FULL, 0};
164     motor.fast_profiles.push_back(profile);
165     s_motors->push_back(std::move(motor));
166 
167 
168     motor = Genesys_Motor();
169     motor.id = MotorId::DP665;
170     motor.base_ydpi = 750;
171 
172     profile = MotorProfile{MotorSlope::create_from_steps(3000, 2500, 10), StepType::FULL, 0};
173     profile.resolutions = {75, 150};
174     motor.profiles.push_back(profile);
175 
176     // FIXME: this motor profile is useless
177     profile = MotorProfile{MotorSlope::create_from_steps(11000, 11000, 2), StepType::HALF, 0};
178     profile.resolutions = {300, 600, 1200};
179     motor.profiles.push_back(profile);
180 
181     profile = MotorProfile{MotorSlope::create_from_steps(3000, 2500, 10), StepType::FULL, 0};
182     motor.fast_profiles.push_back(profile);
183     s_motors->push_back(std::move(motor));
184 
185 
186     motor = Genesys_Motor();
187     motor.id = MotorId::ROADWARRIOR;
188     motor.base_ydpi = 750;
189 
190     profile = MotorProfile{MotorSlope::create_from_steps(3000, 2600, 10), StepType::FULL, 0};
191     profile.resolutions = {75, 150};
192     motor.profiles.push_back(profile);
193 
194     // FIXME: this motor profile is useless
195     profile = MotorProfile{MotorSlope::create_from_steps(11000, 11000, 2), StepType::HALF, 0};
196     profile.resolutions = {300, 600, 1200};
197     motor.profiles.push_back(profile);
198 
199     profile = MotorProfile{MotorSlope::create_from_steps(3000, 2600, 10), StepType::FULL, 0};
200     motor.fast_profiles.push_back(profile);
201     s_motors->push_back(std::move(motor));
202 
203 
204     motor = Genesys_Motor();
205     motor.id = MotorId::DSMOBILE_600;
206     motor.base_ydpi = 750;
207 
208     profile = MotorProfile{MotorSlope::create_from_steps(6666, 3700, 8), StepType::FULL, 0};
209     profile.resolutions = {75, 150};
210     motor.profiles.push_back(profile);
211 
212     profile = MotorProfile{MotorSlope::create_from_steps(6666, 3700, 8), StepType::HALF, 0};
213     profile.resolutions = {300, 600, 1200};
214     motor.profiles.push_back(profile);
215 
216     profile = MotorProfile{MotorSlope::create_from_steps(6666, 3700, 8), StepType::FULL, 0};
217     motor.fast_profiles.push_back(profile);
218     s_motors->push_back(std::move(motor));
219 
220 
221     motor = Genesys_Motor();
222     motor.id = MotorId::CANON_LIDE_100;
223     motor.base_ydpi = 1200;
224     motor.profiles.push_back({MotorSlope::create_from_steps(46876, 864, 255),
225                               StepType::HALF, 1432});
226     motor.profiles.push_back({MotorSlope::create_from_steps(46876, 864, 279),
227                               StepType::QUARTER, 2712});
228     motor.profiles.push_back({MotorSlope::create_from_steps(31680, 864, 247),
229                               StepType::EIGHTH, 5280});
230     s_motors->push_back(std::move(motor));
231 
232 
233     motor = Genesys_Motor();
234     motor.id = MotorId::CANON_LIDE_200;
235     motor.base_ydpi = 1200;
236     motor.profiles.push_back({MotorSlope::create_from_steps(46876, 864, 255),
237                               StepType::HALF, 1432});
238     motor.profiles.push_back({MotorSlope::create_from_steps(46876, 864, 279),
239                               StepType::QUARTER, 2712});
240     motor.profiles.push_back({MotorSlope::create_from_steps(31680, 864, 247),
241                               StepType::EIGHTH, 5280});
242     motor.profiles.push_back({MotorSlope::create_from_steps(31680, 864, 247),
243                               StepType::EIGHTH, 10416});
244     s_motors->push_back(std::move(motor));
245 
246 
247     motor = Genesys_Motor();
248     motor.id = MotorId::CANON_LIDE_700;
249     motor.base_ydpi = 1200;
250     motor.profiles.push_back({MotorSlope::create_from_steps(46876, 534, 255),
251                               StepType::HALF, 1424});
252     motor.profiles.push_back({MotorSlope::create_from_steps(46876, 534, 255),
253                               StepType::HALF, 1504});
254     motor.profiles.push_back({MotorSlope::create_from_steps(46876, 2022, 127),
255                               StepType::HALF, 2696});
256     motor.profiles.push_back({MotorSlope::create_from_steps(46876, 534, 255),
257                               StepType::HALF, 2848});
258     motor.profiles.push_back({MotorSlope::create_from_steps(46876, 15864, 2),
259                               StepType::EIGHTH, 10576});
260     s_motors->push_back(std::move(motor));
261 
262 
263     motor = Genesys_Motor();
264     motor.id = MotorId::KVSS080;
265     motor.base_ydpi = 1200;
266     motor.profiles.push_back({MotorSlope::create_from_steps(44444, 500, 489),
267                               StepType::HALF, 8000});
268     s_motors->push_back(std::move(motor));
269 
270 
271     motor = Genesys_Motor();
272     motor.id = MotorId::G4050;
273     motor.base_ydpi = 2400;
274     motor.profiles.push_back({MotorSlope::create_from_steps(7842, 320, 602),
275                               StepType::HALF, 8016});
276     motor.profiles.push_back({MotorSlope::create_from_steps(9422, 254, 1004),
277                               StepType::HALF, 15624});
278     motor.profiles.push_back({MotorSlope::create_from_steps(28032, 2238, 604),
279                               StepType::HALF, 56064});
280     motor.profiles.push_back({MotorSlope::create_from_steps(42752, 1706, 610),
281                               StepType::QUARTER, 42752});
282     s_motors->push_back(std::move(motor));
283 
284 
285     motor = Genesys_Motor();
286     motor.id = MotorId::CANON_4400F;
287     motor.base_ydpi = 2400;
288 
289     profile = MotorProfile();
290     profile.slope = MotorSlope::create_from_steps(28597 * 2, 727 * 2, 200);
291     profile.step_type = StepType::QUARTER;
292     profile.motor_vref = 1;
293     profile.resolutions = { 300, 600 };
294     motor.profiles.push_back(std::move(profile));
295 
296     profile = MotorProfile();
297     profile.slope = MotorSlope::create_from_steps(28597 * 2, 727 * 2, 200);
298     profile.step_type = StepType::QUARTER;
299     profile.motor_vref = 0;
300     profile.resolutions = { 1200, 2400, 4800, 9600 };
301     motor.profiles.push_back(std::move(profile));
302 
303     profile = MotorProfile();
304     profile.slope = MotorSlope::create_from_steps(28597 * 2, 279 * 2, 1000);
305     profile.step_type = StepType::QUARTER;
306     profile.motor_vref = 0;
307     motor.fast_profiles.push_back(std::move(profile));
308 
309     s_motors->push_back(std::move(motor));
310 
311 
312     motor = Genesys_Motor();
313     motor.id = MotorId::CANON_5600F;
314     motor.base_ydpi = 2400;
315 
316     // FIXME: real limit is 134, but for some reason the motor can't acquire that speed.
317     profile = MotorProfile();
318     profile.slope = MotorSlope::create_from_steps(2500 * 2, 134 * 2, 1000);
319     profile.step_type = StepType::HALF;
320     profile.motor_vref = 0;
321     profile.resolutions = { 75, 150 };
322     motor.profiles.push_back(std::move(profile));
323 
324     profile = MotorProfile();
325     profile.slope = MotorSlope::create_from_steps(2500 * 2, 200 * 2, 1000);
326     profile.step_type = StepType::QUARTER;
327     profile.motor_vref = 0;
328     profile.resolutions = { 300, 600, 1200, 2400, 4800 };
329     motor.profiles.push_back(std::move(profile));
330 
331     profile = MotorProfile();
332     profile.slope = MotorSlope::create_from_steps(2500 * 2, 200 * 2, 1000);
333     profile.step_type = StepType::QUARTER;
334     profile.motor_vref = 0;
335     motor.fast_profiles.push_back(std::move(profile));
336 
337     s_motors->push_back(std::move(motor));
338 
339 
340     motor = Genesys_Motor();
341     motor.id = MotorId::CANON_8400F;
342     motor.base_ydpi = 1600;
343 
344     profile = MotorProfile();
345     profile.slope = MotorSlope::create_from_steps(20202 * 4, 333 * 4, 100);
346     profile.step_type = StepType::QUARTER;
347     profile.motor_vref = 0;
348     profile.resolutions = VALUE_FILTER_ANY;
349     profile.scan_methods = { ScanMethod::FLATBED };
350     motor.profiles.push_back(std::move(profile));
351 
352     profile = MotorProfile();
353     profile.slope = MotorSlope::create_from_steps(65535 * 4, 333 * 4, 100);
354     profile.step_type = StepType::QUARTER;
355     profile.motor_vref = 2;
356     profile.resolutions = VALUE_FILTER_ANY;
357     profile.scan_methods = { ScanMethod::TRANSPARENCY, ScanMethod::TRANSPARENCY_INFRARED };
358     motor.profiles.push_back(std::move(profile));
359 
360     profile = MotorProfile();
361     profile.slope = MotorSlope::create_from_steps(65535 * 4, 333 * 4, 200);
362     profile.step_type = StepType::QUARTER;
363     profile.motor_vref = 2;
364     profile.resolutions = VALUE_FILTER_ANY;
365     profile.scan_methods = VALUE_FILTER_ANY;
366     motor.fast_profiles.push_back(std::move(profile));
367 
368     s_motors->push_back(std::move(motor));
369 
370 
371     motor = Genesys_Motor();
372     motor.id = MotorId::CANON_8600F;
373     motor.base_ydpi = 2400;
374 
375     profile = MotorProfile();
376     profile.slope = MotorSlope::create_from_steps(54612, 1500, 219);
377     profile.step_type = StepType::QUARTER;
378     profile.motor_vref = 3;
379     profile.resolutions = { 300, 600 };
380     profile.scan_methods = { ScanMethod::FLATBED };
381     motor.profiles.push_back(std::move(profile));
382 
383     profile = MotorProfile();
384     profile.slope = MotorSlope::create_from_steps(54612, 1500, 219);
385     profile.step_type = StepType::QUARTER;
386     profile.motor_vref = 2;
387     profile.resolutions = { 1200, 2400 };
388     profile.scan_methods = { ScanMethod::FLATBED };
389     motor.profiles.push_back(std::move(profile));
390 
391     profile = MotorProfile();
392     profile.slope = MotorSlope::create_from_steps(54612, 1500, 219);
393     profile.step_type = StepType::QUARTER;
394     profile.motor_vref = 2;
395     profile.resolutions = { 4800 };
396     profile.scan_methods = { ScanMethod::FLATBED };
397     motor.profiles.push_back(std::move(profile));
398 
399     profile = MotorProfile();
400     profile.slope = MotorSlope::create_from_steps(54612, 1500, 219);
401     profile.step_type = StepType::QUARTER;
402     profile.motor_vref = 2;
403     profile.resolutions = { 300, 600 };
404     profile.scan_methods = { ScanMethod::TRANSPARENCY,
405                              ScanMethod::TRANSPARENCY_INFRARED };
406     motor.profiles.push_back(std::move(profile));
407 
408     profile = MotorProfile();
409     profile.slope = MotorSlope::create_from_steps(54612, 1500, 219);
410     profile.step_type = StepType::QUARTER;
411     profile.motor_vref = 1;
412     profile.resolutions = { 1200, 2400 };
413     profile.scan_methods = { ScanMethod::TRANSPARENCY,
414                              ScanMethod::TRANSPARENCY_INFRARED };
415     motor.profiles.push_back(std::move(profile));
416 
417     profile = MotorProfile();
418     profile.slope = MotorSlope::create_from_steps(54612, 1500, 219);
419     profile.step_type = StepType::QUARTER;
420     profile.motor_vref = 0;
421     profile.resolutions = { 4800 };
422     profile.scan_methods = { ScanMethod::TRANSPARENCY,
423                              ScanMethod::TRANSPARENCY_INFRARED };
424     motor.profiles.push_back(std::move(profile));
425 
426     profile = MotorProfile();
427     profile.slope = MotorSlope::create_from_steps(59240, 582, 1020);
428     profile.step_type = StepType::QUARTER;
429     profile.motor_vref = 2;
430     motor.fast_profiles.push_back(std::move(profile));
431 
432     s_motors->push_back(std::move(motor));
433 
434 
435     motor = Genesys_Motor();
436     motor.id = MotorId::CANON_LIDE_110;
437     motor.base_ydpi = 4800;
438     motor.profiles.push_back({MotorSlope::create_from_steps(62496, 335, 255),
439                               StepType::FULL, 2768});
440     motor.profiles.push_back({MotorSlope::create_from_steps(62496, 335, 469),
441                               StepType::HALF, 5360});
442     motor.profiles.push_back({MotorSlope::create_from_steps(62496, 2632, 3),
443                               StepType::HALF, 10528});
444     motor.profiles.push_back({MotorSlope::create_from_steps(62496, 10432, 3),
445                               StepType::QUARTER, 20864});
446     s_motors->push_back(std::move(motor));
447 
448 
449     motor = Genesys_Motor();
450     motor.id = MotorId::CANON_LIDE_120;
451     motor.base_ydpi = 4800;
452     motor.profiles.push_back({MotorSlope::create_from_steps(62496, 864, 127),
453                               StepType::FULL, 4608});
454     motor.profiles.push_back({MotorSlope::create_from_steps(62496, 1338, 63),
455                               StepType::HALF, 5360});
456     motor.profiles.push_back({MotorSlope::create_from_steps(62464, 2632, 3),
457                               StepType::QUARTER, 10528});
458     motor.profiles.push_back({MotorSlope::create_from_steps(62592, 10432, 5),
459                               StepType::QUARTER, 20864});
460     s_motors->push_back(std::move(motor));
461 
462 
463     motor = Genesys_Motor();
464     motor.id = MotorId::CANON_LIDE_210;
465     motor.base_ydpi = 4800;
466     motor.profiles.push_back({MotorSlope::create_from_steps(62496, 335, 255),
467                               StepType::FULL, 2768});
468     motor.profiles.push_back({MotorSlope::create_from_steps(62496, 335, 469),
469                               StepType::HALF, 5360});
470     motor.profiles.push_back({MotorSlope::create_from_steps(62496, 2632, 3),
471                               StepType::HALF, 10528});
472     motor.profiles.push_back({MotorSlope::create_from_steps(62496, 10432, 4),
473                               StepType::QUARTER, 20864});
474     motor.profiles.push_back({MotorSlope::create_from_steps(62496, 10432, 4),
475                               StepType::EIGHTH, 41536});
476     s_motors->push_back(std::move(motor));
477 
478 
479     motor = Genesys_Motor();
480     motor.id = MotorId::PLUSTEK_OPTICPRO_3600;
481     motor.base_ydpi = 1200;
482 
483     profile = MotorProfile{MotorSlope::create_from_steps(3500, 1300, 60), StepType::FULL, 0};
484     profile.resolutions = {75, 100, 150, 200};
485     motor.profiles.push_back(profile);
486 
487     // FIXME: this motor profile is almost useless
488     profile = MotorProfile{MotorSlope::create_from_steps(3500, 3250, 60), StepType::HALF, 0};
489     profile.resolutions = {300, 400, 600, 1200};
490     motor.profiles.push_back(profile);
491 
492     profile = MotorProfile{MotorSlope::create_from_steps(3500, 1300, 60), StepType::FULL, 0};
493     motor.fast_profiles.push_back(profile);
494     s_motors->push_back(std::move(motor));
495 
496 
497     motor = Genesys_Motor();
498     motor.id = MotorId::PLUSTEK_OPTICFILM_7200;
499     motor.base_ydpi = 3600;
500 
501     profile = MotorProfile();
502     profile.slope = MotorSlope::create_from_steps(20000 * 2, 600 * 2, 200);
503     profile.step_type = StepType::HALF;
504     profile.motor_vref = 0;
505     motor.profiles.push_back(std::move(profile));
506 
507     s_motors->push_back(std::move(motor));
508 
509 
510     motor = Genesys_Motor();
511     motor.id = MotorId::PLUSTEK_OPTICFILM_7200I;
512     motor.base_ydpi = 3600;
513 
514     profile = MotorProfile();
515     profile.slope = MotorSlope::create_from_steps(34722 * 2, 454 * 2, 40);
516     profile.step_type = StepType::HALF;
517     profile.motor_vref = 3;
518     motor.profiles.push_back(std::move(profile));
519 
520     profile = MotorProfile();
521     profile.slope = MotorSlope::create_from_steps(34722 * 2, 454 * 2, 40);
522     profile.step_type = StepType::HALF;
523     profile.motor_vref = 0;
524     motor.fast_profiles.push_back(std::move(profile));
525 
526     s_motors->push_back(std::move(motor));
527 
528 
529     motor = Genesys_Motor();
530     motor.id = MotorId::PLUSTEK_OPTICFILM_7300;
531     motor.base_ydpi = 3600;
532 
533     profile = MotorProfile();
534     profile.slope = MotorSlope::create_from_steps(56818 * 4, 454 * 4, 30);
535     profile.step_type = StepType::QUARTER;
536     profile.motor_vref = 3;
537     motor.profiles.push_back(std::move(profile));
538 
539     profile = MotorProfile();
540     profile.slope = MotorSlope::create_from_steps(56818 * 4, 454 * 4, 30);
541     profile.step_type = StepType::QUARTER;
542     profile.motor_vref = 0;
543     motor.fast_profiles.push_back(std::move(profile));
544 
545     s_motors->push_back(std::move(motor));
546 
547 
548     motor = Genesys_Motor();
549     motor.id = MotorId::PLUSTEK_OPTICFILM_7400;
550     motor.base_ydpi = 3600;
551 
552     profile = MotorProfile();
553     profile.slope = MotorSlope::create_from_steps(64102 * 4, 400 * 4, 30);
554     profile.step_type = StepType::QUARTER;
555     profile.motor_vref = 3;
556     motor.profiles.push_back(profile);
557     motor.fast_profiles.push_back(profile);
558     s_motors->push_back(std::move(motor));
559 
560 
561     motor = Genesys_Motor();
562     motor.id = MotorId::PLUSTEK_OPTICFILM_7500I;
563     motor.base_ydpi = 3600;
564 
565     profile = MotorProfile();
566     profile.slope = MotorSlope::create_from_steps(56818 * 4, 454 * 4, 30);
567     profile.step_type = StepType::QUARTER;
568     profile.motor_vref = 3;
569     motor.profiles.push_back(std::move(profile));
570 
571     profile = MotorProfile();
572     profile.slope = MotorSlope::create_from_steps(56818 * 4, 454 * 4, 30);
573     profile.step_type = StepType::QUARTER;
574     profile.motor_vref = 0;
575     motor.fast_profiles.push_back(std::move(profile));
576 
577     s_motors->push_back(std::move(motor));
578 
579 
580     motor = Genesys_Motor();
581     motor.id = MotorId::PLUSTEK_OPTICFILM_8200I;
582     motor.base_ydpi = 3600;
583 
584     profile = MotorProfile();
585     profile.slope = MotorSlope::create_from_steps(64102 * 4, 400 * 4, 100);
586     profile.step_type = StepType::QUARTER;
587     profile.motor_vref = 3;
588     motor.profiles.push_back(profile);
589     motor.fast_profiles.push_back(profile);
590     s_motors->push_back(std::move(motor));
591 
592 
593     motor = Genesys_Motor();
594     motor.id = MotorId::IMG101;
595     motor.base_ydpi = 600;
596     motor.profiles.push_back({MotorSlope::create_from_steps(22000, 1000, 1017),
597                               StepType::HALF, 11000});
598     s_motors->push_back(std::move(motor));
599 
600 
601     motor = Genesys_Motor();
602     motor.id = MotorId::PLUSTEK_OPTICBOOK_3800;
603     motor.base_ydpi = 600;
604     motor.profiles.push_back({MotorSlope::create_from_steps(22000, 1000, 1017),
605                               StepType::HALF, 11000});
606     s_motors->push_back(std::move(motor));
607 
608 
609     motor = Genesys_Motor();
610     motor.id = MotorId::CANON_LIDE_80;
611     motor.base_ydpi = 2400;
612     motor.profiles.push_back({MotorSlope::create_from_steps(9560, 1912, 31), StepType::FULL, 0});
613     s_motors->push_back(std::move(motor));
614 }
615 
616 } // namespace genesys
617