2021-02-15 21:20:05 +01:00
|
|
|
#include "hrc_reader.h"
|
2022-10-03 11:55:25 +02:00
|
|
|
#include "../crc.h"
|
2025-05-25 14:30:24 +02:00
|
|
|
#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
|