genesys: Reduce duplication of waiting for non-empty buffer state

merge-requests/206/head
Povilas Kanapickas 2019-10-01 08:18:46 +03:00
rodzic bf9d69d20d
commit 26e418537f
9 zmienionych plików z 47 dodań i 107 usunięć

Wyświetl plik

@ -3073,7 +3073,7 @@ static void genesys_warmup_lamp(Genesys_Device* dev)
double first_average = 0;
double second_average = 0;
int difference = 255;
int empty, lines = 3;
int lines = 3;
const auto& sensor = sanei_genesys_find_sensor_any(dev);
@ -3085,12 +3085,8 @@ static void genesys_warmup_lamp(Genesys_Device* dev)
{
DBG(DBG_info, "%s: one more loop\n", __func__);
dev->cmd_set->begin_scan(dev, sensor, &dev->reg, false);
bool empty = false;
do
{
sanei_genesys_test_buffer_empty(dev, &empty);
}
while (empty);
wait_until_buffer_non_empty(dev);
try {
sanei_genesys_read_data_from_scanner(dev, first_line.data(), total_size);
@ -3105,12 +3101,9 @@ static void genesys_warmup_lamp(Genesys_Device* dev)
seconds++;
dev->cmd_set->begin_scan(dev, sensor, &dev->reg, false);
do
{
sanei_genesys_test_buffer_empty(dev, &empty);
sanei_genesys_sleep_ms(100);
}
while (empty);
wait_until_buffer_non_empty(dev);
sanei_genesys_read_data_from_scanner(dev, second_line.data(), total_size);
dev->cmd_set->end_scan(dev, &dev->reg, true);
@ -3311,11 +3304,8 @@ static void genesys_start_scan(Genesys_Device* dev, bool lamp_off)
sanei_genesys_read_feed_steps (dev, &steps);
}
while (steps < expected);
// wait for buffers to be filled
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
/* when doing one or two-table movement, let the motor settle to scanning speed */
/* and scanning start before reading data */

Wyświetl plik

@ -1556,11 +1556,7 @@ void CommandSetGl124::search_start_position(Genesys_Device* dev) const
begin_scan(dev, sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
sanei_genesys_read_data_from_scanner(dev, data.data(), size);

Wyświetl plik

@ -3121,9 +3121,7 @@ static void simple_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
{
DBG_HELPER_ARGS(dbg, "move=%d, forward=%d, shading=%d", move, forward, shading);
unsigned int size, lines, x, y, bpp;
bool empty, split;
int count;
uint8_t val;
bool split;
/* round up to multiple of 3 in case of CIS scanner */
if (dev->model->is_cis) {
@ -3198,24 +3196,7 @@ static void simple_scan(Genesys_Device* dev, const Genesys_Sensor& sensor,
// starts scan
dev->cmd_set->begin_scan(dev, sensor, &dev->reg, move);
/* wait for buffers to be filled */
count = 0;
do
{
sanei_genesys_sleep_ms(10);
sanei_genesys_get_status(dev, &val);
if (DBG_LEVEL > DBG_info)
{
print_status (val);
}
sanei_genesys_test_buffer_empty(dev, &empty);
count++;
}
while (empty && count < 1000);
if (count == 1000) {
throw SaneException(SANE_STATUS_IO_ERROR, "failed to read data");
}
wait_until_buffer_non_empty(dev, true);
// now we're on target, we can read data
sanei_genesys_read_data_from_scanner(dev, data.data(), size);

Wyświetl plik

@ -2615,11 +2615,7 @@ void CommandSetGl841::search_start_position(Genesys_Device* dev) const
dev->cmd_set->begin_scan(dev, sensor, &local_reg, true);
// waits for valid data
bool empty;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
sanei_genesys_read_data_from_scanner(dev, data.data(), size);
@ -4064,10 +4060,7 @@ void CommandSetGl841::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
dev->cmd_set->begin_scan(dev, sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
sanei_genesys_read_data_from_scanner(dev, data.data(), size);
@ -4092,10 +4085,7 @@ void CommandSetGl841::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
dev->cmd_set->begin_scan(dev, sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
sanei_genesys_read_data_from_scanner(dev, data.data(), size);

Wyświetl plik

@ -2071,11 +2071,7 @@ void CommandSetGl843::search_start_position(Genesys_Device* dev) const
dev->cmd_set->begin_scan(dev, sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
Image image = read_unshuffled_image_from_scanner(dev, session, session.output_total_bytes_raw);
@ -3267,11 +3263,7 @@ void CommandSetGl843::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
dev->cmd_set->begin_scan(dev, calib_sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
auto data = read_unshuffled_image_from_scanner(dev, session,
@ -3297,11 +3289,7 @@ void CommandSetGl843::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
// now start scan
dev->cmd_set->begin_scan(dev, calib_sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
data = read_unshuffled_image_from_scanner(dev, session, session.output_total_bytes_raw);

Wyświetl plik

@ -1238,11 +1238,7 @@ void CommandSetGl846::search_start_position(Genesys_Device* dev) const
begin_scan(dev, sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
sanei_genesys_read_data_from_scanner(dev, data.data(), size);
@ -2003,11 +1999,7 @@ void CommandSetGl846::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
begin_scan(dev, sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
sanei_genesys_read_data_from_scanner(dev, data.data(), size);
@ -2031,11 +2023,7 @@ void CommandSetGl846::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
// now start scan
begin_scan(dev, sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
sanei_genesys_read_data_from_scanner(dev, data.data(), size);

Wyświetl plik

@ -1280,11 +1280,7 @@ void CommandSetGl847::search_start_position(Genesys_Device* dev) const
begin_scan(dev, sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
sanei_genesys_read_data_from_scanner(dev, data.data(), size);
@ -2079,11 +2075,7 @@ void CommandSetGl847::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
begin_scan(dev, sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
sanei_genesys_read_data_from_scanner(dev, data.data(), size);
@ -2107,11 +2099,7 @@ void CommandSetGl847::search_strip(Genesys_Device* dev, const Genesys_Sensor& se
// now start scan
begin_scan(dev, sensor, &local_reg, true);
// waits for valid data
bool empty = false;
do {
sanei_genesys_test_buffer_empty(dev, &empty);
} while (empty);
wait_until_buffer_non_empty(dev);
// now we're on target, we can read data
sanei_genesys_read_data_from_scanner(dev, data.data(), size);

Wyświetl plik

@ -770,7 +770,7 @@ void sanei_genesys_read_scancnt(Genesys_Device* dev, unsigned int* words)
* @param *empty return value
* @return empty will be set to true if there is no scanned data.
**/
void sanei_genesys_test_buffer_empty(Genesys_Device* dev, bool* empty)
bool sanei_genesys_is_buffer_empty(Genesys_Device* dev)
{
DBG_HELPER(dbg);
uint8_t val = 0;
@ -784,13 +784,32 @@ void sanei_genesys_test_buffer_empty(Genesys_Device* dev, bool* empty)
*/
sanei_genesys_sleep_ms(1);
DBG(DBG_io2, "%s: buffer is empty\n", __func__);
*empty = true;
return;
return true;
}
*empty = false;
DBG(DBG_io, "%s: buffer is filled\n", __func__);
return false;
}
void wait_until_buffer_non_empty(Genesys_Device* dev, bool check_status_twice)
{
// FIXME: reduce MAX_RETRIES once tests are updated
const unsigned MAX_RETRIES = 100000;
for (unsigned i = 0; i < MAX_RETRIES; ++i) {
if (check_status_twice) {
// FIXME: this only to preserve previous behavior, can be removed
std::uint8_t val = 0;
sanei_genesys_get_status(dev, &val);
}
bool empty = sanei_genesys_is_buffer_empty(dev);
sanei_genesys_sleep_ms(10);
if (!empty)
return;
}
throw SaneException(SANE_STATUS_IO_ERROR, "failed to read data");
}
void wait_until_has_valid_words(Genesys_Device* dev)

Wyświetl plik

@ -418,7 +418,7 @@ void sanei_genesys_write_pnm_file(const char* filename, const Image& image);
extern void sanei_genesys_write_pnm_file16(const char* filename, const uint16_t *data, unsigned channels,
unsigned pixels_per_line, unsigned lines);
void sanei_genesys_test_buffer_empty(Genesys_Device* dev, bool* empty);
void wait_until_buffer_non_empty(Genesys_Device* dev, bool check_status_twice = false);
extern void sanei_genesys_read_data_from_scanner(Genesys_Device* dev, uint8_t* data, size_t size);