From e1efe8c8165bc23aebc63c71086d73e916a1ce4b Mon Sep 17 00:00:00 2001 From: Stelios Bounanos Date: Tue, 14 Aug 2007 02:18:58 +0100 Subject: [PATCH] Upstream version 1.37f-exp --- ChangeLog | 3 +- src/dialogs/Config.cxx | 1 + src/dialogs/Config.fl | 6 +- src/dialogs/Config.h | 151 ++++++++++++++++++++++++++++++++++++ src/dialogs/TextView.cxx | 7 +- src/dialogs/fl_digi.cxx | 15 +++- src/include/fl_digi.h | 1 + src/include/version.h | 2 +- src/main.cxx | 4 +- src/misc/qrzcall.cxx | 64 ++++++++++++++- src/trx/modem.cxx | 38 ++++----- src/waterfall/waterfall.cxx | 8 +- 12 files changed, 262 insertions(+), 38 deletions(-) create mode 100644 src/dialogs/Config.h diff --git a/ChangeLog b/ChangeLog index eca284bd..e499cc93 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,6 @@ Change Log: -1.36 1) Increased TxPPM to +/- 50000 to match the RxPPM range +1.37 1) Increased TxPPM to +/- 50000 to match the RxPPM range 2) Changed all audio i/o to separate 2 channel control (stereo) 3) Added right channel CW QRQ signal 4) Added right channel pseudo FSK signal @@ -24,6 +24,7 @@ Change Log: The new libraries provide portaudio sound card mapping, and the ability to save and playback wav files (when fldigi is run as: fldigi TEST). + 16) Added Azimuth computation to QRZ query (submitted by WA5ZNU). 1.34 1) Cleaned up unused code segments 2) Modified CW decoder to allow setting upper and lower limits on Tx WPM diff --git a/src/dialogs/Config.cxx b/src/dialogs/Config.cxx index 6e09c061..cade8251 100644 --- a/src/dialogs/Config.cxx +++ b/src/dialogs/Config.cxx @@ -1013,6 +1013,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600 { Fl_Check_Button* o = btnViewXmtSignal = new Fl_Check_Button(108, 105, 137, 20, "View Xmt Signal"); o->down_box(FL_DOWN_BOX); o->callback((Fl_Callback*)cb_btnViewXmtSignal); + o->hide(); o->value(progdefaults.viewXmtSignal); } { Fl_Counter* o = cntLowFreqCutoff = new Fl_Counter(280, 84, 94, 21, "Low Freq Cutoff"); diff --git a/src/dialogs/Config.fl b/src/dialogs/Config.fl index e3a39896..4681940c 100644 --- a/src/dialogs/Config.fl +++ b/src/dialogs/Config.fl @@ -168,14 +168,14 @@ progdefaults.changed = true;} Fl_Check_Button btnViewXmtSignal { label {View Xmt Signal} callback {progdefaults.viewXmtSignal=o->value(); -progdefaults.changed = true;} - xywh {108 105 137 20} down_box DOWN_BOX +progdefaults.changed = true;} selected + xywh {108 105 137 20} down_box DOWN_BOX hide code0 {o->value(progdefaults.viewXmtSignal);} } Fl_Counter cntLowFreqCutoff { label {Low Freq Cutoff} callback {progdefaults.LowFreqCutoff=(int)(o->value()); -progdefaults.changed = true;} selected +progdefaults.changed = true;} xywh {280 84 94 21} type Simple minimum 0 maximum 500 step 50 value 300 code0 {o->value(progdefaults.LowFreqCutoff);} } diff --git a/src/dialogs/Config.h b/src/dialogs/Config.h new file mode 100644 index 00000000..e4588414 --- /dev/null +++ b/src/dialogs/Config.h @@ -0,0 +1,151 @@ +// generated by Fast Light User Interface Designer (fluid) version 1.0107 + +#ifndef Config_h +#define Config_h +#include +#include "globals.h" +#include "modem.h" +#include "configuration.h" +extern Fl_Double_Window *dlgConfig; +#include +#include +extern Fl_Tabs *tabsConfigure; +#include +extern Fl_Group *tabOperator; +#include +extern Fl_Input *inpMyCallsign; +extern Fl_Input *inpMyName; +extern Fl_Input *inpMyQth; +extern Fl_Input *inpMyLocator; +#include +extern Fl_Check_Button *btnUseLeadingZeros; +#include +extern Fl_Value_Input *nbrContestStart; +extern Fl_Value_Input *nbrContestDigits; +extern Fl_Group *tabWaterfall; +extern Fl_Check_Button *btnBlackman; +extern Fl_Check_Button *btnHamming; +extern Fl_Check_Button *btnHanning; +extern Fl_Check_Button *btnTriangular; +extern Fl_Check_Button *btnUseCursorLines; +extern Fl_Check_Button *btnUseBWTracks; +extern Fl_Check_Button *btnUseCursorCenterLine; +extern Fl_Check_Button *btnViewXmtSignal; +#include +extern Fl_Counter *cntLowFreqCutoff; +#include "colorbox.h" +extern colorbox *Palette; +#include +extern Fl_Button *btnColor[9]; +extern Fl_Button *btnLoadPalette; +extern Fl_Button *btnSavePalette; +extern Fl_Group *tabInterface; +#include +extern Fl_Input *inpTTYdev; +extern Fl_Round_Button *btnRTSptt; +extern Fl_Round_Button *btnDTRptt; +extern Fl_Round_Button *btnRTSplusV; +extern Fl_Round_Button *btnDTRplusV; +#include +extern Fl_Round_Button *btnPTT[5]; +extern Fl_Check_Button *chkUSEMEMMAP; +extern Fl_Check_Button *chkUSERIGCAT; +extern Fl_Check_Button *chkUSEHAMLIB; +extern Fl_ComboBox *cboHamlibRig; +extern Fl_Input *inpRIGdev; +#include +extern Fl_Choice *mnuBaudRate; +extern Fl_Button *btnInit_Interface; +extern Fl_Check_Button *btnQRZnotavailable; +extern Fl_Check_Button *btnQRZsocket; +extern Fl_Check_Button *btnQRZcdrom; +extern Fl_Group *tabSoundCard; +extern Fl_Tabs *tabsSoundCard; +extern Fl_Group *tabMixer; +#include +extern void setMixerInput(int); +extern Fl_Light_Button *btnLineIn; +extern Fl_Light_Button *btnMicIn; +#include +extern void setPCMvolume(double); +extern Fl_Value_Slider *valPCMvolume; +#include +extern Fl_Input_Choice *menuMix; +extern void resetMixerControls(); +extern Fl_Check_Button *btnMixer; +extern Fl_Group *tabAudio; +#include +extern Fl_Spinner *cntRxRateCorr; +extern Fl_Spinner *cntTxRateCorr; +extern Fl_Spinner *cntTxOffset; +extern Fl_Group *AudioIO; +extern Fl_Round_Button *btnAudioIO[2]; +extern Fl_Input_Choice *menuOSSDev; +extern Fl_Input_Choice *menuPADev; +extern Fl_Value_Input *valCWsweetspot; +extern Fl_Value_Input *valRTTYsweetspot; +extern Fl_Value_Input *valPSKsweetspot; +extern Fl_Check_Button *btnStartAtSweetSpot; +extern Fl_Check_Button *btnsendid; +extern Fl_Group *tabModems; +extern Fl_Tabs *tabsModems; +extern Fl_Group *tabCW; +extern Fl_Value_Slider *sldrCWbandwidth; +extern Fl_Counter *cntCWrange; +extern Fl_Check_Button *btnCWrcvTrack; +#include +extern Fl_Value_Output *valCWrcvWPM; +#include +extern Fl_Progress *prgsCWrcvWPM; +extern Fl_Value_Slider *sldrCWxmtWPM; +extern Fl_Counter *cntCWlowerlimit; +extern Fl_Counter *cntCWupperlimit; +extern Fl_Counter *cntCWweight; +extern Fl_Counter *cntCWdash2dot; +extern Fl_Counter *cntCWrisetime; +extern Fl_Counter *cntCWdefWPM; +extern Fl_Group *tabCWQSK; +extern Fl_Check_Button *btnQSK; +extern Fl_Counter *cntPreTiming; +extern Fl_Counter *cntPostTiming; +extern Fl_Group *tabDomEX; +extern Fl_Input *txtSecondary; +extern Fl_Button *btnRestartDomEX; +extern Fl_Counter *valDominoEX_BW; +extern Fl_Group *tabFeld; +#include "fontdef.h" +extern Fl_Choice *selHellFont; +extern Fl_Value_Slider *sldrHellBW; +extern Fl_Check_Button *btnHellXmtWidth; +extern Fl_Check_Button *btnHellRcvWidth; +extern Fl_Check_Button *btnBlackboard; +extern Fl_Check_Button *btnHellFastAttack; +extern Fl_Check_Button *btnHellSlowAttack; +extern Fl_Check_Button *btnFeldHellIdle; +extern Fl_Group *tabOlivia; +extern Fl_Choice *mnuOlivia_Tones; +extern Fl_Choice *mnuOlivia_Bandwidth; +extern Fl_Button *btnRestartOlivia; +extern Fl_Check_Button *btnPSKmailSweetSpot; +extern Fl_Group *tabRTTY; +extern Fl_Choice *selShift; +extern Fl_Choice *selBaud; +extern Fl_Choice *selBits; +extern Fl_Choice *selParity; +extern Fl_Choice *selStopBits; +extern Fl_Check_Button *chkPseudoFSK; +extern Fl_Button *btnRestartRtty; +extern Fl_Check_Button *btnCRCRLF; +extern Fl_Check_Button *btnAUTOCRLF; +extern Fl_Counter *cntrAUTOCRLF; +extern Fl_Check_Button *btnRTTY_USB; +extern Fl_Round_Button *btnRTTYafc[3]; +extern Fl_Check_Button *btnPreferXhairScope; +#include +extern Fl_Return_Button *btnCloseConfig; +extern Fl_Button *btnSaveConfig; +Fl_Double_Window* ConfigureDialog(); +void openConfig(); +void closeDialog(); +void createConfig(); +#endif diff --git a/src/dialogs/TextView.cxx b/src/dialogs/TextView.cxx index be99ce02..e90371e6 100644 --- a/src/dialogs/TextView.cxx +++ b/src/dialogs/TextView.cxx @@ -468,7 +468,7 @@ void textview::drawmodify() // find the screen location for the character redraw size_t posidx = laststartidx; int posX = 0, posY = charheight - descent; - char c; + char c = 0; fl_font(TextFont, TextSize); while (posidx < modidx) { @@ -483,7 +483,7 @@ void textview::drawmodify() } // should now be pointing to the (x,y) screen location for the character char cstr[] = ""; - cstr[0] = c = buff[modidx]; + cstr[0] = buff[modidx]; // erase existing if ((attr[modidx] & 0x20) == 0x20) fl_color(FL_YELLOW); @@ -1102,7 +1102,8 @@ int TextEdit::nextChar() modidx = xmtidx; damage(4); Fl::unlock(); - Fl::awake(); + Fl::flush(); +// Fl::awake(); return (buff[xmtidx++]); } diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index d1054cd8..ec458831 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -110,6 +110,7 @@ Fl_Input *inpRstOut; Fl_Input *inpQth; Fl_Input *inpLoc; Fl_Input *inpNotes; +Fl_Input *inpAZ; // WA5ZNU Fl_Button *qsoTime; Fl_Button *qsoClear; Fl_Button *qsoSave; @@ -832,6 +833,7 @@ void clearQSO() inpRstOut->value(""); inpQth->value(""); inpLoc->value(""); + inpAZ->value(""); // WA5ZNU inpNotes->value(""); Fl::unlock(); } @@ -1137,13 +1139,19 @@ void create_fl_digi_main() { Y += Hqsoframe; Fl_Group *qsoFrame2 = new Fl_Group(0,Y, WNOM, Hnotes); - inpNotes = new Fl_Input(89 + 22, Y, WNOM - 89 - 44 - 22, Hnotes,"Notes:"); + + inpNotes = new Fl_Input(136, Y, WNOM - 136 - 44 - 120, Hnotes,"Notes:"); // WA5ZNU inpNotes->align(FL_ALIGN_LEFT); + cboBand = new Fl_ComboBox(2, Y, 85, Hnotes, ""); cboBand->hide(); btnSideband = new Fl_Button(88, Y+1, 22, 22, "U"); btnSideband->callback(cb_btnSideband, 0); btnSideband->hide(); + + inpAZ = new Fl_Input(WNOM - 44 - 80, Y, 80, Hnotes, "AZ:"); // WA5ZNU + inpAZ->align(FL_ALIGN_LEFT); + qsoSave = new Fl_Button(WNOM - 42, Y + 1, 40, Hnotes- 2, "Save"); qsoSave->callback(qsoSave_cb, 0); qsoFrame2->resizable(inpNotes); @@ -1152,7 +1160,6 @@ void create_fl_digi_main() { int sw = 15; Fl_Group *MixerFrame = new Fl_Group(0,Y,sw, Hrcvtxt + Hxmttxt); -// valRcvMixer = new Fl_Slider(0, Y, sw, (Hrcvtxt + Hxmttxt)/2 - 15, "R"); valRcvMixer = new Fl_Slider(0, Y, sw, (Htext)/2, ""); valRcvMixer->type(FL_VERT_NICE_SLIDER); valRcvMixer->color(fl_rgb_color(0,110,30)); @@ -1160,7 +1167,6 @@ void create_fl_digi_main() { valRcvMixer->selection_color(fl_rgb_color(255,255,0)); valRcvMixer->range(1.0,0.0); valRcvMixer->callback( (Fl_Callback *)cb_RcvMixer); -// valXmtMixer = new Fl_Slider(0, Y + (Hrcvtxt + Hxmttxt)/2, sw, (Hrcvtxt + Hxmttxt)/2 - 15, "T"); valXmtMixer = new Fl_Slider(0, Y + (Htext)/2, sw, (Htext)/2, ""); valXmtMixer->type(FL_VERT_NICE_SLIDER); valXmtMixer->color(fl_rgb_color(110,0,30)); @@ -1438,6 +1444,7 @@ void put_S2Nstatus(char *msg) void put_WARNstatus(double val) { + Fl::lock(); if (val < 0.05) WARNstatus->color(FL_BLACK); if (val > 0.05) @@ -1447,6 +1454,7 @@ void put_WARNstatus(double val) if (val > 0.98) WARNstatus->color(FL_DARK_RED); WARNstatus->redraw(); + Fl::unlock(); } @@ -1463,7 +1471,6 @@ void clear_StatusMessages() StatusBar->label(""); S2Nstatus->label(""); IMDstatus->label(""); -// WARNstatus->label(""); Fl::unlock(); Fl::awake(); } diff --git a/src/include/fl_digi.h b/src/include/fl_digi.h index c98b079a..55b9e4ad 100644 --- a/src/include/fl_digi.h +++ b/src/include/fl_digi.h @@ -74,6 +74,7 @@ extern Fl_Input *inpRstOut; extern Fl_Input *inpQth; extern Fl_Input *inpLoc; extern Fl_Input *inpNotes; +extern Fl_Input *inpAZ; // WA5ZNU extern Fl_Button *qsoClear; extern Fl_Button *qsoSave; extern Fl_Button *btnMacroTimer; diff --git a/src/include/version.h b/src/include/version.h index ac20f932..a8277906 100644 --- a/src/include/version.h +++ b/src/include/version.h @@ -1,6 +1,6 @@ #ifndef _VERSION_H #define _VERSION_H -#define FLDIGI_VERSION "1.37e-exp" +#define FLDIGI_VERSION "1.37f-exp" #endif diff --git a/src/main.cxx b/src/main.cxx index 09cc43c7..f7729739 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -147,9 +147,9 @@ int main(int argc, char ** argv) { arqchecks(); Fl::lock(); // start the gui thread!! -// Fl::visual(FL_RGB); // insure 24 bit color operation + Fl::visual(FL_RGB); // insure 24 bit color operation - Fl::visual(FL_DOUBLE|FL_INDEX|FL_RGB); +// Fl::visual(FL_DOUBLE|FL_INDEX| FL_RGB); fl_register_images(); Fl::set_fonts(0); diff --git a/src/misc/qrzcall.cxx b/src/misc/qrzcall.cxx index e909f299..90f58d03 100644 --- a/src/misc/qrzcall.cxx +++ b/src/misc/qrzcall.cxx @@ -35,6 +35,8 @@ #include #include #include +#include +#include #include @@ -45,7 +47,7 @@ #include "qrzcall.h" #include "main.h" -#include "Config.h" +#include "Config.h" #include "fl_digi.h" #include "qrzlib.h" @@ -243,12 +245,72 @@ int getRecord() return 0; } +// code submitted by WA5ZNU +//#define MY_QRA ("CM87wk") +int bearing(const char *, const char *); +void qra(const char *, double &, double &); + +int bearing(const char *myqra, const char *dxqra) { + double lat1, lat1r, lon1; + double lat2, lat2r, lon2; + double dlong, arg1, arg2a, arg2b, arg2, bearingr, bearing; + double k=180.0/M_PI; + + qra(dxqra, lat2, lon2); + qra(myqra, lat1, lon1); +//std::cout << lat1 << " " << lon1 << std::endl << lat2 << " " << lon2 << std::endl; cout.flush(); + + lat1r=lat1/k; + lat2r=lat2/k; + + dlong = lon2/k - lon1/k; + + arg1 = sin(dlong) * cos(lat2r); + arg2a = cos(lat1r) * sin(lat2r); + arg2b = sin(lat1r) * cos(lat2r) * cos(dlong); + arg2 = arg2a - arg2b; + bearingr = atan2(arg1, arg2); + + bearing = floor(0.5+fmod(360.0 + (bearingr * k), 360.0)); + return (int)bearing; +} + + +// code submitted by WA5ZNU +void qra(const char *szqra, double &lat, double &lon) { + int c1 = toupper(szqra[0])-'A'; + int c2 = toupper(szqra[1])-'A'; + int c3 = szqra[2]-'0'; + int c4 = szqra[3]-'0'; + int c5, c6; + if (strlen(szqra) > 4) { + c5 = toupper(szqra[4])-'A'; + c6 = toupper(szqra[5])-'A'; + lat = (((c2 * 10.0) + c4 + ((c6 + 0.5)/24.0)) - 90.0); + lon = (((c1 * 20.0) + (c3 * 2.0) + ((c5 + 0.5) / 12.0)) - 180.0); + } else { + lat = (((c2 * 10.0) + c4 ) - 90.0); + lon = (((c1 * 20.0) + (c3 * 2.0)) - 180.0); + } +} + void QRZ_disp_result() { Fl::lock(); inpName->value(qrzfname.c_str()); inpQth->value(qrzqth.c_str()); inpLoc->value(qrzgrid.c_str()); +// code provided by WA5ZNU + if (!progdefaults.myLocator.empty()) { + char buf[10]; + buf[0] = '\0'; + if (!qrzgrid.empty()) { + int b = bearing( progdefaults.myLocator.c_str(), qrzgrid.c_str() ); + int br = (b + 180) % 360; + snprintf(buf, 256, "%03d / %03d", b, br); + } + inpAZ->value(buf); + } inpNotes->value(qrznotes.c_str()); Fl::unlock(); } diff --git a/src/trx/modem.cxx b/src/trx/modem.cxx index fbf0f2bc..34706f5c 100644 --- a/src/trx/modem.cxx +++ b/src/trx/modem.cxx @@ -197,29 +197,31 @@ void modem::set_samplerate(int smprate) void modem::ModulateXmtr(double *buffer, int len) { scard->write_samples(buffer, len); - if (progdefaults.viewXmtSignal) - for (int i = 0; i < len; i++) { - scdata[scptr] = buffer[i] * 0.1; - scptr++; - if (scptr == 512) { - wf->sig_data(scdata, 512); - scptr = 0; - } - } + return; +// if (progdefaults.viewXmtSignal) +// for (int i = 0; i < len; i++) { +// scdata[scptr] = buffer[i] * 0.01; +// scptr++; +// if (scptr == 512) { +// wf->sig_data(scdata, 512); +// scptr = 0; +// } +// } } void modem::ModulateStereo(double *left, double *right, int len) { scard->write_stereo(left, right, len); - if (progdefaults.viewXmtSignal) - for (int i = 0; i < len; i++) { - scdata[scptr] = left[i] * 0.1; - scptr++; - if (scptr == 512) { - wf->sig_data(scdata, 512); - scptr = 0; - } - } + return; +// if (progdefaults.viewXmtSignal) +// for (int i = 0; i < len; i++) { +// scdata[scptr] = left[i] * 0.01; +// scptr++; +// if (scptr == 512) { +// wf->sig_data(scdata, 512); +// scptr = 0; +// } +// } } diff --git a/src/waterfall/waterfall.cxx b/src/waterfall/waterfall.cxx index c719c81f..f784b326 100644 --- a/src/waterfall/waterfall.cxx +++ b/src/waterfall/waterfall.cxx @@ -365,7 +365,7 @@ Fl::lock(); for (; sigy > ynext; sigy--) sig_img[sigpixel += IMAGE_WIDTH] = graylevel; sig_img[sigpixel++] = graylevel; } - inpFreq->redraw(); +// inpFreq->redraw(); redraw(); Fl::unlock(); } @@ -418,14 +418,12 @@ void WFdisp::sig_data( double *sig, int len ) { } inpFreq->value(szFrequency); - inpFreq->redraw(); + Fl::unlock(); + Fl::awake(); // signal level indicator put_WARNstatus(peakaudio); - Fl::unlock(); - Fl::awake(); - return; }