kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Rewrite sensor table to use std::vector
rodzic
e5eff5d76f
commit
cb189cfe2d
|
@ -175,12 +175,11 @@ sanei_genesys_init_structs (Genesys_Device * dev)
|
||||||
unsigned int i, sensor_ok = 0, gpo_ok = 0, motor_ok = 0;
|
unsigned int i, sensor_ok = 0, gpo_ok = 0, motor_ok = 0;
|
||||||
|
|
||||||
/* initialize the sensor data stuff */
|
/* initialize the sensor data stuff */
|
||||||
for (i = 0; i < sizeof (Sensor) / sizeof (Genesys_Sensor); i++)
|
for (const auto& sensor : *s_sensors) {
|
||||||
{
|
if (dev->model->ccd_type == sensor.sensor_id) {
|
||||||
if (dev->model->ccd_type == Sensor[i].sensor_id)
|
dev->sensor = sensor;
|
||||||
{
|
|
||||||
memcpy (&dev->sensor, &Sensor[i], sizeof (Genesys_Sensor));
|
|
||||||
sensor_ok = 1;
|
sensor_ok = 1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2993,7 +2992,7 @@ genesys_restore_calibration (Genesys_Device * dev)
|
||||||
{
|
{
|
||||||
memcpy (&dev->frontend, &cache->frontend, sizeof (dev->frontend));
|
memcpy (&dev->frontend, &cache->frontend, sizeof (dev->frontend));
|
||||||
/* we don't restore the gamma fields */
|
/* 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->dark_average_data);
|
||||||
free (dev->white_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->last_calibration, sizeof (cache->last_calibration), 1, fp));
|
||||||
BILT1 (fread (&cache->frontend, sizeof (cache->frontend), 1, fp));
|
BILT1 (fread (&cache->frontend, sizeof (cache->frontend), 1, fp));
|
||||||
/* the gamma (and later) fields are not stored */
|
BILT1(cache->sensor.fread(fp));
|
||||||
BILT1 (fread (&cache->sensor, offsetof (Genesys_Sensor, gamma[0]), 1, fp));
|
|
||||||
BILT1 (fread (&cache->calib_pixels, sizeof (cache->calib_pixels), 1, 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->calib_channels, sizeof (cache->calib_channels), 1, fp));
|
||||||
BILT1 (fread (&cache->average_size, sizeof (cache->average_size), 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->used_setup, sizeof (cache->used_setup), 1, fp);
|
||||||
fwrite (&cache->last_calibration, sizeof (cache->last_calibration), 1, fp);
|
fwrite (&cache->last_calibration, sizeof (cache->last_calibration), 1, fp);
|
||||||
fwrite (&cache->frontend, sizeof (cache->frontend), 1, fp);
|
fwrite (&cache->frontend, sizeof (cache->frontend), 1, fp);
|
||||||
/* the gamma (and later) fields are not stored */
|
cache->sensor.fwrite(fp);
|
||||||
fwrite (&cache->sensor, offsetof (Genesys_Sensor, gamma[0]), 1, fp);
|
|
||||||
|
|
||||||
fwrite (&cache->calib_pixels, sizeof (cache->calib_pixels), 1, fp);
|
fwrite (&cache->calib_pixels, sizeof (cache->calib_pixels), 1, fp);
|
||||||
fwrite (&cache->calib_channels, sizeof (cache->calib_channels), 1, fp);
|
fwrite (&cache->calib_channels, sizeof (cache->calib_channels), 1, fp);
|
||||||
fwrite (&cache->average_size, sizeof (cache->average_size), 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 */
|
/* init sanei_magic */
|
||||||
sanei_magic_init();
|
sanei_magic_init();
|
||||||
|
|
||||||
|
genesys_init_sensor_tables();
|
||||||
|
|
||||||
DBG(DBG_info, "%s: %s endian machine\n", __func__,
|
DBG(DBG_info, "%s: %s endian machine\n", __func__,
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
"big"
|
"big"
|
||||||
|
|
Plik diff jest za duży
Load Diff
|
@ -260,22 +260,80 @@ typedef struct
|
||||||
uint8_t reg2[3]; /**< extra control registers */
|
uint8_t reg2[3]; /**< extra control registers */
|
||||||
} Genesys_Frontend;
|
} Genesys_Frontend;
|
||||||
|
|
||||||
typedef struct
|
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)
|
||||||
{
|
{
|
||||||
uint8_t sensor_id; /**< id of the sensor description */
|
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 optical_res;
|
||||||
int black_pixels;
|
int black_pixels;
|
||||||
int dummy_pixel; /* value of dummy register. */
|
// value of the dummy register
|
||||||
int CCD_start_xoffset; /* last pixel of CCD margin at optical resolution */
|
int dummy_pixel;
|
||||||
int sensor_pixels; /* total pixels used by the sensor */
|
// last pixel of CCD margin at optical resolution
|
||||||
int fau_gain_white_ref; /* TA CCD target code (reference gain) */
|
int CCD_start_xoffset;
|
||||||
int gain_white_ref; /* CCD target code (reference gain) */
|
// total pixels used by the sensor
|
||||||
uint8_t regs_0x08_0x0b[4];
|
int sensor_pixels;
|
||||||
uint8_t regs_0x10_0x1d[14];
|
// TA CCD target code (reference gain)
|
||||||
uint8_t regs_0x52_0x5e[13];
|
int fau_gain_white_ref;
|
||||||
float gamma[3]; /**< red, green and blue gamma coefficient for default gamma tables */
|
// CCD target code (reference gain)
|
||||||
uint16_t *gamma_table[3]; /**< sensor specific gamma tables */
|
int gain_white_ref;
|
||||||
} Genesys_Sensor;
|
|
||||||
|
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
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -1355,4 +1413,7 @@ private:
|
||||||
std::unique_ptr<T> ptr_;
|
std::unique_ptr<T> ptr_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern StaticInit<std::vector<Genesys_Sensor>> s_sensors;
|
||||||
|
void genesys_init_sensor_tables();
|
||||||
|
|
||||||
#endif /* not GENESYS_LOW_H */
|
#endif /* not GENESYS_LOW_H */
|
||||||
|
|
Ładowanie…
Reference in New Issue