kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Make XPA motor mode handling more generic
rodzic
23f3f80e38
commit
e8e56e33d3
|
@ -164,8 +164,8 @@ public:
|
|||
virtual void set_xpa_lamp_power(Genesys_Device& dev, bool set) const = 0;
|
||||
|
||||
/// enables or disables XPA slider motor
|
||||
virtual void set_xpa_motor_power(Genesys_Device& dev, Genesys_Register_Set& regs,
|
||||
bool set) const = 0;
|
||||
virtual void set_motor_mode(Genesys_Device& dev, Genesys_Register_Set& regs,
|
||||
MotorMode mode) const = 0;
|
||||
};
|
||||
|
||||
} // namespace genesys
|
||||
|
|
|
@ -117,16 +117,16 @@ void CommandSetCommon::set_xpa_lamp_power(Genesys_Device& dev, bool set) const
|
|||
}
|
||||
|
||||
|
||||
void CommandSetCommon::set_xpa_motor_power(Genesys_Device& dev, Genesys_Register_Set& regs,
|
||||
bool set) const
|
||||
void CommandSetCommon::set_motor_mode(Genesys_Device& dev, Genesys_Register_Set& regs,
|
||||
MotorMode mode) const
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
|
||||
struct MotorSettings {
|
||||
ModelId model_id;
|
||||
ResolutionFilter resolutions;
|
||||
GenesysRegisterSettingSet regs_on;
|
||||
GenesysRegisterSettingSet regs_off;
|
||||
GenesysRegisterSettingSet regs_primary_and_secondary;
|
||||
GenesysRegisterSettingSet regs_primary;
|
||||
};
|
||||
|
||||
MotorSettings settings[] = {
|
||||
|
@ -184,8 +184,17 @@ void CommandSetCommon::set_xpa_motor_power(Genesys_Device& dev, Genesys_Register
|
|||
if (setting.model_id == dev.model->model_id &&
|
||||
setting.resolutions.matches(dev.session.output_resolution))
|
||||
{
|
||||
apply_reg_settings_to_device(dev, set ? setting.regs_on : setting.regs_off);
|
||||
regs.state.is_xpa_motor_on = set;
|
||||
switch (mode) {
|
||||
case MotorMode::PRIMARY: {
|
||||
apply_reg_settings_to_device(dev, setting.regs_primary);
|
||||
break;
|
||||
}
|
||||
case MotorMode::PRIMARY_AND_SECONDARY: {
|
||||
apply_reg_settings_to_device(dev, setting.regs_primary_and_secondary);
|
||||
break;
|
||||
}
|
||||
}
|
||||
regs.state.motor_mode = mode;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,8 +37,8 @@ public:
|
|||
|
||||
void set_xpa_lamp_power(Genesys_Device& dev, bool set) const override;
|
||||
|
||||
void set_xpa_motor_power(Genesys_Device& dev, Genesys_Register_Set& regs,
|
||||
bool set) const override;
|
||||
void set_motor_mode(Genesys_Device& dev, Genesys_Register_Set& regs,
|
||||
MotorMode mode) const override;
|
||||
};
|
||||
|
||||
} // namespace genesys
|
||||
|
|
|
@ -524,6 +524,11 @@ enum class Direction : unsigned
|
|||
BACKWARD = 1
|
||||
};
|
||||
|
||||
enum class MotorMode : unsigned
|
||||
{
|
||||
PRIMARY = 0,
|
||||
PRIMARY_AND_SECONDARY,
|
||||
};
|
||||
|
||||
} // namespace genesys
|
||||
|
||||
|
|
|
@ -964,14 +964,14 @@ void scanner_move(Genesys_Device& dev, ScanMethod scan_method, unsigned steps, D
|
|||
|
||||
dev.interface->write_registers(local_reg);
|
||||
if (uses_secondary_head) {
|
||||
dev.cmd_set->set_xpa_motor_power(dev, local_reg, true);
|
||||
dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY_AND_SECONDARY);
|
||||
}
|
||||
|
||||
try {
|
||||
scanner_start_action(dev, true);
|
||||
} catch (...) {
|
||||
catch_all_exceptions(__func__, [&]() {
|
||||
dev.cmd_set->set_xpa_motor_power(dev, local_reg, false);
|
||||
dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY);
|
||||
});
|
||||
catch_all_exceptions(__func__, [&]() { scanner_stop_action(dev); });
|
||||
// restore original registers
|
||||
|
@ -992,7 +992,7 @@ void scanner_move(Genesys_Device& dev, ScanMethod scan_method, unsigned steps, D
|
|||
scanner_stop_action(dev);
|
||||
}
|
||||
if (uses_secondary_head) {
|
||||
dev.cmd_set->set_xpa_motor_power(dev, local_reg, false);
|
||||
dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -1015,7 +1015,7 @@ void scanner_move(Genesys_Device& dev, ScanMethod scan_method, unsigned steps, D
|
|||
scanner_stop_action(dev);
|
||||
}
|
||||
if (uses_secondary_head) {
|
||||
dev.cmd_set->set_xpa_motor_power(dev, local_reg, false);
|
||||
dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY);
|
||||
}
|
||||
|
||||
dev.advance_head_pos_by_steps(ScanHeadId::PRIMARY, direction, steps);
|
||||
|
@ -1225,7 +1225,7 @@ void scanner_move_back_home_ta(Genesys_Device& dev)
|
|||
scanner_clear_scan_and_feed_counts(dev);
|
||||
|
||||
dev.interface->write_registers(local_reg);
|
||||
dev.cmd_set->set_xpa_motor_power(dev, local_reg, true);
|
||||
dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY_AND_SECONDARY);
|
||||
|
||||
try {
|
||||
scanner_start_action(dev, true);
|
||||
|
@ -1250,7 +1250,7 @@ void scanner_move_back_home_ta(Genesys_Device& dev)
|
|||
}
|
||||
|
||||
scanner_stop_action(dev);
|
||||
dev.cmd_set->set_xpa_motor_power(dev, local_reg, false);
|
||||
dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1272,7 +1272,7 @@ void scanner_move_back_home_ta(Genesys_Device& dev)
|
|||
}
|
||||
|
||||
scanner_stop_action(dev);
|
||||
dev.cmd_set->set_xpa_motor_power(dev, local_reg, false);
|
||||
dev.cmd_set->set_motor_mode(dev, local_reg, MotorMode::PRIMARY);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -1396,7 +1396,7 @@ void CommandSetGl843::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sens
|
|||
}
|
||||
|
||||
if (reg->state.is_xpa_on) {
|
||||
dev->cmd_set->set_xpa_motor_power(*dev, *reg, true);
|
||||
dev->cmd_set->set_motor_mode(*dev, *reg, MotorMode::PRIMARY_AND_SECONDARY);
|
||||
}
|
||||
|
||||
// blinking led
|
||||
|
@ -1408,7 +1408,7 @@ void CommandSetGl843::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sens
|
|||
dev->cmd_set->set_xpa_lamp_power(*dev, true);
|
||||
}
|
||||
if (reg->state.is_xpa_on) {
|
||||
dev->cmd_set->set_xpa_motor_power(*dev, *reg, true);
|
||||
dev->cmd_set->set_motor_mode(*dev, *reg, MotorMode::PRIMARY_AND_SECONDARY);
|
||||
}
|
||||
break;
|
||||
case GpioId::PLUSTEK_OPTICFILM_7200I:
|
||||
|
@ -1434,11 +1434,21 @@ void CommandSetGl843::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sens
|
|||
|
||||
scanner_start_action(*dev, start_motor);
|
||||
|
||||
if (reg->state.is_motor_on) {
|
||||
dev->advance_head_pos_by_session(ScanHeadId::PRIMARY);
|
||||
}
|
||||
if (reg->state.is_xpa_motor_on) {
|
||||
dev->advance_head_pos_by_session(ScanHeadId::SECONDARY);
|
||||
switch (reg->state.motor_mode) {
|
||||
case MotorMode::PRIMARY: {
|
||||
if (reg->state.is_motor_on) {
|
||||
dev->advance_head_pos_by_session(ScanHeadId::PRIMARY);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MotorMode::PRIMARY_AND_SECONDARY: {
|
||||
if (reg->state.is_motor_on) {
|
||||
dev->advance_head_pos_by_session(ScanHeadId::PRIMARY);
|
||||
}
|
||||
// BUG: we should advance secondary head only if motor was on
|
||||
dev->advance_head_pos_by_session(ScanHeadId::SECONDARY);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#ifndef BACKEND_GENESYS_REGISTER_H
|
||||
#define BACKEND_GENESYS_REGISTER_H
|
||||
|
||||
#include "enums.h"
|
||||
#include "utilities.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
@ -76,7 +77,7 @@ struct GenesysRegisterSetState
|
|||
bool is_lamp_on = false;
|
||||
bool is_xpa_on = false;
|
||||
bool is_motor_on = false;
|
||||
bool is_xpa_motor_on = false;
|
||||
MotorMode motor_mode = MotorMode::PRIMARY;
|
||||
};
|
||||
|
||||
template<class Value>
|
||||
|
|
Ładowanie…
Reference in New Issue