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

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

Wyświetl plik

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

Wyświetl plik

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

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

Wyświetl plik

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

Wyświetl plik

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