genesys: Fix recovery from interrupted transparency scans on 8600F

merge-requests/317/merge
Povilas Kanapickas 2020-01-25 11:28:04 +02:00
rodzic 5747ffa9fb
commit 1748e625f0
7 zmienionych plików z 105 dodań i 15 usunięć

Wyświetl plik

@ -160,6 +160,9 @@ public:
/// cold boot init function /// cold boot init function
virtual void asic_boot(Genesys_Device* dev, bool cold) const = 0; virtual void asic_boot(Genesys_Device* dev, bool cold) const = 0;
/// checks if specific scan head is at home position
virtual bool is_head_home(Genesys_Device& dev, ScanHeadId scan_head) const = 0;
/// enables or disables XPA slider motor /// enables or disables XPA slider motor
virtual void set_xpa_lamp_power(Genesys_Device& dev, bool set) const = 0; virtual void set_xpa_lamp_power(Genesys_Device& dev, bool set) const = 0;

Wyświetl plik

@ -23,11 +23,50 @@
#define DEBUG_DECLARE_ONLY #define DEBUG_DECLARE_ONLY
#include "command_set_common.h" #include "command_set_common.h"
#include "low.h"
namespace genesys { namespace genesys {
CommandSetCommon::~CommandSetCommon() = default; CommandSetCommon::~CommandSetCommon() = default;
bool CommandSetCommon::is_head_home(Genesys_Device& dev, ScanHeadId scan_head) const
{
struct HeadSettings {
ModelId model_id;
ScanHeadId scan_head;
GenesysRegisterSettingSet regs;
};
HeadSettings settings[] = {
{ ModelId::CANON_8600F,
ScanHeadId::PRIMARY, {
{ 0x6c, 0x20, 0x60 },
{ 0xa6, 0x00, 0x01 },
}
},
{ ModelId::CANON_8600F,
ScanHeadId::SECONDARY, {
{ 0x6c, 0x00, 0x60 },
{ 0xa6, 0x01, 0x01 },
}
},
};
for (const auto& setting : settings) {
if (setting.model_id == dev.model->model_id &&
setting.scan_head == scan_head)
{
auto reg_backup = apply_reg_settings_to_device_with_backup(dev, setting.regs);
auto status = scanner_read_status(dev);
apply_reg_settings_to_device(dev, reg_backup);
return status.is_at_home;
}
}
auto status = scanner_read_status(dev);
return status.is_at_home;
}
void CommandSetCommon::set_xpa_lamp_power(Genesys_Device& dev, bool set) const void CommandSetCommon::set_xpa_lamp_power(Genesys_Device& dev, bool set) const
{ {
@ -127,6 +166,7 @@ void CommandSetCommon::set_motor_mode(Genesys_Device& dev, Genesys_Register_Set&
ResolutionFilter resolutions; ResolutionFilter resolutions;
GenesysRegisterSettingSet regs_primary_and_secondary; GenesysRegisterSettingSet regs_primary_and_secondary;
GenesysRegisterSettingSet regs_primary; GenesysRegisterSettingSet regs_primary;
GenesysRegisterSettingSet regs_secondary;
}; };
MotorSettings settings[] = { MotorSettings settings[] = {
@ -136,7 +176,7 @@ void CommandSetCommon::set_motor_mode(Genesys_Device& dev, Genesys_Register_Set&
}, { }, {
{ 0x6c, 0x90, 0x90 }, { 0x6c, 0x90, 0x90 },
{ 0xa9, 0x02, 0x06 }, { 0xa9, 0x02, 0x06 },
} }, {}
}, },
{ ModelId::CANON_8400F, { 3200 }, { { ModelId::CANON_8400F, { 3200 }, {
{ 0x6c, 0x00, 0x92 }, { 0x6c, 0x00, 0x92 },
@ -144,22 +184,28 @@ void CommandSetCommon::set_motor_mode(Genesys_Device& dev, Genesys_Register_Set&
}, { }, {
{ 0x6c, 0x90, 0x90 }, { 0x6c, 0x90, 0x90 },
{ 0xa9, 0x02, 0x06 }, { 0xa9, 0x02, 0x06 },
} }, {}
}, },
{ ModelId::CANON_8600F, { 300, 600, 1200 }, { { ModelId::CANON_8600F, { 300, 600, 1200 }, {
{ 0x6c, 0x00, 0x20 }, { 0x6c, 0x00, 0x60 },
{ 0xa6, 0x01, 0x41 }, { 0xa6, 0x01, 0x41 },
}, { }, {
{ 0x6c, 0x20, 0x22 }, { 0x6c, 0x20, 0x62 },
{ 0xa6, 0x00, 0x41 }, { 0xa6, 0x00, 0x41 },
}, {
{ 0x6c, 0x40, 0x62 },
{ 0xa6, 0x01, 0x41 },
} }
}, },
{ ModelId::CANON_8600F, { 2400, 4800 }, { { ModelId::CANON_8600F, { 2400, 4800 }, {
{ 0x6c, 0x02, 0x22 }, { 0x6c, 0x02, 0x62 },
{ 0xa6, 0x01, 0x41 }, { 0xa6, 0x01, 0x41 },
}, { }, {
{ 0x6c, 0x20, 0x22 }, { 0x6c, 0x20, 0x62 },
{ 0xa6, 0x00, 0x41 }, { 0xa6, 0x00, 0x41 },
}, {
{ 0x6c, 0x40, 0x62 },
{ 0xa6, 0x01, 0x41 },
} }
}, },
{ ModelId::HP_SCANJET_G4050, ResolutionFilter::ANY, { { ModelId::HP_SCANJET_G4050, ResolutionFilter::ANY, {
@ -173,11 +219,11 @@ void CommandSetCommon::set_motor_mode(Genesys_Device& dev, Genesys_Register_Set&
{ 0x6b, 0x00, 0x01 }, // BUG: note that only ADF is unset { 0x6b, 0x00, 0x01 }, // BUG: note that only ADF is unset
{ 0xa8, 0x04, 0x04 }, { 0xa8, 0x04, 0x04 },
{ 0xa9, 0x00, 0x10 }, // note that 0x20 bit is not reset { 0xa9, 0x00, 0x10 }, // note that 0x20 bit is not reset
} }, {}
}, },
{ ModelId::PLUSTEK_OPTICFILM_7200I, ResolutionFilter::ANY, {}, {} }, { ModelId::PLUSTEK_OPTICFILM_7200I, ResolutionFilter::ANY, {}, {}, {} },
{ ModelId::PLUSTEK_OPTICFILM_7300, ResolutionFilter::ANY, {}, {} }, { ModelId::PLUSTEK_OPTICFILM_7300, ResolutionFilter::ANY, {}, {}, {} },
{ ModelId::PLUSTEK_OPTICFILM_7500I, ResolutionFilter::ANY, {}, {} }, { ModelId::PLUSTEK_OPTICFILM_7500I, ResolutionFilter::ANY, {}, {}, {} },
}; };
for (const auto& setting : settings) { for (const auto& setting : settings) {
@ -193,6 +239,10 @@ void CommandSetCommon::set_motor_mode(Genesys_Device& dev, Genesys_Register_Set&
apply_reg_settings_to_device(dev, setting.regs_primary_and_secondary); apply_reg_settings_to_device(dev, setting.regs_primary_and_secondary);
break; break;
} }
case MotorMode::SECONDARY: {
apply_reg_settings_to_device(dev, setting.regs_secondary);
break;
}
} }
regs.state.motor_mode = mode; regs.state.motor_mode = mode;
return; return;

Wyświetl plik

@ -35,6 +35,8 @@ class CommandSetCommon : public CommandSet
public: public:
~CommandSetCommon() override; ~CommandSetCommon() override;
bool is_head_home(Genesys_Device& dev, ScanHeadId scan_head) const override;
void set_xpa_lamp_power(Genesys_Device& dev, bool set) const override; void set_xpa_lamp_power(Genesys_Device& dev, bool set) const override;
void set_motor_mode(Genesys_Device& dev, Genesys_Register_Set& regs, void set_motor_mode(Genesys_Device& dev, Genesys_Register_Set& regs,

Wyświetl plik

@ -528,6 +528,7 @@ enum class MotorMode : unsigned
{ {
PRIMARY = 0, PRIMARY = 0,
PRIMARY_AND_SECONDARY, PRIMARY_AND_SECONDARY,
SECONDARY,
}; };
} // namespace genesys } // namespace genesys

Wyświetl plik

@ -1176,8 +1176,22 @@ void scanner_move_back_home(Genesys_Device& dev, bool wait_until_home)
} }
namespace { namespace {
void handle_motor_position_after_move_back_home_ta(Genesys_Device& dev) bool should_use_secondary_motor_mode(Genesys_Device& dev)
{ {
bool should_use = !dev.is_head_pos_known(ScanHeadId::SECONDARY) ||
!dev.is_head_pos_known(ScanHeadId::PRIMARY) ||
dev.head_pos(ScanHeadId::SECONDARY) > dev.head_pos(ScanHeadId::PRIMARY);
bool supports = dev.model->model_id == ModelId::CANON_8600F;
return should_use && supports;
}
void handle_motor_position_after_move_back_home_ta(Genesys_Device& dev, MotorMode motor_mode)
{
if (motor_mode == MotorMode::SECONDARY) {
dev.set_head_pos_zero(ScanHeadId::SECONDARY);
return;
}
if (dev.is_head_pos_known(ScanHeadId::PRIMARY)) { if (dev.is_head_pos_known(ScanHeadId::PRIMARY)) {
if (dev.head_pos(ScanHeadId::PRIMARY) > dev.head_pos(ScanHeadId::SECONDARY)) { if (dev.head_pos(ScanHeadId::PRIMARY) > dev.head_pos(ScanHeadId::SECONDARY)) {
dev.advance_head_pos_by_steps(ScanHeadId::PRIMARY, Direction::BACKWARD, dev.advance_head_pos_by_steps(ScanHeadId::PRIMARY, Direction::BACKWARD,
@ -1209,7 +1223,9 @@ void scanner_move_back_home_ta(Genesys_Device& dev)
const auto& sensor = sanei_genesys_find_sensor(&dev, resolution, 1, scan_method); const auto& sensor = sanei_genesys_find_sensor(&dev, resolution, 1, scan_method);
if (dev.is_head_pos_known(ScanHeadId::SECONDARY) && if (dev.is_head_pos_known(ScanHeadId::SECONDARY) &&
dev.head_pos(ScanHeadId::SECONDARY) > 1000) dev.is_head_pos_known(ScanHeadId::PRIMARY) &&
dev.head_pos(ScanHeadId::SECONDARY) > 1000 &&
dev.head_pos(ScanHeadId::SECONDARY) <= dev.head_pos(ScanHeadId::PRIMARY))
{ {
// leave 500 steps for regular slow back home // leave 500 steps for regular slow back home
scanner_move(dev, scan_method, dev.head_pos(ScanHeadId::SECONDARY) - 500, scanner_move(dev, scan_method, dev.head_pos(ScanHeadId::SECONDARY) - 500,
@ -1240,7 +1256,11 @@ void scanner_move_back_home_ta(Genesys_Device& dev)
scanner_clear_scan_and_feed_counts(dev); scanner_clear_scan_and_feed_counts(dev);
dev.interface->write_registers(local_reg); dev.interface->write_registers(local_reg);
dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY_AND_SECONDARY);
auto motor_mode = should_use_secondary_motor_mode(dev) ? MotorMode::SECONDARY
: MotorMode::PRIMARY_AND_SECONDARY;
dev.cmd_set->set_motor_mode(dev, local_reg, motor_mode);
try { try {
scanner_start_action(dev, true); scanner_start_action(dev, true);
@ -1254,7 +1274,7 @@ void scanner_move_back_home_ta(Genesys_Device& dev)
if (is_testing_mode()) { if (is_testing_mode()) {
dev.interface->test_checkpoint("move_back_home_ta"); dev.interface->test_checkpoint("move_back_home_ta");
handle_motor_position_after_move_back_home_ta(dev); handle_motor_position_after_move_back_home_ta(dev, motor_mode);
scanner_stop_action(dev); scanner_stop_action(dev);
dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY); dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY);
@ -1268,7 +1288,7 @@ void scanner_move_back_home_ta(Genesys_Device& dev)
if (status.is_at_home) { if (status.is_at_home) {
dbg.log(DBG_info, "TA reached home position"); dbg.log(DBG_info, "TA reached home position");
handle_motor_position_after_move_back_home_ta(dev); handle_motor_position_after_move_back_home_ta(dev, motor_mode);
scanner_stop_action(dev); scanner_stop_action(dev);
dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY); dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY);

Wyświetl plik

@ -1446,6 +1446,12 @@ void CommandSetGl843::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sens
dev->advance_head_pos_by_session(ScanHeadId::SECONDARY); dev->advance_head_pos_by_session(ScanHeadId::SECONDARY);
break; break;
} }
case MotorMode::SECONDARY: {
if (reg->state.is_motor_on) {
dev->advance_head_pos_by_session(ScanHeadId::SECONDARY);
}
break;
}
} }
} }

Wyświetl plik

@ -1504,6 +1504,14 @@ void sanei_genesys_asic_init(Genesys_Device* dev, bool /*max_regs*/)
dev->already_initialized = true; dev->already_initialized = true;
// Move to home if needed // Move to home if needed
if (dev->model->model_id == ModelId::CANON_8600F) {
if (!dev->cmd_set->is_head_home(*dev, ScanHeadId::SECONDARY)) {
dev->set_head_pos_unknown(ScanHeadId::SECONDARY);
}
if (!dev->cmd_set->is_head_home(*dev, ScanHeadId::PRIMARY)) {
dev->set_head_pos_unknown(ScanHeadId::SECONDARY);
}
}
dev->cmd_set->move_back_home(dev, true); dev->cmd_set->move_back_home(dev, true);
// Set powersaving (default = 15 minutes) // Set powersaving (default = 15 minutes)