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;
|
virtual void set_xpa_lamp_power(Genesys_Device& dev, bool set) const = 0;
|
||||||
|
|
||||||
/// enables or disables XPA slider motor
|
/// enables or disables XPA slider motor
|
||||||
virtual void set_xpa_motor_power(Genesys_Device& dev, Genesys_Register_Set& regs,
|
virtual void set_motor_mode(Genesys_Device& dev, Genesys_Register_Set& regs,
|
||||||
bool set) const = 0;
|
MotorMode mode) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace genesys
|
} // 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,
|
void CommandSetCommon::set_motor_mode(Genesys_Device& dev, Genesys_Register_Set& regs,
|
||||||
bool set) const
|
MotorMode mode) const
|
||||||
{
|
{
|
||||||
DBG_HELPER(dbg);
|
DBG_HELPER(dbg);
|
||||||
|
|
||||||
struct MotorSettings {
|
struct MotorSettings {
|
||||||
ModelId model_id;
|
ModelId model_id;
|
||||||
ResolutionFilter resolutions;
|
ResolutionFilter resolutions;
|
||||||
GenesysRegisterSettingSet regs_on;
|
GenesysRegisterSettingSet regs_primary_and_secondary;
|
||||||
GenesysRegisterSettingSet regs_off;
|
GenesysRegisterSettingSet regs_primary;
|
||||||
};
|
};
|
||||||
|
|
||||||
MotorSettings settings[] = {
|
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 &&
|
if (setting.model_id == dev.model->model_id &&
|
||||||
setting.resolutions.matches(dev.session.output_resolution))
|
setting.resolutions.matches(dev.session.output_resolution))
|
||||||
{
|
{
|
||||||
apply_reg_settings_to_device(dev, set ? setting.regs_on : setting.regs_off);
|
switch (mode) {
|
||||||
regs.state.is_xpa_motor_on = set;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,8 +37,8 @@ public:
|
||||||
|
|
||||||
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_xpa_motor_power(Genesys_Device& dev, Genesys_Register_Set& regs,
|
void set_motor_mode(Genesys_Device& dev, Genesys_Register_Set& regs,
|
||||||
bool set) const override;
|
MotorMode mode) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace genesys
|
} // namespace genesys
|
||||||
|
|
|
@ -524,6 +524,11 @@ enum class Direction : unsigned
|
||||||
BACKWARD = 1
|
BACKWARD = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class MotorMode : unsigned
|
||||||
|
{
|
||||||
|
PRIMARY = 0,
|
||||||
|
PRIMARY_AND_SECONDARY,
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace genesys
|
} // namespace genesys
|
||||||
|
|
||||||
|
|
|
@ -964,14 +964,14 @@ void scanner_move(Genesys_Device& dev, ScanMethod scan_method, unsigned steps, D
|
||||||
|
|
||||||
dev.interface->write_registers(local_reg);
|
dev.interface->write_registers(local_reg);
|
||||||
if (uses_secondary_head) {
|
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 {
|
try {
|
||||||
scanner_start_action(dev, true);
|
scanner_start_action(dev, true);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
catch_all_exceptions(__func__, [&]() {
|
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); });
|
catch_all_exceptions(__func__, [&]() { scanner_stop_action(dev); });
|
||||||
// restore original registers
|
// restore original registers
|
||||||
|
@ -992,7 +992,7 @@ void scanner_move(Genesys_Device& dev, ScanMethod scan_method, unsigned steps, D
|
||||||
scanner_stop_action(dev);
|
scanner_stop_action(dev);
|
||||||
}
|
}
|
||||||
if (uses_secondary_head) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1015,7 +1015,7 @@ void scanner_move(Genesys_Device& dev, ScanMethod scan_method, unsigned steps, D
|
||||||
scanner_stop_action(dev);
|
scanner_stop_action(dev);
|
||||||
}
|
}
|
||||||
if (uses_secondary_head) {
|
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);
|
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);
|
scanner_clear_scan_and_feed_counts(dev);
|
||||||
|
|
||||||
dev.interface->write_registers(local_reg);
|
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 {
|
try {
|
||||||
scanner_start_action(dev, true);
|
scanner_start_action(dev, true);
|
||||||
|
@ -1250,7 +1250,7 @@ void scanner_move_back_home_ta(Genesys_Device& dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
scanner_stop_action(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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1272,7 +1272,7 @@ void scanner_move_back_home_ta(Genesys_Device& dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
scanner_stop_action(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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1396,7 +1396,7 @@ void CommandSetGl843::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sens
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reg->state.is_xpa_on) {
|
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
|
// 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);
|
dev->cmd_set->set_xpa_lamp_power(*dev, true);
|
||||||
}
|
}
|
||||||
if (reg->state.is_xpa_on) {
|
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;
|
break;
|
||||||
case GpioId::PLUSTEK_OPTICFILM_7200I:
|
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);
|
scanner_start_action(*dev, start_motor);
|
||||||
|
|
||||||
if (reg->state.is_motor_on) {
|
switch (reg->state.motor_mode) {
|
||||||
dev->advance_head_pos_by_session(ScanHeadId::PRIMARY);
|
case MotorMode::PRIMARY: {
|
||||||
}
|
if (reg->state.is_motor_on) {
|
||||||
if (reg->state.is_xpa_motor_on) {
|
dev->advance_head_pos_by_session(ScanHeadId::PRIMARY);
|
||||||
dev->advance_head_pos_by_session(ScanHeadId::SECONDARY);
|
}
|
||||||
|
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
|
#ifndef BACKEND_GENESYS_REGISTER_H
|
||||||
#define BACKEND_GENESYS_REGISTER_H
|
#define BACKEND_GENESYS_REGISTER_H
|
||||||
|
|
||||||
|
#include "enums.h"
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -76,7 +77,7 @@ struct GenesysRegisterSetState
|
||||||
bool is_lamp_on = false;
|
bool is_lamp_on = false;
|
||||||
bool is_xpa_on = false;
|
bool is_xpa_on = false;
|
||||||
bool is_motor_on = false;
|
bool is_motor_on = false;
|
||||||
bool is_xpa_motor_on = false;
|
MotorMode motor_mode = MotorMode::PRIMARY;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class Value>
|
template<class Value>
|
||||||
|
|
Ładowanie…
Reference in New Issue