summaryrefslogtreecommitdiff
path: root/mcast/tool/.svn/text-base/netcvdiag.c.svn-base
diff options
context:
space:
mode:
Diffstat (limited to 'mcast/tool/.svn/text-base/netcvdiag.c.svn-base')
-rw-r--r--mcast/tool/.svn/text-base/netcvdiag.c.svn-base433
1 files changed, 433 insertions, 0 deletions
diff --git a/mcast/tool/.svn/text-base/netcvdiag.c.svn-base b/mcast/tool/.svn/text-base/netcvdiag.c.svn-base
new file mode 100644
index 0000000..5b6e490
--- /dev/null
+++ b/mcast/tool/.svn/text-base/netcvdiag.c.svn-base
@@ -0,0 +1,433 @@
+/*------------------------------------------------------------------------
+ * netcvdiag - NetCeiver diagnosis tool
+ *
+ *------------------------------------------------------------------------*/
+
+#include "headers.h"
+
+#ifdef __MINGW32__
+#include <getopt.h>
+#endif
+
+#ifdef API_SOCK
+
+/*------------------------------------------------------------------------*/
+#define API_WAIT_RESPONSE(cmd) { cmd->state=API_REQUEST; \
+ send (sock_comm, &sock_cmd, sizeof(api_cmd_t), 0); \
+ recv (sock_comm, &sock_cmd, sizeof(api_cmd_t), 0); \
+ if (cmd->state == API_ERROR) warn ( "SHM parameter error\n");}
+
+int sock_comm;
+
+int nc_api_init(char *path)
+{
+ int sock_name_len = 0;
+ struct sockaddr_un sock_name;
+ sock_name.sun_family = AF_UNIX;
+
+ strcpy(sock_name.sun_path, path);
+ sock_name_len = sizeof(struct sockaddr_un);
+
+ if((sock_comm = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
+ {
+ warn ("socket create failure %d\n", errno);
+ return -1;
+ }
+
+ if (connect(sock_comm, (struct sockaddr*)&sock_name, sock_name_len) < 0) {
+ warn ("connect failure to %s: %s\n",path, strerror(errno));
+ return -1;
+ }
+ return 0;
+}
+#endif
+#ifdef API_WIN
+/*------------------------------------------------------------------------*/
+#define API_WAIT_RESPONSE(cmd) { cmd->state=API_REQUEST; \
+ WriteFile( hPipe, &sock_cmd, sizeof(api_cmd_t), &cbWritten, NULL); \
+ ReadFile( hPipe, &sock_cmd, sizeof(api_cmd_t), &cbRead, NULL); \
+ if (cmd->state == API_ERROR) {warn ( "SHM parameter error, incompatible versions?\n"); exit(-1);}}
+
+HANDLE hPipe;
+DWORD cbRead, cbWritten;
+
+int nc_api_init(char *path)
+{
+ hPipe = CreateFile(
+ TEXT("\\\\.\\pipe\\mcli"), // pipe name
+ GENERIC_READ | // read and write access
+ GENERIC_WRITE,
+ 0, // no sharing
+ NULL, // default security attributes
+ OPEN_EXISTING, // opens existing pipe
+ 0, // default attributes
+ NULL); // no template file
+
+ if (hPipe == INVALID_HANDLE_VALUE) {
+ warn("CreatePipe failed");
+ return -1;
+ }
+ return 0;
+}
+#endif
+/*------------------------------------------------------------------------*/
+void usage(void)
+{
+ fprintf(stderr,
+ "netcvdiag - NetCeiver diagnosis tool, version " MCLI_VERSION_STR "\n"
+ "(c) BayCom GmbH\n"
+ "Usage: netcvdiag <options>\n"
+ "Options: -a Show all\n"
+ " -u Show UUIDs\n"
+ " -t Show tuners\n"
+ " -c Get NetCeiver count\n"
+ " -S Show satellite settings\n"
+ " -s Show tuner state\n"
+ " -r <n> Repeat every n seconds\n"
+ " -v Show HW/SW-versions\n"
+ " -P <path> Set API socket\n"
+ );
+ exit(0);
+}
+/*------------------------------------------------------------------------*/
+void show_it(int show_count, int show_uuids, int show_tuners, int show_sats, int show_versions, int show_cams)
+{
+ int nc_num;
+ int i;
+ time_t now=time(0);
+ api_cmd_t sock_cmd;
+ api_cmd_t *api_cmd=&sock_cmd;
+
+ api_cmd->cmd=API_GET_NC_NUM;
+ api_cmd->magic = MCLI_MAGIC;
+ api_cmd->version = MCLI_VERSION;
+
+ API_WAIT_RESPONSE(api_cmd);
+ if(api_cmd->magic != MCLI_MAGIC || api_cmd->version != MCLI_VERSION) {
+ info("API version mismatch!\n");
+ return;
+ }
+ if (show_count)
+ printf("Count: %i\n", api_cmd->parm[API_PARM_NC_NUM]);
+ nc_num=api_cmd->parm[API_PARM_NC_NUM];
+
+ for(i=0;i<nc_num;i++) {
+ api_cmd->cmd=API_GET_NC_INFO;
+ api_cmd->parm[API_PARM_NC_NUM]=i;
+ API_WAIT_RESPONSE(api_cmd);
+ if(api_cmd->u.nc_info.magic != MCLI_MAGIC || api_cmd->u.nc_info.version != MCLI_VERSION) {
+ err("API version mismatch!\n");
+ }
+ if (show_uuids||show_versions) {
+ char buf[UUID_SIZE];
+ if(strlen(api_cmd->u.nc_info.Description)) {
+ sprintf(buf, "%s, ", api_cmd->u.nc_info.Description);
+ } else {
+ buf[0]=0;
+ }
+ printf("NetCeiver %i:\n"
+ " UUID <%s>, %s%s, tuners %d\n",
+ i,
+ api_cmd->u.nc_info.uuid,
+ buf,
+ (unsigned int) api_cmd->u.nc_info.lastseen<(now-10)?"DEAD":"ALIVE",
+ api_cmd->u.nc_info.tuner_num);
+ }
+ if (show_versions) {
+ printf(" OS <%s>, App <%s>, FW <%s>, HW <%s>\n",
+ api_cmd->u.nc_info.OSVersion, api_cmd->u.nc_info.AppVersion,
+ api_cmd->u.nc_info.FirmwareVersion, api_cmd->u.nc_info.HardwareVersion
+ );
+ printf(" Serial <%s>, Vendor <%s>, state %i\n",
+ api_cmd->u.nc_info.Serial, api_cmd->u.nc_info.Vendor, api_cmd->u.nc_info.DefCon);
+ printf(" SystemUptime %d, ProcessUptime %d\n",
+ (int)api_cmd->u.nc_info.SystemUptime, (int)api_cmd->u.nc_info.ProcessUptime);
+ printf(" TunerTimeout %d\n",
+ (int)api_cmd->u.nc_info.TunerTimeout);
+ }
+ if (show_cams) {
+ int i;
+ for (i = 0; i < api_cmd->u.nc_info.cam_num; i++) {
+ char *camstate="";
+ char *cammode="";
+
+ switch(api_cmd->u.nc_info.cam[i].status) {
+ case DVBCA_CAMSTATE_MISSING:
+ camstate="MISSING"; break;
+ case DVBCA_CAMSTATE_INITIALISING:
+ camstate="INIT"; break;
+ case DVBCA_CAMSTATE_READY:
+ camstate="READY"; break;
+ }
+ switch(api_cmd->u.nc_info.cam[i].flags) {
+ case CA_SINGLE:
+ cammode="CA_SINGLE";break;
+ case CA_MULTI_SID:
+ cammode="CA_MULTI_SID";break;
+ case CA_MULTI_TRANSPONDER:
+ cammode="CA_MULTI_TRANSPONDER";break;
+ }
+ printf(" CI-Slot %d: State <%s>, Mode <%s>, CAPMT-Flag: %d, SIDs %d/%d, CAM <%s>\n", api_cmd->u.nc_info.cam[i].slot, camstate, cammode, api_cmd->u.nc_info.cam[i].capmt_flag, api_cmd->u.nc_info.cam[i].use_sids, api_cmd->u.nc_info.cam[i].max_sids, api_cmd->u.nc_info.cam[i].menu_string);
+ }
+ }
+ if (show_tuners) {
+ int j;
+ int tuner_num=api_cmd->u.nc_info.tuner_num;
+ for(j=0;j<tuner_num;j++) {
+ api_cmd->cmd=API_GET_TUNER_INFO;
+ api_cmd->parm[API_PARM_TUNER_NUM]=j;
+ API_WAIT_RESPONSE(api_cmd);
+ printf(" Tuner %i: <%s>, SatList: <%s>, Preference %i\n",
+ j,
+ api_cmd->u.tuner_info.fe_info.name,
+ api_cmd->u.tuner_info.SatelliteListName,
+ api_cmd->u.tuner_info.preference
+ );
+ }
+ puts("");
+ }
+
+ if (show_sats) {
+ int sat_list_num=api_cmd->u.nc_info.sat_list_num;
+ int j;
+ for(j=0;j<sat_list_num;j++) {
+ api_cmd->cmd=API_GET_SAT_LIST_INFO;
+ api_cmd->parm[API_PARM_NC_NUM]=i;
+ api_cmd->parm[API_PARM_SAT_LIST_NUM]=j;
+ API_WAIT_RESPONSE(api_cmd);
+ if(api_cmd->u.sat_list.magic != MCLI_MAGIC || api_cmd->u.sat_list.version != MCLI_VERSION) {
+ err("API version mismatch!\n");
+ }
+
+ printf("NetCeiver %i: SatList <%s>, entries %d\n",
+ i,
+ api_cmd->u.sat_list.Name,
+ api_cmd->u.sat_list.sat_num);
+
+ int sat_num=api_cmd->u.sat_list.sat_num;
+ int k;
+ for(k=0;k<sat_num;k++) {
+ api_cmd->cmd=API_GET_SAT_INFO;
+ api_cmd->parm[API_PARM_SAT_LIST_NUM]=j;
+ api_cmd->parm[API_PARM_SAT_NUM]=k;
+ API_WAIT_RESPONSE(api_cmd);
+ int comp_num=api_cmd->u.sat_info.comp_num;
+ float pos=(float)((api_cmd->u.sat_info.SatPos-1800.0)/10.0);
+ float minr=(float)((api_cmd->u.sat_info.SatPosMin-1800.0)/10.0);
+ float maxr=(float)((api_cmd->u.sat_info.SatPosMax-1800.0)/10.0);
+ float af=(float)((api_cmd->u.sat_info.AutoFocus)/10.0);
+ float longitude=(float)((api_cmd->u.sat_info.Longitude)/10.0);
+ float latitude=(float)((api_cmd->u.sat_info.Latitude)/10.0);
+
+ printf(" Satname: <%s>, Position <%.1f%c>, entries %i\n",
+ api_cmd->u.sat_info.Name,
+ fabs(pos),pos<0?'W':'E',
+ comp_num);
+
+ if (api_cmd->u.sat_info.type==SAT_SRC_ROTOR)
+ printf(" Rotor: Range <%.1f%c>-<%.1f%c>, AF <%.1f>, Long <%.1f%c>, Lat <%.1f%c>\n",
+ fabs(minr),minr<0?'W':'E',
+ fabs(maxr),maxr<0?'W':'E',
+ fabs(af),
+ fabs(longitude),longitude<0?'W':'E',
+ fabs(latitude),longitude<0?'S':'N');
+
+ int l;
+ for(l=0;l<comp_num;l++) {
+ api_cmd->cmd=API_GET_SAT_COMP_INFO;
+ api_cmd->parm[API_PARM_SAT_LIST_NUM]=j;
+ api_cmd->parm[API_PARM_SAT_NUM]=k;
+ api_cmd->parm[API_PARM_SAT_COMP_NUM]=l;
+ API_WAIT_RESPONSE(api_cmd);
+ int m=0,n;
+ char diseqc[256];
+ char *ptr=diseqc;
+ struct dvb_diseqc_master_cmd *diseqc_cmd=&api_cmd->u.sat_comp.sec.diseqc_cmd;
+
+ diseqc[0]=0;
+
+ for(n=0;n<api_cmd->u.sat_comp.diseqc_cmd_num;n++) {
+ for(*ptr=0,m=0;m<diseqc_cmd->msg_len;m++) {
+ ptr+=sprintf(ptr, "%02X ", diseqc_cmd->msg[m]);
+ }
+ ptr+=sprintf(ptr, ", ");
+ diseqc_cmd=api_cmd->u.sat_comp.diseqc_cmd+n;
+ }
+ if(m>0) {
+ *(ptr-3)=0;
+ }
+ char *mini="MINI_OFF";
+ switch(api_cmd->u.sat_comp.sec.mini_cmd) {
+ case SEC_MINI_A:mini="MINI_A ";break;
+ case SEC_MINI_B:mini="MINI_B ";break;
+ }
+ printf(" Entry %i: Polarisation %c, Min% 6d, "
+ "Max% 6d, LOF% 6d %s %s %s DiSEqC <%s>\n",
+ l,
+ api_cmd->u.sat_comp.Polarisation?'H':'V',
+ api_cmd->u.sat_comp.RangeMin,
+ api_cmd->u.sat_comp.RangeMax,
+ api_cmd->u.sat_comp.LOF,
+ mini,
+ api_cmd->u.sat_comp.sec.tone_mode==SEC_TONE_ON ?"TONE_ON ":"TONE_OFF",
+ api_cmd->u.sat_comp.sec.voltage==SEC_VOLTAGE_18?"VOLTAGE_18":"VOLTAGE_13",
+ diseqc
+ );
+ }
+ }
+ }
+ }
+ }
+ puts("");
+}
+/*------------------------------------------------------------------------*/
+void show_stats(void)
+{
+ api_cmd_t sock_cmd;
+ api_cmd_t *api_cmd=&sock_cmd;
+ int i;
+ char *types[]={"DVB-S","DVB-C","DVB-T", "?", "DVB-S2"};
+ int type;
+
+ api_cmd->cmd=API_GET_TRA_NUM;
+ api_cmd->magic = MCLI_MAGIC;
+ api_cmd->version = MCLI_VERSION;
+ API_WAIT_RESPONSE(api_cmd);
+
+// printf("tra_num: %d\n", api_cmd->parm[API_PARM_TRA_NUM]);
+ int tra_num=api_cmd->parm[API_PARM_TRA_NUM];
+ for(i=0;i<tra_num;i++) {
+ char uuid[256];
+ char *p;
+
+ api_cmd->cmd=API_GET_TRA_INFO;
+ api_cmd->parm[API_PARM_TRA_NUM]=i;
+ API_WAIT_RESPONSE(api_cmd);
+ char host[INET6_ADDRSTRLEN];
+ inet_ntop (AF_INET6, &api_cmd->u.tra.mcg, (char *) host, INET6_ADDRSTRLEN);
+ type=api_cmd->u.tra.fe_type;
+ if (type<0 || type>4)
+ type=3;
+
+ strncpy(uuid,api_cmd->u.tra.uuid,255);
+ uuid[255]=0;
+ p=strrchr(uuid,':');
+ if (p)
+ *p=0;
+
+ fe_type_t t;
+ recv_sec_t sec;
+ int satpos;
+ struct dvb_frontend_parameters fep;
+
+ if(mcg_to_fe_parms(&api_cmd->u.tra.mcg, &t, &sec, &fep, NULL)<0) {
+ memset(&fep,0,sizeof(struct dvb_frontend_parameters));
+ }
+
+ mcg_get_satpos(&api_cmd->u.tra.mcg, &satpos);
+ float pos=(float)((satpos-1800.0)/10.0);
+ char pos_str[256];
+ if(satpos != 0xfff) {
+ sprintf(pos_str, ", position <%.1f%c>", fabs(pos), pos<0?'W':'E');
+ } else {
+ pos_str[0]=0;
+ }
+
+ printf("UUID <%s>:\n"
+ " slot %s%d.%d, type %s, used: % 3d\n"
+ " %s, frequency %d%s (%.1f%s)%s\n"
+ " strength %04x, snr %04x, ber %04x, unc %04x\n"
+ " NIMCurrent %d\n"
+ " RotorStatus %i, RotorDiff %.1f\n",
+ uuid,
+ (time(0)-api_cmd->u.tra.lastseen)>15?"-":"",
+ api_cmd->u.tra.slot/2,api_cmd->u.tra.slot%2,
+ types[type], api_cmd->u.tra.InUse,
+ api_cmd->u.tra.s.st==0x1f?"LOCK ":"NO LOCK",
+ fep.frequency, (type==1||type==2)?"Hz":"kHz", api_cmd->u.tra.fep.frequency/1000.0,
+ (type==1||type==2)?"kHz":"MHz",pos_str,
+ api_cmd->u.tra.s.strength,
+ api_cmd->u.tra.s.snr, api_cmd->u.tra.s.ber, api_cmd->u.tra.s.ucblocks,
+ api_cmd->u.tra.NIMCurrent,
+ api_cmd->u.tra.rotor_status,
+ api_cmd->u.tra.rotor_diff/10.0
+ );
+
+ }
+}
+/*------------------------------------------------------------------------*/
+int main(int argc, char **argv)
+{
+ int repeat=0;
+ int show_uuids=0,show_tuners=0,show_sats=0,show_state=0,show_cams=0;
+ int show_count=0, show_versions=0;
+#ifdef API_SOCK
+ char path[256]=API_SOCK_NAMESPACE;
+#endif
+#ifdef API_WIN
+ char path[256]="\\\\.\\pipe\\mcli";
+#endif
+ while(1) {
+ int ret = getopt(argc,argv, "aucCtsSvr:P:");
+ if (ret==-1)
+ break;
+
+ char c=(char)ret;
+
+ switch (c) {
+ case 'a':
+ show_uuids=1;
+ show_tuners=1;
+ show_sats=1;
+ show_state=1;
+ show_count=1;
+ show_versions=1;
+ show_cams=1;
+ break;
+ case 'u':
+ show_uuids=1;
+ break;
+ case 'c':
+ show_count=1;
+ break;
+ case 'C':
+ show_cams=1;
+ break;
+ case 't':
+ show_tuners=1;
+ break;
+ case 's':
+ show_state=1;
+ break;
+ case 'r':
+ repeat=abs(atoi(optarg));
+ break;
+ case 'S':
+ show_sats=1;
+ break;
+ case 'v':
+ show_versions=1;
+ break;
+ case 'P':
+ strncpy(path,optarg,255);
+ path[255]=0;
+ break;
+ default:
+ usage();
+ break;
+ }
+ }
+ if (nc_api_init(path)==-1) {
+ exit(-1);
+ }
+
+ do {
+ show_it(show_count, show_uuids, show_tuners, show_sats, show_versions, show_cams);
+ if (show_state)
+ show_stats();
+ sleep(repeat);
+ } while(repeat);
+
+ exit(0);
+}
+