diff --git a/backend/genesys/enums.h b/backend/genesys/enums.h index 9ae04ff16..b31f47a07 100644 --- a/backend/genesys/enums.h +++ b/backend/genesys/enums.h @@ -498,6 +498,13 @@ inline bool has_flag(MotorFlag flags, MotorFlag which) } +enum class Direction : unsigned +{ + FORWARD = 0, + BACKWARD = 1 +}; + + } // namespace genesys #endif // BACKEND_GENESYS_ENUMS_H diff --git a/backend/genesys/genesys.cpp b/backend/genesys/genesys.cpp index 3b4fd4d4d..986517f12 100644 --- a/backend/genesys/genesys.cpp +++ b/backend/genesys/genesys.cpp @@ -885,7 +885,6 @@ namespace gl847 { } // namespace gl847 namespace gl124 { - void gl124_feed(Genesys_Device* dev, unsigned int steps, int reverse); void gl124_setup_scan_gpio(Genesys_Device* dev, int resolution); void gl124_stop_action(Genesys_Device* dev); } // namespace gl124 @@ -919,6 +918,36 @@ void scanner_clear_scan_and_feed_counts(Genesys_Device& dev) } } +void scanner_clear_scan_and_feed_counts2(Genesys_Device& dev) +{ + // FIXME: switch to scanner_clear_scan_and_feed_counts when updating tests + switch (dev.model->asic_type) { + case AsicType::GL843: { + dev.interface->write_register(gl843::REG_0x0D, gl843::REG_0x0D_CLRLNCNT); + dev.interface->write_register(gl843::REG_0x0D, gl843::REG_0x0D_CLRMCNT); + break; + } + case AsicType::GL845: + case AsicType::GL846: { + dev.interface->write_register(gl846::REG_0x0D, gl846::REG_0x0D_CLRLNCNT); + dev.interface->write_register(gl846::REG_0x0D, gl846::REG_0x0D_CLRMCNT); + break; + } + case AsicType::GL847: { + dev.interface->write_register(gl847::REG_0x0D, gl847::REG_0x0D_CLRLNCNT); + dev.interface->write_register(gl847::REG_0x0D, gl847::REG_0x0D_CLRMCNT); + break; + } + case AsicType::GL124: { + dev.interface->write_register(gl124::REG_0x0D, gl124::REG_0x0D_CLRLNCNT); + dev.interface->write_register(gl124::REG_0x0D, gl124::REG_0x0D_CLRMCNT); + break; + } + default: + throw SaneException("Unsupported asic type"); + } +} + void scanner_stop_action(Genesys_Device& dev) { switch (dev.model->asic_type) { @@ -944,6 +973,92 @@ void scanner_stop_action(Genesys_Device& dev) } } +void scanner_move(Genesys_Device& dev, unsigned steps, Direction direction) +{ + DBG_HELPER_ARGS(dbg, "steps=%d direction=%d", steps, static_cast(direction)); + + auto local_reg = dev.reg; + + auto scan_method = dev.model->default_method; + unsigned resolution = dev.model->get_resolution_settings(scan_method).get_min_resolution_y(); + + const auto& sensor = sanei_genesys_find_sensor(&dev, resolution, 3, scan_method); + + ScanSession session; + session.params.xres = resolution; + session.params.yres = resolution; + session.params.startx = 0; + session.params.starty = steps; + session.params.pixels = 100; + session.params.lines = 3; + session.params.depth = 8; + session.params.channels = 3; + session.params.scan_method = scan_method; + session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; + if (dev.model->asic_type == AsicType::GL843) { + session.params.color_filter = ColorFilter::RED; + } else { + session.params.color_filter = dev.settings.color_filter; + } + session.params.flags = ScanFlag::DISABLE_SHADING | + ScanFlag::DISABLE_GAMMA | + ScanFlag::FEEDING | + ScanFlag::IGNORE_LINE_DISTANCE; + + if (dev.model->asic_type == AsicType::GL124) { + session.params.flags |= ScanFlag::DISABLE_BUFFER_FULL_MOVE; + } + + if (direction == Direction::BACKWARD) { + session.params.flags |= ScanFlag::REVERSE; + } + + compute_session(&dev, session, sensor); + + dev.cmd_set->init_regs_for_scan_session(&dev, sensor, &local_reg, session); + + if (dev.model->asic_type != AsicType::GL843) { + regs_set_exposure(dev.model->asic_type, local_reg, {0, 0, 0}); + } + scanner_clear_scan_and_feed_counts2(dev); + + dev.interface->write_registers(local_reg); + + try { + scanner_start_action(dev, true); + } catch (...) { + catch_all_exceptions(__func__, [&]() { scanner_stop_action(dev); }); + // restore original registers + catch_all_exceptions(__func__, [&]() { dev.interface->write_registers(dev.reg); }); + throw; + } + + if (is_testing_mode()) { + dev.interface->test_checkpoint("feed"); + + // FIXME: why don't we stop the scanner like on other ASICs + if (dev.model->asic_type != AsicType::GL843) { + scanner_stop_action(dev); + } + return; + } + + // wait until feed count reaches the required value + // FIXME: should porbably wait for some timeout + Status status; + do { + status = scanner_read_status(dev); + } while (!status.is_feeding_finished); + + // FIXME: why don't we stop the scanner like on other ASICs + if (dev.model->asic_type != AsicType::GL843) { + scanner_stop_action(dev); + } + + // looks like certain scanners lock up if we scan immediately after feeding + dev.interface->sleep_ms(100); +} + void scanner_slow_back_home(Genesys_Device& dev, bool wait_until_home) { DBG_HELPER_ARGS(dbg, "wait_until_home = %d", wait_until_home); @@ -980,8 +1095,8 @@ void scanner_slow_back_home(Genesys_Device& dev, bool wait_until_home) } if (dev.model->model_id == ModelId::CANON_LIDE_210) { - // feed a little first - gl124::gl124_feed(&dev, 20, true); + // move the head back a little first + scanner_move(dev, 20, Direction::BACKWARD); } Genesys_Register_Set local_reg = dev.reg; diff --git a/backend/genesys/gl124.cpp b/backend/genesys/gl124.cpp index 65d2d3767..4d8469550 100644 --- a/backend/genesys/gl124.cpp +++ b/backend/genesys/gl124.cpp @@ -1186,93 +1186,6 @@ void CommandSetGl124::slow_back_home_ta(Genesys_Device& dev) const throw SaneException("not implemented"); } -/** @brief moves the slider to steps at motor base dpi - * @param dev device to work on - * @param steps number of steps to move - * @param reverse true is moving backward - * */ -void gl124_feed(Genesys_Device* dev, unsigned int steps, int reverse) -{ - DBG_HELPER_ARGS(dbg, "steps=%d", steps); - Genesys_Register_Set local_reg; - GenesysRegister *r; - - /* prepare local registers */ - local_reg = dev->reg; - - unsigned resolution = sanei_genesys_get_lowest_ydpi(dev); - const auto& sensor = sanei_genesys_find_sensor(dev, resolution, 3, dev->model->default_method); - - ScanSession session; - session.params.xres = resolution; - session.params.yres = resolution; - session.params.startx = 0; - session.params.starty = steps; - session.params.pixels = 100; - session.params.lines = 3; - session.params.depth = 8; - session.params.channels = 3; - session.params.scan_method = dev->settings.scan_method; - session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; - session.params.color_filter = dev->settings.color_filter; - session.params.flags = ScanFlag::DISABLE_SHADING | - ScanFlag::DISABLE_GAMMA | - ScanFlag::FEEDING | - ScanFlag::DISABLE_BUFFER_FULL_MOVE | - ScanFlag::IGNORE_LINE_DISTANCE; - if (reverse) { - session.params.flags |= ScanFlag::REVERSE; - } - compute_session(dev, session, sensor); - - dev->cmd_set->init_regs_for_scan_session(dev, sensor, &local_reg, session); - - local_reg.set24(REG_EXPR, 0); - local_reg.set24(REG_EXPG, 0); - local_reg.set24(REG_EXPB, 0); - - // clear scan and feed count - dev->interface->write_register(REG_0x0D, REG_0x0D_CLRLNCNT); - dev->interface->write_register(REG_0x0D, REG_0x0D_CLRMCNT); - - /* set up for no scan */ - r = sanei_genesys_get_address (&local_reg, REG_0x01); - r->value &= ~REG_0x01_SCAN; - - // send registers - dev->interface->write_registers(local_reg); - - try { - scanner_start_action(*dev, true); - } catch (...) { - catch_all_exceptions(__func__, [&]() { gl124_stop_action (dev); }); - - // restore original registers - catch_all_exceptions(__func__, [&]() - { - dev->interface->write_registers(dev->reg); - }); - throw; - } - - - if (is_testing_mode()) { - dev->interface->test_checkpoint("feed"); - gl124_stop_action(dev); - return; - } - - // wait until feed count reaches the required value, but do not exceed 30s - Status status; - do { - status = scanner_read_status(*dev); - } while (!status.is_feeding_finished); - - // then stop scanning - gl124_stop_action(dev); -} - - // Automatically set top-left edge of the scan area by scanning a 200x200 pixels area at 600 dpi // from very top of scanner void CommandSetGl124::search_start_position(Genesys_Device* dev) const @@ -1494,7 +1407,7 @@ void CommandSetGl124::init_regs_for_scan(Genesys_Device* dev, const Genesys_Sens DBG (DBG_info, "%s: move=%f steps\n", __func__, move); if (dev->settings.get_channels() * dev->settings.yres >= 600 && move > 700) { - gl124_feed(dev, static_cast(move - 500), false); + scanner_move(*dev, static_cast(move - 500), Direction::FORWARD); move=500; } DBG(DBG_info, "%s: move=%f steps\n", __func__, move); diff --git a/backend/genesys/gl124.h b/backend/genesys/gl124.h index dcd7a11f4..9e85d107a 100644 --- a/backend/genesys/gl124.h +++ b/backend/genesys/gl124.h @@ -109,8 +109,6 @@ static Memory_layout layouts[]={ } }; -void gl124_feed(Genesys_Device* dev, unsigned int steps, int reverse); - void gl124_stop_action(Genesys_Device* dev); static void gl124_send_slope_table(Genesys_Device* dev, int table_nr, diff --git a/backend/genesys/gl843.cpp b/backend/genesys/gl843.cpp index 2ae456b58..4a4cb7ad6 100644 --- a/backend/genesys/gl843.cpp +++ b/backend/genesys/gl843.cpp @@ -1915,83 +1915,6 @@ void CommandSetGl843::init_regs_for_coarse_calibration(Genesys_Device* dev, dev->interface->write_registers(regs); } -/** @brief moves the slider to steps at motor base dpi - * @param dev device to work on - * @param steps number of steps to move - * */ -static void gl843_feed(Genesys_Device* dev, unsigned int steps) -{ - DBG_HELPER(dbg); - Genesys_Register_Set local_reg; - GenesysRegister *r; - - /* prepare local registers */ - local_reg = dev->reg; - - const auto& resolution_settings = dev->model->get_resolution_settings(dev->model->default_method); - unsigned resolution = resolution_settings.get_min_resolution_y(); - - const auto& sensor = sanei_genesys_find_sensor(dev, resolution, 3, dev->model->default_method); - - ScanSession session; - session.params.xres = resolution; - session.params.yres = resolution; - session.params.startx = 0; - session.params.starty = steps; - session.params.pixels = 100; - session.params.lines = 3; - session.params.depth = 8; - session.params.channels = 3; - session.params.scan_method = dev->settings.scan_method; - session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; - session.params.color_filter = ColorFilter::RED; - session.params.flags = ScanFlag::DISABLE_SHADING | - ScanFlag::DISABLE_GAMMA | - ScanFlag::FEEDING | - ScanFlag::IGNORE_LINE_DISTANCE; - compute_session(dev, session, sensor); - - dev->cmd_set->init_regs_for_scan_session(dev, sensor, &local_reg, session); - - // clear scan and feed count - dev->interface->write_register(REG_0x0D, REG_0x0D_CLRLNCNT); - dev->interface->write_register(REG_0x0D, REG_0x0D_CLRMCNT); - - /* set up for no scan */ - r = sanei_genesys_get_address(&local_reg, REG_0x01); - r->value &= ~REG_0x01_SCAN; - - // send registers - dev->interface->write_registers(local_reg); - - try { - scanner_start_action(*dev, true); - } catch (...) { - catch_all_exceptions(__func__, [&]() { gl843_stop_action(dev); }); - // restore original registers - catch_all_exceptions(__func__, [&]() - { - dev->interface->write_registers(dev->reg); - }); - throw; - } - - if (is_testing_mode()) { - dev->interface->test_checkpoint("feed"); - // FIXME: other chips call *_stop_action() - return; - } - - // wait until feed count reaches the required value, but do not exceed 30s - Status status; - do { - status = scanner_read_status(*dev); - } while (!status.is_feeding_finished); - - // looks like the scanner locks up if we scan immediately after feeding - dev->interface->sleep_ms(100); -} - // init registers for shading calibration shading calibration is done at dpihw void CommandSetGl843::init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor, Genesys_Register_Set& regs) const @@ -2930,7 +2853,7 @@ void CommandSetGl843::asic_boot(Genesys_Device* dev, bool cold) const // setup gpio gl843_init_gpio(dev); - gl843_feed (dev, 300); + scanner_move(*dev, 300, Direction::FORWARD); dev->interface->sleep_ms(100); } @@ -2990,7 +2913,7 @@ void CommandSetGl843::move_to_ta(Genesys_Device* dev) const } unsigned feed = static_cast(multiplier * (dev->model->y_offset_sensor_to_ta * resolution) / MM_PER_INCH); - gl843_feed(dev, feed); + scanner_move(*dev, feed, Direction::FORWARD); } diff --git a/backend/genesys/gl846.cpp b/backend/genesys/gl846.cpp index ddc9e4de1..72c5704e9 100644 --- a/backend/genesys/gl846.cpp +++ b/backend/genesys/gl846.cpp @@ -1054,88 +1054,6 @@ void CommandSetGl846::init_regs_for_coarse_calibration(Genesys_Device* dev, dev->interface->write_registers(regs); } -/** @brief moves the slider to steps at motor base dpi - * @param dev device to work on - * @param steps number of steps to move in base_dpi line count - * */ -static void gl846_feed(Genesys_Device* dev, unsigned int steps) -{ - DBG_HELPER_ARGS(dbg, "steps=%d\n", steps); - Genesys_Register_Set local_reg; - GenesysRegister *r; - - /* prepare local registers */ - local_reg = dev->reg; - - unsigned resolution = sanei_genesys_get_lowest_ydpi(dev); - const auto& sensor = sanei_genesys_find_sensor(dev, resolution, 3, dev->model->default_method); - - ScanSession session; - session.params.xres = resolution; - session.params.yres = resolution; - session.params.startx = 0; - session.params.starty = steps; - session.params.pixels = 100; - session.params.lines = 3; - session.params.depth = 8; - session.params.channels = 3; - session.params.scan_method = dev->settings.scan_method; - session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; - session.params.color_filter = dev->settings.color_filter; - session.params.flags = ScanFlag::DISABLE_SHADING | - ScanFlag::DISABLE_GAMMA | - ScanFlag::FEEDING | - ScanFlag::IGNORE_LINE_DISTANCE; - compute_session(dev, session, sensor); - - dev->cmd_set->init_regs_for_scan_session(dev, sensor, &local_reg, session); - - local_reg.set24(REG_EXPR, 0); - local_reg.set24(REG_EXPG, 0); - local_reg.set24(REG_EXPB, 0); - - // clear scan and feed count - dev->interface->write_register(REG_0x0D, REG_0x0D_CLRLNCNT); - dev->interface->write_register(REG_0x0D, REG_0x0D_CLRMCNT); - - /* set up for no scan */ - r = sanei_genesys_get_address(&local_reg, REG_0x01); - r->value &= ~REG_0x01_SCAN; - - // send registers - dev->interface->write_registers(local_reg); - - try { - scanner_start_action(*dev, true); - } catch (...) { - try { - gl846_stop_action(dev); - } catch (...) {} - // restore original registers - catch_all_exceptions(__func__, [&]() - { - dev->interface->write_registers(dev->reg); - }); - throw; - } - - if (is_testing_mode()) { - dev->interface->test_checkpoint("feed"); - gl846_stop_action(dev); - return; - } - - // wait until feed count reaches the required value, but do not exceed 30s - Status status; - do { - status = scanner_read_status(*dev); - } while (!status.is_feeding_finished); - - // then stop scanning - gl846_stop_action(dev); -} - - // init registers for shading calibration void CommandSetGl846::init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor, Genesys_Register_Set& regs) const @@ -1234,9 +1152,8 @@ void CommandSetGl846::init_regs_for_scan(Genesys_Device* dev, const Genesys_Sens * computing acceleration/deceleration distance for scan * resolution. So leave a remainder for it so scan makes the final * move tuning */ - if (dev->settings.get_channels() * dev->settings.yres >= 600 && move > 700) - { - gl846_feed(dev, static_cast(move - 500)); + if (dev->settings.get_channels() * dev->settings.yres >= 600 && move > 700) { + scanner_move(*dev, static_cast(move - 500), Direction::FORWARD); move=500; } @@ -1370,7 +1287,7 @@ SensorExposure CommandSetGl846::led_calibration(Genesys_Device* dev, const Genes move = static_cast((move * (dev->motor.base_ydpi / 4)) / MM_PER_INCH); if(move>20) { - gl846_feed(dev, static_cast(move)); + scanner_move(*dev, static_cast(move), Direction::FORWARD); } DBG(DBG_io, "%s: move=%f steps\n", __func__, move); diff --git a/backend/genesys/gl846.h b/backend/genesys/gl846.h index fb9d25b23..16d330f5e 100644 --- a/backend/genesys/gl846.h +++ b/backend/genesys/gl846.h @@ -50,12 +50,6 @@ namespace genesys { namespace gl846 { -/** @brief moves the slider to steps at motor base dpi - * @param dev device to work on - * @param steps number of steps to move - * */ -static void gl846_feed(Genesys_Device* dev, unsigned int steps); - void gl846_stop_action(Genesys_Device* dev); diff --git a/backend/genesys/gl847.cpp b/backend/genesys/gl847.cpp index 60a9d5d23..19a7490da 100644 --- a/backend/genesys/gl847.cpp +++ b/backend/genesys/gl847.cpp @@ -1100,86 +1100,6 @@ void CommandSetGl847::init_regs_for_coarse_calibration(Genesys_Device* dev, dev->interface->write_registers(regs); } -/** @brief moves the slider to steps at motor base dpi - * @param dev device to work on - * @param steps number of steps to move in base_dpi line count - * */ -static void gl847_feed(Genesys_Device* dev, unsigned int steps) -{ - DBG_HELPER_ARGS(dbg, "steps=%d", steps); - Genesys_Register_Set local_reg; - GenesysRegister *r; - - local_reg = dev->reg; - - unsigned resolution = sanei_genesys_get_lowest_ydpi(dev); - const auto& sensor = sanei_genesys_find_sensor(dev, resolution, 3, dev->model->default_method); - - ScanSession session; - session.params.xres = resolution; - session.params.yres = resolution; - session.params.startx = 0; - session.params.starty = steps; - session.params.pixels = 100; - session.params.lines = 3; - session.params.depth = 8; - session.params.channels = 3; - session.params.scan_method = dev->settings.scan_method; - session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; - session.params.color_filter = dev->settings.color_filter; - session.params.flags = ScanFlag::DISABLE_SHADING | - ScanFlag::DISABLE_GAMMA | - ScanFlag::FEEDING | - ScanFlag::IGNORE_LINE_DISTANCE; - compute_session(dev, session, sensor); - - dev->cmd_set->init_regs_for_scan_session(dev, sensor, &local_reg, session); - - // set exposure to zero - local_reg.set24(REG_EXPR,0); - local_reg.set24(REG_EXPG,0); - local_reg.set24(REG_EXPB,0); - - // clear scan and feed count - dev->interface->write_register(REG_0x0D, REG_0x0D_CLRLNCNT); - dev->interface->write_register(REG_0x0D, REG_0x0D_CLRMCNT); - - /* set up for no scan */ - r = sanei_genesys_get_address(&local_reg, REG_0x01); - r->value &= ~REG_0x01_SCAN; - - // send registers - dev->interface->write_registers(local_reg); - - try { - scanner_start_action(*dev, true); - } catch (...) { - catch_all_exceptions(__func__, [&]() { gl847_stop_action(dev); }); - // restore original registers - catch_all_exceptions(__func__, [&]() - { - dev->interface->write_registers(dev->reg); - }); - throw; - } - - if (is_testing_mode()) { - dev->interface->test_checkpoint("feed"); - gl847_stop_action(dev); - return; - } - - // wait until feed count reaches the required value, but do not exceed 30s - Status status; - do { - status = scanner_read_status(*dev); - } while (!status.is_feeding_finished); - - // then stop scanning - gl847_stop_action(dev); -} - - // init registers for shading calibration void CommandSetGl847::init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor, Genesys_Register_Set& regs) const @@ -1270,7 +1190,7 @@ void CommandSetGl847::init_regs_for_scan(Genesys_Device* dev, const Genesys_Sens * resolution. So leave a remainder for it so scan makes the final * move tuning */ if (dev->settings.get_channels() * dev->settings.yres >= 600 && move > 700) { - gl847_feed(dev, static_cast(move - 500)); + scanner_move(*dev, static_cast(move - 500), Direction::FORWARD); move=500; } @@ -1403,9 +1323,8 @@ SensorExposure CommandSetGl847::led_calibration(Genesys_Device* dev, const Genes move = static_cast(dev->model->y_offset_calib_white); move = static_cast((move * (dev->motor.base_ydpi / 4)) / MM_PER_INCH); - if(move>20) - { - gl847_feed(dev, static_cast(move)); + if (move > 20) { + scanner_move(*dev, static_cast(move), Direction::FORWARD); } DBG(DBG_io, "%s: move=%f steps\n", __func__, move); diff --git a/backend/genesys/gl847.h b/backend/genesys/gl847.h index 073d03321..5f99f2573 100644 --- a/backend/genesys/gl847.h +++ b/backend/genesys/gl847.h @@ -50,12 +50,6 @@ namespace genesys { namespace gl847 { -/** @brief moves the slider to steps at motor base dpi - * @param dev device to work on - * @param steps number of steps to move - * */ -static void gl847_feed(Genesys_Device* dev, unsigned int steps); - typedef struct { GpioId gpio_id; diff --git a/backend/genesys/low.h b/backend/genesys/low.h index ab300243c..f0a698e74 100644 --- a/backend/genesys/low.h +++ b/backend/genesys/low.h @@ -352,6 +352,9 @@ extern void sanei_genesys_search_reference_point(Genesys_Device* dev, Genesys_Se const uint8_t* src_data, int start_pixel, int dpi, int width, int height); +// moves the scan head by the specified steps at the motor base dpi +void scanner_move(Genesys_Device& dev, unsigned steps, Direction direction); + void scanner_slow_back_home(Genesys_Device& dev, bool wait_until_home); void scanner_clear_scan_and_feed_counts(Genesys_Device& dev);