diff --git a/backend/genesys/genesys.cpp b/backend/genesys/genesys.cpp index 986517f12..b905e214f 100644 --- a/backend/genesys/genesys.cpp +++ b/backend/genesys/genesys.cpp @@ -973,6 +973,30 @@ void scanner_stop_action(Genesys_Device& dev) } } +void scanner_stop_action_no_move(Genesys_Device& dev, genesys::Genesys_Register_Set& regs) +{ + switch (dev.model->asic_type) { + case AsicType::GL646: + case AsicType::GL841: + case AsicType::GL843: + case AsicType::GL845: + case AsicType::GL846: + case AsicType::GL847: + case AsicType::GL124: + break; + default: + throw SaneException("Unsupported asic type"); + } + + regs_set_optical_off(dev.model->asic_type, regs); + // same across all supported ASICs + dev.interface->write_register(0x01, regs.get8(0x01)); + + // looks like certain scanners lock up if we try to scan immediately after stopping previous + // action. + dev.interface->sleep_ms(100); +} + void scanner_move(Genesys_Device& dev, unsigned steps, Direction direction) { DBG_HELPER_ARGS(dbg, "steps=%d direction=%d", steps, static_cast(direction)); diff --git a/backend/genesys/gl124.cpp b/backend/genesys/gl124.cpp index 278975e4a..71cfd1122 100644 --- a/backend/genesys/gl124.cpp +++ b/backend/genesys/gl124.cpp @@ -1016,11 +1016,7 @@ void gl124_stop_action(Genesys_Device* dev) return; } - /* ends scan */ - regs_set_optical_off(dev->model->asic_type, dev->reg); - dev->interface->write_register(REG_0x01, dev->reg.get8(REG_0x01)); - - dev->interface->sleep_ms(100); + scanner_stop_action_no_move(*dev, dev->reg); if (is_testing_mode()) { return; diff --git a/backend/genesys/gl841.cpp b/backend/genesys/gl841.cpp index 46a7bb741..d1b1a6c03 100644 --- a/backend/genesys/gl841.cpp +++ b/backend/genesys/gl841.cpp @@ -2253,9 +2253,7 @@ void CommandSetGl841::slow_back_home(Genesys_Device* dev, bool wait_until_home) return; } - /* end previous scan if any */ - regs_set_optical_off(dev->model->asic_type, dev->reg); - dev->interface->write_register(REG_0x01, dev->reg.get8(REG_0x01)); + scanner_stop_action_no_move(*dev, dev->reg); /* if motor is on, stop current action */ if (status.is_motor_enabled) { diff --git a/backend/genesys/gl843.cpp b/backend/genesys/gl843.cpp index 405b6235f..f967f599d 100644 --- a/backend/genesys/gl843.cpp +++ b/backend/genesys/gl843.cpp @@ -1315,14 +1315,6 @@ void CommandSetGl843::set_powersaving(Genesys_Device* dev, int delay /* in minut DBG_HELPER_ARGS(dbg, "delay = %d", delay); } -static void gl843_stop_action_no_move(Genesys_Device* dev, Genesys_Register_Set* reg) -{ - DBG_HELPER(dbg); - regs_set_optical_off(dev->model->asic_type, *reg); - dev->interface->write_register(REG_0x01, reg->get8(REG_0x01)); - dev->interface->sleep_ms(100); -} - void gl843_stop_action(Genesys_Device* dev) { DBG_HELPER(dbg); @@ -1339,11 +1331,7 @@ void gl843_stop_action(Genesys_Device* dev) return; } - // ends scan - regs_set_optical_off(dev->model->asic_type, dev->reg); - dev->interface->write_register(REG_0x01, dev->reg.get8(REG_0x01)); - - dev->interface->sleep_ms(100); + scanner_stop_action_no_move(*dev, dev->reg); if (is_testing_mode()) { return; @@ -1849,7 +1837,7 @@ void CommandSetGl843::search_start_position(Genesys_Device* dev) const // now we're on target, we can read data Image image = read_unshuffled_image_from_scanner(dev, session, session.output_total_bytes_raw); - gl843_stop_action_no_move(dev, &local_reg); + scanner_stop_action_no_move(*dev, local_reg); if (DBG_LEVEL >= DBG_data) { sanei_genesys_write_pnm_file("gl843_search_position.pnm", image); @@ -2201,7 +2189,7 @@ SensorExposure CommandSetGl843::led_calibration(Genesys_Device* dev, const Genes auto image = read_unshuffled_image_from_scanner(dev, session, session.output_total_bytes_raw); - gl843_stop_action_no_move(dev, ®s); + scanner_stop_action_no_move(*dev, regs); if (DBG_LEVEL >= DBG_data) { @@ -2407,13 +2395,13 @@ void CommandSetGl843::offset_calibration(Genesys_Device* dev, const Genesys_Sens if (is_testing_mode()) { dev->interface->test_checkpoint("offset_calibration"); - gl843_stop_action_no_move(dev, ®s); + scanner_stop_action_no_move(*dev, regs); return; } auto first_line = read_unshuffled_image_from_scanner(dev, session, session.output_total_bytes_raw); - gl843_stop_action_no_move(dev, ®s); + scanner_stop_action_no_move(*dev, regs); if (DBG_LEVEL >= DBG_data) { @@ -2442,7 +2430,7 @@ void CommandSetGl843::offset_calibration(Genesys_Device* dev, const Genesys_Sens dev->cmd_set->begin_scan(dev, calib_sensor, ®s, true); auto second_line = read_unshuffled_image_from_scanner(dev, session, session.output_total_bytes_raw); - gl843_stop_action_no_move(dev, ®s); + scanner_stop_action_no_move(*dev, regs); for (unsigned ch = 0; ch < 3; ch++){ topavg[ch] = dark_average_channel(second_line, black_pixels, ch); @@ -2476,7 +2464,7 @@ void CommandSetGl843::offset_calibration(Genesys_Device* dev, const Genesys_Sens dev->cmd_set->begin_scan(dev, calib_sensor, ®s, true); second_line = read_unshuffled_image_from_scanner(dev, session, session.output_total_bytes_raw); - gl843_stop_action_no_move(dev, ®s); + scanner_stop_action_no_move(*dev, regs); if (DBG_LEVEL >= DBG_data) { @@ -2626,7 +2614,7 @@ void CommandSetGl843::coarse_gain_calibration(Genesys_Device* dev, const Genesys } auto line = read_unshuffled_image_from_scanner(dev, session, session.output_total_bytes_raw); - gl843_stop_action_no_move(dev, ®s); + scanner_stop_action_no_move(*dev, regs); if (DBG_LEVEL >= DBG_data) { sanei_genesys_write_pnm_file("gl843_gain.pnm", line); diff --git a/backend/genesys/gl846.cpp b/backend/genesys/gl846.cpp index 7626ae1ee..46f3eff20 100644 --- a/backend/genesys/gl846.cpp +++ b/backend/genesys/gl846.cpp @@ -856,10 +856,7 @@ void gl846_stop_action(Genesys_Device* dev) return; } - /* ends scan */ - regs_set_optical_off(dev->model->asic_type, dev->reg); - dev->interface->write_register(REG_0x01, dev->reg.get8(REG_0x01)); - dev->interface->sleep_ms(100); + scanner_stop_action_no_move(*dev, dev->reg); if (is_testing_mode()) { return; diff --git a/backend/genesys/gl847.cpp b/backend/genesys/gl847.cpp index 44ba313ab..d31d3eca8 100644 --- a/backend/genesys/gl847.cpp +++ b/backend/genesys/gl847.cpp @@ -860,11 +860,7 @@ void gl847_stop_action(Genesys_Device* dev) return; } - /* ends scan */ - regs_set_optical_off(dev->model->asic_type, dev->reg); - dev->interface->write_register(REG_0x01, dev->reg.get8(REG_0x01)); - - dev->interface->sleep_ms(100); + scanner_stop_action_no_move(*dev, dev->reg); if (is_testing_mode()) { return; diff --git a/backend/genesys/low.h b/backend/genesys/low.h index f7d7eb62b..e8777760c 100644 --- a/backend/genesys/low.h +++ b/backend/genesys/low.h @@ -411,6 +411,7 @@ extern void sanei_genesys_asic_init(Genesys_Device* dev, bool cold); void scanner_start_action(Genesys_Device& dev, bool start_motor); void scanner_stop_action(Genesys_Device& dev); +void scanner_stop_action_no_move(Genesys_Device& dev, Genesys_Register_Set& regs); const Motor_Profile& sanei_genesys_get_motor_profile(const std::vector& motors, MotorId motor_id, int exposure);