bool CubicSDR::OnInit() { #ifdef _OSX_APP_ CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); char path[PATH_MAX]; if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) { // error! } CFRelease(resourcesURL); chdir(path); #endif if (!wxApp::OnInit()) { return false; } //#ifdef ENABLE_DIGITAL_LAB // // console output for windows // #ifdef _WINDOWS // if (AllocConsole()) { // freopen("CONOUT$", "w", stdout); // SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); // } // outbuf ob; // std::streambuf *sb = std::cout.rdbuf(&ob); // std::cout.rdbuf(sb); // #endif //#endif wxApp::SetAppName("CubicSDR"); #ifdef USE_HAMLIB t_Rig = nullptr; rigThread = nullptr; RigThread::enumerate(); #endif Modem::addModemFactory(new ModemFM); Modem::addModemFactory(new ModemNBFM); Modem::addModemFactory(new ModemFMStereo); Modem::addModemFactory(new ModemAM); Modem::addModemFactory(new ModemLSB); Modem::addModemFactory(new ModemUSB); Modem::addModemFactory(new ModemDSB); Modem::addModemFactory(new ModemIQ); #ifdef ENABLE_DIGITAL_LAB Modem::addModemFactory(new ModemAPSK); Modem::addModemFactory(new ModemASK); Modem::addModemFactory(new ModemBPSK); Modem::addModemFactory(new ModemDPSK); #if ENABLE_LIQUID_EXPERIMENTAL Modem::addModemFactory(new ModemFSK); #endif Modem::addModemFactory(new ModemGMSK); Modem::addModemFactory(new ModemOOK); Modem::addModemFactory(new ModemPSK); Modem::addModemFactory(new ModemQAM); Modem::addModemFactory(new ModemQPSK); Modem::addModemFactory(new ModemSQAM); Modem::addModemFactory(new ModemST); #endif frequency = wxGetApp().getConfig()->getCenterFreq(); offset = 0; ppm = 0; devicesReady.store(false); devicesFailed.store(false); deviceSelectorOpen.store(false); // Visual Data spectrumVisualThread = new SpectrumVisualDataThread(); demodVisualThread = new SpectrumVisualDataThread(); pipeIQVisualData = new DemodulatorThreadInputQueue(); pipeIQVisualData->set_max_num_items(1); pipeDemodIQVisualData = new DemodulatorThreadInputQueue(); pipeDemodIQVisualData->set_max_num_items(1); pipeWaterfallIQVisualData = new DemodulatorThreadInputQueue(); pipeWaterfallIQVisualData->set_max_num_items(128); getDemodSpectrumProcessor()->setInput(pipeDemodIQVisualData); getSpectrumProcessor()->setInput(pipeIQVisualData); getSpectrumProcessor()->setHideDC(true); pipeAudioVisualData = new DemodulatorThreadOutputQueue(); pipeAudioVisualData->set_max_num_items(1); scopeProcessor.setInput(pipeAudioVisualData); // I/Q Data pipeSDRIQData = new SDRThreadIQDataQueue(); pipeSDRIQData->set_max_num_items(100); sdrThread = new SDRThread(); sdrThread->setOutputQueue("IQDataOutput",pipeSDRIQData); sdrPostThread = new SDRPostThread(); sdrPostThread->setInputQueue("IQDataInput", pipeSDRIQData); sdrPostThread->setOutputQueue("IQVisualDataOutput", pipeIQVisualData); sdrPostThread->setOutputQueue("IQDataOutput", pipeWaterfallIQVisualData); sdrPostThread->setOutputQueue("IQActiveDemodVisualDataOutput", pipeDemodIQVisualData); t_PostSDR = new std::thread(&SDRPostThread::threadMain, sdrPostThread); t_SpectrumVisual = new std::thread(&SpectrumVisualDataThread::threadMain, spectrumVisualThread); t_DemodVisual = new std::thread(&SpectrumVisualDataThread::threadMain, demodVisualThread); sdrEnum = new SDREnumerator(); SDREnumerator::setManuals(config.getManualDevices()); appframe = new AppFrame(); t_SDREnum = new std::thread(&SDREnumerator::threadMain, sdrEnum); //#ifdef __APPLE__ // int main_policy; // struct sched_param main_param; // // main_policy = SCHED_RR; // main_param.sched_priority = sched_get_priority_min(SCHED_RR)+2; // // pthread_setschedparam(pthread_self(), main_policy, &main_param); //#endif return true; }
bool CubicSDR::OnInit() { #ifdef _OSX_APP_ CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); char path[PATH_MAX]; if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) { // error! } CFRelease(resourcesURL); chdir(path); #endif if (!wxApp::OnInit()) { return false; } wxApp::SetAppName("CubicSDR"); frequency = wxGetApp().getConfig()->getCenterFreq(); offset = 0; ppm = 0; directSamplingMode = 0; // Visual Data spectrumVisualThread = new SpectrumVisualDataThread(); demodVisualThread = new SpectrumVisualDataThread(); pipeIQVisualData = new DemodulatorThreadInputQueue(); pipeIQVisualData->set_max_num_items(1); spectrumDistributor.setInput(pipeIQVisualData); pipeDemodIQVisualData = new DemodulatorThreadInputQueue(); pipeDemodIQVisualData->set_max_num_items(1); pipeSpectrumIQVisualData = new DemodulatorThreadInputQueue(); pipeSpectrumIQVisualData->set_max_num_items(1); pipeWaterfallIQVisualData = new DemodulatorThreadInputQueue(); pipeWaterfallIQVisualData->set_max_num_items(128); spectrumDistributor.attachOutput(pipeDemodIQVisualData); spectrumDistributor.attachOutput(pipeSpectrumIQVisualData); getDemodSpectrumProcessor()->setInput(pipeDemodIQVisualData); getSpectrumProcessor()->setInput(pipeSpectrumIQVisualData); pipeAudioVisualData = new DemodulatorThreadOutputQueue(); pipeAudioVisualData->set_max_num_items(1); scopeProcessor.setInput(pipeAudioVisualData); // I/Q Data pipeSDRIQData = new SDRThreadIQDataQueue(); pipeSDRCommand = new SDRThreadCommandQueue(); pipeSDRIQData->set_max_num_items(100); sdrThread = new SDRThread(); sdrThread->setInputQueue("SDRCommandQueue",pipeSDRCommand); sdrThread->setOutputQueue("IQDataOutput",pipeSDRIQData); sdrPostThread = new SDRPostThread(); // sdrPostThread->setNumVisSamples(BUF_SIZE); sdrPostThread->setInputQueue("IQDataInput", pipeSDRIQData); sdrPostThread->setOutputQueue("IQVisualDataOutput", pipeIQVisualData); sdrPostThread->setOutputQueue("IQDataOutput", pipeWaterfallIQVisualData); std::vector<SDRDeviceInfo *>::iterator devs_i; SDRThread::enumerate_rtl(&devs); SDRDeviceInfo *dev = NULL; if (devs.size() > 1) { wxArrayString choices; for (devs_i = devs.begin(); devs_i != devs.end(); devs_i++) { std::string devName = (*devs_i)->getName(); if ((*devs_i)->isAvailable()) { devName.append(": "); devName.append((*devs_i)->getProduct()); devName.append(" ["); devName.append((*devs_i)->getSerial()); devName.append("]"); } else { devName.append(" (In Use?)"); } choices.Add(devName); } int devId = wxGetSingleChoiceIndex(wxT("Devices"), wxT("Choose Input Device"), choices); if (devId == -1) { // User chose to cancel return false; } dev = devs[devId]; sdrThread->setDeviceId(devId); } else if (devs.size() == 1) { dev = devs[0]; } if (!dev) { wxMessageDialog *info; info = new wxMessageDialog(NULL, wxT("\x28\u256F\xB0\u25A1\xB0\uFF09\u256F\uFE35\x20\u253B\u2501\u253B"), wxT("RTL-SDR device not found"), wxOK | wxICON_ERROR); info->ShowModal(); return false; } t_PostSDR = new std::thread(&SDRPostThread::threadMain, sdrPostThread); t_SDR = new std::thread(&SDRThread::threadMain, sdrThread); t_SpectrumVisual = new std::thread(&SpectrumVisualDataThread::threadMain, spectrumVisualThread); t_DemodVisual = new std::thread(&SpectrumVisualDataThread::threadMain, demodVisualThread); appframe = new AppFrame(); if (dev != NULL) { appframe->initDeviceParams(dev->getDeviceId()); DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(dev->getDeviceId()); ppm = devConfig->getPPM(); offset = devConfig->getOffset(); directSamplingMode = devConfig->getDirectSampling(); } #ifdef __APPLE__ int main_policy; struct sched_param main_param; main_policy = SCHED_RR; main_param.sched_priority = sched_get_priority_min(SCHED_RR)+2; pthread_setschedparam(pthread_self(), main_policy, &main_param); #endif return true; }