mirror of
https://github.com/SatDump/SatDump
synced 2026-08-13 17:47:30 -04:00
106 lines
No EOL
3 KiB
C++
106 lines
No EOL
3 KiB
C++
#include "cips_reader.h"
|
|
#include "common/ccsds/ccsds_time.h"
|
|
#include "common/repack.h"
|
|
#include <cmath>
|
|
|
|
#include "logger.h"
|
|
|
|
namespace aim
|
|
{
|
|
namespace cips
|
|
{
|
|
CIPSReader::CIPSReader()
|
|
{
|
|
}
|
|
|
|
CIPSReader::~CIPSReader()
|
|
{
|
|
// delete[] tmp_words;
|
|
}
|
|
|
|
float nominal_root_2n(uint16_t value)
|
|
{
|
|
// const float alpha = 512;
|
|
const float delta = 510;
|
|
|
|
float decompressed_value = 0;
|
|
if (value > delta)
|
|
decompressed_value = powf(value - delta - 1.0, 2) / 2.0;
|
|
else
|
|
decompressed_value = value;
|
|
return decompressed_value;
|
|
}
|
|
|
|
float optimized_root_2n(uint16_t value)
|
|
{
|
|
// const float alpha = 512;
|
|
const float delta = 510;
|
|
const float gamma = 543;
|
|
|
|
float decompressed_value = 0;
|
|
if (value > gamma)
|
|
decompressed_value = powf(value - delta - 1.0, 2) / 2.0;
|
|
else
|
|
decompressed_value = value;
|
|
return decompressed_value;
|
|
}
|
|
|
|
void CIPSReader::work(ccsds::CCSDSPacket &packet)
|
|
{
|
|
packet.payload.resize(1018);
|
|
|
|
CIPSScienceHeader science_header(&packet.payload[13]);
|
|
|
|
if (science_header.start_pixel == 0)
|
|
add_image();
|
|
|
|
auto &img = images[images.size() - 1];
|
|
|
|
if (science_header.bits_pixel == 10)
|
|
{
|
|
uint16_t pixels[774];
|
|
repackBytesTo10bits(&packet.payload[54 - 6], 968, pixels);
|
|
|
|
for (int i = science_header.start_pixel, i2 = 0; i < (int)img.size() && i2 < 774; i++, i2++)
|
|
{
|
|
float value = 0;
|
|
|
|
if (science_header.compression_scheme == 0)
|
|
value = nominal_root_2n(pixels[i2]);
|
|
else if (science_header.compression_scheme == 1)
|
|
value = optimized_root_2n(pixels[i2]);
|
|
else
|
|
value = nominal_root_2n(pixels[i2]);
|
|
|
|
value /= 2.0;
|
|
|
|
if (value > 65536)
|
|
value = 65535;
|
|
if (value < 0)
|
|
value = 0;
|
|
|
|
img.set(i, value);
|
|
}
|
|
}
|
|
else if (science_header.bits_pixel == 17)
|
|
{
|
|
uint32_t pixels[455];
|
|
repackBytesTo17bits(&packet.payload[54 - 6], 968, pixels);
|
|
|
|
for (int i = science_header.start_pixel, i2 = 0; i < (int)img.size() && i2 < 455; i++, i2++)
|
|
{
|
|
float value = pixels[i2];
|
|
|
|
value /= 2.0;
|
|
|
|
if (value > 65536)
|
|
value = 65535;
|
|
if (value < 0)
|
|
value = 0;
|
|
|
|
img.set(i, value);
|
|
}
|
|
}
|
|
}
|
|
} // namespace swap
|
|
} // namespace proba
|