diff --git a/octoserve/dvb.c b/octoserve/dvb.c index 16fb0d8..86ab1cc 100644 --- a/octoserve/dvb.c +++ b/octoserve/dvb.c @@ -795,7 +795,7 @@ static int32_t dvbcq(int32_t snr, uint32_t mod, return (Quality * 3) / 20; } -int32_t dvbtq(int32_t snr, uint32_t mod, uint32_t fec, +static int32_t dvbtq(int32_t snr, uint32_t mod, uint32_t fec, uint32_t ber_num, uint32_t ber_den) { int32_t Quality = 0; @@ -843,54 +843,101 @@ int32_t dvbtq(int32_t snr, uint32_t mod, uint32_t fec, return (Quality * 3) / 20; } -#if 0 - -int32_t dvbt2q(int32_t snr, uint32_t mod, uint32_t fec, uint32_t trans, uint32_t pilot, - uint32_t ber_num, uint32_t ber_den) +static int32_t dvbt2q(int32_t snr, uint32_t mod, uint32_t fec, uint32_t trans, uint32_t pilot, + uint32_t ber_num, uint32_t ber_den) { int32_t Quality = 0; - int32_t BERQuality = BERQualityBCH(BERNominator, BERDenominator); - int32_t SignalToNoiseRel = -1000; - - static const int32_t QE_SN[] = { - // 1/2, 3/5, 2/3, 3/4, 4/5, 5/6, 1/3, 2/5 - 32, 49, 59, 68, 74, 80, 15, 24, // 16K QPSK - 82, 104, 116, 130, 136, 141, 62, 74, // 16K 16-QAM - 123, 151, 165, 181, 190, 197, 101, 114, // 16K 64-QAM - 164, 202, 211, 232, 246, 255, 137, 153, // 16K 256-QAM - - 35, 47, 56, 66, 72, 77, 13, 22, // 64K QPSK - 87, 101, 114, 125, 133, 138, 60, 72, // 64K 16-QAM - 130, 148, 162, 177, 187, 194, 98, 111, // 64K 64-QAM - 170, 194, 208, 229, 243, 251, 132, 148, // 64K 256-QAM - }; - - if( Modulation <= DVBT2_256QAM && CodeRate <= DVBT2_CR_2_5 && FECType <= DVBT2_64K ) - { - int Index = int(FECType) * 32 + int(Modulation) * 8 + int(CodeRate); - SignalToNoiseRel = SignalToNoise - QE_SN[Index]; - - if( PilotPattern >= DVBT2_PP3 && PilotPattern <= DVBT2_PP4 ) SignalToNoiseRel += 5; - else if( PilotPattern >= DVBT2_PP5 && PilotPattern <= DVBT2_PP8 ) SignalToNoiseRel += 10; + int32_t BERQuality = berq_bch(ber_num, ber_den); + int32_t SignalToNoiseRel = -1000, snc = 0; + + static const int32_t QE_SN_16K_QPSK[] = { + // 1/2 2/3 3/4 4/5 5/6 6/7 7/8 8/9 AUT 3/5 9/10 2/5 1/4 1/3 + 0, 32, 59, 68, 74, 80, 0, 0, 0, 0, 49, 0, 24, 0, 15 }; + static const int32_t QE_SN_16K_16QAM[] = { + // 1/2 2/3 3/4 4/5 5/6 6/7 7/8 8/9 AUT 3/5 9/10 2/5 1/4 1/3 + 0, 82,116,130,136,141, 0, 0, 0, 0, 104, 0, 74, 0, 62 }; + static const int32_t QE_SN_16K_64QAM[] = { + // 1/2 2/3 3/4 4/5 5/6 6/7 7/8 8/9 AUT 3/5 9/10 2/5 1/4 1/3 + 0,123,165,181,190,197, 0, 0, 0, 0, 151, 0,114, 0,101 }; + static const int32_t QE_SN_16K_256QAM[] = { + // 1/2 2/3 3/4 4/5 5/6 6/7 7/8 8/9 AUT 3/5 9/10 2/5 1/4 1/3 + 0,164,211,232,246,255, 0, 0, 0, 0, 202, 0,153, 0,137 }; + static const int32_t QE_SN_64K_QPSK[] = { + // 1/2 2/3 3/4 4/5 5/6 6/7 7/8 8/9 AUT 3/5 9/10 2/5 1/4 1/3 + 0, 35, 56, 66, 72, 77, 0, 0, 0, 0, 47, 0, 22, 0, 13 }; + static const int32_t QE_SN_64K_16QAM[] = { + // 1/2 2/3 3/4 4/5 5/6 6/7 7/8 8/9 AUT 3/5 9/10 2/5 1/4 1/3 + 0, 87,114,125,133,138, 0, 0, 0, 0, 101, 0, 72, 0, 60 }; + static const int32_t QE_SN_64K_64QAM[] = { + // 1/2 2/3 3/4 4/5 5/6 6/7 7/8 8/9 AUT 3/5 9/10 2/5 1/4 1/3 + 0,130,162,177,187,194, 0, 0, 0, 0, 148, 0,111, 0, 98 }; + static const int32_t QE_SN_64K_256QAM[] = { + // 1/2 2/3 3/4 4/5 5/6 6/7 7/8 8/9 AUT 3/5 9/10 2/5 1/4 1/3 + 0,170,208,229,243,251, 0, 0, 0, 0, 194, 0,148, 0,132 }; + + if (trans == TRANSMISSION_MODE_16K) { + switch (mod) { + case QPSK: + snc = QE_SN_16K_QPSK[fec]; + break; + case QAM_16: + snc = QE_SN_16K_16QAM[fec]; + break; + case QAM_64: + snc = QE_SN_16K_64QAM[fec]; + break; + case QAM_256: + snc = QE_SN_16K_256QAM[fec]; + break; + default: + break; + } } - - if( SignalToNoiseRel < -30 ) Quality = 0; - else if( SignalToNoiseRel < 30 ) - { + if (trans == TRANSMISSION_MODE_C3780 + 1) { /* TRANSMISSION_MODE_64K */ + switch (mod) { + case QPSK: + snc = QE_SN_64K_QPSK[fec]; + break; + case QAM_16: + snc = QE_SN_64K_16QAM[fec]; + break; + case QAM_64: + snc = QE_SN_64K_64QAM[fec]; + break; + case QAM_256: + snc = QE_SN_64K_256QAM[fec]; + break; + default: + break; + } + } + + if (snc) { + SignalToNoiseRel = snr - snc; +#if 0 //FIXME + if (PilotPattern >= DVBT2_PP3 && + PilotPattern <= DVBT2_PP4 ) + SignalToNoiseRel += 5; + else if + ( PilotPattern >= DVBT2_PP5 && PilotPattern <= DVBT2_PP8 ) + SignalToNoiseRel += 10; +#endif + } + if( SignalToNoiseRel < -30 ) + Quality = 0; + else if (SignalToNoiseRel < 30 ) Quality = ((SignalToNoiseRel + 30) * BERQuality)/60; - } else Quality = 100; return (Quality * 3) / 20; } -#endif static void calc_lq(struct dvbfe *fe) { struct dtv_fe_stats st; int64_t str, snr; - uint32_t mod, fec, ber_num, ber_den; + uint32_t mod, fec, ber_num, ber_den, trans, pilot = 0; get_stat(fe->fd, DTV_STAT_SIGNAL_STRENGTH, &st); str = st.stat[0].uvalue; @@ -932,7 +979,9 @@ static void calc_lq(struct dvbfe *fe) fe->quality = dvbtq(snr, mod, fec, ber_num, ber_den); break; case SYS_DVBT2: - //fe->quality = dvbtq(snr, mod, fec, ber_num, ber_den); + get_property(fe->fd, DTV_TRANSMISSION_MODE, &trans); + dbgprintf(DEBUG_DVB, "fe%d: trans=%u pilot=%u\n", fe->nr, trans, pilot); + fe->quality = dvbt2q(snr, mod, fec, trans, pilot, ber_num, ber_den); break; case SYS_DVBC2: break; diff --git a/octoserve/http.c b/octoserve/http.c index 5938c24..bb44c59 100644 --- a/octoserve/http.c +++ b/octoserve/http.c @@ -32,7 +32,7 @@ char xmldesc[] = "\r\n1\r\n1\r\n\r\n" "\r\n" "urn:ses-com:device:SatIPServer:1\r\n" - "OctopusNet\r\n" + "%s\r\n" "Digital Devices GmbH\r\n" "http://www.digitaldevices.de\r\n" "OctopusNet\r\n" @@ -138,6 +138,22 @@ void send_http_file(int sock, char *fn) close(fd); } +static int read_boxname(char *name) +{ + int fd, len; + + strcpy(name, "OctopusNet"); + fd = open("/config/boxname", O_RDONLY); + if (fd < 0) + return 0; + printf("read boxname from /etc/boxname\n"); + len = read(fd, name, 79); + if (len > 0) + name[len] = 0; + close(fd); + return 0; +} + void send_xml(struct os_ssdp *ss) { struct octoserve *os = ss->os; @@ -145,7 +161,9 @@ void send_xml(struct os_ssdp *ss) int len, len2; uint8_t *mac = &os->mac[0]; int serial = (mac[5] | (mac[4] << 8) | (mac[3] << 16)) / 2; + char boxname[80]; + read_boxname(boxname); len = 0; if (os->dvbs2num) len += sprintf(cap + len, ",DVBS2-%u", os->dvbs2num); @@ -158,7 +176,8 @@ void send_xml(struct os_ssdp *ss) if (os->dvbc2num) len += sprintf(cap + len, ",DVBC2-%u", os->dvbc2num); len = snprintf(buf, sizeof(buf), xmldesc, - ss->configid, serial, ss->uuid_str, cap + 1); + ss->configid, boxname, + serial, ss->uuid_str, cap + 1); if (len <= 0 || len >= sizeof(buf)) return; len2=sprintf(buf2, httpxml, len); diff --git a/octoserve/ssdp.c b/octoserve/ssdp.c index 0f459dc..168aa24 100644 --- a/octoserve/ssdp.c +++ b/octoserve/ssdp.c @@ -47,6 +47,7 @@ static int read_id(char *type, uint32_t *id) name[len] = 0; *id = strtol(name, NULL, 10); printf("%s.id = %d\n", type, *id); + close(fd); return 0; }