satdump/plugins/proba_support/proba/instruments/hrc/hrc_reader.cpp

72 lines
2.7 KiB
C++
Raw Permalink Normal View History

2021-02-15 21:20:05 +01:00
#include "hrc_reader.h"
2022-10-03 11:55:25 +02:00
#include "../crc.h"
#include "image/io.h"
#include "image/processing.h"
2025-07-23 12:21:02 +02:00
#include "logger.h"
#include "utils/binary.h"
2021-02-15 21:20:05 +01:00
namespace proba
{
namespace hrc
{
2025-07-23 12:21:02 +02:00
HRCReader::HRCReader(std::string &outputfolder) { output_folder = outputfolder; }
2021-02-15 21:20:05 +01:00
2025-07-23 12:21:02 +02:00
HRCReader::~HRCReader() {}
2021-02-15 21:20:05 +01:00
2021-07-02 01:03:35 +02:00
void HRCReader::work(ccsds::CCSDSPacket &packet)
2021-02-15 21:20:05 +01:00
{
if (packet.payload.size() < 21458)
return;
2022-10-03 11:55:25 +02:00
if (check_proba_crc(packet))
{
logger->error("HRC : Bad CRC!");
return;
}
2022-10-11 16:56:54 +02:00
int img_tag = (packet.payload[0] - 1) << 16 | packet.payload[1] << 8 | packet.payload[2];
2021-02-15 21:20:05 +01:00
int count_marker = packet.payload[18 - 6];
2022-10-11 16:56:54 +02:00
if (hrc_images.count(img_tag) == 0)
{
2023-05-08 23:08:34 +02:00
logger->info("New HRC image with tag %d!", img_tag);
2022-10-11 16:56:54 +02:00
hrc_images.insert({img_tag, std::make_shared<HRCImage>()});
}
std::shared_ptr<HRCImage> &curr = hrc_images[img_tag];
if (count_marker > 65)
return;
2021-02-15 21:20:05 +01:00
// Convert into 10-bits values
2022-10-11 16:56:54 +02:00
int pos = 21;
2021-02-15 21:20:05 +01:00
for (int i = 0; i < 17152; i += 4)
{
if (count_marker <= 65)
{
2025-07-23 12:21:02 +02:00
curr->tempChannelBuffer[count_marker * 17152 + i + 0] =
satdump::reverse16Bits((satdump::reverseBits(packet.payload[pos + 0]) << 2) | (satdump::reverseBits(packet.payload[pos + 1]) >> 6));
curr->tempChannelBuffer[count_marker * 17152 + i + 1] =
satdump::reverse16Bits(((satdump::reverseBits(packet.payload[pos + 1]) % 64) << 4) | (satdump::reverseBits(packet.payload[pos + 2]) >> 4));
curr->tempChannelBuffer[count_marker * 17152 + i + 2] =
satdump::reverse16Bits(((satdump::reverseBits(packet.payload[pos + 2]) % 16) << 6) | (satdump::reverseBits(packet.payload[pos + 3]) >> 2));
curr->tempChannelBuffer[count_marker * 17152 + i + 3] =
satdump::reverse16Bits(((satdump::reverseBits(packet.payload[pos + 3]) % 4) << 8) | satdump::reverseBits(packet.payload[pos + 4]));
2021-02-15 21:20:05 +01:00
pos += 5;
}
}
}
void HRCReader::save()
{
2022-10-11 16:56:54 +02:00
for (auto &imgh : hrc_images)
2021-02-15 21:20:05 +01:00
{
2024-05-09 01:16:08 +02:00
image::Image img = imgh.second->getImg();
image::save_img(img, output_folder + "/HRC-" + std::to_string(imgh.first));
image::normalize(img);
image::equalize(img);
image::save_img(img, output_folder + "/HRC-" + std::to_string(imgh.first) + "-EQU");
2021-02-15 21:20:05 +01:00
}
}
} // namespace hrc
} // namespace proba