From b58192493e33a54ae53a209f8a8d181795e17b44 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Mon, 16 Sep 2019 09:50:11 +0300 Subject: [PATCH 1/2] genesys: Properly use 16-bit data when calibrating --- backend/genesys.cc | 20 +++++++++----------- backend/genesys_low.cc | 2 +- backend/genesys_low.h | 2 +- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/backend/genesys.cc b/backend/genesys.cc index ba334c359..bf8cf90fd 100644 --- a/backend/genesys.cc +++ b/backend/genesys.cc @@ -1560,7 +1560,7 @@ static void genesys_coarse_calibration(Genesys_Device* dev, Genesys_Sensor& sens average_data and calibration_data are little endian 16 bit words. */ static void genesys_average_data(uint16_t* average_data, - uint8_t * calibration_data, + const std::uint16_t* calibration_data, uint32_t lines, uint32_t pixel_components_per_line) { @@ -1571,11 +1571,8 @@ static void genesys_average_data(uint16_t* average_data, { sum = 0; for (y = 0; y < lines; y++) - { - sum += calibration_data[(x + y * pixel_components_per_line) * 2]; - sum += - calibration_data[(x + y * pixel_components_per_line) * 2 + - 1] * 256; + { + sum += calibration_data[(x + y * pixel_components_per_line)]; } sum /= lines; *average_data++ = sum; @@ -1625,7 +1622,7 @@ static void genesys_shading_calibration_impl(Genesys_Device* dev, const Genesys_ size = channels * 2 * pixels_per_line * (dev->calib_lines + 1); } - std::vector calibration_data(size); + std::vector calibration_data(size / 2); motor=SANE_TRUE; if (dev->model->flags & GENESYS_FLAG_SHADING_NO_MOVE) @@ -1656,7 +1653,8 @@ static void genesys_shading_calibration_impl(Genesys_Device* dev, const Genesys_ dev->cmd_set->begin_scan(dev, sensor, &dev->calib_reg, is_dark ? SANE_FALSE : SANE_TRUE); - sanei_genesys_read_data_from_scanner(dev, calibration_data.data(), size); + sanei_genesys_read_data_from_scanner(dev, reinterpret_cast(calibration_data.data()), + size); dev->cmd_set->end_scan(dev, &dev->calib_reg, SANE_TRUE); @@ -1667,9 +1665,9 @@ static void genesys_shading_calibration_impl(Genesys_Device* dev, const Genesys_ calibration_data.data(), dev->calib_lines, pixels_per_line * channels); if (DBG_LEVEL >= DBG_data) { - sanei_genesys_write_pnm_file((log_filename_prefix + "_shading.pnm").c_str(), - calibration_data.data(), 16, - channels, pixels_per_line, dev->calib_lines); + sanei_genesys_write_pnm_file16((log_filename_prefix + "_shading.pnm").c_str(), + calibration_data.data(), + channels, pixels_per_line, dev->calib_lines); sanei_genesys_write_pnm_file16((log_filename_prefix + "_average.pnm").c_str(), out_average_data.data(), channels, out_pixels_per_line, 1); diff --git a/backend/genesys_low.cc b/backend/genesys_low.cc index 26aa0c998..ea0c2d1a5 100644 --- a/backend/genesys_low.cc +++ b/backend/genesys_low.cc @@ -159,7 +159,7 @@ void sanei_genesys_write_pnm_file(const char* filename, uint8_t* data, int depth fclose (out); } -void sanei_genesys_write_pnm_file16(const char* filename, uint16_t* data, unsigned channels, +void sanei_genesys_write_pnm_file16(const char* filename, const uint16_t* data, unsigned channels, unsigned pixels_per_line, unsigned lines) { DBG_HELPER_ARGS(dbg, "channels=%d, ppl=%d, lines=%d", channels, diff --git a/backend/genesys_low.h b/backend/genesys_low.h index 539a2855f..bba03ee0c 100644 --- a/backend/genesys_low.h +++ b/backend/genesys_low.h @@ -531,7 +531,7 @@ extern void sanei_genesys_write_file(const char* filename, uint8_t* data, size_t extern void sanei_genesys_write_pnm_file(const char* filename, uint8_t* data, int depth, int channels, int pixels_per_line, int lines); -extern void sanei_genesys_write_pnm_file16(const char* filename, uint16_t* data, unsigned channels, +extern void sanei_genesys_write_pnm_file16(const char* filename, const uint16_t *data, unsigned channels, unsigned pixels_per_line, unsigned lines); extern void sanei_genesys_test_buffer_empty(Genesys_Device* dev, SANE_Bool* empty); From 11c80b129ee92b2d80dab4e895cc4e9463075b8c Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Mon, 16 Sep 2019 09:50:12 +0300 Subject: [PATCH 2/2] genesys: Extract wait_until_has_valid_words() --- backend/genesys_low.cc | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/backend/genesys_low.cc b/backend/genesys_low.cc index ea0c2d1a5..f640dafe4 100644 --- a/backend/genesys_low.cc +++ b/backend/genesys_low.cc @@ -765,35 +765,36 @@ void sanei_genesys_test_buffer_empty(Genesys_Device* dev, SANE_Bool* empty) DBG(DBG_io, "%s: buffer is filled\n", __func__); } +void wait_until_has_valid_words(Genesys_Device* dev) +{ + unsigned words = 0; + unsigned sleep_time_ms = 10; + + for (unsigned wait_ms = 0; wait_ms < 50000; wait_ms += sleep_time_ms) { + sanei_genesys_read_valid_words(dev, &words); + if (words != 0) + break; + sanei_genesys_sleep_ms(sleep_time_ms); + } + + if (words == 0) { + throw SaneException(SANE_STATUS_IO_ERROR, "timeout, buffer does not get filled"); + } +} // Read data (e.g scanned image) from scan buffer void sanei_genesys_read_data_from_scanner(Genesys_Device* dev, uint8_t* data, size_t size) { DBG_HELPER_ARGS(dbg, "size = %lu bytes", (u_long) size); - int time_count = 0; - unsigned int words = 0; if (size & 1) DBG(DBG_info, "WARNING %s: odd number of bytes\n", __func__); - // wait until buffer not empty for up to 5 seconds - do { - sanei_genesys_read_valid_words (dev, &words); - if (words == 0) - { - sanei_genesys_sleep_ms(10); - time_count++; - } - } - while ((time_count < 2500*2) && (words == 0)); - - if (words == 0) /* timeout, buffer does not get filled */ - { - throw SaneException(SANE_STATUS_IO_ERROR, "timeout, buffer does not get filled"); - } + wait_until_has_valid_words(dev); dev->cmd_set->bulk_read_data(dev, 0x45, data, size); } + void sanei_genesys_read_feed_steps(Genesys_Device* dev, unsigned int* steps) { DBG_HELPER(dbg);