From 900ff9f2c8d097caead28755bc7ba279ccb600db Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 2 Jul 2012 20:52:56 +0000 Subject: [PATCH] Starting to implement sound I/O. Changing T/R period to 30 s. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/jtms3@2478 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- devsetup.cpp | 5 +- jtms3.pro | 2 +- mainwindow.cpp | 26 +++-- mainwindow.ui | 56 +++------- set570.cpp | 275 ------------------------------------------------- soundout.cpp | 4 +- widegraph.cpp | 7 +- 7 files changed, 36 insertions(+), 339 deletions(-) delete mode 100644 set570.cpp diff --git a/devsetup.cpp b/devsetup.cpp index 3e517e9a8..eb67cc707 100644 --- a/devsetup.cpp +++ b/devsetup.cpp @@ -115,6 +115,8 @@ void DevSetup::initDlg() ui.comboBoxSndOut->setCurrentIndex(m_nDevOut); m_paInDevice=m_inDevList[m_nDevIn]; m_paOutDevice=m_outDevList[m_nDevOut]; + qDebug() << "A" << m_nDevIn << m_paInDevice << m_nDevOut << m_paOutDevice; + } @@ -141,7 +143,8 @@ void DevSetup::accept() m_paInDevice=m_inDevList[m_nDevIn]; m_nDevOut=ui.comboBoxSndOut->currentIndex(); m_paOutDevice=m_outDevList[m_nDevOut]; - QDialog::accept(); + qDebug() << "B" << m_nDevIn << m_paInDevice << m_nDevOut << m_paOutDevice; + } diff --git a/jtms3.pro b/jtms3.pro index dffe51f30..e5712718e 100644 --- a/jtms3.pro +++ b/jtms3.pro @@ -38,7 +38,7 @@ SOURCES += main.cpp mainwindow.cpp plotter.cpp about.cpp \ displaytext.cpp getdev.cpp win32 { -SOURCES += killbyname.cpp set570.cpp +SOURCES += killbyname.cpp } HEADERS += mainwindow.h plotter.h soundin.h soundout.h \ diff --git a/mainwindow.cpp b/mainwindow.cpp index d99d31d7c..7725a2fe6 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -132,7 +132,6 @@ MainWindow::MainWindow(QWidget *parent) : m_colors="000066ff0000ffff00969696646464"; ui->xThermo->setFillBrush(Qt::green); - ui->yThermo->setFillBrush(Qt::magenta); #ifdef WIN32 while(true) { @@ -180,7 +179,7 @@ MainWindow::MainWindow(QWidget *parent) : genStdMsgs(""); - on_actionWide_Waterfall_triggered(); + on_actionWide_Waterfall_triggered(); //### if(m_mode=="JT65A") on_actionJT65A_triggered(); if(m_mode=="JT65B") on_actionJT65B_triggered(); if(m_mode=="JT65C") on_actionJT65C_triggered(); @@ -467,7 +466,6 @@ void MainWindow::dataSink(int k) if(!m_xpol) t.sprintf(" Rx noise: %5.1f %5.1f %% ",px,m_pctZap); lab4->setText(t); ui->xThermo->setValue((double)px); //Update the bargraphs - ui->yThermo->setValue((double)py); if(m_monitoring || m_diskData) { g_pWideGraph->dataSink2(s,nkhz,ihsym,m_diskData,lstrong); } @@ -821,7 +819,7 @@ void MainWindow::on_actionWide_Waterfall_triggered() //Display Waterfalls connect(g_pWideGraph, SIGNAL(f11f12(int)),this, SLOT(bumpDF(int))); } - g_pWideGraph->show(); +// g_pWideGraph->show(); } void MainWindow::on_actionOpen_triggered() //Open File @@ -1191,19 +1189,20 @@ void MainWindow::guiUpdate() static char msgsent[23]; static int nsendingsh=0; int khsym=0; + double trperiod=30.0; double tx1=0.0; - double tx2=126.0*4096.0/11025.0 + 1.8; //### depend on TxDelay? ### + double tx2=trperiod; if(!m_txFirst) { - tx1 += 60.0; - tx2 += 60.0; + tx1 += trperiod; + tx2 += trperiod; } qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; int nsec=ms/1000; double tsec=0.001*ms; - double t120=fmod(tsec,120.0); - bool bTxTime = t120 >= tx1 && t120 < tx2; + double t2p=fmod(tsec,2*trperiod); + bool bTxTime = t2p >= tx1 && t2p < tx2; if(m_auto) { if(bTxTime and iptt==0 and !m_txMute) { @@ -1237,9 +1236,10 @@ void MainWindow::guiUpdate() ba2msg(ba,message); int len1=22; + +//### Wrong mode! int mode65=m_mode65; double samfac=1.0; - gen65_(message,&mode65,&samfac,&nsendingsh,msgsent,iwave,&nwave,len1,len1); msgsent[22]=0; @@ -1260,7 +1260,6 @@ void MainWindow::guiUpdate() if(nc1 <= 0) nc1++; if(nc1 == 0) { ui->xThermo->setValue(0.0); //Set the Thermos to zero - ui->yThermo->setValue(0.0); m_monitoring=false; soundInThread.setMonitoring(false); btxok=true; @@ -1360,9 +1359,8 @@ void MainWindow::guiUpdate() QString utc = " " + t.time().toString() + " "; ui->labUTC->setText(utc); if((!m_monitoring and !m_diskData) or (khsym==m_hsym0)) { - ui->xThermo->setValue(0.0); // Set Rx levels to 0 - ui->yThermo->setValue(0.0); - lab4->setText(" Rx noise: 0.0 0.0 0.0% "); + ui->xThermo->setValue(0.0); // Set Rx level to 20 + lab4->setText(" Rx noise: 0.0 0.0% "); } m_hsym0=khsym; m_sec0=nsec; diff --git a/mainwindow.ui b/mainwindow.ui index 87c71e42d..551d8ca2f 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -244,7 +244,7 @@ p, li { white-space: pre-wrap; } - + 0 @@ -257,50 +257,19 @@ p, li { white-space: pre-wrap; } 180 - + 1 - + 60.000000000000000 - + 0.000000000000000 - + 8 - - 0.000000000000000 - - - - - - - - 0 - 0 - - - - - 12 - 177 - - - - 1 - - - 60.000000000000000 - - - 0.000000000000000 - - - 8 - - + 0.000000000000000 @@ -1185,7 +1154,6 @@ p, li { white-space: pre-wrap; } Decode - @@ -1366,7 +1334,7 @@ p, li { white-space: pre-wrap; } true - No Deep Search + TBD... @@ -1555,16 +1523,16 @@ p, li { white-space: pre-wrap; } - - DisplayText - QTextBrowser -
displaytext.h
-
QwtThermo QWidget
qwt_thermo.h
+ + DisplayText + QTextBrowser +
displaytext.h
+
diff --git a/set570.cpp b/set570.cpp deleted file mode 100644 index 0380963c3..000000000 --- a/set570.cpp +++ /dev/null @@ -1,275 +0,0 @@ - -/* Linux / Windows program to control the frequency of a si570 synthesizer - ON5GN 6 jan 2012 - Under Linux: - -use the linux version of function void si570_sleep(int us) - -compile with - gcc -Wall -o set_si570_freq set_si570_freq.c -lusb -lm - -run with sudo ./set_si570_freq - Under Windows: - -use the windows version of function void si570_sleep(int us) - -compile with mingw - C:\mingw\bin\mingw32-gcc -Wall -o set_si570_freq set_si570_freq.c -lusb -lm - -run with set_si570_freq.exe -*/ - -#include /* Standard input/output definitions */ -#include /* String function definitions */ -#include /* UNIX standard function definitions */ -#include -#include -#include - -#define USB_SUCCESS 0 -#define USB_ERROR_NOTFOUND 1 -#define USB_ERROR_ACCESS 2 -#define USB_ERROR_IO 3 -#define VENDOR_NAME "www.obdev.at" -#define PRODUCT_NAME "DG8SAQ-I2C" -#define USBDEV_SHARED_VENDOR 0x16C0 // VOTI VID -#define USBDEV_SHARED_PRODUCT 0x05DC // OBDEV PID - // Use obdev's generic shared VID/PID pair - // following the rules outlined in - // firmware/usbdrv/USBID-License.txt. -#define REQUEST_SET_FREQ_BY_VALUE 0x32 -#define MAX_USB_ERR_CNT 6 - -double freq_parm; -double delay_average; -int from_freq; -int to_freq; -int increment_freq; -int retval = -1; -int display_freq = -1; -int delay; -usb_dev_handle *global_si570usb_handle = NULL; - -// ********sleep functions*************** -//use this function under LINUX -/* -void si570_sleep(int us) -{ -usleep(us); -} -*/ - -//use this function under WINDOWS -void si570_sleep(int us) -{ - Sleep(us/1000); -} - -double round(double x) -{ - int i=x+0.5; - return (double)i; -} - -double current_time(void) //for delay measurements -{ - struct timeval t; - gettimeofday(&t,NULL); - return 0.000001*t.tv_usec+t.tv_sec; -} - -int usbGetStringAscii(usb_dev_handle *dev, int my_index, - int langid, char *buf, int buflen); -unsigned char Si570usbOpenDevice(usb_dev_handle **device, char *usbSerialID); -void setLongWord( int value, char * bytes); -int setFreqByValue(usb_dev_handle * handle, double frequency); -void sweepa_freq(void); -void sweepm_freq(void); - -int set570(double freq_MHz) -{ - char * my_usbSerialID = NULL; - -// MAIN MENU DIALOG - retval=Si570usbOpenDevice(&global_si570usb_handle, my_usbSerialID); - if (retval != 0) return -1; - -//SET FREQUENCY - if((freq_MHz < 3.45)|(freq_MHz > 866.0)) return -2; - retval=setFreqByValue(global_si570usb_handle,freq_MHz); - return 0; -} - -int usbGetStringAscii(usb_dev_handle *dev, int my_index, - int langid, char *buf, int buflen) -{ - char buffer[256]; - int rval, i; - if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, - (USB_DT_STRING << 8) + my_index, langid, buffer, - sizeof(buffer), 1000)) < 0) return rval; - if(buffer[1] != USB_DT_STRING) return 0; - if((unsigned char)buffer[0] < rval) rval = (unsigned char)buffer[0]; - rval /= 2; -// lossy conversion to ISO Latin1 - for(i=1;i buflen) break; // destination buffer overflow - buf[i-1] = buffer[2 * i]; - if(buffer[2 * i + 1] != 0) buf[i-1] = '?'; // outside of ISO Latin1 range - } - buf[i-1] = 0; - return i-1; -} - -unsigned char Si570usbOpenDevice(usb_dev_handle **device, char *usbSerialID) -{ - struct usb_bus *bus; - struct usb_device *dev; - usb_dev_handle *handle = NULL; - unsigned char errorCode = USB_ERROR_NOTFOUND; - char string[256]; - int len; - int vendor = USBDEV_SHARED_VENDOR; - char *vendorName = VENDOR_NAME; - int product = USBDEV_SHARED_PRODUCT; - char *productName = PRODUCT_NAME; - char serialNumberString[20]; - static int didUsbInit = 0; - - if(!didUsbInit) { - didUsbInit = 1; - usb_init(); - } - usb_find_busses(); - usb_find_devices(); - for(bus=usb_get_busses(); bus; bus=bus->next) { - for(dev=bus->devices; dev; dev=dev->next) { - if(dev->descriptor.idVendor == vendor && - dev->descriptor.idProduct == product) { - handle = usb_open(dev); // open the device in order to query strings - if(!handle) { - errorCode = USB_ERROR_ACCESS; - printf("si570.c: Warning: cannot open Si570-USB device:\n"); - printf("usb error message: %s\n",usb_strerror()); - continue; - } - if(vendorName == NULL && productName == NULL) { //name does not matter - break; - } - // now check whether the names match - len = usbGetStringAscii(handle, dev->descriptor.iManufacturer, 0x0409, string, sizeof(string)); - if(len < 0) { - errorCode = USB_ERROR_IO; - printf("si570.c: Warning: cannot query manufacturer for Si570-USB device:\n"); - printf("usb error message: %s\n",usb_strerror()); - } else { - errorCode = USB_ERROR_NOTFOUND; - //fprintf(stderr, "seen device from vendor ->%s<-\n", string); - if(strcmp(string, vendorName) == 0){ - len = usbGetStringAscii(handle, dev->descriptor.iProduct, - 0x0409, string, sizeof(string)); - if(len < 0) { - errorCode = USB_ERROR_IO; - printf("si570.c: Warning: cannot query product for Si570-USB device: \n"); - printf("usb error message: %s\n",usb_strerror()); - } else { - errorCode = USB_ERROR_NOTFOUND; - // fprintf(stderr, "seen product ->%s<-\n", string); - if(strcmp(string, productName) == 0) { - len = usbGetStringAscii(handle, dev->descriptor.iSerialNumber, - 0x0409, serialNumberString, sizeof(serialNumberString)); - if (len < 0) { - errorCode = USB_ERROR_IO; - printf("si570.c: Warning: cannot query serial number for Si570-USB device: \n"); - printf("usb error message: %s\n",usb_strerror()); - } else { - errorCode = USB_ERROR_NOTFOUND; - if ((usbSerialID == NULL) || - (strcmp(serialNumberString, usbSerialID) == 0)) { -// printf("\nOpen Si570 USB device: OK\n"); -// printf("usbSerialID : %s\n",serialNumberString); - break; - } - } - } - } - } - } - usb_close(handle); - handle = NULL; - } - } - if(handle) break; - } - if(handle != NULL) { - errorCode = USB_SUCCESS; - *device = handle; - } - return errorCode; -} - -void setLongWord( int value, char * bytes) -{ - bytes[0] = value & 0xff; - bytes[1] = ((value & 0xff00) >> 8) & 0xff; - bytes[2] = ((value & 0xff0000) >> 16) & 0xff; - bytes[3] = ((value & 0xff000000) >> 24) & 0xff; -} - -int setFreqByValue(usb_dev_handle * handle, double frequency) -{ -// Windows Doc from PE0FKO: -// -// Command 0x32: -// ------------- -// Set the oscillator frequency by value. The frequency is formatted in MHz -// as 11.21 bits value. -// The "automatic band pass filter selection", "smooth tune", -// "one side calibration" and the "frequency subtract multiply" are all -// done in this function. (if enabled in the firmware) -// -// Default: None -// -// Parameters: -// requesttype: USB_ENDPOINT_OUT -// request: 0x32 -// value: 0 -// index: 0 -// bytes: pointer 32 bits integer -// size: 4 -// -// Code sample: -// uint32_t iFreq; -// double dFreq; -// -// dFreq = 30.123456; // MHz -// iFreq = (uint32_t)( dFreq * (1UL << 21) ) -// r = usbCtrlMsgOUT(0x32, 0, 0, (char *)&iFreq, sizeof(iFreq)); -// if (r < 0) Error -// - - char buffer[4]; - int i2cAddress = 0x55; - int request = REQUEST_SET_FREQ_BY_VALUE; - int value = 0x700 + i2cAddress; - int my_index = 0; - int retval; - int err_cnt; - - err_cnt =0; - set_again:; - setLongWord(round(frequency * 2097152.0), buffer); // 2097152=2^21 - retval=usb_control_msg( - handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, - request, - value, - my_index, - buffer, - sizeof(buffer), - 5000); - if (retval != 4) { - err_cnt ++; - if(err_cnt < MAX_USB_ERR_CNT) { - si570_sleep(1000); // delay 1000 microsec - goto set_again; - } else { - printf("Error when setting frequency, returncode=%i\n",retval); - printf("usb error message: %s\n", usb_strerror()); - } - } - return retval; -} diff --git a/soundout.cpp b/soundout.cpp index 3ee67bddc..41570f2bf 100644 --- a/soundout.cpp +++ b/soundout.cpp @@ -125,7 +125,7 @@ void SoundOutThread::run() paerr=Pa_IsFormatSupported(NULL,&outParam,11025.0); if(paerr<0) { qDebug() << "PortAudio says requested output format not supported."; - qDebug() << paerr; + qDebug() << paerr << m_nDevOut; return; } @@ -135,7 +135,7 @@ void SoundOutThread::run() paerr=Pa_OpenStream(&outStream, //Output stream NULL, //No input parameters &outParam, //Output parameters - 11025.0, //Sample rate + 12000.0, //Sample rate FRAMES_PER_BUFFER, //Frames per buffer paClipOff, //No clipping d2aCallback, //output callbeck routine diff --git a/widegraph.cpp b/widegraph.cpp index 93c21cf57..30e53d278 100644 --- a/widegraph.cpp +++ b/widegraph.cpp @@ -280,7 +280,7 @@ void WideGraph::on_fCenterLineEdit_editingFinished() } void WideGraph::on_pbSetRxHardware_clicked() -{ +{/* #ifdef WIN32 int iret=set570(m_mult570*(1.0+0.000001*m_cal570)*m_dForceCenterFreq); if(iret != 0) { @@ -290,12 +290,14 @@ void WideGraph::on_pbSetRxHardware_clicked() mb.exec(); } #endif +*/ } void WideGraph::initIQplus() { +/* #ifdef WIN32 - int iret=set570(288.0); +// int iret=set570(288.0); if(iret != 0) { QMessageBox mb; if(iret==-1) mb.setText("Failed to open Si570."); @@ -305,6 +307,7 @@ void WideGraph::initIQplus() on_pbSetRxHardware_clicked(); } #endif +*/ } void WideGraph::on_cbSpec2d_toggled(bool b)