kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Rewrite sensor table to use std::vector
rodzic
e5eff5d76f
commit
cb189cfe2d
|
@ -175,14 +175,13 @@ sanei_genesys_init_structs (Genesys_Device * dev)
|
|||
unsigned int i, sensor_ok = 0, gpo_ok = 0, motor_ok = 0;
|
||||
|
||||
/* initialize the sensor data stuff */
|
||||
for (i = 0; i < sizeof (Sensor) / sizeof (Genesys_Sensor); i++)
|
||||
{
|
||||
if (dev->model->ccd_type == Sensor[i].sensor_id)
|
||||
{
|
||||
memcpy (&dev->sensor, &Sensor[i], sizeof (Genesys_Sensor));
|
||||
sensor_ok = 1;
|
||||
}
|
||||
}
|
||||
for (const auto& sensor : *s_sensors) {
|
||||
if (dev->model->ccd_type == sensor.sensor_id) {
|
||||
dev->sensor = sensor;
|
||||
sensor_ok = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* initialize the GPO data stuff */
|
||||
for (i = 0; i < sizeof (Gpo) / sizeof (Genesys_Gpo); i++)
|
||||
|
@ -2993,7 +2992,7 @@ genesys_restore_calibration (Genesys_Device * dev)
|
|||
{
|
||||
memcpy (&dev->frontend, &cache->frontend, sizeof (dev->frontend));
|
||||
/* we don't restore the gamma fields */
|
||||
memcpy (dev->sensor.regs_0x10_0x1d, cache->sensor.regs_0x10_0x1d, 6);
|
||||
memcpy (dev->sensor.regs_0x10_0x1d.data(), cache->sensor.regs_0x10_0x1d.data(), 6);
|
||||
free (dev->dark_average_data);
|
||||
free (dev->white_average_data);
|
||||
|
||||
|
@ -6149,8 +6148,7 @@ sanei_genesys_read_calibration (Genesys_Device * dev)
|
|||
}
|
||||
BILT1 (fread (&cache->last_calibration, sizeof (cache->last_calibration), 1, fp));
|
||||
BILT1 (fread (&cache->frontend, sizeof (cache->frontend), 1, fp));
|
||||
/* the gamma (and later) fields are not stored */
|
||||
BILT1 (fread (&cache->sensor, offsetof (Genesys_Sensor, gamma[0]), 1, fp));
|
||||
BILT1(cache->sensor.fread(fp));
|
||||
BILT1 (fread (&cache->calib_pixels, sizeof (cache->calib_pixels), 1, fp));
|
||||
BILT1 (fread (&cache->calib_channels, sizeof (cache->calib_channels), 1, fp));
|
||||
BILT1 (fread (&cache->average_size, sizeof (cache->average_size), 1, fp));
|
||||
|
@ -6223,9 +6221,7 @@ write_calibration (Genesys_Device * dev)
|
|||
fwrite (&cache->used_setup, sizeof (cache->used_setup), 1, fp);
|
||||
fwrite (&cache->last_calibration, sizeof (cache->last_calibration), 1, fp);
|
||||
fwrite (&cache->frontend, sizeof (cache->frontend), 1, fp);
|
||||
/* the gamma (and later) fields are not stored */
|
||||
fwrite (&cache->sensor, offsetof (Genesys_Sensor, gamma[0]), 1, fp);
|
||||
|
||||
cache->sensor.fwrite(fp);
|
||||
fwrite (&cache->calib_pixels, sizeof (cache->calib_pixels), 1, fp);
|
||||
fwrite (&cache->calib_channels, sizeof (cache->calib_channels), 1, fp);
|
||||
fwrite (&cache->average_size, sizeof (cache->average_size), 1, fp);
|
||||
|
@ -6400,6 +6396,8 @@ sane_init_impl(SANE_Int * version_code, SANE_Auth_Callback authorize)
|
|||
/* init sanei_magic */
|
||||
sanei_magic_init();
|
||||
|
||||
genesys_init_sensor_tables();
|
||||
|
||||
DBG(DBG_info, "%s: %s endian machine\n", __func__,
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
"big"
|
||||
|
|
Plik diff jest za duży
Load Diff
|
@ -260,22 +260,80 @@ typedef struct
|
|||
uint8_t reg2[3]; /**< extra control registers */
|
||||
} Genesys_Frontend;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t sensor_id; /**< id of the sensor description */
|
||||
int optical_res;
|
||||
int black_pixels;
|
||||
int dummy_pixel; /* value of dummy register. */
|
||||
int CCD_start_xoffset; /* last pixel of CCD margin at optical resolution */
|
||||
int sensor_pixels; /* total pixels used by the sensor */
|
||||
int fau_gain_white_ref; /* TA CCD target code (reference gain) */
|
||||
int gain_white_ref; /* CCD target code (reference gain) */
|
||||
uint8_t regs_0x08_0x0b[4];
|
||||
uint8_t regs_0x10_0x1d[14];
|
||||
uint8_t regs_0x52_0x5e[13];
|
||||
float gamma[3]; /**< red, green and blue gamma coefficient for default gamma tables */
|
||||
uint16_t *gamma_table[3]; /**< sensor specific gamma tables */
|
||||
} Genesys_Sensor;
|
||||
template<class T, size_t Size>
|
||||
struct AssignableArray : public std::array<T, Size> {
|
||||
AssignableArray() = default;
|
||||
AssignableArray(const AssignableArray&) = default;
|
||||
AssignableArray& operator=(const AssignableArray&) = default;
|
||||
|
||||
AssignableArray& operator=(std::initializer_list<T> init)
|
||||
{
|
||||
if (init.size() != std::array<T, Size>::size())
|
||||
throw std::runtime_error("An array of incorrect size assigned");
|
||||
std::copy(init.begin(), init.end(), std::array<T, Size>::begin());
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
struct Genesys_Sensor {
|
||||
// id of the sensor description
|
||||
uint8_t sensor_id;
|
||||
int optical_res;
|
||||
int black_pixels;
|
||||
// value of the dummy register
|
||||
int dummy_pixel;
|
||||
// last pixel of CCD margin at optical resolution
|
||||
int CCD_start_xoffset;
|
||||
// total pixels used by the sensor
|
||||
int sensor_pixels;
|
||||
// TA CCD target code (reference gain)
|
||||
int fau_gain_white_ref;
|
||||
// CCD target code (reference gain)
|
||||
int gain_white_ref;
|
||||
|
||||
AssignableArray<uint8_t, 4> regs_0x08_0x0b;
|
||||
// Initial exposure values, EXPR, EXPG and EXPB are contained in 0x10-0x15
|
||||
AssignableArray<uint8_t, 14> regs_0x10_0x1d;
|
||||
AssignableArray<uint8_t, 13> regs_0x52_0x5e;
|
||||
|
||||
// red, green and blue gamma coefficient for default gamma tables
|
||||
AssignableArray<float, 3> gamma;
|
||||
|
||||
// sensor-specific gamma tables
|
||||
AssignableArray<uint16_t*, 3> gamma_table;
|
||||
|
||||
size_t fread(FILE* fp)
|
||||
{
|
||||
bool success = true;
|
||||
success &= 1 == ::fread(&sensor_id, sizeof(sensor_id), 1, fp);
|
||||
success &= 1 == ::fread(&optical_res, sizeof(optical_res), 1, fp);
|
||||
success &= 1 == ::fread(&black_pixels, sizeof(black_pixels), 1, fp);
|
||||
success &= 1 == ::fread(&dummy_pixel, sizeof(dummy_pixel), 1, fp);
|
||||
success &= 1 == ::fread(&CCD_start_xoffset, sizeof(CCD_start_xoffset), 1, fp);
|
||||
success &= 1 == ::fread(&sensor_pixels, sizeof(sensor_pixels), 1, fp);
|
||||
success &= 1 == ::fread(&fau_gain_white_ref, sizeof(fau_gain_white_ref), 1, fp);
|
||||
success &= 1 == ::fread(&gain_white_ref, sizeof(gain_white_ref), 1, fp);
|
||||
success &= 1 == ::fread(®s_0x08_0x0b, sizeof(regs_0x08_0x0b), 1, fp);
|
||||
success &= 1 == ::fread(®s_0x10_0x1d, sizeof(regs_0x10_0x1d), 1, fp);
|
||||
success &= 1 == ::fread(®s_0x52_0x5e, sizeof(regs_0x52_0x5e), 1, fp);
|
||||
return success ? 1 : 0;
|
||||
}
|
||||
|
||||
void fwrite(FILE* fp) const
|
||||
{
|
||||
::fwrite(&sensor_id, sizeof(sensor_id), 1, fp);
|
||||
::fwrite(&optical_res, sizeof(optical_res), 1, fp);
|
||||
::fwrite(&black_pixels, sizeof(black_pixels), 1, fp);
|
||||
::fwrite(&dummy_pixel, sizeof(dummy_pixel), 1, fp);
|
||||
::fwrite(&CCD_start_xoffset, sizeof(CCD_start_xoffset), 1, fp);
|
||||
::fwrite(&sensor_pixels, sizeof(sensor_pixels), 1, fp);
|
||||
::fwrite(&fau_gain_white_ref, sizeof(fau_gain_white_ref), 1, fp);
|
||||
::fwrite(&gain_white_ref, sizeof(gain_white_ref), 1, fp);
|
||||
::fwrite(®s_0x08_0x0b, sizeof(regs_0x08_0x0b), 1, fp);
|
||||
::fwrite(®s_0x10_0x1d, sizeof(regs_0x10_0x1d), 1, fp);
|
||||
::fwrite(®s_0x52_0x5e, sizeof(regs_0x52_0x5e), 1, fp);
|
||||
}
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -1355,4 +1413,7 @@ private:
|
|||
std::unique_ptr<T> ptr_;
|
||||
};
|
||||
|
||||
extern StaticInit<std::vector<Genesys_Sensor>> s_sensors;
|
||||
void genesys_init_sensor_tables();
|
||||
|
||||
#endif /* not GENESYS_LOW_H */
|
||||
|
|
Ładowanie…
Reference in New Issue