genesys: Return MotorSlopeTable out of *_generate_slope_table()

merge-requests/274/head
Povilas Kanapickas 2019-12-14 10:20:08 +02:00
rodzic 8731a6cc5d
commit c685ac075b
3 zmienionych plików z 42 dodań i 94 usunięć

Wyświetl plik

@ -324,7 +324,6 @@ void sanei_genesys_init_structs (Genesys_Device * dev)
* of the table. The summed time of the acceleration steps is returned, and the
* number of accerelation steps is put into used_steps.
*
* @param slope_table Table to write to
* @param max_steps Size of slope_table in steps
* @param use_steps Maximum number of steps to use for acceleration
* @param stop_at Minimum step time to use
@ -332,34 +331,20 @@ void sanei_genesys_init_structs (Genesys_Device * dev)
* @param vend End step time of default slope
* @param steps Step count of default slope
* @param g Power for default slope
* @param used_steps Final number of steps is stored here
* @param vfinal Final step time is stored here
* @return Time for acceleration
* @return Motor slope table
* @note All times in pixel time. Correction for other motor timings is not
* done.
*/
SANE_Int sanei_genesys_generate_slope_table(std::vector<uint16_t>& slope_table,
unsigned int max_steps,
unsigned int use_steps,
uint16_t stop_at,
uint16_t vstart,
uint16_t vend,
unsigned int steps,
double g,
unsigned int *used_steps,
unsigned int *vfinal)
MotorSlopeTable sanei_genesys_generate_slope_table(unsigned max_steps, unsigned use_steps,
std::uint16_t stop_at, std::uint16_t vstart,
std::uint16_t vend, unsigned steps, double g)
{
MotorSlopeTable table;
double t;
SANE_Int sum = 0;
unsigned int i;
unsigned int c = 0;
uint16_t t2;
unsigned int dummy;
unsigned int _vfinal;
if (!used_steps)
used_steps = &dummy;
if (!vfinal)
vfinal = &_vfinal;
DBG(DBG_proc, "%s: table size: %d\n", __func__, max_steps);
@ -368,12 +353,10 @@ SANE_Int sanei_genesys_generate_slope_table(std::vector<uint16_t>& slope_table,
DBG(DBG_proc, "%s: target slope: vstart: %d, vend: %d, steps: %d, g: %g\n", __func__, vstart,
vend, steps, g);
sum = 0;
c = 0;
*used_steps = 0;
slope_table.clear();
slope_table.reserve(max_steps);
table.table.clear();
table.table.reserve(max_steps);
if (use_steps < 1)
use_steps = 1;
@ -388,34 +371,29 @@ SANE_Int sanei_genesys_generate_slope_table(std::vector<uint16_t>& slope_table,
if (t2 < stop_at) {
break;
}
slope_table.push_back(t2);
/* DBG (DBG_io, "slope_table[%3d] = %5d\n", c, t2); */
sum += t2;
table.table.push_back(t2);
table.pixeltime_sum += t2;
}
if (t2 > stop_at)
{
DBG(DBG_warn, "Can not reach target speed(%d) in %d steps.\n", stop_at, use_steps);
DBG(DBG_warn, "Expect image to be distorted. Ignore this if only feeding.\n");
}
*vfinal = t2;
*used_steps += i;
table.final_exposure = t2;
table.steps_count += i;
max_steps -= i;
}
else
*vfinal = stop_at;
for (i = 0; i < max_steps; i++, c++)
{
slope_table.push_back(*vfinal);
/* DBG (DBG_io, "slope_table[%3d] = %5d\n", c, *vfinal); */
} else {
table.final_exposure = stop_at;
}
(*used_steps)++;
sum += *vfinal;
for (unsigned i = 0; i < max_steps; i++, c++) {
table.table.push_back(table.final_exposure);
}
DBG(DBG_proc, "%s: returns sum=%d, used %d steps, completed\n", __func__, sum, *used_steps);
table.steps_count++;
table.pixeltime_sum += table.final_exposure;
return sum;
return table;
}
/* Generate slope table for motor movement */
@ -446,12 +424,9 @@ MotorSlopeTable sanei_genesys_create_slope_table3(const Genesys_Motor& motor,
int exposure_time,
unsigned yres)
{
MotorSlopeTable table;
unsigned int vtarget;
unsigned int vend;
unsigned int vstart;
unsigned int vfinal;
DBG(DBG_proc, "%s: step_type = %d, exposure_time = %d, yres = %d\n", __func__,
static_cast<unsigned>(step_type), exposure_time, yres);
@ -469,20 +444,10 @@ MotorSlopeTable sanei_genesys_create_slope_table3(const Genesys_Motor& motor,
vstart = std::min(vstart >> u_step_type, 65535u);
vend = std::min(vend >> u_step_type, 65535u);
unsigned used_steps = 0;
table.pixeltime_sum = sanei_genesys_generate_slope_table(table.table,
max_steps,
use_steps,
vtarget,
vstart,
vend,
slope.minimum_steps << u_step_type,
slope.g,
&used_steps,
&vfinal);
auto table = sanei_genesys_generate_slope_table(max_steps, use_steps, vtarget, vstart, vend,
slope.minimum_steps << u_step_type, slope.g);
table.steps_count = used_steps;
table.final_exposure = (vfinal * motor.base_ydpi) / yres;
table.final_exposure = (table.final_exposure * motor.base_ydpi) / yres;
return table;
}

Wyświetl plik

@ -179,7 +179,6 @@ void CommandSetGl646::init_regs_for_scan_session(Genesys_Device* dev, const Gene
int i, nb;
Motor_Master *motor = nullptr;
unsigned int used1, used2, vfinal;
uint32_t z1, z2;
int feedl;
@ -218,17 +217,12 @@ void CommandSetGl646::init_regs_for_scan_session(Genesys_Device* dev, const Gene
}
/* now generate slope tables : we are not using generate_slope_table3 yet */
std::vector<std::uint16_t> slope_table1, slope_table2;
sanei_genesys_generate_slope_table (slope_table1, motor->steps1,
motor->steps1 + 1, motor->vend1,
motor->vstart1, motor->vend1,
motor->steps1, motor->g1, &used1,
&vfinal);
sanei_genesys_generate_slope_table (slope_table2, motor->steps2,
motor->steps2 + 1, motor->vend2,
motor->vstart2, motor->vend2,
motor->steps2, motor->g2, &used2,
&vfinal);
auto slope_table1 = sanei_genesys_generate_slope_table(motor->steps1, motor->steps1 + 1,
motor->vend1, motor->vstart1,
motor->vend1, motor->steps1, motor->g1);
auto slope_table2 = sanei_genesys_generate_slope_table(motor->steps2, motor->steps2 + 1,
motor->vend2, motor->vstart2,
motor->vend2, motor->steps2, motor->g2);
/* R01 */
/* now setup other registers for final scan (ie with shading enabled) */
@ -506,7 +500,7 @@ void CommandSetGl646::init_regs_for_scan_session(Genesys_Device* dev, const Gene
sanei_genesys_calculate_zmod(regs->find_reg(0x02).value & REG_0x02_FASTFED,
sensor.exposure_lperiod,
slope_table1,
slope_table1.table,
motor->steps1,
move, motor->fwdbwd, &z1, &z2);
@ -557,8 +551,8 @@ void CommandSetGl646::init_regs_for_scan_session(Genesys_Device* dev, const Gene
}
}
gl646_send_slope_table(dev, 0, slope_table1, regs->get8(0x21));
gl646_send_slope_table(dev, 1, slope_table2, regs->get8(0x6b));
gl646_send_slope_table(dev, 0, slope_table1.table, regs->get8(0x21));
gl646_send_slope_table(dev, 1, slope_table2.table, regs->get8(0x6b));
}
@ -1094,8 +1088,7 @@ void CommandSetGl646::load_document(Genesys_Device* dev) const
// FIXME: sequential not really needed in this case
Genesys_Register_Set regs(Genesys_Register_Set::SEQUENTIAL);
unsigned int used, vfinal, count;
std::vector<uint16_t> slope_table;
unsigned count;
/* no need to load document is flatbed scanner */
if (!dev->model->is_sheetfed) {
@ -1154,16 +1147,12 @@ void CommandSetGl646::load_document(Genesys_Device* dev) const
regs.init_reg(0x24, 4);
/* generate slope table 2 */
sanei_genesys_generate_slope_table (slope_table,
50,
51,
2400,
6000, 2400, 50, 0.25, &used, &vfinal);
auto slope_table = sanei_genesys_generate_slope_table(50, 51, 2400, 6000, 2400, 50, 0.25);
// document loading:
// send regs
// start motor
// wait e1 status to become e0
gl646_send_slope_table(dev, 1, slope_table, 50);
gl646_send_slope_table(dev, 1, slope_table.table, 50);
dev->interface->write_registers(regs);
@ -1257,8 +1246,7 @@ void CommandSetGl646::eject_document(Genesys_Device* dev) const
// FIXME: SEQUENTIAL not really needed in this case
Genesys_Register_Set regs((Genesys_Register_Set::SEQUENTIAL));
unsigned int used, vfinal, count;
std::vector<uint16_t> slope_table;
unsigned count;
std::uint8_t gpio;
/* at the end there will be noe more document */
@ -1314,16 +1302,12 @@ void CommandSetGl646::eject_document(Genesys_Device* dev) const
regs.init_reg(0x24, 4);
/* generate slope table 2 */
sanei_genesys_generate_slope_table (slope_table,
60,
61,
1600,
10000, 1600, 60, 0.25, &used, &vfinal);
auto slope_table = sanei_genesys_generate_slope_table(60, 61, 1600, 10000, 1600, 60, 0.25);
// document eject:
// send regs
// start motor
// wait c1 status to become c8 : HOMESNR and ~MOTFLAG
gl646_send_slope_table(dev, 1, slope_table, 60);
gl646_send_slope_table(dev, 1, slope_table.table, 60);
dev->interface->write_registers(regs);

Wyświetl plik

@ -323,11 +323,10 @@ unsigned sanei_genesys_get_bulk_max_size(AsicType asic_type);
SANE_Int sanei_genesys_exposure_time2(Genesys_Device * dev, float ydpi, StepType step_type,
int endpixel, int led_exposure);
SANE_Int sanei_genesys_generate_slope_table(std::vector<uint16_t>& slope_table, unsigned int max_steps,
unsigned int use_steps, uint16_t stop_at,
uint16_t vstart, uint16_t vend,
unsigned int steps, double g,
unsigned int *used_steps, unsigned int *vfinal);
MotorSlopeTable sanei_genesys_generate_slope_table(unsigned max_steps,
unsigned use_steps, std::uint16_t stop_at,
std::uint16_t vstart, std::uint16_t vend,
unsigned steps, double g);
MotorSlopeTable sanei_genesys_create_slope_table3(const Genesys_Motor& motor,
unsigned max_steps,