genesys: Make XPA motor mode handling more generic

merge-requests/317/merge
Povilas Kanapickas 2020-01-12 10:57:10 +02:00
rodzic 23f3f80e38
commit e8e56e33d3
7 zmienionych plików z 50 dodań i 25 usunięć

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -524,6 +524,11 @@ enum class Direction : unsigned
BACKWARD = 1
};
enum class MotorMode : unsigned
{
PRIMARY = 0,
PRIMARY_AND_SECONDARY,
};
} // namespace genesys

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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