SXXXXXXX_RadarDataReader/_src_cpp/Files/postprocess.cpp
VALLONGOL 5de2650675 add
2025-11-12 13:43:30 +01:00

1597 lines
33 KiB
C++

/*
* postprocess.cpp
*
*/
#include "ghost.h"
#include "ghost_playback.h"
#include "ghost_ipc.h"
#include "gtl_cmdio.h"
#include <string>
#include <string.h>
#include <map>
#include <stdio.h>
#include <math.h>
#include "math_32.h"
#include "idd_header.h"
#include "idd_shared_memory.h"
#include "idd_cdp_cmp.h"
#include "idd_cmp_cdp.h"
#include "AesaStream.h"
//#define AESA_RX_MESSAGE_MAX_SIZE 4096
//#define AESA_TX_MESSAGE_MAX_SIZE (4096*2)
struct antenna_err_counters_t
{
unsigned int rfif_sts_received;
unsigned int rfif_bite_received;
unsigned int rfif_rxn;
unsigned int rfif_duty;
unsigned int rfif_overpulse;
unsigned int spare[16];
};
struct antenna_reply_buffer_t
{
unsigned int updates;
unsigned int hstate;
unsigned int response_decoded;
unsigned int msg_count_errors;
unsigned int timeouterr;
unsigned int crcerr;
unsigned int lenerr;
unsigned int rxerr;
int pri_err;
int ignore_aesa_status;
unsigned int download_map_executed;
unsigned int spare[6];
unsigned int data_udpates;
unsigned int data_size;
uint8_t data[AESA_RX_MESSAGE_MAX_SIZE];
unsigned int cbite_mode;
antenna_err_counters_t errs;
};
struct antenna_cmd_buffer_t
{
unsigned int h[8];
uint8_t data[AESA_TX_MESSAGE_MAX_SIZE];
};
static int pp_level=0;
static unsigned int pp_srcid;
static const char* pp_srcname;
struct cmp_cdp_shared_struct_t
{
idd_comm::shared_memory_header_t memHeader;
idd_cmp_cdp_command_t<idd_blob::ChunkWriter> msg;
idd_comm::shared_memory_footer_t memFooter;
};
struct dbg_t
{
iddtypes::mode_command_t mode;
iddtypes::scan_volume_t sv;
iddtypes::frequency_selection_cmd_t fsel;
iddtypes::inu_data_t inu;
iddtypes::cursor_data_t crs;
iddtypes::as_gnd_tgt_data_t as_gnd_tgt;
iddtypes::gnd_tgt_data_t gnd_tgt;
iddtypes::waveform_parameter_t wf;
iddtypes::acquisition_setup_data_t acq;
};
struct cdp_bite_shared_struct_t
{
idd_comm::shared_memory_header_t memHeader;
idd_cdp_bite_report_t<idd_blob::ChunkWriter> msg;
idd_comm::shared_memory_footer_t memFooter;
};
static const char* m1553str(unsigned int n)
{
static const char *str[]={
"RWS",
"VS",
"ACM",
"TWS",
"4",
"GM",
"SEA1",
"SEA2",
"GMTI",
"BCN",
"AGR",
"TA",
"WA",
"TS",
"ETET",
"DLY"
};
return str[n];
}
static const char* m2str(unsigned int n)
{
static const char* str[]=
{
"idle",
"ibit",
"gm",
"dbs",
"rws",
"vs",
"acm",
"tws",
"sea1",
"sea2",
"gmti",
"bcn",
"sam",
"ta",
"wa",
"stt",
"dtt",
"sstt",
"acq",
"ftt",
"agr",
"sar",
"inv",
"dummy", /*to be used only as a defualt mode for prototypal development*/
"ETET", /*dedicated to special REP test for HW validation*/
"boot",
"??", "??", "??"
};
return str[n];
}
static const char* wf2str(unsigned int n)
{
static const char* str[]={
"idle",
"lprf",
"mprf",
"hprf",
"lprfnc",
"mprf_short",
"agr_short",
"agr_long",
"mprf_look_up",
"mprf_adaptive",
"auto_without_lprf_nc"
};
return str[n];
}
struct cdp_res_shared_struct_t
{
idd_comm::shared_memory_header_t memHeader;
idd_cdp_cmp_status_t<idd_blob::ChunkWriter> data;
idd_comm::shared_memory_footer_t memFooter;
};
//cdp_res_shared_struct_t cdp_res_struct;
#include "data_1553.h"
#include <vector>
static bool aesa_details=true;
static FILE* idb_fd;
static FILE* aesa_fd;
static unsigned int rep_print_mask=0x0F;
static void rep_vfprintf(const char* fmt, va_list args)
{
if (idb_fd && (rep_print_mask & 1))
vfprintf(idb_fd, fmt, args);
if (aesa_fd && (rep_print_mask & 2))
vfprintf(aesa_fd, fmt, args);
}
static void rep_fprintf(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
rep_vfprintf(fmt, args);
va_end(args);
}
static void rep_xprintf(float v)
{
rep_fprintf("%9.6f;", v);
}
static void rep_xprintf(uint16_t v)
{
rep_fprintf("%6u;", v);
}
static void rep_xprintf(uint8_t v)
{
rep_fprintf("%3u;", v);
}
class ItemReportFlow
{
public:
unsigned int flow_mask;
ItemReportFlow(unsigned int mask=0x0F):
flow_mask(mask)
{
}
};
class ItemBase
{
public:
const char* name;
const char* fmt;
int width;
bool diff;
ItemReportFlow flowMask;
virtual bool compare() { return false;}
virtual void actualize() {}
virtual bool compareExt()
{
bool r=compare();
if (r)
{
cmdio_pwarning("Changed: %s = %s", name, str());
}
return r;
}
virtual void printFiled()
{
print();
rep_fprintf(";");
}
virtual void print() {}
virtual const char* str() { return "?";}
void writeHeader()
{
rep_fprintf("%-*.*s;", width, width, name);
}
ItemBase(const char* iname, int iwidth, const char* ifmt, bool idiff, ItemReportFlow fm=ItemReportFlow());
bool outFlow(unsigned int n=0)
{
if (flowMask.flow_mask & (1<<n))
return true;
return false;
}
virtual ~ItemBase() {}
};
static std::vector<ItemBase*> idb;
ItemBase::ItemBase(const char* iname, int iwidth, const char* ifmt, bool idiff, ItemReportFlow fm):
name(iname),
fmt(ifmt),
width(iwidth),
diff(idiff),
flowMask(fm)
{
idb.push_back(this);
}
template<typename T_> class Item: public ItemBase
{
public:
typedef Item<T_> item_t;
Item(const char* iname, int iwidth, const char* ifmt, bool idiff, ItemReportFlow fm=ItemReportFlow()):
ItemBase(iname, iwidth, ifmt, idiff, fm)
{
//idb.push_back(this);
}
typedef T_ type;
type value;
type pvalue;
bool compare()
{
return diff && (value!=pvalue);
}
const char* str() override
{
static char s[128];
va_list args;
snprintf(s, sizeof s, fmt, value);
return s;
}
void print() override
{
rep_fprintf(fmt, value);
}
virtual void actualize()
{
pvalue=value;
}
virtual void set(type v) { value=v;}
};
class ItemString: public Item<std::string>
{
public:
ItemString(const char* iname, bool idiff=false):
Item(iname, 8, "%-8.8s", idiff)
{
}
void print() override
{
rep_fprintf(fmt, value.c_str());
}
};
class ItemStringSmall: public Item<std::string>
{
public:
ItemStringSmall(const char* iname, bool idiff=false):
Item(iname, 4, "%-4.4s", idiff)
{
}
void print() override
{
rep_fprintf(fmt, value.c_str());
}
};
class ItemUInt: public Item<unsigned int>
{
public:
ItemUInt(const char* iname, bool idiff=false):
Item(iname, 9, "%9u", idiff)
{
}
};
class ItemHex: public Item<unsigned int>
{
public:
ItemHex(const char* iname, bool idiff=false):
Item(iname, 10, "0x%8.8X", idiff)
{
}
};
class ItemUIntSmall: public Item<unsigned int>
{
public:
ItemUIntSmall(const char* iname, bool idiff=false):
Item(iname, 4, "%4u", idiff)
{
}
};
class ItemUIntSmallLatched: public Item<unsigned int>
{
public:
ItemUIntSmallLatched(const char* iname, bool idiff=false):
Item(iname, 4, "%4u", idiff)
{
}
void set(type v) override
{
value+=v;
}
void actualize() override
{
value=0;
}
};
class ItemInt: public Item<int>
{
public:
ItemInt(const char* iname, bool idiff=false):
Item(iname, 9, "%9i", idiff)
{
}
};
class ItemFloat: public Item<float>
{
public:
ItemFloat(const char* iname, bool idiff=false):
Item(iname, 12, "%12.3f", idiff)
{
}
};
class ItemFloatSmall: public Item<float>
{
public:
ItemFloatSmall(const char* iname, bool idiff=false):
Item(iname, 12, "%12.6f", idiff)
{
}
};
static ItemString itemTime("time", false);
static ItemUInt itemDfeBatch("Batch");
static ItemUInt itemDfeTime("TTAG", false);
static ItemStringSmall item1553StrMode("Mode", true);
static ItemUIntSmall itemDfeMode("Mode", true);
static ItemStringSmall itemDfeStrMode("Mode", false);
static ItemStringSmall itemDfeStrStby("STBY", true);
static ItemUInt itemAesaUpdate("A-Upd", false);
static ItemUIntSmall itemAesaState("A-State", true);
static ItemUInt itemAesaErr("A-Err", true);
static ItemUInt itemAesaOk("A-Ok", false);
static ItemUInt itemAesaCommErr("A-COM", false);
static ItemStringSmall itemAesaStr("AStr", false);
static ItemBase itemBreak("brk", 0, 0, false);
static ItemUIntSmall itemScale("Scale", true);
static ItemStringSmall itemStrScale("Scale", false);
static ItemUIntSmall itemDfeRad("Rad", true);
static ItemUIntSmall itemDfeWF("WF", true);
static ItemStringSmall itemDefWFStr("WF", false);
static ItemUIntSmall itemSarWF("SAR-WF", true);
static ItemHex itemDfeHealth("Health", true);
static ItemStringSmall itemAesaHealth("Health", false);
//static ItemUInt itemDspBatch("DSP-Batch");
static ItemUIntSmallLatched itemDet("Det");
static ItemUIntSmall itemStt("STT");
static ItemFloat itemTrueHeading("TrueHead");
static ItemFloat itemPAZ("Ptaz");
static ItemFloat itemBaroAlt("BatoAlt");
static ItemFloatSmall itemLat("Lat");
static ItemFloatSmall itemLon("Lon");
static bool rdrInStby=false;
static bool fix_sar;
struct hdr0_mini_t
{
uint32_t preamble[17-(6+3)];
uint32_t header_type;
uint32_t header_counter;
uint32_t ch_mask;
iddheader::ge_header_t ge;
//signal_mini_header_t hdr;
};
struct block_stat_t
{
unsigned int num;
unsigned int srcid;
const char* srcname;
block_stat_t(): num(0), srcid(0), srcname(0) {}
};
typedef std::map<std::string, block_stat_t> bmap_t;
struct blob_stat_t
{
unsigned int num;
unsigned int counter;
unsigned int batch;
void add(const char* s)
{
char fullname[512];
fullname[0]=0;
if (pp_srcname)
{
strcpy(fullname, pp_srcname);
strcat(fullname, ":");
strcat(fullname, s);
s=fullname;
}
#if 0
std::string fullname(s);
if (pp_srcname)
fullname=std::string(pp_srcname)+std::string(":")+fullname;
#endif
++bmap_[s].num;
bmap_[s].srcid=pp_srcid;
bmap_[s].srcname=pp_srcname;
}
bmap_t bmap_;
blob_stat_t(): num(0), counter(0), batch(0) {}
};
struct proc_stat_t
{
typedef std::map<std::string, blob_stat_t> blobmap_t;
unsigned int blocks;
unsigned int sign_corrupted;
blobmap_t bmap;
};
static proc_stat_t proc_stat;
class GhostLoggerCmdio: public GhostLogger
{
public:
//virtual void logError(const char* fmt, ...);
void vPrint(Level level, const char* fmt, va_list args) override
{
cmdio_severity_t log_level=cmdio_info;
switch(level)
{
default:
break;
case GhostLogger::debug:
log_level=cmdio_debug;
break;
case GhostLogger::trace:
log_level=cmdio_debug;
break;
case GhostLogger::success:
log_level=cmdio_success;
break;
case GhostLogger::warning:
break;
case GhostLogger::error:
log_level=cmdio_error;
break;
case GhostLogger::fatal:
case GhostLogger::fail:
log_level=cmdio_error;
break;
}
char buffer[2048];
vsnprintf(buffer, sizeof buffer, fmt, args);
if ((log_level==cmdio_error) && (rdrInStby))
{
}
else
cmdio_printf(log_level, "PP: %s", buffer);
}
};
class GrifoPlaybackReaderMemory: public GrifoPlaybackStreamReader
{
public:
const char* buffer;
stream_offset_t bsize;
const char* file_name;
stream_offset_t cursor;
GrifoPlaybackReaderMemory():
buffer(0),
bsize(0),
file_name("memory"),
cursor(0)
{
}
void setBuffer(const void* b, unsigned int size_bytes)
{
buffer=(const char*)b;
bsize=size_bytes;
cursor=0;
}
const char* streamName() const
{
return "memory";
}
bool streamOpen(const char* name) override
{
return true;
}
bool isOpen() override
{
return true;
}
void setAutorewind(bool /*ena*/)
{
}
void setStreamName(const char* name) override
{
file_name=name;
}
int read(void* datum, unsigned int size)
{
if (!datum)
return -1;
stream_offset_t tmp=cursor+size;
if (tmp<=bsize)
{
memcpy(datum, &buffer[cursor], size);
cursor+=size;
return size;
}
return -1;
}
template<typename T_> int readDatum(T_* datum) { return read(datum, sizeof *datum);}
stream_offset_t currentPosition() const override
{
return cursor;
}
const void* getDataPointer(stream_offset_t pos) const override
{
return &buffer[pos];
}
int setCurrentPosition(stream_offset_t pos)
{
if ((pos>=bsize) || (pos<0))
return 1;
cursor=pos;
return 0;
}
int moveCurrentPosition(stream_offset_t offset) override
{
stream_offset_t tmp=cursor+offset;
return setCurrentPosition(tmp);
}
bool eof() override
{
return cursor>=bsize;
}
virtual void rewind()
{
setCurrentPosition(0);
}
virtual bool error() { return false;}
void* data(stream_offset_t offset) { return (void*)&buffer[offset];}
~GrifoPlaybackReaderMemory()
{
}
};
static GrifoPlaybackReaderMemory memoryReader;
extern unsigned int* fpga_sum;
extern unsigned int fpga_sum_size;
struct BlockObserver
{
int hit;
FILE* fd;
FILE* sarFd;
const char* infile;
GrifoPlaybackStream::blockHandle hdrBlock;
GhostEifIpc::avionics_adaptor_message_store_t d1553;
uint32_t hdrBuffer[4096];
hdr0_mini_t* h; //=reinterpret_cast<hdr0_mini_t*>(hdrBuffer);
hdr0_mini_t fpgaHdr;
hdr0_mini_t dspHdr;
unsigned int d1553_time;
bool force_report;
int aesa_tx_pending;
int aesa_rx_pending;
unsigned int first_batch;
BlockObserver():
hit(0),
fd(0),
sarFd(0),
infile(0)
{
d1553_time=0;
resTxCursor=0;
force_report=false;
aesa_tx_pending=0;
aesa_rx_pending=0;
first_batch=0;
h=0;
}
void sarPrintf(const char* fmt, ...)
{
va_list args;
static char strbuffer[1024];
if (sarFd==0)
{
const char* fname_base=cmdio_get_proc_file(0);
snprintf(strbuffer, sizeof strbuffer, "sar-%s.txt", fname_base);
sarFd=fopen(strbuffer, "w");
}
if (!sarFd)
return;
va_start(args, fmt);
vsnprintf(strbuffer, sizeof strbuffer, fmt, args);
fprintf(sarFd, strbuffer);
va_end(args);
fflush(sarFd);
}
bool openFile()
{
if (pp_level<0)
return false;
if (fd)
return true;
infile=cmdio_get_proc_file(0);
char fname[512];
snprintf(fname, sizeof fname, "pp-%s.txt", infile);
fd=fopen(fname, "w");
if (!fd)
{
cmdio_oserror("PP history file %s", fname);
return false;
}
idb_fd=fd;
if (aesa_details)
{
snprintf(fname, sizeof fname, "pp-aesa-%s.txt", infile);
aesa_fd=fopen(fname, "w");
if (!aesa_fd)
{
cmdio_oserror("PP: AESA file %s", fname);
//return false;
}
}
rep_fprintf("%-32.32s;", "file");
for(auto i: idb)
{
if (i!=&itemBreak)
i->writeHeader();
}
rep_fprintf("-\n");
fflush(idb_fd);
return true;
}
void repUpdate(bool showAll=false)
{
static unsigned int p_time;
static unsigned int d1553_time_update;
if (!fd)
{
if (!openFile())
return;
}
rep_print_mask=0x0F;
bool changed=false;
for(auto i: idb)
{
changed=i->compareExt();
if (changed)
break;
}
if (pp_level>0)
{
unsigned int d_time=itemDfeTime.value-p_time;
static const unsigned int d_one_second=1000000/64;
if (d_time>=(d_one_second*(unsigned int)pp_level))
{
changed=true;
}
unsigned int d1553_delta=(d1553_time-d1553_time_update) & 0x00FFFF;
if ((d1553_delta*2)>=(unsigned int) pp_level)
{
changed=true;
}
if (changed)
{
p_time=itemDfeTime.value;
d1553_time_update=d1553_time;
}
}
if (showAll || changed || force_report)
{
//repPrintf("%s;%u",cmdio_get_proc_file(0),h->ge.signal.bacth_counter);
rep_fprintf("%-32.32s;", cmdio_get_proc_file(0));
for(auto i: idb)
{
if (i==&itemBreak)
{
rep_print_mask=0x2;
aesaDetails();
rep_print_mask=0x1;
continue;
}
i->printFiled();
i->actualize();
}
rep_print_mask=0x0F;
rep_fprintf("0\n");
}
force_report=false;
}
AesaDeserializer::DesResults res;
unsigned int resTxCursor;
AesaDeserializer::DesResults resTx[8];
void aesaDetails()
{
unsigned int tx_cursor=resTxCursor; //(resTxCursor-1) & 0x7;
if (aesa_tx_pending)
{
AesaDeserializer::DesResults& tx=resTx[tx_cursor];
rep_fprintf(">>>%3d;", tx.msg_num);
int n=tx.msg_num;
if (n>4)
{
n=4;
}
for(int i=0; i<n; ++i)
{
AesaDeserializer::DesResultMsg& m=tx.msg[i];
rep_fprintf("0x%02.2X;%u;%3u;%4d;%-12.12s;", m.id, m.area, m.tag, 0, m.name);
if (m.payload_id==1)
{
const auto& b=m.payload.beam_cmd;
rep_fprintf("%d;", m.payload_destination);
rep_xprintf(b.tx_freq);
rep_xprintf(b.rx_freq);
rep_xprintf(b.tx_u);
rep_xprintf(b.tx_v);
rep_xprintf(b.rx_u);
rep_xprintf(b.rx_v);
rep_xprintf(b.tx_ctrl_state_index);
rep_xprintf(b.tx_enable_pattern_index);
rep_xprintf(b.rx_ctrl_state_index);
rep_xprintf(b.rx_enable_pattern_index);
rep_xprintf(b.guard_rx_u);
rep_xprintf(b.guard_rx_v);
rep_xprintf(b.guard_rx_ctrl_state_index);
rep_xprintf(b.guard_rx_enable_pattern_index);
rep_xprintf(b.sync_divisor);
rep_xprintf(b.duty_ratio);
}
rep_fprintf(">;");
}
for(int i=n; i<4; ++i)
{
rep_fprintf("0x%02.2X;%u;%3u;%4d;%-12.12s;>;", 0, 0, 0, 0, "");
}
}
if (aesa_rx_pending)
{
int n=res.msg_num;
if (n>16)
{
n=16;
}
rep_fprintf("<<<%3d;", res.msg_num);
for(int i=0; i<n; ++i)
{
AesaDeserializer::DesResultMsg& m=res.msg[i];
rep_fprintf("0x%02.2X;%u;%3u;%4d;%-12.12s;", m.id, m.area, m.tag, m.error, m.name);
if (m.payload_id==1)
{
const auto& b=m.payload.cti_sts;
rep_fprintf("%2.2X;", b.byte_0.raw);
rep_fprintf("%2.2X;", b.byte_1.raw);
rep_fprintf("%2.2X;", b.byte_2.raw);
rep_fprintf("%d;", b.byte_3.cti_temperature);
}
rep_fprintf("<;");
}
}
aesa_tx_pending=0;
aesa_rx_pending=0;
}
void repPrintf(const char* fmt, ...)
{
if (!fd)
{
if (!openFile())
return;
}
va_list args;
va_start(args, fmt);
rep_vfprintf(fmt, args);
va_end(args);
}
void reportHeader(const hdr0_mini_t* h)
{
//repPrintf("%s;%u",cmdio_get_proc_file(0),h->ge.signal.bacth_counter);
}
void updateReport()
{
}
struct dbg_data_t
{
int wfId;
float azimuth;
float elevation;
float range_m;
float range_us;
float lsn_dly_us;
float lsn_len_us;
float deramp_dly_us;
unsigned int nrbin;
float bchirp;
float patch_len_us;
float prt;
unsigned int prt_ticks;
unsigned int deramp_ticks;
unsigned int lsn_dly_ticks;
unsigned int lsn_len_ticks;
unsigned int spare[6];
//SarLegacyMode::tracking_t trk;
unsigned int spare_trailer[14-8];
unsigned int trailing[128];
};
dbg_data_t dbg;
int cdpStsObserver(const GrifoPlaybackStream::blockHandle& b)
{
//repUpdate();
static cdp_res_shared_struct_t cdp_res_struct;
GrifoPlaybackStream::readBlockData(&cdp_res_struct, b, sizeof cdp_res_struct);
itemDfeBatch.value=cdp_res_struct.data.timetag.constData().batch_id;
itemDfeTime.value=cdp_res_struct.data.timetag.constData().time;
itemDfeRad.value=cdp_res_struct.data.status.constData().radiate;
itemDfeMode.value=cdp_res_struct.data.status.constData().mode;
itemDfeStrMode.value=m2str(itemDfeMode.value);
unsigned int cdp_health_status=cdp_res_struct.data.status.constData().health_status;
//unsigned int aesa_health_status=cdp_res_struct.data.status.constData().antenna_state;
itemDfeHealth.value=cdp_health_status;
if (cdp_health_status & 0x01000000)
itemAesaHealth.value="COM";
else
itemAesaHealth.value="";
//itemAesaHealth.value=cdp_res_struct.data.status.constData().antenna_state;
itemDfeWF.value=cdp_res_struct.data.status.constData().waveform;
itemDefWFStr.value=wf2str(itemDfeWF.value);
itemDet.set(cdp_res_struct.data.detections.constData().num_of_detected_tgts);
repUpdate();
return 0;
}
int fpgaHeaderObserver(const GrifoPlaybackStream::blockHandle& b)
{
//repPrintf("\n");
hit=1;
hdrBlock=b;
GrifoPlaybackStream::scanFpgaHeader(hdrBuffer, 0, hdrBlock);
/*hdr0_mini_t* */h=reinterpret_cast<hdr0_mini_t*>(hdrBuffer);
fpgaHdr=*h;
//reportHeader(h);
//++proc_stat.bmap[std::string("PP")].bmap["FPGA-HDR"].num;
proc_stat.bmap[std::string("PP")].add("FPGA-HDR");
return 0;
}
int sigObserver(const GrifoPlaybackStream::blockHandle& b, const char* name, unsigned int* sig_cmp=0, int zero_check=0)
{
if (pp_level>=5)
{
static unsigned int sum_counter;
static unsigned s_size;
unsigned int expected_size=(dspHdr.ge.signal.packet_descr.npri*dspHdr.ge.signal.packet_descr.nrbin)*4;
unsigned int batch=b.s_counter-first_batch;
if ((pp_level>20) || ((b.size!=s_size) && (pp_level>5)))
{
unsigned int x=b.size-(expected_size+56);
cmdio_pwarning("%s %u(%u) size: %u -> %u (%u) <- %u (%u) [%u,%u]",
name, b.s_counter, batch, s_size, b.size, sum_counter, expected_size, x, dspHdr.ge.signal.packet_descr.npri, dspHdr.ge.signal.packet_descr.nrbin);
}
unsigned char* p=(unsigned char*)GrifoPlaybackStream::getDataPointer(b);
for(unsigned int i=16; i<(b.size-32); ++i)
{
uint32_t* d32=(uint32_t*)&p[i];
if (d32[0]==0x5a5a5a5a)
{
auto bsw=GrifoPlaybackStream::tryDecodeSoftReference(&p[i]);
cmdio_perror("%s %u(%u): Marker inside signal +%u: %s: %u", name, b.s_counter, batch, i, &p[i+68], bsw.s_counter);
//break;
++proc_stat.sign_corrupted;
i+=4;
}
}
if (sig_cmp)
{
static unsigned int fpga_x[128];
uint32_t* d32_base=(uint32_t*)&p[0];
uint32_t* d32=&d32_base[10];
unsigned int zs=dspHdr.ge.signal.packet_descr.npri*dspHdr.ge.signal.packet_descr.nrbin;
if (fpga_sum_size<(zs*4))
{
cmdio_perror("%s %u(%u): FPGA[%u,%u] too small %u", fpga_sum_size);
}
for(unsigned int i=0; i<zs; ++i)
{
unsigned int v_dsp=d32[i];
unsigned int v_sig=sig_cmp[i];
fpga_x[i & 0x07F]=v_dsp-v_sig;
if (v_dsp!=v_sig)
{
cmdio_perror("%s %u(%u): FPGA[%u,%u]->DSP mismatch @%u [%u,%u] 0x%X != 0x%X",
name, b.s_counter, batch,
dspHdr.ge.signal.packet_descr.npri,
dspHdr.ge.signal.packet_descr.nrbin,
i,
i/dspHdr.ge.signal.packet_descr.nrbin,
i-((i/dspHdr.ge.signal.packet_descr.nrbin)*dspHdr.ge.signal.packet_descr.nrbin),
v_sig, v_dsp
);
break;
}
}
}
if (zero_check)
{
int zero=0;
uint32_t* d32=(uint32_t*)&p[32];
unsigned int zs=(b.size>>2)-128;
for(unsigned int i=0; i<zs; ++i)
{
if (d32[i]==0)
{
++zero;
if (zero>zero_check)
{
cmdio_perror("%s %u(%u): Zeros inside signal +%u: %d", name, b.s_counter, batch, i, zero);
//break;
++proc_stat.sign_corrupted;
break;
}
}
else
zero=0;
}
}
s_size=b.size;
++sum_counter;
}
return 0;
}
int sumObserver(const GrifoPlaybackStream::blockHandle& b)
{
return sigObserver(b, "SUM", fpga_sum, 12);
}
int dazObserver(const GrifoPlaybackStream::blockHandle& b)
{
return sigObserver(b, "DAZ");
}
int delObserver(const GrifoPlaybackStream::blockHandle& b)
{
return sigObserver(b, "DEL");
}
int guardObserver(const GrifoPlaybackStream::blockHandle& b)
{
return sigObserver(b, "GUA");
}
int dspHeaderObserver(const GrifoPlaybackStream::blockHandle& b)
{
//repPrintf("\n");
hit=1;
hdrBlock=b;
hdrBlock.offset-=44;
hdrBlock.size+=44;
hdr0_mini_t* hfix=reinterpret_cast<hdr0_mini_t*>(memoryReader.data(hdrBlock.offset));
GrifoPlaybackStream::scanFpgaHeader(hdrBuffer, 0, hdrBlock);
if (fix_sar)
{
//if (b.size<sizeof dbg)
{
const float k_lsn_fix=0; //+33
float lsn_56=dbg.lsn_dly_us*56;
unsigned int t=ceilf(lsn_56)+k_lsn_fix; //+33;
dbg.lsn_dly_ticks=t;
lsn_56=dbg.deramp_dly_us*56;
t=ceilf(lsn_56);
dbg.deramp_ticks=t;
lsn_56=dbg.lsn_len_us*56;
t=ceilf(lsn_56);
dbg.lsn_len_ticks=t;
//float lsn_recalc=t/56.0f;
}
if (hfix)
{
static bool sar_hdr_fixed;
if (!sar_hdr_fixed)
{
cmdio_pwarning("Fixing SAR headers");
sar_hdr_fixed=true;
}
{//Fix SAR Header
auto t2us=[](unsigned int v) -> float { return v/56.0f;}; //TODO: use a function from Timer
//float* f=reinterpret_cast<float*>(&(hdrin->header.ge.general_settings.waveform.spare[1]));
//hdrin->header.ge.general_settings.waveform.spare[0]=dbg.wfId;
hfix->ge.general_settings.waveform.wfcode=dbg.wfId;
hfix->ge.function_settings.pe_settings.deramp_dly_us=t2us(dbg.deramp_ticks); //dbg.deramp_dly_us;
hfix->ge.function_settings.pe_settings.lsn_dly_us=t2us(dbg.lsn_dly_ticks); //dbg.lsn_dly_us;
hfix->ge.function_settings.pe_settings.lsn_len_us=t2us(dbg.lsn_len_ticks); //dbg.lsn_len_us;
hfix->ge.function_settings.pe_settings.tgt_altitude=0;
hfix->ge.function_settings.pe_settings.tgt_longitude=hfix->ge.general_settings.navigation.geo_pos.lon_rad;
hfix->ge.function_settings.pe_settings.tgt_latitude=hfix->ge.general_settings.navigation.geo_pos.lat_rad;
hfix->ge.function_settings.pe_settings.tgt_band=0;
hfix->ge.function_settings.pe_settings.clutter_band=0;
hfix->ge.function_settings.pe_settings.rb_start=0;
hfix->ge.function_settings.pe_settings.rb_stop=0;
//cmdio_pwarning("dly %f", hfix->ge.function_settings.pe_settings.deramp_dly_us);
//compute_sar_target(hdrin->header);
}
}
}
dspHdr=*hfix;
if (first_batch==0)
first_batch=dspHdr.ge.signal.bacth_counter;
if (pp_level>10)
{
cmdio_pwarning("DSPHDR %u: Expected signal: [%u,%u]", dspHdr.ge.signal.bacth_counter, dspHdr.ge.signal.packet_descr.npri, dspHdr.ge.signal.packet_descr.nrbin);
}
//fpgaHdr=*h;
//reportHeader(h);
//++proc_stat.bmap[std::string("PP")].bmap["HDRDSP"].num;
proc_stat.bmap[std::string("PP")].add("HDR");
return 0;
}
static float w2f(uint16_t w0, uint16_t w1, float lsb)
{
int32_t tmp32=((unsigned int)w0)<<16 | ((unsigned int)w1);
return tmp32*lsb;
}
int d1553Observer(const GrifoPlaybackStream::blockHandle& b)
{
bool ok=GrifoPlaybackStream::readBlockData(&d1553, b, sizeof d1553);
if (!ok)
return 0;
//if (ok) GhostEifIpc::update1553(&d1553.d);
//uint16_t a5_tt=d1553.d.a5[1];
//char time_of_mission[128];
double lat=0;
double lon=0;
//uint16_t date=d1553.d.a1[5];
uint16_t time=d1553.d.a1[6];
d1553_time=time;
unsigned int tt=time*2;
unsigned int h=tt/3600;
unsigned int m=(tt-h*3600)/60;
unsigned int s=(tt-(h*3600+m*60));
int tmp32=((unsigned int)d1553.d.a4[23])<<16 | ((unsigned int)d1553.d.a4[24]);
lat=tmp32*ICD1553_GEOPOS_DEG_LSB;
//tmp32=((unsigned int)d1553.a4[25])<<16 | ((unsigned int)d1553.a4[26]);
//lon=tmp32*ICD1553_GEOPOS_DEG_LSB;
lon=w2f(d1553.d.a4[25], d1553.d.a4[26], ICD1553_GEOPOS_DEG_LSB);
float ele=d1553.d.a4[9]*ICD1553_BARO_ALT_METERS_LSB;
char buffer[128];
snprintf(buffer, sizeof buffer, "%02u:%02u:%02u", h, m, s);
itemTime.value=buffer;
itemBaroAlt.value=ele;
itemLat.value=lat;
itemLon.value=lon;
float thead=((signed short)d1553.d.a4[2])*ICD1553_SEMICIRCLE_DEG_LSB;
//float mhead=((signed short)d1553.d.a4[3])*ICD1553_SEMICIRCLE_DEG_LSB;
float ptaz=((signed short)d1553.d.a5[8])*ICD1553_SEMICIRCLE_DEG_LSB;
itemTrueHeading.value=thead;
itemPAZ.value=ptaz;
unsigned int mode=(d1553.d.a2[0]>>12) & 0x0F;
item1553StrMode.value=m1553str(mode);
return 0;
}
int cmpcObserver(const GrifoPlaybackStream::blockHandle& b)
{
static dbg_t cmp;
GrifoPlaybackStream::readBlockData(&cmp, b, sizeof cmp);
const char* scale="?";
switch(cmp.mode.range_scale)
{
case 0: scale="??NM"; break;
case 1: scale="10NM"; break;
case 2: scale="20NM"; break;
case 3: scale="40NM"; break;
case 4: scale="80NM"; break;
default:
break;
}
itemStrScale.value=scale;
itemScale.value=cmp.mode.range_scale;
const char* stby="RAD";
if (cmp.mode.stby)
{
rdrInStby=true;
stby="STBY";
}
else
{
if (!cmp.mode.radiate)
stby="SIL";
rdrInStby=false;
}
if ((d1553.d.a2[0]>>6) & 0x1)
{
stby="STBY";
rdrInStby=true;
}
itemDfeStrStby.value=stby;
return 0;
}
int detrObserver(const GrifoPlaybackStream::blockHandle& b)
{
return 0;
}
int sttdObserver(const GrifoPlaybackStream::blockHandle& b)
{
return 0;
}
int mttrObserver(const GrifoPlaybackStream::blockHandle& b)
{
return 0;
}
int sarObserver(const GrifoPlaybackStream::blockHandle& b)
{
//dbg_data_t dbg;
GrifoPlaybackStream::readBlockData(&dbg, b, b.size);
itemSarWF.value=dbg.wfId;
#if 0
float lsn_56=dbg.lsn_dly_us*56;
unsigned int t=ceilf(lsn_56);
float lsn_recalc=t/56.0f;
float lsn_recalc32=math32_div(t, 56.0f);
unsigned int t32=ceilf(math32_mul(lsn_recalc32, 56));
float err=lsn_recalc-lsn_recalc32;
sarPrintf("%f,%f: TGT: %24.12f t56: %24.12f ticks: %u LSN: %24.12f ERR: %24.12f t32: %u LSN32: %24.12f ERR: %24.12f\n",
dbg.azimuth,
dbg.range_m,
dbg.lsn_dly_us, lsn_56,
t, lsn_recalc, lsn_recalc-dbg.lsn_dly_us,
t32, lsn_recalc32,
err);
#endif
return 0;
}
int aesaRxObserver(const GrifoPlaybackStream::blockHandle& b)
{
static antenna_reply_buffer_t saved;
GrifoPlaybackStream::readBlockData(&saved, b, sizeof saved);
{
const antenna_reply_buffer_t* x=&saved; //(raw_antenna_reply_buffer_t*)&(((uint32_t*)aesax)[36]);
//unsigned int delta=x->msg_count_errors-saved.msg_count_errors;
//unsigned int edelta=x->rxerr-saved.rxerr;
//unsigned int tdelta=x->timeouterr-saved.timeouterr;
itemAesaUpdate.value=x->updates;
itemAesaState.value=x->hstate;
itemAesaErr.value=x->msg_count_errors;
const char* res_str=AesaDeserializer::desResponse(&res, x->data, sizeof x->data);
itemAesaStr.value=res_str;
itemAesaOk.value=res.ok;
itemAesaCommErr.value=res.errors;
#if 0
const char* errstr="OK";
if (x->pri_err>=0)
{
cmdio_pwarning("(%u) AESA PRI Error: %d", out_line, x->pri_err);
errstr="ERR";
}
fprintf(tfd, "%3s;%6u;%6u;%6u;%4d;%5d", errstr, delta, edelta, tdelta, x->pri_err, prog_min_time);
saved=*x;
#endif
}
++aesa_rx_pending;
//force_report=true;
return 0;
}
int aesaTxObserver(const GrifoPlaybackStream::blockHandle& b)
{
static antenna_cmd_buffer_t saved;
GrifoPlaybackStream::readBlockData(&saved, b, sizeof saved);
resTxCursor=0;//(resTxCursor+1) & 0x7;
AesaDeserializer::desCommand(&resTx[resTxCursor], saved.data, sizeof saved.data);
++aesa_tx_pending;
//force_report=true;
return 0;
}
static int promObserver(GrifoPlaybackStream::block_observer_cookie_t cookie, const GrifoPlaybackStream::blockHandle& handle);
#if 0
{
++proc_stat.bmap[std::string("PP")].num;
++proc_stat.bmap[std::string("PP")].bmap[handle.name].num;
repUpdate();
return 0;
}
#endif
void playback_initizalize()
{
GrifoPlaybackStream::registerMethodBlockObserver("D1553", *this, &BlockObserver::d1553Observer);
//GrifoPlaybackStream::registerMethodBlockObserver("EXT CMPC", *this, &dfe_playback_t::cmpcObserver);
GrifoPlaybackStream::registerMethodBlockObserver("CDPSTS", *this, &BlockObserver::cdpStsObserver);
GrifoPlaybackStream::registerMethodBlockObserver("SUM", *this, &BlockObserver::sumObserver);
GrifoPlaybackStream::registerMethodBlockObserver("GUARD", *this, &BlockObserver::guardObserver);
GrifoPlaybackStream::registerMethodBlockObserver("DAZ", *this, &BlockObserver::dazObserver);
GrifoPlaybackStream::registerMethodBlockObserver("DEL", *this, &BlockObserver::delObserver);
GrifoPlaybackStream::registerMethodBlockObserver("DSPHDRIN", *this, &BlockObserver::dspHeaderObserver);
GrifoPlaybackStream::registerMethodBlockObserver("DISPHEAD", *this, &BlockObserver::fpgaHeaderObserver);
GrifoPlaybackStream::registerMethodHeaderObserver("EXT CMPC", *this, &BlockObserver::cmpcObserver);
GrifoPlaybackStream::registerMethodHeaderObserver("EXT DETR", *this, &BlockObserver::detrObserver);
GrifoPlaybackStream::registerMethodHeaderObserver("EXT STTD", *this, &BlockObserver::sttdObserver);
GrifoPlaybackStream::registerMethodHeaderObserver("EXT MTTR", *this, &BlockObserver::mttrObserver);
GrifoPlaybackStream::registerMethodHeaderObserver("EXT SARR", *this, &BlockObserver::sarObserver);
GrifoPlaybackStream::registerMethodBlockObserver("AESATX", *this, &BlockObserver::aesaTxObserver);
GrifoPlaybackStream::registerMethodBlockObserver("AESARX", *this, &BlockObserver::aesaRxObserver);
GrifoPlaybackStream::registerPromisucousBlockObserver(&BlockObserver::promObserver, 0);
}
};
static BlockObserver blockObserver;
int BlockObserver::promObserver(GrifoPlaybackStream::block_observer_cookie_t cookie, const GrifoPlaybackStream::blockHandle& handle)
{
++proc_stat.bmap[std::string("PP")].num;
//++proc_stat.bmap[std::string("PP")].bmap[handle.name].num;
proc_stat.bmap[std::string("PP")].add(handle.name);
blockObserver.repUpdate();
return 0;
}
void postprocess_fixsar(bool fixit)
{
fix_sar=fixit;
}
void postprocess_initialize(int level)
{
pp_level=level;
//if (pp_level<0)
// return;
static GhostLoggerCmdio logger;
Ghost::setLoggerInterface(&logger);
GrifoPlaybackStream::setReaderInterface(&memoryReader);
blockObserver.playback_initizalize();
}
void postprocess_block(unsigned int srcid, const char* srcname, const void* buffer, unsigned int size)
{
if (pp_level<-1)
return;
pp_srcid=srcid;
pp_srcname=srcname;
//if (pp_level<0) return;
//cmdio_printf(cmdio_warning, "PP %u", size);
memoryReader.setBuffer(buffer, size);
GrifoPlaybackStream::reset();
for(;;)
{
GrifoPlaybackStream::marker_t m=GrifoPlaybackStream::nextBlock();
if (m.value==0)
break;
}
}
void postprocess_print_summary()
{
for(auto b: proc_stat.bmap)
{
cmdio_pinfo("%-32.32s: %u", "Postprocess", b.second.num);
for(auto c: b.second.bmap_)
{
if (c.second.srcname)
cmdio_pinfo(" %-32.32s: %u", c.first.c_str(), c.second.num);
else
{
cmdio_pinfo(" @2X:%-28.28s: %u", c.second.srcid, c.first.c_str(), c.second.num);
}
}
}
if (proc_stat.sign_corrupted)
cmdio_perror("%u corrupted signal block(s)", proc_stat.sign_corrupted);
}