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
25namespace genesys {
26
27StaticInit<std::vector<Genesys_Motor>> s_motors;
28
29void 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