kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Add tests for serialization of calibration data
rodzic
25ed10029c
commit
a8a5f58f21
|
@ -461,6 +461,11 @@ struct GenesysRegisterSetting {
|
|||
uint16_t address = 0;
|
||||
uint8_t value = 0;
|
||||
uint8_t mask = 0xff;
|
||||
|
||||
bool operator==(const GenesysRegisterSetting& other) const
|
||||
{
|
||||
return address == other.address && value == other.value && mask == other.mask;
|
||||
}
|
||||
};
|
||||
|
||||
template<class Stream>
|
||||
|
@ -524,6 +529,11 @@ public:
|
|||
friend void serialize(std::istream& str, GenesysRegisterSettingSet& reg);
|
||||
friend void serialize(std::ostream& str, GenesysRegisterSettingSet& reg);
|
||||
|
||||
bool operator==(const GenesysRegisterSettingSet& other) const
|
||||
{
|
||||
return regs_ == other.regs_;
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<GenesysRegisterSetting> regs_;
|
||||
};
|
||||
|
@ -545,6 +555,11 @@ struct GenesysFrontendLayout
|
|||
{
|
||||
std::array<uint16_t, 3> offset_addr = {};
|
||||
std::array<uint16_t, 3> gain_addr = {};
|
||||
|
||||
bool operator==(const GenesysFrontendLayout& other) const
|
||||
{
|
||||
return offset_addr == other.offset_addr && gain_addr == other.gain_addr;
|
||||
}
|
||||
};
|
||||
|
||||
/** @brief Data structure to set up analog frontend.
|
||||
|
@ -586,6 +601,14 @@ struct Genesys_Frontend
|
|||
{
|
||||
return regs.get_value(layout.gain_addr[which]);
|
||||
}
|
||||
|
||||
bool operator==(const Genesys_Frontend& other) const
|
||||
{
|
||||
return fe_id == other.fe_id &&
|
||||
regs == other.regs &&
|
||||
reg2 == other.reg2 &&
|
||||
layout == other.layout;
|
||||
}
|
||||
};
|
||||
|
||||
template<class Stream>
|
||||
|
@ -658,6 +681,29 @@ struct Genesys_Sensor {
|
|||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool operator==(const Genesys_Sensor& other) const
|
||||
{
|
||||
return sensor_id == other.sensor_id &&
|
||||
optical_res == other.optical_res &&
|
||||
min_resolution == other.min_resolution &&
|
||||
max_resolution == other.max_resolution &&
|
||||
method == other.method &&
|
||||
ccd_size_divisor == other.ccd_size_divisor &&
|
||||
black_pixels == other.black_pixels &&
|
||||
dummy_pixel == other.dummy_pixel &&
|
||||
CCD_start_xoffset == other.CCD_start_xoffset &&
|
||||
sensor_pixels == other.sensor_pixels &&
|
||||
fau_gain_white_ref == other.fau_gain_white_ref &&
|
||||
gain_white_ref == other.gain_white_ref &&
|
||||
exposure.blue == other.exposure.blue &&
|
||||
exposure.green == other.exposure.green &&
|
||||
exposure.red == other.exposure.red &&
|
||||
exposure_lperiod == other.exposure_lperiod &&
|
||||
custom_regs == other.custom_regs &&
|
||||
custom_fe_regs == other.custom_fe_regs &&
|
||||
gamma == other.gamma;
|
||||
}
|
||||
};
|
||||
|
||||
template<class Stream>
|
||||
|
@ -1245,6 +1291,22 @@ struct SetupParams {
|
|||
throw std::runtime_error("SetupParams are not valid");
|
||||
}
|
||||
}
|
||||
|
||||
bool operator==(const SetupParams& other) const
|
||||
{
|
||||
return xres == other.xres &&
|
||||
yres == other.yres &&
|
||||
startx == other.startx &&
|
||||
starty == other.starty &&
|
||||
pixels == other.pixels &&
|
||||
lines == other.lines &&
|
||||
depth == other.depth &&
|
||||
channels == other.channels &&
|
||||
scan_method == other.scan_method &&
|
||||
scan_mode == other.scan_mode &&
|
||||
color_filter == other.color_filter &&
|
||||
flags == other.flags;
|
||||
}
|
||||
};
|
||||
|
||||
template<class Stream>
|
||||
|
@ -1289,6 +1351,21 @@ struct Genesys_Current_Setup
|
|||
SANE_Int stagger = 0;
|
||||
// max shift of any ccd component, including staggered pixels
|
||||
SANE_Int max_shift = 0;
|
||||
|
||||
bool operator==(const Genesys_Current_Setup& other) const
|
||||
{
|
||||
return params == other.params &&
|
||||
pixels == other.pixels &&
|
||||
lines == other.lines &&
|
||||
depth == other.depth &&
|
||||
channels == other.channels &&
|
||||
exposure_time == other.exposure_time &&
|
||||
xres == other.xres &&
|
||||
yres == other.yres &&
|
||||
ccd_size_divisor == other.ccd_size_divisor &&
|
||||
stagger == other.stagger &&
|
||||
max_shift == other.max_shift;
|
||||
}
|
||||
};
|
||||
|
||||
template<class Stream>
|
||||
|
@ -1355,6 +1432,19 @@ struct Genesys_Calibration_Cache
|
|||
size_t average_size = 0;
|
||||
std::vector<uint8_t> white_average_data;
|
||||
std::vector<uint8_t> dark_average_data;
|
||||
|
||||
bool operator==(const Genesys_Calibration_Cache& other) const
|
||||
{
|
||||
return used_setup == other.used_setup &&
|
||||
last_calibration == other.last_calibration &&
|
||||
frontend == other.frontend &&
|
||||
sensor == other.sensor &&
|
||||
calib_pixels == other.calib_pixels &&
|
||||
calib_channels == other.calib_channels &&
|
||||
average_size == other.average_size &&
|
||||
white_average_data == other.white_average_data &&
|
||||
dark_average_data == other.dark_average_data;
|
||||
}
|
||||
};
|
||||
|
||||
template<class Stream>
|
||||
|
|
|
@ -785,7 +785,10 @@ AC_SUBST(AM_LDFLAGS)
|
|||
|
||||
AC_CONFIG_FILES([Makefile lib/Makefile sanei/Makefile frontend/Makefile \
|
||||
japi/Makefile backend/Makefile include/Makefile doc/Makefile \
|
||||
po/Makefile.in testsuite/Makefile testsuite/sanei/Makefile testsuite/tools/Makefile \
|
||||
po/Makefile.in testsuite/Makefile \
|
||||
testsuite/backend/Makefile \
|
||||
testsuite/backend/genesys/Makefile \
|
||||
testsuite/sanei/Makefile testsuite/tools/Makefile \
|
||||
tools/Makefile doc/doxygen-sanei.conf doc/doxygen-genesys.conf])
|
||||
AC_CONFIG_FILES([tools/sane-config], [chmod a+x tools/sane-config])
|
||||
AC_CONFIG_FILES([tools/sane-backends.pc])
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
## This file is part of the "Sane" build infra-structure. See
|
||||
## included LICENSE file for license information.
|
||||
|
||||
SUBDIRS = sanei tools
|
||||
SUBDIRS = backend sanei tools
|
||||
|
||||
SCANIMAGE = ../frontend/scanimage$(EXEEXT)
|
||||
TESTFILE = $(srcdir)/testfile.pnm
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
## Makefile.am -- an automake template for Makefile.in file
|
||||
## Copyright (C) 2019 Sane Developers.
|
||||
##
|
||||
## This file is part of the "Sane" build infra-structure. See
|
||||
## included LICENSE file for license information.
|
||||
|
||||
SUBDIRS = genesys
|
|
@ -0,0 +1,23 @@
|
|||
## Makefile.am -- an automake template for Makefile.in file
|
||||
## Copyright (C) 2019 Sane Developers.
|
||||
##
|
||||
## This file is part of the "Sane" build infra-structure. See
|
||||
## included LICENSE file for license information.
|
||||
|
||||
TEST_LDADD = \
|
||||
../../../sanei/libsanei.la \
|
||||
../../../lib/liblib.la \
|
||||
../../../backend/libgenesys.la \
|
||||
../../../backend/sane_strstatus.lo \
|
||||
$(MATH_LIB) $(USB_LIBS) $(PTHREAD_LIBS)
|
||||
|
||||
check_PROGRAMS = genesys_tests
|
||||
TESTS = $(check_PROGRAMS)
|
||||
|
||||
AM_CPPFLAGS += -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include $(USB_CFLAGS) \
|
||||
-DBACKEND_NAME=genesys
|
||||
|
||||
genesys_tests_SOURCES = tests.cc tests.h minigtest.cc minigtest.h \
|
||||
tests_calibration.cc
|
||||
|
||||
genesys_tests_LDADD = $(TEST_LDADD)
|
|
@ -0,0 +1,35 @@
|
|||
/* sane - Scanner Access Now Easy.
|
||||
|
||||
Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
|
||||
|
||||
This file is part of the SANE package.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "minigtest.h"
|
||||
|
||||
size_t s_num_successes = 0;
|
||||
size_t s_num_failures = 0;
|
||||
|
||||
int finish_tests()
|
||||
{
|
||||
std::cerr << "Finished tests. Sucessses: " << s_num_successes
|
||||
<< " failures: " << s_num_failures << "\n";
|
||||
if (s_num_failures > 0)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
/* sane - Scanner Access Now Easy.
|
||||
|
||||
Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
|
||||
|
||||
This file is part of the SANE package.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef SANE_TESTSUITE_BACKEND_GENESYS_MINIGTEST_H
|
||||
#define SANE_TESTSUITE_BACKEND_GENESYS_MINIGTEST_H
|
||||
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
|
||||
extern size_t s_num_successes;
|
||||
extern size_t s_num_failures;
|
||||
|
||||
inline void print_location(std::ostream& out, const char* function, const char* path,
|
||||
unsigned line)
|
||||
{
|
||||
out << path << ":" << line << " in " << function;
|
||||
}
|
||||
|
||||
template<class T, class U>
|
||||
void check_equal(const T& t, const U& u, const char* function, const char* path, unsigned line)
|
||||
{
|
||||
if (t != u) {
|
||||
s_num_failures++;
|
||||
std::cerr << "FAILURE at ";
|
||||
print_location(std::cerr, function, path, line);
|
||||
std::cerr << " :\n" << t << " != " << u << "\n\n";
|
||||
} else {
|
||||
s_num_successes++;
|
||||
std::cerr << "SUCCESS at ";
|
||||
print_location(std::cerr, function, path, line);
|
||||
std::cerr << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
inline void check_true(bool x, const char* function, const char* path, unsigned line)
|
||||
{
|
||||
if (x) {
|
||||
s_num_successes++;
|
||||
std::cerr << "SUCCESS at ";
|
||||
} else {
|
||||
s_num_failures++;
|
||||
std::cerr << "FAILURE at ";
|
||||
}
|
||||
print_location(std::cerr, function, path, line);
|
||||
std::cerr << "\n";
|
||||
}
|
||||
|
||||
|
||||
#define ASSERT_EQ(x, y) do { check_equal((x), (y), __func__, __FILE__, __LINE__); } \
|
||||
while (false)
|
||||
#define ASSERT_TRUE(x) do { check_true(bool(x), __func__, __FILE__, __LINE__); } \
|
||||
while (false)
|
||||
#define ASSERT_FALSE(x) do { !check_true(bool(x), __func__, __FILE__, __LINE__); } \
|
||||
while (false)
|
||||
|
||||
int finish_tests();
|
||||
|
||||
#endif
|
|
@ -0,0 +1,30 @@
|
|||
/* sane - Scanner Access Now Easy.
|
||||
|
||||
Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
|
||||
|
||||
This file is part of the SANE package.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "tests.h"
|
||||
#include "minigtest.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
test_calibration_parsing();
|
||||
return finish_tests();
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
/* sane - Scanner Access Now Easy.
|
||||
|
||||
Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
|
||||
|
||||
This file is part of the SANE package.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef SANE_TESTSUITE_BACKEND_GENESYS_GENESYS_UNIT_TEST_H
|
||||
#define SANE_TESTSUITE_BACKEND_GENESYS_GENESYS_UNIT_TEST_H
|
||||
|
||||
void test_calibration_parsing();
|
||||
|
||||
#endif
|
|
@ -0,0 +1,130 @@
|
|||
/* sane - Scanner Access Now Easy.
|
||||
|
||||
Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
|
||||
|
||||
This file is part of the SANE package.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "tests.h"
|
||||
#include "minigtest.h"
|
||||
|
||||
#include "../../../backend/genesys_low.h"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#define DEBUG_DECLARE_ONLY
|
||||
|
||||
Genesys_Calibration_Cache create_fake_calibration_entry()
|
||||
{
|
||||
Genesys_Calibration_Cache calib;
|
||||
calib.used_setup.pixels = 10020;
|
||||
calib.used_setup.lines = 150;
|
||||
calib.used_setup.xres = 100.5;
|
||||
|
||||
GenesysFrontendLayout wolfson_layout;
|
||||
wolfson_layout.offset_addr = { 0x20, 0x21, 0x22 };
|
||||
wolfson_layout.gain_addr = { 0x28, 0x29, 0x2a };
|
||||
|
||||
Genesys_Frontend fe;
|
||||
fe.fe_id = DAC_WOLFSON_UMAX;
|
||||
fe.layout = wolfson_layout;
|
||||
fe.regs = {
|
||||
{ 0x00, 0x00 },
|
||||
{ 0x01, 0x03 },
|
||||
{ 0x02, 0x05 },
|
||||
{ 0x03, 0x11 },
|
||||
{ ' ', 0x80 }, // check whether space-like integer values are correctly serialized
|
||||
{ ',', 0x80 },
|
||||
{ '\r', '\n' },
|
||||
{ '\n', 0x00 },
|
||||
{ 0x25, 0x00 },
|
||||
{ 0x26, 0x00 },
|
||||
{ 0x28, 0x02 },
|
||||
{ 0x29, 0x02 },
|
||||
{ 0x2a, 0x02 },
|
||||
};
|
||||
fe.reg2 = {0x00, 0x00, 0x00};
|
||||
calib.frontend = fe;
|
||||
|
||||
Genesys_Sensor sensor;
|
||||
sensor.sensor_id = CCD_UMAX;
|
||||
sensor.optical_res = 1200;
|
||||
sensor.black_pixels = 48;
|
||||
sensor.dummy_pixel = 64;
|
||||
sensor.CCD_start_xoffset = 0;
|
||||
sensor.sensor_pixels = 10800;
|
||||
sensor.fau_gain_white_ref = 210;
|
||||
sensor.gain_white_ref = 230;
|
||||
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
|
||||
sensor.custom_regs = {
|
||||
{ 0x08, 0x01 },
|
||||
{ 0x09, 0x03 },
|
||||
{ 0x0a, 0x05 },
|
||||
{ 0x0b, 0x07 },
|
||||
{ 0x16, 0x33 },
|
||||
{ 0x17, 0x05 },
|
||||
{ 0x18, 0x31 },
|
||||
{ 0x19, 0x2a },
|
||||
{ 0x1a, 0x00 },
|
||||
{ 0x1b, 0x00 },
|
||||
{ 0x1c, 0x00 },
|
||||
{ 0x1d, 0x02 },
|
||||
{ 0x52, 0x13 },
|
||||
{ 0x53, 0x17 },
|
||||
{ 0x54, 0x03 },
|
||||
{ 0x55, 0x07 },
|
||||
{ 0x56, 0x0b },
|
||||
{ 0x57, 0x0f },
|
||||
{ 0x58, 0x23 },
|
||||
{ 0x59, 0x00 },
|
||||
{ 0x5a, 0xc1 },
|
||||
{ 0x5b, 0x00 },
|
||||
{ 0x5c, 0x00 },
|
||||
{ 0x5d, 0x00 },
|
||||
{ 0x5e, 0x00 },
|
||||
};
|
||||
sensor.gamma = {1.0, 1.0, 1.0};
|
||||
calib.sensor = sensor;
|
||||
|
||||
calib.calib_pixels = 12345;
|
||||
calib.calib_channels = 3;
|
||||
calib.average_size = 7;
|
||||
calib.white_average_data = { 8, 7, 6, 5, 4, 3, 2 };
|
||||
calib.dark_average_data = { 6, 5, 4, 3, 2, 18, 12 };
|
||||
return calib;
|
||||
}
|
||||
|
||||
void test_calibration_roundtrip()
|
||||
{
|
||||
Genesys_Device::Calibration calibration = { create_fake_calibration_entry() };
|
||||
Genesys_Device::Calibration deserialized;
|
||||
|
||||
std::stringstream str;
|
||||
serialize(static_cast<std::ostream&>(str), calibration);
|
||||
serialize(static_cast<std::istream&>(str), deserialized);
|
||||
ASSERT_TRUE(calibration == deserialized);
|
||||
|
||||
int x;
|
||||
str >> x;
|
||||
ASSERT_TRUE(str.eof());
|
||||
}
|
||||
|
||||
void test_calibration_parsing()
|
||||
{
|
||||
test_calibration_roundtrip();
|
||||
}
|
Ładowanie…
Reference in New Issue