kopia lustrzana https://gitlab.com/sane-project/backends
Merge branch 'genesys-reduce-duplication' into 'master'
genesys: Reduce duplication in scan head movement routines See merge request sane-project/backends!255merge-requests/256/merge
commit
037f06712e
|
@ -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
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
#include "genesys.h"
|
||||
#include "conv.h"
|
||||
#include "gl124_registers.h"
|
||||
#include "gl841_registers.h"
|
||||
#include "gl843_registers.h"
|
||||
#include "gl846_registers.h"
|
||||
#include "gl847_registers.h"
|
||||
|
@ -873,21 +874,10 @@ void sanei_genesys_search_reference_point(Genesys_Device* dev, Genesys_Sensor& s
|
|||
|
||||
namespace gl843 {
|
||||
void gl843_park_xpa_lamp(Genesys_Device* dev);
|
||||
void gl843_stop_action(Genesys_Device* dev);
|
||||
} // namespace gl843
|
||||
|
||||
namespace gl846 {
|
||||
void gl846_stop_action(Genesys_Device* dev);
|
||||
} // namespace gl846
|
||||
|
||||
namespace gl847 {
|
||||
void gl847_stop_action(Genesys_Device* dev);
|
||||
} // 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
|
||||
|
||||
void scanner_clear_scan_and_feed_counts(Genesys_Device& dev)
|
||||
|
@ -919,24 +909,29 @@ void scanner_clear_scan_and_feed_counts(Genesys_Device& dev)
|
|||
}
|
||||
}
|
||||
|
||||
void scanner_stop_action(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: {
|
||||
gl843::gl843_stop_action(&dev);
|
||||
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: {
|
||||
gl846::gl846_stop_action(&dev);
|
||||
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:{
|
||||
gl847::gl847_stop_action(&dev);
|
||||
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:{
|
||||
gl124::gl124_stop_action(&dev);
|
||||
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:
|
||||
|
@ -944,6 +939,199 @@ void scanner_stop_action(Genesys_Device& dev)
|
|||
}
|
||||
}
|
||||
|
||||
bool scanner_is_motor_stopped(Genesys_Device& dev)
|
||||
{
|
||||
switch (dev.model->asic_type) {
|
||||
case AsicType::GL841: {
|
||||
auto reg = dev.interface->read_register(gl841::REG_0x40);
|
||||
|
||||
return (!(reg & gl841::REG_0x40_DATAENB) && !(reg & gl841::REG_0x40_MOTMFLG));
|
||||
}
|
||||
case AsicType::GL843: {
|
||||
auto status = scanner_read_status(dev);
|
||||
auto reg = dev.interface->read_register(gl843::REG_0x40);
|
||||
|
||||
return (!(reg & gl843::REG_0x40_DATAENB) && !(reg & gl843::REG_0x40_MOTMFLG) &&
|
||||
!status.is_motor_enabled);
|
||||
}
|
||||
case AsicType::GL845:
|
||||
case AsicType::GL846: {
|
||||
auto status = scanner_read_status(dev);
|
||||
auto reg = dev.interface->read_register(gl846::REG_0x40);
|
||||
|
||||
return (!(reg & gl846::REG_0x40_DATAENB) && !(reg & gl846::REG_0x40_MOTMFLG) &&
|
||||
!status.is_motor_enabled);
|
||||
}
|
||||
case AsicType::GL847: {
|
||||
auto status = scanner_read_status(dev);
|
||||
auto reg = dev.interface->read_register(gl847::REG_0x40);
|
||||
|
||||
return (!(reg & gl847::REG_0x40_DATAENB) && !(reg & gl847::REG_0x40_MOTMFLG) &&
|
||||
!status.is_motor_enabled);
|
||||
}
|
||||
case AsicType::GL124: {
|
||||
auto status = scanner_read_status(dev);
|
||||
auto reg = dev.interface->read_register(gl124::REG_0x100);
|
||||
|
||||
return (!(reg & gl124::REG_0x100_DATAENB) && !(reg & gl124::REG_0x100_MOTMFLG) &&
|
||||
!status.is_motor_enabled);
|
||||
}
|
||||
default:
|
||||
throw SaneException("Unsupported asic type");
|
||||
}
|
||||
}
|
||||
|
||||
void scanner_stop_action(Genesys_Device& dev)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
|
||||
switch (dev.model->asic_type) {
|
||||
case AsicType::GL843:
|
||||
case AsicType::GL845:
|
||||
case AsicType::GL846:
|
||||
case AsicType::GL847:
|
||||
case AsicType::GL124:
|
||||
break;
|
||||
default:
|
||||
throw SaneException("Unsupported asic type");
|
||||
}
|
||||
|
||||
if (dev.cmd_set->needs_update_home_sensor_gpio()) {
|
||||
dev.cmd_set->update_home_sensor_gpio(dev);
|
||||
}
|
||||
|
||||
if (scanner_is_motor_stopped(dev)) {
|
||||
DBG(DBG_info, "%s: already stopped\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
scanner_stop_action_no_move(dev, dev.reg);
|
||||
|
||||
if (is_testing_mode()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < 10; ++i) {
|
||||
if (scanner_is_motor_stopped(dev)) {
|
||||
return;
|
||||
}
|
||||
|
||||
dev.interface->sleep_ms(100);
|
||||
}
|
||||
|
||||
throw SaneException(SANE_STATUS_IO_ERROR, "could not stop motor");
|
||||
}
|
||||
|
||||
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<unsigned>(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 +1168,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;
|
||||
|
|
|
@ -739,8 +739,8 @@ static void gl124_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
|
|||
dev->cmd_set->set_fe(dev, sensor, AFE_SET);
|
||||
|
||||
/* enable shading */
|
||||
regs_set_optical_off(dev->model->asic_type, *reg);
|
||||
r = sanei_genesys_get_address (reg, REG_0x01);
|
||||
r->value &= ~REG_0x01_SCAN;
|
||||
if (has_flag(session.params.flags, ScanFlag::DISABLE_SHADING) ||
|
||||
(dev->model->flags & GENESYS_FLAG_NO_CALIBRATION))
|
||||
{
|
||||
|
@ -999,56 +999,6 @@ void CommandSetGl124::set_powersaving(Genesys_Device* dev, int delay /* in minut
|
|||
}
|
||||
}
|
||||
|
||||
void gl124_stop_action(Genesys_Device* dev)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
std::uint8_t val40;
|
||||
unsigned int loop;
|
||||
|
||||
dev->cmd_set->update_home_sensor_gpio(*dev);
|
||||
scanner_read_print_status(*dev);
|
||||
|
||||
val40 = dev->interface->read_register(REG_0x100);
|
||||
|
||||
/* only stop action if needed */
|
||||
if (!(val40 & REG_0x100_DATAENB) && !(val40 & REG_0x100_MOTMFLG)) {
|
||||
DBG (DBG_info, "%s: already stopped\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
/* ends scan */
|
||||
std::uint8_t val = dev->reg.get8(REG_0x01);
|
||||
val &= ~REG_0x01_SCAN;
|
||||
dev->reg.set8(REG_0x01, val);
|
||||
dev->interface->write_register(REG_0x01, val);
|
||||
|
||||
dev->interface->sleep_ms(100);
|
||||
|
||||
if (is_testing_mode()) {
|
||||
return;
|
||||
}
|
||||
|
||||
loop = 10;
|
||||
while (loop > 0)
|
||||
{
|
||||
auto status = scanner_read_status(*dev);
|
||||
val40 = dev->interface->read_register(REG_0x100);
|
||||
|
||||
/* if scanner is in command mode, we are done */
|
||||
if (!(val40 & REG_0x100_DATAENB) && !(val40 & REG_0x100_MOTMFLG) &&
|
||||
!status.is_motor_enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
dev->interface->sleep_ms(100);
|
||||
loop--;
|
||||
}
|
||||
|
||||
throw SaneException(SANE_STATUS_IO_ERROR, "could not stop motor");
|
||||
}
|
||||
|
||||
|
||||
/** @brief setup GPIOs for scan
|
||||
* Setup GPIO values to drive motor (or light) needed for the
|
||||
* target resolution
|
||||
|
@ -1133,7 +1083,7 @@ void CommandSetGl124::end_scan(Genesys_Device* dev, Genesys_Register_Set* reg,
|
|||
DBG_HELPER_ARGS(dbg, "check_stop = %d", check_stop);
|
||||
|
||||
if (!dev->model->is_sheetfed) {
|
||||
gl124_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1186,93 +1136,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 +1357,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<unsigned>(move - 500), false);
|
||||
scanner_move(*dev, static_cast<unsigned>(move - 500), Direction::FORWARD);
|
||||
move=500;
|
||||
}
|
||||
DBG(DBG_info, "%s: move=%f steps\n", __func__, move);
|
||||
|
@ -1678,14 +1541,14 @@ static void move_to_calibration_area(Genesys_Device* dev, const Genesys_Sensor&
|
|||
|
||||
if (is_testing_mode()) {
|
||||
dev->interface->test_checkpoint("move_to_calibration_area");
|
||||
gl124_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
return;
|
||||
}
|
||||
|
||||
sanei_genesys_read_data_from_scanner(dev, line.data(), size);
|
||||
|
||||
// stop scanning
|
||||
gl124_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
if (DBG_LEVEL >= DBG_data)
|
||||
{
|
||||
|
@ -1779,14 +1642,14 @@ SensorExposure CommandSetGl124::led_calibration(Genesys_Device* dev, const Genes
|
|||
|
||||
if (is_testing_mode()) {
|
||||
dev->interface->test_checkpoint("led_calibration");
|
||||
gl124_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
return { 0, 0, 0 };
|
||||
}
|
||||
|
||||
sanei_genesys_read_data_from_scanner(dev, line.data(), total_size);
|
||||
|
||||
// stop scanning
|
||||
gl124_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
if (DBG_LEVEL >= DBG_data)
|
||||
{
|
||||
|
@ -2103,7 +1966,7 @@ void CommandSetGl124::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
|||
|
||||
if (is_testing_mode()) {
|
||||
dev->interface->test_checkpoint("coarse_gain_calibration");
|
||||
gl124_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
slow_back_home(dev, true);
|
||||
return;
|
||||
}
|
||||
|
@ -2163,7 +2026,7 @@ void CommandSetGl124::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
|||
dev->frontend.set_gain(2, dev->frontend.get_gain(1));
|
||||
}
|
||||
|
||||
gl124_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
slow_back_home(dev, true);
|
||||
}
|
||||
|
|
|
@ -109,10 +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,
|
||||
const std::vector<uint16_t>& slope_table, int steps);
|
||||
|
||||
|
|
|
@ -580,7 +580,7 @@ gl646_setup_sensor (Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys_
|
|||
regs->set8(reg_setting.address, reg_setting.value);
|
||||
}
|
||||
// FIXME: all other drivers don't set exposure here
|
||||
sanei_genesys_set_exposure(*regs, sensor.exposure);
|
||||
regs_set_exposure(AsicType::GL646, *regs, sensor.exposure);
|
||||
|
||||
DBG(DBG_proc, "%s: end\n", __func__);
|
||||
}
|
||||
|
@ -1384,10 +1384,8 @@ static void end_scan_impl(Genesys_Device* dev, Genesys_Register_Set* reg, bool c
|
|||
}
|
||||
|
||||
/* ends scan */
|
||||
std::uint8_t val = reg->get8(0x01);
|
||||
val &= ~REG_0x01_SCAN;
|
||||
reg->set8(0x01, val);
|
||||
dev->interface->write_register(0x01, val);
|
||||
regs_set_optical_off(dev->model->asic_type, *reg);
|
||||
dev->interface->write_register(0x01, reg->get8(0x01));
|
||||
|
||||
/* for sheetfed scanners, we may have to eject document */
|
||||
if (dev->model->is_sheetfed) {
|
||||
|
@ -1525,7 +1523,7 @@ void CommandSetGl646::slow_back_home(Genesys_Device* dev, bool wait_until_home)
|
|||
init_regs_for_scan_session(dev, sensor, &dev->reg, session);
|
||||
|
||||
/* backward , no actual data scanned TODO more setup flags to avoid this register manipulations ? */
|
||||
dev->reg.find_reg(0x01).value &= ~REG_0x01_SCAN;
|
||||
regs_set_optical_off(dev->model->asic_type, dev->reg);
|
||||
|
||||
// sets frontend
|
||||
gl646_set_fe(dev, sensor, AFE_SET, resolution);
|
||||
|
@ -2687,7 +2685,7 @@ static void gl646_repark_head(Genesys_Device* dev)
|
|||
setup_for_scan(dev, sensor, &dev->reg, settings, false, false, false, false);
|
||||
|
||||
/* TODO seems wrong ... no effective scan */
|
||||
dev->reg.find_reg(0x01).value &= ~REG_0x01_SCAN;
|
||||
regs_set_optical_off(dev->model->asic_type, dev->reg);
|
||||
|
||||
dev->interface->write_registers(dev->reg);
|
||||
|
||||
|
|
|
@ -53,6 +53,7 @@ using RegAddr = std::uint16_t;
|
|||
using RegMask = std::uint8_t;
|
||||
using RegShift = unsigned;
|
||||
|
||||
static constexpr RegAddr REG_0x01 = 0x01;
|
||||
static constexpr RegMask REG_0x01_CISSET = 0x80;
|
||||
static constexpr RegMask REG_0x01_DOGENB = 0x40;
|
||||
static constexpr RegMask REG_0x01_DVDSET = 0x20;
|
||||
|
|
|
@ -1300,15 +1300,6 @@ gl841_get_dpihw(Genesys_Device * dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void gl841_init_optical_regs_off(Genesys_Register_Set* reg)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
GenesysRegister* r;
|
||||
|
||||
r = sanei_genesys_get_address(reg, 0x01);
|
||||
r->value &= ~REG_0x01_SCAN;
|
||||
}
|
||||
|
||||
static void gl841_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||
Genesys_Register_Set* reg, unsigned int exposure_time,
|
||||
const ScanSession& session)
|
||||
|
@ -1869,17 +1860,14 @@ static void gl841_stop_action(Genesys_Device* dev)
|
|||
|
||||
scanner_read_print_status(*dev);
|
||||
|
||||
uint8_t val40 = dev->interface->read_register(0x40);
|
||||
|
||||
/* only stop action if needed */
|
||||
if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG)) {
|
||||
DBG(DBG_info, "%s: already stopped\n", __func__);
|
||||
return;
|
||||
if (scanner_is_motor_stopped(*dev)) {
|
||||
DBG(DBG_info, "%s: already stopped\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
local_reg = dev->reg;
|
||||
|
||||
gl841_init_optical_regs_off(&local_reg);
|
||||
regs_set_optical_off(dev->model->asic_type, local_reg);
|
||||
|
||||
gl841_init_motor_regs_off(&local_reg,0);
|
||||
dev->interface->write_registers(local_reg);
|
||||
|
@ -1894,12 +1882,9 @@ static void gl841_stop_action(Genesys_Device* dev)
|
|||
|
||||
loop = 10;
|
||||
while (loop > 0) {
|
||||
val40 = dev->interface->read_register(0x40);
|
||||
|
||||
/* if scanner is in command mode, we are done */
|
||||
if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG)) {
|
||||
return;
|
||||
}
|
||||
if (scanner_is_motor_stopped(*dev)) {
|
||||
return;
|
||||
}
|
||||
|
||||
dev->interface->sleep_ms(100);
|
||||
loop--;
|
||||
|
@ -1941,7 +1926,7 @@ void CommandSetGl841::eject_document(Genesys_Device* dev) const
|
|||
|
||||
local_reg = dev->reg;
|
||||
|
||||
gl841_init_optical_regs_off(&local_reg);
|
||||
regs_set_optical_off(dev->model->asic_type, local_reg);
|
||||
|
||||
const auto& sensor = sanei_genesys_find_sensor_any(dev);
|
||||
gl841_init_motor_regs(dev, sensor, &local_reg, 65536, MOTOR_ACTION_FEED, MotorFlag::NONE);
|
||||
|
@ -2180,7 +2165,7 @@ static void gl841_feed(Genesys_Device* dev, int steps)
|
|||
|
||||
local_reg = dev->reg;
|
||||
|
||||
gl841_init_optical_regs_off(&local_reg);
|
||||
regs_set_optical_off(dev->model->asic_type, local_reg);
|
||||
|
||||
gl841_init_motor_regs(dev, sensor, &local_reg, steps, MOTOR_ACTION_FEED, MotorFlag::NONE);
|
||||
|
||||
|
@ -2229,7 +2214,6 @@ void CommandSetGl841::slow_back_home(Genesys_Device* dev, bool wait_until_home)
|
|||
{
|
||||
DBG_HELPER_ARGS(dbg, "wait_until_home = %d", wait_until_home);
|
||||
Genesys_Register_Set local_reg;
|
||||
GenesysRegister *r;
|
||||
int loop = 0;
|
||||
|
||||
if (dev->model->is_sheetfed) {
|
||||
|
@ -2263,10 +2247,7 @@ void CommandSetGl841::slow_back_home(Genesys_Device* dev, bool wait_until_home)
|
|||
return;
|
||||
}
|
||||
|
||||
/* end previous scan if any */
|
||||
r = sanei_genesys_get_address(&dev->reg, REG_0x01);
|
||||
r->value &= ~REG_0x01_SCAN;
|
||||
dev->interface->write_register(REG_0x01, r->value);
|
||||
scanner_stop_action_no_move(*dev, dev->reg);
|
||||
|
||||
/* if motor is on, stop current action */
|
||||
if (status.is_motor_enabled) {
|
||||
|
@ -2280,8 +2261,7 @@ void CommandSetGl841::slow_back_home(Genesys_Device* dev, bool wait_until_home)
|
|||
gl841_init_motor_regs(dev, sensor, &local_reg, 65536, MOTOR_ACTION_GO_HOME, MotorFlag::REVERSE);
|
||||
|
||||
// set up for no scan
|
||||
r = sanei_genesys_get_address(&local_reg, REG_0x01);
|
||||
r->value &= ~REG_0x01_SCAN;
|
||||
regs_set_optical_off(dev->model->asic_type, local_reg);
|
||||
|
||||
dev->interface->write_registers(local_reg);
|
||||
|
||||
|
@ -2715,7 +2695,7 @@ SensorExposure CommandSetGl841::led_calibration(Genesys_Device* dev, const Genes
|
|||
calib_sensor.exposure.green = exp[1];
|
||||
calib_sensor.exposure.blue = exp[2];
|
||||
|
||||
sanei_genesys_set_exposure(regs, calib_sensor.exposure);
|
||||
regs_set_exposure(dev->model->asic_type, regs, calib_sensor.exposure);
|
||||
dev->interface->write_register(0x10, (calib_sensor.exposure.red >> 8) & 0xff);
|
||||
dev->interface->write_register(0x11, calib_sensor.exposure.red & 0xff);
|
||||
dev->interface->write_register(0x12, (calib_sensor.exposure.green >> 8) & 0xff);
|
||||
|
|
|
@ -188,6 +188,7 @@ static constexpr RegAddr REG_ENDPIXEL = 0x32;
|
|||
static constexpr RegAddr REG_MAXWD = 0x35;
|
||||
static constexpr RegAddr REG_LPERIOD = 0x38;
|
||||
|
||||
static constexpr RegAddr REG_0x40 = 0x40;
|
||||
static constexpr RegMask REG_0x40_HISPDFLG = 0x04;
|
||||
static constexpr RegMask REG_0x40_MOTMFLG = 0x02;
|
||||
static constexpr RegMask REG_0x40_DATAENB = 0x01;
|
||||
|
|
|
@ -1039,8 +1039,8 @@ static void gl843_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
|
|||
dev->cmd_set->set_fe(dev, sensor, AFE_SET);
|
||||
|
||||
/* enable shading */
|
||||
regs_set_optical_off(dev->model->asic_type, *reg);
|
||||
r = sanei_genesys_get_address (reg, REG_0x01);
|
||||
r->value &= ~REG_0x01_SCAN;
|
||||
if (has_flag(session.params.flags, ScanFlag::DISABLE_SHADING) ||
|
||||
(dev->model->flags & GENESYS_FLAG_NO_CALIBRATION ||
|
||||
(dev->model->flags & GENESYS_FLAG_CALIBRATION_HOST_SIDE)))
|
||||
|
@ -1315,63 +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);
|
||||
uint8_t val = reg->get8(REG_0x01);
|
||||
val &= ~REG_0x01_SCAN;
|
||||
reg->set8(REG_0x01, val);
|
||||
dev->interface->write_register(REG_0x01, val);
|
||||
dev->interface->sleep_ms(100);
|
||||
}
|
||||
|
||||
void gl843_stop_action(Genesys_Device* dev)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
unsigned int loop;
|
||||
|
||||
scanner_read_print_status(*dev);
|
||||
|
||||
uint8_t val40 = dev->interface->read_register(REG_0x40);
|
||||
|
||||
/* only stop action if needed */
|
||||
if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG))
|
||||
{
|
||||
DBG(DBG_info, "%s: already stopped\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
/* ends scan 646 */
|
||||
std::uint8_t val = dev->reg.get8(REG_0x01);
|
||||
val &= ~REG_0x01_SCAN;
|
||||
dev->reg.set8(REG_0x01, val);
|
||||
dev->interface->write_register(REG_0x01, val);
|
||||
|
||||
dev->interface->sleep_ms(100);
|
||||
|
||||
if (is_testing_mode()) {
|
||||
return;
|
||||
}
|
||||
|
||||
loop = 10;
|
||||
while (loop > 0) {
|
||||
auto status = scanner_read_status(*dev);
|
||||
val40 = dev->interface->read_register(0x40);
|
||||
|
||||
/* if scanner is in command mode, we are done */
|
||||
if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG)
|
||||
&& !status.is_motor_enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
dev->interface->sleep_ms(100);
|
||||
loop--;
|
||||
}
|
||||
|
||||
throw SaneException(SANE_STATUS_IO_ERROR, "could not stop motor");
|
||||
}
|
||||
|
||||
static bool gl843_get_paper_sensor(Genesys_Device* dev)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
|
@ -1720,7 +1663,7 @@ void CommandSetGl843::end_scan(Genesys_Device* dev, Genesys_Register_Set* reg,
|
|||
}
|
||||
|
||||
if (!dev->model->is_sheetfed) {
|
||||
gl843_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1853,7 +1796,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);
|
||||
|
@ -1915,83 +1858,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
|
||||
|
@ -2267,7 +2133,7 @@ SensorExposure CommandSetGl843::led_calibration(Genesys_Device* dev, const Genes
|
|||
calib_sensor.exposure.green = expg;
|
||||
calib_sensor.exposure.blue = expb;
|
||||
|
||||
sanei_genesys_set_exposure(regs, calib_sensor.exposure);
|
||||
regs_set_exposure(dev->model->asic_type, regs, calib_sensor.exposure);
|
||||
|
||||
dev->interface->write_registers(regs);
|
||||
|
||||
|
@ -2282,7 +2148,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)
|
||||
{
|
||||
|
@ -2340,8 +2206,7 @@ SensorExposure CommandSetGl843::led_calibration(Genesys_Device* dev, const Genes
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
gl843_stop_action (dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
turn++;
|
||||
|
||||
|
@ -2488,13 +2353,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)
|
||||
{
|
||||
|
@ -2523,7 +2388,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);
|
||||
|
@ -2557,7 +2422,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)
|
||||
{
|
||||
|
@ -2701,13 +2566,13 @@ void CommandSetGl843::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
|||
|
||||
if (is_testing_mode()) {
|
||||
dev->interface->test_checkpoint("coarse_gain_calibration");
|
||||
gl843_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
slow_back_home(dev, true);
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
|
@ -2754,7 +2619,7 @@ void CommandSetGl843::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
|||
dev->frontend.set_gain(2, dev->frontend.get_gain(1));
|
||||
}
|
||||
|
||||
gl843_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
slow_back_home(dev, true);
|
||||
}
|
||||
|
@ -2930,7 +2795,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 +2855,7 @@ void CommandSetGl843::move_to_ta(Genesys_Device* dev) const
|
|||
}
|
||||
unsigned feed = static_cast<unsigned>(multiplier * (dev->model->y_offset_sensor_to_ta * resolution) /
|
||||
MM_PER_INCH);
|
||||
gl843_feed(dev, feed);
|
||||
scanner_move(*dev, feed, Direction::FORWARD);
|
||||
}
|
||||
|
||||
|
||||
|
@ -3012,7 +2877,7 @@ void CommandSetGl843::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
unsigned int pass, count, found, x, y;
|
||||
|
||||
dev->cmd_set->set_fe(dev, sensor, AFE_SET);
|
||||
gl843_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
/* set up for a gray scan at lowest dpi */
|
||||
dpi = sanei_genesys_get_lowest_dpi(dev);
|
||||
|
@ -3057,7 +2922,7 @@ void CommandSetGl843::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
|
||||
if (is_testing_mode()) {
|
||||
dev->interface->test_checkpoint("search_strip");
|
||||
gl843_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3067,7 +2932,7 @@ void CommandSetGl843::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
auto data = read_unshuffled_image_from_scanner(dev, session,
|
||||
session.output_total_bytes_raw);
|
||||
|
||||
gl843_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
pass = 0;
|
||||
if (DBG_LEVEL >= DBG_data)
|
||||
|
@ -3092,7 +2957,7 @@ void CommandSetGl843::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
// now we're on target, we can read data
|
||||
data = read_unshuffled_image_from_scanner(dev, session, session.output_total_bytes_raw);
|
||||
|
||||
gl843_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
if (DBG_LEVEL >= DBG_data)
|
||||
{
|
||||
|
|
|
@ -612,8 +612,8 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
|
|||
dev->cmd_set->set_fe(dev, sensor, AFE_SET);
|
||||
|
||||
/* enable shading */
|
||||
regs_set_optical_off(dev->model->asic_type, *reg);
|
||||
r = sanei_genesys_get_address(reg, REG_0x01);
|
||||
r->value &= ~REG_0x01_SCAN;
|
||||
r->value |= REG_0x01_SHDAREA;
|
||||
if (has_flag(session.params.flags, ScanFlag::DISABLE_SHADING) ||
|
||||
(dev->model->flags & GENESYS_FLAG_NO_CALIBRATION))
|
||||
|
@ -840,52 +840,6 @@ void CommandSetGl846::set_powersaving(Genesys_Device* dev, int delay /* in minut
|
|||
DBG_HELPER_ARGS(dbg, "delay = %d", delay);
|
||||
}
|
||||
|
||||
void gl846_stop_action(Genesys_Device* dev)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
unsigned int loop;
|
||||
|
||||
dev->cmd_set->update_home_sensor_gpio(*dev);
|
||||
scanner_read_print_status(*dev);
|
||||
|
||||
uint8_t val40 = dev->interface->read_register(REG_0x40);
|
||||
|
||||
/* only stop action if needed */
|
||||
if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG)) {
|
||||
DBG(DBG_info, "%s: already stopped\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
/* ends scan */
|
||||
std::uint8_t val = dev->reg.get8(REG_0x01);
|
||||
val &= ~REG_0x01_SCAN;
|
||||
dev->reg.set8(REG_0x01, val);
|
||||
dev->interface->write_register(REG_0x01, val);
|
||||
dev->interface->sleep_ms(100);
|
||||
|
||||
if (is_testing_mode()) {
|
||||
return;
|
||||
}
|
||||
|
||||
loop = 10;
|
||||
while (loop > 0) {
|
||||
auto status = scanner_read_status(*dev);
|
||||
val40 = dev->interface->read_register(REG_0x40);
|
||||
|
||||
/* if scanner is in command mode, we are done */
|
||||
if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG) &&
|
||||
!status.is_motor_enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
dev->interface->sleep_ms(100);
|
||||
loop--;
|
||||
}
|
||||
|
||||
throw SaneException(SANE_STATUS_IO_ERROR, "could not stop motor");
|
||||
}
|
||||
|
||||
// Send the low-level scan command
|
||||
void CommandSetGl846::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||
Genesys_Register_Set* reg, bool start_motor) const
|
||||
|
@ -924,7 +878,7 @@ void CommandSetGl846::end_scan(Genesys_Device* dev, Genesys_Register_Set* reg,
|
|||
DBG_HELPER_ARGS(dbg, "check_stop = %d", check_stop);
|
||||
|
||||
if (!dev->model->is_sheetfed) {
|
||||
gl846_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1054,88 +1008,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 +1106,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<unsigned>(move - 500));
|
||||
if (dev->settings.get_channels() * dev->settings.yres >= 600 && move > 700) {
|
||||
scanner_move(*dev, static_cast<unsigned>(move - 500), Direction::FORWARD);
|
||||
move=500;
|
||||
}
|
||||
|
||||
|
@ -1370,7 +1241,7 @@ SensorExposure CommandSetGl846::led_calibration(Genesys_Device* dev, const Genes
|
|||
move = static_cast<float>((move * (dev->motor.base_ydpi / 4)) / MM_PER_INCH);
|
||||
if(move>20)
|
||||
{
|
||||
gl846_feed(dev, static_cast<unsigned>(move));
|
||||
scanner_move(*dev, static_cast<unsigned>(move), Direction::FORWARD);
|
||||
}
|
||||
DBG(DBG_io, "%s: move=%f steps\n", __func__, move);
|
||||
|
||||
|
@ -1439,7 +1310,7 @@ SensorExposure CommandSetGl846::led_calibration(Genesys_Device* dev, const Genes
|
|||
|
||||
if (is_testing_mode()) {
|
||||
dev->interface->test_checkpoint("led_calibration");
|
||||
gl846_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
slow_back_home(dev, true);
|
||||
return { 0, 0, 0 };
|
||||
}
|
||||
|
@ -1447,7 +1318,7 @@ SensorExposure CommandSetGl846::led_calibration(Genesys_Device* dev, const Genes
|
|||
sanei_genesys_read_data_from_scanner(dev, line.data(), total_size);
|
||||
|
||||
// stop scanning
|
||||
gl846_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
if (DBG_LEVEL >= DBG_data)
|
||||
{
|
||||
|
@ -1710,7 +1581,7 @@ void CommandSetGl846::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
|
||||
set_fe(dev, sensor, AFE_SET);
|
||||
|
||||
gl846_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
// set up for a gray scan at lowest dpi
|
||||
const auto& resolution_settings = dev->model->get_resolution_settings(dev->settings.scan_method);
|
||||
|
@ -1755,7 +1626,7 @@ void CommandSetGl846::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
|
||||
if (is_testing_mode()) {
|
||||
dev->interface->test_checkpoint("search_strip");
|
||||
gl846_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1764,7 +1635,7 @@ void CommandSetGl846::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
// now we're on target, we can read data
|
||||
sanei_genesys_read_data_from_scanner(dev, data.data(), size);
|
||||
|
||||
gl846_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
pass = 0;
|
||||
if (DBG_LEVEL >= DBG_data)
|
||||
|
@ -1789,7 +1660,7 @@ void CommandSetGl846::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
// now we're on target, we can read data
|
||||
sanei_genesys_read_data_from_scanner(dev, data.data(), size);
|
||||
|
||||
gl846_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
if (DBG_LEVEL >= DBG_data)
|
||||
{
|
||||
|
@ -2139,7 +2010,7 @@ void CommandSetGl846::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
|||
|
||||
if (is_testing_mode()) {
|
||||
dev->interface->test_checkpoint("coarse_gain_calibration");
|
||||
gl846_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
slow_back_home(dev, true);
|
||||
return;
|
||||
}
|
||||
|
@ -2193,7 +2064,7 @@ void CommandSetGl846::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
|||
dev->frontend.set_gain(2, gain0);
|
||||
}
|
||||
|
||||
gl846_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
slow_back_home(dev, true);
|
||||
}
|
||||
|
|
|
@ -50,16 +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);
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GpioId gpio_id;
|
||||
|
|
|
@ -619,8 +619,8 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
|
|||
dev->cmd_set->set_fe(dev, sensor, AFE_SET);
|
||||
|
||||
/* enable shading */
|
||||
regs_set_optical_off(dev->model->asic_type, *reg);
|
||||
r = sanei_genesys_get_address(reg, REG_0x01);
|
||||
r->value &= ~REG_0x01_SCAN;
|
||||
r->value |= REG_0x01_SHDAREA;
|
||||
|
||||
if (has_flag(session.params.flags, ScanFlag::DISABLE_SHADING) ||
|
||||
|
@ -844,55 +844,6 @@ void CommandSetGl847::set_powersaving(Genesys_Device* dev, int delay /* in minut
|
|||
DBG_HELPER_ARGS(dbg, "delay = %d", delay);
|
||||
}
|
||||
|
||||
void gl847_stop_action(Genesys_Device* dev)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
uint8_t val;
|
||||
unsigned int loop;
|
||||
|
||||
dev->cmd_set->update_home_sensor_gpio(*dev);
|
||||
scanner_read_print_status(*dev);
|
||||
|
||||
uint8_t val40 = dev->interface->read_register(REG_0x40);
|
||||
|
||||
/* only stop action if needed */
|
||||
if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG)) {
|
||||
DBG(DBG_info, "%s: already stopped\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
/* ends scan */
|
||||
val = dev->reg.get8(REG_0x01);
|
||||
val &= ~REG_0x01_SCAN;
|
||||
dev->reg.set8(REG_0x01, val);
|
||||
dev->interface->write_register(REG_0x01, val);
|
||||
|
||||
dev->interface->sleep_ms(100);
|
||||
|
||||
if (is_testing_mode()) {
|
||||
return;
|
||||
}
|
||||
|
||||
loop = 10;
|
||||
while (loop > 0)
|
||||
{
|
||||
auto status = scanner_read_status(*dev);
|
||||
val40 = dev->interface->read_register(REG_0x40);
|
||||
|
||||
/* if scanner is in command mode, we are done */
|
||||
if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG) &&
|
||||
!status.is_motor_enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
dev->interface->sleep_ms(100);
|
||||
loop--;
|
||||
}
|
||||
|
||||
throw SaneException(SANE_STATUS_IO_ERROR, "could not stop motor");
|
||||
}
|
||||
|
||||
// Send the low-level scan command
|
||||
void CommandSetGl847::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||
Genesys_Register_Set* reg, bool start_motor) const
|
||||
|
@ -932,7 +883,7 @@ void CommandSetGl847::end_scan(Genesys_Device* dev, Genesys_Register_Set* reg,
|
|||
DBG_HELPER_ARGS(dbg, "check_stop = %d", check_stop);
|
||||
|
||||
if (!dev->model->is_sheetfed) {
|
||||
gl847_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1100,86 +1051,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 +1141,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<unsigned>(move - 500));
|
||||
scanner_move(*dev, static_cast<unsigned>(move - 500), Direction::FORWARD);
|
||||
move=500;
|
||||
}
|
||||
|
||||
|
@ -1403,9 +1274,8 @@ SensorExposure CommandSetGl847::led_calibration(Genesys_Device* dev, const Genes
|
|||
|
||||
move = static_cast<float>(dev->model->y_offset_calib_white);
|
||||
move = static_cast<float>((move * (dev->motor.base_ydpi / 4)) / MM_PER_INCH);
|
||||
if(move>20)
|
||||
{
|
||||
gl847_feed(dev, static_cast<unsigned>(move));
|
||||
if (move > 20) {
|
||||
scanner_move(*dev, static_cast<unsigned>(move), Direction::FORWARD);
|
||||
}
|
||||
DBG(DBG_io, "%s: move=%f steps\n", __func__, move);
|
||||
|
||||
|
@ -1474,7 +1344,7 @@ SensorExposure CommandSetGl847::led_calibration(Genesys_Device* dev, const Genes
|
|||
|
||||
if (is_testing_mode()) {
|
||||
dev->interface->test_checkpoint("led_calibration");
|
||||
gl847_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
slow_back_home(dev, true);
|
||||
return { 0, 0, 0 };
|
||||
}
|
||||
|
@ -1482,7 +1352,7 @@ SensorExposure CommandSetGl847::led_calibration(Genesys_Device* dev, const Genes
|
|||
sanei_genesys_read_data_from_scanner(dev, line.data(), total_size);
|
||||
|
||||
// stop scanning
|
||||
gl847_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
if (DBG_LEVEL >= DBG_data)
|
||||
{
|
||||
|
@ -1781,7 +1651,7 @@ void CommandSetGl847::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
char title[80];
|
||||
|
||||
set_fe(dev, sensor, AFE_SET);
|
||||
gl847_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
// set up for a gray scan at lowest dpi
|
||||
const auto& resolution_settings = dev->model->get_resolution_settings(dev->settings.scan_method);
|
||||
|
@ -1826,7 +1696,7 @@ void CommandSetGl847::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
|
||||
if (is_testing_mode()) {
|
||||
dev->interface->test_checkpoint("search_strip");
|
||||
gl847_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1835,7 +1705,7 @@ void CommandSetGl847::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
// now we're on target, we can read data
|
||||
sanei_genesys_read_data_from_scanner(dev, data.data(), size);
|
||||
|
||||
gl847_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
pass = 0;
|
||||
if (DBG_LEVEL >= DBG_data)
|
||||
|
@ -1860,7 +1730,7 @@ void CommandSetGl847::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
|
|||
// now we're on target, we can read data
|
||||
sanei_genesys_read_data_from_scanner(dev, data.data(), size);
|
||||
|
||||
gl847_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
if (DBG_LEVEL >= DBG_data)
|
||||
{
|
||||
|
@ -2210,7 +2080,7 @@ void CommandSetGl847::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
|||
|
||||
if (is_testing_mode()) {
|
||||
dev->interface->test_checkpoint("coarse_gain_calibration");
|
||||
gl847_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
slow_back_home(dev, true);
|
||||
return;
|
||||
}
|
||||
|
@ -2270,7 +2140,7 @@ void CommandSetGl847::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
|||
dev->frontend.set_gain(2, dev->frontend.get_gain(1));
|
||||
}
|
||||
|
||||
gl847_stop_action(dev);
|
||||
scanner_stop_action(*dev);
|
||||
|
||||
slow_back_home(dev, true);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -49,6 +49,7 @@
|
|||
#include "test_settings.h"
|
||||
|
||||
#include "gl124_registers.h"
|
||||
#include "gl646_registers.h"
|
||||
#include "gl841_registers.h"
|
||||
#include "gl843_registers.h"
|
||||
#include "gl846_registers.h"
|
||||
|
@ -592,12 +593,13 @@ void sanei_genesys_set_lamp_power(Genesys_Device* dev, const Genesys_Sensor& sen
|
|||
regs.find_reg(0x03).value |= REG_0x03_LAMPPWR;
|
||||
|
||||
if (dev->model->asic_type == AsicType::GL841) {
|
||||
sanei_genesys_set_exposure(regs, sanei_genesys_fixup_exposure(sensor.exposure));
|
||||
regs_set_exposure(dev->model->asic_type, regs,
|
||||
sanei_genesys_fixup_exposure(sensor.exposure));
|
||||
regs.set8(0x19, 0x50);
|
||||
}
|
||||
|
||||
if (dev->model->asic_type == AsicType::GL843) {
|
||||
sanei_genesys_set_exposure(regs, sensor.exposure);
|
||||
regs_set_exposure(dev->model->asic_type, regs, sensor.exposure);
|
||||
|
||||
// we don't actually turn on lamp on infrared scan
|
||||
if ((dev->model->model_id == ModelId::CANON_8400F ||
|
||||
|
@ -613,7 +615,7 @@ void sanei_genesys_set_lamp_power(Genesys_Device* dev, const Genesys_Sensor& sen
|
|||
regs.find_reg(0x03).value &= ~REG_0x03_LAMPPWR;
|
||||
|
||||
if (dev->model->asic_type == AsicType::GL841) {
|
||||
sanei_genesys_set_exposure(regs, {0x0101, 0x0101, 0x0101});
|
||||
regs_set_exposure(dev->model->asic_type, regs, {0x0101, 0x0101, 0x0101});
|
||||
regs.set8(0x19, 0xff);
|
||||
}
|
||||
|
||||
|
@ -624,7 +626,7 @@ void sanei_genesys_set_lamp_power(Genesys_Device* dev, const Genesys_Sensor& sen
|
|||
dev->model->model_id == ModelId::HP_SCANJET_G4050)
|
||||
{
|
||||
// BUG: datasheet says we shouldn't set exposure to zero
|
||||
sanei_genesys_set_exposure(regs, {0, 0, 0});
|
||||
regs_set_exposure(dev->model->asic_type, regs, {0, 0, 0});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1644,6 +1646,86 @@ void sanei_genesys_set_dpihw(Genesys_Register_Set& regs, const Genesys_Sensor& s
|
|||
regs.set8_mask(0x05, dpihw_setting, REG_0x05_DPIHW_MASK);
|
||||
}
|
||||
|
||||
void regs_set_exposure(AsicType asic_type, Genesys_Register_Set& regs,
|
||||
const SensorExposure& exposure)
|
||||
{
|
||||
switch (asic_type) {
|
||||
case AsicType::GL124: {
|
||||
regs.set24(gl124::REG_EXPR, exposure.red);
|
||||
regs.set24(gl124::REG_EXPG, exposure.green);
|
||||
regs.set24(gl124::REG_EXPB, exposure.blue);
|
||||
break;
|
||||
}
|
||||
case AsicType::GL646: {
|
||||
regs.set16(gl646::REG_EXPR, exposure.red);
|
||||
regs.set16(gl646::REG_EXPG, exposure.green);
|
||||
regs.set16(gl646::REG_EXPB, exposure.blue);
|
||||
break;
|
||||
}
|
||||
case AsicType::GL841: {
|
||||
regs.set16(gl841::REG_EXPR, exposure.red);
|
||||
regs.set16(gl841::REG_EXPG, exposure.green);
|
||||
regs.set16(gl841::REG_EXPB, exposure.blue);
|
||||
break;
|
||||
}
|
||||
case AsicType::GL843: {
|
||||
regs.set16(gl843::REG_EXPR, exposure.red);
|
||||
regs.set16(gl843::REG_EXPG, exposure.green);
|
||||
regs.set16(gl843::REG_EXPB, exposure.blue);
|
||||
break;
|
||||
}
|
||||
case AsicType::GL845:
|
||||
case AsicType::GL846: {
|
||||
regs.set16(gl846::REG_EXPR, exposure.red);
|
||||
regs.set16(gl846::REG_EXPG, exposure.green);
|
||||
regs.set16(gl846::REG_EXPB, exposure.blue);
|
||||
break;
|
||||
}
|
||||
case AsicType::GL847: {
|
||||
regs.set16(gl847::REG_EXPR, exposure.red);
|
||||
regs.set16(gl847::REG_EXPG, exposure.green);
|
||||
regs.set16(gl847::REG_EXPB, exposure.blue);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw SaneException("Unsupported asic");
|
||||
}
|
||||
}
|
||||
|
||||
void regs_set_optical_off(AsicType asic_type, Genesys_Register_Set& regs)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
switch (asic_type) {
|
||||
case AsicType::GL646: {
|
||||
regs.find_reg(gl646::REG_0x01).value &= ~gl646::REG_0x01_SCAN;
|
||||
break;
|
||||
}
|
||||
case AsicType::GL841: {
|
||||
regs.find_reg(gl841::REG_0x01).value &= ~gl841::REG_0x01_SCAN;
|
||||
break;
|
||||
}
|
||||
case AsicType::GL843: {
|
||||
regs.find_reg(gl843::REG_0x01).value &= ~gl843::REG_0x01_SCAN;
|
||||
break;
|
||||
}
|
||||
case AsicType::GL845:
|
||||
case AsicType::GL846: {
|
||||
regs.find_reg(gl846::REG_0x01).value &= ~gl846::REG_0x01_SCAN;
|
||||
break;
|
||||
}
|
||||
case AsicType::GL847: {
|
||||
regs.find_reg(gl847::REG_0x01).value &= ~gl847::REG_0x01_SCAN;
|
||||
break;
|
||||
}
|
||||
case AsicType::GL124: {
|
||||
regs.find_reg(gl124::REG_0x01).value &= ~gl124::REG_0x01_SCAN;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw SaneException("Unsupported asic");
|
||||
}
|
||||
}
|
||||
|
||||
bool get_registers_gain4_bit(AsicType asic_type, const Genesys_Register_Set& regs)
|
||||
{
|
||||
switch (asic_type) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
@ -373,15 +376,10 @@ extern void sanei_genesys_read_data_from_scanner(Genesys_Device* dev, uint8_t* d
|
|||
Image read_unshuffled_image_from_scanner(Genesys_Device* dev, const ScanSession& session,
|
||||
std::size_t total_bytes);
|
||||
|
||||
inline void sanei_genesys_set_exposure(Genesys_Register_Set& regs, const SensorExposure& exposure)
|
||||
{
|
||||
regs.set8(0x10, (exposure.red >> 8) & 0xff);
|
||||
regs.set8(0x11, exposure.red & 0xff);
|
||||
regs.set8(0x12, (exposure.green >> 8) & 0xff);
|
||||
regs.set8(0x13, exposure.green & 0xff);
|
||||
regs.set8(0x14, (exposure.blue >> 8) & 0xff);
|
||||
regs.set8(0x15, exposure.blue & 0xff);
|
||||
}
|
||||
void regs_set_exposure(AsicType asic_type, Genesys_Register_Set& regs,
|
||||
const SensorExposure& exposure);
|
||||
|
||||
void regs_set_optical_off(AsicType asic_type, Genesys_Register_Set& regs);
|
||||
|
||||
void sanei_genesys_set_dpihw(Genesys_Register_Set& regs, const Genesys_Sensor& sensor,
|
||||
unsigned dpihw);
|
||||
|
@ -413,6 +411,9 @@ 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);
|
||||
|
||||
bool scanner_is_motor_stopped(Genesys_Device& dev);
|
||||
|
||||
const Motor_Profile& sanei_genesys_get_motor_profile(const std::vector<Motor_Profile>& motors,
|
||||
MotorId motor_id, int exposure);
|
||||
|
|
Ładowanie…
Reference in New Issue