From cfa4601d5203c6093f8d18951986618430f42e8b Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Thu, 26 Mar 2026 18:51:58 +0100 Subject: [PATCH] add filter option mask for profile --- src/kds_s2000w_handler.h | 10 +++++- src/kds_s2000w_handler_opts.c | 47 +++++++++++++++++++++++++++++ src/kds_s2000w_handler_opts.h | 2 ++ src/kds_s2000w_net.c | 1 + src/kds_s2000w_option_descriptors.h | 6 ---- tests/kds_s2000w_net_tests.c | 44 ++++++++++++++++++++++++++- 6 files changed, 102 insertions(+), 8 deletions(-) diff --git a/src/kds_s2000w_handler.h b/src/kds_s2000w_handler.h index 304c3a7..05c348a 100644 --- a/src/kds_s2000w_handler.h +++ b/src/kds_s2000w_handler.h @@ -4,6 +4,12 @@ #include #include +typedef enum { + PROFILE_MIN, + PROFILE_230802_V1_0_36, + PROFILE_FULL +} profile_t; + typedef enum { NOTCONNECTED, OPENED, @@ -47,7 +53,7 @@ typedef struct { } scan_status_t; typedef struct { - __attribute_deprecated__ uint8_t profile; + uint8_t profile; uint64_t sessionid; json_object* scanner_config; scan_status_t* scan_status; @@ -73,6 +79,8 @@ void kds_s2000w_handler_close(handler_t* h); void kds_s2000w_handler_recreate_session(handler_t* h); mask_option_groups_t* kds_s2000w_handler_get_available_options(); +void kds_s2000w_handler_filter_available_options(profile_t profile, mask_option_groups_t* mask); + int32_t kds_s2000w_handler_opts_get_option(handler_t* handle, uint32_t option, void* value, int32_t* info); int32_t kds_s2000w_handler_opts_set_option(handler_t* handle, uint32_t option, void* value, int32_t* info); diff --git a/src/kds_s2000w_handler_opts.c b/src/kds_s2000w_handler_opts.c index c7095c3..152c9eb 100644 --- a/src/kds_s2000w_handler_opts.c +++ b/src/kds_s2000w_handler_opts.c @@ -651,6 +651,53 @@ mask_option_groups_t* kds_s2000w_handler_get_available_options() return available_options; } +void kds_s2000w_handler_filter_available_options(profile_t profile, mask_option_groups_t* mask) +{ + const mask_option_groups_t min_profile = { + .standard_group = 0xe, + .geometry_group = 0x0, + .boldness_smoothing_group = 0x0, + .boldness_color_group = 0x1001, + .image_processing_group = 0x1, + .feeder_group = 0x1 + }; + const mask_option_groups_t v1_0_36_230802 = { + .standard_group = 0xf, + .geometry_group = 0x0, + .boldness_smoothing_group = 0xf, + .boldness_color_group = 0x19e7, + .image_processing_group = 0x1, + .feeder_group = 0x1 + }; + const mask_option_groups_t full_profle = { + .standard_group = 0xffff, + .geometry_group = 0xffff, + .boldness_smoothing_group = 0xffff, + .boldness_color_group = 0xffff, + .image_processing_group = 0xffff, + .feeder_group = 0xffff + }; + + mask_option_groups_t profile_mask = min_profile; + switch (profile) { + case PROFILE_FULL: + profile_mask = full_profle; + break; + case PROFILE_230802_V1_0_36: + profile_mask = v1_0_36_230802; + break; + default: + break; + } + + mask->standard_group &= profile_mask.standard_group; + mask->geometry_group &= profile_mask.geometry_group; + mask->boldness_smoothing_group &= profile_mask.boldness_smoothing_group; + mask->boldness_color_group &= profile_mask.boldness_color_group; + mask->image_processing_group &= profile_mask.image_processing_group; + mask->feeder_group &= profile_mask.feeder_group; +} + int32_t kds_s2000w_handler_opts_get_option(handler_t* h, uint32_t option, void* value, int32_t* info) { _kds_s2000w_handler_opts_load_config(h); diff --git a/src/kds_s2000w_handler_opts.h b/src/kds_s2000w_handler_opts.h index e50fd44..5f0ac75 100644 --- a/src/kds_s2000w_handler_opts.h +++ b/src/kds_s2000w_handler_opts.h @@ -4,6 +4,8 @@ #include "kds_s2000w_handler.h" mask_option_groups_t* kds_s2000w_handler_get_available_options(); +void kds_s2000w_handler_filter_available_options(profile_t profile, mask_option_groups_t* mask); + int32_t kds_s2000w_handler_opts_get_option(handler_t* h, uint32_t option, void* value, int32_t* info); int32_t kds_s2000w_handler_opts_set_option(handler_t* h, uint32_t option, void* value, int32_t* info); diff --git a/src/kds_s2000w_net.c b/src/kds_s2000w_net.c index 44ab0de..7d42e47 100644 --- a/src/kds_s2000w_net.c +++ b/src/kds_s2000w_net.c @@ -99,6 +99,7 @@ SANE_Status sane_kds_s2000w_net_open(SANE_String_Const devicename, } mask_option_groups_t* option_mask = kds_s2000w_handler_get_available_options(); + kds_s2000w_handler_filter_available_options(h->profile, option_mask); SANE_Status status = kds_s2000w_option_descriptors_init((mask_option_t*) option_mask); free(option_mask); diff --git a/src/kds_s2000w_option_descriptors.h b/src/kds_s2000w_option_descriptors.h index 8eb75c1..e97d85a 100644 --- a/src/kds_s2000w_option_descriptors.h +++ b/src/kds_s2000w_option_descriptors.h @@ -119,12 +119,6 @@ * methods ******************************************************************************/ -__attribute_deprecated__ typedef enum { - PROFILE_MIN, - PROFILE_230802_V1_0_36, - PROFILE_FULL -} profile_t; - typedef struct { const char* config_name; SANE_Option_Descriptor* descriptor; diff --git a/tests/kds_s2000w_net_tests.c b/tests/kds_s2000w_net_tests.c index 3b2d2d4..cd9aae5 100644 --- a/tests/kds_s2000w_net_tests.c +++ b/tests/kds_s2000w_net_tests.c @@ -961,6 +961,46 @@ void kds_s2000w_handler_available_options_test(void** state) option_mask = NULL; } +void kds_s2000w_handler_filter_availables_options_min_profile_test() +{ + mask_option_groups_t* mask = malloc(sizeof(mask_option_groups_t)); + if (mask == NULL) + return; + memset(mask, 0xff, sizeof(mask_option_groups_t)); + + kds_s2000w_handler_filter_available_options(PROFILE_MIN, mask); + + assert_int_equal(mask->standard_group, 0xe); + assert_int_equal(mask->geometry_group, 0x0); + assert_int_equal(mask->boldness_smoothing_group, 0x0); + assert_int_equal(mask->boldness_color_group, 0x1001); + assert_int_equal(mask->image_processing_group, 0x1); + assert_int_equal(mask->feeder_group, 0x1); + + free(mask); + mask = NULL; +} + +void kds_s2000w_handler_filter_availables_options_profile_v1_0_36_test() +{ + mask_option_groups_t* mask = malloc(sizeof(mask_option_groups_t)); + if (mask == NULL) + return; + memset(mask, 0xff, sizeof(mask_option_groups_t)); + + kds_s2000w_handler_filter_available_options(PROFILE_230802_V1_0_36, mask); + + assert_int_equal(mask->standard_group, 0xf); + assert_int_equal(mask->geometry_group, 0x0); + assert_int_equal(mask->boldness_smoothing_group, 0xf); + assert_int_equal(mask->boldness_color_group, 0x19e7); + assert_int_equal(mask->image_processing_group, 0x1); + assert_int_equal(mask->feeder_group, 0x1); + + free(mask); + mask = NULL; +} + int main() { const struct CMUnitTest net_tests[] = { @@ -991,7 +1031,9 @@ int main() cmocka_unit_test(kds_s2000w_net_get_select_fd_test), cmocka_unit_test(kds_s2000w_handler_depth_one_calc_bytes_per_line_tests), cmocka_unit_test(kds_s2000w_handler_depth_eight_calc_bytes_per_line_tests), - cmocka_unit_test(kds_s2000w_handler_available_options_test) + cmocka_unit_test(kds_s2000w_handler_available_options_test), + cmocka_unit_test(kds_s2000w_handler_filter_availables_options_min_profile_test), + cmocka_unit_test(kds_s2000w_handler_filter_availables_options_profile_v1_0_36_test) }; return cmocka_run_group_tests(net_tests, setup, teardown); -- 2.47.3