diff --git a/backend/genesys/genesys.cpp b/backend/genesys/genesys.cpp index b905e214f..174e5e36e 100644 --- a/backend/genesys/genesys.cpp +++ b/backend/genesys/genesys.cpp @@ -63,6 +63,7 @@ #include "genesys.h" #include "conv.h" #include "gl124_registers.h" +#include "gl841_registers.h" #include "gl843_registers.h" #include "gl846_registers.h" #include "gl847_registers.h" @@ -948,6 +949,48 @@ void scanner_clear_scan_and_feed_counts2(Genesys_Device& dev) } } +bool scanner_is_motor_stopped(Genesys_Device& dev) +{ + switch (dev.model->asic_type) { + case AsicType::GL841: { + auto reg = dev.interface->read_register(gl841::REG_0x40); + + return (!(reg & gl841::REG_0x40_DATAENB) && !(reg & gl841::REG_0x40_MOTMFLG)); + } + case AsicType::GL843: { + auto status = scanner_read_status(dev); + auto reg = dev.interface->read_register(gl843::REG_0x40); + + return (!(reg & gl843::REG_0x40_DATAENB) && !(reg & gl843::REG_0x40_MOTMFLG) && + !status.is_motor_enabled); + } + case AsicType::GL845: + case AsicType::GL846: { + auto status = scanner_read_status(dev); + auto reg = dev.interface->read_register(gl846::REG_0x40); + + return (!(reg & gl846::REG_0x40_DATAENB) && !(reg & gl846::REG_0x40_MOTMFLG) && + !status.is_motor_enabled); + } + case AsicType::GL847: { + auto status = scanner_read_status(dev); + auto reg = dev.interface->read_register(gl847::REG_0x40); + + return (!(reg & gl847::REG_0x40_DATAENB) && !(reg & gl847::REG_0x40_MOTMFLG) && + !status.is_motor_enabled); + } + case AsicType::GL124: { + auto status = scanner_read_status(dev); + auto reg = dev.interface->read_register(gl124::REG_0x100); + + return (!(reg & gl124::REG_0x100_DATAENB) && !(reg & gl124::REG_0x100_MOTMFLG) && + !status.is_motor_enabled); + } + default: + throw SaneException("Unsupported asic type"); + } +} + void scanner_stop_action(Genesys_Device& dev) { switch (dev.model->asic_type) { diff --git a/backend/genesys/gl124.cpp b/backend/genesys/gl124.cpp index e356bf307..2096cca06 100644 --- a/backend/genesys/gl124.cpp +++ b/backend/genesys/gl124.cpp @@ -1002,18 +1002,12 @@ void CommandSetGl124::set_powersaving(Genesys_Device* dev, int delay /* in minut void gl124_stop_action(Genesys_Device* dev) { DBG_HELPER(dbg); - std::uint8_t val40; unsigned int loop; dev->cmd_set->update_home_sensor_gpio(*dev); - auto status = scanner_read_status(*dev); - - val40 = dev->interface->read_register(REG_0x100); - - /* only stop action if needed */ - if (!(val40 & REG_0x100_DATAENB) && !(val40 & REG_0x100_MOTMFLG) && !status.is_motor_enabled) { - DBG (DBG_info, "%s: already stopped\n", __func__); - return; + if (scanner_is_motor_stopped(*dev)) { + DBG(DBG_info, "%s: already stopped\n", __func__); + return; } scanner_stop_action_no_move(*dev, dev->reg); @@ -1025,13 +1019,7 @@ void gl124_stop_action(Genesys_Device* dev) loop = 10; while (loop > 0) { - auto status = scanner_read_status(*dev); - val40 = dev->interface->read_register(REG_0x100); - - /* if scanner is in command mode, we are done */ - if (!(val40 & REG_0x100_DATAENB) && !(val40 & REG_0x100_MOTMFLG) && - !status.is_motor_enabled) - { + if (scanner_is_motor_stopped(*dev)) { return; } diff --git a/backend/genesys/gl841.cpp b/backend/genesys/gl841.cpp index d1b1a6c03..2dd0373c0 100644 --- a/backend/genesys/gl841.cpp +++ b/backend/genesys/gl841.cpp @@ -1860,12 +1860,9 @@ static void gl841_stop_action(Genesys_Device* dev) scanner_read_print_status(*dev); - uint8_t val40 = dev->interface->read_register(0x40); - - /* only stop action if needed */ - if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG)) { - DBG(DBG_info, "%s: already stopped\n", __func__); - return; + if (scanner_is_motor_stopped(*dev)) { + DBG(DBG_info, "%s: already stopped\n", __func__); + return; } local_reg = dev->reg; @@ -1885,12 +1882,9 @@ static void gl841_stop_action(Genesys_Device* dev) loop = 10; while (loop > 0) { - val40 = dev->interface->read_register(0x40); - - /* if scanner is in command mode, we are done */ - if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG)) { - return; - } + if (scanner_is_motor_stopped(*dev)) { + return; + } dev->interface->sleep_ms(100); loop--; diff --git a/backend/genesys/gl841_registers.h b/backend/genesys/gl841_registers.h index e8f8a14fa..8e0c20414 100644 --- a/backend/genesys/gl841_registers.h +++ b/backend/genesys/gl841_registers.h @@ -188,6 +188,7 @@ static constexpr RegAddr REG_ENDPIXEL = 0x32; static constexpr RegAddr REG_MAXWD = 0x35; static constexpr RegAddr REG_LPERIOD = 0x38; +static constexpr RegAddr REG_0x40 = 0x40; static constexpr RegMask REG_0x40_HISPDFLG = 0x04; static constexpr RegMask REG_0x40_MOTMFLG = 0x02; static constexpr RegMask REG_0x40_DATAENB = 0x01; diff --git a/backend/genesys/gl843.cpp b/backend/genesys/gl843.cpp index 82d52ec86..d21a2fcab 100644 --- a/backend/genesys/gl843.cpp +++ b/backend/genesys/gl843.cpp @@ -1320,15 +1320,9 @@ void gl843_stop_action(Genesys_Device* dev) DBG_HELPER(dbg); unsigned int loop; - auto status = scanner_read_status(*dev); - - uint8_t val40 = dev->interface->read_register(REG_0x40); - - /* only stop action if needed */ - if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG) && !status.is_motor_enabled) - { - DBG(DBG_info, "%s: already stopped\n", __func__); - return; + if (scanner_is_motor_stopped(*dev)) { + DBG(DBG_info, "%s: already stopped\n", __func__); + return; } scanner_stop_action_no_move(*dev, dev->reg); @@ -1339,13 +1333,7 @@ void gl843_stop_action(Genesys_Device* dev) loop = 10; while (loop > 0) { - auto status = scanner_read_status(*dev); - val40 = dev->interface->read_register(0x40); - - /* if scanner is in command mode, we are done */ - if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG) - && !status.is_motor_enabled) - { + if (scanner_is_motor_stopped(*dev)) { return; } diff --git a/backend/genesys/gl846.cpp b/backend/genesys/gl846.cpp index b8ff20756..128ef371c 100644 --- a/backend/genesys/gl846.cpp +++ b/backend/genesys/gl846.cpp @@ -846,16 +846,10 @@ void gl846_stop_action(Genesys_Device* dev) unsigned int loop; dev->cmd_set->update_home_sensor_gpio(*dev); - auto status = scanner_read_status(*dev); - - uint8_t val40 = dev->interface->read_register(REG_0x40); - - /* only stop action if needed */ - if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG) && !status.is_motor_enabled) { - DBG(DBG_info, "%s: already stopped\n", __func__); - return; + if (scanner_is_motor_stopped(*dev)) { + DBG(DBG_info, "%s: already stopped\n", __func__); + return; } - scanner_stop_action_no_move(*dev, dev->reg); if (is_testing_mode()) { @@ -864,13 +858,7 @@ void gl846_stop_action(Genesys_Device* dev) loop = 10; while (loop > 0) { - auto status = scanner_read_status(*dev); - val40 = dev->interface->read_register(REG_0x40); - - /* if scanner is in command mode, we are done */ - if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG) && - !status.is_motor_enabled) - { + if (scanner_is_motor_stopped(*dev)) { return; } diff --git a/backend/genesys/gl847.cpp b/backend/genesys/gl847.cpp index 653392676..a129f36ed 100644 --- a/backend/genesys/gl847.cpp +++ b/backend/genesys/gl847.cpp @@ -850,14 +850,9 @@ void gl847_stop_action(Genesys_Device* dev) unsigned int loop; dev->cmd_set->update_home_sensor_gpio(*dev); - auto status = scanner_read_status(*dev); - - uint8_t val40 = dev->interface->read_register(REG_0x40); - - /* only stop action if needed */ - if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG) && !status.is_motor_enabled) { - DBG(DBG_info, "%s: already stopped\n", __func__); - return; + if (scanner_is_motor_stopped(*dev)) { + DBG(DBG_info, "%s: already stopped\n", __func__); + return; } scanner_stop_action_no_move(*dev, dev->reg); @@ -869,14 +864,8 @@ void gl847_stop_action(Genesys_Device* dev) loop = 10; while (loop > 0) { - auto status = scanner_read_status(*dev); - val40 = dev->interface->read_register(REG_0x40); - - /* if scanner is in command mode, we are done */ - if (!(val40 & REG_0x40_DATAENB) && !(val40 & REG_0x40_MOTMFLG) && - !status.is_motor_enabled) - { - return; + if (scanner_is_motor_stopped(*dev)) { + return; } dev->interface->sleep_ms(100); diff --git a/backend/genesys/low.h b/backend/genesys/low.h index e8777760c..fbd1fd070 100644 --- a/backend/genesys/low.h +++ b/backend/genesys/low.h @@ -413,6 +413,8 @@ void scanner_start_action(Genesys_Device& dev, bool start_motor); void scanner_stop_action(Genesys_Device& dev); void scanner_stop_action_no_move(Genesys_Device& dev, Genesys_Register_Set& regs); +bool scanner_is_motor_stopped(Genesys_Device& dev); + const Motor_Profile& sanei_genesys_get_motor_profile(const std::vector& motors, MotorId motor_id, int exposure);