Merge branch 'genesys-reduce-duplication' into 'master'

genesys: Reduce duplication in scan head movement routines

See merge request sane-project/backends!255
merge-requests/256/merge
Povilas Kanapickas 2019-12-09 17:06:05 +00:00
commit 037f06712e
15 zmienionych plików z 384 dodań i 677 usunięć

Wyświetl plik

@ -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

Wyświetl plik

@ -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;

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -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);

Wyświetl plik

@ -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);

Wyświetl plik

@ -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;

Wyświetl plik

@ -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);

Wyświetl plik

@ -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;

Wyświetl plik

@ -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, &regs);
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, &regs);
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, &regs);
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, &regs, true);
auto second_line = read_unshuffled_image_from_scanner(dev, session,
session.output_total_bytes_raw);
gl843_stop_action_no_move(dev, &regs);
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, &regs, true);
second_line = read_unshuffled_image_from_scanner(dev, session,
session.output_total_bytes_raw);
gl843_stop_action_no_move(dev, &regs);
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, &regs);
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)
{

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -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;

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -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;

Wyświetl plik

@ -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) {

Wyświetl plik

@ -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);