int eCableScan::nextChannel() { ePtr<iDVBFrontend> fe; m_SDT = NULL; if (scanChannels.empty()) { m_channel = NULL; createBouquets(); return 1; } scanProgress(100 - (scanChannels.size() * 90) / totalChannels); currentScanChannel = scanChannels.front(); scanChannels.pop_front(); if (m_channel->getFrontend(fe)) { m_channel = NULL; scanCompleted(-1); return -1; } if (fe->tune(*currentScanChannel)) return nextChannel(); m_SDT = new eTable<ServiceDescriptionSection>; CONNECT(m_SDT->tableReady, eCableScan::SDTReady); m_SDT->start(m_demux, eDVBSDTSpec()); return 0; }
RESULT eDVBScan::nextChannel() { ePtr<iDVBFrontend> fe; m_SDT = 0; m_PAT = 0; m_BAT = 0; m_NIT = 0, m_PMT = 0; m_ready = 0; m_pat_tsid = eTransportStreamID(); /* check what we need */ m_ready_all = readySDT; if (m_flags & scanNetworkSearch) m_ready_all |= readyNIT; if (m_flags & scanSearchBAT) m_ready_all |= readyBAT; if (m_usePAT) m_ready_all |= readyPAT; if (!m_ch_blindscan.empty()) { /* keep iterating with the same 'channel' till we get a tune failure */ SCAN_eDebug("[eDVBScan] blindscan channel iteration"); m_ch_current = m_ch_blindscan.front(); } else { m_ch_blindscan_result = NULL; if (m_ch_toScan.empty()) { SCAN_eDebug("[eDVBScan] no channels left: %zd scanned, %zd unavailable, %zd database.", m_ch_scanned.size(), m_ch_unavailable.size(), m_new_channels.size()); m_event(evtFinish); return -ENOENT; } m_ch_current = m_ch_toScan.front(); m_ch_toScan.pop_front(); } if (m_channel->getFrontend(fe)) { m_event(evtFail); return -ENOTSUP; } m_chid_current = eDVBChannelID(); m_channel_state = iDVBChannel::state_idle; if (fe->tune(*m_ch_current, !m_ch_blindscan.empty())) return nextChannel(); m_event(evtUpdate); return 0; }
void eCableScan::SDTReady(int error) { eDebug("[eCableScan] SDTReady %d", error); if (!error) { parseSDT(); } nextChannel(); }
static UInt32 allocChannel(TChannelPriority prio, IChannelObserver* pObserver) { UInt32 chid = nextChannel(); ERROR_CODE err = ::allocateChannel(prio, chid, pObserver); if (err != ERR_OK) { LOG4CPLUS_ERROR(msLogger, "allocateChannel err = " + convertIntegerToString((int)err)); assert(err != ERR_OK); } return chid; }
RESULT eDVBScan::nextChannel() { ePtr<iDVBFrontend> fe; m_SDT = 0; m_PAT = 0; m_BAT = 0; m_NIT = 0, m_PMT = 0; m_ready = 0; m_pat_tsid = eTransportStreamID(); /* check what we need */ m_ready_all = readySDT; if (m_flags & scanNetworkSearch) m_ready_all |= readyNIT; if (m_flags & scanSearchBAT) m_ready_all |= readyBAT; if (m_usePAT) m_ready_all |= readyPAT; if (m_ch_toScan.empty()) { SCAN_eDebug("[eDVBScan] no channels left to scan."); SCAN_eDebug("[eDVBScan] %zd channels scanned, %zd were unavailable.", m_ch_scanned.size(), m_ch_unavailable.size()); SCAN_eDebug("[eDVBScan] %zd channels in database.", m_new_channels.size()); m_event(evtFinish); return -ENOENT; } m_ch_current = m_ch_toScan.front(); m_ch_toScan.pop_front(); if (m_channel->getFrontend(fe)) { m_event(evtFail); return -ENOTSUP; } m_chid_current = eDVBChannelID(); m_channel_state = iDVBChannel::state_idle; if (fe->tune(*m_ch_current)) return nextChannel(); m_event(evtUpdate); return 0; }
void eCableScan::NITReady(int error) { eDebug("[eCableScan] NITReady %d", error); if (!error) { parseNIT(); nextChannel(); } else { scanCompleted(-1); } m_NIT = NULL; }
void eDVBScan::stateChange(iDVBChannel *ch) { int state; if (ch->getState(state)) return; if (m_channel_state == state) return; if (state == iDVBChannel::state_ok) { startFilter(); m_channel_state = state; } else if (state == iDVBChannel::state_failed) { if (m_ch_current && m_channel) { int type; m_ch_current->getSystem(type); m_ch_unavailable.push_back(m_ch_current); if (type == iDVBFrontend::feTerrestrial) { eDVBFrontendParametersTerrestrial parm; m_ch_current->getDVBT(parm); if (parm.system == eDVBFrontendParametersTerrestrial::System_DVB_T_T2) { /* we have to scan T2 as well as T */ ePtr<iDVBFrontend> fe; eDVBFrontendParameters eparm; parm.system = eDVBFrontendParametersTerrestrial::System_DVB_T2; eparm.setDVBT(parm); m_channel->getFrontend(fe); if (fe) { ePtr<iDVBFrontendParameters> feparm = new eDVBFrontendParameters(eparm); /* but only if the frontend supports T2 */ if (fe->isCompatibleWith(feparm)) { addChannelToScan(feparm); } } } } } nextChannel(); } /* unavailable will timeout, anyway. */ }
void eDVBScan::stateChange(iDVBChannel *ch) { int state; if (ch->getState(state)) return; if (m_channel_state == state) return; if (state == iDVBChannel::state_ok) { if (m_ch_current && m_channel) { int type; m_ch_current->getSystem(type); if (type == iDVBFrontend::feTerrestrial) { eDVBFrontendParametersTerrestrial parm; m_ch_current->getDVBT(parm); if (parm.system == eDVBFrontendParametersTerrestrial::System_DVB_T_T2) { /* we have a lock, this is a valid DVB-T transponder, set our system parameter */ parm.system = eDVBFrontendParametersTerrestrial::System_DVB_T; m_ch_current->setDVBT(parm); } } } if (!m_ch_blindscan.empty()) { /* update current blindscan iteration channel with scanned parameters */ if (m_ch_current && m_channel) { ePtr<iDVBFrontend> fe; m_channel->getFrontend(fe); if (fe) { ePtr<iDVBTransponderData> tp; fe->getTransponderData(tp, false); if (tp) { ePtr<eDVBFrontendParameters> feparm = new eDVBFrontendParameters; int type; m_ch_current->getSystem(type); switch (type) { case iDVBFrontend::feSatellite: { eDVBFrontendParametersSatellite parm; m_ch_current->getDVBS(parm); parm.system = tp->getSystem(); parm.frequency = tp->getFrequency(); parm.symbol_rate = tp->getSymbolRate(); parm.modulation = tp->getModulation(); feparm->setDVBS(parm); break; } case iDVBFrontend::feCable: { eDVBFrontendParametersCable parm; m_ch_current->getDVBC(parm); parm.system = tp->getSystem(); parm.frequency = tp->getFrequency(); parm.symbol_rate = tp->getSymbolRate(); parm.modulation = tp->getModulation(); feparm->setDVBC(parm); break; } case iDVBFrontend::feTerrestrial: { eDVBFrontendParametersTerrestrial parm; m_ch_current->getDVBT(parm); parm.system = tp->getSystem(); parm.frequency = tp->getFrequency(); parm.bandwidth = tp->getBandwidth(); parm.modulation = tp->getConstellation(); feparm->setDVBT(parm); break; } case iDVBFrontend::feATSC: { eDVBFrontendParametersATSC parm; m_ch_current->getATSC(parm); parm.system = tp->getSystem(); parm.frequency = tp->getFrequency(); feparm->setATSC(parm); break; } } m_ch_current = m_ch_blindscan_result = feparm; } } } } startFilter(); m_channel_state = state; } else if (state == iDVBChannel::state_failed) { if (m_ch_current && m_channel) { int type; m_ch_current->getSystem(type); m_ch_unavailable.push_back(m_ch_current); if (type == iDVBFrontend::feTerrestrial) { eDVBFrontendParametersTerrestrial parm; m_ch_current->getDVBT(parm); if (parm.system == eDVBFrontendParametersTerrestrial::System_DVB_T_T2) { /* we have to scan T2 as well as T */ ePtr<iDVBFrontend> fe; eDVBFrontendParameters eparm; parm.system = eDVBFrontendParametersTerrestrial::System_DVB_T2; eparm.setDVBT(parm); m_channel->getFrontend(fe); if (fe) { ePtr<iDVBFrontendParameters> feparm = new eDVBFrontendParameters(eparm); /* but only if the frontend supports T2 */ if (fe->isCompatibleWith(feparm)) { addChannelToScan(feparm); } } } } } if (!m_ch_blindscan.empty()) { /* tune failure, this means the blindscan channel iteration run has completed */ SCAN_eDebug("[eDVBScan] blindscan channel completed"); m_ch_blindscan.pop_front(); } nextChannel(); } /* unavailable will timeout, anyway. */ }
rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const protocolState) { static timeUs_t lastPacketReceivedTime = 0; static timeUs_t telemetryTimeUs; rx_spi_received_e ret = RX_SPI_RECEIVED_NONE; const timeUs_t currentPacketReceivedTime = micros(); switch (*protocolState) { case STATE_STARTING: listLength = 47; initialiseData(0); *protocolState = STATE_UPDATE; nextChannel(1); cc2500Strobe(CC2500_SRX); break; case STATE_UPDATE: lastPacketReceivedTime = currentPacketReceivedTime; *protocolState = STATE_DATA; if (rxSpiCheckBindRequested(false)) { lastPacketReceivedTime = 0; timeoutUs = 50; missingPackets = 0; *protocolState = STATE_INIT; break; } FALLTHROUGH; //!!TODO -check this fall through is correct // here FS code could be case STATE_DATA: if (cc2500getGdo()) { uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; if (ccLen >= 20) { cc2500ReadFifo(packet, 20); if (packet[19] & 0x80) { missingPackets = 0; timeoutUs = 1; if (packet[0] == 0x11) { if ((packet[1] == rxFrSkySpiConfig()->bindTxId[0]) && (packet[2] == rxFrSkySpiConfig()->bindTxId[1])) { rxSpiLedOn(); nextChannel(1); cc2500setRssiDbm(packet[18]); #if defined(USE_RX_FRSKY_SPI_TELEMETRY) if ((packet[3] % 4) == 2) { telemetryTimeUs = micros(); buildTelemetryFrame(packet); *protocolState = STATE_TELEMETRY; } else #endif { cc2500Strobe(CC2500_SRX); *protocolState = STATE_UPDATE; } ret = RX_SPI_RECEIVED_DATA; lastPacketReceivedTime = currentPacketReceivedTime; } } } } } if (cmpTimeUs(currentPacketReceivedTime, lastPacketReceivedTime) > (timeoutUs * SYNC_DELAY_MAX)) { #if defined(USE_RX_CC2500_SPI_PA_LNA) cc2500TxDisable(); #endif if (timeoutUs == 1) { #if defined(USE_RX_CC2500_SPI_PA_LNA) && defined(USE_RX_CC2500_SPI_DIVERSITY) // SE4311 chip if (missingPackets >= 2) { cc2500switchAntennae(); } #endif if (missingPackets > MAX_MISSING_PKT) { timeoutUs = 50; setRssiDirect(0, RSSI_SOURCE_RX_PROTOCOL); } missingPackets++; nextChannel(1); } else { rxSpiLedToggle(); setRssi(0, RSSI_SOURCE_RX_PROTOCOL); nextChannel(13); } cc2500Strobe(CC2500_SRX); *protocolState = STATE_UPDATE; } break; #if defined(USE_RX_FRSKY_SPI_TELEMETRY) case STATE_TELEMETRY: if (cmpTimeUs(micros(), telemetryTimeUs) >= 1380) { cc2500Strobe(CC2500_SIDLE); cc2500SetPower(6); cc2500Strobe(CC2500_SFRX); #if defined(USE_RX_CC2500_SPI_PA_LNA) cc2500TxEnable(); #endif cc2500Strobe(CC2500_SIDLE); cc2500WriteFifo(frame, frame[0] + 1); *protocolState = STATE_DATA; ret = RX_SPI_RECEIVED_DATA; lastPacketReceivedTime = currentPacketReceivedTime; } break; #endif } return ret; }