206 lines
4.7 KiB
C++
206 lines
4.7 KiB
C++
/*
|
|
* xlru_mex.cpp
|
|
*
|
|
*/
|
|
|
|
#include "mex.h"
|
|
|
|
#include "xlru_manager.h"
|
|
|
|
#include "xlru_psm.h"
|
|
#include "xlru_pps.h"
|
|
#include "xlru_lcu.h"
|
|
|
|
#include "xlru_comm.h"
|
|
|
|
#ifndef _TMS320C6X
|
|
#ifdef __GNUC__
|
|
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
|
#endif
|
|
#endif
|
|
|
|
static int show_unit;
|
|
|
|
static int lcu_map;
|
|
static int pps_map;
|
|
static int psm_map;
|
|
static int q_udp_mon;
|
|
|
|
static const mex_cmd_param_descriptor_t start_table[] =
|
|
{
|
|
{ "psm", "PSM channel", 0, &psm_map, &mex_mt_int },
|
|
{ "pps", "PPS Channel", 0, &pps_map, &mex_mt_int },
|
|
{ "lcu", "LCU Channel", 0, &lcu_map, &mex_mt_int },
|
|
|
|
{ "m", "enabled UDP monitor", mex_cmd_qualifier, &q_udp_mon, &mex_mt_uint},
|
|
|
|
#if 0
|
|
{ "c", "copy configuration", mex_cmd_qualifier, &ip_remap_copy, &mex_mt_uint},
|
|
{ "d", "enable DAC", mex_cmd_qualifier, &ip_dac_ena, &mex_mt_uint},
|
|
{ "p", "copy palet", mex_cmd_qualifier, &ip_palet_copy, &mex_mt_uint},
|
|
#endif
|
|
MEX_TABLE_END
|
|
};
|
|
|
|
extern void xlru_channel_map(unsigned int psm, unsigned int pps, unsigned int lcu);
|
|
|
|
static mex_res_t Cmd_Start(void)
|
|
{
|
|
xlru_channel_map(psm_map, pps_map, lcu_map);
|
|
|
|
if (mex_param_is_present(&q_udp_mon))
|
|
{
|
|
xlru_comm_udp_monitor_enable(true); //q_udp_mon>0);
|
|
}
|
|
|
|
return mex_ok;
|
|
}
|
|
|
|
static const mex_cmd_descriptor_t cmd_start=
|
|
{ "start", "start XLRU manager", (mex_cmd_handler_t) Cmd_Start, start_table};
|
|
|
|
|
|
static const mex_cmd_param_descriptor_t show_table[] =
|
|
{
|
|
{ "unit", "unit details", 0, &show_unit, &mex_mt_int },
|
|
MEX_TABLE_END
|
|
};
|
|
|
|
static void show_basic_status(const char* name, const XLruManager::unit_status_t& sts, const xlru_counter_t& cntr)
|
|
{
|
|
mex_printf(" %s: %s T=%s, link=%s (%5u/%5u) le=%5u (%12.12s)\n", name,
|
|
sts.basicStatus.unitOk ? "OK " : "FAIL",
|
|
sts.basicStatus.overtempHazard ? "HAZARD" : (sts.basicStatus.overtempWarning ? "WARN " : "NORMAL"),
|
|
sts.commStatus.linkUp ? "UP " : "DOWN", //psm.status.commStatus.commDeviceOk ? "OK " : "FAIL",
|
|
sts.commStatus.good_messages & 0x0FFFF,
|
|
sts.commStatus.error_messages & 0xFFFF,
|
|
cntr.rx_mess_error & 0xFFFF, cntr.last_error);
|
|
}
|
|
|
|
static mex_res_t Cmd_Status(void)
|
|
{
|
|
if (mex_param_loop())
|
|
mex_page_loop_init(1);
|
|
do
|
|
{
|
|
mex_page_loop_top();
|
|
|
|
const XLruManager::manager_status_t& m=XLruManager::managerStatus();
|
|
mex_printf("OUT: %5u (%5u), IN: %5u (%5u/%5u), b: %5u (%5u), \n",
|
|
m.poroduce_messages & 0x0FFFF,
|
|
m.transmitted_bytes & 0x0FFFF,
|
|
m.good_messages & 0x0FFFF,
|
|
m.error_messages & 0x0FFFF,
|
|
m.received_messages & 0x0FFFF,
|
|
m.received_bytes & 0x0FFFF,
|
|
m.received_garbage & 0x0FFFF);
|
|
const XLruManager::psm_status_t& psm=XLruManager::psmStatus();
|
|
show_basic_status("PSM", psm.status, xlru_psm::xlru_counter);
|
|
|
|
const XLruManager::pps_status_t& pps=XLruManager::ppsStatus();
|
|
show_basic_status("PPS", pps.status, xlru_pps::xlru_counter);
|
|
|
|
const XLruManager::lcu_status_t& lcu=XLruManager::lcuStatus();
|
|
show_basic_status("LCU", lcu.status, xlru_lcu::xlru_counter);
|
|
|
|
if (mex_param_is_present(&show_unit))
|
|
{
|
|
switch(show_unit)
|
|
{
|
|
case 0:
|
|
xlru_psm::xlru_display(mex_printf);
|
|
break;
|
|
case 1:
|
|
xlru_pps::xlru_display(mex_printf);
|
|
break;
|
|
case 2:
|
|
xlru_lcu::xlru_display(mex_printf);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
} while (mex_page_loop_end(0, 0) != mex_page_event_quit);
|
|
|
|
return mex_ok;
|
|
}
|
|
|
|
static const mex_cmd_descriptor_t cmd_status=
|
|
{ "status", "XLRU status", (mex_cmd_handler_t) Cmd_Status, show_table};
|
|
|
|
static mex_res_t Cmd_Recycle(void)
|
|
{
|
|
XLruManager::psmRecycle(true);
|
|
|
|
return mex_ok;
|
|
}
|
|
|
|
static const mex_cmd_descriptor_t cmd_recycle=
|
|
{ "recycle", "PSM recyle", (mex_cmd_handler_t) Cmd_Recycle, 0};
|
|
|
|
static mex_res_t Cmd_Poweroff(void)
|
|
{
|
|
XLruManager::psmPowerDown(true);
|
|
|
|
return mex_ok;
|
|
}
|
|
|
|
static const mex_cmd_descriptor_t cmd_poweroff=
|
|
{ "psmoff", "PSM OFF", (mex_cmd_handler_t) Cmd_Poweroff, 0};
|
|
|
|
|
|
static void oob_handler(char c)
|
|
{
|
|
mex_putchar_nomore(c);
|
|
}
|
|
|
|
static mex_res_t Cmd_Bridge(void)
|
|
{
|
|
XLruManager::setOutOfBandDataHandler(oob_handler);
|
|
for(;;)
|
|
{
|
|
int c=mex_getch();
|
|
if (c=='Q')
|
|
break;
|
|
if (c=='\r')
|
|
XLruManager::injectOutofBandData('\n');
|
|
else
|
|
XLruManager::injectOutofBandData(c);
|
|
}
|
|
XLruManager::setOutOfBandDataHandler(0);
|
|
|
|
return mex_ok;
|
|
}
|
|
|
|
static const mex_cmd_descriptor_t cmd_bridge=
|
|
{ "bridge", "XLRU bridge", (mex_cmd_handler_t) Cmd_Bridge, 0};
|
|
|
|
static const mex_mt_object_t xlru_str_lists[]=
|
|
{
|
|
MEX_CMD_REF("start", &cmd_start),
|
|
MEX_CMD_REF("status", &cmd_status),
|
|
MEX_CMD_REF("bridge", &cmd_bridge),
|
|
MEX_CMD_REF("recyle", &cmd_recycle),
|
|
MEX_CMD_REF("psmoff", &cmd_poweroff),
|
|
|
|
|
|
{0}
|
|
};
|
|
|
|
static const mex_mt_struct_t xlru_mt=
|
|
{{"xlru", 0, &mex_mt_struct_methods}, xlru_str_lists};
|
|
|
|
|
|
static mex_mt_object_t xlru_obj={
|
|
0, "xlru", &MEX_MT_CAST(xlru_mt), 0
|
|
};
|
|
|
|
|
|
void xlru_mex_initialize()
|
|
{
|
|
mex_object_register(mex_object_root(), &xlru_obj);
|
|
}
|
|
|
|
|
|
|