Since we now have the possibility to change the endpoint used for a particular USB communication type,
we also need a way to retrieve the current endpoint, so that one can e.g. reset the endpoint to the
old value after a single usb operation on a different endpoint.
In net-snmp 5.5 the UDP transport does not provide a public-API way to extract the originating IP of the
response to the SNMP auto-detection broadcast request... The structure that stores that information
was moved to the public include/library/snmp_transport.h header only in 5.6 :(
This fix correctly initializes the AV220-G by querying the firmware.
Added the correct option to support the interlaced duplex format used by
this unit.
Flipping duplex scanners must flip the page in order to scan the back side
of the page. With this option set (which is the default), the page is
flipped back to the original orientation. This is important if you have
a stack of papers. However, if you don't care if every page ends up
flipped compared to how it was loaded, turning this option off might save
some scanning time as the paper won't have to be pulled back through the
ADF mechanism a third time.
Although the flipping duplexer is working, there are some issues relating to
the mechanics of physically flipping paper. First among these is that the
back side of each page is physically scanned in reverse, resulting in an
upside down image. Secondly, the page is held partially in the ADF
mechanism while waiting for the frontend to make another scan request for
the back side image, thus resulting in a stuck page if the frontend fails to
follow through.
My solution to these problems is to treat page flipping as an extreme
extension of interlaced scanning; page level interlacing. This means making
another scan request on behalf of the frontend, and writing the resulting
image to a file as would have been done if the page were line interlaced.
We would have had to write this image to a file anyway to flip the image
right-side up, so we aren't doing any extra work, and technique allows us to
reuse existing code for most of the file handling. The reader_process()
function is called again (recursively) after scanning the front page. We
use the page length of the front side to determine the length of the back,
so that we can write the lines to the file starting at the end and working
towards the beginning (thus flipping the image).
A side effect of this solution was the discovery that the scanner must be
reminded that the paper needs to be re-flipped after each scan, so
set_window() must also be called in reader_process() before starting the
second scan.
Finally, with this change, a minor bug was exposed where frontends were
given the number of lines which would be scanned, which makes sense in
flatbed mode, but does not make sense for an ADF, where the page may be
smaller than the scan window. The code was changed to follow the
specifications, returning -1 in ADF mode (when the length cannot be
determined).
After fixing the duplexer initialization, it became clear that the code was
mirroring the back pages. Since the scanner already supports page
mirroring internally with an optional bit setting (which was already set)
it made the most sense to simplify the code base and remove the variable.
For scanners which potentially have flipping duplexers, only enable
duplexing if there is an ADF present. This leads to the next problem, that
the flipping duplexers (present only on the HP 8200 series AFAIK) don't
always seem to be properly configured when powered up. To solve this some
magical values are written to magical memory locations, and some more
magical status is read back, causing an apparent firmware reset which
blocks communication for a short period of time. See adf_reset() for
details.
Added the AV_ADF_FLIPPING_DUPLEX flag to activate the flipping duplex code
only for models known to have such duplexing ADFs. Prior to this a doubious
huristic was used to guess when the hardware had a flipping duplex unit.
The additional_probe variable protected add_source_mode() and
add_color_mode() from being entered upon subsequent calls. These functions
were patched to not insert duplicate records in this case, removing the
need for the gatekeeper variable.
Until now the code has been changing the frontend supplied pointer to point
to our internal data structure. There are two problems with this. It
orphans the data previously associated with that pointer, which causes a
memory leak. It also gives the frontend the ability to munge our internal
data structure.
The only downside to this change is the possibility that a frontend took the
spec too literally and merely supplies a pointer but does not allocate
storage space for the result. Technically, the spec is a bit vague on this
point, because it does not specifically state who should allocate the
structure, but I feel a reasonable programmer would guess that space
allocation is a frontend obligation.
There was an old TODO in the code which suggests creating an option for using
the paper_length field to detect double feeds in the ADF. I've added it as
an option, but set the default to not use it since it might cause older
scanners to get confused.
I felt that the ehancements group was doing double duity for image tuning and
other more hardware related options. This new group takes ownership of those.
I'm not happy with the name, but that can always be changed.
- don't center window when using flatbed
- improve request sense error messages
- enable flatbed for all known models
- ad usb ids for DR-6030C, CR-135i & CR-190i
- moved DR-2020U to unsupported.desc